cvsuser 03/10/12 06:42:49
Modified: . interpreter.c
Log:
remove duplicate prederef init code
Revision Changes Path
1.208 +54 -122 parrot/interpreter.c
Index: interpreter.c
===================================================================
RCS file: /cvs/public/parrot/interpreter.c,v
retrieving revision 1.207
retrieving revision 1.208
diff -u -w -r1.207 -r1.208
--- interpreter.c 10 Oct 2003 09:13:31 -0000 1.207
+++ interpreter.c 12 Oct 2003 13:42:49 -0000 1.208
@@ -1,7 +1,7 @@
/* interpreter.c
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: interpreter.c,v 1.207 2003/10/10 09:13:31 leo Exp $
+ * $Id: interpreter.c,v 1.208 2003/10/12 13:42:49 leo Exp $
* Overview:
* The interpreter api handles running the operations
* Data Structure and Algorithms:
@@ -32,6 +32,7 @@
#define PREDEREF_NORMAL 0
#define PREDEREF_FOR_CGP 1
#define PREDEREF_FOR_SWITCH 2
+#define PREDEREF_FOR_EXEC 3
#if EXEC_CAPABLE
struct Parrot_Interp interpre;
@@ -178,6 +179,49 @@
return pc_prederef;
}
+/*
+ * non plain prederf cores immediately do the dereferencing
+ * the opcode is replaced depending on the run core
+ */
+static void
+fill_prederef(struct Parrot_Interp *interpreter, int cgp, size_t N, void **temp)
+{
+ size_t i;
+ opcode_t *pc = interpreter->code->cur_cs->base.data;
+ op_func_t *prederef_op_func = interpreter->op_lib->op_func_table;
+ size_t n;
+ int is_ret;
+
+ for (i = 0; i < N; ) {
+ is_ret = 0;
+ switch (cgp) {
+ case PREDEREF_FOR_EXEC:
+ if (*temp)
+ is_ret = 1;
+ break;
+ }
+ prederef(temp, interpreter);
+ switch (cgp) {
+ case PREDEREF_FOR_SWITCH:
+ *temp = (void**) *pc;
+ break;
+ case PREDEREF_FOR_CGP:
+ *temp = ((void**)(interpreter->op_lib->op_func_table)) [*pc];
+ break;
+ case PREDEREF_FOR_EXEC:
+ if (is_ret)
+ *temp = ((op_func_t*)interpreter->op_lib->op_func_table)[2];
+ else
+ *temp = (void *)(ptrcast_t)prederef_op_func[*pc];
+ break;
+ }
+ n = interpreter->op_info_table[*pc].arg_count;
+ pc += n;
+ i += n;
+ temp += n;
+ }
+}
+
/*=for api interpreter init_prederef
*
* interpreter->op_lib = prederefed oplib
@@ -214,38 +258,17 @@
N * sizeof(void *));
#endif
+ if (cgp == PREDEREF_NORMAL) {
for (i = 0; i < N; i++) {
temp[i] = (void *)(ptrcast_t)prederef;
}
+ }
interpreter->prederef_code = temp;
interpreter->code->cur_cs->prederef_code = temp;
- if (cgp == PREDEREF_FOR_SWITCH) {
- opcode_t *pc = interpreter->code->cur_cs->base.data;
- size_t n;
- for (i = 0; i < N; ) {
- prederef(temp, interpreter);
- *temp = (void**) *pc;
- n = interpreter->op_info_table[*pc].arg_count;
- pc += n;
- i += n;
- temp += n;
- }
- }
-#ifdef HAVE_COMPUTED_GOTO
- if (cgp == PREDEREF_FOR_CGP) {
- opcode_t *pc = interpreter->code->cur_cs->base.data;
- size_t n;
- for (i = 0; i < N; ) {
- prederef(temp, interpreter);
- *temp = ((void**)(interpreter->op_lib->op_func_table)) [*pc];
- n = interpreter->op_info_table[*pc].arg_count;
- pc += n;
- i += n;
- temp += n;
- }
- }
-#endif
+
+ if (cgp != PREDEREF_NORMAL)
+ fill_prederef(interpreter, cgp, N, temp);
}
}
@@ -261,86 +284,7 @@
}
#if EXEC_CAPABLE
-static void **
-exec_prederef(void **pc_prederef, struct Parrot_Interp *interpreter)
-{
- size_t offset = pc_prederef - interpreter->prederef_code;
- opcode_t *pc = ((opcode_t *)interpreter->code->byte_code) + offset;
- op_info_t *opinfo = &interpreter->op_info_table[*pc];
- op_func_t *prederef_op_func = interpreter->op_lib->op_func_table;
- int i;
-
- for (i = 0; i < opinfo->arg_count; i++) {
- switch (opinfo->types[i]) {
- case PARROT_ARG_OP:
- if ((int)pc_prederef[i] == 1)
- pc_prederef[i] =
((op_func_t*)interpreter->op_lib->op_func_table)[2];
- else
- pc_prederef[i] = (void *)(ptrcast_t)prederef_op_func[pc[i]];
- break;
-
- case PARROT_ARG_KI:
- case PARROT_ARG_I:
- pc_prederef[i] = (void *)&interpreter->int_reg.registers[pc[i]];
- break;
-
- case PARROT_ARG_N:
- pc_prederef[i] = (void *)&interpreter->num_reg.registers[pc[i]];
- break;
-
- case PARROT_ARG_K:
- case PARROT_ARG_P:
- pc_prederef[i] = (void *)&interpreter->pmc_reg.registers[pc[i]];
- break;
-
- case PARROT_ARG_S:
- pc_prederef[i] =
- (void *)&interpreter->string_reg.registers[pc[i]];
- break;
-
- case PARROT_ARG_KIC:
- case PARROT_ARG_IC:
- pc_prederef[i] = (void *)&pc[i];
- break;
-
- case PARROT_ARG_NC:
- pc_prederef[i] = (void *)
- &interpreter->code->const_table->constants[pc[i]]->u.number;
- break;
-
- case PARROT_ARG_PC:
-/* pc_prederef[i] = (void *)
- &interpreter->code->const_table->constants[pc[i]]->pmc; */
- internal_exception(ARG_OP_NOT_HANDLED,
- "PMC constants not yet supported!\n");
- break;
-
- case PARROT_ARG_SC:
- pc_prederef[i] = (void *)
- &interpreter->code->const_table->constants[pc[i]]->u.string;
- break;
-
- case PARROT_ARG_KC:
- pc_prederef[i] = (void *)
- &interpreter->code->const_table->constants[pc[i]]->u.key;
- break;
- default:
- internal_exception(ARG_OP_NOT_HANDLED,
- "Unhandled argtype %d\n",opinfo->types[i]);
- break;
- }
-
- if (pc_prederef[i] == 0) {
- internal_exception(INTERP_ERROR,
- "Prederef generated a NULL pointer for arg of type %d!\n",
- opinfo->types[i]);
- }
- }
-
- return pc_prederef;
-}
-
-/*=for api interpreter init_prederef
+/*=for api interpreter exec_init_prederef
*
* interpreter->op_lib = prederefed oplib
*
@@ -370,21 +314,9 @@
void **temp = prederef_arena;
opcode_t *pc = interpreter->code->cur_cs->base.data;
- for (i = 0; i < N; i++)
- if (temp[i])
- temp[i] = (void *)1;
- else
- temp[i] = (void *)(ptrcast_t)exec_prederef;
-
interpreter->prederef_code = temp;
interpreter->code->cur_cs->prederef_code = temp;
- for (i = 0; i < N; ) {
- exec_prederef(temp, interpreter);
- n = interpreter->op_info_table[*pc].arg_count;
- pc += n;
- i += n;
- temp += n;
- }
+ fill_prederef(interpreter, PREDEREF_FOR_EXEC, N, temp);
}
}
#endif