Skip to content

Commit db76336

Browse files
Update MethodHandleNatives for new JDK 20 build
`MemberName.getSignature` was removed
1 parent 0831679 commit db76336

File tree

5 files changed

+73
-21
lines changed

5 files changed

+73
-21
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/descriptors/Signatures.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ private static Symbol<Type> toBasic(Symbol<Type> t) {
9696
}
9797

9898
public Symbol<Signature> lookupValidSignature(String signatureString) {
99+
if (!isValid(signatureString)) {
100+
return null;
101+
}
102+
return symbols.lookup(signatureString);
103+
}
104+
105+
public Symbol<Signature> symbolifyValidSignature(String signatureString) {
99106
if (!isValid(signatureString)) {
100107
return null;
101108
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/descriptors/Symbol.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,6 @@ public static void ensureInitialized() {
344344
// MemberName
345345
public static final Symbol<Name> flags = StaticSymbols.putName("flags");
346346
public static final Symbol<Name> form = StaticSymbols.putName("form");
347-
public static final Symbol<Name> getSignature = StaticSymbols.putName("getSignature");
348347

349348
// MethodHandle
350349
public static final Symbol<Name> invoke = StaticSymbols.putName("invoke");
@@ -370,8 +369,8 @@ public static void ensureInitialized() {
370369
public static final Symbol<Name> lookup = StaticSymbols.putName("lookup");
371370

372371
// MethodType
373-
public static final Symbol<Name> fromMethodDescriptorString = StaticSymbols.putName("fromMethodDescriptorString");
374-
public static final Symbol<Name> toMethodDescriptorString = StaticSymbols.putName("toMethodDescriptorString");
372+
public static final Symbol<Name> ptypes = StaticSymbols.putName("ptypes");
373+
public static final Symbol<Name> rtype = StaticSymbols.putName("rtype");
375374

376375
// j.l.ref.Finalizer
377376
public static final Symbol<Name> finalize = StaticSymbols.putName("finalize");

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/Klass.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -917,15 +917,17 @@ public final boolean isAssignableFrom(Klass other) {
917917
if (this.isPrimitive() || other.isPrimitive()) {
918918
// Reference equality is enough within the same context.
919919
assert this.getContext() == other.getContext();
920-
return this == other;
920+
assert this != other;
921+
return false;
921922
}
922923
if (this.isArray()) {
923924
if (other.isArray()) {
924925
return ((ArrayKlass) this).arrayTypeChecks((ArrayKlass) other);
925926
}
926927
} else {
927928
if (this.isFinalFlagSet()) {
928-
return this == other;
929+
assert this != other;
930+
return false;
929931
}
930932
}
931933
if (Modifier.isInterface(getModifiers())) {

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/meta/Meta.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -480,13 +480,12 @@ public Meta(EspressoContext context) {
480480
java_security_AccessController = knownKlass(Type.java_security_AccessController);
481481

482482
java_lang_invoke_MethodType = knownKlass(Type.java_lang_invoke_MethodType);
483-
java_lang_invoke_MethodType_toMethodDescriptorString = java_lang_invoke_MethodType.requireDeclaredMethod(Name.toMethodDescriptorString, Signature.String);
484-
java_lang_invoke_MethodType_fromMethodDescriptorString = java_lang_invoke_MethodType.requireDeclaredMethod(Name.fromMethodDescriptorString, Signature.MethodType_String_ClassLoader);
483+
java_lang_invoke_MethodType_ptypes = java_lang_invoke_MethodType.requireDeclaredField(Name.ptypes, Type.java_lang_Class_array);
484+
java_lang_invoke_MethodType_rtype = java_lang_invoke_MethodType.requireDeclaredField(Name.rtype, Type.java_lang_Class);
485485

486486
java_lang_invoke_MemberName = knownKlass(Type.java_lang_invoke_MemberName);
487487
HIDDEN_VMINDEX = java_lang_invoke_MemberName.requireHiddenField(Name.HIDDEN_VMINDEX);
488488
HIDDEN_VMTARGET = java_lang_invoke_MemberName.requireHiddenField(Name.HIDDEN_VMTARGET);
489-
java_lang_invoke_MemberName_getSignature = java_lang_invoke_MemberName.requireDeclaredMethod(Name.getSignature, Signature.String);
490489
java_lang_invoke_MemberName_clazz = java_lang_invoke_MemberName.requireDeclaredField(Name.clazz, Type.java_lang_Class);
491490
java_lang_invoke_MemberName_name = java_lang_invoke_MemberName.requireDeclaredField(Name.name, Type.java_lang_String);
492491
java_lang_invoke_MemberName_type = java_lang_invoke_MemberName.requireDeclaredField(Name.type, Type.java_lang_Object);
@@ -1297,11 +1296,10 @@ private DiffVersionLoadHelper diff() {
12971296
public final ObjectKlass java_security_AccessController;
12981297

12991298
public final ObjectKlass java_lang_invoke_MethodType;
1300-
public final Method java_lang_invoke_MethodType_toMethodDescriptorString;
1301-
public final Method java_lang_invoke_MethodType_fromMethodDescriptorString;
1299+
public final Field java_lang_invoke_MethodType_ptypes;
1300+
public final Field java_lang_invoke_MethodType_rtype;
13021301

13031302
public final ObjectKlass java_lang_invoke_MemberName;
1304-
public final Method java_lang_invoke_MemberName_getSignature;
13051303

13061304
public final Field HIDDEN_VMTARGET;
13071305
public final Field HIDDEN_VMINDEX;

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/Target_java_lang_invoke_MethodHandleNatives.java

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,13 @@
5151
import java.util.ArrayList;
5252
import java.util.List;
5353

54-
import com.oracle.truffle.espresso.impl.ObjectKlass;
5554
import org.graalvm.collections.Pair;
5655

5756
import com.oracle.truffle.api.CompilerDirectives;
5857
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5958
import com.oracle.truffle.api.dsl.Bind;
6059
import com.oracle.truffle.api.dsl.Cached;
6160
import com.oracle.truffle.api.dsl.Specialization;
62-
import com.oracle.truffle.api.nodes.DirectCallNode;
6361
import com.oracle.truffle.api.profiles.BranchProfile;
6462
import com.oracle.truffle.espresso.EspressoLanguage;
6563
import com.oracle.truffle.espresso.classfile.constantpool.MemberRefConstant;
@@ -71,6 +69,7 @@
7169
import com.oracle.truffle.espresso.impl.Field;
7270
import com.oracle.truffle.espresso.impl.Klass;
7371
import com.oracle.truffle.espresso.impl.Method;
72+
import com.oracle.truffle.espresso.impl.ObjectKlass;
7473
import com.oracle.truffle.espresso.meta.EspressoError;
7574
import com.oracle.truffle.espresso.meta.Meta;
7675
import 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

Comments
 (0)