Commit 54adfe2d authored by Stefan Behnel's avatar Stefan Behnel

optimise set(it) into a call to PySet_New(it)

parent e40d032f
...@@ -1993,25 +1993,39 @@ class OptimizeBuiltinCalls(Visitor.MethodDispatcherTransform): ...@@ -1993,25 +1993,39 @@ class OptimizeBuiltinCalls(Visitor.MethodDispatcherTransform):
exception_value = "((double)-1)", exception_value = "((double)-1)",
exception_check = True) exception_check = True)
PySet_New_func_type = PyrexTypes.CFuncType(
Builtin.set_type, [
PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None)
])
def _handle_simple_function_set(self, node, function, pos_args): def _handle_simple_function_set(self, node, function, pos_args):
if len(pos_args) == 1 and isinstance(pos_args[0], (ExprNodes.ListNode, if len(pos_args) == 1:
ExprNodes.TupleNode)): if pos_args[0].is_sequence_constructor:
# We can optimise set([x,y,z]) safely into a set literal, # We can optimise set([x,y,z]) safely into a set literal,
# but only if we create all items before adding them - # but only if we create all items before adding them -
# adding an item may raise an exception if it is not # adding an item may raise an exception if it is not
# hashable, but creating the later items may have # hashable, but creating the later items may have
# side-effects. # side-effects.
args = [] args = []
temps = [] temps = []
for arg in pos_args[0].args: for arg in pos_args[0].args:
if not arg.is_simple(): if not arg.is_simple():
arg = UtilNodes.LetRefNode(arg) arg = UtilNodes.LetRefNode(arg)
temps.append(arg) temps.append(arg)
args.append(arg) args.append(arg)
result = ExprNodes.SetNode(node.pos, is_temp=1, args=args) result = ExprNodes.SetNode(node.pos, is_temp=1, args=args)
for temp in temps[::-1]: for temp in temps[::-1]:
result = UtilNodes.EvalWithTempExprNode(temp, result) result = UtilNodes.EvalWithTempExprNode(temp, result)
return result return result
else:
# PySet_New(it) is better than a generic Python call to set(it)
return ExprNodes.PythonCapiCallNode(
node.pos, "PySet_New",
self.PySet_New_func_type,
args=pos_args,
is_temp=node.is_temp,
utility_code=UtilityCode.load_cached('pyset_compat', 'Builtins.c'),
py_name="set")
return node return node
def _handle_simple_function_float(self, node, function, pos_args): def _handle_simple_function_float(self, node, function, pos_args):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment