--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Fri Oct 26 14:18:57 2012 -0700
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Mon Oct 29 11:08:48 2012 -0700
@@ -235,10 +235,6 @@
#endif
#endif
-// JavaStack Implementation
-#define MORE_STACK(count) \
- (topOfStack -= ((count) * Interpreter::stackElementWords))
-
#define UPDATE_PC(opsize) {pc += opsize; }
/*
@@ -575,7 +571,7 @@
/* 0xE0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default,
/* 0xE4 */ &&opc_default, &&opc_fast_aldc, &&opc_fast_aldc_w, &&opc_return_register_finalizer,
-/* 0xE8 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default,
+/* 0xE8 */ &&opc_invokehandle,&&opc_default, &&opc_default, &&opc_default,
/* 0xEC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default,
/* 0xF0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default,
@@ -1773,7 +1769,7 @@
oop obj;
if ((Bytecodes::Code)opcode == Bytecodes::_getstatic) {
- Klass* k = (Klass*) cache->f1();
+ Klass* k = cache->f1_as_klass();
obj = k->java_mirror();
MORE_STACK(1); // Assume single slot push
} else {
@@ -1885,7 +1881,7 @@
--count;
}
if ((Bytecodes::Code)opcode == Bytecodes::_putstatic) {
- Klass* k = (Klass*) cache->f1();
+ Klass* k = cache->f1_as_klass();
obj = k->java_mirror();
} else {
--count;
@@ -2190,6 +2186,7 @@
}
CASE(_invokedynamic): {
+
if (!EnableInvokeDynamic) {
// We should not encounter this bytecode if !EnableInvokeDynamic.
// The verifier will stop it. However, if we get past the verifier,
@@ -2199,26 +2196,64 @@
ShouldNotReachHere();
}
- int index = Bytes::get_native_u4(pc+1);
+ u4 index = Bytes::get_native_u4(pc+1);
+ ConstantPoolCacheEntry* cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index);
// We are resolved if the resolved_references 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.
- ConstantPool* constants = METHOD->constants();
- oop result = constants->resolved_references()->obj_at(index);
- if (result == NULL) {
+ if (! cache->is_resolved((Bytecodes::Code) opcode)) {
CALL_VM(InterpreterRuntime::resolve_invokedynamic(THREAD),
handle_exception);
- result = THREAD->vm_result();
+ cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index);
+ }
+
+ Method* method = cache->f1_as_method();
+ VERIFY_OOP(method);
+
+ if (cache->has_appendix()) {
+ ConstantPool* constants = METHOD->constants();
+ SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0);
+ MORE_STACK(1);
+ }
+
+ istate->set_msg(call_method);
+ istate->set_callee(method);
+ istate->set_callee_entry_point(method->from_interpreted_entry());
+ istate->set_bcp_advance(5);
+
+ UPDATE_PC_AND_RETURN(0); // I'll be back...
+ }
+
+ CASE(_invokehandle): {
+
+ if (!EnableInvokeDynamic) {
+ ShouldNotReachHere();
}
- VERIFY_OOP(result);
- oop method_handle = java_lang_invoke_CallSite::target(result);
- CHECK_NULL(method_handle);
-
- istate->set_msg(call_method_handle);
- istate->set_callee((Method*) method_handle);
- istate->set_bcp_advance(5);
+ u2 index = Bytes::get_native_u2(pc+1);
+ ConstantPoolCacheEntry* cache = cp->entry_at(index);
+
+ if (! cache->is_resolved((Bytecodes::Code) opcode)) {
+ CALL_VM(InterpreterRuntime::resolve_invokehandle(THREAD),
+ handle_exception);
+ cache = cp->entry_at(index);
+ }
+
+ Method* method = cache->f1_as_method();
+
+ VERIFY_OOP(method);
+
+ if (cache->has_appendix()) {
+ ConstantPool* constants = METHOD->constants();
+ SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0);
+ MORE_STACK(1);
+ }
+
+ istate->set_msg(call_method);
+ istate->set_callee(method);
+ istate->set_callee_entry_point(method->from_interpreted_entry());
+ istate->set_bcp_advance(3);
UPDATE_PC_AND_RETURN(0); // I'll be back...
}