Skip to content

Commit e9feeeb

Browse files
committed
[GR-71035] [GR-71036] Move DynamicHub logic to common place.
PullRequest: graal/22523
2 parents 2d8672b + 8705713 commit e9feeeb

File tree

9 files changed

+64
-62
lines changed

9 files changed

+64
-62
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/OpenTypeWorldDispatchTableSnippets.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
*/
2525
package com.oracle.svm.core.graal.snippets;
2626

27-
import static com.oracle.svm.core.hub.DynamicHubTypeCheckUtil.HASHING_INTERFACE_MASK;
28-
import static com.oracle.svm.core.hub.DynamicHubTypeCheckUtil.HASHING_ITABLE_SHIFT;
29-
import static com.oracle.svm.core.hub.DynamicHubTypeCheckUtil.HASHING_SHIFT_OFFSET;
27+
import static com.oracle.svm.core.hub.DynamicHubUtils.HASHING_INTERFACE_MASK;
28+
import static com.oracle.svm.core.hub.DynamicHubUtils.HASHING_ITABLE_SHIFT;
29+
import static com.oracle.svm.core.hub.DynamicHubUtils.HASHING_SHIFT_OFFSET;
3030
import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.probability;
3131
import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.unknownProbability;
3232

@@ -40,7 +40,7 @@
4040
import com.oracle.svm.core.graal.meta.KnownOffsets;
4141
import com.oracle.svm.core.graal.nodes.LoadOpenTypeWorldDispatchTableStartingOffset;
4242
import com.oracle.svm.core.hub.DynamicHub;
43-
import com.oracle.svm.core.hub.DynamicHubTypeCheckUtil;
43+
import com.oracle.svm.core.hub.DynamicHubUtils;
4444
import com.oracle.svm.core.meta.SharedMethod;
4545
import com.oracle.svm.core.meta.SharedType;
4646

@@ -119,9 +119,8 @@ private static long determineITableStartingOffsetIterative(
119119
* If {@link SubstrateOptions#useInterfaceHashing()} is enabled, interfaceIDs and itable
120120
* starting offsets are stored in a hash table (see TypeCheckBuilder for a general
121121
* documentation). This snippet handles the lookup in the hash table and returns the itable
122-
* starting offset for the given interfaceID. See
123-
* {@link DynamicHubTypeCheckUtil#hashParam(int[])} for details on the hashing function and
124-
* hashing parameter.
122+
* starting offset for the given interfaceID. See {@link DynamicHubUtils#hashParam(int[])} for
123+
* details on the hashing function and hashing parameter.
125124
*/
126125
private static int determineITableStartingOffsetHashed(
127126
DynamicHub checkedHub,
@@ -149,7 +148,7 @@ private static int determineITableStartingOffsetHashed(
149148
public static long determineITableStartingOffset(
150149
DynamicHub checkedHub,
151150
int interfaceID) {
152-
if (SubstrateOptions.useInterfaceHashing()) {
151+
if (SubstrateOptions.useInterfaceHashing() && interfaceID <= SubstrateOptions.interfaceHashingMaxId()) {
153152
// Use the non-snippet version which contains no snippet asserts.
154153
return determineITableStartingOffsetHashedNonSnippet(checkedHub, interfaceID);
155154
} else {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/OpenTypeWorldSnippets.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626

2727
import static com.oracle.svm.core.graal.snippets.SubstrateIntrinsics.loadHub;
2828
import static com.oracle.svm.core.graal.snippets.SubstrateIntrinsics.loadHubOrNull;
29-
import static com.oracle.svm.core.hub.DynamicHubTypeCheckUtil.HASHING_INTERFACE_MASK;
30-
import static com.oracle.svm.core.hub.DynamicHubTypeCheckUtil.HASHING_SHIFT_OFFSET;
29+
import static com.oracle.svm.core.hub.DynamicHubUtils.HASHING_INTERFACE_MASK;
30+
import static com.oracle.svm.core.hub.DynamicHubUtils.HASHING_SHIFT_OFFSET;
3131
import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.NOT_FREQUENT_PROBABILITY;
3232
import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.probability;
3333
import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.unknownProbability;
@@ -39,7 +39,7 @@
3939
import com.oracle.svm.core.SubstrateOptions;
4040
import com.oracle.svm.core.config.ObjectLayout;
4141
import com.oracle.svm.core.hub.DynamicHub;
42-
import com.oracle.svm.core.hub.DynamicHubTypeCheckUtil;
42+
import com.oracle.svm.core.hub.DynamicHubUtils;
4343
import com.oracle.svm.core.meta.SharedType;
4444
import com.oracle.svm.core.util.DuplicatedInNativeCode;
4545

@@ -235,8 +235,8 @@ protected static SubstrateIntrinsics.Any iterativeInterfaceTypeCheck(
235235
* starting offsets are stored in a hash table (see TypeCheckBuilder for a general
236236
* documentation). This snippet does a hash table lookup and returns true if the provided
237237
* interfaceID matches the interfaceID in the hash table, false otherwise. See
238-
* {@link DynamicHubTypeCheckUtil#hashParam(int[])} for details on the hashing function and
239-
* hashing parameter.
238+
* {@link DynamicHubUtils#hashParam(int[])} for details on the hashing function and hashing
239+
* parameter.
240240
*/
241241
@DuplicatedInNativeCode
242242
protected static SubstrateIntrinsics.Any hashedInterfaceTypeCheck(
Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,18 @@
2828
import java.util.Set;
2929

3030
import com.oracle.svm.core.SubstrateOptions;
31+
import com.oracle.svm.core.graal.meta.KnownOffsets;
32+
import com.oracle.svm.core.graal.snippets.OpenTypeWorldDispatchTableSnippets;
3133
import com.oracle.svm.core.util.DuplicatedInNativeCode;
3234

3335
import jdk.graal.compiler.core.common.NumUtil;
3436
import jdk.graal.compiler.debug.GraalError;
3537

3638
/**
37-
* Contains utility for computing type check info for DynamicHubs, such as constants and functions
38-
* needed for {@link SubstrateOptions#useInterfaceHashing()}.
39-
*
39+
* Contains utilities for interacting with DynamicHubs, such as converting vtable indexes to
40+
* dispatch table offsets and calculating metadata needed for typecheck computations.
4041
*/
41-
public final class DynamicHubTypeCheckUtil {
42+
public final class DynamicHubUtils {
4243

4344
// Constants for interface hashing
4445

@@ -135,7 +136,7 @@ public static TypeCheckData computeOpenTypeWorldTypeCheckData(boolean implements
135136
}
136137

137138
// calculate hash parameter for hashable interfaces
138-
hashParam = DynamicHubTypeCheckUtil.hashParam(hashedInterfaces);
139+
hashParam = DynamicHubUtils.hashParam(hashedInterfaces);
139140
hashTable = new int[(hashParam & HASHING_PARAM_MASK) + 1];
140141
}
141142

@@ -152,7 +153,7 @@ public static TypeCheckData computeOpenTypeWorldTypeCheckData(boolean implements
152153
if (useInterfaceHashing && interfaceID <= SubstrateOptions.interfaceHashingMaxId()) {
153154
int offset = implementsMethods ? Math.toIntExact(vTableBaseOffset + iTableStartingOffsets[interfaceIdx] * vTableEntrySize) : Short.MIN_VALUE;
154155
GraalError.guarantee(NumUtil.isShort(offset), "ItableDynamicHubOffset cannot be encoded as a short. Try -H:-UseInterfaceHashing.");
155-
hashTable[DynamicHubTypeCheckUtil.hash(interfaceID, hashParam)] = ((offset << HASHING_ITABLE_SHIFT) | interfaceID);
156+
hashTable[DynamicHubUtils.hash(interfaceID, hashParam)] = ((offset << HASHING_ITABLE_SHIFT) | interfaceID);
156157
} else {
157158
int offset = implementsMethods ? Math.toIntExact(vTableBaseOffset + iTableStartingOffsets[interfaceIdx] * vTableEntrySize) : 0xBADD0D1D;
158159
openTypeWorldTypeCheckSlots[iterableInterfaceIdx * 2 + numClassTypes] = interfaceID;
@@ -255,4 +256,17 @@ private static boolean isValidHashParam(int[] vals, int hashParam, Set<Integer>
255256
}
256257
return true;
257258
}
259+
260+
/**
261+
* Calculates the offset of a virtual call when the receiver is of type {@code thisHub} and the
262+
* target method's declaring class is of type {@code callTargetHub}.
263+
*/
264+
public static int determineDispatchTableOffset(DynamicHub thisHub, DynamicHub callTargetHub, int vTableIndex) {
265+
if (SubstrateOptions.useClosedTypeWorldHubLayout() || !callTargetHub.isInterface()) {
266+
return KnownOffsets.singleton().getVTableOffset(vTableIndex, true);
267+
} else {
268+
int indexOffset = KnownOffsets.singleton().getVTableOffset(vTableIndex, false);
269+
return NumUtil.safeToInt(indexOffset + OpenTypeWorldDispatchTableSnippets.determineITableStartingOffset(thisHub, callTargetHub.getInterfaceID()));
270+
}
271+
}
258272
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
import com.oracle.svm.core.graal.snippets.OpenTypeWorldSnippets;
5353
import com.oracle.svm.core.hub.DynamicHub;
5454
import com.oracle.svm.core.hub.DynamicHubSupport;
55-
import com.oracle.svm.core.hub.DynamicHubTypeCheckUtil;
55+
import com.oracle.svm.core.hub.DynamicHubUtils;
5656
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
5757
import com.oracle.svm.core.util.VMError;
5858
import com.oracle.svm.hosted.OpenTypeWorldFeature;
@@ -145,7 +145,7 @@
145145
* entries encode the following:
146146
*
147147
* <pre>
148-
* hashTable[hash(interfaceID)] = (iTableOffset << {@link DynamicHubTypeCheckUtil#HASHING_ITABLE_SHIFT HASHING_ITABLE_OFFSET}) | interfaceID
148+
* hashTable[hash(interfaceID)] = (iTableOffset << {@link DynamicHubUtils#HASHING_ITABLE_SHIFT HASHING_ITABLE_OFFSET}) | interfaceID
149149
* </pre>
150150
*
151151
* Thus, interfaceIDs encoded in hash tables must be > 0, to properly distinguish them from empty
@@ -154,8 +154,8 @@
154154
* The implementation of the open-world typechecks can be found in {@link OpenTypeWorldSnippets},
155155
* the loading of interface methods can be found in {@link OpenTypeWorldDispatchTableSnippets}. The
156156
* type check data for dynamic hubs is computed in
157-
* {@link DynamicHubTypeCheckUtil#computeOpenTypeWorldTypeCheckData} with the hashing function being
158-
* defined in {@link DynamicHubTypeCheckUtil#hash}.
157+
* {@link DynamicHubUtils#computeOpenTypeWorldTypeCheckData} with the hashing function being defined
158+
* in {@link DynamicHubUtils#hash}.
159159
*/
160160
public final class TypeCheckBuilder {
161161
public static final int UNINITIALIZED_TYPECHECK_SLOTS = -1;

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/UniverseBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
import com.oracle.svm.core.heap.SubstrateReferenceMap;
8787
import com.oracle.svm.core.hub.DynamicHub;
8888
import com.oracle.svm.core.hub.DynamicHubSupport;
89-
import com.oracle.svm.core.hub.DynamicHubTypeCheckUtil;
89+
import com.oracle.svm.core.hub.DynamicHubUtils;
9090
import com.oracle.svm.core.hub.LayoutEncoding;
9191
import com.oracle.svm.core.imagelayer.DynamicImageLayerInfo;
9292
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
@@ -1004,7 +1004,7 @@ private void buildHubs() {
10041004
}
10051005

10061006
/**
1007-
* See {@link DynamicHubTypeCheckUtil#computeOpenTypeWorldTypeCheckData} for details on the
1007+
* See {@link DynamicHubUtils#computeOpenTypeWorldTypeCheckData} for details on the
10081008
* {@link DynamicHub} type check layout in the open type world.
10091009
*/
10101010
private static void setOpenTypeWorldData(HostedType type, DynamicHubLayout dynamicHubLayout, DynamicHub hub, boolean useOffsets) {
@@ -1020,7 +1020,7 @@ private static void setOpenTypeWorldData(HostedType type, DynamicHubLayout dynam
10201020
long vTableOffset = dynamicHubLayout.vTableOffset();
10211021
long vTableSlotSize = dynamicHubLayout.vTableSlotSize;
10221022

1023-
DynamicHubTypeCheckUtil.TypeCheckData typeCheckData = DynamicHubTypeCheckUtil.computeOpenTypeWorldTypeCheckData(implementsMethods, typeHierarchy, interfaceIDs, iTableOffsets, vTableOffset,
1023+
DynamicHubUtils.TypeCheckData typeCheckData = DynamicHubUtils.computeOpenTypeWorldTypeCheckData(implementsMethods, typeHierarchy, interfaceIDs, iTableOffsets, vTableOffset,
10241024
vTableSlotSize);
10251025

10261026
MethodRef[] vtable = createVTable(type.openTypeWorldDispatchTables, useOffsets);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/VTableBuilder.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -501,17 +501,21 @@ private static Set<HostedType> collectSubtypes(HostedType type, Set<HostedType>
501501
return allSubtypes;
502502
}
503503

504-
private void buildVTable(HostedClass clazz, Map<HostedType, ArrayList<HostedMethod>> vtablesMap, Map<HostedType, BitSet> usedSlotsMap, Map<HostedMethod, Set<Integer>> vtablesSlots) {
504+
private void assignImplementationsAndBuildVTable(HostedClass clazz, Map<HostedType, ArrayList<HostedMethod>> vtablesMap, Map<HostedType, BitSet> usedSlotsMap,
505+
Map<HostedMethod, Set<Integer>> vtablesSlots) {
505506
assignImplementations(clazz, vtablesMap, usedSlotsMap, vtablesSlots);
507+
buildVTable(clazz, vtablesMap, usedSlotsMap, vtablesSlots);
508+
}
506509

510+
private void buildVTable(HostedClass clazz, Map<HostedType, ArrayList<HostedMethod>> vtablesMap, Map<HostedType, BitSet> usedSlotsMap, Map<HostedMethod, Set<Integer>> vtablesSlots) {
507511
ArrayList<HostedMethod> vtable = vtablesMap.get(clazz);
508512
HostedMethod[] vtableArray = vtable.toArray(new HostedMethod[vtable.size()]);
509513
assert vtableArray.length == 0 || vtableArray[vtableArray.length - 1] != null : "Unnecessary entry at end of vtable";
510514
clazz.closedTypeWorldVTable = vtableArray;
511515

512516
for (HostedType subClass : clazz.subTypes) {
513517
if (!subClass.isInterface() && !subClass.isArray()) {
514-
buildVTable((HostedClass) subClass, vtablesMap, usedSlotsMap, vtablesSlots);
518+
assignImplementationsAndBuildVTable((HostedClass) subClass, vtablesMap, usedSlotsMap, vtablesSlots);
515519
}
516520
}
517521
}
@@ -547,7 +551,7 @@ private void assignImplementations(HostedType type, Map<HostedType, ArrayList<Ho
547551
* assignments into account.
548552
*/
549553
int slot = findSlot(method, vtablesMap, usedSlotsMap, vtablesSlots);
550-
method.computedVTableIndex = slot;
554+
installVTableIndex(method, slot);
551555

552556
/* Assign the vtable slot for the type and all subtypes. */
553557
assignImplementations(method.getDeclaringClass(), method, slot, vtablesMap);
@@ -574,7 +578,6 @@ private void assignImplementations(HostedType type, HostedMethod method, int slo
574578
assert vtable.get(slot) == null;
575579
vtable.set(slot, resolvedMethod);
576580
}
577-
resolvedMethod.computedVTableIndex = slot;
578581
}
579582
}
580583

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@
6868
import com.oracle.svm.core.config.ConfigurationValues;
6969
import com.oracle.svm.core.graal.meta.KnownOffsets;
7070
import com.oracle.svm.core.hub.DynamicHub;
71-
import com.oracle.svm.core.hub.DynamicHubTypeCheckUtil;
72-
import com.oracle.svm.core.hub.DynamicHubTypeCheckUtil.TypeCheckData;
71+
import com.oracle.svm.core.hub.DynamicHubUtils;
72+
import com.oracle.svm.core.hub.DynamicHubUtils.TypeCheckData;
7373
import com.oracle.svm.core.hub.LayoutEncoding;
7474
import com.oracle.svm.core.hub.RuntimeClassLoading.ClassDefinitionInfo;
7575
import com.oracle.svm.core.hub.RuntimeDynamicHubMetadata;
@@ -306,7 +306,7 @@ public DynamicHub createHub(ParserKlass parsed, ClassDefinitionInfo info, int ty
306306
}
307307

308308
/* Compute type check data, which might be based on interface hashing. */
309-
DynamicHubTypeCheckUtil.TypeCheckData typeCheckData = computeTypeCheckData(typeID, isInterface, numClassTypes, numInterfacesTypes, superHub, dispatchTable, transitiveSuperInterfaces);
309+
DynamicHubUtils.TypeCheckData typeCheckData = computeTypeCheckData(typeID, isInterface, numClassTypes, numInterfacesTypes, superHub, dispatchTable, transitiveSuperInterfaces);
310310

311311
int[] openTypeWorldTypeCheckSlots = typeCheckData.openTypeWorldTypeCheckSlots();
312312
int[] openTypeWorldInterfaceHashTable = typeCheckData.openTypeWorldInterfaceHashTable();
@@ -464,7 +464,7 @@ private static TypeCheckData computeTypeCheckData(int typeID, boolean typeIsInte
464464
long vTableBaseOffset = KnownOffsets.singleton().getVTableBaseOffset();
465465
long vTableEntrySize = KnownOffsets.singleton().getVTableEntrySize();
466466

467-
return DynamicHubTypeCheckUtil.computeOpenTypeWorldTypeCheckData(!typeIsInterface, typeHierarchy, interfaceIDs, iTableStartingIndices, vTableBaseOffset, vTableEntrySize);
467+
return DynamicHubUtils.computeOpenTypeWorldTypeCheckData(!typeIsInterface, typeHierarchy, interfaceIDs, iTableStartingIndices, vTableBaseOffset, vTableEntrySize);
468468
}
469469

470470
private static void fillVTable(DynamicHub hub, InterpreterResolvedJavaMethod[] vtable) {

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/InterpreterToVM.java

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.oracle.svm.core.graal.meta.KnownOffsets;
4747
import com.oracle.svm.core.graal.snippets.OpenTypeWorldDispatchTableSnippets;
4848
import com.oracle.svm.core.hub.DynamicHub;
49+
import com.oracle.svm.core.hub.DynamicHubUtils;
4950
import com.oracle.svm.core.hub.RuntimeClassLoading;
5051
import com.oracle.svm.core.jdk.InternalVMMethod;
5152
import com.oracle.svm.core.meta.MethodRef;
@@ -677,23 +678,11 @@ public static void ensureClassInitialized(Class<?> clazz) throws SemanticJavaExc
677678
}
678679
}
679680

680-
static CFunctionPointer peekAtSVMVTable(Class<?> seedClass, Class<?> thisClass, int vTableIndex, boolean isInvokeInterface) {
681-
DynamicHub seedHub = DynamicHub.fromClass(seedClass);
681+
static CFunctionPointer peekAtSVMVTable(Class<?> callTargetClass, Class<?> thisClass, int vTableIndex, boolean isInvokeInterface) {
682+
DynamicHub callTargetHub = DynamicHub.fromClass(callTargetClass);
682683
DynamicHub thisHub = DynamicHub.fromClass(thisClass);
683-
684-
int vtableOffset = KnownOffsets.singleton().getVTableOffset(vTableIndex, false);
685-
686-
if (SubstrateOptions.useClosedTypeWorldHubLayout()) {
687-
vtableOffset += KnownOffsets.singleton().getVTableBaseOffset();
688-
} else {
689-
VMError.guarantee(seedHub.isInterface() == isInvokeInterface);
690-
691-
if (!seedHub.isInterface()) {
692-
vtableOffset += KnownOffsets.singleton().getVTableBaseOffset();
693-
} else {
694-
vtableOffset += (int) OpenTypeWorldDispatchTableSnippets.determineITableStartingOffset(thisHub, seedHub.getInterfaceID());
695-
}
696-
}
684+
VMError.guarantee(callTargetHub.isInterface() == isInvokeInterface);
685+
int vtableOffset = DynamicHubUtils.determineDispatchTableOffset(thisHub, callTargetHub, vTableIndex);
697686
MethodRef vtableEntry = Word.objectToTrackedPointer(thisHub).readWord(vtableOffset);
698687
return getSVMVTableCodePointer(vtableEntry);
699688
}
@@ -722,20 +711,16 @@ private static InterpreterResolvedJavaMethod peekAtInterpreterVTable(Class<?> se
722711
VMError.guarantee(vTable != null);
723712

724713
DynamicHub seedHub = DynamicHub.fromClass(seedClass);
714+
VMError.guarantee(isInvokeInterface == seedHub.isInterface());
725715

726-
if (SubstrateOptions.useClosedTypeWorldHubLayout()) {
727-
VMError.guarantee(vTableIndex > 0 && vTableIndex < vTable.length);
728-
return vTable[vTableIndex];
716+
int idx;
717+
if (SubstrateOptions.useClosedTypeWorldHubLayout() || !seedHub.isInterface()) {
718+
idx = vTableIndex;
729719
} else {
730-
VMError.guarantee(seedHub.isInterface() == isInvokeInterface);
731-
732-
if (!seedHub.isInterface()) {
733-
return vTable[vTableIndex];
734-
} else {
735-
int iTableStartingIndex = determineITableStartingIndex(DynamicHub.fromClass(thisClass), seedHub.getInterfaceID());
736-
return vTable[iTableStartingIndex + vTableIndex];
737-
}
720+
idx = vTableIndex + determineITableStartingIndex(DynamicHub.fromClass(thisClass), seedHub.getInterfaceID());
738721
}
722+
VMError.guarantee(idx >= 0 && idx < vTable.length);
723+
return vTable[idx];
739724
}
740725

741726
private static int determineITableStartingIndex(DynamicHub thisHub, int interfaceID) {

substratevm/src/com.oracle.svm.jdwp.resident/src/com/oracle/svm/jdwp/resident/impl/ResidentJDWP.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1920,7 +1920,8 @@ static Result fromThrowable(Throwable throwable) {
19201920

19211921
static Result ofInvoke(boolean isVirtual, InterpreterResolvedJavaMethod method, Object... args) {
19221922
try {
1923-
return fromValue(InterpreterToVM.dispatchInvocation(method, args, isVirtual, false, false, false, false));
1923+
boolean isInvokeInterface = method.getDeclaringClass().isInterface();
1924+
return fromValue(InterpreterToVM.dispatchInvocation(method, args, isVirtual, false, false, isInvokeInterface, false));
19241925
} catch (SemanticJavaException e) {
19251926
return fromThrowable(e.getCause());
19261927
} catch (StackOverflowError | OutOfMemoryError error) {

0 commit comments

Comments
 (0)