Skip to content

Commit 6a49fc7

Browse files
committed
DictBuiltins fix setdefault to accept optional default value
- add unittest
1 parent a399807 commit 6a49fc7

File tree

2 files changed

+40
-1
lines changed
  • graalpython

2 files changed

+40
-1
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,3 +343,34 @@ def test_dictview_mixed_set_operations():
343343
assert {(1, 1)} == {1: 1}.items()
344344
assert {1: 1}.items() | {2} == {(1, 1), 2}
345345
assert {2} | {1: 1}.items() == {(1, 1), 2}
346+
347+
348+
def test_setdefault():
349+
# dict.setdefault()
350+
d = {}
351+
none = d.setdefault('key0')
352+
assert d.setdefault('key0') is None
353+
d.setdefault('key0', [])
354+
assert d.setdefault('key0') is None
355+
d.setdefault('key', []).append(3)
356+
assert d['key'][0] == 3
357+
d.setdefault('key', []).append(4)
358+
assert len(d['key']) == 2
359+
assert_raises(TypeError, d.setdefault)
360+
361+
class Exc(Exception):
362+
pass
363+
364+
class BadHash(object):
365+
fail = False
366+
367+
def __hash__(self):
368+
if self.fail:
369+
raise Exc()
370+
else:
371+
return 42
372+
373+
x = BadHash()
374+
d[x] = 42
375+
x.fail = True
376+
assert_raises(Exc, d.setdefault, x, [])

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictBuiltins.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public Object doGeneric(@SuppressWarnings("unused") PDict self, Object[] args, @
110110
}
111111

112112
// setdefault(key[, default])
113-
@Builtin(name = "setdefault", fixedNumOfArguments = 3)
113+
@Builtin(name = "setdefault", minNumOfArguments = 2, keywordArguments = {"default"})
114114
@GenerateNodeFactory
115115
public abstract static class SetDefaultNode extends PythonBuiltinNode {
116116
@Child private HashingStorageNodes.ContainsKeyNode containsKeyNode;
@@ -129,6 +129,14 @@ public Object setDefault(PDict dict, Object key, @SuppressWarnings("unused") Obj
129129
return getItemNode.execute(dict.getDictStorage(), key);
130130
}
131131

132+
@Specialization(guards = "!containsKey(dict.getDictStorage(), key)")
133+
public Object setDefault(PDict dict, Object key, @SuppressWarnings("unused") PNone defaultValue,
134+
@Cached("create()") HashingStorageNodes.SetItemNode setItemNode) {
135+
136+
setItemNode.execute(dict, dict.getDictStorage(), key, PNone.NONE);
137+
return PNone.NONE;
138+
}
139+
132140
@Specialization(guards = "!containsKey(dict.getDictStorage(), key)")
133141
public Object setDefault(PDict dict, Object key, Object defaultValue,
134142
@Cached("create()") HashingStorageNodes.SetItemNode setItemNode) {

0 commit comments

Comments
 (0)