rev 579 - in trunk: modules/File modules/Prosist modules/Re pr/test src

SVN User <[email protected]> Fri, 04 Jun 2004 21:50:48 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-04 21:50:45 -0400 (Fri, 04 Jun 2004)
New Revision: 579

Modified:
   trunk/modules/File/File.c
   trunk/modules/Prosist/Prosist.c
   trunk/modules/Re/Re.c
   trunk/pr/test/test.pr
   trunk/src/builtins-attrdict.c
   trunk/src/builtins-dict.c
   trunk/src/builtins-float.c
   trunk/src/builtins-int.c
   trunk/src/builtins-list.c
   trunk/src/builtins-protolist.c
   trunk/src/builtins-string.c
   trunk/src/builtins-thread.c
   trunk/src/builtins-tuple.c
   trunk/src/interp.c
   trunk/src/object.c
   trunk/src/parser_routines.c
   trunk/src/symbol.c
Log:
fixed iter_ bug

Modified: trunk/modules/File/File.c
===================================================================
--- trunk/modules/File/File.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/modules/File/File.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -281,7 +281,7 @@
 		size = (size_t) size_in;
 	str_obj = NEW_OBJ(OBJ(STRING_PROTO));
 	if (size < IMMEDIATE_DATA_LEN) {
-		str_obj->data_type = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(OBJ(STRING_PROTO), str_obj, DATA_TYPE_IMMDATA) return NULL;
 		buf = str_obj->data.str;
 	} else {
 		obj_str = obj_malloc(ist, OBJ(STRING_PROTO), str_obj, sizeof(pr_str_t)+size+1);
@@ -359,7 +359,7 @@
 		size = (size_t) size_in;
 	str_obj = NEW_OBJ(OBJ(STRING_PROTO));
 	if (size < IMMEDIATE_DATA_LEN) {
-		str_obj->data_type    = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(OBJ(STRING_PROTO), str_obj, DATA_TYPE_IMMDATA) return NULL;
 		buf = str_obj->data.str;
 	} else {
 		obj_str = obj_malloc(ist, OBJ(STRING_PROTO), str_obj, sizeof(pr_str_t)+size+1);
@@ -438,7 +438,7 @@
 	while (aprerr != APR_EOF && (readall || total_read < size)) {
 		str_obj = NEW_OBJ(OBJ(STRING_PROTO));
 		if (size < IMMEDIATE_DATA_LEN) {
-			str_obj->data_type = DATA_TYPE_IMMDATA;
+			SET_TYPE_IF_EXC(OBJ(STRING_PROTO), str_obj, DATA_TYPE_IMMDATA) return NULL;
 			buf = str_obj->data.str;
 		} else {
 			obj_str = obj_malloc(ist, OBJ(STRING_PROTO), str_obj, sizeof(pr_str_t)+size+1);

Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/modules/Prosist/Prosist.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -150,7 +150,7 @@
 //******************************** new_mutwrap_obj ****************************
 obj_p new_mutwrap_obj(isp ist, obj_p obj) {
 	obj_p mutwrap_obj = new_object(ist, MutWrap_OBJ);
-	mutwrap_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(MutWrap_OBJ, mutwrap_obj, DATA_TYPE_DATAPTR) return NULL;
 	mutwrap_obj->data.ptr = obj;
 	set_immutable(mutwrap_obj);
 	return mutwrap_obj;
@@ -624,7 +624,7 @@
 				goto done;
 			}
 			case 'i':
-				obj->data_type = DATA_TYPE_IMMDATA;
+				SET_TYPE_IF_EXC(OBJ(INT_PROTO), obj, DATA_TYPE_IMMDATA) return NULL;
 				for(n=0,p++; *p != ':'; p++)
 					n = n*10 + *p - '0';
 				obj->imm_data_len = n;

Modified: trunk/modules/Re/Re.c
===================================================================
--- trunk/modules/Re/Re.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/modules/Re/Re.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -120,7 +120,7 @@
 		return NULL;
 	}
 	re_obj = NEW_OBJ(ReCompiled_OBJ);
-	re_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(ReCompiled_OBJ, re_obj, DATA_TYPE_DATAPTR) return NULL;
 	re_obj->data.ptr = e;
 	set_attr(ist, re_obj, sym(ist, "pattern"), parms[1]);
 	set_attr(ist, re_obj, sym(ist, "flags"),   parms[3]);

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/pr/test/test.pr	2004-06-05 01:50:45 UTC (rev 579)
@@ -1,33 +1,16 @@
 #!/usr/bin/env prothon
 
-print "these should all be true\n"
+def hex(n):
+    s = ""
+    while n:
+        d = n & 0xf
+        n = n >> 4
+        if d < 10: s = ('0'.ord()+d).chr()    + s
+        else:      s = ('a'.ord()+d-10).chr() + s
+    return s
+   
+print hex(0x100)
+   
+n=0x0123456789abcdef
 
-print 1 < 2 < 3 < 5 < 199
-
-print 10 < 20 <= 30 <= 30 >= 30 >= 20 > 10
-
-print 1 < 2 > 1 < 2 > 1
-
-print 1 >= 1 == 1 != 2 == 2 > 1 <= 1 <= 2
-
-print "\n\nthese should all be false\n"
-
-print 1 < 2 < 3 < 2 < 199
-
-print 10 < 20 <= 30 <= 29 >= 30 >= 20 > 10
-
-print 1 < 2 > 2 < 2 > 1
-
-print 1 >= 1 == 2 != 2 == 2 > 1 <= 1 <= 2
-
-def f(i):
-	print i,
-	return i
-	
-print "\n\nThis should print 0 1 2\n"
-f(0) < f(1) < f(2)
-
-print "\n\nThis should print 0 1\n"
-f(0) > f(1) < f(2)
-
-print
+print hex(n & 0x0f0f0f0f0f0f0f0f)

Modified: trunk/src/builtins-attrdict.c
===================================================================
--- trunk/src/builtins-attrdict.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-attrdict.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -69,7 +69,7 @@
 // ***************************** new_attrdict_obj *****************************
 obj_p new_attrdict_obj(isp ist, obj_p obj) {
 	obj_p self = new_object(ist, AttrDict_OBJ);
-	self->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(AttrDict_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
 	self->data.ptr  = obj;
 	set_unclonable(self);
 	return self;
@@ -139,14 +139,14 @@
 	set_obj_id(AttrDict_OBJ, *, AttrDict);
 	set_attr(ist, OBJ(OBJECT), sym(ist, "AttrDict"), AttrDict_OBJ);
 
-	AttrDict_OBJ->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(AttrDict_OBJ, AttrDict_OBJ, DATA_TYPE_DATAPTR) return;
 	AttrDict_OBJ->data.ptr  = OBJ(OBJECT);
 	set_unclonable(AttrDict_OBJ);
 }
 
 DEF(AttrDict, init_, FORM_RPARAM) {
     BIN_EMPTY_CHK();
-	self->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(AttrDict_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
 	self->data.ptr  = parms[1];
 	set_unclonable(self);
 	return OBJ(NONE);
Modified: trunk/src/builtins-dict.c
===================================================================
--- trunk/src/builtins-dict.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-dict.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -529,7 +529,7 @@
 	obj_p list_obj, gen_obj = NEW_OBJ(DictGen_OBJ);
 
 	BIN_CONTENT_CHK(Dict);
-	gen_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(DictGen_OBJ, gen_obj, DATA_TYPE_DATAPTR) return NULL;
 	gen_obj->data.ptr = list_obj = dict_keys(ist, self);
 
 	listlen(list_obj) = 0;

Modified: trunk/src/builtins-float.c
===================================================================
--- trunk/src/builtins-float.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-float.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -70,21 +70,18 @@
 
 #define is_Float(objid)		(has_proto(ist, objid, Float_OBJ))
 #define Float_value(objid)	(objid->data.f64)
+MODULE_DECLARE(Float);
 
 //********************************* new_float_obj *****************************
 obj_p new_float_obj(isp ist, double num){
-	obj_p obj = NEW_OBJ(OBJ(FLOAT_PROTO));
-	obj->data_type = DATA_TYPE_IMMDATA;
+	obj_p obj = NEW_OBJ(Float_OBJ);
+	SET_TYPE_IF_EXC(Float_OBJ, obj, DATA_TYPE_IMMDATA) return NULL;
 	obj->imm_data_len = 8;
 	obj->data.f64 = num;
 	obj->immutable = TRUE;
 	return obj;
 }
 
-
-MODULE_DECLARE(Float);
-
-
 MODULE_START(Float)
 {
 	Float_OBJ = OBJ(FLOAT_PROTO) = NEW_OBJ(NULL);
@@ -99,7 +96,7 @@
 	set_attr(ist, OBJ(OBJECT), sym(ist, "Float"),     OBJ(FLOAT_PROTO));
 	set_attr(ist, OBJ(OBJECT), sym(ist, "Imaginary"), OBJ(IMAG_PROTO));
 
-	Float_OBJ->data_type    = DATA_TYPE_IMMDATA;
+	SET_TYPE_IF_EXC(Float_OBJ, Float_OBJ, DATA_TYPE_IMMDATA) return;
 	Float_OBJ->imm_data_len = IMMEDIATE_DATA_LEN;
 	Float_OBJ->data.f64     = 0.0;
 

Modified: trunk/src/builtins-int.c
===================================================================
--- trunk/src/builtins-int.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-int.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -132,7 +132,7 @@
 //********************************* new_int_obj *******************************
 obj_p new_int_obj(isp ist, i64_t num){
 	obj_p obj = NEW_OBJ(OBJ(INT_PROTO));
-	obj->data_type = DATA_TYPE_IMMDATA;
+	SET_TYPE_IF_EXC(OBJ(INT_PROTO), obj, DATA_TYPE_IMMDATA) return NULL;
 	obj->imm_data_len = 8;
 	obj->data.i64 = num;
 	obj->immutable = TRUE;
@@ -145,8 +145,9 @@
 	obj_p obj;
 	long_normalize(longp);
 	len            = sizeof(long_t) + abs(longp->dsize) * sizeof(digit);
-	obj            = NEW_OBJ(OBJ(INT_PROTO));
-	obj->data_type = DATA_TYPE_DATAPTR;
+	obj            = NEW_OBJ(Int_OBJ);
+
+	SET_TYPE_IF_EXC(Int_OBJ, obj, DATA_TYPE_DATAPTR) return NULL;
 	obj->data.ptr  = pr_malloc(len);
 	memcpy(obj->data.ptr, longp, len);
 	long_size(obj) = abs(longp->dsize);
@@ -2071,7 +2072,7 @@
 	set_attr(ist, OBJ(OBJECT), sym(ist, "Int"), Int_OBJ);
 	MODULE_SET_DOC(Int, "integer object prototype");
 	set_obj_id(Int_OBJ, *, Int);
-	Int_OBJ->data_type  = DATA_TYPE_IMMDATA;
+	SET_TYPE_IF_EXC(Int_OBJ, Int_OBJ, DATA_TYPE_IMMDATA) return;
 	Int_OBJ->imm_data_len = IMMEDIATE_DATA_LEN;
 	Int_OBJ->data.i64   = 0;
 
@@ -2086,11 +2087,11 @@
 		INT____PARAM(0, i);
 	CHECK_TYPE_EXC(i, OBJ(INT_PROTO), integer);
 	if (i->data_type == DATA_TYPE_IMMDATA) {
-		self->data_type = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(Int_OBJ, self, DATA_TYPE_IMMDATA) return NULL;
 		self->imm_data_len = 8;
 		self->data.i64 = i->data.i64;
 	} else {
-		self->data_type = DATA_TYPE_DATAPTR;
+		SET_TYPE_IF_EXC(Int_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
 		self->data.ptr  = copy_longp(i->data.ptr, 0);
 	}
 	return OBJ(NONE);

Modified: trunk/src/builtins-list.c
===================================================================
--- trunk/src/builtins-list.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-list.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -87,7 +87,7 @@
 	obj_p list_obj = NEW_OBJ(OBJ(LIST_PROTO));
 	list_p lstp = list_obj->data.ptr = 
 		      pr_malloc(list_sizeof(max(initial_size,2)));
-	list_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(List_OBJ, list_obj, DATA_TYPE_DATAPTR) return NULL;
 	lstpsize(lstp) = max(initial_size,2);
 	lstplen(lstp)  = 0;
 	return list_obj;
@@ -306,7 +306,7 @@
 	set_obj_id(List_OBJ, *, List);
 	set_attr(ist, OBJ(OBJECT), sym(ist, "List"), List_OBJ);
 
-	List_OBJ->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(List_OBJ, List_OBJ, DATA_TYPE_DATAPTR) return;
 	lstp = List_OBJ->data.ptr = pr_malloc(list_sizeof(2));
 	lstpsize(lstp) = 2;
 	lstplen(lstp)  = 0;
@@ -587,7 +587,7 @@
 		raise_exception(ist, OBJ(OUTOFMEMORY_EXC), "memory allocation failed for list multiplication");
 		return NULL;
 	}
-	res->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(List_OBJ, res, DATA_TYPE_DATAPTR) return NULL;
 	lstpsize(lstp) = size;
 	lstplen(lstp)  = size;
 	for(i=0; i < times; i++)

Modified: trunk/src/builtins-protolist.c
===================================================================
--- trunk/src/builtins-protolist.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-protolist.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -69,7 +69,7 @@
 // ***************************** new_protolist_obj ****************************
 obj_p new_protolist_obj(isp ist, obj_p obj) {
 	obj_p self = new_object(ist, ProtoList_OBJ);
-	self->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(ProtoList_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
 	self->data.ptr  = obj;
 	set_unclonable(self);
 	return self;
@@ -116,7 +116,7 @@
 
 DEF(ProtoList, init_, FORM_RPARAM) {
 	BIN_EMPTY_CHK();
-	self->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(ProtoList_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
 	self->data.ptr = parms[1];
 	set_unclonable(self);
 	return OBJ(NONE);
Modified: trunk/src/builtins-string.c
===================================================================
--- trunk/src/builtins-string.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-string.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -83,7 +83,7 @@
 	len = strlen(str);
 	obj = NEW_OBJ(OBJ(STRING_PROTO));
 	if (len < IMMEDIATE_DATA_LEN) {
-		obj->data_type    = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(OBJ(STRING_PROTO), obj, DATA_TYPE_IMMDATA) return NULL;
 		obj->imm_data_len = (int) len;
 		strcpy(obj->data.str, str);
 	} else {
@@ -102,7 +102,7 @@
 	if(!str) return NULL;
 	obj = NEW_OBJ(OBJ(STRING_PROTO));
 	if (len < IMMEDIATE_DATA_LEN) {
-		obj->data_type    = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(OBJ(STRING_PROTO), obj, DATA_TYPE_IMMDATA) return NULL;
 		obj->imm_data_len = (int) len;
 		memcpy(obj->data.str, str, len);
 		obj->data.str[len] = 0;
@@ -201,7 +201,7 @@
 	MODULE_SET_DOC(String, "string object prototype");
 	set_obj_id(String_OBJ, *, String);
 	set_attr(ist, OBJ(OBJECT), sym(ist, "String"), String_OBJ);
-	String_OBJ->data_type    = DATA_TYPE_IMMDATA;
+	SET_TYPE_IF_EXC(String_OBJ, String_OBJ, DATA_TYPE_IMMDATA) return;
 	String_OBJ->imm_data_len = 0;
 	String_OBJ->data.str[0]  = 0;
 }
@@ -272,7 +272,7 @@
 	tlen = slen + olen;
 	obj = NEW_OBJ(String_OBJ);
 	if (tlen < IMMEDIATE_DATA_LEN) {
-		obj->data_type    = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(String_OBJ, obj, DATA_TYPE_IMMDATA) return NULL;
 		obj->imm_data_len = (int) tlen;
 		memcpy(&(obj->data.str[0]),    pr_strptr(self),  slen);
 		memcpy(&(obj->data.str[slen]), pr_strptr(other), olen);
@@ -303,13 +303,13 @@
 	tlen = len*times;
 	obj = NEW_OBJ(String_OBJ);
 	if (tlen < IMMEDIATE_DATA_LEN-1) {
-		obj->data_type    = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(String_OBJ, obj, DATA_TYPE_IMMDATA) return NULL;
 		obj->imm_data_len = (int) tlen;
 		for(i=0; i < times; i++)
 			memcpy(obj->data.str+i*len, pr_strptr(self), len);
 		obj->data.str[tlen] = 0;
 	} else {
-		obj_str = obj_malloc(ist, OBJ(STRING_PROTO), obj, sizeof(pr_str_t)+tlen+1);
+		obj_str = obj_malloc(ist, String_OBJ, obj, sizeof(pr_str_t)+tlen+1);
 		if(!obj_str) {
 			raise_exception(ist, OBJ(OUTOFMEMORY_EXC), "memory allocation failed for string multiplication");
 			return NULL;
@@ -398,7 +398,7 @@
 	}
 	obj = NEW_OBJ(String_OBJ);
 	if (tlen < IMMEDIATE_DATA_LEN) {
-		obj->data_type    = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(String_OBJ, obj, DATA_TYPE_IMMDATA) return NULL;
 		obj->imm_data_len = (int) tlen;
 		dest_ptr = obj->data.str;
 	} else {
@@ -563,7 +563,7 @@
 	// Create the copy.
 	obj = NEW_OBJ(String_OBJ);
 	if (result_len < IMMEDIATE_DATA_LEN-1) {
-		obj->data_type = DATA_TYPE_IMMDATA;
+		SET_TYPE_IF_EXC(String_OBJ, obj, DATA_TYPE_IMMDATA) return NULL;
 		obj->imm_data_len = (int) result_len;
 		dest_ptr = obj->data.str;
 		dest_ptr[result_len]=0;
@@ -727,7 +727,7 @@
 	obj_p gen_obj;
 	BIN_CONTENT_CHK(String);
 	gen_obj = NEW_OBJ(StringGen_OBJ);
-	gen_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(StringGen_OBJ, gen_obj, DATA_TYPE_DATAPTR) return NULL;
 	gen_obj->data.ptr = pr_strptr(self);
 	set_attr(ist, gen_obj, sym(ist, "savedString"), self);
 	return gen_obj;

Modified: trunk/src/builtins-thread.c
===================================================================
--- trunk/src/builtins-thread.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-thread.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -329,7 +329,7 @@
 	MODULE_SET_DOC(Mutex, "mutex object prototype");
 
 	set_attr(ist, OBJ(OBJECT), sym(ist,  "Mutex"), Mutex_OBJ);
-	Mutex_OBJ->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(Mutex_OBJ, Mutex_OBJ, DATA_TYPE_DATAPTR) return;
 	Mutex_OBJ->unclonable = TRUE;
 }
 

Modified: trunk/src/builtins-tuple.c
===================================================================
--- trunk/src/builtins-tuple.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/builtins-tuple.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -87,7 +87,7 @@
 	set_obj_id(Tuple_OBJ, *, Tuple);
 	set_attr(ist, OBJ(OBJECT), sym(ist, "Tuple"), Tuple_OBJ);
 
-	Tuple_OBJ->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(Tuple_OBJ, Tuple_OBJ, DATA_TYPE_DATAPTR) return;
 	lstp = Tuple_OBJ->data.ptr = pr_malloc(list_sizeof(2));
 	lstpsize(lstp) = 2;
 	lstplen(lstp)  = 0;
@@ -310,7 +310,7 @@
 DEF(Tuple, iter_, NULL) {
 	obj_p list_obj, gen_obj = NEW_OBJ(Tgen_OBJ);
 	BIN_CONTENT_CHK(Tuple);
-	gen_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(Tgen_OBJ, gen_obj, DATA_TYPE_DATAPTR) return NULL;
 	gen_obj->data.ptr = list_obj = copy_list_obj(ist, self);
 	listlen(list_obj) = 0;
 	return gen_obj;

Modified: trunk/src/interp.c
===================================================================
--- trunk/src/interp.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/interp.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -133,7 +133,7 @@
 		pr_assert(frame->locals != prev_scope);
 		set_attr(ist, frame->locals, SYM(PREVSCOPE_), prev_scope);
 	}
-	pr_assert(frame->func_name);
+	//pr_assert(frame->func_name);
 	return frame;																				  
 }
 
@@ -143,7 +143,7 @@
 //********************************* new_local_obj *****************************
 obj_p new_local_obj(isp ist, obj_p symbol){
 	obj_p local_obj = NEW_OBJ(OBJ(LOCAL_PROTO));
-	local_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(OBJ(LOCAL_PROTO), local_obj, DATA_TYPE_DATAPTR) return NULL;
 	local_obj->data.ptr = symbol;
 	local_obj->immutable = TRUE;
 	return local_obj;
@@ -153,7 +153,7 @@
 obj_p new_super_obj(isp ist, obj_p container, obj_p symbol) {
 	int i;
 	obj_p super_obj = NEW_OBJ(OBJ(SUPER_PROTO));
-	super_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(OBJ(SUPER_PROTO), super_obj, DATA_TYPE_DATAPTR) return NULL;
 	super_obj->data.ptr = symbol;
 	su(i);
 	set_attr(ist, super_obj, SYM(CONT_), container);
@@ -165,7 +165,7 @@
 //********************************* new_outer_obj *****************************
 obj_p new_outer_obj(isp ist, obj_p symbol){
 	obj_p outer_obj = NEW_OBJ(OBJ(OUTER_PROTO));
-	outer_obj->data_type = DATA_TYPE_DATAPTR;
+	SET_TYPE_IF_EXC(OBJ(OUTER_PROTO), outer_obj, DATA_TYPE_DATAPTR) return NULL;
 	outer_obj->data.ptr = symbol;
 	outer_obj->immutable = TRUE;
 	return outer_obj;
@@ -1218,7 +1218,7 @@
 					}
 					IF_EXC_BREAK;
 					new_frame = create_frame( ist, self, NULL, frame->locals, 
-						                           new_locals, func_obj, NULL, NULL );
+						                      new_locals, func_obj, NULL, NULL );
 					fr_next = new_frame;
 					new_frame->prev_frame = frame;
 					load_frame_params(ist, new_locals, func_obj, param*2, fr_stack+fr_sp+2);
@@ -1461,7 +1461,7 @@
 				else {
 					switch_frame = fp->prev_frame;
 					switch_frame->next_frame = NULL;
-					switch_frame->stack[switch_frame->stack_ptr++] = fr_pop;
+					switch_frame->stack[switch_frame->stack_ptr-1] = fr_pop;
 				}
 			}	break;
 			case OP_RETURN:

Modified: trunk/src/object.c
===================================================================
--- trunk/src/object.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/object.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -1007,8 +1007,7 @@
 		obj->imm_data_len = (int) size;
 		return &obj->data;
 	} else {
-		SET_TYPE_IF_EXC(proto, obj, DATA_TYPE_DATAPTR) 
-			return NULL;
+		SET_TYPE_IF_EXC(proto, obj, DATA_TYPE_DATAPTR) return NULL;
 		obj->data.ptr  = pr_malloc(size);
 		return obj->data.ptr;
 	}
@@ -1054,7 +1053,7 @@
 //********************************* new_hash_obj ******************************
 obj_p new_hash_obj(isp ist, i32_t num) {
 	obj_p hash_obj = NEW_OBJ(OBJ(HASH_PROTO));
-	hash_obj->data_type = DATA_TYPE_IMMDATA;
+	SET_TYPE_IF_EXC(OBJ(HASH_PROTO), hash_obj, DATA_TYPE_IMMDATA) return NULL;
 	hash_obj->imm_data_len = 4;
 	hash_obj->data.i32[0] = num & HASH_MASK;
 	if (!(hash_obj->data.i32[0])) hash_obj->data.i32[0] = 1;

Modified: trunk/src/parser_routines.c
===================================================================
--- trunk/src/parser_routines.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/parser_routines.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -1492,7 +1492,7 @@
 	obj_p proto = OBJ(STRING_PROTO);
 	obj_p obj = new_object(IST, proto);
 	if (len < IMMEDIATE_DATA_LEN) {
-		obj->data_type    = DATA_TYPE_IMMDATA;
+		obj->data_type = DATA_TYPE_IMMDATA;
 		obj->imm_data_len = (int) len;
 		memcpy(obj->data.str, pr_strptr(str), len);
 		obj->data.str[len] = 0;

Modified: trunk/src/symbol.c
===================================================================
--- trunk/src/symbol.c	2004-06-04 22:39:52 UTC (rev 578)
+++ trunk/src/symbol.c	2004-06-05 01:50:45 UTC (rev 579)
@@ -256,7 +256,7 @@
 		return sym;
 	}
 	sym = NEW_OBJ(OBJ(SYMBOL_PROTO));
-	sym->data_type = DATA_TYPE_IMMDATA;
+	SET_TYPE_IF_EXC(OBJ(SYMBOL_PROTO), sym, DATA_TYPE_IMMDATA) return NULL;
 	sym->imm_data_len = 4;
 	if (!(next_key = (next_key+3) & 0x7fffffff)) {
 		printf("Out of unique symbol keys.  Did we really use two billion?\n");