Skip to content

Commit bdcc562

Browse files
[mypyc] Faster dict true test (#10333)
Closes mypyc/mypyc#768.
1 parent 09bf250 commit bdcc562

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

mypyc/irbuild/ll_builder.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
is_list_rprimitive, is_tuple_rprimitive, is_dict_rprimitive, is_set_rprimitive, PySetObject,
3333
none_rprimitive, RTuple, is_bool_rprimitive, is_str_rprimitive, c_int_rprimitive,
3434
pointer_rprimitive, PyObject, PyListObject, bit_rprimitive, is_bit_rprimitive,
35-
object_pointer_rprimitive, c_size_t_rprimitive
35+
object_pointer_rprimitive, c_size_t_rprimitive, dict_rprimitive
3636
)
3737
from mypyc.ir.func_ir import FuncDecl, FuncSignature
3838
from mypyc.ir.class_ir import ClassIR, all_concrete_classes
@@ -960,7 +960,8 @@ def add_bool_branch(self, value: Value, true: BasicBlock, false: BasicBlock) ->
960960
return
961961
elif is_same_type(value.type, str_rprimitive):
962962
value = self.call_c(str_check_if_true, [value], value.line)
963-
elif is_same_type(value.type, list_rprimitive):
963+
elif (is_same_type(value.type, list_rprimitive)
964+
or is_same_type(value.type, dict_rprimitive)):
964965
length = self.builtin_len(value, value.line)
965966
zero = Integer(0)
966967
value = self.binary_op(length, zero, '!=', value.line)

mypyc/test-data/run-dicts.test

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,3 +253,26 @@ def test_dict_subclass_setdefault() -> None:
253253
assert d.setdefault('a') == 1
254254
assert d.setdefault('e') == None
255255
assert d.setdefault('e', 100) == 110
256+
257+
[case testDictToBool]
258+
from typing import Dict, List
259+
260+
def is_true(x: dict) -> bool:
261+
if x:
262+
return True
263+
else:
264+
return False
265+
266+
def is_false(x: dict) -> bool:
267+
if not x:
268+
return True
269+
else:
270+
return False
271+
272+
def test_dict_to_bool() -> None:
273+
assert is_false({})
274+
assert not is_true({})
275+
tmp_list: List[Dict] = [{2: bool}, {'a': 'b'}]
276+
for x in tmp_list:
277+
assert is_true(x)
278+
assert not is_false(x)

0 commit comments

Comments
 (0)