Skip to content

Commit 1d46e4b

Browse files
committed
[GR-12398] Various performance and style fixes.
PullRequest: graalpython/224
2 parents e9b38d2 + 787b4ce commit 1d46e4b

33 files changed

+162
-118
lines changed

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

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@
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.control.BlockNode;
7069
import com.oracle.graal.python.nodes.expression.AndNode;
7170
import com.oracle.graal.python.nodes.expression.BinaryArithmetic;
7271
import com.oracle.graal.python.nodes.expression.BinaryComparisonNode;
@@ -149,7 +148,7 @@ private Node unpackModuleBodyWrappers(Node n) {
149148
Node actual = n;
150149
if (n instanceof ExpressionNode.ExpressionStatementNode) {
151150
actual = n.getChildren().iterator().next();
152-
} else if (n instanceof ExpressionNode.ExpressionWithSideEffects) {
151+
} else if (n instanceof ExpressionNode.ExpressionWithSideEffects || n instanceof ExpressionNode.ExpressionWithSideEffect) {
153152
actual = n.getChildren().iterator().next();
154153
} else if (n instanceof WriteLocalVariableNode) {
155154
if (((WriteLocalVariableNode) n).getIdentifier().equals(FrameSlotIDs.RETURN_SLOT_ID)) {
@@ -316,9 +315,6 @@ public void parseDelStatement() {
316315
parseAs("del world", DeleteGlobalNode.class);
317316
parseAs("del world[0]", DeleteItemNode.class);
318317
parseAs("del world.field", DeleteAttributeNode.class);
319-
BlockNode parseAs = parseAs("del world.field, world[0]", BlockNode.class);
320-
getChild(parseAs, 0, DeleteAttributeNode.class);
321-
getChild(parseAs, 1, DeleteItemNode.class);
322318
}
323319

324320
@Test
@@ -334,11 +330,6 @@ public void parseAssignments() {
334330
parseAs = parseAs("a = 1,2", WriteGlobalNode.class);
335331
assert parseAs.getRhs() instanceof TupleLiteralNode;
336332

337-
BlockNode parseAs2 = parseAs("a = b = 1", BlockNode.class);
338-
getChild(parseAs2, 0, WriteNode.class); // write tmp
339-
getChild(parseAs2, 1, WriteNode.class); // write a
340-
getChild(parseAs2, 2, WriteNode.class); // write b
341-
342333
parseAs("a,b = 1,2", DestructuringAssignmentNode.class);
343334
parseAs("a,*b,c = 1,2", DestructuringAssignmentNode.class);
344335
parseAs("[[a],*b],c = 1,2", DestructuringAssignmentNode.class);
@@ -375,7 +366,7 @@ public void parseComparisons() {
375366

376367
AndNode parseAs = parseAs("x < y() <= z", AndNode.class);
377368
PNode leftNode = parseAs.getLeftNode();
378-
assert leftNode instanceof ExpressionNode.ExpressionWithSideEffects;
369+
assert leftNode instanceof ExpressionNode.ExpressionWithSideEffect;
379370
WriteNode tmpWrite = getChild(leftNode, 0, WriteNode.class);
380371
assert tmpWrite.getRhs() instanceof PythonCallNode;
381372
PythonCallNode rhs = (PythonCallNode) tmpWrite.getRhs();

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/interop/JavaInteropTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.io.IOException;
4949
import java.util.Arrays;
5050
import java.util.List;
51+
import java.io.UnsupportedEncodingException;
5152

5253
import org.graalvm.polyglot.Context;
5354
import org.graalvm.polyglot.Context.Builder;
@@ -99,7 +100,7 @@ public void evalFailsOnError() {
99100
}
100101

101102
@Test
102-
public void truffleMethodExport() throws Exception {
103+
public void truffleMethodExport() {
103104
String source = "import polyglot\n" +
104105
"@polyglot.export_value\n" +
105106
"def foo():\n" +
@@ -111,7 +112,7 @@ public void truffleMethodExport() throws Exception {
111112
}
112113

113114
@Test
114-
public void javaArraySet() throws Exception {
115+
public void javaArraySet() {
115116
String source = "import java\n" +
116117
"array = java.type(\"int[]\")(4)\n" +
117118
"array[2] = 42\n" +
@@ -120,7 +121,7 @@ public void javaArraySet() throws Exception {
120121
}
121122

122123
@Test
123-
public void testPassingFloats() throws Exception {
124+
public void testPassingFloats() throws UnsupportedEncodingException {
124125
String source = "import polyglot\n" +
125126
"@polyglot.export_value\n" +
126127
"def foo(x, y):\n" +
@@ -133,7 +134,7 @@ public void testPassingFloats() throws Exception {
133134
}
134135

135136
@Test
136-
public void testAsFunction() throws Exception {
137+
public void testAsFunction() throws UnsupportedEncodingException {
137138
String source = "import polyglot\n" +
138139
"@polyglot.export_value\n" +
139140
"def foo():\n" +
@@ -146,7 +147,7 @@ public void testAsFunction() throws Exception {
146147
}
147148

148149
@Test
149-
public void testAsFunctionVarArgs() throws Exception {
150+
public void testAsFunctionVarArgs() throws UnsupportedEncodingException {
150151
String source = "import polyglot\n" +
151152
"@polyglot.export_value\n" +
152153
"def foo(a, b):\n" +
@@ -159,7 +160,7 @@ public void testAsFunctionVarArgs() throws Exception {
159160
}
160161

161162
@Test
162-
public void mainFunctionsAreImplicitlyImporteable() throws Exception {
163+
public void mainFunctionsAreImplicitlyImporteable() throws UnsupportedEncodingException {
163164
String source = "def foo(a, b):\n" +
164165
" print(a, b)\n\n";
165166
Source script = Source.create("python", source);
@@ -170,7 +171,7 @@ public void mainFunctionsAreImplicitlyImporteable() throws Exception {
170171
}
171172

172173
@Test
173-
public void builtinFunctionsAreImporteable() throws Exception {
174+
public void builtinFunctionsAreImporteable() throws UnsupportedEncodingException {
174175
String source = "pass";
175176
Source script = Source.create("python", source);
176177
context.eval(script);
@@ -180,7 +181,7 @@ public void builtinFunctionsAreImporteable() throws Exception {
180181
}
181182

182183
@Test
183-
public void testMultipleInvocationsAreInSameScope() throws Exception {
184+
public void testMultipleInvocationsAreInSameScope() throws UnsupportedEncodingException {
184185
String source = "def foo(a, b):\n" +
185186
" print(a, b)\n" +
186187
"foo";

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import com.oracle.graal.python.builtins.objects.type.PythonClass;
5252
import com.oracle.graal.python.nodes.BuiltinNames;
5353
import com.oracle.graal.python.nodes.NodeFactory;
54-
import com.oracle.graal.python.nodes.PNode;
5554
import com.oracle.graal.python.nodes.call.InvokeNode;
5655
import com.oracle.graal.python.nodes.control.TopLevelExceptionHandler;
5756
import com.oracle.graal.python.nodes.expression.ExpressionNode;
@@ -222,12 +221,12 @@ protected OptionDescriptors getOptionDescriptors() {
222221
}
223222

224223
@Override
225-
protected void initializeContext(PythonContext context) throws Exception {
224+
protected void initializeContext(PythonContext context) {
226225
context.initialize();
227226
}
228227

229228
@Override
230-
protected CallTarget parse(ParsingRequest request) throws Exception {
229+
protected CallTarget parse(ParsingRequest request) {
231230
PythonContext context = this.getContextReference().get();
232231
PythonCore core = context.getCore();
233232
Source source = request.getSource();
@@ -254,7 +253,7 @@ private RootNode doParse(PythonCore pythonCore, Source source) {
254253
}
255254

256255
@Override
257-
protected ExecutableNode parse(InlineParsingRequest request) throws Exception {
256+
protected ExecutableNode parse(InlineParsingRequest request) {
258257
CompilerDirectives.transferToInterpreter();
259258
final Source source = request.getSource();
260259
final MaterializedFrame requestFrame = request.getFrame();
@@ -306,7 +305,7 @@ protected static ExpressionNode parseInline(Source code, PythonContext context,
306305

307306
@Override
308307
protected boolean isObjectOfLanguage(Object object) {
309-
return object instanceof PNode || object instanceof PythonObject;
308+
return object instanceof PythonAbstractObject;
310309
}
311310

312311
@Override

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import com.oracle.graal.python.builtins.objects.PNotImplemented;
6969
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
7070
import com.oracle.graal.python.builtins.objects.bytes.BytesUtils;
71+
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
7172
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
7273
import com.oracle.graal.python.builtins.objects.bytes.PIBytesLike;
7374
import com.oracle.graal.python.builtins.objects.cell.PCell;
@@ -134,6 +135,7 @@
134135
import com.oracle.graal.python.runtime.exception.PException;
135136
import com.oracle.graal.python.runtime.exception.PythonErrorType;
136137
import com.oracle.graal.python.runtime.sequence.PSequence;
138+
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
137139
import com.oracle.truffle.api.CompilerAsserts;
138140
import com.oracle.truffle.api.CompilerDirectives;
139141
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -166,6 +168,8 @@ protected abstract static class CreateByteOrByteArrayNode extends PythonBuiltinN
166168
@Child private IsIndexNode isIndexNode;
167169
@Child private CastToIndexNode castToIndexNode;
168170

171+
private final IsBuiltinClassProfile isClassProfile = IsBuiltinClassProfile.create();
172+
169173
@SuppressWarnings("unused")
170174
protected Object create(PythonClass cls, byte[] barr) {
171175
throw new AssertionError("should not reach");
@@ -193,6 +197,24 @@ public Object fromString(PythonClass cls, String source, PNone encoding, PNone e
193197
throw raise(PythonErrorType.TypeError, "string argument without an encoding");
194198
}
195199

200+
protected boolean isSimpleBytes(PBytes iterable) {
201+
return isClassProfile.profileObject(iterable, PythonBuiltinClassType.PBytes) && iterable.getSequenceStorage() instanceof ByteSequenceStorage;
202+
}
203+
204+
@Specialization(guards = {"isSimpleBytes(iterable)", "isNoValue(encoding)", "isNoValue(errors)"})
205+
public Object bytearray(PythonClass cls, PBytes iterable, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors) {
206+
return create(cls, (byte[]) ((ByteSequenceStorage) iterable.getSequenceStorage()).getCopyOfInternalArrayObject());
207+
}
208+
209+
protected boolean isSimpleBytes(PByteArray iterable) {
210+
return isClassProfile.profileObject(iterable, PythonBuiltinClassType.PByteArray) && iterable.getSequenceStorage() instanceof ByteSequenceStorage;
211+
}
212+
213+
@Specialization(guards = {"isSimpleBytes(iterable)", "isNoValue(encoding)", "isNoValue(errors)"})
214+
public Object bytearray(PythonClass cls, PByteArray iterable, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors) {
215+
return create(cls, (byte[]) ((ByteSequenceStorage) iterable.getSequenceStorage()).getCopyOfInternalArrayObject());
216+
}
217+
196218
@Specialization(guards = {"!isInt(iterable)", "!isNoValue(iterable)", "isNoValue(encoding)", "isNoValue(errors)"})
197219
public Object bytearray(PythonClass cls, Object iterable, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors,
198220
@Cached("create()") GetIteratorNode getIteratorNode,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public String doO(Object x,
273273
return recursiveNode.executeObject(value);
274274
}
275275

276-
protected BinNode create() {
276+
protected static BinNode create() {
277277
return BuiltinFunctionsFactory.BinNodeFactory.create();
278278
}
279279
}
@@ -706,7 +706,7 @@ public Object getAttrFromObject(Object primary, String name, Object defaultValue
706706
}
707707

708708
@Specialization
709-
public Object getAttr(Object object, PString name, Object defaultValue) {
709+
public Object getAttr2(Object object, PString name, Object defaultValue) {
710710
return executeWithArgs(object, name.getValue(), defaultValue);
711711
}
712712

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ protected boolean isOvf(PInt value) {
516516
return value.getValue().compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0;
517517
}
518518

519-
protected FactorialNode create() {
519+
protected static FactorialNode create() {
520520
return MathModuleBuiltinsFactory.FactorialNodeFactory.create();
521521
}
522522
}
@@ -588,7 +588,7 @@ public Object floor(Object value,
588588
return result;
589589
}
590590

591-
protected FloorNode create() {
591+
protected static FloorNode create() {
592592
return MathModuleBuiltinsFactory.FloorNodeFactory.create();
593593
}
594594
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ Object runAbstractObject(PythonAbstractObject object,
344344
}
345345

346346
@Specialization(guards = {"isForeignObject(object)", "!isNativeWrapper(object)", "!isNativeNull(object)"})
347-
Object doPythonClass(TruffleObject object) {
347+
Object doForeignObject(TruffleObject object) {
348348
return TruffleObjectNativeWrapper.wrap(object);
349349
}
350350

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -830,24 +830,29 @@ public PList doSplit(String self, PNone sep, PNone maxsplit) {
830830
@TruffleBoundary
831831
@Specialization
832832
public PList doSplit(String self, String sep, PNone maxsplit) {
833-
PList list = factory().createList();
834-
String[] strs = self.split(Pattern.quote(sep));
835-
for (String s : strs) {
836-
getAppendNode().execute(list, s);
837-
}
838-
return list;
833+
return doSplit(self, sep, -1);
839834
}
840835

841836
@Specialization
842837
@TruffleBoundary
843838
public PList doSplit(String self, String sep, int maxsplit) {
839+
if (sep.isEmpty()) {
840+
throw raise(ValueError, "empty separator");
841+
}
842+
int splits = maxsplit == -1 ? Integer.MAX_VALUE : maxsplit;
843+
844844
PList list = factory().createList();
845-
// Python gives the maximum number of splits, Java wants the max number of resulting
846-
// parts
847-
String[] strs = self.split(Pattern.quote(sep), maxsplit + 1);
848-
for (String s : strs) {
849-
getAppendNode().execute(list, s);
845+
int lastEnd = 0;
846+
while (splits > 0) {
847+
int nextIndex = self.indexOf(sep, lastEnd);
848+
if (nextIndex == -1) {
849+
break;
850+
}
851+
splits--;
852+
getAppendNode().execute(list, self.substring(lastEnd, nextIndex));
853+
lastEnd = nextIndex + sep.length();
850854
}
855+
getAppendNode().execute(list, self.substring(lastEnd, self.length()));
851856
return list;
852857
}
853858

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ExecuteKeywordStarargsNode.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,12 @@
5353
import com.oracle.truffle.api.dsl.Cached;
5454
import com.oracle.truffle.api.dsl.ImportStatic;
5555
import com.oracle.truffle.api.dsl.NodeChild;
56-
import com.oracle.truffle.api.dsl.NodeChildren;
5756
import com.oracle.truffle.api.dsl.Specialization;
5857
import com.oracle.truffle.api.frame.VirtualFrame;
5958
import com.oracle.truffle.api.nodes.Node;
6059

6160
@ImportStatic(PythonOptions.class)
62-
@NodeChildren({@NodeChild(value = "starargs", type = ExpressionNode.class)})
61+
@NodeChild(value = "starargs", type = ExpressionNode.class)
6362
public abstract class ExecuteKeywordStarargsNode extends Node {
6463
public abstract PKeyword[] execute(VirtualFrame frame);
6564

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/DeleteAttributeNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@
4545
import com.oracle.graal.python.nodes.statement.StatementNode;
4646
import com.oracle.truffle.api.dsl.Cached;
4747
import com.oracle.truffle.api.dsl.NodeChild;
48-
import com.oracle.truffle.api.dsl.NodeChildren;
4948
import com.oracle.truffle.api.dsl.Specialization;
5049

51-
@NodeChildren({@NodeChild(value = "object", type = ExpressionNode.class), @NodeChild(value = "key", type = ExpressionNode.class)})
50+
@NodeChild(value = "object", type = ExpressionNode.class)
51+
@NodeChild(value = "key", type = ExpressionNode.class)
5252
public abstract class DeleteAttributeNode extends StatementNode {
5353
public static DeleteAttributeNode create() {
5454
return DeleteAttributeNodeGen.create(null, null);

0 commit comments

Comments
 (0)