pike.git
/
src
/
docode.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/docode.c:3270:
PUSH_STATEMENT_LABEL; label_save = current_label->prev; current_label->prev = NULL; PUSH_CLEANUP_FRAME(NULL, NULL); label_no=1; current_stack_depth = 0; Pike_compiler->compiler_frame->generator_local = -1; init_bytecode(); insert_opcode0(F_ENTRY, n->line_number, n->current_file);
-
/*
FIXME
: Should we check that do_docode() returns 1? */
+
+
/*
NB
:
Add a mark (or rather do_pop_mark cleanup callback) so that
+
* F_PUSH_ARRAY stays happy even when n is an F_ARG_LIST.
+
*/
+
emit0(F_MARK);
+
PUSH_CLEANUP_FRAME(do_pop_mark, 0);
+
+
/* NB:
Should we check that do_docode() returns 1?
+
*
+
* - No, it returning multiple values (or none) is a
+
* supported operation (cf F_ARG_LIST).
+
*
/
do_docode(n,0);
-
+
+
/* Clean up the mark we set above.
+
*
+
* NB: We can not use POP_AND_DO_CLEANUP here as it will
+
* also pop the value stack.
+
*/
+
do_pop_mark(NULL);
+
POP_AND_DONT_CLEANUP;
+
insert_opcode0(F_DUMB_RETURN, n->line_number, n->current_file); entry_point = assemble(0); /* Don't store linenumbers. */ instrbuf=instrbuf_save; Pike_compiler->compiler_frame->generator_local = generator_local_save; current_stack_depth = cleanup_frame__.stack_depth; POP_AND_DONT_CLEANUP; current_label->prev = label_save; POP_STATEMENT_LABEL; Pike_compiler->compiler_frame->generator_local = generator_local_save; label_no = label_no_save; return entry_point; }