aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/ci/bcEscapeAnalyzer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/vm/ci/bcEscapeAnalyzer.cpp')
-rw-r--r--src/share/vm/ci/bcEscapeAnalyzer.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/share/vm/ci/bcEscapeAnalyzer.cpp b/src/share/vm/ci/bcEscapeAnalyzer.cpp
index 9017232a2..459109190 100644
--- a/src/share/vm/ci/bcEscapeAnalyzer.cpp
+++ b/src/share/vm/ci/bcEscapeAnalyzer.cpp
@@ -233,6 +233,10 @@ void BCEscapeAnalyzer::invoke(StateInfo &state, Bytecodes::Code code, ciMethod*
// compute size of arguments
int arg_size = target->arg_size();
+ if (code == Bytecodes::_invokedynamic) {
+ assert(!target->is_static(), "receiver explicit in method");
+ arg_size--; // implicit, not really on stack
+ }
if (!target->is_loaded() && code == Bytecodes::_invokestatic) {
arg_size--;
}
@@ -250,6 +254,10 @@ void BCEscapeAnalyzer::invoke(StateInfo &state, Bytecodes::Code code, ciMethod*
ArgumentMap arg = state._stack[i];
skip_callee = !is_argument(arg) || !is_arg_stack(arg) || (directly_recursive && arg.is_singleton(i - arg_base));
}
+ // For now we conservatively skip invokedynamic.
+ if (code == Bytecodes::_invokedynamic) {
+ skip_callee = true;
+ }
if (skip_callee) {
TRACE_BCEA(3, tty->print_cr("[EA] skipping method %s::%s", holder->name()->as_utf8(), target->name()->as_utf8()));
for (i = 0; i < arg_size; i++) {