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)