Skip to content

Commit 2c197f3

Browse files
fixup! Introduce VMAccess API
1 parent d918ca9 commit 2c197f3

File tree

4 files changed

+28
-29
lines changed

4 files changed

+28
-29
lines changed

espresso-compiler-stub/src/com.oracle.truffle.espresso.vmaccess/src/com/oracle/truffle/espresso/vmaccess/EspressoExternalConstantReflectionProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,12 @@ static EspressoResolvedJavaType classAsType(Value value, EspressoExternalVMAcces
155155
dimensions++;
156156
elemental = elemental.invokeMember("getComponentType");
157157
} while (elemental.invokeMember("isArray").asBoolean());
158-
return new EspressoExternalResolvedArrayType(getElementalType(elemental, access), dimensions, access);
158+
return new EspressoExternalResolvedArrayType(getNonArrayType(elemental, access), dimensions, access);
159159
}
160-
return getElementalType(value, access);
160+
return getNonArrayType(value, access);
161161
}
162162

163-
private static EspressoResolvedJavaType getElementalType(Value value, EspressoExternalVMAccess access) {
163+
private static EspressoResolvedJavaType getNonArrayType(Value value, EspressoExternalVMAccess access) {
164164
if (value.invokeMember("isPrimitive").asBoolean()) {
165165
return getPrimitiveType(value.getMember("static").getMetaQualifiedName(), access);
166166
}

espresso-compiler-stub/src/com.oracle.truffle.espresso.vmaccess/src/com/oracle/truffle/espresso/vmaccess/EspressoExternalResolvedInstanceType.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141

4242
final class EspressoExternalResolvedInstanceType extends AbstractEspressoResolvedInstanceType {
4343
private final EspressoExternalVMAccess access;
44+
/**
45+
* A handle to an espresso Klass.
46+
*/
4447
private final Value metaObject;
4548
private final int flags;
4649
private EspressoExternalConstantPool constantPool;

espresso-compiler-stub/src/com.oracle.truffle.espresso.vmaccess/src/com/oracle/truffle/espresso/vmaccess/EspressoExternalResolvedJavaMethod.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,10 @@ JavaConstant invoke(JavaConstant receiver, JavaConstant... arguments) {
276276
for (int i = 0; i < parameterCount; i++) {
277277
JavaConstant argument = arguments[i];
278278
JavaKind argumentKind = argument.getJavaKind();
279+
/*
280+
* Perform widening primitive conversions (JLS 5.1.2) in order to implement strict
281+
* method invocation conversions (JLS 5.3). Also promote to stack kind.
282+
*/
279283
args[i + outputArgumentOffset] = switch (signature.getParameterKind(i)) {
280284
case Boolean -> switch (argumentKind) {
281285
case Boolean -> argument.asBoolean() ? 1 : 0;
@@ -335,7 +339,7 @@ JavaConstant invoke(JavaConstant receiver, JavaConstant... arguments) {
335339
}
336340
Value result;
337341
try {
338-
result = methodMirror.invokeMember("invoke", args);
342+
result = methodMirror.execute(args);
339343
} catch (PolyglotException e) {
340344
throw new InvocationException(new EspressoExternalObjectConstant(access, e.getGuestObject()), e);
341345
}

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

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,8 +2164,7 @@ public RuntimeConstantPool getPool() {
21642164
// endregion jdwp-specific
21652165

21662166
private static final KeysArray<String> ALL_MEMBERS;
2167-
private static final Set<String> INVOCABLE_MEMBERS;
2168-
private static final Set<String> READABLE_MEMBERS;
2167+
private static final Set<String> ALL_MEMBERS_SET;
21692168

21702169
static {
21712170
String[] readableMembers = {
@@ -2185,15 +2184,8 @@ public RuntimeConstantPool getPool() {
21852184
ReadMember.HAS_POISON,
21862185
ReadMember.HOLDER,
21872186
};
2188-
String[] invocableMembers = {
2189-
InvokeMember.INVOKE,
2190-
};
2191-
String[] allMembers = new String[readableMembers.length + invocableMembers.length];
2192-
System.arraycopy(readableMembers, 0, allMembers, 0, readableMembers.length);
2193-
System.arraycopy(invocableMembers, 0, allMembers, readableMembers.length, invocableMembers.length);
2194-
ALL_MEMBERS = new KeysArray<>(allMembers);
2195-
READABLE_MEMBERS = Set.of(readableMembers);
2196-
INVOCABLE_MEMBERS = Set.of(invocableMembers);
2187+
ALL_MEMBERS = new KeysArray<>(readableMembers);
2188+
ALL_MEMBERS_SET = Set.of(readableMembers);
21972189
}
21982190

21992191
@ExportMessage
@@ -2365,12 +2357,18 @@ public static Object doUnknown(@SuppressWarnings("unused") Method receiver, Stri
23652357
}
23662358
}
23672359

2360+
/*
2361+
* We use the "execute" message on Method objects instead of the usual way of invoking espresso
2362+
* over interop because usual interop cannot call private methods. For instance methods interop
2363+
* also only returns "bound" methods for a specific receiver. Also, this "execute" message is
2364+
* much more restrictive in what arguments it accepts: it only expects host boxes for primitive
2365+
* arguments and espresso objects for object arguments. It doesn't perform any of the more
2366+
* complex conversions typically done for interop.
2367+
*/
23682368
@ExportMessage
2369-
abstract static class InvokeMember {
2370-
static final String INVOKE = "invoke";
2371-
2372-
@Specialization(guards = "INVOKE.equals(member)")
2373-
static Object invoke(Method receiver, @SuppressWarnings("unused") String member, Object[] arguments,
2369+
abstract static class Execute {
2370+
@Specialization
2371+
static Object invoke(Method receiver, Object[] arguments,
23742372
@Bind Node node,
23752373
@CachedLibrary(limit = "2") @Exclusive InteropLibrary interop,
23762374
@Cached @Exclusive InlinedBranchProfile typeError,
@@ -2479,26 +2477,20 @@ static Object invoke(Method receiver, @SuppressWarnings("unused") String member,
24792477
}
24802478
return result;
24812479
}
2482-
2483-
@Fallback
2484-
@SuppressWarnings("unused")
2485-
static Object doUnknown(Method receiver, String member, Object[] arguments) throws UnknownIdentifierException {
2486-
throw UnknownIdentifierException.create(member);
2487-
}
24882480
}
24892481

24902482
@ExportMessage
24912483
@SuppressWarnings("static-method")
24922484
@TruffleBoundary
24932485
public boolean isMemberReadable(String member) {
2494-
return READABLE_MEMBERS.contains(member);
2486+
return ALL_MEMBERS_SET.contains(member);
24952487
}
24962488

24972489
@ExportMessage
24982490
@SuppressWarnings("static-method")
24992491
@TruffleBoundary
2500-
public boolean isMemberInvocable(String member) {
2501-
return INVOCABLE_MEMBERS.contains(member);
2492+
public boolean isExecutable() {
2493+
return true;
25022494
}
25032495

25042496
@ExportMessage

0 commit comments

Comments
 (0)