Skip to content

Commit 1b070e8

Browse files
committed
Avoid traversing cache to determine size, instead keep it explicitly
Signed-off-by: Stefan Marr <[email protected]>
1 parent d27013f commit 1b070e8

File tree

1 file changed

+12
-21
lines changed

1 file changed

+12
-21
lines changed

src/trufflesom/interpreter/nodes/MessageSendNode.java

+12-21
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public static GenericMessageSendNode createGeneric(final SSymbol selector,
6464
final ExpressionNode[] argumentNodes, final SourceSection source,
6565
final Universe universe) {
6666
return new GenericMessageSendNode(
67-
selector, argumentNodes, universe, true).initialize(source);
67+
selector, argumentNodes, universe, 0).initialize(source);
6868
}
6969

7070
public static AbstractMessageSendNode createSuperSend(final SClass superClass,
@@ -123,22 +123,22 @@ public static final class GenericMessageSendNode
123123

124124
private final int numberOfSignatureArguments;
125125

126-
@CompilationFinal private boolean triedEager;
126+
@CompilationFinal private int numCacheNodes;
127127

128128
@Child private GuardedDispatchNode dispatchCache;
129129

130130
private GenericMessageSendNode(final SSymbol selector, final ExpressionNode[] arguments,
131-
final Universe universe, final boolean triedEager) {
131+
final Universe universe, final int numCacheNodes) {
132132
super(arguments);
133133
this.selector = selector;
134134
this.universe = universe;
135-
this.triedEager = triedEager;
135+
this.numCacheNodes = numCacheNodes;
136136
this.numberOfSignatureArguments = selector.getNumberOfSignatureArguments();
137137
}
138138

139139
private GenericMessageSendNode(final SSymbol selector, final ExpressionNode[] arguments,
140140
final Universe universe) {
141-
this(selector, arguments, universe, false);
141+
this(selector, arguments, universe, -1);
142142
}
143143

144144
@Override
@@ -197,19 +197,9 @@ public String toString() {
197197
return "GMsgSend(" + selector.getString() + ")";
198198
}
199199

200-
private int getCacheSize(GuardedDispatchNode cache) {
201-
int cacheSize = 0;
202-
while (cache != null) {
203-
cache = cache.next;
204-
cacheSize += 1;
205-
}
206-
207-
return cacheSize;
208-
}
209-
210200
@Override
211201
public NodeCost getCost() {
212-
if (!triedEager) {
202+
if (numCacheNodes < 0) {
213203
return NodeCost.UNINITIALIZED;
214204
}
215205

@@ -219,7 +209,7 @@ public NodeCost getCost() {
219209
return NodeCost.MEGAMORPHIC;
220210
}
221211

222-
int cacheSize = getCacheSize(cache);
212+
int cacheSize = numCacheNodes;
223213

224214
if (cacheSize == 0) {
225215
return NodeCost.UNINITIALIZED;
@@ -233,8 +223,9 @@ public NodeCost getCost() {
233223
}
234224

235225
private PreevaluatedExpression specialize(final Object[] arguments) {
236-
if (!triedEager) {
237-
triedEager = true;
226+
int cacheSize = numCacheNodes;
227+
if (cacheSize < 0) {
228+
cacheSize = numCacheNodes = 0;
238229
PreevaluatedExpression eager = attemptEagerSpecialization(arguments);
239230
if (eager != null) {
240231
return eager;
@@ -243,8 +234,6 @@ private PreevaluatedExpression specialize(final Object[] arguments) {
243234

244235
final GuardedDispatchNode first = dispatchCache;
245236

246-
int cacheSize = getCacheSize(first);
247-
248237
Object rcvr = arguments[0];
249238
assert rcvr != null;
250239

@@ -287,6 +276,7 @@ private PreevaluatedExpression specialize(final Object[] arguments) {
287276
node.next = node.insertHere(first);
288277
}
289278
dispatchCache = insert(node);
279+
numCacheNodes = cacheSize + 1;
290280
return node;
291281
}
292282

@@ -295,6 +285,7 @@ private PreevaluatedExpression specialize(final Object[] arguments) {
295285
GenericDispatchNode generic = new GenericDispatchNode(selector, universe);
296286
dispatchCache = insert(generic);
297287
reportPolymorphicSpecialize();
288+
numCacheNodes = cacheSize + 1;
298289
return generic;
299290
}
300291

0 commit comments

Comments
 (0)