|
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) |
Functions |
| | OPCODE0 (F_UNDEFINED,"push UNDEFINED", I_UPDATE_SP,{push_int(0);Pike_sp[-1].subtype=NUMBER_UNDEFINED;}) OPCODE0(F_CONST0 |
| | 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 |
| | 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 |
| | 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 |
| | 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 |
| | 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 |
| | 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 |
| | 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 |
| | 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 |
Variables |
| | push |
| | I_UPDATE_SP |
| branch &pop if | zero |
| | foreach |
| <<",I_UPDATE_SP,o_lsh);OPCODE0_ALIAS(F_RSH,"> | o_rsh |
| int | int |
| add | integer |
| | range |
| | o_range2 |
| | indirect |
| call other & | pop |
| call other | I_UPDATE_ALL |