|
Defines |
| #define | DO_IF_BIGNUM(CODE) |
| #define | DO_IF_ELSE_COMPUTED_GOTO(A, B) (B) |
| #define | OPCODE0_ALIAS(A, B, C, D) OPCODE0(A,B,C,{D();}) |
| #define | OPCODE1_ALIAS(A, B, C, D) OPCODE1(A,B,C,{D();}) |
| #define | OPCODE2_ALIAS(A, B, C, D) OPCODE2(A,B,C,{D();}) |
| #define | INTER_ESCAPE_CATCH return -2 |
| #define | INTER_RETURN return -1 |
| #define | DO_BRANCH DOJUMP |
| #define | DONT_BRANCH SKIPJUMP |
| #define | LOCAL_VAR(X) X |
| #define | GET_JUMP() (/*write_to_stderr("GET_JUMP\n", 9),*/ LOW_GET_JUMP()) |
| #define | SKIPJUMP() (/*write_to_stderr("SKIPJUMP\n", 9),*/ LOW_SKIPJUMP()) |
| #define | DOJUMP() |
| #define | DO_JUMP_TO(NEWPC) |
| #define | DO_DUMB_RETURN |
| #define | DO_RETURN DO_DUMB_RETURN |
| #define | JUMP_SET_TO_PC_AT_NEXT(PC) ((PC) = PROG_COUNTER) |
| #define | DO_JUMP_TO_NEXT JUMP_DONE |
| #define | DO_INDEX |
| #define | CJUMP(X, DESC, Y) |
| #define | AUTO_BIGNUM_LOOP_TEST(X, Y) 0 |
| #define | LOOP(ID, DESC, INC, OP2, OP4) |
| #define | COMPARISON(ID, DESC, EXPR) |
| #define | MKAPPLY(OP, OPCODE, NAME, TYPE,ARG2, ARG3) |
| #define | MKAPPLY2(OP, OPCODE, NAME, TYPE,ARG2, ARG3) |
| #define | DO_CALL_BUILTIN(ARGS) (*(Pike_fp->context.prog->constants[arg1].sval.u.efun->function))(ARGS) |
| #define | ENTRY_PROLOGUE_SIZE 0 |
| #define | DO_RECUR(XFLAGS) |
| #define | DO_IF_BIGNUM(CODE) |
| #define | DO_IF_ELSE_COMPUTED_GOTO(A, B) (B) |
| #define | INTER_ESCAPE_CATCH return -2 |
| #define | INTER_RETURN return -1 |
| #define | DO_BRANCH DOJUMP |
| #define | DONT_BRANCH SKIPJUMP |
| #define | GET_JUMP() (/*write_to_stderr("GET_JUMP\n", 9),*/ LOW_GET_JUMP()) |
| #define | SKIPJUMP() (/*write_to_stderr("SKIPJUMP\n", 9),*/ LOW_SKIPJUMP()) |
| #define | DOJUMP() |
| #define | DO_JUMP_TO(NEWPC) |
| #define | DO_DUMB_RETURN |
| #define | DO_RETURN DO_DUMB_RETURN |
| #define | JUMP_SET_TO_PC_AT_NEXT(PC) ((PC) = PROG_COUNTER) |
| #define | DO_JUMP_TO_NEXT JUMP_DONE |
| #define | DO_INDEX |
| #define | CJUMP(X, DESC, Y) |
| #define | AUTO_BIGNUM_LOOP_TEST(X, Y) 0 |
| #define | LOOP(ID, DESC, INC, OP2, OP4) |
| #define | COMPARISON(ID, DESC, EXPR) |
| #define | MKAPPLY(OP, OPCODE, NAME, TYPE,ARG2, ARG3) |
| #define | MKAPPLY2(OP, OPCODE, NAME, TYPE,ARG2, ARG3) |
| #define | DO_CALL_BUILTIN(ARGS) (*(Pike_fp->context.prog->constants[arg1].sval.u.efun->function))(ARGS) |
| #define | ENTRY_PROLOGUE_SIZE 0 |
| #define | DO_RECUR(XFLAGS) |
Functions |
| | OPCODE0 (F_UNDEFINED,"push UNDEFINED", I_UPDATE_SP,{push_int(0);Pike_sp[-1].subtype=NUMBER_UNDEFINED;}) |
| | OPCODE0 (F_CONST0,"push 0", I_UPDATE_SP,{push_int(0);}) |
| | OPCODE0 (F_CONST1,"push 1", I_UPDATE_SP,{push_int(1);}) |
| | OPCODE0 (F_MARK_AND_CONST0,"mark & 0", I_UPDATE_SP|I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;push_int(0);}) |
| | OPCODE0 (F_MARK_AND_CONST1,"mark & 1", I_UPDATE_SP|I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;push_int(1);}) |
| | OPCODE0 (F_CONST_1,"push -1", I_UPDATE_SP,{push_int(-1);}) |
| | OPCODE0 (F_BIGNUM,"push 0x7fffffff", I_UPDATE_SP,{push_int(0x7fffffff);}) |
| | OPCODE1 (F_NUMBER,"push int", I_UPDATE_SP,{push_int(arg1);}) |
| | OPCODE2 (F_NUMBER64,"push 64-bit int", I_UPDATE_SP,{Pike_error("F_NUMBER64: this opcode should never be used in your system\n");}) |
| | OPCODE1 (F_NEG_NUMBER,"push -int", I_UPDATE_SP,{push_int(-arg1);}) |
| | OPCODE1 (F_CONSTANT,"constant", I_UPDATE_SP,{push_svalue(&Pike_fp->context.prog->constants[arg1].sval);print_return_value();}) |
| | OPCODE2 (F_REARRANGE,"rearrange", 0,{check_stack(arg2);MEMCPY(Pike_sp, Pike_sp-arg1-arg2, sizeof(struct svalue)*arg2);MEMMOVE(Pike_sp-arg1-arg2, Pike_sp-arg1, sizeof(struct svalue)*arg1);MEMCPY(Pike_sp-arg2, Pike_sp, sizeof(struct svalue)*arg2);}) |
| | OPCODE1_TAIL (F_MARK_AND_STRING,"mark & string", I_UPDATE_SP|I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;OPCODE1(F_STRING,"string", I_UPDATE_SP,{copy_shared_string(Pike_sp->u.string, Pike_fp->context.prog->strings[arg1]);Pike_sp->type=PIKE_T_STRING;Pike_sp->subtype=0;Pike_sp++;print_return_value();});}) |
| | OPCODE1 (F_ARROW_STRING,"->string", I_UPDATE_SP,{copy_shared_string(Pike_sp->u.string, Pike_fp->context.prog->strings[arg1]);Pike_sp->type=PIKE_T_STRING;Pike_sp->subtype=1;Pike_sp++;print_return_value();}) |
| | OPCODE1 (F_LOOKUP_LFUN,"->lfun", 0,{LOCAL_VAR(struct object *o);LOCAL_VAR(struct svalue tmp);LOCAL_VAR(struct program *p);if((Pike_sp[-1].type==T_OBJECT)&&(p=(o=Pike_sp[-1].u.object)->prog)&&(FIND_LFUN(p=o->prog->inherits[Pike_sp[-1].subtype].prog, LFUN_ARROW)==-1)){int id=FIND_LFUN(p, arg1);if((id!=-1)&&(!(p->identifier_references[id].id_flags &(ID_STATIC|ID_PRIVATE|ID_HIDDEN)))){id+=o->prog->inherits[Pike_sp[-1].subtype].identifier_level;low_object_index_no_free(&tmp, o, id);}else{tmp.type=T_INT;tmp.subtype=NUMBER_UNDEFINED;tmp.u.integer=0;}}else{LOCAL_VAR(struct svalue tmp2);tmp2.type=PIKE_T_STRING;tmp2.u.string=lfun_strings[arg1];tmp2.subtype=1;index_no_free(&tmp, Pike_sp-1,&tmp2);}free_svalue(Pike_sp-1);move_svalue(Pike_sp-1,&tmp);print_return_value();}) |
| | OPCODE1 (F_LFUN,"local function", I_UPDATE_SP,{ref_push_function(Pike_fp->current_object, arg1+Pike_fp->context.identifier_level);print_return_value();}) |
| | OPCODE2 (F_TRAMPOLINE,"trampoline", I_UPDATE_SP,{struct pike_frame *f=Pike_fp;LOCAL_VAR(struct object *o);o=low_clone(pike_trampoline_program);while(arg2--){DO_IF_DEBUG({if(!f->scope){Pike_fatal("F_TRAMPOLINE %d, %d: Missing %d levels of scope!\n", arg1, arg2_, arg2+1);}});f=f->scope;}add_ref(((struct pike_trampoline *)(o->storage))->frame=f);((struct pike_trampoline *)(o->storage))->func=arg1+Pike_fp->context.identifier_level;push_function(o, pike_trampoline_program->lfuns[LFUN_CALL]);print_return_value();}) |
| | OPCODE1_TAIL (F_MARK_AND_GLOBAL,"mark & global", I_UPDATE_SP|I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;OPCODE1(F_GLOBAL,"global", I_UPDATE_SP,{low_index_current_object_no_free(Pike_sp, arg1);Pike_sp++;print_return_value();});}) |
| | OPCODE2_TAIL (F_MARK_AND_EXTERNAL,"mark & external", I_UPDATE_SP|I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;OPCODE2(F_EXTERNAL,"external", I_UPDATE_SP,{LOCAL_VAR(struct external_variable_context loc);loc.o=Pike_fp->current_object;loc.parent_identifier=Pike_fp->fun;if(loc.o->prog) loc.inherit=INHERIT_FROM_INT(loc.o->prog, loc.parent_identifier);find_external_context(&loc, arg2);DO_IF_DEBUG({TRACE((5,"- Identifier=%d Offset=%d\n", arg1, loc.inherit->identifier_level));});if(arg1==IDREF_MAGIC_THIS) ref_push_object(loc.o);else{low_object_index_no_free(Pike_sp, loc.o, arg1+loc.inherit->identifier_level);Pike_sp++;}print_return_value();});}) |
| | OPCODE2 (F_EXTERNAL_LVALUE,"& external", I_UPDATE_SP,{LOCAL_VAR(struct external_variable_context loc);loc.o=Pike_fp->current_object;loc.parent_identifier=Pike_fp->fun;if(loc.o->prog) loc.inherit=INHERIT_FROM_INT(loc.o->prog, loc.parent_identifier);find_external_context(&loc, arg2);if(!loc.o->prog) Pike_error("Cannot access variable in destructed parent object.\n");DO_IF_DEBUG({TRACE((5,"- Identifier=%d Offset=%d\n", arg1, loc.inherit->identifier_level));});ref_push_object(loc.o);push_obj_index(arg1+loc.inherit->identifier_level);}) |
| | OPCODE1 (F_MARK_AND_LOCAL,"mark & local", I_UPDATE_SP|I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;push_svalue(Pike_fp->locals+arg1);print_return_value();}) |
| | OPCODE1 (F_LOCAL,"local", I_UPDATE_SP,{push_svalue(Pike_fp->locals+arg1);print_return_value();}) |
| | OPCODE2 (F_2_LOCALS,"2 locals", I_UPDATE_SP,{push_svalue(Pike_fp->locals+arg1);print_return_value();push_svalue(Pike_fp->locals+arg2);print_return_value();}) |
| | OPCODE2 (F_LOCAL_2_LOCAL,"local = local", 0,{assign_svalue(Pike_fp->locals+arg1, Pike_fp->locals+arg2);}) |
| | OPCODE2 (F_LOCAL_2_GLOBAL,"global = local", 0,{object_low_set_index(Pike_fp->current_object, arg1+Pike_fp->context.identifier_level, Pike_fp->locals+arg2);}) |
| | OPCODE2 (F_GLOBAL_2_LOCAL,"local = global", 0,{free_svalue(Pike_fp->locals+arg2);low_index_current_object_no_free(Pike_fp->locals+arg2, arg1);}) |
| | OPCODE1 (F_LOCAL_LVALUE,"& local", I_UPDATE_SP,{Pike_sp[0].type=T_SVALUE_PTR;Pike_sp[0].u.lval=Pike_fp->locals+arg1;Pike_sp[1].type=T_VOID;Pike_sp+=2;}) |
| | OPCODE2 (F_LEXICAL_LOCAL,"lexical local", I_UPDATE_SP,{struct pike_frame *f=Pike_fp;while(arg2--){f=f->scope;if(!f) Pike_error("Lexical scope error.\n");}push_svalue(f->locals+arg1);print_return_value();}) |
| | OPCODE2 (F_LEXICAL_LOCAL_LVALUE,"&lexical local", I_UPDATE_SP,{struct pike_frame *f=Pike_fp;while(arg2--){f=f->scope;if(!f) Pike_error("Lexical scope error.\n");}Pike_sp[0].type=T_SVALUE_PTR;Pike_sp[0].u.lval=f->locals+arg1;Pike_sp[1].type=T_VOID;Pike_sp+=2;}) |
| | OPCODE1 (F_ARRAY_LVALUE,"[ lvalues ]", I_UPDATE_SP,{f_aggregate(arg1 *2);Pike_sp[-1].u.array->flags|=ARRAY_LVALUE;Pike_sp[-1].u.array->type_field|=BIT_UNFINISHED|BIT_MIXED;move_svalue(Pike_sp, Pike_sp-1);Pike_sp[-1].type=T_ARRAY_LVALUE;Pike_sp++;}) |
| | OPCODE1 (F_CLEAR_2_LOCAL,"clear 2 local", 0,{free_mixed_svalues(Pike_fp->locals+arg1, 2);Pike_fp->locals[arg1].type=PIKE_T_INT;Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;Pike_fp->locals[arg1].u.integer=0;Pike_fp->locals[arg1+1].type=PIKE_T_INT;Pike_fp->locals[arg1+1].subtype=NUMBER_NUMBER;Pike_fp->locals[arg1+1].u.integer=0;}) |
| | OPCODE1 (F_CLEAR_4_LOCAL,"clear 4 local", 0,{int e;free_mixed_svalues(Pike_fp->locals+arg1, 4);for(e=0;e< 4;e++){Pike_fp->locals[arg1+e].type=PIKE_T_INT;Pike_fp->locals[arg1+e].subtype=NUMBER_NUMBER;Pike_fp->locals[arg1+e].u.integer=0;}}) |
| | OPCODE1 (F_CLEAR_LOCAL,"clear local", 0,{free_svalue(Pike_fp->locals+arg1);Pike_fp->locals[arg1].type=PIKE_T_INT;Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;Pike_fp->locals[arg1].u.integer=0;}) |
| | OPCODE1 (F_INC_LOCAL,"++local", I_UPDATE_SP,{if((Pike_fp->locals[arg1].type==PIKE_T_INT) DO_IF_BIGNUM(&&(!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1)))){push_int(++(Pike_fp->locals[arg1].u.integer));Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;}else{push_svalue(Pike_fp->locals+arg1);push_int(1);f_add(2);assign_svalue(Pike_fp->locals+arg1, Pike_sp-1);}}) |
| | OPCODE1 (F_POST_INC_LOCAL,"local++", I_UPDATE_SP,{push_svalue(Pike_fp->locals+arg1);if((Pike_fp->locals[arg1].type==PIKE_T_INT) DO_IF_BIGNUM(&&(!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1)))){Pike_fp->locals[arg1].u.integer++;Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;}else{push_svalue(Pike_fp->locals+arg1);push_int(1);f_add(2);stack_pop_to(Pike_fp->locals+arg1);}}) |
| | OPCODE1 (F_INC_LOCAL_AND_POP,"++local and pop", 0,{if((Pike_fp->locals[arg1].type==PIKE_T_INT) DO_IF_BIGNUM(&&(!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1)))){Pike_fp->locals[arg1].u.integer++;Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;}else{push_svalue(Pike_fp->locals+arg1);push_int(1);f_add(2);stack_pop_to(Pike_fp->locals+arg1);}}) |
| | OPCODE1 (F_DEC_LOCAL,"--local", I_UPDATE_SP,{if((Pike_fp->locals[arg1].type==PIKE_T_INT) DO_IF_BIGNUM(&&(!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1)))){push_int(--(Pike_fp->locals[arg1].u.integer));Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;}else{push_svalue(Pike_fp->locals+arg1);push_int(1);o_subtract();assign_svalue(Pike_fp->locals+arg1, Pike_sp-1);}}) |
| | OPCODE1 (F_POST_DEC_LOCAL,"local--", I_UPDATE_SP,{push_svalue(Pike_fp->locals+arg1);if((Pike_fp->locals[arg1].type==PIKE_T_INT) DO_IF_BIGNUM(&&(!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1)))){Pike_fp->locals[arg1].u.integer--;Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;}else{push_svalue(Pike_fp->locals+arg1);push_int(1);o_subtract();stack_pop_to(Pike_fp->locals+arg1);}}) |
| | OPCODE1 (F_DEC_LOCAL_AND_POP,"--local and pop", 0,{if((Pike_fp->locals[arg1].type==PIKE_T_INT) DO_IF_BIGNUM(&&(!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1)))){Pike_fp->locals[arg1].u.integer--;Pike_fp->locals[arg1].subtype=NUMBER_NUMBER;}else{push_svalue(Pike_fp->locals+arg1);push_int(1);o_subtract();stack_pop_to(Pike_fp->locals+arg1);}}) |
| | OPCODE0 (F_LTOSVAL,"lvalue to svalue", I_UPDATE_SP,{dmalloc_touch_svalue(Pike_sp-2);dmalloc_touch_svalue(Pike_sp-1);lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;print_return_value();}) |
| | OPCODE0 (F_LTOSVAL2,"ltosval2", I_UPDATE_SP,{dmalloc_touch_svalue(Pike_sp-3);dmalloc_touch_svalue(Pike_sp-2);dmalloc_touch_svalue(Pike_sp-1);move_svalue(Pike_sp, Pike_sp-1);Pike_sp[-1].type=PIKE_T_INT;Pike_sp++;lvalue_to_svalue_no_free(Pike_sp-2, Pike_sp-4);if((1<< Pike_sp[-2].type)&(BIT_ARRAY|BIT_MULTISET|BIT_MAPPING|BIT_STRING)){LOCAL_VAR(struct svalue tmp);tmp.type=PIKE_T_INT;tmp.subtype=NUMBER_NUMBER;tmp.u.integer=0;assign_lvalue(Pike_sp-4,&tmp);}}) |
| | OPCODE0 (F_LTOSVAL3,"ltosval3", I_UPDATE_SP,{dmalloc_touch_svalue(Pike_sp-4);dmalloc_touch_svalue(Pike_sp-3);dmalloc_touch_svalue(Pike_sp-2);dmalloc_touch_svalue(Pike_sp-1);move_svalue(Pike_sp, Pike_sp-1);move_svalue(Pike_sp-1, Pike_sp-2);Pike_sp[-2].type=PIKE_T_INT;Pike_sp++;lvalue_to_svalue_no_free(Pike_sp-3, Pike_sp-5);if((1<< Pike_sp[-3].type)&(BIT_ARRAY|BIT_MULTISET|BIT_MAPPING|BIT_STRING)){LOCAL_VAR(struct svalue tmp);tmp.type=PIKE_T_INT;tmp.subtype=NUMBER_NUMBER;tmp.u.integer=0;assign_lvalue(Pike_sp-5,&tmp);}}) |
| | OPCODE0 (F_LTOSVAL1,"ltosval1", I_UPDATE_SP,{dmalloc_touch_svalue(Pike_sp-2);dmalloc_touch_svalue(Pike_sp-1);lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;if((1<< Pike_sp[-1].type)&(BIT_ARRAY|BIT_MULTISET|BIT_MAPPING|BIT_STRING)){LOCAL_VAR(struct svalue tmp);tmp.type=PIKE_T_INT;tmp.subtype=NUMBER_NUMBER;tmp.u.integer=0;assign_lvalue(Pike_sp-3,&tmp);}}) |
| | OPCODE0 (F_ADD_TO,"+=", I_UPDATE_SP,{move_svalue(Pike_sp, Pike_sp-1);Pike_sp[-1].type=PIKE_T_INT;Pike_sp++;lvalue_to_svalue_no_free(Pike_sp-2, Pike_sp-4);if(Pike_sp[-1].type==PIKE_T_INT &&Pike_sp[-2].type==PIKE_T_INT){DO_IF_BIGNUM(if(!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, Pike_sp[-2].u.integer))){INT_TYPE val=(Pike_sp[-1].u.integer+=Pike_sp[-2].u.integer);Pike_sp[-1].subtype=NUMBER_NUMBER;assign_lvalue(Pike_sp-4, Pike_sp-1);Pike_sp-=2;pop_2_elems();push_int(val);goto add_to_done;}}if((1<< Pike_sp[-2].type)&(BIT_ARRAY|BIT_MULTISET|BIT_MAPPING|BIT_STRING)){LOCAL_VAR(struct svalue tmp);tmp.type=PIKE_T_INT;tmp.subtype=NUMBER_NUMBER;tmp.u.integer=0;assign_lvalue(Pike_sp-4,&tmp);}else if(Pike_sp[-2].type==T_OBJECT){int i;LOCAL_VAR(struct object *o);LOCAL_VAR(struct program *p);if((o=Pike_sp[-2].u.object)->refs<=2 &&(p=o->prog)&&(i=FIND_LFUN(p->inherits[Pike_sp[-2].subtype].prog, LFUN_ADD_EQ))!=-1){apply_low(o, i+p->inherits[Pike_sp[-2].subtype].identifier_level, 1);pop_stack();stack_pop_2_elems_keep_top();goto add_to_done;}}f_add(2);assign_lvalue(Pike_sp-3, Pike_sp-1);stack_pop_2_elems_keep_top();add_to_done:;}) |
| | OPCODE1 (F_GLOBAL_LVALUE,"& global", I_UPDATE_SP,{ref_push_object(Pike_fp->current_object);push_obj_index(arg1+Pike_fp->context.identifier_level);}) |
| | OPCODE0 (F_INC,"++x", I_UPDATE_SP,{union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);if(uDO_IF_BIGNUM(&&!INT_TYPE_ADD_OVERFLOW(u->integer, 1))){INT_TYPE val=++u->integer;pop_2_elems();push_int(val);}else{lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;push_int(1);f_add(2);assign_lvalue(Pike_sp-3, Pike_sp-1);stack_pop_2_elems_keep_top();}}) |
| | OPCODE0 (F_DEC,"--x", I_UPDATE_SP,{union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);if(uDO_IF_BIGNUM(&&!INT_TYPE_SUB_OVERFLOW(u->integer, 1))){INT_TYPE val=--u->integer;pop_2_elems();push_int(val);}else{lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;push_int(1);o_subtract();assign_lvalue(Pike_sp-3, Pike_sp-1);stack_pop_2_elems_keep_top();}}) |
| | OPCODE0 (F_DEC_AND_POP,"x-- and pop", I_UPDATE_SP,{union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);if(uDO_IF_BIGNUM(&&!INT_TYPE_SUB_OVERFLOW(u->integer, 1))){--u->integer;pop_2_elems();}else{lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;push_int(1);o_subtract();assign_lvalue(Pike_sp-3, Pike_sp-1);pop_n_elems(3);}}) |
| | OPCODE0 (F_INC_AND_POP,"x++ and pop", I_UPDATE_SP,{union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);if(uDO_IF_BIGNUM(&&!INT_TYPE_ADD_OVERFLOW(u->integer, 1))){++u->integer;pop_2_elems();}else{lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;push_int(1);f_add(2);assign_lvalue(Pike_sp-3, Pike_sp-1);pop_n_elems(3);}}) |
| | OPCODE0 (F_POST_INC,"x++", I_UPDATE_SP,{union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);if(uDO_IF_BIGNUM(&&!INT_TYPE_ADD_OVERFLOW(u->integer, 1))){INT_TYPE val=u->integer++;pop_2_elems();push_int(val);}else{lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;stack_dup();push_int(1);f_add(2);assign_lvalue(Pike_sp-4, Pike_sp-1);pop_stack();stack_pop_2_elems_keep_top();print_return_value();}}) |
| | OPCODE0 (F_POST_DEC,"x--", I_UPDATE_SP,{union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);if(uDO_IF_BIGNUM(&&!INT_TYPE_SUB_OVERFLOW(u->integer, 1))){INT_TYPE val=u->integer--;pop_2_elems();push_int(val);}else{lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);Pike_sp++;stack_dup();push_int(1);o_subtract();assign_lvalue(Pike_sp-4, Pike_sp-1);pop_stack();stack_pop_2_elems_keep_top();print_return_value();}}) |
| | OPCODE1 (F_ASSIGN_LOCAL,"assign local", 0,{assign_svalue(Pike_fp->locals+arg1, Pike_sp-1);}) |
| | OPCODE0 (F_ASSIGN,"assign", I_UPDATE_SP,{assign_lvalue(Pike_sp-3, Pike_sp-1);free_svalue(Pike_sp-3);free_svalue(Pike_sp-2);move_svalue(Pike_sp-3, Pike_sp-1);Pike_sp-=2;}) |
| | OPCODE2 (F_APPLY_ASSIGN_LOCAL_AND_POP,"apply, assign local and pop", I_UPDATE_SP|I_UPDATE_M_SP,{apply_svalue(&((Pike_fp->context.prog->constants+arg1)->sval), DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp)));free_svalue(Pike_fp->locals+arg2);move_svalue(Pike_fp->locals+arg2, Pike_sp-1);Pike_sp--;}) |
| | OPCODE2 (F_APPLY_ASSIGN_LOCAL,"apply, assign local", I_UPDATE_ALL,{apply_svalue(&((Pike_fp->context.prog->constants+arg1)->sval), DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp)));assign_svalue(Pike_fp->locals+arg2, Pike_sp-1);}) |
| | OPCODE0 (F_ASSIGN_AND_POP,"assign and pop", I_UPDATE_SP,{assign_lvalue(Pike_sp-3, Pike_sp-1);pop_n_elems(3);}) |
| | OPCODE1 (F_ASSIGN_LOCAL_AND_POP,"assign local and pop", I_UPDATE_SP,{free_svalue(Pike_fp->locals+arg1);move_svalue(Pike_fp->locals+arg1, Pike_sp-1);Pike_sp--;}) |
| | OPCODE1 (F_ASSIGN_GLOBAL,"assign global", 0,{object_low_set_index(Pike_fp->current_object, arg1+Pike_fp->context.identifier_level, Pike_sp-1);}) |
| | OPCODE1 (F_ASSIGN_GLOBAL_AND_POP,"assign global and pop", I_UPDATE_SP,{object_low_set_index(Pike_fp->current_object, arg1+Pike_fp->context.identifier_level, Pike_sp-1);pop_stack();}) |
| | OPCODE0 (F_POP_VALUE,"pop", I_UPDATE_SP,{pop_stack();}) |
| | OPCODE1 (F_POP_N_ELEMS,"pop_n_elems", I_UPDATE_SP,{pop_n_elems(arg1);}) |
| | OPCODE0_TAIL (F_MARK2,"mark mark", I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;OPCODE0_TAIL(F_SYNCH_MARK,"synch mark", I_UPDATE_M_SP,{OPCODE0(F_MARK,"mark", I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp;});});}) |
| | OPCODE1 (F_MARK_X,"mark Pike_sp-X", I_UPDATE_M_SP,{*(Pike_mark_sp++)=Pike_sp-arg1;}) |
| | OPCODE0 (F_POP_MARK,"pop mark", I_UPDATE_M_SP,{--Pike_mark_sp;}) |
| | OPCODE0 (F_POP_TO_MARK,"pop to mark", I_UPDATE_SP|I_UPDATE_M_SP,{pop_n_elems(Pike_sp-*--Pike_mark_sp);}) |
| | OPCODE0_TAIL (F_CLEANUP_SYNCH_MARK,"cleanup synch mark", I_UPDATE_SP|I_UPDATE_M_SP,{OPCODE0(F_POP_SYNCH_MARK,"pop synch mark", I_UPDATE_SP|I_UPDATE_M_SP,{if(d_flag){if(Pike_mark_sp<=Pike_interpreter.mark_stack){Pike_fatal("Mark stack out of synch - %p <= %p.\n", Pike_mark_sp, Pike_interpreter.mark_stack);}else if(*--Pike_mark_sp!=Pike_sp){ptrdiff_t should=*Pike_mark_sp-Pike_interpreter.evaluator_stack;ptrdiff_t is=Pike_sp-Pike_interpreter.evaluator_stack;if(Pike_sp-*Pike_mark_sp > 0) pop_n_elems(Pike_sp-*Pike_mark_sp);Pike_fatal("Stack out of synch - should be %ld, is %ld.\n", DO_NOT_WARN((long) should), DO_NOT_WARN((long) is));}}});}) |
| | OPCODE0 (F_CLEAR_STRING_SUBTYPE,"clear string subtype", 0,{if(Pike_sp[-1].type==PIKE_T_STRING) Pike_sp[-1].subtype=0;}) |
| | OPCODE0_BRANCH (F_BRANCH,"branch", 0,{DO_BRANCH();}) |
| | OPCODE2_BRANCH (F_BRANCH_IF_NOT_LOCAL_ARROW,"branch if !local->x", 0,{LOCAL_VAR(struct svalue tmp);tmp.type=PIKE_T_STRING;tmp.u.string=Pike_fp->context.prog->strings[arg1];tmp.subtype=1;Pike_sp->type=PIKE_T_INT;Pike_sp++;index_no_free(Pike_sp-1, Pike_fp->locals+arg2,&tmp);print_return_value();OPCODE0_TAILBRANCH(F_BRANCH_WHEN_ZERO,"branch if zero", I_UPDATE_SP,{if(!UNSAFE_IS_ZERO(Pike_sp-1)){DONT_BRANCH();}else{DO_BRANCH();}pop_stack();});}) |
| | OPCODE0_BRANCH (F_BRANCH_WHEN_NON_ZERO,"branch if not zero", I_UPDATE_SP,{if(UNSAFE_IS_ZERO(Pike_sp-1)){DONT_BRANCH();}else{DO_BRANCH();}pop_stack();}) |
| | OPCODE1_BRANCH (F_BRANCH_IF_TYPE_IS_NOT,"branch if type is !=", I_UPDATE_SP,{LOCAL_VAR(struct object *o);if(Pike_sp[-1].type==T_OBJECT &&(o=Pike_sp[-1].u.object)->prog){int fun=FIND_LFUN(o->prog->inherits[Pike_sp[-1].subtype].prog, LFUN__IS_TYPE);if(fun!=-1){push_text(get_name_of_type(arg1));apply_low(o, fun+o->prog->inherits[Pike_sp[-2].subtype].identifier_level, 1);arg1=UNSAFE_IS_ZERO(Pike_sp-1)?T_FLOAT:T_OBJECT;pop_stack();}}if(Pike_sp[-1].type==arg1){DONT_BRANCH();}else{DO_BRANCH();}pop_stack();}) |
| | OPCODE1_BRANCH (F_BRANCH_IF_LOCAL,"branch if local", 0,{if(UNSAFE_IS_ZERO(Pike_fp->locals+arg1)){DONT_BRANCH();}else{DO_BRANCH();}}) |
| | OPCODE1_BRANCH (F_BRANCH_IF_NOT_LOCAL,"branch if !local", 0,{if(!UNSAFE_IS_ZERO(Pike_fp->locals+arg1)){DONT_BRANCH();}else{DO_BRANCH();}}) |
| | CJUMP (F_BRANCH_WHEN_EQ,"branch if ==", is_eq) |
| | CJUMP (F_BRANCH_WHEN_NE,"branch if !=",!is_eq) |
| | CJUMP (F_BRANCH_WHEN_LT,"branch if <", is_lt) |
| | CJUMP (F_BRANCH_WHEN_LE,"branch if <=", is_le) |
| | CJUMP (F_BRANCH_WHEN_GT,"branch if >", is_gt) |
| | CJUMP (F_BRANCH_WHEN_GE,"branch if >=", is_ge) |
| | OPCODE0_BRANCH (F_BRANCH_AND_POP_WHEN_ZERO,"branch & pop if zero", 0,{if(!UNSAFE_IS_ZERO(Pike_sp-1)){DONT_BRANCH();}else{DO_BRANCH();pop_stack();}}) |
| | OPCODE0_BRANCH (F_BRANCH_AND_POP_WHEN_NON_ZERO,"branch & pop if !zero", 0,{if(UNSAFE_IS_ZERO(Pike_sp-1)){DONT_BRANCH();}else{DO_BRANCH();pop_stack();}}) |
| | OPCODE0_BRANCH (F_LAND,"&&", I_UPDATE_SP,{if(!UNSAFE_IS_ZERO(Pike_sp-1)){DONT_BRANCH();pop_stack();}else{DO_BRANCH();pop_stack();push_int(0);}}) |
| | OPCODE0_BRANCH (F_LOR,"||", I_UPDATE_SP,{if(UNSAFE_IS_ZERO(Pike_sp-1)){DONT_BRANCH();pop_stack();}else{DO_BRANCH();}}) |
| | OPCODE0_BRANCH (F_EQ_OR,"==||", I_UPDATE_SP,{if(!is_eq(Pike_sp-2, Pike_sp-1)){DONT_BRANCH();pop_2_elems();}else{DO_BRANCH();pop_2_elems();push_int(1);}}) |
| | OPCODE0_BRANCH (F_EQ_AND,"==&&", I_UPDATE_SP,{if(is_eq(Pike_sp-2, Pike_sp-1)){DONT_BRANCH();pop_2_elems();}else{DO_BRANCH();pop_2_elems();push_int(0);}}) |
| | OPCODE0_PTRJUMP (F_CATCH,"catch", I_UPDATE_ALL,{PIKE_OPCODE_T *next_addr;JUMP_SET_TO_PC_AT_NEXT(next_addr);check_c_stack(8192);switch(o_catch((PIKE_OPCODE_T *)(((INT32 *) next_addr)+1))){case 1:DO_DUMB_RETURN;case 2:DO_JUMP_TO(Pike_fp->return_addr);break;default:DOJUMP();}}) |
| | OPCODE0_RETURN (F_ESCAPE_CATCH,"escape catch", 0,{JUMP_SET_TO_PC_AT_NEXT(Pike_fp->return_addr);INTER_ESCAPE_CATCH;}) |
| | OPCODE0_RETURN (F_EXIT_CATCH,"exit catch", I_UPDATE_SP,{push_undefined();JUMP_SET_TO_PC_AT_NEXT(Pike_fp->return_addr);INTER_ESCAPE_CATCH;}) |
| | OPCODE1_JUMP (F_SWITCH,"switch", I_UPDATE_ALL,{INT32 tmp;PIKE_OPCODE_T *addr;JUMP_SET_TO_PC_AT_NEXT(addr);tmp=switch_lookup(Pike_fp->context.prog->constants[arg1].sval.u.array, Pike_sp-1);addr=DO_IF_ELSE_COMPUTED_GOTO(addr,(PIKE_OPCODE_T *) DO_ALIGN(PTR_TO_INT(addr),((ptrdiff_t) sizeof(INT32))));addr=(PIKE_OPCODE_T *)(((INT32 *) addr)+(tmp >=0?1+tmp *2:2 *~tmp));if(*(INT32 *) addr< 0) fast_check_threads_etc(7);pop_stack();DO_JUMP_TO(addr+*(INT32 *) addr);}) |
| | OPCODE1_JUMP (F_SWITCH_ON_INDEX,"switch on index", I_UPDATE_ALL,{INT32 tmp;PIKE_OPCODE_T *addr;LOCAL_VAR(struct svalue tmp2);JUMP_SET_TO_PC_AT_NEXT(addr);index_no_free(&tmp2, Pike_sp-2, Pike_sp-1);move_svalue(Pike_sp++,&tmp2);tmp=switch_lookup(Pike_fp->context.prog->constants[arg1].sval.u.array, Pike_sp-1);pop_n_elems(3);addr=DO_IF_ELSE_COMPUTED_GOTO(addr,(PIKE_OPCODE_T *) DO_ALIGN(PTR_TO_INT(addr),((ptrdiff_t) sizeof(INT32))));addr=(PIKE_OPCODE_T *)(((INT32 *) addr)+(tmp >=0?1+tmp *2:2 *~tmp));if(*(INT32 *) addr< 0) fast_check_threads_etc(7);DO_JUMP_TO(addr+*(INT32 *) addr);}) |
| | OPCODE2_JUMP (F_SWITCH_ON_LOCAL,"switch on local", 0,{INT32 tmp;PIKE_OPCODE_T *addr;JUMP_SET_TO_PC_AT_NEXT(addr);tmp=switch_lookup(Pike_fp->context.prog->constants[arg2].sval.u.array, Pike_fp->locals+arg1);addr=DO_IF_ELSE_COMPUTED_GOTO(addr,(PIKE_OPCODE_T *) DO_ALIGN(PTR_TO_INT(addr),((ptrdiff_t) sizeof(INT32))));addr=(PIKE_OPCODE_T *)(((INT32 *) addr)+(tmp >=0?1+tmp *2:2 *~tmp));if(*(INT32 *) addr< 0) fast_check_threads_etc(7);DO_JUMP_TO(addr+*(INT32 *) addr);}) |
| | LOOP (F_INC_LOOP,"++Loop", 1,<, is_lt) |
| | LOOP (F_DEC_LOOP,"--Loop",-1, >, is_gt) |
| | LOOP (F_INC_NEQ_LOOP,"++Loop!=", 1,!=,!is_eq) |
| | LOOP (F_DEC_NEQ_LOOP,"--Loop!=",-1,!=,!is_eq) |
| | OPCODE0_BRANCH (F_LOOP,"loop", I_UPDATE_SP,{push_int(1);if(!is_lt(Pike_sp-2, Pike_sp-1)){o_subtract();DO_BRANCH();}else{DONT_BRANCH();pop_2_elems();}}) |
| | OPCODE0_BRANCH (F_FOREACH,"foreach", 0,{if(Pike_sp[-4].type!=PIKE_T_ARRAY) PIKE_ERROR("foreach","Bad argument 1.\n", Pike_sp-3, 1);if(Pike_sp[-1].u.integer< Pike_sp[-4].u.array->size){if(Pike_sp[-1].u.integer< 0) Pike_error("Foreach loop variable is negative!\n");assign_lvalue(Pike_sp-3, Pike_sp[-4].u.array->item+Pike_sp[-1].u.integer);DO_BRANCH();Pike_sp[-1].u.integer++;DO_IF_DEBUG(if(Pike_sp[-1].subtype) Pike_fatal("Got unexpected subtype in loop variable.\n"););}else{DONT_BRANCH();}}) |
| | OPCODE0 (F_MAKE_ITERATOR,"get_iterator", 0,{f_get_iterator(1);}) |
| | OPCODE0_BRANCH (F_FOREACH_START,"foreach start", 0,{DO_IF_DEBUG(if(Pike_sp[-5].type!=PIKE_T_OBJECT) Pike_fatal("Iterator gone from stack.\n"););if(foreach_iterate(Pike_sp[-5].u.object, 0)) DONT_BRANCH();else{DO_BRANCH();}}) |
| | OPCODE0_BRANCH (F_FOREACH_LOOP,"foreach loop", 0,{DO_IF_DEBUG(if(Pike_sp[-5].type!=PIKE_T_OBJECT) Pike_fatal("Iterator gone from stack.\n"););if(foreach_iterate(Pike_sp[-5].u.object, 1)){DO_BRANCH();}else{DONT_BRANCH();}}) |
| | OPCODE1_RETURN (F_RETURN_LOCAL,"return local", I_UPDATE_SP|I_UPDATE_FP,{DO_IF_DEBUG(if(d_flag >3) do_gc(NULL, 0);if(d_flag >4) do_debug(););if(Pike_fp->expendible<=Pike_fp->locals+arg1){pop_n_elems(Pike_sp-1-(Pike_fp->locals+arg1));}else{push_svalue(Pike_fp->locals+arg1);}DO_DUMB_RETURN;}) |
| | OPCODE0_RETURN (F_RETURN_IF_TRUE,"return if true", I_UPDATE_SP|I_UPDATE_FP,{if(!UNSAFE_IS_ZERO(Pike_sp-1)) DO_RETURN;pop_stack();DO_JUMP_TO_NEXT;}) |
| | OPCODE0_RETURN (F_RETURN_1,"return 1", I_UPDATE_SP|I_UPDATE_FP,{push_int(1);DO_RETURN;}) |
| | OPCODE0_RETURN (F_RETURN_0,"return 0", I_UPDATE_SP|I_UPDATE_FP,{push_int(0);DO_RETURN;}) |
| | OPCODE0_RETURN (F_RETURN,"return", I_UPDATE_FP,{DO_RETURN;}) |
| | OPCODE0_RETURN (F_DUMB_RETURN,"dumb return", I_UPDATE_FP,{DO_DUMB_RETURN;}) |
| | OPCODE0 (F_NEGATE,"unary minus", 0,{if(Pike_sp[-1].type==PIKE_T_INT){DO_IF_BIGNUM(if(INT_TYPE_NEG_OVERFLOW(Pike_sp[-1].u.integer)){convert_stack_top_to_bignum();o_negate();}else){Pike_sp[-1].u.integer=-Pike_sp[-1].u.integer;Pike_sp[-1].subtype=NUMBER_NUMBER;}}else if(Pike_sp[-1].type==PIKE_T_FLOAT){Pike_sp[-1].u.float_number=-Pike_sp[-1].u.float_number;}else{o_negate();}}) |
| | OPCODE0_ALIAS (F_COMPL,"~", 0, o_compl) |
| | OPCODE0 (F_NOT,"!", 0,{switch(Pike_sp[-1].type){case PIKE_T_INT:Pike_sp[-1].u.integer=!Pike_sp[-1].u.integer;Pike_sp[-1].subtype=NUMBER_NUMBER;break;case PIKE_T_FUNCTION:case PIKE_T_OBJECT:if(UNSAFE_IS_ZERO(Pike_sp-1)){pop_stack();push_int(1);}else{pop_stack();push_int(0);}break;default:free_svalue(Pike_sp-1);Pike_sp[-1].type=PIKE_T_INT;Pike_sp[-1].subtype=NUMBER_NUMBER;Pike_sp[-1].u.integer=0;}}) |
| | OPCODE0_ALIAS (F_LSH,"<<", I_UPDATE_SP, o_lsh) |
| | OPCODE0_ALIAS (F_RSH,">>", I_UPDATE_SP, o_rsh) |
| | COMPARISON (F_EQ,"==", is_eq(Pike_sp-2, Pike_sp-1)) |
| | COMPARISON (F_NE,"!=",!is_eq(Pike_sp-2, Pike_sp-1)) |
| | COMPARISON (F_GT,">", is_gt(Pike_sp-2, Pike_sp-1)) |
| | COMPARISON (F_GE,">=", is_ge(Pike_sp-2, Pike_sp-1)) |
| | COMPARISON (F_LT,"<", is_lt(Pike_sp-2, Pike_sp-1)) |
| | COMPARISON (F_LE,"<=", is_le(Pike_sp-2, Pike_sp-1)) |
| | OPCODE0 (F_ADD,"+", I_UPDATE_SP,{f_add(2);}) |
| | OPCODE0 (F_ADD_INTS,"int+int", I_UPDATE_SP,{if(Pike_sp[-1].type==T_INT &&Pike_sp[-2].type==T_INTDO_IF_BIGNUM(&&(!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, Pike_sp[-2].u.integer)))){Pike_sp[-2].u.integer+=Pike_sp[-1].u.integer;Pike_sp[-2].subtype=NUMBER_NUMBER;dmalloc_touch_svalue(Pike_sp-1);Pike_sp--;}else{f_add(2);}}) |
| | OPCODE0 (F_ADD_FLOATS,"float+float", I_UPDATE_SP,{if(Pike_sp[-1].type==T_FLOAT &&Pike_sp[-2].type==T_FLOAT){Pike_sp[-2].u.float_number+=Pike_sp[-1].u.float_number;dmalloc_touch_svalue(Pike_sp-1);Pike_sp--;}else{f_add(2);}}) |
| | OPCODE0_ALIAS (F_SUBTRACT,"-", I_UPDATE_SP, o_subtract) |
| | OPCODE0_ALIAS (F_AND,"&", I_UPDATE_SP, o_and) |
| | OPCODE0_ALIAS (F_OR,"|", I_UPDATE_SP, o_or) |
| | OPCODE0_ALIAS (F_XOR,"^", I_UPDATE_SP, o_xor) |
| | OPCODE0_ALIAS (F_MULTIPLY,"*", I_UPDATE_SP, o_multiply) |
| | OPCODE0_ALIAS (F_DIVIDE,"/", I_UPDATE_SP, o_divide) |
| | OPCODE0_ALIAS (F_MOD,"%", I_UPDATE_SP, o_mod) |
| | OPCODE1 (F_ADD_INT,"add integer", 0,{if(Pike_sp[-1].type==T_INTDO_IF_BIGNUM(&&(!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, arg1)))){Pike_sp[-1].u.integer+=arg1;Pike_sp[-1].subtype=NUMBER_NUMBER;}else{push_int(arg1);f_add(2);}}) |
| | OPCODE1 (F_ADD_NEG_INT,"add -integer", 0,{if(Pike_sp[-1].type==T_INTDO_IF_BIGNUM(&&(!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer,-arg1)))){Pike_sp[-1].u.integer-=arg1;Pike_sp[-1].subtype=NUMBER_NUMBER;}else{push_int(-arg1);f_add(2);}}) |
| | OPCODE0 (F_PUSH_ARRAY,"@", I_UPDATE_SP,{int i;LOCAL_VAR(struct object *o);LOCAL_VAR(struct program *p);switch(Pike_sp[-1].type){default:PIKE_ERROR("@","Bad argument.\n", Pike_sp, 1);case PIKE_T_OBJECT:if(!(p=(o=Pike_sp[-1].u.object)->prog)||(i=FIND_LFUN(p->inherits[Pike_sp[-1].subtype].prog, LFUN__VALUES))==-1) PIKE_ERROR("@","Bad argument.\n", Pike_sp, 1);apply_low(o, i+p->inherits[Pike_sp[-1].subtype].identifier_level, 0);if(Pike_sp[-1].type!=PIKE_T_ARRAY) Pike_error("Bad return type from o->_values() in @\n");free_svalue(Pike_sp-2);move_svalue(Pike_sp-2, Pike_sp-1);Pike_sp--;break;case PIKE_T_ARRAY:break;}dmalloc_touch_svalue(Pike_sp-1);Pike_sp--;push_array_items(Pike_sp->u.array);}) |
| | OPCODE2 (F_LOCAL_LOCAL_INDEX,"local[local]", I_UPDATE_SP,{LOCAL_VAR(struct svalue *s);s=Pike_fp->locals+arg1;if(s->type==PIKE_T_STRING) s->subtype=0;Pike_sp++->type=PIKE_T_INT;index_no_free(Pike_sp-1, Pike_fp->locals+arg2, s);}) |
| | OPCODE1 (F_LOCAL_INDEX,"local index", 0,{LOCAL_VAR(struct svalue *s);LOCAL_VAR(struct svalue tmp);s=Pike_fp->locals+arg1;if(s->type==PIKE_T_STRING) s->subtype=0;index_no_free(&tmp, Pike_sp-1, s);free_svalue(Pike_sp-1);move_svalue(Pike_sp-1,&tmp);}) |
| | OPCODE2 (F_GLOBAL_LOCAL_INDEX,"global[local]", I_UPDATE_SP,{LOCAL_VAR(struct svalue *s);LOCAL_VAR(struct svalue tmp);low_index_current_object_no_free(Pike_sp, arg1);Pike_sp++;s=Pike_fp->locals+arg2;if(s->type==PIKE_T_STRING) s->subtype=0;index_no_free(&tmp, Pike_sp-1, s);free_svalue(Pike_sp-1);move_svalue(Pike_sp-1,&tmp);}) |
| | OPCODE2 (F_LOCAL_ARROW,"local->x", I_UPDATE_SP,{LOCAL_VAR(struct svalue tmp);tmp.type=PIKE_T_STRING;tmp.u.string=Pike_fp->context.prog->strings[arg1];tmp.subtype=1;Pike_sp->type=PIKE_T_INT;Pike_sp++;index_no_free(Pike_sp-1, Pike_fp->locals+arg2,&tmp);print_return_value();}) |
| | OPCODE1 (F_ARROW,"->x", 0,{LOCAL_VAR(struct svalue tmp);LOCAL_VAR(struct svalue tmp2);tmp.type=PIKE_T_STRING;tmp.u.string=Pike_fp->context.prog->strings[arg1];tmp.subtype=1;index_no_free(&tmp2, Pike_sp-1,&tmp);free_svalue(Pike_sp-1);move_svalue(Pike_sp-1,&tmp2);print_return_value();}) |
| | OPCODE1 (F_STRING_INDEX,"string index", 0,{LOCAL_VAR(struct svalue tmp);LOCAL_VAR(struct svalue tmp2);tmp.type=PIKE_T_STRING;tmp.u.string=Pike_fp->context.prog->strings[arg1];tmp.subtype=0;index_no_free(&tmp2, Pike_sp-1,&tmp);free_svalue(Pike_sp-1);move_svalue(Pike_sp-1,&tmp2);print_return_value();}) |
| | OPCODE1 (F_POS_INT_INDEX,"int index", 0,{push_int(arg1);print_return_value();DO_INDEX;}) |
| | OPCODE1 (F_NEG_INT_INDEX,"-int index", 0,{push_int(-(ptrdiff_t) arg1);print_return_value();DO_INDEX;}) |
| | OPCODE0 (F_INDEX,"index", I_UPDATE_SP,{DO_INDEX;}) |
| | OPCODE2 (F_MAGIC_INDEX,"::`[]", I_UPDATE_SP,{push_magic_index(magic_index_program, arg2, arg1);}) |
| | OPCODE2 (F_MAGIC_SET_INDEX,"::`[]=", I_UPDATE_SP,{push_magic_index(magic_set_index_program, arg2, arg1);}) |
| | OPCODE2 (F_MAGIC_INDICES,"::_indices", I_UPDATE_SP,{push_magic_index(magic_indices_program, arg2, arg1);}) |
| | OPCODE2 (F_MAGIC_VALUES,"::_values", I_UPDATE_SP,{push_magic_index(magic_values_program, arg2, arg1);}) |
| | OPCODE0_ALIAS (F_CAST,"cast", I_UPDATE_SP, f_cast) |
| | OPCODE0_ALIAS (F_CAST_TO_INT,"cast_to_int", 0, o_cast_to_int) |
| | OPCODE0_ALIAS (F_CAST_TO_STRING,"cast_to_string", 0, o_cast_to_string) |
| | OPCODE0 (F_SOFT_CAST,"soft cast", I_UPDATE_SP,{DO_IF_DEBUG({if(Pike_sp[-2].type!=T_TYPE){Pike_fatal("Argument 1 to soft_cast isn't a type!\n");}});if(runtime_options &RUNTIME_CHECK_TYPES){struct pike_type *sval_type=get_type_of_svalue(Pike_sp-1);if(!pike_types_le(sval_type, Pike_sp[-2].u.type)){if(!pike_types_le(sval_type, weak_type_string)||!match_types(sval_type, Pike_sp[-2].u.type)){struct pike_string *t1;struct pike_string *t2;char *fname="__soft-cast";ONERROR tmp1;ONERROR tmp2;if(Pike_fp->current_object &&Pike_fp->context.prog &&Pike_fp->current_object->prog){struct pike_string *name=ID_FROM_INT(Pike_fp->current_object->prog, Pike_fp->fun)->name;if((!name->size_shift)&&(name->len< 100)) fname=name->str;}t1=describe_type(Pike_sp[-2].u.type);SET_ONERROR(tmp1, do_free_string, t1);t2=describe_type(sval_type);SET_ONERROR(tmp2, do_free_string, t2);free_type(sval_type);bad_arg_error(NULL, Pike_sp-1, 1, 1, t1->str, Pike_sp-1,"%s(): Soft cast failed. Expected %s, got %s\n", fname, t1->str, t2->str);UNSET_ONERROR(tmp2);UNSET_ONERROR(tmp1);free_string(t2);free_string(t1);}}free_type(sval_type);DO_IF_DEBUG({if(d_flag > 2){struct pike_string *t=describe_type(Pike_sp[-2].u.type);fprintf(stderr,"Soft cast to %s\n", t->str);free_string(t);}});}stack_swap();pop_stack();}) |
| | OPCODE1_ALIAS (F_RANGE,"range", I_UPDATE_SP, o_range2) |
| | OPCODE0 (F_COPY_VALUE,"copy_value", 0,{LOCAL_VAR(struct svalue tmp);copy_svalues_recursively_no_free(&tmp, Pike_sp-1, 1, 0);free_svalue(Pike_sp-1);move_svalue(Pike_sp-1,&tmp);print_return_value();}) |
| | OPCODE0 (F_INDIRECT,"indirect", I_UPDATE_SP,{LOCAL_VAR(struct svalue tmp);lvalue_to_svalue_no_free(&tmp, Pike_sp-2);if(tmp.type!=PIKE_T_STRING){pop_2_elems();move_svalue(Pike_sp,&tmp);Pike_sp++;}else{struct string_assignment_storage *s;LOCAL_VAR(struct object *o);o=low_clone(string_assignment_program);s=(struct string_assignment_storage *) o->storage;move_svalue(s->lval, Pike_sp-2);move_svalue(s->lval+1, Pike_sp-1);s->s=tmp.u.string;Pike_sp-=2;push_object(o);}print_return_value();}) |
| | OPCODE0 (F_SIZEOF,"sizeof", 0,{INT_TYPE val=pike_sizeof(Pike_sp-1);pop_stack();push_int(val);}) |
| | OPCODE1 (F_SIZEOF_LOCAL,"sizeof local", I_UPDATE_SP,{push_int(pike_sizeof(Pike_fp->locals+arg1));}) |
| | OPCODE1_ALIAS (F_SSCANF,"sscanf", I_UPDATE_SP, o_sscanf) |
| | MKAPPLY2 (OPCODE1, CALL_LFUN,"call lfun", APPLY_LOW, Pike_fp->current_object,(void *)(ptrdiff_t)(arg1+Pike_fp->context.identifier_level)) |
| | MKAPPLY2 (OPCODE1, APPLY,"apply", APPLY_SVALUE_STRICT,&((Pike_fp->context.prog->constants+arg1)->sval), 0) |
| | MKAPPLY (OPCODE0, CALL_FUNCTION,"call function", APPLY_STACK, 0, 0) |
| | OPCODE1_JUMP (F_CALL_OTHER,"call other", I_UPDATE_ALL,{INT32 args=DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp));LOCAL_VAR(struct svalue *s);s=Pike_sp-args;JUMP_SET_TO_PC_AT_NEXT(Pike_fp->return_addr);if(s->type==T_OBJECT){LOCAL_VAR(struct object *o);LOCAL_VAR(struct program *p);o=s->u.object;if((p=o->prog)){p=p->inherits[s->subtype].prog;if(FIND_LFUN(p, LFUN_ARROW)==-1){int fun;fun=find_shared_string_identifier(Pike_fp->context.prog->strings[arg1], p);if(fun >=0){fun+=o->prog->inherits[s->subtype].identifier_level;if(low_mega_apply(APPLY_LOW, args-1, o,(void *)(ptrdiff_t) fun)){Pike_fp->save_sp--;Pike_fp->flags|=PIKE_FRAME_RETURN_INTERNAL;DO_JUMP_TO(Pike_fp->pc);}stack_pop_keep_top();DO_JUMP_TO_NEXT;}}}}{LOCAL_VAR(struct svalue tmp);LOCAL_VAR(struct svalue tmp2);tmp.type=PIKE_T_STRING;tmp.u.string=Pike_fp->context.prog->strings[arg1];tmp.subtype=1;index_no_free(&tmp2, s,&tmp);free_svalue(s);move_svalue(s,&tmp2);print_return_value();if(low_mega_apply(APPLY_STACK, args, 0, 0)){Pike_fp->flags|=PIKE_FRAME_RETURN_INTERNAL;DO_JUMP_TO(Pike_fp->pc);}else{DO_JUMP_TO_NEXT;}}}) |
| | OPCODE1_JUMP (F_CALL_OTHER_AND_POP,"call other & pop", I_UPDATE_ALL,{INT32 args=DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp));LOCAL_VAR(struct svalue *s);s=Pike_sp-args;JUMP_SET_TO_PC_AT_NEXT(Pike_fp->return_addr);if(s->type==T_OBJECT){LOCAL_VAR(struct object *o);LOCAL_VAR(struct program *p);o=s->u.object;if((p=o->prog)){p=p->inherits[s->subtype].prog;if(FIND_LFUN(p, LFUN_ARROW)==-1){int fun;fun=find_shared_string_identifier(Pike_fp->context.prog->strings[arg1], p);if(fun >=0){fun+=o->prog->inherits[s->subtype].identifier_level;if(low_mega_apply(APPLY_LOW, args-1, o,(void *)(ptrdiff_t) fun)){Pike_fp->save_sp--;Pike_fp->flags|=PIKE_FRAME_RETURN_INTERNAL|PIKE_FRAME_RETURN_POP;DO_JUMP_TO(Pike_fp->pc);}pop_2_elems();DO_JUMP_TO_NEXT;}}}}{LOCAL_VAR(struct svalue tmp);LOCAL_VAR(struct svalue tmp2);tmp.type=PIKE_T_STRING;tmp.u.string=Pike_fp->context.prog->strings[arg1];tmp.subtype=1;index_no_free(&tmp2, s,&tmp);free_svalue(s);move_svalue(s,&tmp2);print_return_value();if(low_mega_apply(APPLY_STACK, args, 0, 0)){Pike_fp->flags|=PIKE_FRAME_RETURN_INTERNAL|PIKE_FRAME_RETURN_POP;DO_JUMP_TO(Pike_fp->pc);}else{pop_stack();DO_JUMP_TO_NEXT;}}}) |
| | OPCODE1_JUMP (F_CALL_OTHER_AND_RETURN,"call other & return", I_UPDATE_ALL,{INT32 args=DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp));LOCAL_VAR(struct svalue *s);s=Pike_sp-args;if(s->type==T_OBJECT){LOCAL_VAR(struct object *o);LOCAL_VAR(struct program *p);o=s->u.object;if((p=o->prog)){p=p->inherits[s->subtype].prog;if(FIND_LFUN(p, LFUN_ARROW)==-1){int fun;fun=find_shared_string_identifier(Pike_fp->context.prog->strings[arg1], p);if(fun >=0){fun+=o->prog->inherits[s->subtype].identifier_level;if(low_mega_apply(APPLY_LOW, args-1, o,(void *)(ptrdiff_t) fun)){PIKE_OPCODE_T *addr=Pike_fp->pc;Pike_fp->save_sp--;DO_IF_DEBUG(Pike_fp->next->pc=0);unlink_previous_frame();DO_JUMP_TO(addr);}stack_pop_keep_top();DO_DUMB_RETURN;}}}}{LOCAL_VAR(struct svalue tmp);LOCAL_VAR(struct svalue tmp2);tmp.type=PIKE_T_STRING;tmp.u.string=Pike_fp->context.prog->strings[arg1];tmp.subtype=1;index_no_free(&tmp2, s,&tmp);free_svalue(s);move_svalue(s,&tmp2);print_return_value();if(low_mega_apply(APPLY_STACK, args, 0, 0)){PIKE_OPCODE_T *addr=Pike_fp->pc;DO_IF_DEBUG(Pike_fp->next->pc=0);unlink_previous_frame();DO_JUMP_TO(addr);}DO_DUMB_RETURN;}}) |
| | OPCODE1 (F_CALL_BUILTIN,"call builtin", I_UPDATE_ALL,{DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp)));}) |
| | OPCODE1 (F_CALL_BUILTIN_AND_POP,"call builtin & pop", I_UPDATE_ALL,{DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp)));pop_stack();}) |
| | OPCODE1_RETURN (F_CALL_BUILTIN_AND_RETURN,"call builtin & return", I_UPDATE_ALL,{DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp-*--Pike_mark_sp)));DO_DUMB_RETURN;}) |
| | OPCODE1 (F_MARK_CALL_BUILTIN,"mark, call builtin", I_UPDATE_ALL,{DO_CALL_BUILTIN(0);}) |
| | OPCODE1 (F_MARK_CALL_BUILTIN_AND_POP,"mark, call builtin & pop", 0,{DO_CALL_BUILTIN(0);pop_stack();}) |
| | OPCODE1_RETURN (F_MARK_CALL_BUILTIN_AND_RETURN,"mark, call builtin & return", I_UPDATE_ALL,{DO_CALL_BUILTIN(0);DO_DUMB_RETURN;}) |
| | OPCODE1 (F_CALL_BUILTIN1,"call builtin 1", I_UPDATE_ALL,{DO_CALL_BUILTIN(1);}) |
| | OPCODE1 (F_CALL_BUILTIN1_AND_POP,"call builtin1 & pop", I_UPDATE_ALL,{DO_CALL_BUILTIN(1);pop_stack();}) |
| | OPCODE1_PTRJUMP (F_COND_RECUR,"recur if not overloaded", I_UPDATE_ALL,{PIKE_OPCODE_T *addr;LOCAL_VAR(struct program *p);p=Pike_fp->current_object->prog;JUMP_SET_TO_PC_AT_NEXT(addr);Pike_fp->return_addr=(PIKE_OPCODE_T *)(((INT32 *) addr)+1);if(((p!=Pike_fp->context.prog)&&(p->inherits[p->identifier_references[Pike_fp->context.identifier_level+arg1].inherit_offset].prog!=Pike_fp->context.prog))||(ID_FROM_INT(p, arg1+Pike_fp->context.identifier_level)->identifier_flags &IDENTIFIER_SCOPE_USED)){PIKE_OPCODE_T *faddr;ptrdiff_t num_locals;ptrdiff_t args;JUMP_SET_TO_PC_AT_NEXT(faddr);faddr+=GET_JUMP();num_locals=READ_INCR_BYTE(faddr);args=READ_INCR_BYTE(faddr);if(low_mega_apply(APPLY_LOW, args, Pike_fp->current_object,(void *)(ptrdiff_t)(arg1+Pike_fp->context.identifier_level))){Pike_fp->flags|=PIKE_FRAME_RETURN_INTERNAL;addr=Pike_fp->pc;}DO_JUMP_TO(addr);}OPCODE0_TAILPTRJUMP(F_RECUR,"recur", I_UPDATE_ALL,{DO_RECUR(0);});}) |
| | OPCODE0_PTRJUMP (F_RECUR_AND_POP,"recur & pop", I_UPDATE_ALL,{DO_RECUR(PIKE_FRAME_RETURN_POP);}) |
| | OPCODE0_PTRJUMP (F_TAIL_RECUR,"tail recursion", I_UPDATE_ALL,{INT32 num_locals;PIKE_OPCODE_T *addr;INT32 args;fast_check_threads_etc(6);JUMP_SET_TO_PC_AT_NEXT(addr);addr+=GET_JUMP();num_locals=READ_INCR_BYTE(addr);args=READ_INCR_BYTE(addr);addr+=ENTRY_PROLOGUE_SIZE;SET_PROG_COUNTER(addr);if(Pike_sp-args!=Pike_fp->locals){DO_IF_DEBUG({if(Pike_sp< Pike_fp->locals+args) Pike_fatal("Pike_sp (%p) < Pike_fp->locals (%p) + args (%d)\n", Pike_sp, Pike_fp->locals, args);});assign_svalues(Pike_fp->locals, Pike_sp-args, args, BIT_MIXED);pop_n_elems(Pike_sp-(Pike_fp->locals+args));}push_zeroes(num_locals-args);DO_IF_DEBUG({if(Pike_sp!=Pike_fp->locals+Pike_fp->num_locals) Pike_fatal("Sp whacked!\n");});FETCH;JUMP_DONE;}) |
| | OPCODE1 (F_THIS_OBJECT,"this_object", I_UPDATE_SP,{int level;LOCAL_VAR(struct object *o);o=Pike_fp->current_object;for(level=0;level< arg1;level++){LOCAL_VAR(struct program *p);p=o->prog;if(!p) Pike_error("Object %d level(s) up is destructed - cannot get the parent.\n", level);if(!(p->flags &PROGRAM_USES_PARENT)) Pike_error("Object %d level(s) up lacks parent reference.\n", level);o=PARENT_INFO(o)->parent;}ref_push_object(o);}) |
| | OPCODE0 (F_ZERO_TYPE,"zero_type", 0,{if(Pike_sp[-1].type!=T_INT){if((Pike_sp[-1].type==T_OBJECT||Pike_sp[-1].type==T_FUNCTION)&&!Pike_sp[-1].u.object->prog){pop_stack();push_int(NUMBER_DESTRUCTED);}else{pop_stack();push_int(0);}}else{Pike_sp[-1].u.integer=Pike_sp[-1].subtype;Pike_sp[-1].subtype=NUMBER_NUMBER;}}) |
| | OPCODE0 (F_SWAP,"swap", 0,{stack_swap();}) |
| | OPCODE0 (F_DUP,"dup", I_UPDATE_SP,{stack_dup();}) |
| | OPCODE2 (F_THIS,"this", I_UPDATE_SP,{LOCAL_VAR(struct external_variable_context loc);loc.o=Pike_fp->current_object;loc.parent_identifier=Pike_fp->fun;if(loc.o->prog) loc.inherit=INHERIT_FROM_INT(loc.o->prog, loc.parent_identifier);find_external_context(&loc, arg1);DO_IF_DEBUG({TRACE((5,"- Identifier=%d Offset=%d\n", arg1, loc.inherit->identifier_level));});if(loc.o->prog &&arg2){ref_push_object_inherit(loc.o,(loc.inherit-loc.o->prog->inherits)+arg2);}else{ref_push_object(loc.o);}print_return_value();}) |