aboutsummaryrefslogtreecommitdiff
path: root/libjava/interpret.cc
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2007-06-15 03:53:52 +0000
committerKeith Seitz <kseitz@gcc.gnu.org>2007-06-15 03:53:52 +0000
commit7dace0ca518e0561b71691938e5402acf58f641c (patch)
tree16c0ed1aafda743e1a3cf2417a076930ebfb39d5 /libjava/interpret.cc
parente89993b3f2085c19cda293fc0476ba2c7da3107d (diff)
downloadgcc-7dace0ca518e0561b71691938e5402acf58f641c.zip
gcc-7dace0ca518e0561b71691938e5402acf58f641c.tar.gz
gcc-7dace0ca518e0561b71691938e5402acf58f641c.tar.bz2
java-interp.h (_Jv_LocalVarTableEntry): Add union for bytecode_pc and direct-threaded pc.
* 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. From-SVN: r125734
Diffstat (limited to 'libjava/interpret.cc')
-rw-r--r--libjava/interpret.cc28
1 files changed, 25 insertions, 3 deletions
diff --git a/libjava/interpret.cc b/libjava/interpret.cc
index 18b4ae0..01a9c38 100644
--- a/libjava/interpret.cc
+++ b/libjava/interpret.cc
@@ -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