Skip to content

Commit 43ed10f

Browse files
committed
Use an IntValueProfile for splat arg profiling.
1 parent 9d58c4f commit 43ed10f

File tree

2 files changed

+7
-18
lines changed

2 files changed

+7
-18
lines changed

src/main/java/org/truffleruby/language/arguments/SplatToArgsNode.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,29 @@
99
*/
1010
package org.truffleruby.language.arguments;
1111

12-
import com.oracle.truffle.api.dsl.Cached;
13-
import com.oracle.truffle.api.dsl.Specialization;
1412
import com.oracle.truffle.api.nodes.Node.Child;
13+
import com.oracle.truffle.api.profiles.IntValueProfile;
1514

1615
import org.truffleruby.core.array.ArrayGuards;
1716
import org.truffleruby.core.array.RubyArray;
1817
import org.truffleruby.core.array.library.ArrayStoreLibrary;
1918
import org.truffleruby.language.RubyBaseNode;
2019

21-
public abstract class SplatToArgsNode extends RubyBaseNode {
20+
public class SplatToArgsNode extends RubyBaseNode {
2221

2322
@Child protected ArrayStoreLibrary stores;
2423

24+
final IntValueProfile splatSizeProfile = IntValueProfile.createIdentityProfile();
25+
2526
public SplatToArgsNode() {
2627
stores = ArrayStoreLibrary.getFactory().createDispatched(ArrayGuards.storageStrategyLimit());
2728
}
2829

29-
public abstract Object[] execute(Object receiver, Object[] rubyArgs, RubyArray splatted);
30-
31-
@Specialization(limit = "2", guards = "splatted.size == size")
32-
protected Object[] smallSplatted(Object receiver, Object[] rubyArgs, RubyArray splatted,
33-
@Cached("splatted.size") int size) {
30+
public Object[] execute(Object receiver, Object[] rubyArgs, RubyArray splatted) {
31+
int size = splatSizeProfile.profile(splatted.size);
3432
Object store = splatted.store;
3533
Object[] newArgs = RubyArguments.repack(rubyArgs, receiver, 0, size, 0);
3634
stores.copyContents(store, 0, newArgs, RubyArguments.RUNTIME_ARGUMENT_COUNT, size);
3735
return newArgs;
3836
}
39-
40-
@Specialization
41-
protected Object[] smallSplatted(Object receiver, Object[] rubyArgs, RubyArray splatted) {
42-
Object store = splatted.store;
43-
Object[] newArgs = RubyArguments.repack(rubyArgs, receiver, 0, splatted.size, 0);
44-
stores.copyContents(store, 0, newArgs, RubyArguments.RUNTIME_ARGUMENT_COUNT, splatted.size);
45-
return newArgs;
46-
}
4737
}

src/main/java/org/truffleruby/language/dispatch/RubyCallNode.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.truffleruby.language.RubyNode;
2626
import org.truffleruby.language.arguments.RubyArguments;
2727
import org.truffleruby.language.arguments.SplatToArgsNode;
28-
import org.truffleruby.language.arguments.SplatToArgsNodeGen;
2928
import org.truffleruby.language.literal.NilLiteralNode;
3029
import org.truffleruby.language.methods.BlockDefinitionNode;
3130
import org.truffleruby.language.methods.InternalMethod;
@@ -178,7 +177,7 @@ private void executeArguments(VirtualFrame frame, Object[] rubyArgs) {
178177
private Object[] splatArgs(Object receiverObject, Object[] rubyArgs) {
179178
if (splatToArgs == null) {
180179
CompilerDirectives.transferToInterpreterAndInvalidate();
181-
splatToArgs = insert(SplatToArgsNodeGen.create());
180+
splatToArgs = insert(new SplatToArgsNode());
182181
}
183182

184183
return splatToArgs.execute(receiverObject, rubyArgs, (RubyArray) RubyArguments.getArgument(rubyArgs, 0));

0 commit comments

Comments
 (0)