@@ -64,10 +64,8 @@ bool AOTConstantPoolResolver::is_resolution_deterministic(ConstantPool* cp, int
64
64
return resolved_klass != nullptr && is_class_resolution_deterministic (cp->pool_holder (), resolved_klass);
65
65
} else if (cp->tag_at (cp_index).is_invoke_dynamic ()) {
66
66
return is_indy_resolution_deterministic (cp, cp_index);
67
- } else if (cp->tag_at (cp_index).is_field () ||
68
- cp->tag_at (cp_index).is_method () ||
69
- cp->tag_at (cp_index).is_interface_method ()) {
70
- int klass_cp_index = cp->uncached_klass_ref_index_at (cp_index);
67
+ } else if (cp->tag_at (cp_index).is_field_or_method ()) {
68
+ int klass_cp_index = cp->uncached_field_or_method_ref_at (cp_index).klass_index ();
71
69
if (!cp->tag_at (klass_cp_index).is_klass ()) {
72
70
// Not yet resolved
73
71
return false ;
@@ -283,13 +281,14 @@ void AOTConstantPoolResolver::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m
283
281
return ;
284
282
}
285
283
286
- int klass_cp_index = cp->uncached_klass_ref_index_at (cp_index);
284
+ int klass_cp_index = cp->uncached_field_or_method_ref_at (cp_index). klass_index ( );
287
285
if (find_loaded_class (THREAD, cp (), klass_cp_index) == nullptr ) {
288
286
// Do not resolve any field/methods from a class that has not been loaded yet.
289
287
return ;
290
288
}
291
289
292
- Klass* resolved_klass = cp->klass_ref_at (raw_index, bc, CHECK);
290
+ auto fmiref = cp->from_bytecode_ref_at (raw_index, bc);
291
+ Klass* resolved_klass = fmiref.klass (cp, CHECK);
293
292
294
293
switch (bc) {
295
294
case Bytecodes::_getfield:
@@ -314,8 +313,8 @@ void AOTConstantPoolResolver::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m
314
313
if (log_is_enabled (Trace, cds, resolve)) {
315
314
ResourceMark rm (THREAD);
316
315
bool resolved = cp->is_resolved (raw_index, bc);
317
- Symbol* name = cp-> name_ref_at (raw_index, bc );
318
- Symbol* signature = cp-> signature_ref_at (raw_index, bc );
316
+ Symbol* name = fmiref. name (cp );
317
+ Symbol* signature = fmiref. signature (cp );
319
318
log_trace (cds, resolve)(" %s %s [%3d] %s -> %s.%s:%s" ,
320
319
(resolved ? " Resolved" : " Failed to resolve" ),
321
320
Bytecodes::name (bc), cp_index, ik->external_name (),
@@ -410,14 +409,14 @@ bool AOTConstantPoolResolver::check_lambda_metafactory_signature(ConstantPool* c
410
409
return !exclude;
411
410
}
412
411
413
- bool AOTConstantPoolResolver::check_lambda_metafactory_methodtype_arg (ConstantPool* cp, int bsms_attribute_index , int arg_i) {
414
- int mt_index = cp-> bsm_attribute_entry (bsms_attribute_index) ->argument_index (arg_i);
412
+ bool AOTConstantPoolResolver::check_lambda_metafactory_methodtype_arg (ConstantPool* cp, BSMAttributeEntry* bsme , int arg_i) {
413
+ int mt_index = bsme ->argument_index (arg_i);
415
414
if (!cp->tag_at (mt_index).is_method_type ()) {
416
415
// malformed class?
417
416
return false ;
418
417
}
419
418
420
- Symbol* sig = cp->method_type_signature_at (mt_index);
419
+ Symbol* sig = cp->method_type_ref_at (mt_index). signature (cp );
421
420
if (log_is_enabled (Debug, cds, resolve)) {
422
421
ResourceMark rm;
423
422
log_debug (cds, resolve)(" Checking MethodType for LambdaMetafactory BSM arg %d: %s" , arg_i, sig->as_C_string ());
@@ -426,14 +425,14 @@ bool AOTConstantPoolResolver::check_lambda_metafactory_methodtype_arg(ConstantPo
426
425
return check_methodtype_signature (cp, sig);
427
426
}
428
427
429
- bool AOTConstantPoolResolver::check_lambda_metafactory_methodhandle_arg (ConstantPool* cp, int bsms_attribute_index , int arg_i) {
430
- int mh_index = cp-> bsm_attribute_entry (bsms_attribute_index) ->argument_index (arg_i);
428
+ bool AOTConstantPoolResolver::check_lambda_metafactory_methodhandle_arg (ConstantPool* cp, BSMAttributeEntry* bsme , int arg_i) {
429
+ int mh_index = bsme ->argument_index (arg_i);
431
430
if (!cp->tag_at (mh_index).is_method_handle ()) {
432
431
// malformed class?
433
432
return false ;
434
433
}
435
434
436
- Symbol* sig = cp->method_handle_signature_ref_at (mh_index);
435
+ Symbol* sig = cp->method_handle_ref_at (mh_index). signature (cp );
437
436
if (log_is_enabled (Debug, cds, resolve)) {
438
437
ResourceMark rm;
439
438
log_debug (cds, resolve)(" Checking MethodType of MethodHandle for LambdaMetafactory BSM arg %d: %s" , arg_i, sig->as_C_string ());
@@ -452,12 +451,13 @@ bool AOTConstantPoolResolver::is_indy_resolution_deterministic(ConstantPool* cp,
452
451
return false ;
453
452
}
454
453
455
- int bsms_attribute_index = cp->bootstrap_methods_attribute_index (cp_index);
456
- int bsm = cp->bsm_attribute_entry (bsms_attribute_index)->bootstrap_method_index ();
457
- int bsm_ref = cp->method_handle_index_at (bsm);
458
- Symbol* bsm_name = cp->uncached_name_ref_at (bsm_ref);
459
- Symbol* bsm_signature = cp->uncached_signature_ref_at (bsm_ref);
460
- Symbol* bsm_klass = cp->klass_name_at (cp->uncached_klass_ref_index_at (bsm_ref));
454
+ auto indy = cp->uncached_bootstrap_specifier_ref_at (cp_index);
455
+ auto bsme = indy.bsme (cp);
456
+ auto bsmh = bsme->bootstrap_method (cp);
457
+ Symbol* bsm_name = bsmh.name (cp);
458
+ Symbol* bsm_signature = bsmh.signature (cp);
459
+ Symbol* bsm_klass = bsmh.klass_name (cp);
460
+ Symbol* factory_type_sig = indy.signature (cp);
461
461
462
462
// We currently support only StringConcatFactory::makeConcatWithConstants() and LambdaMetafactory::metafactory()
463
463
// We should mark the allowed BSMs in the JDK code using a private annotation.
@@ -471,7 +471,6 @@ bool AOTConstantPoolResolver::is_indy_resolution_deterministic(ConstantPool* cp,
471
471
" Ljava/lang/String;"
472
472
" [Ljava/lang/Object;"
473
473
" )Ljava/lang/invoke/CallSite;" )) {
474
- Symbol* factory_type_sig = cp->uncached_signature_ref_at (cp_index);
475
474
if (log_is_enabled (Debug, cds, resolve)) {
476
475
ResourceMark rm;
477
476
log_debug (cds, resolve)(" Checking StringConcatFactory callsite signature [%d]: %s" , cp_index, factory_type_sig->as_C_string ());
@@ -523,7 +522,6 @@ bool AOTConstantPoolResolver::is_indy_resolution_deterministic(ConstantPool* cp,
523
522
* In simple use cases this is the same as
524
523
* {@code interfaceMethodType}.
525
524
*/
526
- Symbol* factory_type_sig = cp->uncached_signature_ref_at (cp_index);
527
525
if (log_is_enabled (Debug, cds, resolve)) {
528
526
ResourceMark rm;
529
527
log_debug (cds, resolve)(" Checking indy callsite signature [%d]: %s" , cp_index, factory_type_sig->as_C_string ());
@@ -533,24 +531,24 @@ bool AOTConstantPoolResolver::is_indy_resolution_deterministic(ConstantPool* cp,
533
531
return false ;
534
532
}
535
533
536
- int arg_count = cp-> bsm_attribute_entry (bsms_attribute_index) ->argument_count ();
534
+ int arg_count = bsme ->argument_count ();
537
535
if (arg_count != 3 ) {
538
536
// Malformed class?
539
537
return false ;
540
538
}
541
539
542
540
// interfaceMethodType
543
- if (!check_lambda_metafactory_methodtype_arg (cp, bsms_attribute_index , 0 )) {
541
+ if (!check_lambda_metafactory_methodtype_arg (cp, bsme , 0 )) {
544
542
return false ;
545
543
}
546
544
547
545
// implementation
548
- if (!check_lambda_metafactory_methodhandle_arg (cp, bsms_attribute_index , 1 )) {
546
+ if (!check_lambda_metafactory_methodhandle_arg (cp, bsme , 1 )) {
549
547
return false ;
550
548
}
551
549
552
550
// dynamicMethodType
553
- if (!check_lambda_metafactory_methodtype_arg (cp, bsms_attribute_index , 2 )) {
551
+ if (!check_lambda_metafactory_methodtype_arg (cp, bsme , 2 )) {
554
552
return false ;
555
553
}
556
554
0 commit comments