This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[RFA] Fix bytecode interpreter bitrot
- From: Keith Seitz <keiths at redhat dot com>
- To: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: Thu, 28 Sep 2006 12:09:17 -0700
- Subject: [RFA] Fix bytecode interpreter bitrot
Hi,
I don't know if anybody actually uses the bytecode interpreter anymore,
but since we do have all the code lurking in the sources somewhere, it
would be nice to keep it working.
It seems that over the past months, several bugs have found their way
into the BC interpreter. I believe this patch fixes those problems.
Keith
ChangeLog
2006-09-28 Keith Seitz <keiths@redhat.com>
* include/java-interp.h (prepared): Change type to pc_t.
(insn_index): Define for both DIRECT_THREADED and bytecode
interpreters.
* interpret.cc [!DIRECT_THREADED] (POKEI): Fix typo.
(insn_index): Implement for bytecode interpreter.
* interpret-run.cc [!DIRECT_THREADED] (AVAL1U): Add _Jv_Linker
class
qualifier to resolve_pool_entry.
[!DIRECT_THREADED] (AVAL2U): Likewise.
[!DIRECT_THREADED] bytecode() cannot be called without an object.
Changed all typos.
[!DIRECT_THREADED] Likewise for defining_class.
Index: include/java-interp.h
===================================================================
--- include/java-interp.h (revision 117093)
+++ include/java-interp.h (working copy)
@@ -144,7 +144,7 @@
int line_table_len;
_Jv_LineTableEntry *line_table;
- void *prepared;
+ pc_t prepared;
int number_insn_slots;
unsigned char* bytecode ()
@@ -191,13 +191,9 @@
// number info is unavailable.
int get_source_line(pc_t mpc);
-
-
-#ifdef DIRECT_THREADED
// Convenience function for indexing bytecode PC/insn slots in
// line tables for JDWP
jlong insn_index (pc_t pc);
-#endif
public:
Index: interpret.cc
===================================================================
--- interpret.cc (revision 117093)
+++ interpret.cc (working copy)
@@ -200,7 +200,7 @@
#define PEEKA(I) (locals+(I))->o
#define POKEI(I,V) \
-DEBUG_LOCALS_INSN(I,i) \
+DEBUG_LOCALS_INSN(I,'i'); \
((locals+(I))->i = (V))
@@ -1307,23 +1307,27 @@
return self->ncode;
}
-#ifdef DIRECT_THREADED
/* Find the index of the given insn in the array of insn slots
for this method. Returns -1 if not found. */
jlong
_Jv_InterpMethod::insn_index (pc_t pc)
{
jlong left = 0;
+#ifdef DIRECT_THREADED
jlong right = number_insn_slots;
- insn_slot* slots = reinterpret_cast<insn_slot*> (prepared);
+ pc_t insns = prepared;
+#else
+ jlong right = code_length;
+ pc_t insns = bytecode ();
+#endif
while (right >= 0)
{
jlong mid = (left + right) / 2;
- if (&slots[mid] == pc)
+ if (&insns[mid] == pc)
return mid;
- if (pc < &slots[mid])
+ if (pc < &insns[mid])
right = mid - 1;
else
left = mid + 1;
@@ -1331,7 +1335,6 @@
return -1;
}
-#endif // DIRECT_THREADED
void
_Jv_InterpMethod::get_line_table (jlong& start, jlong& end,
Index: interpret-run.cc
===================================================================
--- interpret-run.cc (revision 117093)
+++ interpret-run.cc (working copy)
@@ -291,10 +291,10 @@
// class'.
#define AVAL1U() \
({ int index = get1u (pc++); \
- resolve_pool_entry (meth->defining_class, index).o; })
+ _Jv_Linker::resolve_pool_entry (meth->defining_class, index).o; })
#define AVAL2U() \
({ int index = get2u (pc); pc += 2; \
- resolve_pool_entry (meth->defining_class, index).o; })
+ _Jv_Linker::resolve_pool_entry (meth->defining_class, index).o; })
// Note that we don't need to resolve the pool entry here as class
// constants are never wide.
#define AVAL2UP() ({ int index = get2u (pc); pc += 2; &pool_data[index]; })
@@ -303,7 +303,7 @@
#define PCVAL(unionval) unionval.i
#define AMPAMP(label) NULL
- pc = bytecode ();
+ pc = meth->bytecode ();
#endif /* DIRECT_THREADED */
@@ -1545,7 +1545,7 @@
pc_t base_pc = pc - 1;
int index = POPI ();
- pc_t base = (pc_t) bytecode ();
+ pc_t base = (pc_t) meth->bytecode ();
while ((pc - base) % 4 != 0)
++pc;
@@ -1601,7 +1601,7 @@
unsigned char *base_pc = pc-1;
int index = POPI();
- unsigned char* base = bytecode ();
+ unsigned char* base = meth->bytecode ();
while ((pc-base) % 4 != 0)
++pc;
@@ -2469,7 +2469,7 @@
#ifdef DIRECT_THREADED
void *logical_pc = (void *) ((insn_slot *) pc - 1);
#else
- int logical_pc = pc - 1 - bytecode ();
+ int logical_pc = pc - 1 - meth->bytecode ();
#endif
_Jv_InterpException *exc = meth->exceptions ();
jclass exc_class = ex->getClass ();
@@ -2484,8 +2484,8 @@
#else
jclass handler = NULL;
if (exc[i].handler_type.i != 0)
- handler = (_Jv_Linker::resolve_pool_entry (defining_class,
- exc[i].handler_type.i)).clazz;
+ handler = (_Jv_Linker::resolve_pool_entry (meth->defining_class,
+ exc[i].handler_type.i)).clazz;
#endif /* DIRECT_THREADED */
if (handler == NULL || handler->isAssignableFrom (exc_class))
@@ -2494,7 +2494,7 @@
#ifdef DIRECT_THREADED
pc = (insn_slot *) exc[i].handler_pc.p;
#else
- pc = bytecode () + exc[i].handler_pc.i;
+ pc = meth->bytecode () + exc[i].handler_pc.i;
#endif /* DIRECT_THREADED */
sp = stack;
sp++->o = ex; // Push exception.