Skip to content

Commit 273ff1f

Browse files
committed
[GR-64781] Pass correct node to inlined branch profiles in InteropLookupAndInvoke.
PullRequest: graal/21218
2 parents c924a4e + e0e8fd9 commit 273ff1f

File tree

4 files changed

+32
-18
lines changed

4 files changed

+32
-18
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/bytecodes/InvokeVirtual.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,20 +169,22 @@ Object callDirect(Object[] args,
169169
@Specialization
170170
@ReportPolymorphism.Megamorphic
171171
Object callIndirect(Object[] args,
172+
@Bind Node node,
172173
@Cached InlinedBranchProfile error,
173174
@Cached IndirectCallNode indirectCallNode) {
174175
StaticObject receiver = (StaticObject) args[0];
175176
assert args[0] == receiver;
176177
assert !StaticObject.isNull(receiver);
177178
// vtable lookup.
178-
Method.MethodVersion target = genericMethodLookup(this, resolutionSeed, receiver.getKlass(), error);
179+
Method.MethodVersion target = genericMethodLookup(node, resolutionSeed, receiver.getKlass(), error);
179180
return indirectCallNode.call(target.getCallTarget(), args);
180181
}
181182
}
182183

183184
static Method.MethodVersion methodLookup(Method resolutionSeed, Klass receiverKlass) {
184185
CompilerAsserts.neverPartOfCompilation();
185-
return genericMethodLookup(null, resolutionSeed, receiverKlass, InlinedBranchProfile.getUncached());
186+
return genericMethodLookup(null, // OK for uncached branch profile.
187+
resolutionSeed, receiverKlass, InlinedBranchProfile.getUncached());
186188
}
187189

188190
static Method.MethodVersion genericMethodLookup(Node node, Method resolutionSeed, Klass receiverKlass, InlinedBranchProfile error) {

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/bytecodes/NullCheck.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
*/
2323
package com.oracle.truffle.espresso.nodes.bytecodes;
2424

25+
import com.oracle.truffle.api.dsl.Bind;
2526
import com.oracle.truffle.api.dsl.Cached;
2627
import com.oracle.truffle.api.dsl.GenerateUncached;
2728
import com.oracle.truffle.api.dsl.Specialization;
29+
import com.oracle.truffle.api.nodes.Node;
2830
import com.oracle.truffle.api.nodes.NodeInfo;
2931
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
3032
import com.oracle.truffle.espresso.nodes.EspressoNode;
@@ -37,9 +39,11 @@ public abstract class NullCheck extends EspressoNode {
3739
abstract StaticObject execute(StaticObject receiver);
3840

3941
@Specialization
40-
StaticObject doNullCheck(StaticObject receiver, @Cached InlinedBranchProfile exceptionProfile) {
42+
StaticObject doNullCheck(StaticObject receiver,
43+
@Bind Node node,
44+
@Cached InlinedBranchProfile exceptionProfile) {
4145
if (StaticObject.isNull(receiver)) {
42-
exceptionProfile.enter(this);
46+
exceptionProfile.enter(node);
4347
throw getMeta().throwNullPointerException();
4448
}
4549
return receiver;

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/ToReference.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,7 @@ public StaticObject doEspresso(StaticObject value,
18581858
"isHostObject(getContext(), value)"
18591859
})
18601860
StaticObject doForeignInternalConverter(Object value,
1861+
@Bind Node node,
18611862
@Shared("value") @CachedLibrary(limit = "LIMIT") InteropLibrary interop,
18621863
@Cached LookupInternalTypeConverterNode lookupTypeConverterNode,
18631864
@Cached ToReference.DynamicToReference converterToEspresso,
@@ -1875,7 +1876,7 @@ StaticObject doForeignInternalConverter(Object value,
18751876
} catch (UnsupportedMessageException e) {
18761877
// no meta object, fall through to throw unsupported type
18771878
}
1878-
errorProfile.enter(this);
1879+
errorProfile.enter(node);
18791880
throw ToEspressoNode.unsupportedType(value, targetType.getRawType());
18801881
}
18811882
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/staticobject/InteropLookupAndInvoke.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
*/
2323
package com.oracle.truffle.espresso.runtime.dispatch.staticobject;
2424

25+
import com.oracle.truffle.api.dsl.Bind;
2526
import com.oracle.truffle.api.dsl.Cached;
2627
import com.oracle.truffle.api.dsl.Cached.Exclusive;
2728
import com.oracle.truffle.api.dsl.GenerateUncached;
2829
import com.oracle.truffle.api.dsl.Specialization;
2930
import com.oracle.truffle.api.interop.ArityException;
3031
import com.oracle.truffle.api.interop.UnknownIdentifierException;
3132
import com.oracle.truffle.api.interop.UnsupportedTypeException;
33+
import com.oracle.truffle.api.nodes.Node;
3234
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
3335
import com.oracle.truffle.espresso.impl.Klass;
3436
import com.oracle.truffle.espresso.impl.Method;
@@ -71,7 +73,8 @@ public abstract Object execute(StaticObject receiver, Klass klass, Object[] argu
7173
@GenerateUncached
7274
public abstract static class Virtual extends InteropLookupAndInvoke {
7375
@Specialization
74-
public Object doVirtual(StaticObject receiver, Klass klass, Object[] arguments, String member,
76+
Object doVirtual(StaticObject receiver, Klass klass, Object[] arguments, String member,
77+
@Bind Node node,
7578
@Cached LookupVirtualMethodNode lookup,
7679
@Cached SelectAndInvokeNode selectAndInvoke,
7780
@Cached InlinedBranchProfile error,
@@ -80,17 +83,18 @@ public Object doVirtual(StaticObject receiver, Klass klass, Object[] arguments,
8083
assert receiver != null;
8184
Method[] candidates = lookup.execute(klass, member, arguments.length);
8285
if (candidates != null) {
83-
return selectAndInvoke(selectAndInvoke, exception, receiver, arguments, candidates);
86+
return selectAndInvoke(selectAndInvoke, exception, node, receiver, arguments, candidates);
8487
}
85-
error.enter(this);
88+
error.enter(node);
8689
throw ArityException.create(arguments.length + 1, -1, arguments.length);
8790
}
8891
}
8992

9093
@GenerateUncached
9194
public abstract static class NonVirtual extends InteropLookupAndInvoke {
9295
@Specialization
93-
public Object doNonVirtual(StaticObject receiver, Klass klass, Object[] arguments, String member,
96+
Object doNonVirtual(StaticObject receiver, Klass klass, Object[] arguments, String member,
97+
@Bind Node node,
9498
@Cached LookupDeclaredMethod lookup,
9599
@Cached SelectAndInvokeNode selectAndInvoke,
96100
@Cached InlinedBranchProfile error,
@@ -99,19 +103,20 @@ public Object doNonVirtual(StaticObject receiver, Klass klass, Object[] argument
99103
boolean isStatic = receiver == null;
100104
Method[] candidates = lookup.execute(klass, member, true, isStatic, arguments.length);
101105
if (candidates != null) {
102-
return selectAndInvoke(selectAndInvoke, exception, receiver, arguments, candidates);
106+
return selectAndInvoke(selectAndInvoke, exception, node, receiver, arguments, candidates);
103107
}
104-
error.enter(this);
108+
error.enter(node);
105109
throw ArityException.create(arguments.length + 1, -1, arguments.length);
106110
}
107111
}
108112

109-
Object selectAndInvoke(SelectAndInvokeNode selectAndInvoke, InlinedBranchProfile exception,
113+
Object selectAndInvoke(SelectAndInvokeNode selectAndInvoke,
114+
InlinedBranchProfile exception, Node node,
110115
StaticObject receiver, Object[] args, Method[] candidates) throws UnsupportedTypeException, ArityException {
111116
try {
112117
return selectAndInvoke.execute(receiver, args, candidates);
113118
} catch (EspressoException e) {
114-
exception.enter(this);
119+
exception.enter(node);
115120
throw InteropUtils.unwrapExceptionBoundary(getLanguage(), e, getMeta());
116121
}
117122
}
@@ -121,7 +126,7 @@ abstract static class SelectAndInvokeNode extends EspressoNode {
121126
public abstract Object execute(StaticObject receiver, Object[] args, Method[] candidates) throws ArityException, UnsupportedTypeException;
122127

123128
@Specialization(guards = {"isSingleNonVarargs(candidates)"})
124-
Object doSingleNonVarargs(StaticObject receiver, Object[] args, Method[] candidates,
129+
static Object doSingleNonVarargs(StaticObject receiver, Object[] args, Method[] candidates,
125130
@Cached @Exclusive InvokeEspressoNode invoke,
126131
@Cached InteropUnwrapNode unwrapNode)
127132
throws ArityException, UnsupportedTypeException {
@@ -133,7 +138,8 @@ Object doSingleNonVarargs(StaticObject receiver, Object[] args, Method[] candida
133138
}
134139

135140
@Specialization(guards = {"isSingleVarargs(candidates)"})
136-
Object doSingleVarargs(StaticObject receiver, Object[] args, Method[] candidates,
141+
static Object doSingleVarargs(StaticObject receiver, Object[] args, Method[] candidates,
142+
@Bind Node node,
137143
@Cached @Exclusive InvokeEspressoNode invoke,
138144
@Cached ToEspressoNode.DynamicToEspresso toEspresso,
139145
@Cached InteropUnwrapNode unwrapNode,
@@ -148,12 +154,13 @@ Object doSingleVarargs(StaticObject receiver, Object[] args, Method[] candidates
148154
assert matched != null;
149155
return invoke.execute(matched.getMethod(), receiver, matched.getConvertedArgs(), true, unwrapNode);
150156
}
151-
error.enter(this);
157+
error.enter(node);
152158
throw UnsupportedTypeException.create(args);
153159
}
154160

155161
@Specialization(guards = {"isMulti(candidates)"})
156-
Object doMulti(StaticObject receiver, Object[] args, Method[] candidates,
162+
static Object doMulti(StaticObject receiver, Object[] args, Method[] candidates,
163+
@Bind Node node,
157164
@Cached OverLoadedMethodSelectorNode selector,
158165
@Cached @Exclusive InvokeEspressoNode invoke,
159166
@Cached InteropUnwrapNode unwrapNode,
@@ -165,7 +172,7 @@ Object doMulti(StaticObject receiver, Object[] args, Method[] candidates,
165172
return invoke.execute(typeMatched.getMethod(), receiver, typeMatched.getConvertedArgs(), true, unwrapNode);
166173
} else {
167174
// unable to select exactly one best candidate for the input args!
168-
error.enter(this);
175+
error.enter(node);
169176
throw UnsupportedTypeException.create(args);
170177
}
171178
}

0 commit comments

Comments
 (0)