Skip to content

Commit 8d8a6b8

Browse files
committed
[GR-9747] [GR-10405] Separate Python builtins into unary, binary, ternary, varargs and generic builtins.
PullRequest: graalpython/64
2 parents b61fbf9 + 969d379 commit 8d8a6b8

File tree

134 files changed

+1169
-1017
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

134 files changed

+1169
-1017
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/PythonTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public static void assertPrints(String expected, String code) {
169169
String source = code;
170170
PythonTests.runScript(new String[0], source, printStream, System.err);
171171
String result = byteArray.toString().replaceAll("\r\n", "\n");
172-
assertEquals(expected, result);
172+
assertEquals(expected.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>"), result.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>"));
173173
}
174174

175175
public static VirtualFrame createVirtualFrame() {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import java.util.HashMap;
2929

30+
import com.oracle.truffle.api.CompilerAsserts;
31+
3032
public enum PythonBuiltinClassType {
3133

3234
TruffleObject(com.oracle.truffle.api.interop.TruffleObject.class, "truffle_object"),
@@ -109,6 +111,7 @@ public enum PythonBuiltinClassType {
109111

110112
@Override
111113
public String toString() {
114+
CompilerAsserts.neverPartOfCompilation();
112115
return shortName;
113116
}
114117

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java

Lines changed: 10 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -30,30 +30,20 @@
3030

3131
import java.util.AbstractMap;
3232
import java.util.AbstractMap.SimpleEntry;
33-
import java.util.ArrayList;
3433
import java.util.Arrays;
3534
import java.util.Collections;
3635
import java.util.HashMap;
3736
import java.util.List;
3837
import java.util.Map;
3938
import java.util.Map.Entry;
40-
import java.util.function.Consumer;
41-
import java.util.function.Function;
39+
import java.util.function.BiConsumer;
4240

43-
import com.oracle.graal.python.PythonLanguage;
44-
import com.oracle.graal.python.builtins.objects.PNone;
4541
import com.oracle.graal.python.builtins.objects.function.Arity;
4642
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4743
import com.oracle.graal.python.builtins.objects.object.PythonObject;
4844
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
49-
import com.oracle.graal.python.nodes.PNode;
50-
import com.oracle.graal.python.nodes.argument.ReadDefaultArgumentNode;
51-
import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode;
52-
import com.oracle.graal.python.nodes.argument.ReadKeywordNode;
53-
import com.oracle.graal.python.nodes.argument.ReadVarArgsNode;
54-
import com.oracle.graal.python.nodes.argument.ReadVarKeywordsNode;
5545
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
56-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5747
import com.oracle.graal.python.runtime.PythonCore;
5848
import com.oracle.truffle.api.RootCallTarget;
5949
import com.oracle.truffle.api.Truffle;
@@ -64,14 +54,14 @@ public abstract class PythonBuiltins {
6454
private final Map<String, PBuiltinFunction> builtinFunctions = new HashMap<>();
6555
private final Map<PythonBuiltinClass, Map.Entry<Class<?>[], Boolean>> builtinClasses = new HashMap<>();
6656

67-
protected abstract List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories();
57+
protected abstract List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories();
6858

6959
public void initialize(PythonCore core) {
7060
if (builtinFunctions.size() > 0) {
7161
return;
7262
}
73-
initializeEachFactoryWith(factory -> builtin -> {
74-
RootCallTarget callTarget = createBuiltinCallTarget(core.getLanguage(), factory, builtin.name(), createArgumentsList(builtin));
63+
initializeEachFactoryWith((factory, builtin) -> {
64+
RootCallTarget callTarget = Truffle.getRuntime().createCallTarget(new BuiltinFunctionRootNode(core.getLanguage(), builtin, factory));
7565
String name = builtin.name();
7666
if (builtin.constructsClass().length > 0) {
7767
name = __NEW__;
@@ -104,7 +94,7 @@ public void initialize(PythonCore core) {
10494

10595
public final void initializeClasses(PythonCore core) {
10696
assert builtinClasses.isEmpty();
107-
initializeEachFactoryWith(factory -> builtin -> {
97+
initializeEachFactoryWith((factory, builtin) -> {
10898
if (builtin.constructsClass().length > 0) {
10999
createBuiltinClassFor(core, builtin);
110100
}
@@ -147,24 +137,15 @@ private PythonBuiltinClass createBuiltinClassFor(PythonCore core, Builtin builti
147137
return builtinClass;
148138
}
149139

150-
private void initializeEachFactoryWith(Function<NodeFactory<PythonBuiltinNode>, Consumer<Builtin>> func) {
151-
@SuppressWarnings("unchecked")
152-
List<NodeFactory<PythonBuiltinNode>> factories = (List<NodeFactory<PythonBuiltinNode>>) getNodeFactories();
140+
private void initializeEachFactoryWith(BiConsumer<NodeFactory<? extends PythonBuiltinBaseNode>, Builtin> func) {
141+
List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> factories = getNodeFactories();
153142
assert factories != null : "No factories found. Override getFactories() to resolve this.";
154-
for (NodeFactory<PythonBuiltinNode> factory : factories) {
143+
for (NodeFactory<? extends PythonBuiltinBaseNode> factory : factories) {
155144
Builtin builtin = factory.getNodeClass().getAnnotation(Builtin.class);
156-
func.apply(factory).accept(builtin);
145+
func.accept(factory, builtin);
157146
}
158147
}
159148

160-
private static RootCallTarget createBuiltinCallTarget(PythonLanguage language, NodeFactory<PythonBuiltinNode> factory, String name, PNode[] argsKeywords) {
161-
PythonBuiltinNode builtinNode = factory.createNode((Object) argsKeywords);
162-
language.getNodeFactory().registerNodeFactory(builtinNode, factory);
163-
BuiltinFunctionRootNode rootNode = new BuiltinFunctionRootNode(language, name, builtinNode);
164-
RootCallTarget callTarget = Truffle.getRuntime().createCallTarget(rootNode);
165-
return callTarget;
166-
}
167-
168149
private static Arity createArity(Builtin builtin) {
169150
int minNum = builtin.minNumOfArguments();
170151
int maxNum = Math.max(minNum, builtin.maxNumOfArguments());
@@ -178,53 +159,6 @@ private static Arity createArity(Builtin builtin) {
178159
Arrays.asList(new String[0]), Arrays.asList(builtin.keywordArguments()));
179160
}
180161

181-
private static PNode[] createArgumentsList(Builtin builtin) {
182-
ArrayList<PNode> args = new ArrayList<>();
183-
int numOfPositionalArgs = Math.max(builtin.minNumOfArguments(), builtin.maxNumOfArguments());
184-
185-
if (builtin.keywordArguments().length > 0 && builtin.maxNumOfArguments() > builtin.minNumOfArguments()) {
186-
// (tfel): This is actually a specification error, if there are keyword
187-
// names, we cannot also have optional positional arguments, but we're
188-
// being defensive here.
189-
numOfPositionalArgs = builtin.minNumOfArguments();
190-
}
191-
192-
if (builtin.fixedNumOfArguments() > 0) {
193-
numOfPositionalArgs = builtin.fixedNumOfArguments();
194-
}
195-
196-
// read those arguments that only come positionally
197-
for (int i = 0; i < numOfPositionalArgs; i++) {
198-
args.add(ReadIndexedArgumentNode.create(i));
199-
}
200-
201-
// read splat args if any
202-
if (builtin.takesVariableArguments()) {
203-
args.add(ReadVarArgsNode.create(args.size(), true));
204-
}
205-
206-
// read named keyword arguments
207-
for (int i = 0; i < builtin.keywordArguments().length; i++) {
208-
String name = builtin.keywordArguments()[i];
209-
ReadDefaultArgumentNode defaultNode = new ReadDefaultArgumentNode();
210-
defaultNode.setValue(PNone.NO_VALUE);
211-
if (!builtin.takesVariableArguments()) {
212-
// if there's no splat, we also accept the keywords positionally
213-
args.add(ReadKeywordNode.create(name, i + numOfPositionalArgs, defaultNode));
214-
} else {
215-
// if there is a splat, keywords have to be passed by name
216-
args.add(ReadKeywordNode.create(name, defaultNode));
217-
}
218-
}
219-
220-
if (builtin.takesVariableKeywords()) {
221-
args.add(ReadVarKeywordsNode.create(builtin.keywordArguments()));
222-
}
223-
224-
PNode[] argsKeywords = args.toArray(new PNode[args.size()]);
225-
return argsKeywords;
226-
}
227-
228162
private void setBuiltinFunction(String name, PBuiltinFunction function) {
229163
builtinFunctions.put(name, function);
230164
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ArrayModuleBuiltins.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.graal.python.builtins.objects.type.PythonClass;
3939
import com.oracle.graal.python.nodes.control.GetIteratorNode;
4040
import com.oracle.graal.python.nodes.control.GetNextNode;
41+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4142
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
4243
import com.oracle.graal.python.runtime.exception.PException;
4344
import com.oracle.graal.python.runtime.sequence.PSequence;
@@ -54,7 +55,7 @@
5455
public final class ArrayModuleBuiltins extends PythonBuiltins {
5556

5657
@Override
57-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
58+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
5859
return ArrayModuleBuiltinsFactory.getFactories();
5960
}
6061

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AstModuleBuiltins.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,18 @@
3838
*/
3939
package com.oracle.graal.python.builtins.modules;
4040

41+
import java.util.ArrayList;
42+
import java.util.List;
43+
4144
import com.oracle.graal.python.builtins.CoreFunctions;
4245
import com.oracle.graal.python.builtins.PythonBuiltins;
43-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4447
import com.oracle.truffle.api.dsl.NodeFactory;
4548

46-
import java.util.ArrayList;
47-
import java.util.List;
48-
4949
@CoreFunctions(defineModule = "_ast")
5050
public class AstModuleBuiltins extends PythonBuiltins {
5151
@Override
52-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
52+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
5353
return new ArrayList<>();
5454
}
5555
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AtexitModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import com.oracle.graal.python.builtins.objects.PNone;
4747
import com.oracle.graal.python.builtins.objects.function.PKeyword;
4848
import com.oracle.graal.python.nodes.call.CallNode;
49-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
49+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5050
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5151
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
5252
import com.oracle.truffle.api.Truffle;
@@ -60,7 +60,7 @@
6060
@CoreFunctions(defineModule = "atexit")
6161
public class AtexitModuleBuiltins extends PythonBuiltins {
6262
@Override
63-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
63+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
6464
return AtexitModuleBuiltinsFactory.getFactories();
6565
}
6666

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BisectModuleBuiltins.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.oracle.graal.python.builtins.PythonBuiltins;
3232
import com.oracle.graal.python.builtins.objects.PNone;
3333
import com.oracle.graal.python.builtins.objects.list.PList;
34+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
3435
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
3536
import com.oracle.graal.python.runtime.sequence.PSequence;
3637
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -41,7 +42,7 @@
4142
final class BisectModuleBuiltins extends PythonBuiltins {
4243

4344
@Override
44-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
45+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
4546
return BisectModuleBuiltinsFactory.getFactories();
4647
}
4748

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@
129129
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
130130
import com.oracle.graal.python.nodes.control.GetIteratorNode;
131131
import com.oracle.graal.python.nodes.control.GetNextNode;
132+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
132133
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
133134
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
134135
import com.oracle.graal.python.nodes.object.GetClassNode;
@@ -152,7 +153,7 @@
152153
public final class BuiltinConstructors extends PythonBuiltins {
153154

154155
@Override
155-
protected List<com.oracle.truffle.api.dsl.NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
156+
protected List<com.oracle.truffle.api.dsl.NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
156157
return BuiltinConstructorsFactory.getFactories();
157158
}
158159

@@ -353,8 +354,28 @@ public void enumerate(@SuppressWarnings("unused") PythonClass cls, @SuppressWarn
353354
public abstract static class ReversedNode extends PythonBuiltinNode {
354355

355356
@Specialization
356-
public PythonObject reversed(@SuppressWarnings("unused") PythonClass cls, PRange range) {
357-
return factory().createRangeReverseIterator(range);
357+
public PythonObject reversed(@SuppressWarnings("unused") PythonClass cls, PRange range,
358+
@Cached("createBinaryProfile()") ConditionProfile stepOneProfile,
359+
@Cached("createBinaryProfile()") ConditionProfile stepMinusOneProfile) {
360+
int stop;
361+
int start;
362+
int step = range.getStep();
363+
if (stepOneProfile.profile(step == 1)) {
364+
start = range.getStop() - 1;
365+
stop = range.getStart() - 1;
366+
step = -1;
367+
} else if (stepMinusOneProfile.profile(step == -1)) {
368+
start = range.getStop() + 1;
369+
stop = range.getStart() + 1;
370+
step = 1;
371+
} else {
372+
assert step != 0;
373+
long delta = (range.getStop() - (long) range.getStart() - (step > 0 ? -1 : 1)) / step * step;
374+
start = (int) (range.getStart() + delta);
375+
stop = range.getStart() - step;
376+
step = -step;
377+
}
378+
return factory().createRangeIterator(start, stop, step);
358379
}
359380

360381
@Specialization
@@ -798,7 +819,7 @@ public PList listObject(@SuppressWarnings("unused") Object cls, Object arg) {
798819
@GenerateNodeFactory
799820
public abstract static class ObjectNode extends PythonVarargsBuiltinNode {
800821
@Override
801-
public final Object execute(Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported {
822+
public final Object varArgExecute(Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported {
802823
return execute(PNone.NO_VALUE, arguments, keywords);
803824
}
804825

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
import com.oracle.graal.python.nodes.expression.CastToBooleanNode;
114114
import com.oracle.graal.python.nodes.expression.TernaryArithmetic;
115115
import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode;
116+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
116117
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
117118
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
118119
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
@@ -151,7 +152,7 @@
151152
public final class BuiltinFunctions extends PythonBuiltins {
152153

153154
@Override
154-
protected List<com.oracle.truffle.api.dsl.NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
155+
protected List<com.oracle.truffle.api.dsl.NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
155156
return BuiltinFunctionsFactory.getFactories();
156157
}
157158

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import com.oracle.graal.python.builtins.objects.PNone;
5959
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
6060
import com.oracle.graal.python.builtins.objects.bytes.PIBytesLike;
61+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6162
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
6263
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6364
import com.oracle.truffle.api.dsl.Cached;
@@ -216,7 +217,7 @@ static Charset getCharset(String encoding) {
216217
}
217218

218219
@Override
219-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
220+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
220221
return CodecsModuleBuiltinsFactory.getFactories();
221222
}
222223

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CollectionsModuleBuiltins.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,18 @@
3838
*/
3939
package com.oracle.graal.python.builtins.modules;
4040

41+
import java.util.ArrayList;
42+
import java.util.List;
43+
4144
import com.oracle.graal.python.builtins.CoreFunctions;
4245
import com.oracle.graal.python.builtins.PythonBuiltins;
43-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4447
import com.oracle.truffle.api.dsl.NodeFactory;
4548

46-
import java.util.ArrayList;
47-
import java.util.List;
48-
4949
@CoreFunctions(defineModule = "_collections")
5050
public class CollectionsModuleBuiltins extends PythonBuiltins {
5151
@Override
52-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
52+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
5353
return new ArrayList<>();
5454
}
5555
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ErrnoModuleBuiltins.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,20 @@
4343

4444
import com.oracle.graal.python.builtins.CoreFunctions;
4545
import com.oracle.graal.python.builtins.PythonBuiltins;
46-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4747
import com.oracle.graal.python.runtime.PythonCore;
4848
import com.oracle.truffle.api.dsl.NodeFactory;
4949

5050
@CoreFunctions(defineModule = "errno")
5151
public class ErrnoModuleBuiltins extends PythonBuiltins {
5252
@Override
53-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
53+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
5454
return new ArrayList<>();
5555
}
5656

5757
/**
5858
* Generated using the following:
59-
*
59+
*
6060
* <pre>
6161
* grep -RPo "#define\s+([A-Z]+)\s+(\d+)" /usr/include/asm-generic/errno* | awk '{print "builtinConstants.put(\"" $2 "\", " $3 ");"}'
6262
* </pre>

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@
4343

4444
import com.oracle.graal.python.builtins.CoreFunctions;
4545
import com.oracle.graal.python.builtins.PythonBuiltins;
46-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4747
import com.oracle.truffle.api.dsl.NodeFactory;
4848

4949
@CoreFunctions(defineModule = "faulthandler")
5050
public class FaulthandlerModuleBuiltins extends PythonBuiltins {
5151
@Override
52-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
52+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
5353
return new ArrayList<>();
5454
}
5555
}

0 commit comments

Comments
 (0)