5151import java .util .ArrayList ;
5252import java .util .List ;
5353
54- import com .oracle .truffle .espresso .impl .ObjectKlass ;
5554import org .graalvm .collections .Pair ;
5655
5756import com .oracle .truffle .api .CompilerDirectives ;
5857import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
5958import com .oracle .truffle .api .dsl .Bind ;
6059import com .oracle .truffle .api .dsl .Cached ;
6160import com .oracle .truffle .api .dsl .Specialization ;
62- import com .oracle .truffle .api .nodes .DirectCallNode ;
6361import com .oracle .truffle .api .profiles .BranchProfile ;
6462import com .oracle .truffle .espresso .EspressoLanguage ;
6563import com .oracle .truffle .espresso .classfile .constantpool .MemberRefConstant ;
7169import com .oracle .truffle .espresso .impl .Field ;
7270import com .oracle .truffle .espresso .impl .Klass ;
7371import com .oracle .truffle .espresso .impl .Method ;
72+ import com .oracle .truffle .espresso .impl .ObjectKlass ;
7473import com .oracle .truffle .espresso .meta .EspressoError ;
7574import com .oracle .truffle .espresso .meta .Meta ;
7675import com .oracle .truffle .espresso .nodes .EspressoNode ;
@@ -424,7 +423,6 @@ StaticObject doCached(
424423 @ JavaType (value = Class .class ) StaticObject caller ,
425424 @ SuppressWarnings ("unused" ) int lookupMode ,
426425 @ Bind ("getMeta()" ) Meta meta ,
427- @ Cached ("create(meta.java_lang_invoke_MemberName_getSignature.getCallTarget())" ) DirectCallNode getSignature ,
428426 @ Cached BranchProfile isMethodProfile ,
429427 @ Cached BranchProfile isFieldProfile ,
430428 @ Cached BranchProfile isConstructorProfile ,
@@ -442,8 +440,7 @@ StaticObject doCached(
442440 }
443441 Klass resolutionKlass = clazz .getMirrorKlass (meta );
444442
445- Field flagField = meta .java_lang_invoke_MemberName_flags ;
446- int flags = flagField .getInt (memberName );
443+ int flags = meta .java_lang_invoke_MemberName_flags .getInt (memberName );
447444 int refKind = getRefKind (flags );
448445
449446 StaticObject name = meta .java_lang_invoke_MemberName_name .getObject (memberName );
@@ -485,21 +482,37 @@ StaticObject doCached(
485482 boolean doAccessChecks = callerKlass != null ;
486483 boolean doConstraintsChecks = (callerKlass != null && ((lookupMode & LM_UNCONDITIONAL ) == 0 ));
487484
488- StaticObject type = ( StaticObject ) getSignature . call (memberName );
485+ StaticObject type = meta . java_lang_invoke_MemberName_type . getObject (memberName );
489486 if (StaticObject .isNull (type )) {
490487 return StaticObject .NULL ;
491488 }
492- String desc = meta . toHostString (type );
489+ String desc = asSignature (type , meta );
493490 switch (flags & ALL_KINDS ) {
494491 case MN_IS_CONSTRUCTOR :
495492 isConstructorProfile .enter ();
496- Symbol <Signature > constructorSignature = meta .getLanguage ().getSignatures ().lookupValidSignature (desc );
493+ Symbol <Signature > constructorSignature ;
494+ if (mhMethodId != None ) {
495+ constructorSignature = meta .getSignatures ().symbolifyValidSignature (desc );
496+ } else {
497+ constructorSignature = meta .getSignatures ().lookupValidSignature (desc );
498+ }
499+ if (constructorSignature == null ) {
500+ throw meta .throwException (meta .java_lang_NoSuchMethodException );
501+ }
497502 plantMethodMemberName (memberName , resolutionKlass , methodName , constructorSignature , refKind , callerKlass , doAccessChecks , doConstraintsChecks , meta );
498503 meta .HIDDEN_VMINDEX .setHiddenObject (memberName , -3_000_000L );
499504 break ;
500505 case MN_IS_METHOD :
501506 isMethodProfile .enter ();
502- Symbol <Signature > sig = meta .getSignatures ().lookupValidSignature (desc );
507+ Symbol <Signature > sig ;
508+ if (mhMethodId != None ) {
509+ sig = meta .getSignatures ().symbolifyValidSignature (desc );
510+ } else {
511+ sig = meta .getSignatures ().lookupValidSignature (desc );
512+ }
513+ if (sig == null ) {
514+ throw meta .throwException (meta .java_lang_NoSuchMethodException );
515+ }
503516 if (refKind == REF_invokeStatic || refKind == REF_invokeInterface ) {
504517 // This branch will also handle MH.linkTo* methods.
505518 isInvokeStaticOrInterfaceProfile .enter ();
@@ -513,13 +526,16 @@ StaticObject doCached(
513526 isInvokeVirtualOrSpecialProfile .enter ();
514527 plantMethodMemberName (memberName , resolutionKlass , methodName , sig , refKind , callerKlass , doAccessChecks , doConstraintsChecks , meta );
515528 }
516- flags = flagField .getInt (memberName );
529+ flags = meta . java_lang_invoke_MemberName_flags .getInt (memberName );
517530 refKind = getRefKind (flags );
518531 meta .HIDDEN_VMINDEX .setHiddenObject (memberName , (refKind == REF_invokeInterface || refKind == REF_invokeVirtual ) ? 1_000_000L : -1_000_000L );
519532 break ;
520533 case MN_IS_FIELD :
521534 isFieldProfile .enter ();
522535 Symbol <Type > t = meta .getLanguage ().getTypes ().lookup (desc );
536+ if (t == null ) {
537+ throw meta .throwException (meta .java_lang_NoSuchFieldException );
538+ }
523539 plantFieldMemberName (memberName , resolutionKlass , methodName , t , refKind , callerKlass , doConstraintsChecks , meta );
524540 break ;
525541 default :
@@ -530,6 +546,36 @@ StaticObject doCached(
530546 }
531547 }
532548
549+ private static String asSignature (StaticObject typeObject , Meta meta ) {
550+ Klass typeKlass = typeObject .getKlass ();
551+ if (meta .java_lang_invoke_MethodType .isAssignableFrom (typeKlass )) {
552+ return methodTypeAsSignature (typeObject , meta );
553+ } else if (meta .java_lang_Class .isAssignableFrom (typeKlass )) {
554+ return typeObject .getMirrorKlass (meta ).getTypeAsString ();
555+ } else if (meta .java_lang_String .isAssignableFrom (typeKlass )) {
556+ return meta .toHostString (typeObject );
557+ } else {
558+ CompilerDirectives .transferToInterpreterAndInvalidate ();
559+ throw EspressoError .shouldNotReachHere ();
560+ }
561+ }
562+
563+ @ TruffleBoundary
564+ private static String methodTypeAsSignature (StaticObject methodType , Meta meta ) {
565+ EspressoLanguage language = meta .getLanguage ();
566+ StringBuilder sb = new StringBuilder ("(" );
567+ StaticObject ptypes = meta .java_lang_invoke_MethodType_ptypes .getObject (methodType );
568+ int numParamTypes = ptypes .length (language );
569+ for (int i = 0 ; i < numParamTypes ; i ++) {
570+ StaticObject ptype = ptypes .get (language , i );
571+ sb .append (ptype .getMirrorKlass (meta ).getTypeAsString ());
572+ }
573+ sb .append (")" );
574+ StaticObject rtype = meta .java_lang_invoke_MethodType_rtype .getObject (methodType );
575+ sb .append (rtype .getMirrorKlass (meta ).getTypeAsString ());
576+ return sb .toString ();
577+ }
578+
533579 // region MemberName planting
534580
535581 private static void plantInvokeBasic (StaticObject memberName , Klass resolutionKlass , Symbol <Name > name , Symbol <Signature > sig , Klass callerKlass , boolean accessCheck , Meta meta ) {
0 commit comments