diff --git a/src/interpret_functions.h b/src/interpret_functions.h index 2917206eb03911b09cd4f052dee1b3daab1c28ba..9a963175fc780378321fc069d961a897df35920e 100644 --- a/src/interpret_functions.h +++ b/src/interpret_functions.h @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: interpret_functions.h,v 1.111 2002/10/28 13:01:31 nilsson Exp $ +|| $Id: interpret_functions.h,v 1.112 2002/11/02 15:43:45 grubba Exp $ */ /* @@ -52,6 +52,12 @@ #define OPCODE0_TAILRETURN(A, B, F, C) OPCODE0_TAILRETURN(A, B, F) --- C #define OPCODE1_TAILRETURN(A, B, F, C) OPCODE1_TAILRETURN(A, B, F) --- C #define OPCODE2_TAILRETURN(A, B, F, C) OPCODE2_TAILRETURN(A, B, F) --- C +#define OPCODE0_BRANCH(A, B, F, C) OPCODE0_BRANCH(A, B, F) --- C +#define OPCODE1_BRANCH(A, B, F, C) OPCODE1_BRANCH(A, B, F) --- C +#define OPCODE2_BRANCH(A, B, F, C) OPCODE2_BRANCH(A, B, F) --- C +#define OPCODE0_TAILBRANCH(A, B, F, C) OPCODE0_TAILBRANCH(A, B, F) --- C +#define OPCODE1_TAILBRANCH(A, B, F, C) OPCODE1_TAILBRANCH(A, B, F) --- C +#define OPCODE2_TAILBRANCH(A, B, F, C) OPCODE2_TAILBRANCH(A, B, F) --- C #endif /* GEN_PROTOS */ @@ -69,6 +75,16 @@ #define INTER_RETURN return -1 #endif +/* BRANCH opcodes use these two to indicate whether the + * branch should be taken or not. + */ +#ifndef DO_BRANCH +#define DO_BRANCH DOJUMP +#endif +#ifndef DONT_BRANCH +#define DONT_BRANCH SKIPJUMP +#endif + #ifndef OVERRIDE_JUMPS #undef GET_JUMP @@ -1159,10 +1175,11 @@ OPCODE0_JUMP(F_CATCH, "catch", 0, { /* There was a return inside the evaluated code */ DO_DUMB_RETURN; case 2: + /* Escape catch, continue after the escape instruction. */ DO_JUMP_TO(Pike_fp->pc); break; default: - DO_JUMP_TO(PROG_COUNTER + GET_JUMP()); + DOJUMP(); } /* NOT_REACHED */ }); diff --git a/src/interpreter.h b/src/interpreter.h index a40ada534fa2984611bab5cdad1f5be6ab24ad3c..bfc5be41bbc3fda7acb345d03424a85cd8720e76 100644 --- a/src/interpreter.h +++ b/src/interpreter.h @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: interpreter.h,v 1.78 2002/10/11 01:39:32 nilsson Exp $ +|| $Id: interpreter.h,v 1.79 2002/11/02 15:34:35 grubba Exp $ */ #undef LOW_GET_ARG @@ -315,6 +315,13 @@ static int eval_instruction(PIKE_OPCODE_T *pc) #define OPCODE1_TAILJUMP(OP, DESC, FLAGS, CODE) CASE(OP); CODE #define OPCODE2_TAILJUMP(OP, DESC, FLAGS, CODE) CASE(OP); CODE +#define OPCODE0_BRANCH OPCODE0_JUMP +#define OPCODE1_BRANCH OPCODE1_JUMP +#define OPCODE2_BRANCH OPCODE2_JUMP +#define OPCODE0_TAILBRANCH OPCODE0_TAILJUMP +#define OPCODE1_TAILBRANCH OPCODE1_TAILJUMP +#define OPCODE2_TAILBRANCH OPCODE2_TAILJUMP + #include "interpret_functions.h" #ifndef HAVE_COMPUTED_GOTO @@ -340,6 +347,18 @@ static int eval_instruction(PIKE_OPCODE_T *pc) #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 +#undef OPCODE0_BRANCH +#undef OPCODE1_BRANCH +#undef OPCODE2_BRANCH +#undef OPCODE0_TAILBRANCH +#undef OPCODE1_TAILBRANCH +#undef OPCODE2_TAILBRANCH #undef LABEL #define LABEL(OP) &&PIKE_CONCAT(LABEL_,OP) #define NULL_LABEL(OP) NULL diff --git a/src/opcodes.h b/src/opcodes.h index da7573029acbefc90b120a565a4b2b1f74fc988a..ee3d1e837af12a0c3db2e3e70b1507016325594f 100644 --- a/src/opcodes.h +++ b/src/opcodes.h @@ -2,7 +2,7 @@ || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information. -|| $Id: opcodes.h,v 1.30 2002/10/11 01:39:34 nilsson Exp $ +|| $Id: opcodes.h,v 1.31 2002/11/02 15:29:34 grubba Exp $ */ #ifndef OPCODES_H @@ -10,10 +10,6 @@ /* Opcodes */ -/* - * These values are used by the stack machine, and can not be directly - * called from Pike. - */ #define OPCODE0(X,Y,F) X, #define OPCODE1(X,Y,F) X, #define OPCODE2(X,Y,F) X, @@ -32,9 +28,19 @@ #define OPCODE0_TAILRETURN(X,Y,F) X, #define OPCODE1_TAILRETURN(X,Y,F) X, #define OPCODE2_TAILRETURN(X,Y,F) X, +#define OPCODE0_BRANCH(X,Y,F) X, +#define OPCODE1_BRANCH(X,Y,F) X, +#define OPCODE2_BRANCH(X,Y,F) X, +#define OPCODE0_TAILBRANCH(X,Y,F) X, +#define OPCODE1_TAILBRANCH(X,Y,F) X, +#define OPCODE2_TAILBRANCH(X,Y,F) X, enum Pike_opcodes { + /* + * These values are used by the stack machine, and can not be directly + * called from Pike. + */ F_OFFSET = 257, F_PREFIX_256, F_PREFIX_512, @@ -51,19 +57,19 @@ enum Pike_opcodes F_PREFIX2_WORDX256, F_PREFIX2_24BITX256, -/* - * These are the predefined functions that can be accessed from Pike. - */ + /* + * These are the predefined functions that can be accessed from Pike. + */ #include "interpret_protos.h" /* Used to mark an entry point from eval_instruction(). */ F_ENTRY, -/* - * These are token values that needn't have an associated code for the - * compiled file - */ + /* + * These are token values that needn't have an associated code for the + * compiled file + */ F_MAX_OPCODE, F_ADD_EQ, @@ -127,6 +133,12 @@ enum Pike_opcodes #undef OPCODE0_TAILRETURN #undef OPCODE1_TAILRETURN #undef OPCODE2_TAILRETURN +#undef OPCODE0_BRANCH +#undef OPCODE1_BRANCH +#undef OPCODE2_BRANCH +#undef OPCODE0_TAILBRANCH +#undef OPCODE1_TAILBRANCH +#undef OPCODE2_TAILBRANCH /* Prototypes begin here */