This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]