diff options
author | Keith Seitz <keiths@redhat.com> | 2007-06-15 03:53:52 +0000 |
---|---|---|
committer | Keith Seitz <kseitz@gcc.gnu.org> | 2007-06-15 03:53:52 +0000 |
commit | 7dace0ca518e0561b71691938e5402acf58f641c (patch) | |
tree | 16c0ed1aafda743e1a3cf2417a076930ebfb39d5 /libjava/interpret.cc | |
parent | e89993b3f2085c19cda293fc0476ba2c7da3107d (diff) | |
download | gcc-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.cc | 28 |
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 |