代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/openjdk-1.8.0 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 39f5104db20a569e361c0300756e35ab7e6ac296 Mon Sep 17 00:00:00 2001
From: eapen <zhangyipeng7@huawei.com>
Date: Fri, 16 Dec 2022 16:06:02 +0000
Subject: [PATCH 30/33] I68TO2: 8140594: Various minor code improvements (compiler)
---
hotspot/src/os/linux/vm/os_linux.cpp | 5 +-
hotspot/src/os/linux/vm/vmError_linux.cpp | 16 ++---
hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp | 2 +-
hotspot/src/share/vm/adlc/formssel.cpp | 13 ++--
hotspot/src/share/vm/c1/c1_LinearScan.cpp | 7 +-
hotspot/src/share/vm/classfile/classFileParser.cpp | 11 +--
.../src/share/vm/classfile/systemDictionary.cpp | 6 +-
hotspot/src/share/vm/compiler/compileBroker.cpp | 84 +++++++---------------
hotspot/src/share/vm/compiler/compileBroker.hpp | 11 +--
hotspot/src/share/vm/compiler/compileLog.cpp | 3 +-
hotspot/src/share/vm/compiler/disassembler.cpp | 6 +-
hotspot/src/share/vm/oops/generateOopMap.cpp | 8 ++-
hotspot/src/share/vm/opto/block.cpp | 2 +-
hotspot/src/share/vm/opto/graphKit.cpp | 2 +-
hotspot/src/share/vm/opto/matcher.cpp | 9 ++-
hotspot/src/share/vm/runtime/relocator.cpp | 4 +-
16 files changed, 84 insertions(+), 105 deletions(-)
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index ab28ee3..b82352c 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -2159,9 +2159,10 @@ static bool _print_ascii_file(const char* filename, outputStream* st) {
return false;
}
- char buf[32];
+ char buf[33];
int bytes;
- while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
+ buf[32] = '\0';
+ while ((bytes = ::read(fd, buf, sizeof(buf) - 1)) > 0) {
st->print_raw(buf, bytes);
}
diff --git a/hotspot/src/os/linux/vm/vmError_linux.cpp b/hotspot/src/os/linux/vm/vmError_linux.cpp
index fca239c..52ca40b 100644
--- a/hotspot/src/os/linux/vm/vmError_linux.cpp
+++ b/hotspot/src/os/linux/vm/vmError_linux.cpp
@@ -42,19 +42,19 @@ void VMError::show_message_box(char *buf, int buflen) {
char *p = &buf[len];
jio_snprintf(p, buflen - len,
- "\n\n"
- "Do you want to debug the problem?\n\n"
- "To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " UINTX_FORMAT " (" INTPTR_FORMAT ")\n"
- "Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
- "Otherwise, press RETURN to abort...",
- os::current_process_id(), os::current_process_id(),
- os::current_thread_id(), os::current_thread_id());
+ "\n\n"
+ "Do you want to debug the problem?\n\n"
+ "To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " UINTX_FORMAT " (" INTPTR_FORMAT ")\n"
+ "Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
+ "Otherwise, press RETURN to abort...",
+ os::current_process_id(), os::current_process_id(),
+ os::current_thread_id(), os::current_thread_id());
yes = os::message_box("Unexpected Error", buf);
if (yes) {
// yes, user asked VM to launch debugger
- jio_snprintf(buf, buflen, "gdb /proc/%d/exe %d",
+ jio_snprintf(buf, sizeof(char)*buflen, "gdb /proc/%d/exe %d",
os::current_process_id(), os::current_process_id());
os::fork_and_exec(buf);
diff --git a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
index 4775dc8..fba3d28 100644
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
@@ -813,7 +813,7 @@ void os::print_context(outputStream *st, void *context) {
intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
- print_hex_dump(st, (address)sp, (address)(sp + 8*sizeof(intptr_t)), sizeof(intptr_t));
+ print_hex_dump(st, (address)sp, (address)(sp + 8), sizeof(intptr_t));
st->cr();
// Note: it may be unsafe to inspect memory near pc. For example, pc may
diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp
index 23fa1bb..6d57ff2 100644
--- a/hotspot/src/share/vm/adlc/formssel.cpp
+++ b/hotspot/src/share/vm/adlc/formssel.cpp
@@ -1496,7 +1496,8 @@ void MachNodeForm::output(FILE *fp) {
// twice, we need to check that the operands are pointer-eequivalent in
// the DFA during the labeling process.
Predicate *InstructForm::build_predicate() {
- char buf[1024], *s=buf;
+ const int buflen = 1024;
+ char buf[buflen], *s=buf;
Dict names(cmpstr,hashstr,Form::arena); // Map Names to counts
MatchNode *mnode =
@@ -1505,12 +1506,12 @@ Predicate *InstructForm::build_predicate() {
uint first = 1;
// Start with the predicate supplied in the .ad file.
- if( _predicate ) {
- if( first ) first=0;
- strcpy(s,"("); s += strlen(s);
- strcpy(s,_predicate->_pred);
+ if(_predicate) {
+ if(first) first = 0;
+ strcpy(s, "("); s += strlen(s);
+ strncpy(s, _predicate->_pred, buflen - strlen(s) - 1);
s += strlen(s);
- strcpy(s,")"); s += strlen(s);
+ strcpy(s, ")"); s += strlen(s);
}
for( DictI i(&names); i.test(); ++i ) {
uintptr_t cnt = (uintptr_t)i._value;
diff --git a/hotspot/src/share/vm/c1/c1_LinearScan.cpp b/hotspot/src/share/vm/c1/c1_LinearScan.cpp
index ec4a67e..d754aa9 100644
--- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp
@@ -5484,7 +5484,7 @@ int LinearScanWalker::find_locked_double_reg(int reg_needed_until, int interval_
}
}
- if (_block_pos[max_reg] <= interval_to || _block_pos[max_reg + 1] <= interval_to) {
+ if (max_reg != any_reg && (_block_pos[max_reg] <= interval_to || _block_pos[max_reg + 1] <= interval_to)) {
*need_split = true;
}
@@ -6443,8 +6443,9 @@ void LinearScanStatistic::print(const char* title) {
if (_counters_sum[i] > 0 || _counters_max[i] >= 0) {
tty->print("%25s: %8d", counter_name(i), _counters_sum[i]);
- if (base_counter(i) != invalid_counter) {
- tty->print(" (%5.1f%%) ", _counters_sum[i] * 100.0 / _counters_sum[base_counter(i)]);
+ LinearScanStatistic::Counter cntr = base_counter(i);
+ if (cntr != invalid_counter) {
+ tty->print(" (%5.1f%%) ", _counters_sum[i] * 100.0 / _counters_sum[cntr]);
} else {
tty->print(" ");
}
diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp
index 51ab4f5..d8e99e6 100644
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp
@@ -1085,9 +1085,11 @@ class FieldAllocationCount: public ResourceObj {
FieldAllocationType update(bool is_static, BasicType type) {
FieldAllocationType atype = basic_type_to_atype(is_static, type);
- // Make sure there is no overflow with injected fields.
- assert(count[atype] < 0xFFFF, "More than 65535 fields");
- count[atype]++;
+ if (atype != BAD_ALLOCATION_TYPE) {
+ // Make sure there is no overflow with injected fields.
+ assert(count[atype] < 0xFFFF, "More than 65535 fields");
+ count[atype]++;
+ }
return atype;
}
};
@@ -3087,8 +3089,9 @@ void ClassFileParser::parse_classfile_attributes(ClassFileParser::ClassAnnotatio
}
} else if (tag == vmSymbols::tag_bootstrap_methods() &&
_major_version >= Verifier::INVOKEDYNAMIC_MAJOR_VERSION) {
- if (parsed_bootstrap_methods_attribute)
+ if (parsed_bootstrap_methods_attribute) {
classfile_parse_error("Multiple BootstrapMethods attributes in class file %s", CHECK);
+ }
parsed_bootstrap_methods_attribute = true;
parse_classfile_bootstrap_methods_attribute(attribute_length, CHECK);
} else if (tag == vmSymbols::tag_runtime_visible_type_annotations()) {
diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp
index d02ed31..9089a76 100644
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp
@@ -1195,10 +1195,10 @@ Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
while ((index = strchr(name, '/')) != NULL) {
*index = '.'; // replace '/' with '.' in package name
}
- const char* fmt = "Prohibited package name: %s";
- size_t len = strlen(fmt) + strlen(name);
+ const char* msg_text = "Prohibited package name: ";
+ size_t len = strlen(msg_text) + strlen(name) + 1;
char* message = NEW_RESOURCE_ARRAY(char, len);
- jio_snprintf(message, len, fmt, name);
+ jio_snprintf(message, len, "%s%s", msg_text, name);
Exceptions::_throw_msg(THREAD_AND_LOCATION,
vmSymbols::java_lang_SecurityException(), message);
}
diff --git a/hotspot/src/share/vm/compiler/compileBroker.cpp b/hotspot/src/share/vm/compiler/compileBroker.cpp
index 0e9af0d..7963625 100644
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp
@@ -136,11 +136,6 @@ AbstractCompiler* CompileBroker::_compilers[2];
volatile jint CompileBroker::_compilation_id = 0;
volatile jint CompileBroker::_osr_compilation_id = 0;
-// Debugging information
-int CompileBroker::_last_compile_type = no_compile;
-int CompileBroker::_last_compile_level = CompLevel_none;
-char CompileBroker::_last_method_compiled[CompileBroker::name_buffer_length];
-
// Performance counters
PerfCounter* CompileBroker::_perf_total_compilation = NULL;
PerfCounter* CompileBroker::_perf_osr_compilation = NULL;
@@ -882,8 +877,6 @@ CompilerCounters::CompilerCounters(const char* thread_name, int instance, TRAPS)
//
// Initialize the Compilation object
void CompileBroker::compilation_init() {
- _last_method_compiled[0] = '\0';
-
// No need to initialize compilation system if we do not use it.
if (!UseCompiler) {
return;
@@ -1964,8 +1957,10 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
}
assert(!method->is_native(), "no longer compile natives");
- // Save information about this method in case of failure.
- set_last_compile(thread, method, is_osr, task_level);
+ // Update compile information when using perfdata.
+ if (UsePerfData) {
+ update_compile_perf_data(thread, method, is_osr);
+ }
DTRACE_METHOD_COMPILE_BEGIN_PROBE(method, compiler_name(task_level));
}
@@ -2180,52 +2175,44 @@ void CompileBroker::handle_full_code_cache() {
// CompileBroker::set_last_compile
//
// Record this compilation for debugging purposes.
-void CompileBroker::set_last_compile(CompilerThread* thread, methodHandle method, bool is_osr, int comp_level) {
+void CompileBroker::update_compile_perf_data(CompilerThread* thread, const methodHandle& method, bool is_osr) {
ResourceMark rm;
char* method_name = method->name()->as_C_string();
- strncpy(_last_method_compiled, method_name, CompileBroker::name_buffer_length);
- _last_method_compiled[CompileBroker::name_buffer_length - 1] = '\0'; // ensure null terminated
char current_method[CompilerCounters::cmname_buffer_length];
size_t maxLen = CompilerCounters::cmname_buffer_length;
- if (UsePerfData) {
- const char* class_name = method->method_holder()->name()->as_C_string();
+ const char* class_name = method->method_holder()->name()->as_C_string();
- size_t s1len = strlen(class_name);
- size_t s2len = strlen(method_name);
+ size_t s1len = strlen(class_name);
+ size_t s2len = strlen(method_name);
- // check if we need to truncate the string
- if (s1len + s2len + 2 > maxLen) {
+ // check if we need to truncate the string
+ if (s1len + s2len + 2 > maxLen) {
- // the strategy is to lop off the leading characters of the
- // class name and the trailing characters of the method name.
+ // the strategy is to lop off the leading characters of the
+ // class name and the trailing characters of the method name.
- if (s2len + 2 > maxLen) {
- // lop of the entire class name string, let snprintf handle
- // truncation of the method name.
- class_name += s1len; // null string
- }
- else {
- // lop off the extra characters from the front of the class name
- class_name += ((s1len + s2len + 2) - maxLen);
- }
+ if (s2len + 2 > maxLen) {
+ // lop of the entire class name string, let snprintf handle
+ // truncation of the method name.
+ class_name += s1len; // null string
+ }
+ else {
+ // lop off the extra characters from the front of the class name
+ class_name += ((s1len + s2len + 2) - maxLen);
}
-
- jio_snprintf(current_method, maxLen, "%s %s", class_name, method_name);
}
+ jio_snprintf(current_method, maxLen, "%s %s", class_name, method_name);
+
+ int last_compile_type = normal_compile;
if (CICountOSR && is_osr) {
- _last_compile_type = osr_compile;
- } else {
- _last_compile_type = normal_compile;
+ last_compile_type = normal_compile;
}
- _last_compile_level = comp_level;
- if (UsePerfData) {
- CompilerCounters* counters = thread->counters();
- counters->set_current_method(current_method);
- counters->set_compile_type((jlong)_last_compile_type);
- }
+ CompilerCounters* counters = thread->counters();
+ counters->set_current_method(current_method);
+ counters->set_compile_type((jlong) last_compile_type);
}
@@ -2417,23 +2404,6 @@ void CompileBroker::print_times() {
tty->print_cr(" nmethod total size : %6d bytes", CompileBroker::_sum_nmethod_size);
}
-// Debugging output for failure
-void CompileBroker::print_last_compile() {
- if ( _last_compile_level != CompLevel_none &&
- compiler(_last_compile_level) != NULL &&
- _last_method_compiled != NULL &&
- _last_compile_type != no_compile) {
- if (_last_compile_type == osr_compile) {
- tty->print_cr("Last parse: [osr]%d+++(%d) %s",
- _osr_compilation_id, _last_compile_level, _last_method_compiled);
- } else {
- tty->print_cr("Last parse: %d+++(%d) %s",
- _compilation_id, _last_compile_level, _last_method_compiled);
- }
- }
-}
-
-
void CompileBroker::print_compiler_threads_on(outputStream* st) {
#ifndef PRODUCT
st->print_cr("Compiler thread printing unimplemented.");
diff --git a/hotspot/src/share/vm/compiler/compileBroker.hpp b/hotspot/src/share/vm/compiler/compileBroker.hpp
index 16e0ba3..96d5e81 100644
--- a/hotspot/src/share/vm/compiler/compileBroker.hpp
+++ b/hotspot/src/share/vm/compiler/compileBroker.hpp
@@ -265,7 +265,7 @@ class CompileBroker: AllStatic {
name_buffer_length = 100
};
- // Compile type Information for print_last_compile() and CompilerCounters
+ // Compile type Information for CompilerCounters
enum { no_compile, normal_compile, osr_compile, native_compile };
static int assign_compile_id (methodHandle method, int osr_bci);
@@ -284,10 +284,6 @@ class CompileBroker: AllStatic {
static volatile jint _compilation_id;
static volatile jint _osr_compilation_id;
- static int _last_compile_type;
- static int _last_compile_level;
- static char _last_method_compiled[name_buffer_length];
-
static CompileQueue* _c2_compile_queue;
static CompileQueue* _c1_compile_queue;
@@ -356,7 +352,7 @@ class CompileBroker: AllStatic {
static void wait_for_completion(CompileTask* task);
static void invoke_compiler_on_method(CompileTask* task);
- static void set_last_compile(CompilerThread *thread, methodHandle method, bool is_osr, int comp_level);
+ static void update_compile_perf_data(CompilerThread *thread, const methodHandle& method, bool is_osr);
static void push_jni_handle_block();
static void pop_jni_handle_block();
static bool check_break_at(methodHandle method, int compile_id, bool is_osr);
@@ -454,9 +450,6 @@ class CompileBroker: AllStatic {
// Print a detailed accounting of compilation time
static void print_times();
- // Debugging output for failure
- static void print_last_compile();
-
static void print_compiler_threads_on(outputStream* st);
// compiler name for debugging
diff --git a/hotspot/src/share/vm/compiler/compileLog.cpp b/hotspot/src/share/vm/compiler/compileLog.cpp
index 0637fd0..7dd9b46 100644
--- a/hotspot/src/share/vm/compiler/compileLog.cpp
+++ b/hotspot/src/share/vm/compiler/compileLog.cpp
@@ -221,7 +221,8 @@ void CompileLog::finish_log_on_error(outputStream* file, char* buf, int buflen)
// Copy any remaining data inside a quote:
bool saw_slop = false;
int end_cdata = 0; // state machine [0..2] watching for too many "]]"
- while ((nr = read(partial_fd, buf, buflen)) > 0) {
+ while ((nr = read(partial_fd, buf, buflen-1)) > 0) {
+ buf[buflen-1] = '\0';
if (!saw_slop) {
file->print_raw_cr("<fragment>");
file->print_raw_cr("<![CDATA[");
diff --git a/hotspot/src/share/vm/compiler/disassembler.cpp b/hotspot/src/share/vm/compiler/disassembler.cpp
index dfdd5f7..063f86a 100644
--- a/hotspot/src/share/vm/compiler/disassembler.cpp
+++ b/hotspot/src/share/vm/compiler/disassembler.cpp
@@ -92,7 +92,7 @@ bool Disassembler::load_library() {
const char* p = strrchr(buf, *os::file_separator());
if (p != NULL) lib_offset = p - base + 1;
p = strstr(p ? p : base, "jvm");
- if (p != NULL) jvm_offset = p - base;
+ if (p != NULL) jvm_offset = p - base;
}
// Find the disassembler shared library.
// Search for several paths derived from libjvm, in this order:
@@ -105,13 +105,13 @@ bool Disassembler::load_library() {
strcpy(&buf[jvm_offset], hsdis_library_name);
strcat(&buf[jvm_offset], os::dll_file_extension());
_library = os::dll_load(buf, ebuf, sizeof ebuf);
- if (_library == NULL) {
+ if (_library == NULL && lib_offset >= 0) {
// 2. <home>/jre/lib/<arch>/<vm>/hsdis-<arch>.so
strcpy(&buf[lib_offset], hsdis_library_name);
strcat(&buf[lib_offset], os::dll_file_extension());
_library = os::dll_load(buf, ebuf, sizeof ebuf);
}
- if (_library == NULL) {
+ if (_library == NULL && lib_offset > 0) {
// 3. <home>/jre/lib/<arch>/hsdis-<arch>.so
buf[lib_offset - 1] = '\0';
const char* p = strrchr(buf, *os::file_separator());
diff --git a/hotspot/src/share/vm/oops/generateOopMap.cpp b/hotspot/src/share/vm/oops/generateOopMap.cpp
index bb951f8..8452f96 100644
--- a/hotspot/src/share/vm/oops/generateOopMap.cpp
+++ b/hotspot/src/share/vm/oops/generateOopMap.cpp
@@ -1684,7 +1684,13 @@ void GenerateOopMap::ppdupswap(int poplen, const char *out) {
assert(poplen < 5, "this must be less than length of actual vector");
// pop all arguments
- for(int i = 0; i < poplen; i++) actual[i] = pop();
+ for (int i = 0; i < poplen; i++) {
+ actual[i] = pop();
+ }
+ // Field _state is uninitialized when calling push.
+ for (int i = poplen; i < 5; i++) {
+ actual[i] = CellTypeState::uninit;
+ }
// put them back
char push_ch = *out++;
diff --git a/hotspot/src/share/vm/opto/block.cpp b/hotspot/src/share/vm/opto/block.cpp
index 245ce42..1789d49 100644
--- a/hotspot/src/share/vm/opto/block.cpp
+++ b/hotspot/src/share/vm/opto/block.cpp
@@ -1430,7 +1430,7 @@ void PhaseBlockLayout::find_edges() {
if (n->num_preds() != 1) break;
i++;
- assert(n = _cfg.get_block(i), "expecting next block");
+ assert(n == _cfg.get_block(i), "expecting next block");
tr->append(n);
uf->map(n->_pre_order, tr->id());
traces[n->_pre_order] = NULL;
diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp
index f7c1009..dfadd3e 100644
--- a/hotspot/src/share/vm/opto/graphKit.cpp
+++ b/hotspot/src/share/vm/opto/graphKit.cpp
@@ -1074,7 +1074,7 @@ bool GraphKit::compute_stack_effects(int& inputs, int& depth) {
case Bytecodes::_freturn:
case Bytecodes::_dreturn:
case Bytecodes::_areturn:
- assert(rsize = -depth, "");
+ assert(rsize == -depth, "");
inputs = rsize;
break;
diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp
index b26015c..11e11e0 100644
--- a/hotspot/src/share/vm/opto/matcher.cpp
+++ b/hotspot/src/share/vm/opto/matcher.cpp
@@ -659,11 +659,14 @@ void Matcher::Fixup_Save_On_Entry( ) {
uint reth_edge_cnt = TypeFunc::Parms+1;
RegMask *reth_rms = init_input_masks( reth_edge_cnt + soe_cnt, _return_addr_mask, c_frame_ptr_mask );
// Rethrow takes exception oop only, but in the argument 0 slot.
- reth_rms[TypeFunc::Parms] = mreg2regmask[find_receiver(false)];
+ OptoReg::Name reg = find_receiver(false);
+ if (reg >= 0) {
+ reth_rms[TypeFunc::Parms] = mreg2regmask[reg];
#ifdef _LP64
- // Need two slots for ptrs in 64-bit land
- reth_rms[TypeFunc::Parms].Insert(OptoReg::add(OptoReg::Name(find_receiver(false)),1));
+ // Need two slots for ptrs in 64-bit land
+ reth_rms[TypeFunc::Parms].Insert(OptoReg::add(OptoReg::Name(reg), 1));
#endif
+ }
// Input RegMask array shared by all TailCalls
uint tail_call_edge_cnt = TypeFunc::Parms+2;
diff --git a/hotspot/src/share/vm/runtime/relocator.cpp b/hotspot/src/share/vm/runtime/relocator.cpp
index 450bcf2..2bbb8db 100644
--- a/hotspot/src/share/vm/runtime/relocator.cpp
+++ b/hotspot/src/share/vm/runtime/relocator.cpp
@@ -612,8 +612,8 @@ bool Relocator::relocate_code(int bci, int ilen, int delta) {
// In case we have shrunken a tableswitch/lookupswitch statement, we store the last
// bytes that get overwritten. We have to copy the bytes after the change_jumps method
// has been called, since it is likly to update last offset in a tableswitch/lookupswitch
- if (delta < 0) {
- assert(delta>=-3, "we cannot overwrite more than 3 bytes");
+ assert(delta >= -3, "We cannot overwrite more than 3 bytes.");
+ if (delta < 0 && delta >= -3) {
memcpy(_overwrite, addr_at(bci + ilen + delta), -delta);
}
--
1.8.3.1
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。