src/share/vm/ci/bcEscapeAnalyzer.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/ci/bcEscapeAnalyzer.cpp Thu Jan 13 02:54:11 2011
--- new/src/share/vm/ci/bcEscapeAnalyzer.cpp Thu Jan 13 02:54:11 2011
*** 1,7 ****
--- 1,7 ----
/*
! * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 231,240 ****
--- 231,244 ----
code = Bytecodes::_invokespecial;
}
// 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--;
}
int arg_base = MAX2(state._stack_height - arg_size, 0);
*** 248,257 ****
--- 252,265 ----
bool skip_callee = true;
for (i = state._stack_height - 1; i >= arg_base && skip_callee; i--) {
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++) {
set_method_escape(state.raw_pop());
}
src/share/vm/ci/bcEscapeAnalyzer.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File