diff --git a/src/interpret.c b/src/interpret.c index c529a3bdd315f400b6d3868a89f7802b48e34fe1..10e365bccffe268b676dad4ad0e80c39544b1295 100644 --- a/src/interpret.c +++ b/src/interpret.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: interpret.c,v 1.212 2001/07/02 20:09:17 mast Exp $"); +RCSID("$Id: interpret.c,v 1.213 2001/07/06 22:56:56 grubba Exp $"); #include "interpret.h" #include "object.h" #include "program.h" @@ -618,59 +618,6 @@ void print_return_value(void) #endif struct callback_list evaluator_callbacks; -#define CASE(X) case (X)-F_OFFSET: - -#define COMPARISMENT(ID,EXPR) \ -CASE(ID); \ -instr=EXPR; \ -pop_n_elems(2); \ -push_int(instr); \ -break - -#ifdef AUTO_BIGNUM -#define AUTO_BIGNUM_LOOP_TEST(X,Y) INT_TYPE_ADD_OVERFLOW(X,Y) -#else -#define AUTO_BIGNUM_LOOP_TEST(X,Y) 0 -#endif - -#define LOOP(ID, INC, OP2, OP4) \ -CASE(ID) \ -{ \ - union anything *i=get_pointer_if_this_type(Pike_sp-2, T_INT); \ - if(i && !AUTO_BIGNUM_LOOP_TEST(i->integer,INC)) \ - { \ - i->integer += INC; \ - if(i->integer OP2 Pike_sp[-3].u.integer) \ - { \ - DOJUMP(); \ - }else{ \ - SKIPJUMP(); \ - } \ - }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 )) \ - { \ - DOJUMP(); \ - }else{ \ - SKIPJUMP(); \ - } \ - pop_stack(); \ - } \ - break; \ -} - -#define CJUMP(X,Y) \ -CASE(X); \ -if(Y(Pike_sp-2,Pike_sp-1)) { \ - DOJUMP(); \ -}else{ \ - SKIPJUMP(); \ -} \ -pop_n_elems(2); \ -break /* @@ -1669,8 +1616,14 @@ PMOD_EXPORT void safe_apply_handler(const char *fun, INT32 args) { int i; +#if 0 + fprintf(stderr, "safe_apply_handler(\"%s\", 0x%08p, 0x%08p, %d\n", + fun, handler, compat, args); +#endif /* 0 */ + free_svalue(&throw_value); throw_value.type = T_INT; + if (handler && handler->prog && (i = find_identifier(fun, handler->prog)) != -1) { safe_apply_low2(handler, i, args, 0); diff --git a/src/interpret_functions.h b/src/interpret_functions.h index c002a6bf56675d694c5ba5ed610f743a1430522e..9eef2ff25eeb1e58f9cc11b84bc80fed418d7533 100644 --- a/src/interpret_functions.h +++ b/src/interpret_functions.h @@ -1,11 +1,19 @@ /* - * $Id: interpret_functions.h,v 1.69 2001/07/06 17:17:49 grubba Exp $ + * $Id: interpret_functions.h,v 1.70 2001/07/06 22:56:56 grubba Exp $ * * Opcode definitions for the interpreter. */ #include "global.h" +#undef CJUMP +#undef AUTO_BIGNUM_LOOP_TEST +#undef LOOP +#undef COMPARISON +#undef MKAPPLY +#undef DO_CALL_BUILTIN + +#undef DO_IF_BIGNUM #ifdef AUTO_BIGNUM #define DO_IF_BIGNUM(CODE) CODE #else /* !AUTO_BIGNUM */ @@ -28,7 +36,7 @@ #define OPCODE2_TAILJUMP(A, B, C) OPCODE2_TAILJUMP(A, B) C #endif /* GEN_PROTOS */ -OPCODE0(F_UNDEFINED,"push UNDEFINED", { +OPCODE0(F_UNDEFINED, "push UNDEFINED", { push_int(0); Pike_sp[-1].subtype=NUMBER_UNDEFINED; }); @@ -53,7 +61,7 @@ OPCODE1(F_NUMBER, "push int", { push_int(arg1); }); -OPCODE1(F_NEG_NUMBER,"push -int", { +OPCODE1(F_NEG_NUMBER, "push -int", { push_int(-arg1); }); @@ -64,7 +72,7 @@ OPCODE1(F_CONSTANT, "constant", { /* The rest of the basic 'push value' instructions */ -OPCODE1_TAIL(F_MARK_AND_STRING,"mark & string", { +OPCODE1_TAIL(F_MARK_AND_STRING, "mark & string", { *(Pike_mark_sp++)=Pike_sp; OPCODE1(F_STRING, "string", { @@ -898,12 +906,22 @@ OPCODE1_JUMP(F_BRANCH_IF_NOT_LOCAL, "branch if !local", { } }); - CJUMP(F_BRANCH_WHEN_EQ, is_eq); - CJUMP(F_BRANCH_WHEN_NE,!is_eq); - CJUMP(F_BRANCH_WHEN_LT, is_lt); - CJUMP(F_BRANCH_WHEN_LE,!is_gt); - CJUMP(F_BRANCH_WHEN_GT, is_gt); - CJUMP(F_BRANCH_WHEN_GE,!is_lt); +#define CJUMP(X, DESC, Y) \ + OPCODE0_JUMP(X, DESC, { \ + if(Y(Pike_sp-2,Pike_sp-1)) { \ + DOJUMP(); \ + }else{ \ + SKIPJUMP(); \ + } \ + pop_n_elems(2); \ + }) + +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_gt); +CJUMP(F_BRANCH_WHEN_GT, "branch if >", is_gt); +CJUMP(F_BRANCH_WHEN_GE, "branch if >=", !is_lt); OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_ZERO, "branch & pop if zero", { if(!IS_ZERO(Pike_sp-1)) @@ -1029,12 +1047,46 @@ OPCODE2(F_SWITCH_ON_LOCAL, "switch on local", { }); +#ifdef AUTO_BIGNUM +#define AUTO_BIGNUM_LOOP_TEST(X,Y) INT_TYPE_ADD_OVERFLOW(X,Y) +#else +#define AUTO_BIGNUM_LOOP_TEST(X,Y) 0 +#endif + /* FIXME: Does this need bignum tests? /Fixed - Hubbe */ /* LOOP(OPCODE, INCREMENT, OPERATOR, IS_OPERATOR) */ - LOOP(F_INC_LOOP, 1, <, is_lt); - LOOP(F_DEC_LOOP, -1, >, is_gt); - LOOP(F_INC_NEQ_LOOP, 1, !=, !is_eq); - LOOP(F_DEC_NEQ_LOOP, -1, !=, !is_eq); +#define LOOP(ID, DESC, INC, OP2, OP4) \ + OPCODE0_JUMP(ID, DESC, { \ + union anything *i=get_pointer_if_this_type(Pike_sp-2, T_INT); \ + if(i && !AUTO_BIGNUM_LOOP_TEST(i->integer,INC)) \ + { \ + i->integer += INC; \ + if(i->integer OP2 Pike_sp[-3].u.integer) \ + { \ + DOJUMP(); \ + }else{ \ + SKIPJUMP(); \ + } \ + }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 )) \ + { \ + DOJUMP(); \ + }else{ \ + SKIPJUMP(); \ + } \ + pop_stack(); \ + } \ + break; \ + }) + +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); /* Use like: * @@ -1226,12 +1278,19 @@ OPCODE0(F_RSH, ">>", { o_rsh(); }); - COMPARISMENT(F_EQ, is_eq(Pike_sp-2,Pike_sp-1)); - COMPARISMENT(F_NE,!is_eq(Pike_sp-2,Pike_sp-1)); - COMPARISMENT(F_GT, is_gt(Pike_sp-2,Pike_sp-1)); - COMPARISMENT(F_GE,!is_lt(Pike_sp-2,Pike_sp-1)); - COMPARISMENT(F_LT, is_lt(Pike_sp-2,Pike_sp-1)); - COMPARISMENT(F_LE,!is_gt(Pike_sp-2,Pike_sp-1)); +#define COMPARISON(ID,DESC,EXPR) \ + OPCODE0(ID, DESC, { \ + instr = EXPR; \ + pop_n_elems(2); \ + push_int(instr); \ + }) + +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_lt(Pike_sp-2,Pike_sp-1)); +COMPARISON(F_LT, "<", is_lt(Pike_sp-2,Pike_sp-1)); +COMPARISON(F_LE, "<=", !is_gt(Pike_sp-2,Pike_sp-1)); OPCODE0(F_ADD, "+", { f_add(2); diff --git a/src/interpreter.h b/src/interpreter.h index 3a944180dd7d4ece3a4e778b6ff721990698b27b..998867d6de81f0b2b101ca9af90ce394c672d764 100644 --- a/src/interpreter.h +++ b/src/interpreter.h @@ -3,6 +3,8 @@ #undef GET_ARG2 #undef GET_JUMP #undef SKIPJUMP +#undef CASE +#undef DOJUMP #ifdef PIKE_DEBUG @@ -35,6 +37,8 @@ #endif +#define CASE(X) case (X)-F_OFFSET: + #define DOJUMP() \ do { int tmp; tmp=GET_JUMP(); pc+=tmp; if(tmp < 0) fast_check_threads_etc(6); }while(0) diff --git a/src/lex.c b/src/lex.c index 29a9e00b666c5504c8ced636f16a6862f7da65bd..1a4b8aa3f623fd0440ec441ff0e55c9228a03a7b 100644 --- a/src/lex.c +++ b/src/lex.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: lex.c,v 1.92 2001/07/06 14:07:55 grubba Exp $"); +RCSID("$Id: lex.c,v 1.93 2001/07/06 22:56:57 grubba Exp $"); #include "language.h" #include "array.h" #include "lex.h" @@ -166,7 +166,6 @@ struct keyword instr_names[]= #ifndef PIKE_PRECOMPILER #include "interpret_protos.h" #endif /* !PIKE_PRECOMPILER */ -{ "!=", F_NE,0 }, { "%=", F_MOD_EQ,0 }, { "&=", F_AND_EQ,0 }, { "|=", F_OR_EQ,0 }, @@ -174,12 +173,7 @@ struct keyword instr_names[]= { "+=", F_ADD_EQ,0 }, { "-=", F_SUB_EQ,0 }, { "/=", F_DIV_EQ,0 }, -{ "<", F_LT,0 }, { "<<=", F_LSH_EQ,0 }, -{ "<=", F_LE,0 }, -{ "==", F_EQ,0 }, -{ ">", F_GT,0 }, -{ ">=", F_GE,0 }, { ">>=", F_RSH_EQ,0 }, { "^=", F_XOR_EQ,0 }, { "arg+=1024", F_PREFIX_1024,0 }, @@ -207,16 +201,6 @@ struct keyword instr_names[]= { "for", F_FOR,0 }, { "index", F_INDEX,0 }, -{ "branch if <", F_BRANCH_WHEN_LT, I_ISJUMP }, -{ "branch if >", F_BRANCH_WHEN_GT, I_ISJUMP }, -{ "branch if <=", F_BRANCH_WHEN_LE, I_ISJUMP }, -{ "branch if >=", F_BRANCH_WHEN_GE, I_ISJUMP }, -{ "branch if ==", F_BRANCH_WHEN_EQ, I_ISJUMP }, -{ "branch if !=", F_BRANCH_WHEN_NE, I_ISJUMP }, -{ "++Loop", F_INC_LOOP, I_ISJUMP }, -{ "++Loop!=", F_INC_NEQ_LOOP, I_ISJUMP }, -{ "--Loop", F_DEC_LOOP, I_ISJUMP }, -{ "--Loop!=", F_DEC_NEQ_LOOP, I_ISJUMP }, { "foreach", F_FOREACH, I_ISJUMP }, { "foreach++", F_NEW_FOREACH, I_ISJUMP }, { "pointer", F_POINTER, I_ISPOINTER }, diff --git a/src/opcodes.h b/src/opcodes.h index b15d6af6a47f3e70d279e4951e79c51740e361c1..7eb1583609c97b293a5875f4d50c6ebc9e904f39 100644 --- a/src/opcodes.h +++ b/src/opcodes.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: opcodes.h,v 1.18 2001/07/06 14:07:55 grubba Exp $ + * $Id: opcodes.h,v 1.19 2001/07/06 22:56:57 grubba Exp $ */ #ifndef OPCODES_H #define OPCODES_H @@ -47,17 +47,6 @@ enum Pike_opcodes F_PREFIX2_WORDX256, F_PREFIX2_24BITX256, - F_BRANCH_WHEN_LT, - F_BRANCH_WHEN_GT, - F_BRANCH_WHEN_LE, - F_BRANCH_WHEN_GE, - F_BRANCH_WHEN_EQ, - F_BRANCH_WHEN_NE, - F_INC_LOOP, - F_DEC_LOOP, - F_INC_NEQ_LOOP, - F_DEC_NEQ_LOOP, - F_INDEX, F_POS_INT_INDEX, F_NEG_INT_INDEX, @@ -72,13 +61,6 @@ enum Pike_opcodes F_RETURN_LOCAL, F_RETURN_IF_TRUE, - F_LT, - F_GT, - F_EQ, - F_GE, - F_LE, - F_NE, - F_FOREACH, F_NEW_FOREACH,