Commit dd08655b authored by scoder's avatar scoder

Merge pull request #345 from larsmans/pysequence

Use PySequence_List, PySequence_Tuple
parents 240f990f 9793b17b
......@@ -2037,29 +2037,48 @@ class OptimizeBuiltinCalls(Visitor.NodeRefCleanupMixin,
)
return node
PySequence_List_func_type = PyrexTypes.CFuncType(
Builtin.list_type,
[PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None)])
def _handle_simple_function_list(self, node, function, pos_args):
"""Turn list(ob) into PySequence_List(ob).
"""
if len(pos_args) != 1:
return node
arg = pos_args[0]
return ExprNodes.PythonCapiCallNode(
node.pos, "PySequence_List", self.PySequence_List_func_type,
args=pos_args, is_temp=node.is_temp)
PyList_AsTuple_func_type = PyrexTypes.CFuncType(
Builtin.tuple_type, [
PyrexTypes.CFuncTypeArg("list", Builtin.list_type, None)
])
PySequence_Tuple_func_type = PyrexTypes.CFuncType(
Builtin.tuple_type,
[PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None)])
def _handle_simple_function_tuple(self, node, function, pos_args):
"""Replace tuple([...]) by a call to PyList_AsTuple.
"""Replace tuple([...]) by PyList_AsTuple or PySequence_Tuple.
"""
if len(pos_args) != 1:
return node
arg = pos_args[0]
if arg.type is Builtin.tuple_type and not arg.may_be_none():
return arg
if arg.type is not Builtin.list_type:
return node
pos_args[0] = arg.as_none_safe_node(
"'NoneType' object is not iterable")
if arg.type is Builtin.list_type:
pos_args[0] = arg.as_none_safe_node(
"'NoneType' object is not iterable")
return ExprNodes.PythonCapiCallNode(
node.pos, "PyList_AsTuple", self.PyList_AsTuple_func_type,
args = pos_args,
is_temp = node.is_temp
)
return ExprNodes.PythonCapiCallNode(
node.pos, "PyList_AsTuple", self.PyList_AsTuple_func_type,
args=pos_args, is_temp=node.is_temp)
else:
return ExprNodes.PythonCapiCallNode(
node.pos, "PySequence_Tuple", self.PySequence_Tuple_func_type,
args=pos_args, is_temp=node.is_temp)
PySet_New_func_type = PyrexTypes.CFuncType(
Builtin.set_type, [
......
......@@ -41,6 +41,18 @@ def k(obj1, obj2, obj3, obj4, obj5):
obj1 = [17, 42, 88]
return obj1
@cython.test_fail_if_path_exists("//SimpleCallNode")
def test_list_call(ob):
"""
>>> def f():
... yield 1
... yield 2
...
>>> list(f())
[1, 2]
"""
return list(ob)
def test_list_sort():
"""
>>> test_list_sort()
......
......@@ -114,9 +114,21 @@ def tuple_of_args_tuple(*args):
return tuple(tuple(tuple(args)))
@cython.test_fail_if_path_exists('//SimpleCallNode//SimpleCallNode')
def tuple_of_object(ob):
"""
>>> tuple(type(1))
Traceback (most recent call last):
TypeError: 'type' object is not iterable
>>> sorted(tuple(set([1, 2, 3])))
[1, 2, 3]
"""
return tuple(ob)
@cython.test_fail_if_path_exists(
'//SimpleCallNode//SimpleCallNode',
'//PythonCapiCallNode'
'//SimpleCallNode',
'//PythonCapiCallNode//PythonCapiCallNode'
)
def tuple_of_tuple_or_none(tuple x):
"""
......
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