Skip to content

Commit f6ee7d2

Browse files
committed
set add support for __reduce__
1 parent b402916 commit f6ee7d2

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,25 @@ public void addAll(HashingStorage other, Equivalence eq) {
234234

235235
public abstract Iterable<Object> keys();
236236

237+
private Object[] iteratorAsArray(Iterable<Object> iterable) {
238+
Object[] items = new Object[this.length()];
239+
int i = 0;
240+
for(Object item: iterable) {
241+
items[i++] = item;
242+
}
243+
return items;
244+
}
245+
246+
public Object[] keysAsArray() {
247+
return iteratorAsArray(keys());
248+
}
249+
237250
public abstract Iterable<Object> values();
238251

252+
public Object[] valuesAsArray() {
253+
return iteratorAsArray(values());
254+
}
255+
239256
public abstract Iterable<DictEntry> entries();
240257

241258
public abstract void clear();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/FrozenSetBuiltins.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LEN__;
3535
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LE__;
3636
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LT__;
37+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
3738
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUB__;
3839

3940
import java.util.List;
@@ -94,6 +95,18 @@ public int len(PBaseSet self) {
9495
}
9596
}
9697

98+
@Builtin(name = __REDUCE__, fixedNumOfArguments = 1)
99+
@GenerateNodeFactory
100+
abstract static class ReduceNode extends PythonUnaryBuiltinNode {
101+
@Specialization
102+
public Object iter(PBaseSet self) {
103+
Object[] reduceTuple = new Object[]{PNone.NONE, PNone.NONE, PNone.NONE};
104+
reduceTuple[0] = self.getPythonClass();
105+
reduceTuple[1] = factory().createTuple(new Object[]{factory().createList(self.getDictStorage().keysAsArray())});
106+
return factory().createTuple(reduceTuple);
107+
}
108+
}
109+
97110
@Builtin(name = __EQ__, fixedNumOfArguments = 2)
98111
@GenerateNodeFactory
99112
abstract static class EqNode extends PythonBinaryBuiltinNode {

0 commit comments

Comments
 (0)