8219974: REDO JDK-8219492: Restore static callsite resolution for the current class

Reviewed-by: redestad, vlivanov, coleenp
This commit is contained in:
David Holmes 2019-03-04 19:38:50 -05:00
parent 53adab6857
commit b0d139de19
4 changed files with 44 additions and 23 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2019, 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
@ -1376,12 +1376,18 @@ methodHandle SharedRuntime::resolve_sub_helper(JavaThread *thread,
}
#endif
// Do not patch call site for static call when the class is not
// fully initialized.
if (invoke_code == Bytecodes::_invokestatic &&
!callee_method->method_holder()->is_initialized()) {
assert(callee_method->method_holder()->is_linked(), "must be");
return callee_method;
// Do not patch call site for static call to another class
// when the class is not fully initialized.
if (invoke_code == Bytecodes::_invokestatic) {
if (!callee_method->method_holder()->is_initialized() &&
callee_method->method_holder() != caller_nm->method()->method_holder()) {
assert(callee_method->method_holder()->is_linked(), "must be");
return callee_method;
} else {
assert(callee_method->method_holder()->is_initialized() ||
callee_method->method_holder()->is_reentrant_initialization(thread),
"invalid class initialization state for invoke_static");
}
}
// JSR 292 key invariant: