8355481: Clean up MHN_copyOutBootstrapArguments

Reviewed-by: dholmes, coleenp
This commit is contained in:
Johan Sjölen 2025-05-19 10:04:32 +00:00
parent effe40a24c
commit 133c6fb4f3

View File

@ -1236,6 +1236,9 @@ JVM_ENTRY(void, MHN_copyOutBootstrapArguments(JNIEnv* env, jobject igcls,
jint start, jint end,
jobjectArray buf_jh, jint pos,
jboolean resolve, jobject ifna_jh)) {
// caller->constants->copy_bootstrap_arguments_at performs a runtime
// range check, but let's assert earlier as well.
assert(start < end && start >= 0, "invariant");
Klass* caller_k = java_lang_Class::as_Klass(JNIHandles::resolve(caller_jh));
if (caller_k == nullptr || !caller_k->is_instance_klass()) {
THROW_MSG(vmSymbols::java_lang_InternalError(), "bad caller");
@ -1256,54 +1259,9 @@ JVM_ENTRY(void, MHN_copyOutBootstrapArguments(JNIEnv* env, jobject igcls,
!= caller->constants()->bootstrap_argument_count_at(bss_index_in_pool)) {
THROW_MSG(vmSymbols::java_lang_InternalError(), "bad index info (1)");
}
objArrayHandle buf(THREAD, (objArrayOop) JNIHandles::resolve(buf_jh));
if (start < 0) {
for (int pseudo_index = -4; pseudo_index < 0; pseudo_index++) {
if (start == pseudo_index) {
if (start >= end || 0 > pos || pos >= buf->length()) break;
oop pseudo_arg = nullptr;
switch (pseudo_index) {
case -4: // bootstrap method
{
int bsm_index = caller->constants()->bootstrap_method_ref_index_at(bss_index_in_pool);
pseudo_arg = caller->constants()->resolve_possibly_cached_constant_at(bsm_index, CHECK);
break;
}
case -3: // name
{
Symbol* name = caller->constants()->name_ref_at(bss_index_in_pool, Bytecodes::_invokedynamic);
Handle str = java_lang_String::create_from_symbol(name, CHECK);
pseudo_arg = str();
break;
}
case -2: // type
{
Symbol* type = caller->constants()->signature_ref_at(bss_index_in_pool, Bytecodes::_invokedynamic);
Handle th;
if (type->char_at(0) == JVM_SIGNATURE_FUNC) {
th = SystemDictionary::find_method_handle_type(type, caller, CHECK);
} else {
th = SystemDictionary::find_java_mirror_for_type(type, caller, SignatureStream::NCDFError, CHECK);
}
pseudo_arg = th();
break;
}
case -1: // argument count
{
int argc = caller->constants()->bootstrap_argument_count_at(bss_index_in_pool);
jvalue argc_value; argc_value.i = (jint)argc;
pseudo_arg = java_lang_boxing_object::create(T_INT, &argc_value, CHECK);
break;
}
}
// Store the pseudo-argument, and advance the pointers.
buf->obj_at_put(pos++, pseudo_arg);
++start;
}
}
// When we are done with this there may be regular arguments to process too.
}
objArrayHandle buf(THREAD, (objArrayOop)JNIHandles::resolve(buf_jh));
Handle ifna(THREAD, JNIHandles::resolve(ifna_jh));
caller->constants()->
copy_bootstrap_arguments_at(bss_index_in_pool,