pike.git / src / docode.c

version» Context lines:

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;   }