diff --git a/src/annotations/java/org/truffleruby/annotations/Split.java b/src/annotations/java/org/truffleruby/annotations/Split.java index 1df0392d676d..1283ca7cc1a0 100644 --- a/src/annotations/java/org/truffleruby/annotations/Split.java +++ b/src/annotations/java/org/truffleruby/annotations/Split.java @@ -14,7 +14,7 @@ public enum Split { DEFAULT, ALWAYS, HEURISTIC, - /** Disallow splitting for this CallTarget, which avoids making a eager uninitialized copy of the AST. Useful + /** Disallow splitting for this CallTarget, which avoids making an eager uninitialized copy of the AST. Useful * notably for methods not specializing on their arguments and just calling a TruffleBoundary. */ NEVER } diff --git a/src/main/java/org/truffleruby/cext/CExtNodes.java b/src/main/java/org/truffleruby/cext/CExtNodes.java index e12e45019a09..4f90953c0ab4 100644 --- a/src/main/java/org/truffleruby/cext/CExtNodes.java +++ b/src/main/java/org/truffleruby/cext/CExtNodes.java @@ -34,6 +34,7 @@ import org.truffleruby.annotations.CoreMethod; import org.truffleruby.annotations.CoreModule; import org.truffleruby.annotations.Primitive; +import org.truffleruby.annotations.Split; import org.truffleruby.annotations.Visibility; import org.truffleruby.builtins.CoreMethodArrayArgumentsNode; import org.truffleruby.builtins.PrimitiveArrayArgumentsNode; @@ -2029,8 +2030,7 @@ protected RubyArray compileArgTypes(AbstractTruffleString format, RubyEncoding e } } - @CoreMethod(names = "rb_tr_sprintf", onSingleton = true, required = 3) - @ReportPolymorphism + @CoreMethod(names = "rb_tr_sprintf", onSingleton = true, required = 3, split = Split.ALWAYS) public abstract static class RBSprintfNode extends CoreMethodArrayArgumentsNode { @Specialization(guards = "libFormat.isRubyString(format)", limit = "1") @@ -2069,6 +2069,7 @@ static RubyString format(Object format, Object stringReader, RubyArray argArray, @GenerateInline @GenerateCached(false) + @ReportPolymorphism public abstract static class RBSprintfInnerNode extends RubyBaseNode { public abstract BytesResult execute(Node node, AbstractTruffleString format, RubyEncoding encoding, diff --git a/src/main/java/org/truffleruby/core/array/ArrayNodes.java b/src/main/java/org/truffleruby/core/array/ArrayNodes.java index 0acb446d7104..66590e273968 100644 --- a/src/main/java/org/truffleruby/core/array/ArrayNodes.java +++ b/src/main/java/org/truffleruby/core/array/ArrayNodes.java @@ -1491,8 +1491,7 @@ public void accept(Node node, CallBlockNode yieldNode, RubyArray array, Object s } - @CoreMethod(names = "pack", required = 1) - @ReportPolymorphism + @CoreMethod(names = "pack", required = 1, split = Split.ALWAYS) public abstract static class ArrayPackNode extends CoreMethodArrayArgumentsNode { @Specialization @@ -1506,6 +1505,7 @@ RubyString pack(RubyArray array, Object format, @GenerateCached(false) @GenerateInline + @ReportPolymorphism public abstract static class PackNode extends RubyBaseNode { public abstract RubyString execute(Node node, RubyArray array, Object format); diff --git a/src/main/java/org/truffleruby/core/kernel/KernelNodes.java b/src/main/java/org/truffleruby/core/kernel/KernelNodes.java index 222a2166d9a5..dded976baf38 100644 --- a/src/main/java/org/truffleruby/core/kernel/KernelNodes.java +++ b/src/main/java/org/truffleruby/core/kernel/KernelNodes.java @@ -1616,8 +1616,8 @@ public static long sleepFor(RubyContext context, RubyThread thread, long duratio } - @CoreMethod(names = { "format", "sprintf" }, isModuleFunction = true, rest = true, required = 1) - @ReportPolymorphism + @CoreMethod(names = { "format", "sprintf" }, isModuleFunction = true, rest = true, required = 1, + split = Split.ALWAYS) public abstract static class SprintfNode extends CoreMethodArrayArgumentsNode { static final String GVAR_DEBUG = "$DEBUG"; @@ -1665,6 +1665,7 @@ private static RubyString finishFormat(Node node, int formatLength, BytesResult @GenerateInline @GenerateCached(false) + @ReportPolymorphism public abstract static class SprintfInnerNode extends RubyBaseNode { public abstract BytesResult execute(Node node, AbstractTruffleString format, RubyEncoding encoding, diff --git a/src/main/java/org/truffleruby/language/dispatch/DispatchNode.java b/src/main/java/org/truffleruby/language/dispatch/DispatchNode.java index f524c2d97ee2..7c078578f019 100644 --- a/src/main/java/org/truffleruby/language/dispatch/DispatchNode.java +++ b/src/main/java/org/truffleruby/language/dispatch/DispatchNode.java @@ -300,13 +300,11 @@ Object dispatch(Frame frame, Object receiver, String methodName, Object[] rubyAr return callNode.execute(frame, method, receiver, rubyArgs); } - /** This will be called from the {@link CallInternalMethodNode} child whenever it creates a new * {@link DirectCallNode}. */ public final void applySplittingInliningStrategy(RootCallTarget callTarget, String methodName, DirectCallNode callNode) { - final Options options = getContext().getOptions(); // The way that #method_missing is used is usually as an indirection to call some other method, and possibly to diff --git a/src/main/ruby/truffleruby/core/io.rb b/src/main/ruby/truffleruby/core/io.rb index eec725b9d0ca..372ee7fa27d3 100644 --- a/src/main/ruby/truffleruby/core/io.rb +++ b/src/main/ruby/truffleruby/core/io.rb @@ -1664,6 +1664,7 @@ def printf(fmt, *args) fmt = StringValue(fmt) write sprintf(fmt, *args) end + Truffle::Graal.always_split(instance_method(:printf)) def read(length = nil, buffer = nil) ensure_open_and_readable @@ -2485,6 +2486,7 @@ def print(*args) def printf(fmt, *args) @write.printf(fmt, *args) end + Truffle::Graal.always_split(instance_method(:printf)) def putc(obj) @write.putc(obj) diff --git a/src/main/ruby/truffleruby/core/kernel.rb b/src/main/ruby/truffleruby/core/kernel.rb index 6dbfb42faebe..338e8b8b6165 100644 --- a/src/main/ruby/truffleruby/core/kernel.rb +++ b/src/main/ruby/truffleruby/core/kernel.rb @@ -721,6 +721,8 @@ def printf(*args) nil end module_function :printf + Truffle::Graal.always_split(instance_method(:printf)) + Truffle::Graal.always_split(method(:printf)) private def pp(*args) require 'pp' diff --git a/src/main/ruby/truffleruby/core/string.rb b/src/main/ruby/truffleruby/core/string.rb index 509ba6bdead4..7c6d30dd2f16 100644 --- a/src/main/ruby/truffleruby/core/string.rb +++ b/src/main/ruby/truffleruby/core/string.rb @@ -1392,10 +1392,12 @@ def unpack(format, offset: undefined) end Primitive.string_unpack(self, format, offset) end + Truffle::Graal.always_split(instance_method(:unpack)) def unpack1(format, offset: undefined) unpack(format, offset: offset).first end + Truffle::Graal.always_split(instance_method(:unpack1)) def unicode_normalize(form = :nfc) require 'unicode_normalize/normalize.rb' unless defined? UnicodeNormalize