Skip to content

Commit 251f56d

Browse files
committed
[GR-15903] Primitives cleanup.
PullRequest: truffleruby/848
2 parents b8b0bcc + 55bda23 commit 251f56d

File tree

8 files changed

+26
-107
lines changed

8 files changed

+26
-107
lines changed

ci.jsonnet

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ local composition_environment = utils.add_inclusion_tracking(part_definitions, "
539539
{
540540
local darwin_gate = $.platform.darwin + $.cap.gate + $.jdk.labsjdk8 + $.use.common + $.use.build + { timelimit: "01:00:00" },
541541

542-
"ruby-test-specs-darwin": darwin_gate + $.run.test_unit_tck_specs + $.run.test_basictest + { timelimit: "45:00" },
542+
"ruby-test-specs-darwin": darwin_gate + $.run.test_unit_tck_specs + $.run.test_basictest + { timelimit: "50:00" },
543543
"ruby-test-mri-darwin": darwin_gate + $.run.test_mri,
544544
"ruby-test-cexts-darwin": darwin_gate + $.use.gem_test_pack + $.run.test_cexts,
545545
"ruby-test-gems-darwin": darwin_gate + $.use.gem_test_pack + $.run.test_gems,

lib/truffle/socket/unix_socket.rb

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626

2727
class UNIXSocket < BasicSocket
28-
include IO::TransferIO
29-
3028
def self.socketpair(type = Socket::SOCK_STREAM, protocol = 0)
3129
family = Socket::AF_UNIX
3230
type = Truffle::Socket.socket_type(type)
@@ -79,20 +77,12 @@ def peeraddr
7977
['AF_UNIX', path]
8078
end
8179

82-
def recv_io(klass = IO, mode = nil)
83-
begin
84-
fd = recv_fd
85-
rescue PrimitiveFailure
86-
raise SocketError, 'file descriptor was not passed'
87-
end
88-
89-
return fd unless klass
80+
def send_io(io)
81+
raise NotImplementedError, 'IO#send_io not yet implemented'
82+
end
9083

91-
if klass.is_a?(BasicSocket)
92-
klass.for_fd(fd)
93-
else
94-
klass.for_fd(fd, mode)
95-
end
84+
def recv_io(klass = IO, mode = nil)
85+
raise NotImplementedError, 'IO#recv_io not yet implemented'
9686
end
9787

9888
def local_address

src/main/java/org/truffleruby/builtins/CoreMethodNodeManager.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,14 @@ private static RootCallTarget createCallTarget(RubyContext context, SharedMethod
225225
}
226226

227227
public static RubyNode createCoreMethodNode(NodeFactory<? extends RubyNode> nodeFactory, CoreMethod method, SharedMethodInfo sharedMethodInfo) {
228-
final List<RubyNode> argumentsNodes = new ArrayList<>();
228+
final RubyNode[] argumentsNodes = new RubyNode[nodeFactory.getExecutionSignature().size()];
229+
int i = 0;
229230

230231
final boolean needsSelf = needsSelf(method);
231232

232233
if (needsSelf) {
233234
RubyNode readSelfNode = ProfileArgumentNodeGen.create(new ReadSelfNode());
234-
argumentsNodes.add(transformArgument(method, readSelfNode, 0));
235+
argumentsNodes[i++] = transformArgument(method, readSelfNode, 0);
235236
}
236237

237238
final int required = method.required();
@@ -245,23 +246,23 @@ public static RubyNode createCoreMethodNode(NodeFactory<? extends RubyNode> node
245246

246247
for (int n = 0; n < nArgs; n++) {
247248
RubyNode readArgumentNode = ProfileArgumentNodeGen.create(new ReadPreArgumentNode(n, MissingArgumentBehavior.NOT_PROVIDED));
248-
argumentsNodes.add(transformArgument(method, readArgumentNode, n + 1));
249+
argumentsNodes[i++] = transformArgument(method, readArgumentNode, n + 1);
249250
}
250251

251252
if (method.rest()) {
252-
argumentsNodes.add(new ReadRemainingArgumentsNode(nArgs));
253+
argumentsNodes[i++] = new ReadRemainingArgumentsNode(nArgs);
253254
}
254255

255256
if (method.needsBlock()) {
256-
argumentsNodes.add(new ReadBlockNode(NotProvided.INSTANCE));
257+
argumentsNodes[i++] = new ReadBlockNode(NotProvided.INSTANCE);
257258
}
258259

259260
if (!method.keywordAsOptional().isEmpty()) {
260261
if (optional > 0) {
261262
throw new UnsupportedOperationException("core method has been declared with both optional arguments and a keyword-as-optional argument");
262263
}
263264

264-
argumentsNodes.add(new ReadKeywordArgumentNode(required, method.keywordAsOptional(), new NotProvidedNode()));
265+
argumentsNodes[i++] = new ReadKeywordArgumentNode(required, method.keywordAsOptional(), new NotProvidedNode());
265266
}
266267

267268
RubyNode node = createNodeFromFactory(nodeFactory, argumentsNodes);
@@ -274,7 +275,7 @@ public static RubyNode createCoreMethodNode(NodeFactory<? extends RubyNode> node
274275
return new ExceptionTranslatingNode(node, method.unsupportedOperationBehavior());
275276
}
276277

277-
public static RubyNode createNodeFromFactory(NodeFactory<? extends RubyNode> nodeFactory, List<RubyNode> argumentsNodes) {
278+
public static RubyNode createNodeFromFactory(NodeFactory<? extends RubyNode> nodeFactory, RubyNode[] argumentsNodes) {
278279
final List<List<Class<?>>> signatures = nodeFactory.getNodeSignatures();
279280

280281
assert signatures.size() == 1;
@@ -283,12 +284,11 @@ public static RubyNode createNodeFromFactory(NodeFactory<? extends RubyNode> nod
283284
if (signature.size() == 0) {
284285
return nodeFactory.createNode();
285286
} else {
286-
final RubyNode[] argumentsArray = argumentsNodes.toArray(RubyNode.EMPTY_ARRAY);
287287
if (signature.size() == 1 && signature.get(0) == RubyNode[].class) {
288-
Object args = argumentsArray;
288+
Object args = argumentsNodes;
289289
return nodeFactory.createNode(args);
290290
} else {
291-
Object[] args = argumentsArray;
291+
Object[] args = argumentsNodes;
292292
return nodeFactory.createNode(args);
293293
}
294294
}

src/main/java/org/truffleruby/builtins/PrimitiveManager.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.oracle.truffle.api.dsl.NodeFactory;
1414

1515
import org.truffleruby.collections.ConcurrentOperations;
16-
import org.truffleruby.core.support.UndefinedPrimitiveNodesFactory.UndefinedPrimitiveNodeFactory;
1716
import org.truffleruby.language.RubyNode;
1817

1918
import java.util.Map;
@@ -28,14 +27,6 @@ public class PrimitiveManager {
2827

2928
private final Map<String, PrimitiveNodeConstructor> primitives = new ConcurrentHashMap<>();
3029

31-
private final PrimitiveNodeConstructor undefinedPrimitive;
32-
33-
public PrimitiveManager() {
34-
final NodeFactory<? extends RubyNode> nodeFactory = UndefinedPrimitiveNodeFactory.getInstance();
35-
final Primitive annotation = nodeFactory.getNodeClass().getAnnotation(Primitive.class);
36-
undefinedPrimitive = new PrimitiveNodeConstructor(annotation, nodeFactory);
37-
}
38-
3930
public PrimitiveNodeConstructor getPrimitive(String name) {
4031
final PrimitiveNodeConstructor constructor = primitives.get(name);
4132
if (constructor != null) {
@@ -49,7 +40,7 @@ public PrimitiveNodeConstructor getPrimitive(String name) {
4940
}
5041
}
5142

52-
return undefinedPrimitive;
43+
throw new Error("Primitive :" + name + " not found");
5344
}
5445

5546
public void addLazyPrimitive(String primitive, String nodeFactoryClass) {

src/main/java/org/truffleruby/builtins/PrimitiveNodeConstructor.java

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,19 @@ public int getPrimitiveArity() {
4545
}
4646

4747
public RubyNode createCallPrimitiveNode(SourceIndexLength sourceSection, RubyNode fallback) {
48+
final RubyNode[] arguments = new RubyNode[getPrimitiveArity()];
4849
int argumentsCount = getPrimitiveArity();
49-
final List<RubyNode> arguments = new ArrayList<>(argumentsCount);
50+
int start = 0;
5051

5152
if (annotation.needsSelf()) {
52-
arguments.add(transformArgument(ProfileArgumentNodeGen.create(new ReadSelfNode()), 0));
53+
arguments[0] = transformArgument(ProfileArgumentNodeGen.create(new ReadSelfNode()), 0);
54+
start++;
5355
argumentsCount--;
5456
}
5557

5658
for (int n = 0; n < argumentsCount; n++) {
5759
RubyNode readArgumentNode = ProfileArgumentNodeGen.create(new ReadPreArgumentNode(n, MissingArgumentBehavior.NOT_PROVIDED));
58-
arguments.add(transformArgument(readArgumentNode, n + 1));
60+
arguments[start + n] = transformArgument(readArgumentNode, n + 1);
5961
}
6062

6163
final RubyNode primitiveNode = CoreMethodNodeManager.createNodeFromFactory(factory, arguments);
@@ -73,20 +75,7 @@ public RubyNode createInvokePrimitiveNode(RubyContext context, Source source, So
7375
arguments[n] = transformArgument(arguments[n], nthArg);
7476
}
7577

76-
final List<List<Class<?>>> signatures = factory.getNodeSignatures();
77-
78-
assert signatures.size() == 1;
79-
final List<Class<?>> signature = signatures.get(0);
80-
81-
final RubyNode primitiveNode;
82-
83-
if (signature.get(0) == SourceSection.class) {
84-
primitiveNode = factory.createNode(sourceSection.toSourceSection(source), arguments);
85-
} else if (signature.get(0) == SourceIndexLength.class) {
86-
primitiveNode = factory.createNode(sourceSection, arguments);
87-
} else {
88-
primitiveNode = factory.createNode(new Object[] { arguments });
89-
}
78+
final RubyNode primitiveNode = CoreMethodNodeManager.createNodeFromFactory(factory, arguments);
9079

9180
return Translator.withSourceSection(sourceSection, new InvokePrimitiveNode(primitiveNode));
9281
}

src/main/java/org/truffleruby/core/support/UndefinedPrimitiveNodes.java

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/main/java/org/truffleruby/parser/BodyTranslator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -614,16 +614,15 @@ private RubyNode translateInvokePrimitive(SourceIndexLength sourceSection, CallP
614614
final String primitiveName = ((SymbolParseNode) firstArgNode).getName();
615615
final PrimitiveNodeConstructor primitive = context.getPrimitiveManager().getPrimitive(primitiveName);
616616

617-
final List<RubyNode> arguments = new ArrayList<>();
618617

619618
final ArrayParseNode args = (ArrayParseNode) node.getArgsNode();
620619
// The first argument was the symbol so we ignore it
620+
final RubyNode[] arguments = new RubyNode[args.size() - 1];
621621
for (int n = 1; n < args.size(); n++) {
622-
RubyNode readArgumentNode = args.get(n).accept(this);
623-
arguments.add(readArgumentNode);
622+
arguments[n - 1] = args.get(n).accept(this);
624623
}
625624

626-
return primitive.createInvokePrimitiveNode(context, source, sourceSection, arguments.toArray(RubyNode.EMPTY_ARRAY));
625+
return primitive.createInvokePrimitiveNode(context, source, sourceSection, arguments);
627626
}
628627

629628
private ParseNode extractFirstArgumentNode(ParseNode argsNode) {

src/main/ruby/core/io.rb

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,6 @@ class IO
3939

4040
include Enumerable
4141

42-
module TransferIO
43-
def send_io
44-
Truffle.primitive :io_send_io
45-
raise PrimitiveFailure, 'IO#send_io failed'
46-
end
47-
48-
def recv_fd
49-
Truffle.primitive :io_recv_fd
50-
raise PrimitiveFailure, 'IO#recv_fd failed'
51-
end
52-
end
53-
5442
module WaitReadable; end
5543
module WaitWritable; end
5644

0 commit comments

Comments
 (0)