Skip to content

Commit 88771f3

Browse files
committed
[GR-11201] Split statement node and expression nodes.
PullRequest: graalpython/183
2 parents 5dde5d9 + 03ee5ce commit 88771f3

File tree

173 files changed

+2012
-1721
lines changed

Some content is hidden

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

173 files changed

+2012
-1721
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.junit.Before;
5555
import org.junit.Test;
5656

57+
import com.oracle.graal.python.test.PythonTests;
5758
import com.oracle.truffle.api.debug.Breakpoint;
5859
import com.oracle.truffle.api.debug.DebugStackFrame;
5960
import com.oracle.truffle.api.debug.DebugValue;
@@ -70,6 +71,7 @@ public class PythonDebugTest {
7071
public void before() {
7172
Builder newBuilder = Context.newBuilder();
7273
newBuilder.allowAllAccess(true);
74+
PythonTests.closeContext();
7375
tester = new DebuggerTester(newBuilder);
7476
}
7577

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/grammar/TestParserTranslator.java

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,23 @@
6666
import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
6767
import com.oracle.graal.python.nodes.attributes.SetAttributeNode;
6868
import com.oracle.graal.python.nodes.call.PythonCallNode;
69-
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
70-
import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode;
71-
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
7269
import com.oracle.graal.python.nodes.control.BlockNode;
7370
import com.oracle.graal.python.nodes.expression.AndNode;
71+
import com.oracle.graal.python.nodes.expression.BinaryArithmetic;
7472
import com.oracle.graal.python.nodes.expression.BinaryComparisonNode;
7573
import com.oracle.graal.python.nodes.expression.CastToBooleanNode;
7674
import com.oracle.graal.python.nodes.expression.CastToBooleanNode.NotNode;
75+
import com.oracle.graal.python.nodes.expression.ExpressionNode;
7776
import com.oracle.graal.python.nodes.expression.IsNode;
7877
import com.oracle.graal.python.nodes.expression.OrNode;
78+
import com.oracle.graal.python.nodes.expression.TernaryArithmetic;
79+
import com.oracle.graal.python.nodes.expression.UnaryArithmetic;
7980
import com.oracle.graal.python.nodes.frame.DeleteGlobalNode;
8081
import com.oracle.graal.python.nodes.frame.DestructuringAssignmentNode;
82+
import com.oracle.graal.python.nodes.frame.FrameSlotIDs;
8183
import com.oracle.graal.python.nodes.frame.ReadGlobalOrBuiltinNode;
8284
import com.oracle.graal.python.nodes.frame.WriteGlobalNode;
85+
import com.oracle.graal.python.nodes.frame.WriteLocalVariableNode;
8386
import com.oracle.graal.python.nodes.frame.WriteNode;
8487
import com.oracle.graal.python.nodes.function.FunctionDefinitionNode;
8588
import com.oracle.graal.python.nodes.function.GeneratorExpressionNode;
@@ -134,13 +137,32 @@ <T> T getChild(Node result, int num, Class<? extends T> klass) {
134137
if (++i <= num) {
135138
continue;
136139
}
140+
n = unpackModuleBodyWrappers(n);
137141
assertTrue("Expected an instance of " + klass + ", got " + n.getClass(), klass.isInstance(n));
138142
return klass.cast(n);
139143
}
140144
assertFalse("Expected an instance of " + klass + ", got null", true);
141145
return null;
142146
}
143147

148+
private Node unpackModuleBodyWrappers(Node n) {
149+
Node actual = n;
150+
if (n instanceof ExpressionNode.ExpressionStatementNode) {
151+
actual = n.getChildren().iterator().next();
152+
} else if (n instanceof ExpressionNode.ExpressionWithSideEffects) {
153+
actual = n.getChildren().iterator().next();
154+
} else if (n instanceof WriteLocalVariableNode) {
155+
if (((WriteLocalVariableNode) n).getIdentifier().equals(FrameSlotIDs.RETURN_SLOT_ID)) {
156+
actual = ((WriteLocalVariableNode) n).getRhs();
157+
}
158+
}
159+
if (actual == n) {
160+
return n;
161+
} else {
162+
return unpackModuleBodyWrappers(actual);
163+
}
164+
}
165+
144166
<T> T getFirstChild(Node result, Class<? extends T> klass) {
145167
return getChild(result, 0, klass);
146168
}
@@ -150,7 +172,7 @@ <T> T parseAs(String src, Class<? extends T> klass) {
150172
}
151173

152174
Object literalAs(String src, Class<? extends PNode> klass) {
153-
PNode firstChild = parseAs(src, klass);
175+
ExpressionNode firstChild = (ExpressionNode) parseAs(src, klass);
154176
return firstChild.execute(null);
155177
}
156178

@@ -326,11 +348,11 @@ public void parseAssignments() {
326348
public void parseImport() {
327349
WriteGlobalNode importSet = parseAs("import foo", WriteGlobalNode.class);
328350
assertEquals("foo", importSet.getAttributeId());
329-
assert importSet.getRhs() instanceof ImportNode;
351+
assert importSet.getRhs() instanceof ImportNode.ImportExpression;
330352

331353
importSet = parseAs("import foo as bar", WriteGlobalNode.class);
332354
assertEquals("bar", importSet.getAttributeId());
333-
assert importSet.getRhs() instanceof ImportNode;
355+
assert importSet.getRhs() instanceof ImportNode.ImportExpression;
334356

335357
parseAs("from os import *", ImportStarNode.class);
336358
}
@@ -353,7 +375,7 @@ public void parseComparisons() {
353375

354376
AndNode parseAs = parseAs("x < y() <= z", AndNode.class);
355377
PNode leftNode = parseAs.getLeftNode();
356-
assert leftNode instanceof BlockNode;
378+
assert leftNode instanceof ExpressionNode.ExpressionWithSideEffects;
357379
WriteNode tmpWrite = getChild(leftNode, 0, WriteNode.class);
358380
assert tmpWrite.getRhs() instanceof PythonCallNode;
359381
PythonCallNode rhs = (PythonCallNode) tmpWrite.getRhs();
@@ -363,9 +385,9 @@ public void parseComparisons() {
363385

364386
@Test
365387
public void parseUnaryOps() {
366-
parseAs("-1", LookupAndCallUnaryNode.class);
367-
parseAs("+1", LookupAndCallUnaryNode.class);
368-
parseAs("~1", LookupAndCallUnaryNode.class);
388+
parseAs("-1", UnaryArithmetic.UnaryArithmeticExpression.class);
389+
parseAs("+1", UnaryArithmetic.UnaryArithmeticExpression.class);
390+
parseAs("~1", UnaryArithmetic.UnaryArithmeticExpression.class);
369391
parseAs("not 1", NotNode.class);
370392
}
371393

@@ -379,20 +401,20 @@ public void parseBooleanOps() {
379401

380402
@Test
381403
public void parseBinaryOp() {
382-
parseAs("1 | 1", LookupAndCallBinaryNode.class);
383-
parseAs("1 ^ 1", LookupAndCallBinaryNode.class);
384-
parseAs("1 & 1", LookupAndCallBinaryNode.class);
385-
parseAs("1 << 2", LookupAndCallBinaryNode.class);
386-
parseAs("1 >> 2", LookupAndCallBinaryNode.class);
387-
parseAs("1 >> 2 << 2", LookupAndCallBinaryNode.class);
388-
parseAs("1 | 1 & 2", LookupAndCallBinaryNode.class);
389-
parseAs("1 + 2", LookupAndCallBinaryNode.class);
390-
parseAs("1 - 2", LookupAndCallBinaryNode.class);
391-
parseAs("1 * 2", LookupAndCallBinaryNode.class);
392-
parseAs("1 / 2", LookupAndCallBinaryNode.class);
393-
parseAs("1 % 2", LookupAndCallBinaryNode.class);
394-
parseAs("1 // 2", LookupAndCallBinaryNode.class);
395-
parseAs("1 ** 2", LookupAndCallTernaryNode.class);
404+
parseAs("1 | 1", BinaryArithmetic.BinaryArithmeticExpression.class);
405+
parseAs("1 ^ 1", BinaryArithmetic.BinaryArithmeticExpression.class);
406+
parseAs("1 & 1", BinaryArithmetic.BinaryArithmeticExpression.class);
407+
parseAs("1 << 2", BinaryArithmetic.BinaryArithmeticExpression.class);
408+
parseAs("1 >> 2", BinaryArithmetic.BinaryArithmeticExpression.class);
409+
parseAs("1 >> 2 << 2", BinaryArithmetic.BinaryArithmeticExpression.class);
410+
parseAs("1 | 1 & 2", BinaryArithmetic.BinaryArithmeticExpression.class);
411+
parseAs("1 + 2", BinaryArithmetic.BinaryArithmeticExpression.class);
412+
parseAs("1 - 2", BinaryArithmetic.BinaryArithmeticExpression.class);
413+
parseAs("1 * 2", BinaryArithmetic.BinaryArithmeticExpression.class);
414+
parseAs("1 / 2", BinaryArithmetic.BinaryArithmeticExpression.class);
415+
parseAs("1 % 2", BinaryArithmetic.BinaryArithmeticExpression.class);
416+
parseAs("1 // 2", BinaryArithmetic.BinaryArithmeticExpression.class);
417+
parseAs("1 ** 2", TernaryArithmetic.TernaryArithmeticExpression.class);
396418
}
397419

398420
@Test

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.oracle.graal.python.nodes.PNode;
4848
import com.oracle.graal.python.nodes.call.InvokeNode;
4949
import com.oracle.graal.python.nodes.control.TopLevelExceptionHandler;
50+
import com.oracle.graal.python.nodes.expression.ExpressionNode;
5051
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5152
import com.oracle.graal.python.nodes.object.GetClassNode;
5253
import com.oracle.graal.python.parser.PythonParserImpl;
@@ -81,7 +82,8 @@
8182
import com.oracle.truffle.api.source.Source.SourceBuilder;
8283

8384
@TruffleLanguage.Registration(id = PythonLanguage.ID, name = PythonLanguage.NAME, version = PythonLanguage.VERSION, mimeType = PythonLanguage.MIME_TYPE, interactive = true, internal = false, contextPolicy = TruffleLanguage.ContextPolicy.SHARED)
84-
@ProvidedTags({StandardTags.CallTag.class, StandardTags.StatementTag.class, StandardTags.RootTag.class, StandardTags.TryBlockTag.class, DebuggerTags.AlwaysHalt.class})
85+
@ProvidedTags({StandardTags.CallTag.class, StandardTags.StatementTag.class, StandardTags.RootTag.class, StandardTags.TryBlockTag.class, StandardTags.ExpressionTag.class,
86+
DebuggerTags.AlwaysHalt.class})
8587
public final class PythonLanguage extends TruffleLanguage<PythonContext> {
8688
public static final String ID = "python";
8789
public static final String NAME = "Python";
@@ -250,7 +252,7 @@ protected ExecutableNode parse(InlineParsingRequest request) throws Exception {
250252
final ExecutableNode executableNode = new ExecutableNode(this) {
251253
private final ContextReference<PythonContext> contextRef = getContextReference();
252254
@CompilationFinal private volatile PythonContext cachedContext;
253-
@Child private PNode expression;
255+
@Child private ExpressionNode expression;
254256

255257
@Override
256258
public Object execute(VirtualFrame frame) {
@@ -280,17 +282,17 @@ private void parseAndCache(PythonContext context) {
280282

281283
@TruffleBoundary
282284
private Object parseAndEval(PythonContext context, MaterializedFrame frame) {
283-
PNode fragment = parseInline(source, context, frame);
285+
ExpressionNode fragment = parseInline(source, context, frame);
284286
return fragment.execute(frame);
285287
}
286288
};
287289
return executableNode;
288290
}
289291

290292
@TruffleBoundary
291-
protected static PNode parseInline(Source code, PythonContext context, MaterializedFrame lexicalContextFrame) {
293+
protected static ExpressionNode parseInline(Source code, PythonContext context, MaterializedFrame lexicalContextFrame) {
292294
PythonCore pythonCore = context.getCore();
293-
return (PNode) pythonCore.getParser().parse(ParserMode.InlineEvaluation, pythonCore, code, lexicalContextFrame);
295+
return (ExpressionNode) pythonCore.getParser().parse(ParserMode.InlineEvaluation, pythonCore, code, lexicalContextFrame);
294296
}
295297

296298
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
import com.oracle.graal.python.builtins.objects.ints.PInt;
8080
import com.oracle.graal.python.builtins.objects.str.PString;
8181
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
82-
import com.oracle.graal.python.nodes.PBaseNode;
82+
import com.oracle.graal.python.nodes.PNodeWithContext;
8383
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
8484
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
8585
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
@@ -1043,7 +1043,7 @@ int system(String cmd) {
10431043
}
10441044
}
10451045

1046-
abstract static class ConvertPathlikeObjectNode extends PBaseNode {
1046+
abstract static class ConvertPathlikeObjectNode extends PNodeWithContext {
10471047
@Child private LookupAndCallUnaryNode callFspathNode;
10481048
@CompilationFinal private ValueProfile resultTypeProfile;
10491049

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ PNone init(Object self, Object cls, Object obj) {
246246
if (!(cls instanceof PythonClass)) {
247247
throw raise(PythonErrorType.RuntimeError, "super(): __class__ is not a type (%p)", cls);
248248
}
249-
setTypeAttribute.execute(self, cls);
250-
setObjAttribute.execute(self, obj);
249+
setTypeAttribute.executeVoid(self, cls);
250+
setObjAttribute.executeVoid(self, obj);
251251
return PNone.NONE;
252252
}
253253

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
103103
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
104104
import com.oracle.graal.python.builtins.objects.type.PythonClass;
105-
import com.oracle.graal.python.nodes.PBaseNode;
105+
import com.oracle.graal.python.nodes.PNodeWithContext;
106106
import com.oracle.graal.python.nodes.PGuards;
107107
import com.oracle.graal.python.nodes.SpecialAttributeNames;
108108
import com.oracle.graal.python.nodes.SpecialMethodNames;
@@ -508,7 +508,7 @@ private Object getLongItem(PDict nativeMembers, String key) {
508508

509509
// roughly equivalent to _Py_CheckFunctionResult in Objects/call.c
510510
@ImportStatic(PGuards.class)
511-
abstract static class CheckFunctionResultNode extends PBaseNode {
511+
abstract static class CheckFunctionResultNode extends PNodeWithContext {
512512

513513
@Child private Node isNullNode;
514514

@@ -1081,7 +1081,7 @@ private CExtNodes.ToSulongNode getToSulongNode() {
10811081
}
10821082
}
10831083

1084-
abstract static class GetByteArrayNode extends PBaseNode {
1084+
abstract static class GetByteArrayNode extends PNodeWithContext {
10851085

10861086
@Child private Node readNode;
10871087

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
5757
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.NormalizeIndexNode;
5858
import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator;
59-
import com.oracle.graal.python.nodes.PBaseNode;
59+
import com.oracle.graal.python.nodes.PNodeWithContext;
6060
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6161
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
6262
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
@@ -75,7 +75,7 @@
7575
@CoreFunctions(extendClasses = PythonBuiltinClassType.PBytes)
7676
public class BytesBuiltins extends PythonBuiltins {
7777

78-
public static CodingErrorAction toCodingErrorAction(String errors, PBaseNode n) {
78+
public static CodingErrorAction toCodingErrorAction(String errors, PNodeWithContext n) {
7979
switch (errors) {
8080
case "strict":
8181
return CodingErrorAction.REPORT;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.NormalizeIndexNode;
5252
import com.oracle.graal.python.builtins.objects.list.PList;
5353
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
54-
import com.oracle.graal.python.nodes.PBaseNode;
54+
import com.oracle.graal.python.nodes.PNodeWithContext;
5555
import com.oracle.graal.python.nodes.PGuards;
5656
import com.oracle.graal.python.nodes.SpecialMethodNames;
5757
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
@@ -70,7 +70,7 @@
7070

7171
public abstract class BytesNodes {
7272

73-
public abstract static class BytesJoinNode extends PBaseNode {
73+
public abstract static class BytesJoinNode extends PNodeWithContext {
7474

7575
public abstract byte[] execute(byte[] sep, Object iterable);
7676

@@ -124,7 +124,7 @@ public static BytesJoinNode create() {
124124
}
125125

126126
@ImportStatic({PGuards.class, SpecialMethodNames.class})
127-
public abstract static class ToBytesNode extends PBaseNode {
127+
public abstract static class ToBytesNode extends PNodeWithContext {
128128
@Child private SequenceStorageNodes.ToByteArrayNode toByteArrayNode;
129129

130130
protected final boolean allowRecursive;
@@ -184,7 +184,7 @@ public static ToBytesNode create(boolean allowRecursive) {
184184
}
185185
}
186186

187-
public abstract static class FindNode extends PBaseNode {
187+
public abstract static class FindNode extends PNodeWithContext {
188188

189189
@Child private NormalizeIndexNode normalizeIndexNode;
190190
@Child private SequenceStorageNodes.GetItemNode getLeftItemNode;
@@ -276,7 +276,7 @@ public static FindNode create() {
276276
}
277277
}
278278

279-
public abstract static class FromListNode extends PBaseNode {
279+
public abstract static class FromListNode extends PNodeWithContext {
280280

281281
@Child private SequenceStorageNodes.GetItemNode getItemNode;
282282
@Child private SequenceStorageNodes.CastToByteNode castToByteNode;
@@ -318,7 +318,7 @@ private SequenceStorageNodes.LenNode getLenNode() {
318318
}
319319
}
320320

321-
public static class CmpNode extends PBaseNode {
321+
public static class CmpNode extends PNodeWithContext {
322322
@Child private SequenceStorageNodes.GetItemNode getLeftItemNode;
323323
@Child private SequenceStorageNodes.GetItemNode getRightItemNode;
324324
@Child private SequenceStorageNodes.LenNode leftLenNode;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/CExtNodes.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
import com.oracle.graal.python.builtins.objects.str.PString;
7373
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
7474
import com.oracle.graal.python.builtins.objects.type.PythonClass;
75-
import com.oracle.graal.python.nodes.PBaseNode;
75+
import com.oracle.graal.python.nodes.PNodeWithContext;
7676
import com.oracle.graal.python.nodes.PGuards;
7777
import com.oracle.graal.python.nodes.SpecialMethodNames;
7878
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
@@ -212,7 +212,7 @@ public static <T> FromNativeSubclassNode<T> create(PythonBuiltinClassType expect
212212
}
213213

214214
@ImportStatic(PGuards.class)
215-
abstract static class CExtBaseNode extends PBaseNode {
215+
abstract static class CExtBaseNode extends PNodeWithContext {
216216
@Child private Node readSymbolNode;
217217

218218
protected static boolean isNativeWrapper(Object obj) {
@@ -784,7 +784,7 @@ private TruffleObject getNativeFunction() {
784784

785785
}
786786

787-
public abstract static class AllToJavaNode extends PBaseNode {
787+
public abstract static class AllToJavaNode extends PNodeWithContext {
788788
@Child private CExtNodes.AsPythonObjectNode toJavaNode = CExtNodes.AsPythonObjectNode.create();
789789

790790
abstract Object[] execute(Object[] args);
@@ -815,7 +815,7 @@ public static AllToJavaNode create() {
815815
}
816816
}
817817

818-
public abstract static class AllToSulongNode extends PBaseNode {
818+
public abstract static class AllToSulongNode extends PNodeWithContext {
819819
public abstract void executeInto(Object[] args, int argsOffset, Object[] dest, int destOffset);
820820

821821
protected boolean isArgsOffsetPlus(int len, int off, int plus) {
@@ -879,7 +879,7 @@ public static AllToSulongNode create() {
879879
}
880880
}
881881

882-
protected abstract static class UpcallNode extends PBaseNode {
882+
protected abstract static class UpcallNode extends PNodeWithContext {
883883
@Child AllToJavaNode allToJava = null;
884884

885885
protected AllToJavaNode getAllToJavaNode() {
@@ -962,7 +962,7 @@ protected final Object getAttr(Object object, String name) {
962962
}
963963
}
964964

965-
public abstract static class AsDouble extends PBaseNode {
965+
public abstract static class AsDouble extends PNodeWithContext {
966966
@Child private LookupAndCallUnaryNode callFloatFunc;
967967

968968
public abstract double execute(boolean arg);
@@ -1053,7 +1053,7 @@ public static AsDouble create() {
10531053
}
10541054
}
10551055

1056-
public abstract static class AsLong extends PBaseNode {
1056+
public abstract static class AsLong extends PNodeWithContext {
10571057
@Child private CastToIndexNode intNode;
10581058

10591059
public abstract long execute(boolean arg);

0 commit comments

Comments
 (0)