cvsuser 03/12/27 04:28:10
Modified: include/parrot interpreter.h packfile.h
lib/Parrot/OpTrans CGP.pm CPrederef.pm CSwitch.pm
src exceptions.c interpreter.c packfile.c
Log:
event-handling-11
* data structures for event handling of prederefed run cores
* init, copy, and cleanup these in packfile
Revision Changes Path
1.112 +15 -2 parrot/include/parrot/interpreter.h
Index: interpreter.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/interpreter.h,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -w -r1.111 -r1.112
--- interpreter.h 26 Dec 2003 12:49:53 -0000 1.111
+++ interpreter.h 27 Dec 2003 12:27:54 -0000 1.112
@@ -1,7 +1,7 @@
/* interpreter.h
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: interpreter.h,v 1.111 2003/12/26 12:49:53 leo Exp $
+ * $Id: interpreter.h,v 1.112 2003/12/27 12:27:54 leo Exp $
* Overview:
* The interpreter api handles running the operations
* Data Structure and Algorithms:
@@ -144,6 +144,18 @@
struct _Thread_data; /* in thread.h */
+typedef struct _Prederef_branch { /* item for recording branches */
+ size_t offs; /* offset in code */
+ void *op; /* opcode at that position */
+} Prederef_branch;
+
+typedef struct _Prederef {
+ void **code; /* prederefed code */
+ Prederef_branch *branches; /* list of branches in code */
+ size_t n_branches; /* entries in that list */
+ size_t n_allocated; /* allocated size of it */
+} Prederef;
+
/*
* TODO: Parrot_Interp can use a Parrot_Context inline and we
* can save/restore context with a single memcpy
@@ -193,8 +205,9 @@
struct PackFile *code; /* The code we are executing */
/* the next items point to the real thngs, which are
* in the byte_code_segment, that is currently executed */
- void **prederef_code; /* The predereferenced code */
+ struct _Prederef prederef; /* The predereferenced code and info */
void *jit_info; /* JITs data */
+
struct _imc_info_t *imc_info; /* imcc data */
size_t current_line; /* Which line we're executing in the
* source */
1.55 +2 -2 parrot/include/parrot/packfile.h
Index: packfile.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/packfile.h,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -w -r1.54 -r1.55
--- packfile.h 22 Nov 2003 12:13:02 -0000 1.54
+++ packfile.h 27 Dec 2003 12:27:54 -0000 1.55
@@ -1,6 +1,6 @@
/* packfile.h
*
-* $Id: packfile.h,v 1.54 2003/11/22 12:13:02 leo Exp $
+* $Id: packfile.h,v 1.55 2003/12/27 12:27:54 leo Exp $
*
* History:
* Rework by Melvin; new bytecode format, make bytecode portable.
@@ -160,7 +160,7 @@
struct PackFile_ByteCode {
struct PackFile_Segment base;
- void **prederef_code; /* The predereferenced code */
+ Prederef prederef; /* The predereferenced code and info */
void *jit_info; /* JITs data */
struct PackFile_ByteCode * prev; /* was executed previous */
struct PackFile_Debug * debugs;
1.8 +3 -3 parrot/lib/Parrot/OpTrans/CGP.pm
Index: CGP.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/OpTrans/CGP.pm,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -w -r1.7 -r1.8
--- CGP.pm 28 Oct 2003 16:22:33 -0000 1.7
+++ CGP.pm 27 Dec 2003 12:28:02 -0000 1.8
@@ -6,7 +6,7 @@
#
# Author: leo
#
-# $Id: CGP.pm,v 1.7 2003/10/28 16:22:33 leo Exp $
+# $Id: CGP.pm,v 1.8 2003/12/27 12:28:02 leo Exp $
#
use strict;
@@ -41,7 +41,7 @@
sub defines
{
return <<END;
-#define REL_PC ((size_t)((opcode_t*)cur_opcode -
(opcode_t*)interpreter->prederef_code))
+#define REL_PC ((size_t)((opcode_t*)cur_opcode -
(opcode_t*)interpreter->prederef.code))
#define CUR_OPCODE (interpreter->code->byte_code + REL_PC)
@@ -49,7 +49,7 @@
opcode_to_prederef(struct Parrot_Interp* interpreter,
opcode_t* opcode_addr)
{
- return interpreter->prederef_code +
+ return interpreter->prederef.code +
(opcode_addr - (opcode_t*) interpreter->code->byte_code);
}
1.21 +3 -3 parrot/lib/Parrot/OpTrans/CPrederef.pm
Index: CPrederef.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/OpTrans/CPrederef.pm,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -w -r1.20 -r1.21
--- CPrederef.pm 17 Oct 2003 10:06:25 -0000 1.20
+++ CPrederef.pm 27 Dec 2003 12:28:02 -0000 1.21
@@ -27,7 +27,7 @@
sub defines
{
return <<END;
-#define REL_PC ((size_t)(cur_opcode - interpreter->prederef_code))
+#define REL_PC ((size_t)(cur_opcode - interpreter->prederef.code))
#define CUR_OPCODE (interpreter->code->byte_code + REL_PC)
static opcode_t* prederef_to_opcode(struct Parrot_Interp* interpreter,
@@ -35,7 +35,7 @@
{
INTVAL offset_in_ops;
if (prederef_addr == NULL) return NULL;
- offset_in_ops = prederef_addr - interpreter->prederef_code;
+ offset_in_ops = prederef_addr - interpreter->prederef.code;
return (opcode_t*) interpreter->code->byte_code + offset_in_ops;
}
@@ -45,7 +45,7 @@
INTVAL offset_in_ops;
if (opcode_addr == NULL) return NULL;
offset_in_ops = opcode_addr - (opcode_t*) interpreter->code->byte_code;
- return interpreter->prederef_code + offset_in_ops;
+ return interpreter->prederef.code + offset_in_ops;
}
END
1.8 +3 -3 parrot/lib/Parrot/OpTrans/CSwitch.pm
Index: CSwitch.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/OpTrans/CSwitch.pm,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -w -r1.7 -r1.8
--- CSwitch.pm 18 Dec 2003 16:15:03 -0000 1.7
+++ CSwitch.pm 27 Dec 2003 12:28:02 -0000 1.8
@@ -6,7 +6,7 @@
#
# Author: leo
#
-# $Id: CSwitch.pm,v 1.7 2003/12/18 16:15:03 leo Exp $
+# $Id: CSwitch.pm,v 1.8 2003/12/27 12:28:02 leo Exp $
#
use strict;
@@ -37,7 +37,7 @@
sub defines
{
return <<END;
-#define REL_PC ((size_t)((opcode_t*)cur_opcode -
(opcode_t*)interpreter->prederef_code))
+#define REL_PC ((size_t)((opcode_t*)cur_opcode -
(opcode_t*)interpreter->prederef.code))
#define CUR_OPCODE (interpreter->code->byte_code + REL_PC)
@@ -47,7 +47,7 @@
INTVAL offset_in_ops;
if (opcode_addr == NULL) return NULL;
offset_in_ops = opcode_addr - (opcode_t*) interpreter->code->byte_code;
- return interpreter->prederef_code + offset_in_ops;
+ return interpreter->prederef.code + offset_in_ops;
}
END
1.46 +2 -2 parrot/src/exceptions.c
Index: exceptions.c
===================================================================
RCS file: /cvs/public/parrot/src/exceptions.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -w -r1.45 -r1.46
--- exceptions.c 14 Dec 2003 12:55:26 -0000 1.45
+++ exceptions.c 27 Dec 2003 12:28:09 -0000 1.46
@@ -1,7 +1,7 @@
/* exceptions.c
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: exceptions.c,v 1.45 2003/12/14 12:55:26 leo Exp $
+ * $Id: exceptions.c,v 1.46 2003/12/27 12:28:09 leo Exp $
* Overview:
* define the internal interpreter exceptions
* Data Structure and Algorithms:
@@ -273,7 +273,7 @@
case PARROT_PREDEREF_CORE:
case PARROT_SWITCH_CORE:
case PARROT_CGP_CORE:
- offset = (void **)dest - interpreter->prederef_code;
+ offset = (void **)dest - interpreter->prederef.code;
default:
offset = dest - interpreter->code->byte_code;
}
1.248 +14 -13 parrot/src/interpreter.c
Index: interpreter.c
===================================================================
RCS file: /cvs/public/parrot/src/interpreter.c,v
retrieving revision 1.247
retrieving revision 1.248
diff -u -w -r1.247 -r1.248
--- interpreter.c 27 Dec 2003 11:40:55 -0000 1.247
+++ interpreter.c 27 Dec 2003 12:28:09 -0000 1.248
@@ -1,7 +1,7 @@
/* interpreter.c
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: interpreter.c,v 1.247 2003/12/27 11:40:55 leo Exp $
+ * $Id: interpreter.c,v 1.248 2003/12/27 12:28:09 leo Exp $
* Overview:
* The interpreter api handles running the operations
* Data Structure and Algorithms:
@@ -150,7 +150,7 @@
void
do_prederef(void **pc_prederef, Parrot_Interp interpreter, int type)
{
- size_t offset = pc_prederef - interpreter->prederef_code;
+ size_t offset = pc_prederef - interpreter->prederef.code;
opcode_t *pc = ((opcode_t *)interpreter->code->byte_code) + offset;
op_func_t *prederef_op_func = interpreter->op_lib->op_func_table;
@@ -234,14 +234,14 @@
/*=for api interpreter init_prederef
*
- * initialize: load prederef func_table, file prederef_code
+ * initialize: load prederef func_table, file prederef.code
*
*/
static void
init_prederef(struct Parrot_Interp *interpreter, int which)
{
load_prederef(interpreter, which);
- if (!interpreter->prederef_code) {
+ if (!interpreter->prederef.code) {
size_t N = interpreter->code->cur_cs->base.size;
size_t i;
void *pred_func;
@@ -263,8 +263,8 @@
temp[i] = pred_func;
}
- interpreter->prederef_code = temp;
- interpreter->code->cur_cs->prederef_code = temp;
+ interpreter->prederef.code = temp;
+ interpreter->code->cur_cs->prederef.code = temp;
}
}
@@ -294,15 +294,15 @@
{
load_prederef(interpreter, PARROT_CGP_CORE);
- if (!interpreter->prederef_code) {
+ if (!interpreter->prederef.code) {
size_t N = interpreter->code->cur_cs->base.size;
size_t i;
size_t n;
void **temp = prederef_arena;
opcode_t *pc = interpreter->code->cur_cs->base.data;
- interpreter->prederef_code = temp;
- interpreter->code->cur_cs->prederef_code = temp;
+ interpreter->prederef.code = temp;
+ interpreter->code->cur_cs->prederef.code = temp;
/* TODO */
}
}
@@ -426,7 +426,7 @@
void **pc_prederef;
init_prederef(interpreter, PARROT_PREDEREF_CORE);
- pc_prederef = interpreter->prederef_code + (pc - code_start);
+ pc_prederef = interpreter->prederef.code + (pc - code_start);
while (pc_prederef) {
pc_prederef =
@@ -445,7 +445,7 @@
opcode_t *code_start = (opcode_t *)interpreter->code->byte_code;
void **pc_prederef;
init_prederef(interpreter, PARROT_CGP_CORE);
- pc_prederef = interpreter->prederef_code + (pc - code_start);
+ pc_prederef = interpreter->prederef.code + (pc - code_start);
pc = cgp_core((opcode_t*)pc_prederef, interpreter);
return pc;
#else
@@ -462,7 +462,7 @@
opcode_t *code_start = (opcode_t *)interpreter->code->byte_code;
void **pc_prederef;
init_prederef(interpreter, PARROT_SWITCH_CORE);
- pc_prederef = interpreter->prederef_code + (pc - code_start);
+ pc_prederef = interpreter->prederef.code + (pc - code_start);
pc = switch_core((opcode_t*)pc_prederef, interpreter);
return pc;
}
@@ -992,7 +992,8 @@
SET_NULL_P(interpreter->profile, ProfData *);
/* next two are pointers to the real thing in the current code seg */
- SET_NULL_P(interpreter->prederef_code, void **);
+ SET_NULL_P(interpreter->prederef.code, void **);
+ SET_NULL_P(interpreter->prederef.branches, Prederef_btanch*);
SET_NULL(interpreter->jit_info);
/* register assembler/compilers */
1.127 +13 -5 parrot/src/packfile.c
Index: packfile.c
===================================================================
RCS file: /cvs/public/parrot/src/packfile.c,v
retrieving revision 1.126
retrieving revision 1.127
diff -u -w -r1.126 -r1.127
--- packfile.c 25 Nov 2003 00:31:13 -0000 1.126
+++ packfile.c 27 Dec 2003 12:28:09 -0000 1.127
@@ -7,7 +7,7 @@
** This program is free software. It is subject to the same
** license as Parrot itself.
**
-** $Id: packfile.c,v 1.126 2003/11/25 00:31:13 mrjoltcola Exp $
+** $Id: packfile.c,v 1.127 2003/12/27 12:28:09 leo Exp $
**
** History:
** Rework by Melvin; new bytecode format, make bytecode portable.
@@ -1146,8 +1146,11 @@
#ifdef HAS_JIT
Parrot_destroy_jit(byte_code->jit_info);
#endif
- if (byte_code->prederef_code)
- free(byte_code->prederef_code);
+ if (byte_code->prederef.code) {
+ mem_sys_free(byte_code->prederef.code);
+ if (byte_code->prederef.branches)
+ mem_sys_free(byte_code->prederef.branches);
+ }
}
static struct PackFile_Segment *
@@ -1157,7 +1160,9 @@
byte_code = mem_sys_allocate(sizeof(struct PackFile_ByteCode));
- byte_code->prederef_code = NULL;
+ byte_code->prederef.code = NULL;
+ byte_code->prederef.branches = NULL;
+ byte_code->prederef.n_allocated = 0;
byte_code->jit_info = NULL;
byte_code->prev = NULL;
byte_code->debugs = NULL;
@@ -1306,7 +1311,10 @@
interpreter->code->cur_cs = new_cs;
new_cs->prev = cur_cs;
interpreter->code->byte_code = new_cs->base.data;
- interpreter->prederef_code = new_cs->prederef_code;
+ interpreter->prederef.code = new_cs->prederef.code;
+ interpreter->prederef.branches = new_cs->prederef.branches;
+ interpreter->prederef.n_branches = new_cs->prederef.n_branches;
+ interpreter->prederef.n_allocated= new_cs->prederef.n_allocated;
interpreter->jit_info = new_cs->jit_info;
prepare_for_run(interpreter);
return cur_cs;