rev 438 - in trunk: . include/prothon modules/DBM modules/File modules/Prosist modules/Re modules/SQLite pr src
SVN User <[email protected]> Sat, 01 May 2004 02:39:36 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-05-01 02:39:33 -0400 (Sat, 01 May 2004)
New Revision: 438
Modified:
trunk/STATUS.txt
trunk/include/prothon/prothon.h
trunk/include/prothon/prothon_dll.h
trunk/modules/DBM/DBM.c
trunk/modules/File/File.c
trunk/modules/Prosist/Prosist.c
trunk/modules/Re/Re.c
trunk/modules/SQLite/SQLite.c
trunk/pr/dict.pr
trunk/pr/test.pr
trunk/src/builtins-dict.c
trunk/src/builtins-float.c
trunk/src/builtins-list.c
trunk/src/builtins-string.c
trunk/src/builtins-thread.c
trunk/src/builtins-tuple.c
trunk/src/object.c
trunk/src/src.vcproj
Log:
fixed bug in switch_proto
Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/STATUS.txt 2004-05-01 06:39:33 UTC (rev 438)
@@ -1,8 +1,5 @@
----------------------- TO-DO (highest priority first) ------------------------
-
-bug - n = Proto (Int, String)
- with n: Int$_init_(99)
--- Add BIN_CHK to all types
Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/include/prothon/prothon.h 2004-05-01 06:39:33 UTC (rev 438)
@@ -60,8 +60,8 @@
//#define DEBUG_THREADS
//#define DEBUG_MEM_MGR
//#define TRACE_PARSER
-//#define DUMP_MODULE_CODE
-//#define TRACE_INTERPRETER
+#define DUMP_MODULE_CODE
+#define TRACE_INTERPRETER
//#define DUMP_OBJECTS_AT_END
//#define PROSIST_DEBUG
Modified: trunk/include/prothon/prothon_dll.h
===================================================================
--- trunk/include/prothon/prothon_dll.h 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/include/prothon/prothon_dll.h 2004-05-01 06:39:33 UTC (rev 438)
@@ -174,14 +174,17 @@
static obj_p slf##func(isp ist, obj_p self, int pcnt, \
obj_p* parms, obj_p dlocals)
-#define BIN_CHK(slf) \
-do {obj_p owner; \
- if ( self == slf##_OBJ || \
- !(owner = obj_data_owner(self)) ) break; \
- if (owner != slf##_OBJ) { \
- raise_exception(ist, OBJ(INTERNAL_EXC), \
- "object has wrong binary data, expected %s", #slf); \
- return NULL; } \
+#define BIN_CHK(slf) \
+do {obj_p owner; \
+ if ( self == slf##_OBJ || \
+ !(owner = obj_data_owner(self)) ) break; \
+ if (owner != slf##_OBJ) { \
+ if ( owner == OBJ(TUPLE_PROTO) && slf##_OBJ == OBJ(LIST_PROTO) || \
+ owner == OBJ(LIST_PROTO) && slf##_OBJ == OBJ(TUPLE_PROTO) ) \
+ break; \
+ raise_exception(ist, OBJ(INTERNAL_EXC), \
+ "object has wrong binary data, expected %s", #slf); \
+ return NULL; } \
} while (0)
#define MAIN_MODULE_INIT(name) \
Modified: trunk/modules/DBM/DBM.c
===================================================================
--- trunk/modules/DBM/DBM.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/modules/DBM/DBM.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -118,6 +118,8 @@
char *name, *type;
const char *used1, *used2;
+ BIN_CHK(DB);
+
STRING_PARAM(1, name);
STRING_PARAM(2, type);
@@ -179,6 +181,7 @@
apr_dbm_p db = self->data.ptr;
apr_datum_t key, value;
+ BIN_CHK(DB);
OPEN_CHK("fetch(key)");
STRBIN_PARAM(1, key);
@@ -196,6 +199,7 @@
apr_dbm_p db = self->data.ptr;
apr_datum_t key, value;
+ BIN_CHK(DB);
OPEN_CHK("store(key, value)");
STRBIN_PARAM(1, key);
STRBIN_PARAM(2, value);
@@ -211,6 +215,7 @@
apr_dbm_p db = self->data.ptr;
apr_datum_t key;
+ BIN_CHK(DB);
OPEN_CHK("delete(key)");
STRBIN_PARAM(1, key);
@@ -224,6 +229,7 @@
apr_dbm_p db = self->data.ptr;
apr_datum_t key;
+ BIN_CHK(DB);
OPEN_CHK("exists?(key)");
STRBIN_PARAM(1, key);
@@ -236,6 +242,7 @@
apr_dbm_p db = self->data.ptr;
apr_datum_t key;
+ BIN_CHK(DB);
OPEN_CHK("firstKey()");
aprerr = apr_dbm_firstkey(db, &key);
@@ -252,6 +259,7 @@
apr_dbm_p db = self->data.ptr;
apr_datum_t key;
+ BIN_CHK(DB);
OPEN_CHK("nextKey(key)");
STRBIN_PARAM(1, key);
@@ -268,6 +276,7 @@
apr_dbm_p db = self->data.ptr;
apr_datum_t data;
+ BIN_CHK(DB);
OPEN_CHK("freeDatum(data)");
STRBIN_PARAM(1, data);
@@ -277,6 +286,7 @@
DEF(DB, close, NULL) {
apr_dbm_p db = self->data.ptr;
+ BIN_CHK(DB);
if (db) apr_dbm_close(db);
self->data.ptr = NULL;
return self;
@@ -284,11 +294,13 @@
DEF(DB, closed_QUES, NULL) {
apr_dbm_p db = self->data.ptr;
+ BIN_CHK(DB);
if (db) return OBJ(PR_FALSE);
else return OBJ(PR_TRUE);
}
DEF(DB, __objList__, FORM_RPARAM) {
+ BIN_CHK(DB);
return parms[1];
}
Modified: trunk/modules/File/File.c
===================================================================
--- trunk/modules/File/File.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/modules/File/File.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -184,10 +184,12 @@
}
DEF(File, __objList__, FORM_RPARAM) {
+ BIN_CHK(File);
return parms[1];
}
-DEF(File, close, NULL) {
+DEF(File, close, NULL) {
+ BIN_CHK(File);
if (OPEN(self)) {
apr_file_close(STREAM(self));
STREAM(self) = NULL;
@@ -197,6 +199,7 @@
}
DEF(File, closed_QUES, NULL) {
+ BIN_CHK(File);
if (!has_proto_QUES(ist, self, File_OBJ)) {
raise_exception(ist, OBJ(TYPE_EXC), "closed can only be called on a File object");
return NULL;
@@ -206,6 +209,7 @@
}
DEF(File, flush, NULL) {
+ BIN_CHK(File);
if (!has_proto_QUES(ist, self, File_OBJ)) {
raise_exception(ist, OBJ(TYPE_EXC), "flush can only be called on a File object");
return NULL;
@@ -222,6 +226,7 @@
}
#if 0
DEF(File, fileNo, NULL) {
+ BIN_CHK(File);
if (!has_proto_QUES(ist, self, File_OBJ)) {
raise_exception(ist, OBJ(TYPE_EXC), "fileNo can only be called on a File object");
return NULL;
@@ -234,6 +239,7 @@
}
DEF(File, isATty_QUES, NULL) {
+ BIN_CHK(File);
if (!OPEN(self)) {
raise_exception(ist, OBJ(IOEXCEPTION), "isatty called on closed stream");
return NULL;
@@ -252,6 +258,7 @@
char err_buf[1024];
i64_t size_in;
+ BIN_CHK(File);
INT_64_PARAM(1, size_in);
if (!has_proto_QUES(ist, self, File_OBJ)) {
@@ -329,6 +336,7 @@
char err_buf[1024];
i64_t size_in;
+ BIN_CHK(File);
INT_64_PARAM(1, size_in);
if (!has_proto_QUES(ist, self, File_OBJ)) {
@@ -404,6 +412,7 @@
char err_buf[1024];
i64_t size_in;
+ BIN_CHK(File);
INT_64_PARAM(1, size_in);
if (!has_proto_QUES(ist, self, File_OBJ)) {
@@ -485,6 +494,7 @@
char err_buf[1024];
i64_t pos_in, how;
+ BIN_CHK(File);
INT_64_PARAM(1, pos_in);
INT_64_PARAM(2, how);
@@ -516,6 +526,7 @@
}
#if 0
DEF(File, tell, NULL) {
+ BIN_CHK(File);
if (!OPEN(self)) {
raise_exception(ist, OBJ(IOEXCEPTION), "tell called on closed file");
return NULL;
@@ -529,6 +540,7 @@
apr_off_t size;
i64_t size_in;
+ BIN_CHK(File);
INT_64_PARAM(1, size_in);
if (!has_proto_QUES(ist, self, File_OBJ)) {
@@ -563,6 +575,7 @@
char err_buf[1024];
char* str;
+ BIN_CHK(File);
STRING_PARAM(1, str);
size = pr_strlen(parms[1]);
@@ -642,6 +655,7 @@
DEF(File, setStdOut, FORM_RPARAM) {
int i;
+ BIN_CHK(File);
if (!has_proto_QUES(ist, parms[1], File_OBJ)) {
raise_exception(ist, OBJ(TYPE_EXC), "stdout can only be assigned to a file object");
return NULL;
Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/modules/Prosist/Prosist.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -982,6 +982,7 @@
DEF(Prosist, rollBack, NULL) {
psrec_p psrecp = self->data.ptr;
+ BIN_CHK(Prosist);
if (psrecp)
rollback_db(ist, psrecp);
else {
@@ -993,6 +994,7 @@
DEF(Prosist, commit, NULL) {
psrec_p psrecp = self->data.ptr;
+ BIN_CHK(Prosist);
if (psrecp)
commit_db(ist, psrecp);
else {
@@ -1005,6 +1007,7 @@
DEF(Prosist, close, NULL) {
psrec_p psrecp = self->data.ptr;
+ BIN_CHK(Prosist);
if (psrecp) {
apr_dbm_close(psrecp->db);
apr_pool_destroy(psrecp->pool);
@@ -1014,25 +1017,30 @@
}
DEF(Prosist, closed_QUES, NULL) {
+ BIN_CHK(Prosist);
if (self->data.ptr) return OBJ(PR_FALSE);
else return OBJ(PR_TRUE);
}
DEF(Prosist, __objList__, FORM_RPARAM) {
+ BIN_CHK(Prosist);
return parms[1];
}
DEF(MutWrap, __hash__, NULL) {
+ BIN_CHK(MutWrap);
return new_hash_obj(ist, (i32_t)(intptr_t) self->data.ptr);
}
DEF(MutWrap, __eq__QUES, FORM_RPARAM) {
+ BIN_CHK(MutWrap);
CHECK_TYPE_EXC(parms[1], MutWrap_OBJ, "immutable object wrapper");
if (self->data.ptr == parms[1]->data.ptr) return OBJ(PR_TRUE);
else return OBJ(PR_FALSE);
}
DEF(MutWrap, __objList__, FORM_RPARAM) {
+ BIN_CHK(MutWrap);
return parms[1];
}
Modified: trunk/modules/Re/Re.c
===================================================================
--- trunk/modules/Re/Re.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/modules/Re/Re.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -144,6 +144,7 @@
int i, err, ngrps = numgrps(self);
regex_t* e = self->data.ptr;
+ BIN_CHK(ReCompiled);
STRING_PARAM(1, s);
res = NEW_LIST(10);
@@ -201,6 +202,7 @@
regex_t* e = self->data.ptr;
i64_t start, end;
+ BIN_CHK(ReCompiled);
STRING_PARAM(1, s);
INT_64_PARAM(2, start);
INT_64_PARAM(3, end);
@@ -249,6 +251,7 @@
int i, split_count=0, maxsplit, err, ngrps = numgrps(self);
char* s;
+ BIN_CHK(ReCompiled);
STRING_PARAM(1, s);
INT_32_PARAM(2, maxsplit);
@@ -387,6 +390,7 @@
char *repl = "", *orig_s, *p1, *p2, *s, *s_lim, *res;
int i, last_index=0, repl_is_func=FALSE, count, err, ngrps = numgrps(self);
+ BIN_CHK(ReCompiled);
if ( !has_proto_QUES(ist, parms[1], OBJ(STRING_PROTO)) &&
!(repl_is_func=has_proto_QUES(ist, parms[1], OBJ(FUNC_PROTO))) ) {
raise_exception(ist, OBJ(TYPE_EXC), "sub repl parameter must be a string or function");
@@ -481,10 +485,12 @@
}
DEF(ReCompiled, __objList__, FORM_RPARAM) {
+ BIN_CHK(ReCompiled);
return parms[1];
}
DEF(ReCompiled, __del__, NULL) {
+ BIN_CHK(ReCompiled);
regfree((regex_t*)(self->data.ptr));
return OBJ(NONE);
}
@@ -499,6 +505,7 @@
}
DEF(ReMatch, __objList__, FORM_RPARAM) {
+ BIN_CHK(ReMatch);
return parms[1];
}
@@ -506,6 +513,7 @@
u32_t grp;
i64_t groupid;
+ BIN_CHK(ReMatch);
INT_64_PARAM(1, groupid);
grp = (u32_t) groupid;
if (grp < 0 || grp >= list_len(ist, self)/2) {
@@ -519,6 +527,7 @@
u32_t grp;
i64_t groupid;
+ BIN_CHK(ReMatch);
INT_64_PARAM(1, groupid);
grp = (u32_t) groupid;
if (grp < 0 || grp >= list_len(ist, self)/2) {
@@ -533,6 +542,7 @@
obj_p res;
i64_t groupid;
+ BIN_CHK(ReMatch);
INT_64_PARAM(1, groupid);
grp = (u32_t) groupid;
if (grp < 0 || grp >= list_len(ist, self)/2) {
@@ -551,6 +561,7 @@
char *p1, *p2, *s, *s_lim, *orig_s;
obj_p orig_s_obj, res;
+ BIN_CHK(ReMatch);
STRING_PARAM(1, p1);
size = (strlen(p1) * 2 > 256 ? strlen(p1) * 2 : 256);
@@ -571,6 +582,7 @@
char* orig_s;
obj_p orig_s_obj, res;
+ BIN_CHK(ReMatch);
INT_32_PARAM(1, j);
if (j < 0 || j > ngrps) {
@@ -621,6 +633,7 @@
obj_p orig_s_obj, res = NEW_TUPLE(ngrps);
orig_s_obj = get_attr(ist, self, sym(ist, "string")); if_exc_return NULL;
orig_s = pr_strptr(orig_s_obj);
+ BIN_CHK(ReMatch);
for (i=0; i < ngrps; i++) {
sp = (int)(list_item(ist, self, i*2 )->data.i64);
ep = (int)(list_item(ist, self, i*2+1)->data.i64);
Modified: trunk/modules/SQLite/SQLite.c
===================================================================
--- trunk/modules/SQLite/SQLite.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/modules/SQLite/SQLite.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -120,6 +120,7 @@
}
DEF(Connection, cursor, NULL) {
+ BIN_CHK(Connection);
if (self->data.ptr) {
cursor_p cursorp;
obj_p curs_obj = NEW_OBJ(Cursor_OBJ);
@@ -138,6 +139,7 @@
}
DEF(Connection, rollBack, NULL) {
+ BIN_CHK(Connection);
if (self->data.ptr) {
raise_exception(ist, Error_OBJ, "rollBack not implemented yet, use query");
return NULL;
@@ -148,6 +150,7 @@
}
DEF(Connection, commit, NULL) {
+ BIN_CHK(Connection);
if (self->data.ptr) {
raise_exception(ist, Error_OBJ, "commit not implemented yet, use query");
return NULL;
@@ -158,6 +161,7 @@
}
DEF(Connection, close, NULL) {
+ BIN_CHK(Connection);
if (self->data.ptr) {
sqlite_close((sqlite_p)(self->data.ptr));
self->data.ptr = NULL;
@@ -166,6 +170,7 @@
}
DEF(Connection, __objList__, FORM_RPARAM) {
+ BIN_CHK(Connection);
return parms[1];
}
@@ -188,6 +193,7 @@
sqlite_p db;
char *sql, *errmsg=NULL;
+ BIN_CHK(Cursor);
CHECK_TYPE_EXC(parms[1], OBJ(STRING_PROTO), "string");
sql = pr_strptr(parms[1]);
if (parms[3] != OBJ(NONE)) {
@@ -214,6 +220,7 @@
obj_p res;
cursor_p cursorp = (cursor_p)(self->data.ptr);
+ BIN_CHK(Cursor);
p = cursorp->row_ptr;
llen = (int) list_len(ist, cursorp->row_list);
if (p < llen) {
@@ -229,6 +236,7 @@
obj_p res;
cursor_p cursorp = (cursor_p)(self->data.ptr);
+ BIN_CHK(Cursor);
CHECK_TYPE_EXC(parms[1], OBJ(INT_PROTO), "integer");
n = (int) parms[1]->data.i64;
p = cursorp->row_ptr;
@@ -249,6 +257,7 @@
obj_p res;
cursor_p cursorp = (cursor_p)(self->data.ptr);
+ BIN_CHK(Cursor);
p = cursorp->row_ptr;
llen = (int) list_len(ist, cursorp->row_list);
res = NEW_LIST(llen-p);
@@ -262,6 +271,7 @@
DEF(Cursor, rowCount, NULL) {
cursor_p cursorp = (cursor_p)(self->data.ptr);
+ BIN_CHK(Cursor);
if (cursorp->row_list)
return NEW_INT(list_len(ist, cursorp->row_list));
return NEW_INT(-1);
@@ -269,6 +279,7 @@
DEF(Cursor, __objList__, FORM_RPARAM) {
cursor_p cursorp = (cursor_p)(self->data.ptr);
+ BIN_CHK(Cursor);
if (cursorp->row_list)
return cursorp->row_list;
return parms[1];
Modified: trunk/pr/dict.pr
===================================================================
--- trunk/pr/dict.pr 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/pr/dict.pr 2004-05-01 06:39:33 UTC (rev 438)
@@ -15,13 +15,13 @@
d = {1:2, 3:4}
e = d.copy()
-
+
if d.items() != e.items():
print 'error1'
if Len(e.items()) != 2:
print 'error2'
-
+
d.clear!()
d = {1:2}
Modified: trunk/pr/test.pr
===================================================================
--- trunk/pr/test.pr 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/pr/test.pr 2004-05-01 06:39:33 UTC (rev 438)
@@ -2,7 +2,6 @@
def New(proto, *args, **kwargs):
newObj = Proto(proto)
- []
newObj.__init__(*args, **kwargs)
return newObj
Modified: trunk/src/builtins-dict.c
===================================================================
--- trunk/src/builtins-dict.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/builtins-dict.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -278,7 +278,6 @@
obj_p list;
int i, llen, size = max(DEFAULT_INITIAL_DICT_SIZE, (int) dict_len(ist, parms[1])*3);
- SET_TYPE_IF_EXC(Dict_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
dict = obj_malloc(ist, OBJ(DICT_PROTO), self, dict_sizeof(size));
memset(dict, 0, dict_sizeof(size));
dictsize(dict) = size;
@@ -296,6 +295,8 @@
char* res;
obj_p res_obj, keys, vals;
+ BIN_CHK(Dict);
+
len = dict_len(ist, self);
keys = dict_keys(ist, self);
vals = dict_values(ist, self);
@@ -338,6 +339,7 @@
DEF(Dict, hasKey_QUES, FPARM1(k, NULL)) {
obj_p res;
+ BIN_CHK(Dict);
if ((res = dict_item(ist, self, parms[1]))) {
del_unlock(res);
return OBJ(PR_TRUE);
@@ -347,6 +349,7 @@
DEF(Dict, get, FPARM2(k, NULL, x, OBJ(NONE))) {
obj_p res;
+ BIN_CHK(Dict);
if ((res = dict_item(ist, self, parms[1]))) {
return res;
}
@@ -355,6 +358,7 @@
DEF(Dict, __rIn__QUES, FORM_RPARAM) {
obj_p res;
+ BIN_CHK(Dict);
if ((res = dict_item(ist, self, parms[1]))) {
del_unlock(res);
return OBJ(PR_TRUE);
@@ -364,6 +368,7 @@
DEF(Dict, __rNotIn__QUES, FORM_RPARAM) {
obj_p res;
+ BIN_CHK(Dict);
if ((res = dict_item(ist, self, parms[1]))) {
del_unlock(res);
return OBJ(PR_FALSE);
@@ -372,17 +377,20 @@
}
DEF(Dict, __cDataLen__, NULL) {
+ BIN_CHK(Dict);
return NEW_INT(dict_size_bytes(self->data.ptr));
}
DEF(Dict, __objList__, FORM_RPARAM) {
+ BIN_CHK(Dict);
return parms[1];
}
DEF(Dict, __getItem__, FORM_RPARAM) {
obj_p res;
+ BIN_CHK(Dict);
CHECK_TYPE_EXC(self, OBJ(DICT_PROTO), "dict");
if (list_len(ist, parms[1]) > 1) {
@@ -398,6 +406,7 @@
}
DEF(Dict, __setItem__, FORM_PARAM2) {
+ BIN_CHK(Dict);
if (list_len(ist, parms[1]) > 1) {
raise_exception(ist, OBJ(INTERPRETER_EXC), "slice not allowed in dictionary indexing");
return NULL;
@@ -412,6 +421,7 @@
i32_t i, hash_in;
obj_p key, key_in, rp[2];
dict_p dict, dp;
+ BIN_CHK(Dict);
rp[0]=0; rp[1] = key_in = list_item(ist, parms[1], 0);
if (list_len(ist, parms[1]) > 1) {
raise_exception(ist, OBJ(INTERPRETER_EXC), "slice not allowed in dictionary indexing");
@@ -442,19 +452,23 @@
}
DEF(Dict, items, NULL) {
+ BIN_CHK(Dict);
return dict_keys_values(ist, self, 3 /*tuples*/);
}
DEF(Dict, keys, NULL) {
+ BIN_CHK(Dict);
return dict_keys_values(ist, self, 1 /*keys*/);
}
DEF(Dict, values, NULL) {
+ BIN_CHK(Dict);
return dict_keys_values(ist, self, 0 /*values*/);
}
DEF(Dict, clear_BANG, NULL) {
dict_p dict;
+ BIN_CHK(Dict);
def_write_lock(self);
dict = dict_d(self);
memset(&(dict->entry)+1, 0, dictsize(dict) * sizeof(dict_entry_t));
@@ -467,6 +481,7 @@
size_t i, llen;
obj_p list;
+ BIN_CHK(Dict);
CHECK_TYPE_EXC(parms[1], OBJ(DICT_PROTO), "dict");
list = dict_keys_values(ist, parms[1], 2 /*list*/);
llen = list_len(ist, list);
@@ -480,6 +495,7 @@
DEF(Dict, setDefault_BANG, FPARM2(k, NULL, x, OBJ(NONE))) {
obj_p res;
+ BIN_CHK(Dict);
if ((res = dict_item(ist, self, parms[1]))) {
return res;
}
@@ -490,12 +506,14 @@
}
DEF(Dict, popItem_BANG, NULL) {
+ BIN_CHK(Dict);
return dict_keys_values(ist, self, 4 /*tuple*/);
}
DEF(Dict, __iter__, NULL) {
obj_p list_obj, gen_obj = NEW_OBJ(DictGen_OBJ);
+ BIN_CHK(Dict);
gen_obj->data_type = DATA_TYPE_DATAPTR;
gen_obj->data.ptr = list_obj = dict_keys(ist, self);
@@ -505,6 +523,7 @@
DEF(Dict, __toStorProxy__, NULL) {
obj_p proxy_obj = dict_keys_values(ist, self, 2 /*list*/);
+ BIN_CHK(Dict);
switch_proto(ist, proxy_obj, DictRestore_OBJ);
return proxy_obj;
}
@@ -518,6 +537,7 @@
DEF(DictRestore, __fromStorProxy__, NULL) {
int i, llen = (int)list_len(ist, self);
obj_p dict = NEW_DICT(2*llen);
+ BIN_CHK(DictRestore);
for (i=0; i < llen; i += 2)
dict_add(ist, dict, list_item(ist, self, i), list_item(ist, self, i+1));
return dict;
@@ -532,6 +552,7 @@
DEF(DictGen, next, NULL) {
obj_p res, list_obj = self->data.ptr;
+ BIN_CHK(DictGen);
CHECK_TYPE_EXC(self, DictGen_OBJ, "DictGen");
CHECK_TYPE_EXC(list_obj, OBJ(SEQ_PROTO), "list");
Modified: trunk/src/builtins-float.c
===================================================================
--- trunk/src/builtins-float.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/builtins-float.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -119,6 +119,7 @@
}
DEF(Float, __bool__QUES, NULL) {
+ BIN_CHK(Float);
if (Float_value(self) != 0.0 )
return OBJ(PR_TRUE);
else
@@ -127,6 +128,7 @@
DEF(Float, __hash__, NULL) {
double flt = (double) Float_value(self);
+ BIN_CHK(Float);
if (flt < 0) flt = -flt;
if (flt == 0.0) flt = 1.0;
while (flt < 100.0) flt *= 10.0;
@@ -136,20 +138,24 @@
DEF(Float, __abs__, NULL) {
double num = Float_value(self);
+ BIN_CHK(Float);
return NEW_FLOAT(num < 0 ? -num : num);
}
DEF(Float, __neg__, NULL){
+ BIN_CHK(Float);
return NEW_FLOAT( - Float_value(self) );
}
DEF(Float, __pos__, NULL){
+ BIN_CHK(Float);
return self;
}
DEF(Float, __add__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -167,6 +173,7 @@
DEF(Float, __div__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -188,6 +195,7 @@
DEF(Float, __rDiv__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -207,6 +215,7 @@
DEF(Float, __mul__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -224,6 +233,7 @@
DEF(Float, __sub__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -256,6 +266,7 @@
DEF(Float, __pow__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -273,6 +284,7 @@
DEF(Float, __rPow__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -289,6 +301,7 @@
DEF(Float, cmp, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -311,6 +324,7 @@
DEF(Float, __rCmp__, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -331,6 +345,7 @@
DEF(Float, __eq__QUES, FORM_RPARAM){
double float_other;
obj_p other = parms[1];
+ BIN_CHK(Float);
if (is_Float(other)) float_other = Float_value(other);
else {
if (has_proto_QUES(ist, other, OBJ(INT_PROTO)))
@@ -347,16 +362,19 @@
DEF(Float, __str__, NULL){
char str[1024];
+ BIN_CHK(Float);
apr_snprintf(str, sizeof(str), "%g", Float_value(self));
return NEW_STRING(str);
}
DEF(Float, __covers__QUES, FORM_RPARAM) {
+ BIN_CHK(Float);
if (has_proto_QUES(ist, parms[1], OBJ(INT_PROTO))) return OBJ(PR_TRUE);
else return OBJ(PR_FALSE);
}
DEF(Float, __coerce__, FORM_RPARAM) {
+ BIN_CHK(Float);
if (has_proto_QUES(ist, parms[1], OBJ(INT_PROTO)))
return NEW_FLOAT((double)(parms[1]->data.i64));
else if (has_proto_QUES(ist, parms[1], Float_OBJ))
Modified: trunk/src/builtins-list.c
===================================================================
--- trunk/src/builtins-list.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/builtins-list.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -322,10 +322,12 @@
}
DEF(List, __str__, NULL) {
+ BIN_CHK(List);
return str_tuple_list(ist, self, "[", "]");
}
DEF(List, __getItem__, FORM_RPARAM) {
+ BIN_CHK(List);
return get_sequence_item(ist, self, parms[1], SEQ_TYPE_LIST);
}
@@ -335,6 +337,7 @@
obj_p slice = parms[1], value = parms[3];
i64_t i, new_len, exp_len, index1 = 0, index2 = 0, index3 = 0, slice1_empty=FALSE, slice2_empty=FALSE;
size_t val_len, self_len, slice_len = list_len(ist, slice);
+ BIN_CHK(List);
def_write_lock(self);
self_len = listlen(self);
slice_item1 = list_item(ist, slice,0);
@@ -449,6 +452,7 @@
obj_p slice = parms[1];
i64_t i, new_len, index1 = 0, index2 = 0, index3 = 0, slice1_empty=FALSE, slice2_empty=FALSE;
size_t exp_len, self_len, slice_len = list_len(ist, slice);
+ BIN_CHK(List);
def_write_lock(self);
self_len = listlen(self);
slice_item1 = list_item(ist, slice,0);
@@ -554,6 +558,7 @@
DEF(List, __add__, FORM_RPARAM) {
int i;
obj_p res = copy_list_obj(ist, self);
+ BIN_CHK(List);
if (has_proto_QUES(ist, parms[1], OBJ(SEQ_PROTO)) && !has_proto_QUES(ist, parms[1], OBJ(STRING_PROTO)))
for(i=0; i < (int) list_len(ist, parms[1]); i++)
list_append(ist, res, list_item(ist, parms[1], i));
@@ -566,6 +571,7 @@
obj_p res;
list_p lstp, selfp = (list_p)(self->data.ptr);
int i, size, times, len = (int) list_len(ist, self);
+ BIN_CHK(List);
if (!has_proto_QUES(ist, parms[1], OBJ(INT_PROTO))) {
raise_exception(ist, OBJ(TYPE_EXC), "multiply times parameter must be an integer");
return NULL;
@@ -590,6 +596,7 @@
DEF(List, append_BANG, FORM_RPARAM) {
list_p lstp;
+ BIN_CHK(List);
def_write_lock(self);
lstp = self->data.ptr;
if(lstplen(lstp) == lstpsize(lstp)) {
@@ -605,6 +612,7 @@
DEF(List, extend_BANG, FORM_RPARAM) {
list_p selfp, otherp;
size_t self_len, other_len;
+ BIN_CHK(List);
def_write_lock(self);
if (!has_proto_QUES(ist, parms[1], OBJ(TUPLE_PROTO)) && !has_proto_QUES(ist, parms[1], List_OBJ)) {
raise_exception(ist, OBJ(TYPE_EXC), "extend parameter must be a tuple or list");
@@ -629,6 +637,7 @@
i64_t index;
size_t self_len;
list_p selfp;
+ BIN_CHK(List);
if (!has_proto_QUES(ist, parms[1], OBJ(INT_PROTO))) {
raise_exception(ist, OBJ(TYPE_EXC), "index (i) parameter must be an integer");
return NULL;
@@ -660,6 +669,7 @@
i64_t i;
size_t self_len;
list_p selfp;
+ BIN_CHK(List);
def_write_lock(self);
selfp = self->data.ptr;
self_len = lstplen(selfp);
@@ -685,6 +695,7 @@
size_t self_len;
list_p selfp;
obj_p res;
+ BIN_CHK(List);
if (parms[1] != OBJ(NONE) && !has_proto_QUES(ist, parms[1], OBJ(INT_PROTO))) {
raise_exception(ist, OBJ(TYPE_EXC), "pop index (i) parameter must be an integer");
return NULL;
@@ -714,6 +725,7 @@
size_t self_len;
list_p selfp;
obj_p *p1, *p2;
+ BIN_CHK(List);
def_write_lock(self);
selfp = self->data.ptr;
self_len = lstplen(selfp);
@@ -734,6 +746,7 @@
list_p selfp;
obj_p* a;
+ BIN_CHK(List);
if (parms[1] != OBJ(NONE))
CHECK_TYPE_EXC(self, OBJ(FUNC_PROTO), "function");
selfp = self->data.ptr;
Modified: trunk/src/builtins-string.c
===================================================================
--- trunk/src/builtins-string.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/builtins-string.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -121,7 +121,6 @@
memcpy(obj->data.str, p, len);
obj->data.str[len] = 0;
} else {
- SET_TYPE_IF_EXC(OBJ(STRING_PROTO), obj, DATA_TYPE_DATAPTR) return;
obj_str = obj->data.ptr = obj_malloc(ist, OBJ(STRING_PROTO), obj, sizeof(pr_str_t)+len+1);
obj_str->len = len;
memcpy(&(obj_str->str[0]), p, len);
Modified: trunk/src/builtins-thread.c
===================================================================
--- trunk/src/builtins-thread.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/builtins-thread.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -245,6 +245,7 @@
DEF(Thread, __str__, NULL) {
obj_p name_obj;
char name[80];
+ BIN_CHK(Thread);
if ((name_obj = get_attr(ist, self, sym(ist, "name"))))
apr_snprintf(name, sizeof(name), "<Thread:%s>", pr_strptr(name_obj));
else
@@ -253,11 +254,13 @@
}
DEF(Thread, access, NULL) {
+ BIN_CHK(Thread);
return NEW_INT(ist->access);
}
DEF(Thread, setAccess, FORM_RPARAM) {
int new_access;
+ BIN_CHK(Thread);
CHECK_TYPE_EXC(parms[1], OBJ(INT_PROTO), "integer");
new_access = (int) parms[1]->data.i64;
if (new_access > ist->access) {
@@ -270,6 +273,7 @@
}
DEF(Thread, accessStr, NULL) {
+ BIN_CHK(Thread);
switch (ist->access) {
case 0: return NEW_STRING("guest");
case 1: return NEW_STRING("user1");
@@ -280,11 +284,13 @@
}
DEF(Thread, running_QUES, NULL) {
+ BIN_CHK(Thread);
if (thread_running(self)) return OBJ(PR_TRUE);
else return OBJ(PR_FALSE);
}
DEF(Thread, sleep, FORM_RPARAM) {
+ BIN_CHK(Thread);
CHECK_TYPE_EXC(parms[1], OBJ(FLOAT_PROTO), "float");
apr_sleep((apr_interval_time_t)((parms[1]->data.f64)*1000000));
return parms[1];
@@ -293,6 +299,7 @@
DEF(Thread, join, NULL) {
pr_thread_p thread_ptr = self->data.ptr;
apr_status_t retval, aprerr;
+ BIN_CHK(Thread);
if (!(thread_ptr->apr_thread)) {
raise_exception(ist, OBJ(INTERPRETER_EXC), "cannot join this thread");
return NULL;
@@ -303,6 +310,7 @@
}
DEF(Thread, __objList__, FORM_RPARAM) {
+ BIN_CHK(Thread);
return parms[1];
}
@@ -334,18 +342,23 @@
DEF(Mutex, __str__, NULL) {
char name[30];
+ BIN_CHK(Mutex);
apr_snprintf(name, sizeof(name), "<Mutex:%lx>", (unsigned long)(intptr_t)self);
return NEW_STRING(name);
}
DEF(Mutex, lock, NULL) {
- apr_status_t aprerr = apr_thread_mutex_lock((apr_thread_mutex_t*)(self->data.ptr));
+ apr_status_t aprerr;
+ BIN_CHK(Mutex);
+ aprerr = apr_thread_mutex_lock((apr_thread_mutex_t*)(self->data.ptr));
IF_APR_ERR("error in apr_thread_mutex_lock") return NULL;
return self;
}
DEF(Mutex, tryLock, NULL) {
- apr_status_t aprerr = apr_thread_mutex_trylock((apr_thread_mutex_t*)(self->data.ptr));
+ apr_status_t aprerr;
+ BIN_CHK(Mutex);
+ aprerr = apr_thread_mutex_trylock((apr_thread_mutex_t*)(self->data.ptr));
if (APR_STATUS_IS_EBUSY(aprerr)) return OBJ(PR_FALSE);
else if (aprerr == APR_SUCCESS) return OBJ(PR_TRUE);
IF_APR_ERR("error in apr_thread_mutex_trylock") return NULL;
@@ -353,17 +366,21 @@
}
DEF(Mutex, unlock, NULL) {
- apr_status_t aprerr = apr_thread_mutex_unlock((apr_thread_mutex_t*)(self->data.ptr));
+ apr_status_t aprerr;
+ BIN_CHK(Mutex);
+ aprerr = apr_thread_mutex_unlock((apr_thread_mutex_t*)(self->data.ptr));
IF_APR_ERR("error in apr_thread_mutex_unlock") return NULL;
return self;
}
DEF(Mutex, __del__, NULL) {
+ BIN_CHK(Mutex);
apr_thread_mutex_destroy((apr_thread_mutex_t*)(self->data.ptr));
return OBJ(NONE);
}
DEF(Mutex, __objList__, FORM_RPARAM) {
+ BIN_CHK(Mutex);
return parms[1];
}
Modified: trunk/src/builtins-tuple.c
===================================================================
--- trunk/src/builtins-tuple.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/builtins-tuple.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -105,10 +105,12 @@
}
DEF(Tuple, __str__, NULL) {
+ BIN_CHK(Tuple);
return str_tuple_list(ist, self, "(", ")");
}
DEF(Tuple, __getItem__, FORM_RPARAM) {
+ BIN_CHK(Tuple);
return get_sequence_item(ist, self, parms[1], SEQ_TYPE_TUPLE);
}
@@ -123,6 +125,7 @@
}
DEF(Tuple, __objList__, FORM_RPARAM) {
+ BIN_CHK(Tuple);
return self;
}
@@ -130,6 +133,7 @@
int i, llen, tlen, mlen;
obj_p res;
obj_p self_item, tgt_item, tgt_list;
+ BIN_CHK(Tuple);
if (!has_proto_QUES(ist, parms[1], OBJ(SEQ_PROTO))) {
raise_exception(ist, OBJ(TYPE_EXC), "sequence can only be compared to a sequence");
return NULL;
@@ -153,6 +157,7 @@
DEF(Tuple, __eq__QUES, FORM_RPARAM) {
int i, llen, tlen;
obj_p self_item, tgt_item, tgt_list, false_obj = OBJ(PR_FALSE);
+ BIN_CHK(Tuple);
if (!has_proto_QUES(ist, parms[1], OBJ(SEQ_PROTO))) return false_obj;
llen = (int) list_len(ist, self);
tgt_list = parms[1];
@@ -171,6 +176,7 @@
DEF(Tuple, __rIn__QUES, FORM_RPARAM) {
int i, llen = (int) list_len(ist, self);
obj_p item, tgt = parms[1];
+ BIN_CHK(Tuple);
for(i=0; i < llen; i++) {
item = list_item(ist, self, i);
if (call_func1(ist, item, SYM(__EQ__QUES), tgt) == OBJ(PR_TRUE))
@@ -183,6 +189,7 @@
DEF(Tuple, __rNotIn__QUES, FORM_RPARAM) {
int i, llen = (int) list_len(ist, self);
obj_p item, tgt = parms[1];
+ BIN_CHK(Tuple);
for(i=0; i < llen; i++) {
item = list_item(ist, self, i);
if (call_func1(ist, item, SYM(__EQ__QUES), tgt) == OBJ(PR_TRUE))
@@ -195,6 +202,7 @@
DEF(Tuple, __add__, FORM_RPARAM) {
int i;
obj_p res = copy_list_obj(ist, self);
+ BIN_CHK(Tuple);
if (has_proto_QUES(ist, parms[1], OBJ(SEQ_PROTO)) && !has_proto_QUES(ist, parms[1], OBJ(STRING_PROTO)))
for(i=0; i < (int) list_len(ist, parms[1]); i++)
list_append(ist, res, list_item(ist, parms[1], i));
@@ -208,6 +216,7 @@
obj_p res;
list_p lstp, selfp = (list_p)(self->data.ptr);
int i, size, times, len = (int) list_len(ist, self);
+ BIN_CHK(Tuple);
if (!has_proto_QUES(ist, parms[1], OBJ(INT_PROTO))) {
raise_exception(ist, OBJ(TYPE_EXC), "multiply times parameter must be an integer");
return NULL;
@@ -235,12 +244,14 @@
}
DEF(Tuple, len, NULL) {
+ BIN_CHK(Tuple);
return NEW_INT(list_len(ist, self));
}
DEF(Tuple, min, NULL) {
int i, llen = (int) list_len(ist, self);
obj_p min_item, cmp_obj;
+ BIN_CHK(Tuple);
if (llen == 0) return OBJ(NONE);
if (llen == 1) return list_item(ist, self, 0);
cmp_obj = call_func1(ist, list_item(ist, self, 0), SYM(CMP), list_item(ist, self, 1)); if_exc_return NULL;
@@ -256,6 +267,7 @@
DEF(Tuple, max, NULL) {
int i, llen = (int) list_len(ist, self);
obj_p max_item, cmp_obj;
+ BIN_CHK(Tuple);
if (llen == 0) return OBJ(NONE);
if (llen == 1) return list_item(ist, self, 0);
cmp_obj = call_func1(ist, list_item(ist, self, 0), SYM(CMP), list_item(ist, self, 1)); if_exc_return NULL;
@@ -270,6 +282,7 @@
DEF(Tuple, count, FORM_RPARAM) {
int i, cnt=0, llen = (int) list_len(ist, self);
+ BIN_CHK(Tuple);
for (i=0; i < llen; i++) {
if (call_func1(ist, list_item(ist, self, i), SYM(__EQ__QUES), parms[1]) == OBJ(PR_TRUE))
cnt++;
@@ -280,6 +293,7 @@
DEF(Tuple, index, FORM_RPARAM) {
int i, llen = (int) list_len(ist, self);
+ BIN_CHK(Tuple);
for (i=0; i < llen; i++) {
if (call_func1(ist, list_item(ist, self, i), SYM(__EQ__QUES), parms[1]) == OBJ(PR_TRUE))
return NEW_INT(i);
@@ -295,6 +309,7 @@
DEF(Tuple, __iter__, NULL) {
obj_p list_obj, gen_obj = NEW_OBJ(Tgen_OBJ);
+ BIN_CHK(Tuple);
gen_obj->data_type = DATA_TYPE_DATAPTR;
gen_obj->data.ptr = list_obj = copy_list_obj(ist, self);
listlen(list_obj) = 0;
@@ -306,6 +321,7 @@
i32_t hash=0x937456;
int i, llen;
+ BIN_CHK(Tuple);
llen = (int) list_len(ist, self);
for (i=0; i < llen; i++) {
hash_obj = call_func0(ist, list_item(ist, self, i), SYM(__HASH__));
@@ -326,6 +342,7 @@
obj_p res, list_obj = self->data.ptr;
size_t lsiz = listsize(list_obj);
size_t llen = listlen(list_obj);
+ BIN_CHK(Tgen);
if (llen == lsiz) {
raise_exception(ist, OBJ(STOP_ITERATION_EXC), NULL);
return NULL;
Modified: trunk/src/object.c
===================================================================
--- trunk/src/object.c 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/object.c 2004-05-01 06:39:33 UTC (rev 438)
@@ -647,10 +647,15 @@
//********************************* switch_proto ******************************
void switch_proto(isp ist, obj_p obj, obj_p new_proto) {
attr_p attrs;
+ obj_p old_proto = obj_data_owner(obj);
wrlock_rtrn(obj);
- if (obj->data_type == DATA_TYPE_DATAPTR)
- pr_free(obj->data.ptr);
- obj->data_type = DATA_TYPE_NONE;
+ if ( old_proto != new_proto &&
+ !( old_proto == OBJ(LIST_PROTO) && new_proto == OBJ(TUPLE_PROTO) ||
+ old_proto == OBJ(TUPLE_PROTO) && new_proto == OBJ(LIST_PROTO) ) ) {
+ if (obj->data_type == DATA_TYPE_DATAPTR)
+ pr_free(obj->data.ptr);
+ obj->data_type = DATA_TYPE_NONE;
+ }
if (!(obj->has_attrs)) {
obj->attr_proto.proto = new_proto;
write_unlock(ist, obj);
Modified: trunk/src/src.vcproj
===================================================================
--- trunk/src/src.vcproj 2004-05-01 04:35:07 UTC (rev 437)
+++ trunk/src/src.vcproj 2004-05-01 06:39:33 UTC (rev 438)
@@ -250,12 +250,18 @@
RelativePath="..\pr\bin.pr">
</File>
<File
+ RelativePath="..\pr\dict.pr">
+ </File>
+ <File
RelativePath="init.pth">
</File>
<File
RelativePath="prothon.y">
</File>
<File
+ RelativePath="..\pr\re.pr">
+ </File>
+ <File
RelativePath="..\status.txt">
</File>
<File