Skip to content

Commit afc2486

Browse files
committed
builtin starargs node extract info from iterable objects
- add basic unittest
1 parent f6ee7d2 commit afc2486

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_generators.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,13 @@ def f():
168168

169169
if sys.version_info.minor == 4 and sys.version_info.micro < 3:
170170
del ExceptionTest
171+
172+
173+
def test_generator_starargs():
174+
def func(*args):
175+
return set(args)
176+
177+
lst = [x for x in range(10)]
178+
gen = (x for x in range(10))
179+
assert func(*lst) == set(lst)
180+
assert func(*gen) == set(lst)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ public void addAll(HashingStorage other, Equivalence eq) {
237237
private Object[] iteratorAsArray(Iterable<Object> iterable) {
238238
Object[] items = new Object[this.length()];
239239
int i = 0;
240-
for(Object item: iterable) {
240+
for (Object item : iterable) {
241241
items[i++] = item;
242242
}
243243
return items;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/positional/ExecutePositionalStarargsNode.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,29 @@
4040
*/
4141
package com.oracle.graal.python.nodes.argument.positional;
4242

43+
import java.util.ArrayList;
4344
import java.util.Iterator;
45+
import java.util.List;
4446

4547
import com.oracle.graal.python.builtins.objects.PNone;
4648
import com.oracle.graal.python.builtins.objects.dict.PDict;
4749
import com.oracle.graal.python.builtins.objects.list.PList;
4850
import com.oracle.graal.python.builtins.objects.set.PSet;
4951
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
5052
import com.oracle.graal.python.nodes.PNode;
53+
import com.oracle.graal.python.nodes.control.GetIteratorNode;
54+
import com.oracle.graal.python.nodes.control.GetNextNode;
55+
import com.oracle.graal.python.runtime.exception.PException;
56+
import com.oracle.graal.python.runtime.exception.PythonErrorType;
57+
import com.oracle.truffle.api.dsl.Cached;
5158
import com.oracle.truffle.api.dsl.NodeChild;
5259
import com.oracle.truffle.api.dsl.NodeChildren;
5360
import com.oracle.truffle.api.dsl.Specialization;
5461
import com.oracle.truffle.api.frame.VirtualFrame;
55-
import com.oracle.truffle.api.nodes.Node;
62+
import com.oracle.truffle.api.profiles.ConditionProfile;
5663

5764
@NodeChildren({@NodeChild(value = "splat", type = PNode.class)})
58-
public abstract class ExecutePositionalStarargsNode extends Node {
65+
public abstract class ExecutePositionalStarargsNode extends PNode {
5966
public abstract Object[] execute(VirtualFrame frame);
6067

6168
public abstract Object[] executeWith(Object starargs);
@@ -110,6 +117,26 @@ Object[] starargs(PNone none) {
110117
return new Object[0];
111118
}
112119

120+
@Specialization
121+
Object[] starargs(Object object,
122+
@Cached("create()") GetIteratorNode getIterator,
123+
@Cached("create()") GetNextNode next,
124+
@Cached("createBinaryProfile()") ConditionProfile errorProfile) {
125+
Object iterator = getIterator.executeWith(object);
126+
if (iterator != PNone.NO_VALUE && iterator != PNone.NONE) {
127+
List<Object> internalStorage = new ArrayList<>();
128+
while (true) {
129+
try {
130+
internalStorage.add(next.execute(iterator));
131+
} catch (PException e) {
132+
e.expectStopIteration(getCore(), errorProfile);
133+
return internalStorage.toArray();
134+
}
135+
}
136+
}
137+
throw raise(PythonErrorType.TypeError, "argument after * must be an iterable, not %p", object);
138+
}
139+
113140
public static ExecutePositionalStarargsNode create() {
114141
return ExecutePositionalStarargsNodeGen.create(null);
115142
}

0 commit comments

Comments
 (0)