diff --git a/src/interpret.c b/src/interpret.c index e682d22842ee05bb5e0597cd15f6ee115dfc5eac..3761802e6c3b3dd96531395a2a8c1cef402ec52a 100644 --- a/src/interpret.c +++ b/src/interpret.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: interpret.c,v 1.235 2001/07/27 08:32:03 hubbe Exp $"); +RCSID("$Id: interpret.c,v 1.236 2001/07/27 15:02:03 grubba Exp $"); #include "interpret.h" #include "object.h" #include "program.h" @@ -809,6 +809,14 @@ C } #define OPCODE1_TAILJUMP(O,N,C) OPCODE1(O,N,C) #define OPCODE2_TAILJUMP(O,N,C) OPCODE2(O,N,C) +#define OPCODE0_RETURN(O,N,C) OPCODE0(O,N,C) +#define OPCODE1_RETURN(O,N,C) OPCODE1(O,N,C) +#define OPCODE2_RETURN(O,N,C) OPCODE2(O,N,C) + +#define OPCODE0_RETURNJUMP(O,N,C) OPCODE0(O,N,C) +#define OPCODE1_RETURNJUMP(O,N,C) OPCODE1(O,N,C) +#define OPCODE2_RETURNJUMP(O,N,C) OPCODE2(O,N,C) + #undef HAVE_COMPUTED_GOTO #ifdef __GNUC__ diff --git a/src/interpret_functions.h b/src/interpret_functions.h index 286a816c50680b9b03c08ccaa5a9ae72ebd31679..ab6fcf35aa3ab3554b83039f1787891df9c73851 100644 --- a/src/interpret_functions.h +++ b/src/interpret_functions.h @@ -1,5 +1,5 @@ /* - * $Id: interpret_functions.h,v 1.83 2001/07/27 08:32:03 hubbe Exp $ + * $Id: interpret_functions.h,v 1.84 2001/07/27 15:02:04 grubba Exp $ * * Opcode definitions for the interpreter. */ @@ -41,6 +41,12 @@ #define OPCODE0_TAILJUMP(A, B, C) OPCODE0_TAILJUMP(A, B) C #define OPCODE1_TAILJUMP(A, B, C) OPCODE1_TAILJUMP(A, B) C #define OPCODE2_TAILJUMP(A, B, C) OPCODE2_TAILJUMP(A, B) C +#define OPCODE0_RETURN(A, B, C) OPCODE0_RETURN(A, B) C +#define OPCODE1_RETURN(A, B, C) OPCODE1_RETURN(A, B) C +#define OPCODE2_RETURN(A, B, C) OPCODE2_RETURN(A, B) C +#define OPCODE0_TAILRETURN(A, B, C) OPCODE0_TAILRETURN(A, B) C +#define OPCODE1_TAILRETURN(A, B, C) OPCODE1_TAILRETURN(A, B) C +#define OPCODE2_TAILRETURN(A, B, C) OPCODE2_TAILRETURN(A, B) C #endif /* GEN_PROTOS */ @@ -1117,7 +1123,7 @@ OPCODE0_JUMP(F_CATCH, "catch", { /* NOT_REACHED */ }); -OPCODE0(F_ESCAPE_CATCH, "escape catch", { +OPCODE0_RETURN(F_ESCAPE_CATCH, "escape catch", { Pike_fp->pc = PROG_COUNTER; INTER_ESCAPE_CATCH; }); @@ -1267,7 +1273,7 @@ OPCODE0_JUMP(F_NEW_FOREACH, "foreach++", { /* iterator, lvalue, lvalue */ }); -OPCODE1(F_RETURN_LOCAL,"return local",{ +OPCODE1_RETURN(F_RETURN_LOCAL,"return local",{ DO_IF_DEBUG( /* special case! Pike_interpreter.mark_stack may be invalid at the time we * call return -1, so we must call the callbacks here to @@ -1288,26 +1294,26 @@ OPCODE1(F_RETURN_LOCAL,"return local",{ }); -OPCODE0(F_RETURN_IF_TRUE,"return if true",{ +OPCODE0_RETURN(F_RETURN_IF_TRUE,"return if true",{ if(!IS_ZERO(Pike_sp-1)) DO_RETURN; pop_stack(); }); -OPCODE0(F_RETURN_1,"return 1",{ +OPCODE0_RETURN(F_RETURN_1,"return 1",{ push_int(1); DO_RETURN; }); -OPCODE0(F_RETURN_0,"return 0",{ +OPCODE0_RETURN(F_RETURN_0,"return 0",{ push_int(0); DO_RETURN; }); -OPCODE0(F_RETURN, "return", { +OPCODE0_RETURN(F_RETURN, "return", { DO_RETURN; }); -OPCODE0(F_DUMB_RETURN,"dumb return", { +OPCODE0_RETURN(F_DUMB_RETURN,"dumb return", { DO_DUMB_RETURN; }); @@ -1725,7 +1731,8 @@ OP(PIKE_CONCAT3(F_,OPCODE,_AND_POP),NAME " & pop", { \ } \ }); \ \ -OP(PIKE_CONCAT3(F_,OPCODE,_AND_RETURN),NAME " & return", { \ +PIKE_CONCAT(OP,_RETURN)(PIKE_CONCAT3(F_,OPCODE,_AND_RETURN), \ + NAME " & return", { \ if(low_mega_apply(TYPE,DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)), \ ARG2,ARG3)) \ { \ @@ -1760,7 +1767,8 @@ OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_POP),"mark, " NAME " & pop", { \ } \ }); \ \ -OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_RETURN),"mark, " NAME " & return", { \ +PIKE_CONCAT(OP,_RETURN)(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_RETURN), \ + "mark, " NAME " & return", { \ if(low_mega_apply(TYPE,0, \ ARG2,ARG3)) \ { \ @@ -1831,7 +1839,7 @@ OPCODE1(F_CALL_BUILTIN_AND_POP,"call builtin & pop", { pop_stack(); }); -OPCODE1(F_CALL_BUILTIN_AND_RETURN,"call builtin & return", { +OPCODE1_RETURN(F_CALL_BUILTIN_AND_RETURN,"call builtin & return", { DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp))); DO_DUMB_RETURN; }); @@ -1846,7 +1854,7 @@ OPCODE1(F_MARK_CALL_BUILTIN_AND_POP, "mark, call builtin & pop", { pop_stack(); }); -OPCODE1(F_MARK_CALL_BUILTIN_AND_RETURN, "mark, call builtin & return", { +OPCODE1_RETURN(F_MARK_CALL_BUILTIN_AND_RETURN, "mark, call builtin & return", { DO_CALL_BUILTIN(0); DO_DUMB_RETURN; }); diff --git a/src/interpreter.h b/src/interpreter.h index e7fa871d75352f074ac1e57f7aba1b9c07f3b499..344fc53268b92d72798825d8ce6199ca9f2a622b 100644 --- a/src/interpreter.h +++ b/src/interpreter.h @@ -278,6 +278,13 @@ static int eval_instruction(PIKE_OPCODE_T *pc) #define OPCODE1_TAIL(OP, DESC, CODE) CASE(OP); CODE #define OPCODE2_TAIL(OP, DESC, CODE) CASE(OP); CODE +#define OPCODE0_RETURN(OP, DESC, CODE) OPCODE0(OP, DESC, CODE) +#define OPCODE1_RETURN(OP, DESC, CODE) OPCODE1(OP, DESC, CODE) +#define OPCODE2_RETURN(OP, DESC, CODE) OPCODE2(OP, DESC, CODE) +#define OPCODE0_TAILRETURN(OP, DESC, CODE) OPCODE0_TAIL(OP, DESC, CODE) +#define OPCODE1_TAILRETURN(OP, DESC, CODE) OPCODE1_TAIL(OP, DESC, CODE) +#define OPCODE2_TAILRETURN(OP, DESC, CODE) OPCODE2_TAIL(OP, DESC, CODE) + #define OPCODE0_JUMP(OP, DESC, CODE) CASE(OP); CODE; DONE #define OPCODE0_TAILJUMP(OP, DESC, CODE) CASE(OP); CODE @@ -341,6 +348,12 @@ static int eval_instruction(PIKE_OPCODE_T *pc) #define OPCODE0_TAILJUMP(OP,DESC) LABEL(OP), #define OPCODE1_TAILJUMP(OP,DESC) LABEL(OP), #define OPCODE2_TAILJUMP(OP,DESC) LABEL(OP), +#define OPCODE0_RETURN(OP,DESC) LABEL(OP), +#define OPCODE1_RETURN(OP,DESC) LABEL(OP), +#define OPCODE2_RETURN(OP,DESC) LABEL(OP), +#define OPCODE0_TAILRETURN(OP,DESC) LABEL(OP), +#define OPCODE1_TAILRETURN(OP,DESC) LABEL(OP), +#define OPCODE2_TAILRETURN(OP,DESC) LABEL(OP), init_strap: strap = &&normal_strap; diff --git a/src/lex.c b/src/lex.c index 8017dde19c0079be86c2a1902eb20f956bb8b64e..b4570f400b64d0a6fdf8dd4e3959875302c5a446 100644 --- a/src/lex.c +++ b/src/lex.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: lex.c,v 1.99 2001/07/24 13:51:53 grubba Exp $"); +RCSID("$Id: lex.c,v 1.100 2001/07/27 15:02:05 grubba Exp $"); #include "language.h" #include "array.h" #include "lex.h" @@ -165,6 +165,13 @@ void exit_lex(void) #define OPCODE1_TAILJUMP(OP,DESC) void PIKE_CONCAT(opcode_,OP)(INT32); #define OPCODE2_TAILJUMP(OP,DESC) void PIKE_CONCAT(opcode_,OP)(INT32,INT32); +#define OPCODE0_RETURN(OP, DESC) OPCODE0(OP, DESC) +#define OPCODE1_RETURN(OP, DESC) OPCODE1(OP, DESC) +#define OPCODE2_RETURN(OP, DESC) OPCODE2(OP, DESC) +#define OPCODE0_TAILRETURN(OP, DESC) OPCODE0_TAIL(OP, DESC) +#define OPCODE1_TAILRETURN(OP, DESC) OPCODE1_TAIL(OP, DESC) +#define OPCODE2_TAILRETURN(OP, DESC) OPCODE2_TAIL(OP, DESC) + #include "interpret_protos.h" #undef OPCODE0 diff --git a/src/opcodes.h b/src/opcodes.h index 3b9f138f90412d1f22322a1ef69d16ea9c3cd9b0..d86676f5b19e7bc5f550952f53e860a504f2b8da 100644 --- a/src/opcodes.h +++ b/src/opcodes.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: opcodes.h,v 1.22 2001/07/24 13:51:53 grubba Exp $ + * $Id: opcodes.h,v 1.23 2001/07/27 15:02:05 grubba Exp $ */ #ifndef OPCODES_H #define OPCODES_H @@ -28,6 +28,12 @@ #define OPCODE0_TAILJUMP(X,Y) X, #define OPCODE1_TAILJUMP(X,Y) X, #define OPCODE2_TAILJUMP(X,Y) X, +#define OPCODE0_RETURN(X,Y) X, +#define OPCODE1_RETURN(X,Y) X, +#define OPCODE2_RETURN(X,Y) X, +#define OPCODE0_TAILRETURN(X,Y) X, +#define OPCODE1_TAILRETURN(X,Y) X, +#define OPCODE2_TAILRETURN(X,Y) X, enum Pike_opcodes { @@ -114,6 +120,12 @@ enum Pike_opcodes #undef OPCODE0_TAILJUMP #undef OPCODE1_TAILJUMP #undef OPCODE2_TAILJUMP +#undef OPCODE0_RETURN +#undef OPCODE1_RETURN +#undef OPCODE2_RETURN +#undef OPCODE0_TAILRETURN +#undef OPCODE1_TAILRETURN +#undef OPCODE2_TAILRETURN /* Prototypes begin here */