diff --git a/src/interpreter.h b/src/interpreter.h index 69cbc29b18cf83047741f60e038d858a44028024..c1bd510c328c3fc6240cd75b49e88c9b80657cfd 100644 --- a/src/interpreter.h +++ b/src/interpreter.h @@ -493,7 +493,9 @@ static int eval_instruction(unsigned char *pc) CASE(F_LTOSVAL2); sp[0]=sp[-1]; - lvalue_to_svalue_no_free(sp-1,sp-3); + sp[-1].type=T_INT; + sp++; + lvalue_to_svalue_no_free(sp-2,sp-4); /* this is so that foo+=bar (and similar things) will be faster, this * is done by freeing the old reference to foo after it has been pushed @@ -501,21 +503,22 @@ static int eval_instruction(unsigned char *pc) * and then the low array/multiset/mapping manipulation routines can be * destructive if they like */ - if( (1 << sp[-1].type) & ( BIT_ARRAY | BIT_MULTISET | BIT_MAPPING | BIT_STRING )) + if( (1 << sp[-2].type) & ( BIT_ARRAY | BIT_MULTISET | BIT_MAPPING | BIT_STRING )) { struct svalue s; s.type=T_INT; s.subtype=0; s.u.integer=0; - assign_lvalue(sp-3,&s); + assign_lvalue(sp-4,&s); } - sp++; break; CASE(F_ADD_TO_AND_POP); sp[0]=sp[-1]; - lvalue_to_svalue_no_free(sp-1,sp-3); + sp[-1].type=T_INT; + sp++; + lvalue_to_svalue_no_free(sp-2,sp-4); /* this is so that foo+=bar (and similar things) will be faster, this * is done by freeing the old reference to foo after it has been pushed @@ -523,15 +526,14 @@ static int eval_instruction(unsigned char *pc) * and then the low array/multiset/mapping manipulation routines can be * destructive if they like */ - if( (1 << sp[-1].type) & ( BIT_ARRAY | BIT_MULTISET | BIT_MAPPING | BIT_STRING )) + if( (1 << sp[-2].type) & ( BIT_ARRAY | BIT_MULTISET | BIT_MAPPING | BIT_STRING )) { struct svalue s; s.type=T_INT; s.subtype=0; s.u.integer=0; - assign_lvalue(sp-3,&s); + assign_lvalue(sp-4,&s); } - sp++; f_add(2); assign_lvalue(sp-3,sp-1); pop_n_elems(3);