Main Page | Class List | Directories | File List | Class Members | File Members

interpret_functions.h File Reference

#include "global.h"

Go to the source code of this file.

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


Define Documentation

#define AUTO_BIGNUM_LOOP_TEST X,
 )     0
 

#define AUTO_BIGNUM_LOOP_TEST X,
 )     0
 

#define CJUMP X,
DESC,
 ) 
 

Value:

OPCODE0_BRANCH(X, DESC, I_UPDATE_SP, { \
    if(Y(Pike_sp-2,Pike_sp-1)) { \
      DO_BRANCH(); \
    }else{ \
      /* write_to_stderr("foreach\n", 8); */    \
      DONT_BRANCH(); \
    } \
    pop_2_elems(); \
  })

#define CJUMP X,
DESC,
 ) 
 

Value:

OPCODE0_BRANCH(X, DESC, I_UPDATE_SP, { \
    if(Y(Pike_sp-2,Pike_sp-1)) { \
      DO_BRANCH(); \
    }else{ \
      /* write_to_stderr("foreach\n", 8); */    \
      DONT_BRANCH(); \
    } \
    pop_2_elems(); \
  })

#define COMPARISON ID,
DESC,
EXPR   ) 
 

Value:

OPCODE0(ID, DESC, I_UPDATE_SP, {        \
    INT32 val = EXPR;                   \
    pop_2_elems();                      \
    push_int(val);                      \
  })

#define COMPARISON ID,
DESC,
EXPR   ) 
 

Value:

OPCODE0(ID, DESC, I_UPDATE_SP, {        \
    INT32 val = EXPR;                   \
    pop_2_elems();                      \
    push_int(val);                      \
  })

#define DO_BRANCH   DOJUMP
 

#define DO_BRANCH   DOJUMP
 

#define DO_CALL_BUILTIN ARGS   )     (*(Pike_fp->context.prog->constants[arg1].sval.u.efun->function))(ARGS)
 

#define DO_CALL_BUILTIN ARGS   )     (*(Pike_fp->context.prog->constants[arg1].sval.u.efun->function))(ARGS)
 

#define DO_DUMB_RETURN
 

Value:

{                               \
  if(Pike_fp -> flags & PIKE_FRAME_RETURN_INTERNAL)     \
  {                                                     \
    int f=Pike_fp->flags;                               \
    if(f & PIKE_FRAME_RETURN_POP)                       \
       low_return_pop();                                \
     else                                               \
       low_return();                                    \
                                                        \
    DO_IF_DEBUG(if (Pike_interpreter.trace_level > 5)   \
      fprintf(stderr, "Returning to 0x%p\n",            \
              Pike_fp->return_addr));                   \
    DO_JUMP_TO(Pike_fp->return_addr);                   \
  }                                                     \
  DO_IF_DEBUG(if (Pike_interpreter.trace_level > 5)     \
    fprintf(stderr, "Inter return\n"));                 \
  INTER_RETURN;                                         \
}

#define DO_DUMB_RETURN
 

Value:

{                               \
  if(Pike_fp -> flags & PIKE_FRAME_RETURN_INTERNAL)     \
  {                                                     \
    int f=Pike_fp->flags;                               \
    if(f & PIKE_FRAME_RETURN_POP)                       \
       low_return_pop();                                \
     else                                               \
       low_return();                                    \
                                                        \
    DO_IF_DEBUG(if (Pike_interpreter.trace_level > 5)   \
      fprintf(stderr, "Returning to 0x%p\n",            \
              Pike_fp->return_addr));                   \
    DO_JUMP_TO(Pike_fp->return_addr);                   \
  }                                                     \
  DO_IF_DEBUG(if (Pike_interpreter.trace_level > 5)     \
    fprintf(stderr, "Inter return\n"));                 \
  INTER_RETURN;                                         \
}

#define DO_IF_BIGNUM CODE   ) 
 

#define DO_IF_BIGNUM CODE   ) 
 

#define DO_IF_ELSE_COMPUTED_GOTO A,
 )     (B)
 

#define DO_IF_ELSE_COMPUTED_GOTO A,
 )     (B)
 

#define DO_INDEX
 

Value:

do {                            \
    LOCAL_VAR(struct svalue tmp);               \
    index_no_free(&tmp,Pike_sp-2,Pike_sp-1);    \
    pop_2_elems();                              \
    move_svalue (Pike_sp, &tmp);                \
    Pike_sp++;                                  \
    print_return_value();                       \
  }while(0)

#define DO_INDEX
 

Value:

do {                            \
    LOCAL_VAR(struct svalue tmp);               \
    index_no_free(&tmp,Pike_sp-2,Pike_sp-1);    \
    pop_2_elems();                              \
    move_svalue (Pike_sp, &tmp);                \
    Pike_sp++;                                  \
    print_return_value();                       \
  }while(0)

#define DO_JUMP_TO NEWPC   ) 
 

Value:

{       \
  SET_PROG_COUNTER(NEWPC);              \
  FETCH;                                \
  JUMP_DONE;                            \
}

#define DO_JUMP_TO NEWPC   ) 
 

Value:

{       \
  SET_PROG_COUNTER(NEWPC);              \
  FETCH;                                \
  JUMP_DONE;                            \
}

#define DO_JUMP_TO_NEXT   JUMP_DONE
 

#define DO_JUMP_TO_NEXT   JUMP_DONE
 

#define DO_RECUR XFLAGS   ) 
 

#define DO_RECUR XFLAGS   ) 
 

#define DO_RETURN   DO_DUMB_RETURN
 

#define DO_RETURN   DO_DUMB_RETURN
 

 
#define DOJUMP  ) 
 

Value:

do { \
    PIKE_OPCODE_T *addr;                                                \
    INT32 tmp; \
    JUMP_SET_TO_PC_AT_NEXT (addr);                                      \
    tmp = GET_JUMP(); \
    SET_PROG_COUNTER(addr + tmp); \
    FETCH; \
    if(tmp < 0) \
      fast_check_threads_etc(6); \
  } while(0)

 
#define DOJUMP  ) 
 

Value:

do { \
    PIKE_OPCODE_T *addr;                                                \
    INT32 tmp; \
    JUMP_SET_TO_PC_AT_NEXT (addr);                                      \
    tmp = GET_JUMP(); \
    SET_PROG_COUNTER(addr + tmp); \
    FETCH; \
    if(tmp < 0) \
      fast_check_threads_etc(6); \
  } while(0)

#define DONT_BRANCH   SKIPJUMP
 

#define DONT_BRANCH   SKIPJUMP
 

#define ENTRY_PROLOGUE_SIZE   0
 

#define ENTRY_PROLOGUE_SIZE   0
 

 
#define GET_JUMP  )     (/*write_to_stderr("GET_JUMP\n", 9),*/ LOW_GET_JUMP())
 

 
#define GET_JUMP  )     (/*write_to_stderr("GET_JUMP\n", 9),*/ LOW_GET_JUMP())
 

#define INTER_ESCAPE_CATCH   return -2
 

#define INTER_ESCAPE_CATCH   return -2
 

#define INTER_RETURN   return -1
 

#define INTER_RETURN   return -1
 

#define JUMP_SET_TO_PC_AT_NEXT PC   )     ((PC) = PROG_COUNTER)
 

#define JUMP_SET_TO_PC_AT_NEXT PC   )     ((PC) = PROG_COUNTER)
 

#define LOCAL_VAR  )     X
 

#define LOOP ID,
DESC,
INC,
OP2,
OP4   ) 
 

Value:

OPCODE0_BRANCH(ID, DESC, 0, {                                           \
    union anything *i=get_pointer_if_this_type(Pike_sp-2, T_INT);       \
    if(i && !AUTO_BIGNUM_LOOP_TEST(i->integer,INC) &&                   \
       Pike_sp[-3].type == T_INT)                                       \
    {                                                                   \
      i->integer += INC;                                                \
      if(i->integer OP2 Pike_sp[-3].u.integer)                          \
      {                                                                 \
        DO_BRANCH();                                                    \
      }else{                                                            \
        /* write_to_stderr("loop\n", 8); */                             \
        DONT_BRANCH();                                                  \
      }                                                                 \
    }else{                                                              \
      lvalue_to_svalue_no_free(Pike_sp,Pike_sp-2); Pike_sp++;           \
      push_int(INC);                                                    \
      f_add(2);                                                         \
      assign_lvalue(Pike_sp-3,Pike_sp-1);                               \
      if(OP4 ( Pike_sp-1, Pike_sp-4 ))                                  \
      {                                                                 \
        DO_BRANCH();                                                    \
      }else{                                                            \
        /* write_to_stderr("loop\n", 8); */                             \
        DONT_BRANCH();                                                  \
      }                                                                 \
      pop_stack();                                                      \
    }                                                                   \
  })

#define LOOP ID,
DESC,
INC,
OP2,
OP4   ) 
 

Value:

OPCODE0_BRANCH(ID, DESC, 0, {                                           \
    union anything *i=get_pointer_if_this_type(Pike_sp-2, T_INT);       \
    if(i && !AUTO_BIGNUM_LOOP_TEST(i->integer,INC) &&                   \
       Pike_sp[-3].type == T_INT)                                       \
    {                                                                   \
      i->integer += INC;                                                \
      if(i->integer OP2 Pike_sp[-3].u.integer)                          \
      {                                                                 \
        DO_BRANCH();                                                    \
      }else{                                                            \
        /* write_to_stderr("loop\n", 8); */                             \
        DONT_BRANCH();                                                  \
      }                                                                 \
    }else{                                                              \
      lvalue_to_svalue_no_free(Pike_sp,Pike_sp-2); Pike_sp++;           \
      push_int(INC);                                                    \
      f_add(2);                                                         \
      assign_lvalue(Pike_sp-3,Pike_sp-1);                               \
      if(OP4 ( Pike_sp-1, Pike_sp-4 ))                                  \
      {                                                                 \
        DO_BRANCH();                                                    \
      }else{                                                            \
        /* write_to_stderr("loop\n", 8); */                             \
        DONT_BRANCH();                                                  \
      }                                                                 \
      pop_stack();                                                      \
    }                                                                   \
  })

#define MKAPPLY OP,
OPCODE,
NAME,
TYPE,
ARG2,
ARG3   ) 
 

#define MKAPPLY OP,
OPCODE,
NAME,
TYPE,
ARG2,
ARG3   ) 
 

#define MKAPPLY2 OP,
OPCODE,
NAME,
TYPE,
ARG2,
ARG3   ) 
 

#define MKAPPLY2 OP,
OPCODE,
NAME,
TYPE,
ARG2,
ARG3   ) 
 

#define OPCODE0_ALIAS A,
B,
C,
 )     OPCODE0(A,B,C,{D();})
 

#define OPCODE1_ALIAS A,
B,
C,
 )     OPCODE1(A,B,C,{D();})
 

#define OPCODE2_ALIAS A,
B,
C,
 )     OPCODE2(A,B,C,{D();})
 

 
#define SKIPJUMP  )     (/*write_to_stderr("SKIPJUMP\n", 9),*/ LOW_SKIPJUMP())
 

 
#define SKIPJUMP  )     (/*write_to_stderr("SKIPJUMP\n", 9),*/ LOW_SKIPJUMP())
 


Function Documentation

CJUMP F_BRANCH_WHEN_GE  ,
"branch if >="  ,
is_ge 
 

CJUMP F_BRANCH_WHEN_GT  ,
"branch   if,
,
is_gt 
 

CJUMP F_BRANCH_WHEN_LE  ,
"branch if <="  ,
is_le 
 

CJUMP F_BRANCH_WHEN_LT   ) 
 

CJUMP F_BRANCH_WHEN_NE   ) 
 

CJUMP F_BRANCH_WHEN_EQ   ) 
 

COMPARISON F_LE  ,
"<="  ,
is_le(Pike_sp-2, Pike_sp-1) 
 

COMPARISON F_LT   ) 
 

COMPARISON F_GE  ,
">="  ,
is_ge(Pike_sp-2, Pike_sp-1) 
 

COMPARISON F_GT  ,
,
,
is_gt(Pike_sp-2, Pike_sp-1) 
 

COMPARISON F_NE   ) 
 

COMPARISON F_EQ   ) 
 

LOOP F_DEC_NEQ_LOOP   ) 
 

LOOP F_INC_NEQ_LOOP   ) 
 

LOOP F_DEC_LOOP  ,
"--Loop"  ,
1,
is_gt 
 

LOOP F_INC_LOOP  ,
"++Loop"  ,
 

MKAPPLY OPCODE0  ,
CALL_FUNCTION  ,
"call function"  ,
APPLY_STACK  ,
,
 

MKAPPLY2 OPCODE1  ,
APPLY  ,
"apply"  ,
APPLY_SVALUE_STRICT  ,
((Pike_fp->context.prog->constants+arg1)->sval),
 

MKAPPLY2 OPCODE1  ,
CALL_LFUN  ,
"call lfun"  ,
APPLY_LOW  ,
Pike_fp->  current_object,
(void *)(ptrdiff_t)(arg1+Pike_fp->context.identifier_level) 
 

OPCODE0 F_DUP  ,
"dup"  ,
I_UPDATE_SP 
 

OPCODE0 F_SWAP  ,
"swap"  ,
 

OPCODE0 F_ZERO_TYPE  ,
"zero_type"  ,
 

OPCODE0 F_SIZEOF  ,
"sizeof"  ,
 

OPCODE0 F_INDIRECT  ,
"indirect"  ,
I_UPDATE_SP 
 

OPCODE0 F_COPY_VALUE  ,
"copy_value"  ,
 

OPCODE0 F_SOFT_CAST  ,
"soft cast"  ,
I_UPDATE_SP 
 

OPCODE0 F_INDEX  ,
"index"  ,
I_UPDATE_SP 
 

OPCODE0 F_PUSH_ARRAY  ,
"@"  ,
I_UPDATE_SP 
 

OPCODE0 F_ADD_FLOATS  ,
"float+float"  ,
I_UPDATE_SP 
 

OPCODE0 F_ADD_INTS  ,
"int+int ,
I_UPDATE_SP 
 

OPCODE0 F_ADD  ,
"+"  ,
I_UPDATE_SP 
 

OPCODE0 F_NOT  ,
"!"  ,
 

OPCODE0 F_NEGATE  ,
"unary minus"  ,
 

OPCODE0 F_MAKE_ITERATOR  ,
"get_iterator"  ,
 

OPCODE0 F_CLEAR_STRING_SUBTYPE  ,
"clear string subtype"  ,
 

OPCODE0 F_POP_TO_MARK  ,
"pop to mark"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE0 F_POP_MARK  ,
"pop mark"  ,
I_UPDATE_M_SP 
 

OPCODE0 F_POP_VALUE  ,
"pop"  ,
I_UPDATE_SP 
 

OPCODE0 F_ASSIGN_AND_POP  ,
"assign and pop"  ,
I_UPDATE_SP 
 

OPCODE0 F_ASSIGN  ,
"assign"  ,
I_UPDATE_SP 
 

OPCODE0 F_POST_DEC  ,
"x--"  ,
I_UPDATE_SP 
 

OPCODE0 F_POST_INC  ,
"x++"  ,
I_UPDATE_SP 
 

OPCODE0 F_INC_AND_POP  ,
"x++ and pop"  ,
I_UPDATE_SP 
 

OPCODE0 F_DEC_AND_POP  ,
"x-- and pop"  ,
I_UPDATE_SP 
 

OPCODE0 F_DEC  ,
"--x"  ,
I_UPDATE_SP 
 

OPCODE0 F_INC  ,
"++x"  ,
I_UPDATE_SP 
 

OPCODE0 F_ADD_TO   ) 
 

OPCODE0 F_LTOSVAL1  ,
"ltosval1"  ,
I_UPDATE_SP 
 

OPCODE0 F_LTOSVAL3  ,
"ltosval3"  ,
I_UPDATE_SP 
 

OPCODE0 F_LTOSVAL2  ,
"ltosval2"  ,
I_UPDATE_SP 
 

OPCODE0 F_LTOSVAL  ,
"lvalue to svalue ,
I_UPDATE_SP 
 

OPCODE0 F_BIGNUM  ,
"push 0x7fffffff"  ,
I_UPDATE_SP 
 

OPCODE0 F_CONST_1  ,
"push -1"  ,
I_UPDATE_SP 
 

OPCODE0 F_MARK_AND_CONST1  ,
"mark & 1"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE0 F_MARK_AND_CONST0  ,
"mark & 0"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE0 F_CONST1  ,
"push 1"  ,
I_UPDATE_SP 
 

OPCODE0 F_CONST0  ,
"push 0"  ,
I_UPDATE_SP 
 

OPCODE0 F_UNDEFINED  ,
"push UNDEFINED"  ,
I_UPDATE_SP 
 

OPCODE0_ALIAS F_CAST_TO_STRING  ,
"cast_to_string"  ,
,
o_cast_to_string 
 

OPCODE0_ALIAS F_CAST_TO_INT  ,
"cast_to_int"  ,
,
o_cast_to_int 
 

OPCODE0_ALIAS F_CAST  ,
"cast"  ,
I_UPDATE_SP  ,
f_cast 
 

OPCODE0_ALIAS F_MOD  ,
"%"  ,
I_UPDATE_SP  ,
o_mod 
 

OPCODE0_ALIAS F_DIVIDE  ,
"/"  ,
I_UPDATE_SP  ,
o_divide 
 

OPCODE0_ALIAS F_MULTIPLY  ,
"*"  ,
I_UPDATE_SP  ,
o_multiply 
 

OPCODE0_ALIAS F_XOR  ,
"^"  ,
I_UPDATE_SP  ,
o_xor 
 

OPCODE0_ALIAS F_OR  ,
"|"  ,
I_UPDATE_SP  ,
o_or 
 

OPCODE0_ALIAS F_AND  ,
"&"  ,
I_UPDATE_SP  ,
o_and 
 

OPCODE0_ALIAS F_SUBTRACT  ,
"-"  ,
I_UPDATE_SP  ,
o_subtract 
 

OPCODE0_ALIAS F_RSH  ,
">>"  ,
I_UPDATE_SP  ,
o_rsh 
 

OPCODE0_ALIAS F_LSH  ,
"<<"  ,
I_UPDATE_SP  ,
o_lsh 
 

OPCODE0_ALIAS F_COMPL  ,
"~"  ,
,
o_compl 
 

OPCODE0_BRANCH F_FOREACH_LOOP  ,
"foreach loop"  ,
 

OPCODE0_BRANCH F_FOREACH_START  ,
"foreach start"  ,
 

OPCODE0_BRANCH F_FOREACH  ,
"foreach"  ,
 

OPCODE0_BRANCH F_LOOP  ,
"loop"  ,
I_UPDATE_SP 
 

OPCODE0_BRANCH F_EQ_AND   ) 
 

OPCODE0_BRANCH F_EQ_OR   ) 
 

OPCODE0_BRANCH F_LOR  ,
"||"  ,
I_UPDATE_SP 
 

OPCODE0_BRANCH F_LAND  ,
"&&"  ,
I_UPDATE_SP 
 

OPCODE0_BRANCH F_BRANCH_AND_POP_WHEN_NON_ZERO  ,
"branch & pop if !zero"  ,
 

OPCODE0_BRANCH F_BRANCH_AND_POP_WHEN_ZERO  ,
"branch & pop if zero"  ,
 

OPCODE0_BRANCH F_BRANCH_WHEN_NON_ZERO  ,
"branch if not zero"  ,
I_UPDATE_SP 
 

OPCODE0_BRANCH F_BRANCH  ,
"branch"  ,
 

OPCODE0_PTRJUMP F_TAIL_RECUR  ,
"tail recursion"  ,
I_UPDATE_ALL 
 

OPCODE0_PTRJUMP F_RECUR_AND_POP  ,
"recur & pop"  ,
I_UPDATE_ALL 
 

OPCODE0_PTRJUMP F_CATCH  ,
"catch"  ,
I_UPDATE_ALL 
 

OPCODE0_RETURN F_DUMB_RETURN  ,
"dumb return"  ,
I_UPDATE_FP 
 

OPCODE0_RETURN F_RETURN  ,
"return"  ,
I_UPDATE_FP 
 

OPCODE0_RETURN F_RETURN_0  ,
"return 0"  ,
I_UPDATE_SP I_UPDATE_FP
 

OPCODE0_RETURN F_RETURN_1  ,
"return 1"  ,
I_UPDATE_SP I_UPDATE_FP
 

OPCODE0_RETURN F_RETURN_IF_TRUE  ,
"return if true"  ,
I_UPDATE_SP I_UPDATE_FP
 

OPCODE0_RETURN F_EXIT_CATCH  ,
"exit catch"  ,
I_UPDATE_SP 
 

OPCODE0_RETURN F_ESCAPE_CATCH  ,
"escape catch"  ,
 

OPCODE0_TAIL F_CLEANUP_SYNCH_MARK  ,
"cleanup synch mark"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE0_TAIL F_MARK2  ,
"mark mark"  ,
I_UPDATE_M_SP 
 

OPCODE1 F_THIS_OBJECT  ,
"this_object"  ,
I_UPDATE_SP 
 

OPCODE1 F_CALL_BUILTIN1_AND_POP  ,
"call builtin1 & pop"  ,
I_UPDATE_ALL 
 

OPCODE1 F_CALL_BUILTIN1  ,
"call builtin 1"  ,
I_UPDATE_ALL 
 

OPCODE1 F_MARK_CALL_BUILTIN_AND_POP  ,
mark,
call builtin &pop"  ,
 

OPCODE1 F_MARK_CALL_BUILTIN  ,
mark,
call builtin"  ,
I_UPDATE_ALL 
 

OPCODE1 F_CALL_BUILTIN_AND_POP  ,
"call builtin & pop"  ,
I_UPDATE_ALL 
 

OPCODE1 F_CALL_BUILTIN  ,
"call builtin"  ,
I_UPDATE_ALL 
 

OPCODE1 F_SIZEOF_LOCAL  ,
"sizeof local"  ,
I_UPDATE_SP 
 

OPCODE1 F_NEG_INT_INDEX  ,
"-int index"  ,
 

OPCODE1 F_POS_INT_INDEX  ,
"int index"  ,
 

OPCODE1 F_STRING_INDEX  ,
"string index"  ,
 

OPCODE1 F_ARROW  ,
"->x"  ,
 

OPCODE1 F_LOCAL_INDEX  ,
"local index"  ,
 

OPCODE1 F_ADD_NEG_INT  ,
"add -integer ,
 

OPCODE1 F_ADD_INT  ,
"add integer ,
 

OPCODE1 F_MARK_X  ,
"mark Pike_sp-X"  ,
I_UPDATE_M_SP 
 

OPCODE1 F_POP_N_ELEMS  ,
"pop_n_elems"  ,
I_UPDATE_SP 
 

OPCODE1 F_ASSIGN_GLOBAL_AND_POP  ,
"assign global and pop"  ,
I_UPDATE_SP 
 

OPCODE1 F_ASSIGN_GLOBAL  ,
"assign global"  ,
 

OPCODE1 F_ASSIGN_LOCAL_AND_POP  ,
"assign local and pop"  ,
I_UPDATE_SP 
 

OPCODE1 F_ASSIGN_LOCAL  ,
"assign local"  ,
 

OPCODE1 F_GLOBAL_LVALUE  ,
"& global"  ,
I_UPDATE_SP 
 

OPCODE1 F_DEC_LOCAL_AND_POP  ,
"--local and pop"  ,
 

OPCODE1 F_POST_DEC_LOCAL  ,
"local--"  ,
I_UPDATE_SP 
 

OPCODE1 F_DEC_LOCAL  ,
"--local"  ,
I_UPDATE_SP 
 

OPCODE1 F_INC_LOCAL_AND_POP  ,
"++local and pop"  ,
 

OPCODE1 F_POST_INC_LOCAL  ,
"local++"  ,
I_UPDATE_SP 
 

OPCODE1 F_INC_LOCAL  ,
"++local"  ,
I_UPDATE_SP 
 

OPCODE1 F_CLEAR_LOCAL  ,
"clear local"  ,
 

OPCODE1 F_CLEAR_4_LOCAL  ,
"clear 4 local"  ,
 

OPCODE1 F_CLEAR_2_LOCAL  ,
"clear 2 local"  ,
 

OPCODE1 F_ARRAY_LVALUE  ,
""  [lvalues],
I_UPDATE_SP 
 

OPCODE1 F_LOCAL_LVALUE  ,
"& local"  ,
I_UPDATE_SP 
 

OPCODE1 F_LOCAL  ,
"local"  ,
I_UPDATE_SP 
 

OPCODE1 F_MARK_AND_LOCAL  ,
"mark & local"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE1 F_LFUN  ,
"local function"  ,
I_UPDATE_SP 
 

OPCODE1 F_LOOKUP_LFUN  ,
"->lfun"  ,
 

OPCODE1 F_ARROW_STRING  ,
"->string"  ,
I_UPDATE_SP 
 

OPCODE1 F_CONSTANT  ,
"constant"  ,
I_UPDATE_SP 
 

OPCODE1 F_NEG_NUMBER  ,
"push -int ,
I_UPDATE_SP 
 

OPCODE1 F_NUMBER  ,
"push int ,
I_UPDATE_SP 
 

OPCODE1_ALIAS F_SSCANF  ,
"sscanf"  ,
I_UPDATE_SP  ,
o_sscanf 
 

OPCODE1_ALIAS F_RANGE  ,
"range"  ,
I_UPDATE_SP  ,
o_range2 
 

OPCODE1_BRANCH F_BRANCH_IF_NOT_LOCAL  ,
"branch if !local"  ,
 

OPCODE1_BRANCH F_BRANCH_IF_LOCAL  ,
"branch if local"  ,
 

OPCODE1_BRANCH F_BRANCH_IF_TYPE_IS_NOT   ) 
 

OPCODE1_JUMP F_CALL_OTHER_AND_RETURN  ,
"call other & return"  ,
I_UPDATE_ALL 
 

OPCODE1_JUMP F_CALL_OTHER_AND_POP  ,
"call other & pop"  ,
I_UPDATE_ALL 
 

OPCODE1_JUMP F_CALL_OTHER  ,
"call other"  ,
I_UPDATE_ALL 
 

OPCODE1_JUMP F_SWITCH_ON_INDEX  ,
"switch on index"  ,
I_UPDATE_ALL 
 

OPCODE1_JUMP F_SWITCH  ,
"switch"  ,
I_UPDATE_ALL 
 

OPCODE1_PTRJUMP F_COND_RECUR  ,
"recur if not overloaded"  ,
I_UPDATE_ALL 
 

OPCODE1_RETURN F_MARK_CALL_BUILTIN_AND_RETURN  ,
mark,
call builtin &return"  ,
I_UPDATE_ALL 
 

OPCODE1_RETURN F_CALL_BUILTIN_AND_RETURN  ,
"call builtin & return"  ,
I_UPDATE_ALL 
 

OPCODE1_RETURN F_RETURN_LOCAL  ,
"return local"  ,
I_UPDATE_SP I_UPDATE_FP
 

OPCODE1_TAIL F_MARK_AND_GLOBAL  ,
"mark & global"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE1_TAIL F_MARK_AND_STRING  ,
"mark & string"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE2 F_THIS  ,
"this"  ,
I_UPDATE_SP 
 

OPCODE2 F_MAGIC_VALUES  ,
"::_values"  ,
I_UPDATE_SP 
 

OPCODE2 []  F_MAGIC_INDICES,
"::_indices"  ,
I_UPDATE_SP 
 

OPCODE2 F_MAGIC_SET_INDEX   ) 
 

OPCODE2 F_MAGIC_INDEX  ,
"::`"  [],
I_UPDATE_SP 
 

OPCODE2 F_LOCAL_ARROW  ,
"local->x"  ,
I_UPDATE_SP 
 

OPCODE2 F_GLOBAL_LOCAL_INDEX  ,
"global"  [local],
I_UPDATE_SP 
 

OPCODE2 F_LOCAL_LOCAL_INDEX  ,
"local"  [local],
I_UPDATE_SP 
 

OPCODE2 F_APPLY_ASSIGN_LOCAL  ,
apply,
assign local"  ,
I_UPDATE_ALL 
 

OPCODE2 F_APPLY_ASSIGN_LOCAL_AND_POP  ,
apply,
assign local and pop"  ,
I_UPDATE_SP I_UPDATE_M_SP
 

OPCODE2 F_LEXICAL_LOCAL_LVALUE  ,
"&lexical local"  ,
I_UPDATE_SP 
 

OPCODE2 F_LEXICAL_LOCAL  ,
"lexical local"  ,
I_UPDATE_SP 
 

OPCODE2 F_GLOBAL_2_LOCAL   ) 
 

OPCODE2 F_LOCAL_2_GLOBAL   ) 
 

OPCODE2 F_LOCAL_2_LOCAL   ) 
 

OPCODE2 F_2_LOCALS  ,
"2 locals"  ,
I_UPDATE_SP 
 

OPCODE2 F_EXTERNAL_LVALUE  ,
"& external"  ,
I_UPDATE_SP 
 

OPCODE2 F_TRAMPOLINE  ,
"trampoline"  ,
I_UPDATE_SP 
 

OPCODE2 F_REARRANGE  ,
"rearrange"  ,
 

OPCODE2 F_NUMBER64  ,
"push 64-bit int ,
I_UPDATE_SP 
 

OPCODE2_BRANCH F_BRANCH_IF_NOT_LOCAL_ARROW  ,
"branch if !local->x"  ,
 

OPCODE2_JUMP F_SWITCH_ON_LOCAL  ,
"switch on local"  ,
 

OPCODE2_TAIL F_MARK_AND_EXTERNAL  ,
"mark & external"  ,
I_UPDATE_SP I_UPDATE_M_SP
 


Generated on Fri Jul 22 23:44:29 2005 for Pike by  doxygen 1.3.9.1