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