* include/java-interp.h (_Jv_LocalVarTableEntry): Add union
authorkseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Jun 2007 03:53:52 +0000 (03:53 +0000)
committerkseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Jun 2007 03:53:52 +0000 (03:53 +0000)
        for bytecode_pc and direct-threaded pc.
        Add field descriptions inline.
        * defineclass.cc (read_one_code_attribute): Change from
        bytecode_start_pc to bytecode_pc.
        Remove unused variable "len".
        * interpret.cc (compile): Remap the variable table, too.
        (get_local_var_table) [DIRECT_THREADED]: Use insn_index on the
        start location to map from pc_t to code index.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125734 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/defineclass.cc
libjava/include/java-interp.h
libjava/interpret.cc

index f9efe62..2be24b9 100644 (file)
@@ -1,3 +1,15 @@
+2007-06-14  Keith Seitz  <keiths@redhat.com>
+
+       * include/java-interp.h (_Jv_LocalVarTableEntry): Add union
+       for bytecode_pc and direct-threaded pc.
+       Add field descriptions inline.
+       * defineclass.cc (read_one_code_attribute): Change from
+       bytecode_start_pc to bytecode_pc.
+       Remove unused variable "len".
+       * interpret.cc (compile): Remap the variable table, too.
+       (get_local_var_table) [DIRECT_THREADED]: Use insn_index on the
+       start location to map from pc_t to code index.
+
 2007-06-09  Keith Seitz  <keiths@redhat.com>
 
        * testsuite/libjava.jvmti/dummyagent.c (Agent_OnLoad):
index 0f0da77..2024fb6 100644 (file)
@@ -1009,11 +1009,10 @@ void _Jv_ClassReader::read_one_code_attribute (int method_index)
                                
       for (int i = 0; i < table_len; i++)
         {
-          table[i].bytecode_start_pc = read2u ();
+          table[i].bytecode_pc = read2u ();
           table[i].length = read2u ();
-          int len;
-          len = pool_Utf8_to_char_arr (read2u (), &table[i].name);
-          len = pool_Utf8_to_char_arr (read2u (), &table[i].descriptor);
+          pool_Utf8_to_char_arr (read2u (), &table[i].name);
+          pool_Utf8_to_char_arr (read2u (), &table[i].descriptor);
           table[i].slot = read2u ();
           
           if (table[i].slot > method->max_locals || table[i].slot < 0)
index 204a49f..f0b77f9 100644 (file)
@@ -138,17 +138,27 @@ struct  _Jv_LineTableEntry
 };
 
 // This structure holds local variable information.
-// The pc value is the first pc where the variable must have a value and it
-// must continue to have a value until (start_pc + length).
-// The name is the variable name, and the descriptor contains type information.
-// The slot is the index in the local variable array of this method, long and
-// double occupy slot and slot+1.
+// Like _Jv_LineTableEntry above, it is remapped when the method is
+// compiled for direct threading.
 struct _Jv_LocalVarTableEntry
 {
-  int bytecode_start_pc;
+  // First PC value at which variable is live
+  union
+  {
+    pc_t pc;
+    int bytecode_pc;
+  };
+
+  // length of visibility of variable
   int length;
+
+  // variable name
   char *name;
+
+  // type description
   char *descriptor;
+
+  // stack slot number (long and double occupy slot and slot + 1)
   int slot;
 };
 
index 18b4ae0..01a9c38 100644 (file)
@@ -947,6 +947,25 @@ _Jv_InterpMethod::compile (const void * const *insn_targets)
 
   prepared = insns;
 
+  // Now remap the variable table for this method.
+  for (int i = 0; i < local_var_table_len; ++i)
+    {
+      int start_byte = local_var_table[i].bytecode_pc;
+      if (start_byte < 0 || start_byte >= code_length)
+       start_byte = 0;
+      jlocation start =  pc_mapping[start_byte];
+
+      int end_byte = start_byte + local_var_table[i].length;
+      if (end_byte < 0)
+       end_byte = 0;
+      jlocation end = ((end_byte >= code_length)
+                      ? number_insn_slots
+                      : pc_mapping[end_byte]);
+
+      local_var_table[i].pc = &insns[start];
+      local_var_table[i].length = end - start + 1;
+    }
+  
   if (breakpoint_insn == NULL)
     {
       bp_insn_slot.insn = const_cast<void *> (insn_targets[op_breakpoint]);
@@ -1526,12 +1545,15 @@ _Jv_InterpMethod::get_local_var_table (char **name, char **sig,
       *sig = local_var_table[table_slot].descriptor;
       *generic_sig = local_var_table[table_slot].descriptor;
 
-      *startloc = static_cast<jlong> 
-                    (local_var_table[table_slot].bytecode_start_pc);
+#ifdef DIRECT_THREADED
+      *startloc = insn_index (local_var_table[table_slot].pc);
+#else
+      *startloc = static_cast<jlong> (local_var_table[table_slot].bytecode_pc);
+#endif
       *length = static_cast<jint> (local_var_table[table_slot].length);
       *slot = static_cast<jint> (local_var_table[table_slot].slot);
     }
-  return local_var_table_len - table_slot -1;
+  return local_var_table_len - table_slot - 1;
 }
 
 pc_t