8010770: Zero: back port of 8000780 to HS24 broke JSR 292
Reviewed-by: kvn, twisti
diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
index fda302c..237d329 100644
--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
@@ -2173,12 +2173,13 @@
// This kind of CP cache entry does not need to match the flags byte, because
// there is a 1-1 relation between bytecode type and CP entry type.
ConstantPoolCacheEntry* cache = cp->entry_at(index);
- oop result = cache->f1_as_instance();
- if (result == NULL) {
+ if (cache->f1_as_instance() == NULL) {
CALL_VM(InterpreterRuntime::resolve_ldc(THREAD, (Bytecodes::Code) opcode),
handle_exception);
- result = cache->f1_as_instance();
+ // GC might move cache while returning from VM call.
+ cache = cp->entry_at(index); // reload
}
+ oop result = cache->f1_as_instance();
VERIFY_OOP(result);
SET_STACK_OBJECT(result, 0);
@@ -2197,23 +2198,19 @@
u4 index = Bytes::get_native_u4(pc+1);
ConstantPoolCacheEntry* cache = cp->secondary_entry_at(index);
- oop result = cache->f1_as_instance();
// We are resolved if the f1 field contains a non-null object (CallSite, etc.)
// This kind of CP cache entry does not need to match the flags byte, because
// there is a 1-1 relation between bytecode type and CP entry type.
assert(constantPoolCacheOopDesc::is_secondary_index(index), "incorrect format");
- if (! cache->is_resolved((Bytecodes::Code) opcode)) {
+ if (cache->is_f1_null()) {
CALL_VM(InterpreterRuntime::resolve_invokedynamic(THREAD),
handle_exception);
- result = cache->f1_as_instance();
+ // GC might move cache while returning from VM call.
+ cache = cp->secondary_entry_at(index); // reload
}
- VERIFY_OOP(result);
- oop method_handle = java_lang_invoke_CallSite::target(result);
- CHECK_NULL(method_handle);
-
- methodOop method = cache->f1_as_method();
+ methodOop method = cache->f2_as_vfinal_method();
VERIFY_OOP(method);
if (cache->has_appendix()) {
@@ -2241,10 +2238,11 @@
if (! cache->is_resolved((Bytecodes::Code) opcode)) {
CALL_VM(InterpreterRuntime::resolve_invokehandle(THREAD),
handle_exception);
- cache = cp->entry_at(index);
+ // GC might move cache while returning from VM call.
+ cache = cp->entry_at(index); // reload
}
- methodOop method = cache->f1_as_method();
+ methodOop method = cache->f2_as_vfinal_method();
VERIFY_OOP(method);