rev 569 - in trunk: . pr/test src

SVN User <[email protected]> Fri, 04 Jun 2004 02:40:49 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-04 02:40:46 -0400 (Fri, 04 Jun 2004)
New Revision: 569

Modified:
   trunk/STATUS.txt
   trunk/pr/test/test.pr
   trunk/src/builtins-core.c
   trunk/src/builtins-dict.c
   trunk/src/builtins-string.c
   trunk/src/interp.c
   trunk/src/interp.h
Log:
fixed several bugs, Dict init_ now takes normal dict as param

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-06-03 21:48:45 UTC (rev 568)
+++ trunk/STATUS.txt	2004-06-04 06:40:46 UTC (rev 569)
@@ -1,6 +1,8 @@
 
 ----------------------- TO-DO (highest priority first) ------------------------
 
+--- fix bug to restart gen after exception (data.ptr == 0)
+
 --- put in skeleton code for + _"abc"
 --- GNU message catalog _"abc" strings
 --- change all strings to resource file

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-03 21:48:45 UTC (rev 568)
+++ trunk/pr/test/test.pr	2004-06-04 06:40:46 UTC (rev 569)
@@ -583,7 +583,6 @@
             self._namedobjects = None
             self.getObject = next.getObject
         else:
-            print "mch", namedobjs
             self._namedobjects = Dict(namedobjs)
         self._nxtdoFunction = next.doFunction
         if not funcs: # None or empty map

Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c	2004-06-03 21:48:45 UTC (rev 568)
+++ trunk/src/builtins-core.c	2004-06-04 06:40:46 UTC (rev 569)
@@ -819,7 +819,6 @@
 	return parms[1];
 }
 
-
 MAIN_MODULE_INIT(Core)
 {
 	MODULE_SUB_INIT(Object);

Modified: trunk/src/builtins-dict.c
===================================================================
--- trunk/src/builtins-dict.c	2004-06-03 21:48:45 UTC (rev 568)
+++ trunk/src/builtins-dict.c	2004-06-04 06:40:46 UTC (rev 569)
@@ -273,16 +273,25 @@
 		strcat(res, "'");	   \
 } while(0)
 
-DEF(Dict, init_, FORM_STAR2_PARAM) {
+DEF(Dict, init_, FORM_STAR3_PARAM) {
 	dict_p dict;
-	obj_p list;
-	int i, llen, size = max(DEFAULT_INITIAL_DICT_SIZE, (int) dict_len(ist, parms[1])*3);
-	
+	obj_p list, dict_in;
+	int i, llen, size;
+
     BIN_EMPTY_OR_NOT_CHK(Dict);
+	llen = (int) list_len(ist, parms[1]);
+	if (llen == 1 && (dict_in = list_item(ist, parms[1], 0))) {
+		CHECK_TYPE_EXC(dict_in, OBJ(DICT_PROTO), dictionary);
+	} else if (llen) {
+		raise_exception(ist, OBJ(TYPE_EXC), "invalid dictionary init_ arguments");
+		return NULL;
+	} else
+		dict_in = parms[3];
+	size = max(DEFAULT_INITIAL_DICT_SIZE, (int) dict_len(ist, dict_in)*3);
 	dict = obj_malloc(ist, OBJ(DICT_PROTO), self, dict_sizeof(size));
     memset(dict, 0, dict_sizeof(size));
     dictsize(dict) = size;
-	list = dict_keys_values(ist, parms[1], 2 /*list*/);
+	list = dict_keys_values(ist, dict_in, 2 /*list*/);
 	llen = (int) list_len(ist, list);
 	for(i=0; i < llen; i += 2)
 		dict_add(ist, self, list_item(ist, list, i), list_item(ist, list, i+1));

Modified: trunk/src/builtins-string.c
===================================================================
--- trunk/src/builtins-string.c	2004-06-03 21:48:45 UTC (rev 568)
+++ trunk/src/builtins-string.c	2004-06-04 06:40:46 UTC (rev 569)
@@ -768,6 +768,10 @@
         return res;
 }
 
+DEF(StringGen, objList_, FORM_RPARAM) {
+	return parms[1];
+}
+
 //********************************* MODULES INIT ******************************
 
 MAIN_MODULE_INIT(String)
@@ -806,6 +810,7 @@
 
 	MODULE_SUB_INIT(StringGen);
 	MODULE_ADD_SYM(StringGen, next);
+	MODULE_ADD_SYM(StringGen, objList_);
 	
 	set_immutable(String_OBJ);
 

Modified: trunk/src/interp.c
===================================================================
--- trunk/src/interp.c	2004-06-03 21:48:45 UTC (rev 568)
+++ trunk/src/interp.c	2004-06-04 06:40:46 UTC (rev 569)
@@ -129,10 +129,11 @@
 
 	prev_scope = (func_obj ? get_attr(ist, func_obj, SYM(PREVSCOPE_)) : syn_locals);
 	if (!prev_scope && syn_locals) prev_scope = syn_locals;
-	if (prev_scope)
+	if (prev_scope) {
+		pr_assert(frame->locals != prev_scope);
 		set_attr(ist, frame->locals, SYM(PREVSCOPE_), prev_scope);
-	if (!frame->func_name)
-		flen = 1;
+	}
+	pr_assert(frame->func_name);
 	return frame;																				  
 }
 
@@ -742,23 +743,21 @@
 				 frame_p *switch_frame, frame_p *free_frame, obj_p return_value ){
 	obj_p res = NULL;
 	if (fr_prev) {
-		if (ist->exception_obj) {
-			fr_sp = 0;
-			fr_push(OBJ(NONE));
-		}
 		if (fr_pc == fr_code->len && fr_sp == 0)
 			fr_push(OBJ(NONE));
 		if (fr_sp != 1) {
 			raise_exception(ist, OBJ(INTERNAL_EXC), "stack != 1 at return call");
 			return NULL;
 		}
-		if (fr_ccall) res = fr_tos;
-		else fr_prev->stack[fr_prev->stack_ptr++] = fr_pop;
+		if (fr_ccall) 
+			res = fr_tos;
+		else 
+			fr_prev->stack[fr_prev->stack_ptr] = fr_tos;
 		*switch_frame = fr_prev;
 		(*switch_frame)->next_frame = NULL;
 	} else
 		*switch_frame = DONE_FRAME_FLAG;
-	if (fr_gen)
+	if (frame->gen_marker)
 		raise_exception(ist, OBJ(STOP_ITERATION_EXC), NULL);
 	else
 		*free_frame = frame;
@@ -1059,14 +1058,14 @@
 						     "!def_code_%s_%d.txt",
 						     as_str(ist, fr_stack[fr_sp+1]), cntr++);
 					dump_code(ist, func, func->data.ptr, dump_name);
-					set_attr(ist, func, sym(ist, "dumpName_"), NEW_STRING(dump_name));
+					set_attr(ist, func, SYM(NAME_), NEW_STRING(dump_name));
 				}
 #endif
 				if (op == OP_GEN) {
-					frame_p new_frame = create_frame( ist, frame->self, NULL,
-							                          frame->dyn_locals, frame->locals, 
-													  func, NULL, NULL );
-					new_frame->gen_marker = TRUE;
+					obj_p new_locals = NEW_OBJ(NULL);
+					frame_p new_frame = create_frame( ist, NULL, NULL, frame->locals,
+													  new_locals, func, NULL, NULL );
+					new_frame->gen_marker = func;
 					func->data.ptr  = NULL;
 					switch_proto(ist, func, OBJ(GEN_PROTO));
 					func->data.ptr  = new_frame;
@@ -1157,6 +1156,7 @@
 				new_frame->prev_frame = frame;
 				frame->next_frame     = new_frame;
 				switch_frame		  = new_frame;
+				fr_push(OBJ(NONE));
 			}	break;
 			case OP_OBJBIND: {
 				obj_p bindee, bound_meth;
@@ -1222,9 +1222,11 @@
 					load_frame_params(ist, new_locals, func_obj, param*2, fr_stack+fr_sp+2);
 					IF_EXC_BREAK;
 					switch_frame = new_frame;
+					fr_push(OBJ(NONE));
 				} else if (has_proto(ist, func_obj, OBJ(GEN_PROTO))) {
 					frame_p tmp_frame;
 					IF_EXC_BREAK;
+					pr_assert(func_obj->data.ptr);
 					tmp_frame = func_obj->data.ptr;
 					frame->next_frame = tmp_frame;
 					load_frame_params(ist, tmp_frame->locals, func_obj, param*2, fr_stack+fr_sp+2);
@@ -1291,13 +1293,14 @@
 						apr_snprintf( dump_name, sizeof(dump_name),
 									"!with_code_%d.txt", with_num++ );
 					dump_code(ist, func, func->data.ptr, dump_name);
+					set_attr(ist, func, SYM(NAME_), NEW_STRING(dump_name));
 				}
 #else
 op_with:		
 #endif
 				fr_sp--;
 				switch_frame = create_frame( ist, frame->self, frame->locals, frame->dyn_locals, 
-					                              fr_stack[fr_sp], fr_data(1), NULL, NULL );
+					                              fr_stack[fr_sp], fr_data(1), NULL, "with" );
 				switch_frame->prev_frame = frame;
 				frame->next_frame = switch_frame;
 end_op_obj:		break;
@@ -1339,6 +1342,7 @@
 					new_frame->prev_frame = frame;
 					frame->next_frame = new_frame;
 					switch_frame = new_frame;
+					fr_push(OBJ(NONE));
 					break;
 				}
 				IF_EXC_BREAK;
@@ -1404,9 +1408,11 @@
 					load_frame_params(ist, new_locals, func_obj, param*2, fr_stack+fr_sp+3);
 					IF_EXC_BREAK;
 					switch_frame = new_frame;
+					fr_push(OBJ(NONE));
 				} else if (has_proto(ist, func_obj, OBJ(GEN_PROTO))) {
 					frame_p tmp_frame;
 					IF_EXC_BREAK;
+					pr_assert(func_obj->data.ptr);
 					tmp_frame = func_obj->data.ptr;
 					frame->next_frame = tmp_frame;
 					load_frame_params(ist, tmp_frame->locals, func_obj, param*2, fr_stack+fr_sp+3);
@@ -1556,6 +1562,8 @@
 #endif
 				stack_lim = frame->code->max_stack_depth;
 				// free_frame(tmp_frame);  XXX
+				if (tmp_frame->gen_marker)
+					tmp_frame->gen_marker->data.ptr = NULL;
 				if (!tmp_frame->do_not_free)
 					pr_free(tmp_frame);
 				frame->next_frame = NULL;
@@ -1829,7 +1837,6 @@
 	apr_snprintf(full_doc, sizeof(full_doc), "%s%s", name, comment);
 	set_obj_doc(module, full_doc);
 	frame = ist->frame;
-	//new_locals = NEW_OBJ(NULL);
 	if (filename)
 		frame_name = filename;
 	else

Modified: trunk/src/interp.h
===================================================================
--- trunk/src/interp.h	2004-06-03 21:48:45 UTC (rev 568)
+++ trunk/src/interp.h	2004-06-04 06:40:46 UTC (rev 569)
@@ -80,7 +80,7 @@
 	frame_p		prev_frame;
 	int			called_from_c;
 	int			do_not_free;
-	int			gen_marker;
+	obj_p		gen_marker;
 	obj_p		func;
 	obj_p		syn_self;
 	obj_p		self;
@@ -129,7 +129,6 @@
 #define fr_next			(frame->next_frame)
 #define fr_prev			(frame->prev_frame)
 #define fr_ccall		(frame->called_from_c)
-#define fr_gen			(frame->gen_marker)
 #define fr_pc			(frame->pc)
 #define fr_code			(frame->code)
 #define fr_op			(fr_code->code_data[fr_pc].bytecode.opcode)