diff --git a/jscompile.c b/jscompile.c index 9698605..00aeccd 100644 --- a/jscompile.c +++ b/jscompile.c @@ -186,20 +186,20 @@ static void emitfunction(JF, js_Function *fun) static void emitnumber(JF, double num) { if (num == 0) { - emit(J, F, OP_NUMBER_0); + emit(J, F, OP_INTEGER); + emitarg(J, F, 32768); if (signbit(num)) emit(J, F, OP_NEG); - } else if (num == 1) { - emit(J, F, OP_NUMBER_1); - } else if (num == (js_Instruction)num) { - emit(J, F, OP_NUMBER_POS); - emitarg(J, F, (js_Instruction)num); - } else if (num < 0 && -num == (js_Instruction)(-num)) { - emit(J, F, OP_NUMBER_NEG); - emitarg(J, F, (js_Instruction)(-num)); } else { - emit(J, F, OP_NUMBER); - emitarg(J, F, addnumber(J, F, num)); + double nv = num + 32768; + js_Instruction iv = nv; + if (nv == iv) { + emit(J, F, OP_INTEGER); + emitarg(J, F, iv); + } else { + emit(J, F, OP_NUMBER); + emitarg(J, F, addnumber(J, F, num)); + } } } diff --git a/jscompile.h b/jscompile.h index 83926c1..ae5d6ef 100644 --- a/jscompile.h +++ b/jscompile.h @@ -10,11 +10,7 @@ enum js_OpCode OP_ROT3, /* A B C -- C A B */ OP_ROT4, /* A B C D -- D A B C */ - OP_NUMBER_0, /* -- 0 */ - OP_NUMBER_1, /* -- 1 */ - OP_NUMBER_POS, /* -K- K */ - OP_NUMBER_NEG, /* -K- -K */ - + OP_INTEGER, /* -K- (number-32768) */ OP_NUMBER, /* -N- */ OP_STRING, /* -S- */ OP_CLOSURE, /* -F- */ diff --git a/jsdump.c b/jsdump.c index 5c87781..e5b8dbc 100644 --- a/jsdump.c +++ b/jsdump.c @@ -797,6 +797,9 @@ void jsC_dumpfunction(js_State *J, js_Function *F) ps(opname[c]); switch (c) { + case OP_INTEGER: + printf(" %d", (*p++) - 32768); + break; case OP_NUMBER: printf(" %.9g", F->numtab[*p++]); break; @@ -830,8 +833,6 @@ void jsC_dumpfunction(js_State *J, js_Function *F) case OP_GETLOCAL: case OP_SETLOCAL: case OP_DELLOCAL: - case OP_NUMBER_POS: - case OP_NUMBER_NEG: case OP_CALL: case OP_NEW: case OP_JUMP: diff --git a/jsrun.c b/jsrun.c index 6474a7f..21c071b 100644 --- a/jsrun.c +++ b/jsrun.c @@ -1315,10 +1315,7 @@ static void jsR_run(js_State *J, js_Function *F) case OP_ROT3: js_rot3(J); break; case OP_ROT4: js_rot4(J); break; - case OP_NUMBER_0: js_pushnumber(J, 0); break; - case OP_NUMBER_1: js_pushnumber(J, 1); break; - case OP_NUMBER_POS: js_pushnumber(J, *pc++); break; - case OP_NUMBER_NEG: js_pushnumber(J, -(*pc++)); break; + case OP_INTEGER: js_pushnumber(J, *pc++ - 32768); break; case OP_NUMBER: js_pushnumber(J, NT[*pc++]); break; case OP_STRING: js_pushliteral(J, ST[*pc++]); break; diff --git a/opnames.h b/opnames.h index 82e97ed..5d4c168 100644 --- a/opnames.h +++ b/opnames.h @@ -4,10 +4,7 @@ "rot2", "rot3", "rot4", -"number_0", -"number_1", -"number_pos", -"number_neg", +"integer", "number", "string", "closure",