diff --git a/src/interpret_functions.h b/src/interpret_functions.h index 94b74a0c4059f7a7dd1ac1ad0b50156f90da8244..e39a9ea707bf4d509064d407f69165ce3a6cd897 100644 --- a/src/interpret_functions.h +++ b/src/interpret_functions.h @@ -550,6 +550,25 @@ OPCODE2(F_ADD_LOCAL_INT_AND_POP, "local += number", 0,{ } }); +OPCODE2(F_ADD_LOCAL_INT, "local += number local", 0,{ + struct svalue *dst = Pike_fp->locals+arg1; + if( dst->type == PIKE_T_INT + DO_IF_BIGNUM( + &&(!INT_TYPE_ADD_OVERFLOW(dst->u.integer,arg2)))) + { + SET_SVAL_SUBTYPE(*dst,NUMBER_NUMBER); + dst->u.integer += arg2; + push_int( dst->u.integer ); + } + else + { + push_svalue( dst ); + push_int( arg2 ); + f_add(2); + assign_svalue( Pike_fp->locals+arg1,Pike_sp-1); + } +}); + OPCODE1(F_INC_LOCAL, "++local", I_UPDATE_SP, { if( (TYPEOF(Pike_fp->locals[arg1]) == PIKE_T_INT) DO_IF_BIGNUM( diff --git a/src/peep.in b/src/peep.in index 496aaadd1183f24bb46fa6355bfd1e615b845ba9..756c01ae3e649ae678836deada7ace97128bd6f8 100644 --- a/src/peep.in +++ b/src/peep.in @@ -80,6 +80,9 @@ LOCAL_LVALUE CONST_1 ADD_TO_AND_POP: ADD_LOCAL_INT_AND_POP($1a,-1) LOCAL_LVALUE CONST1 ADD_TO_AND_POP: ADD_LOCAL_INT_AND_POP($1a,1) LOCAL_LVALUE CONST0 ADD_TO_AND_POP: +LOCAL_LVALUE LTOSVAL ADD_INT ASSIGN: ADD_LOCAL_INT($1a,$3a) +LOCAL_LVALUE LTOSVAL ADD_NEG_INT ASSIGN: ADD_LOCAL_INT($1a,-$3a) + NUMBER ASSIGN_LOCAL_AND_POP : ASSIGN_LOCAL_NUMBER_AND_POP($2a,$1a) CONST0 ASSIGN_LOCAL_AND_POP : CLEAR_LOCAL($2a) CONST1 ASSIGN_LOCAL_AND_POP : ASSIGN_LOCAL_NUMBER_AND_POP($2a,1) @@ -402,6 +405,7 @@ LE BRANCH_WHEN_NON_ZERO : LE QUICK_BRANCH_WHEN_NON_ZERO($2a) // // These are functions returning a constant, and doing nothing else. MARK_AT(0) POP_TO_MARK INIT_FRAME RETURN_0 : RETURN_0 +MARK_AT(0) POP_TO_MARK INIT_FRAME UNDEFINED RETURN : UNDEFINED RETURN MARK_AT(0) POP_TO_MARK INIT_FRAME RETURN_1 : RETURN_1 MARK_AT(0) POP_TO_MARK INIT_FRAME NUMBER RETURN : NUMBER($4a) RETURN MARK_AT(0) POP_TO_MARK INIT_FRAME STRING RETURN : STRING($4a) RETURN