Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
cython
Commits
d48da4fd
Commit
d48da4fd
authored
Dec 09, 2012
by
Stefan Behnel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
clean up some code
parent
b47fb4d0
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
111 additions
and
123 deletions
+111
-123
Cython/Compiler/Buffer.py
Cython/Compiler/Buffer.py
+11
-10
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+49
-49
Cython/Compiler/Nodes.py
Cython/Compiler/Nodes.py
+36
-45
Cython/Compiler/PyrexTypes.py
Cython/Compiler/PyrexTypes.py
+15
-19
No files found.
Cython/Compiler/Buffer.py
View file @
d48da4fd
from
Visitor
import
CythonTransform
from
ModuleNode
import
ModuleNode
from
ExprNodes
import
*
from
Errors
import
CompileError
from
UtilityCode
import
CythonUtilityCode
from
Code
import
UtilityCode
,
TempitaUtilityCode
import
Interpreter
import
PyrexTypes
import
Naming
import
Symtab
from
Cython.Compiler.Visitor
import
CythonTransform
from
Cython.Compiler.ModuleNode
import
ModuleNode
from
Cython.Compiler.Errors
import
CompileError
from
Cython.Compiler.UtilityCode
import
CythonUtilityCode
from
Cython.Compiler.Code
import
UtilityCode
,
TempitaUtilityCode
from
Cython.Compiler
import
Options
from
Cython.Compiler
import
Interpreter
from
Cython.Compiler
import
PyrexTypes
from
Cython.Compiler
import
Naming
from
Cython.Compiler
import
Symtab
def
dedent
(
text
,
reindent
=
0
):
...
...
Cython/Compiler/ExprNodes.py
View file @
d48da4fd
...
...
@@ -31,7 +31,6 @@ from Builtin import list_type, tuple_type, set_type, dict_type, \
unicode_type
,
str_type
,
bytes_type
,
type_type
import
Builtin
import
Symtab
import
Options
from
Cython
import
Utils
from
Annotate
import
AnnotationItem
from
Cython.Compiler
import
Future
...
...
@@ -369,7 +368,7 @@ class ExprNode(Node):
def
type_dependencies
(
self
,
env
):
# Returns the list of entries whose types must be determined
# before the type of self can be infered.
# before the type of self can be infer
r
ed.
if
hasattr
(
self
,
'type'
)
and
self
.
type
is
not
None
:
return
()
return
sum
([
node
.
type_dependencies
(
env
)
for
node
in
self
.
subexpr_nodes
()],
())
...
...
@@ -609,8 +608,6 @@ class ExprNode(Node):
#
src
=
self
src_type
=
self
.
type
src_is_py_type
=
src_type
.
is_pyobject
dst_is_py_type
=
dst_type
.
is_pyobject
if
self
.
check_for_coercion_error
(
dst_type
):
return
self
...
...
@@ -944,7 +941,7 @@ class IntNode(ConstNode):
suitable_type
=
PyrexTypes
.
widest_numeric_type
(
suitable_type
,
self
.
type
)
else
:
# C literal or Python literal - split at 32bit boundary
if
self
.
constant_result
>=
-
2
**
31
and
self
.
constant_result
<
2
**
31
:
if
-
2
**
31
<=
self
.
constant_result
<
2
**
31
:
if
self
.
type
and
self
.
type
.
is_int
:
suitable_type
=
self
.
type
else
:
...
...
@@ -1175,7 +1172,7 @@ class UnicodeNode(PyConstNode):
# (DC00-DFFF) is likely there, too. If we don't find it,
# any second code unit cannot make for a surrogate pair by
# itself.
if
c
>=
0xD800
and
c
<=
0xDBFF
:
if
0xD800
<=
c
<=
0xDBFF
:
return
True
return
False
...
...
@@ -1685,7 +1682,7 @@ class NameNode(AtomicExprNode):
Naming
.
module_cname
,
interned_cname
))
if
not
self
.
cf_is_null
:
code
.
putln
(
"}"
)
;
code
.
putln
(
"}"
)
code
.
putln
(
code
.
error_goto_if_null
(
self
.
result
(),
self
.
pos
))
code
.
put_gotref
(
self
.
py_result
())
...
...
@@ -1920,7 +1917,7 @@ class ImportNode(ExprNode):
# __import__(module_name, globals(), None, name_list, level)
#
# module_name StringNode dotted name of module. Empty module
# name means importing the parent package acco
u
rding
# name means importing the parent package according
# to level
# name_list ListNode or None list of names to be imported
# level int relative import level:
...
...
@@ -2227,7 +2224,7 @@ class NextNode(AtomicExprNode):
# iterator IteratorNode
def
__init__
(
self
,
iterator
):
self
.
pos
=
iterator
.
pos
AtomicExprNode
.
__init__
(
self
,
iterator
.
pos
)
self
.
iterator
=
iterator
def
type_dependencies
(
self
,
env
):
...
...
@@ -2378,8 +2375,7 @@ class RawCNameExprNode(ExprNode):
subexprs
=
[]
def
__init__
(
self
,
pos
,
type
=
None
,
cname
=
None
):
self
.
pos
=
pos
self
.
type
=
type
ExprNode
.
__init__
(
self
,
pos
,
type
=
type
)
if
cname
is
not
None
:
self
.
cname
=
cname
...
...
@@ -2493,8 +2489,8 @@ class IndexNode(ExprNode):
# set by SingleAssignmentNode after analyse_types()
is_memslice_scalar_assignment
=
False
def
__init__
(
self
,
pos
,
index
,
*
args
,
*
*
kw
):
ExprNode
.
__init__
(
self
,
pos
,
index
=
index
,
*
args
,
*
*
kw
)
def
__init__
(
self
,
pos
,
index
,
**
kw
):
ExprNode
.
__init__
(
self
,
pos
,
index
=
index
,
**
kw
)
self
.
_index
=
index
def
calculate_constant_result
(
self
):
...
...
@@ -2577,7 +2573,7 @@ class IndexNode(ExprNode):
return
base_type
elif
isinstance
(
self
.
base
,
BytesNode
):
#if env.global_scope().context.language_level >= 3:
# # infering 'char' can be made to work in Python 3 mode
# # infer
r
ing 'char' can be made to work in Python 3 mode
# return PyrexTypes.c_char_type
# Py2/3 return different types on indexing bytes objects
return
py_object_type
...
...
@@ -3272,10 +3268,8 @@ class IndexNode(ExprNode):
code
.
putln
(
"%s = %s;"
%
(
temp
,
index
.
result
()))
# Generate buffer access code using these temps
import
Buffer
,
MemoryView
import
Buffer
buffer_entry
=
self
.
buffer_entry
()
if
buffer_entry
.
type
.
is_buffer
:
negative_indices
=
buffer_entry
.
type
.
negative_indices
else
:
...
...
@@ -4226,12 +4220,10 @@ class InlinedDefNodeCallNode(CallNode):
class
PythonCapiFunctionNode
(
ExprNode
):
subexprs
=
[]
def
__init__
(
self
,
pos
,
py_name
,
cname
,
func_type
,
utility_code
=
None
):
self
.
pos
=
pos
self
.
name
=
py_name
self
.
cname
=
cname
self
.
type
=
func_type
self
.
utility_code
=
utility_code
ExprNode
.
__init__
(
self
,
pos
,
name
=
py_name
,
cname
=
cname
,
type
=
func_type
,
utility_code
=
utility_code
)
def
analyse_types
(
self
,
env
):
pass
...
...
@@ -4243,6 +4235,7 @@ class PythonCapiFunctionNode(ExprNode):
def
calculate_result_code
(
self
):
return
self
.
cname
class
PythonCapiCallNode
(
SimpleCallNode
):
# Python C-API Function call (only created in transforms)
...
...
@@ -4347,7 +4340,7 @@ class AsTupleNode(ExprNode):
subexprs
=
[
'arg'
]
def
calculate_constant_result
(
self
):
self
.
constant_result
=
tuple
(
self
.
base
.
constant_result
)
self
.
constant_result
=
tuple
(
self
.
arg
.
constant_result
)
def
compile_time_value
(
self
,
denv
):
arg
=
self
.
arg
.
compile_time_value
(
denv
)
...
...
@@ -4604,7 +4597,6 @@ class AttributeNode(ExprNode):
else
:
self
.
op
=
"."
if
obj_type
.
has_attributes
:
entry
=
None
if
obj_type
.
attributes_known
():
if
(
obj_type
.
is_memoryviewslice
and
not
obj_type
.
scope
.
lookup_here
(
self
.
attribute
)):
...
...
@@ -4880,7 +4872,7 @@ class StarredTargetNode(ExprNode):
is_temp
=
1
def
__init__
(
self
,
pos
,
target
):
self
.
pos
=
pos
ExprNode
.
__init__
(
self
,
pos
)
self
.
target
=
target
def
analyse_declarations
(
self
,
env
):
...
...
@@ -6324,7 +6316,7 @@ class ClassCellNode(ExprNode):
'if (!%s) { PyErr_SetString(PyExc_SystemError, '
'"super(): empty __class__ cell"); %s }'
%
(
self
.
result
(),
code
.
error_goto
(
self
.
pos
)))
;
code
.
error_goto
(
self
.
pos
)))
code
.
put_incref
(
self
.
result
(),
py_object_type
)
...
...
@@ -6613,9 +6605,10 @@ class InnerFunctionNode(PyCFunctionNode):
def
self_result_code
(
self
):
if
self
.
needs_self_code
:
return
"((PyObject*)%s)"
%
(
Naming
.
cur_scope_cname
)
return
"((PyObject*)%s)"
%
Naming
.
cur_scope_cname
return
"NULL"
class
CodeObjectNode
(
ExprNode
):
# Create a PyCodeObject for a CyFunction instance.
#
...
...
@@ -6864,7 +6857,7 @@ class YieldExprNode(ExprNode):
code
.
putln
(
"/* return from generator, yielding value */"
)
code
.
putln
(
"%s->resume_label = %d;"
%
(
Naming
.
generator_cname
,
self
.
label_num
))
code
.
putln
(
"return %s;"
%
Naming
.
retval_cname
)
;
code
.
putln
(
"return %s;"
%
Naming
.
retval_cname
)
code
.
put_label
(
self
.
label_name
)
for
cname
,
save_cname
,
type
in
saved
:
...
...
@@ -6974,7 +6967,7 @@ class PyClassLocalsExprNode(AtomicExprNode):
def
analyse_types
(
self
,
env
):
self
.
type
=
self
.
pyclass_dict
.
type
self
.
is_t
mep
=
0
self
.
is_t
emp
=
False
def
result
(
self
):
return
self
.
pyclass_dict
.
result
()
...
...
@@ -7195,7 +7188,7 @@ class UnaryMinusNode(UnopNode):
def
get_constant_c_result_code
(
self
):
value
=
self
.
operand
.
get_constant_c_result_code
()
if
value
:
return
"(-%s)"
%
(
value
)
return
"(-%s)"
%
value
class
TildeNode
(
UnopNode
):
# unary '~' operator
...
...
@@ -7512,7 +7505,8 @@ class CythonArrayNode(ExprNode):
base_type
=
self
.
operand
.
type
if
not
self
.
operand
.
type
.
is_ptr
and
not
self
.
operand
.
type
.
is_array
:
return
error
(
self
.
operand
.
pos
,
ERR_NOT_POINTER
)
error
(
self
.
operand
.
pos
,
ERR_NOT_POINTER
)
return
# Dimension sizes of C array
array_dimension_sizes
=
[]
...
...
@@ -7523,21 +7517,25 @@ class CythonArrayNode(ExprNode):
elif
base_type
.
is_ptr
:
base_type
=
base_type
.
base_type
else
:
return
error
()
error
(
self
.
pos
,
"unexpected base type %s found"
%
base_type
)
return
if
not
(
base_type
.
same_as
(
array_dtype
)
or
base_type
.
is_void
):
return
error
(
self
.
operand
.
pos
,
ERR_BASE_TYPE
)
error
(
self
.
operand
.
pos
,
ERR_BASE_TYPE
)
return
elif
self
.
operand
.
type
.
is_array
and
len
(
array_dimension_sizes
)
!=
ndim
:
return
error
(
self
.
operand
.
pos
,
"Expected %d dimensions, array has %d dimensions"
%
error
(
self
.
operand
.
pos
,
"Expected %d dimensions, array has %d dimensions"
%
(
ndim
,
len
(
array_dimension_sizes
)))
return
# Verify the start, stop and step values
# In case of a C array, use the size of C array in each dimension to
# get an automatic cast
for
axis_no
,
axis
in
enumerate
(
axes
):
if
not
axis
.
start
.
is_none
:
return
error
(
axis
.
start
.
pos
,
ERR_START
)
error
(
axis
.
start
.
pos
,
ERR_START
)
return
if
axis
.
stop
.
is_none
:
if
array_dimension_sizes
:
...
...
@@ -7546,7 +7544,8 @@ class CythonArrayNode(ExprNode):
constant_result
=
dimsize
,
type
=
PyrexTypes
.
c_int_type
)
else
:
return
error
(
axis
.
pos
,
ERR_NOT_STOP
)
error
(
axis
.
pos
,
ERR_NOT_STOP
)
return
axis
.
stop
.
analyse_types
(
env
)
shape
=
axis
.
stop
.
coerce_to
(
self
.
shape_type
,
env
)
...
...
@@ -7561,17 +7560,20 @@ class CythonArrayNode(ExprNode):
axis
.
step
.
analyse_types
(
env
)
if
(
not
axis
.
step
.
type
.
is_int
and
axis
.
step
.
is_literal
and
not
axis
.
step
.
type
.
is_error
):
return
error
(
axis
.
step
.
pos
,
"Expected an integer literal"
)
error
(
axis
.
step
.
pos
,
"Expected an integer literal"
)
return
if
axis
.
step
.
compile_time_value
(
env
)
!=
1
:
return
error
(
axis
.
step
.
pos
,
ERR_STEPS
)
error
(
axis
.
step
.
pos
,
ERR_STEPS
)
return
if
axis_no
==
0
:
self
.
mode
=
"fortran"
elif
not
axis
.
step
.
is_none
and
not
first_or_last
:
# step provided in some other dimension
return
error
(
axis
.
step
.
pos
,
ERR_STEPS
)
error
(
axis
.
step
.
pos
,
ERR_STEPS
)
return
if
not
self
.
operand
.
is_name
:
self
.
operand
=
self
.
operand
.
coerce_to_temp
(
env
)
...
...
@@ -7891,8 +7893,6 @@ class BinopNode(ExprNode):
or
self
.
operand2
.
type
.
is_cpp_class
)
def
analyse_cpp_operation
(
self
,
env
):
type1
=
self
.
operand1
.
type
type2
=
self
.
operand2
.
type
entry
=
env
.
lookup_operator
(
self
.
operator
,
[
self
.
operand1
,
self
.
operand2
])
if
not
entry
:
self
.
type_error
()
...
...
@@ -8080,7 +8080,7 @@ class NumBinopNode(BinopNode):
super
(
NumBinopNode
,
self
).
generate_result_code
(
code
)
if
self
.
overflow_check
:
self
.
overflow_bit
=
code
.
funcstate
.
allocate_temp
(
PyrexTypes
.
c_int_type
,
manage_ref
=
False
)
code
.
putln
(
"%s = 0;"
%
self
.
overflow_bit
)
;
code
.
putln
(
"%s = 0;"
%
self
.
overflow_bit
)
code
.
putln
(
"%s = %s;"
%
(
self
.
result
(),
self
.
calculate_result_code
()))
code
.
putln
(
"if (unlikely(%s)) {"
%
self
.
overflow_bit
)
code
.
putln
(
'PyErr_Format(PyExc_OverflowError, "value too large");'
)
...
...
@@ -8115,10 +8115,10 @@ class NumBinopNode(BinopNode):
BinopNode
.
is_py_operation_types
(
self
,
type1
,
type2
))
def
py_operation_function
(
self
):
fu
ction
=
self
.
py_functions
[
self
.
operator
]
fu
nction_name
=
self
.
py_functions
[
self
.
operator
]
if
self
.
inplace
:
fu
ction
=
fuction
.
replace
(
'PyNumber_'
,
'PyNumber_InPlace'
)
return
fu
ction
fu
nction_name
=
function_name
.
replace
(
'PyNumber_'
,
'PyNumber_InPlace'
)
return
fu
nction_name
py_functions
=
{
"|"
:
"PyNumber_Or"
,
...
...
@@ -8300,7 +8300,7 @@ class DivNode(NumBinopNode):
code
.
putln
(
"if ((%s < 0) ^ (%s < 0)) {"
%
(
self
.
operand1
.
result
(),
self
.
operand2
.
result
()))
code
.
putln
(
code
.
set_error_info
(
self
.
pos
))
;
code
.
putln
(
code
.
set_error_info
(
self
.
pos
))
code
.
put
(
"if (__Pyx_cdivision_warning(%(FILENAME)s, "
"%(LINENO)s)) "
%
{
'FILENAME'
:
Naming
.
filename_cname
,
...
...
@@ -8565,7 +8565,7 @@ class CondExprNode(ExprNode):
def
type_error
(
self
):
if
not
(
self
.
true_val
.
type
.
is_error
or
self
.
false_val
.
type
.
is_error
):
error
(
self
.
pos
,
"Incompat
a
ble types in conditional expression (%s; %s)"
%
error
(
self
.
pos
,
"Incompat
i
ble types in conditional expression (%s; %s)"
%
(
self
.
true_val
.
type
,
self
.
false_val
.
type
))
self
.
type
=
PyrexTypes
.
error_type
...
...
@@ -9269,7 +9269,7 @@ class CoercionNode(ExprNode):
constant_result
=
not_a_constant
def
__init__
(
self
,
arg
):
s
elf
.
pos
=
arg
.
pos
s
uper
(
CoercionNode
,
self
).
__init__
(
arg
.
pos
)
self
.
arg
=
arg
if
debug_coercion
:
print
(
"%s Coercing %s"
%
(
self
,
self
.
arg
))
...
...
Cython/Compiler/Nodes.py
View file @
d48da4fd
...
...
@@ -11,6 +11,7 @@ cython.declare(sys=object, os=object, copy=object,
absolute_path_length
=
cython
.
Py_ssize_t
)
import
sys
,
os
,
copy
from
itertools
import
chain
import
Builtin
from
Errors
import
error
,
warning
,
InternalError
,
CompileError
...
...
@@ -24,15 +25,13 @@ from Code import UtilityCode
from
StringEncoding
import
EncodedString
,
escape_byte_string
,
split_string_literal
import
Options
import
DebugFlags
from
Cython.Compiler
import
Errors
from
itertools
import
chain
absolute_path_length
=
0
def
relative_position
(
pos
):
"""
We embed the relative filename in the generated C file, since we
don't want to have to regnerate and compile all the source code
don't want to have to reg
e
nerate and compile all the source code
whenever the Python install directory moves (which could happen,
e.g,. when distributing binaries.)
...
...
@@ -63,7 +62,7 @@ def embed_position(pos, docstring):
encoding
=
docstring
.
encoding
if
encoding
is
not
None
:
try
:
encoded_bytes
=
pos_line
.
encode
(
encoding
)
pos_line
.
encode
(
encoding
)
except
UnicodeEncodeError
:
encoding
=
None
...
...
@@ -132,7 +131,7 @@ class Node(object):
is_terminator
=
0
temps
=
None
# All desc
a
ndants should set child_attrs to a list of the attributes
# All desc
e
ndants should set child_attrs to a list of the attributes
# containing nodes considered "children" in the tree. Each such attribute
# can either contain a single node or a list of nodes. See Visitor.py.
child_attrs
=
None
...
...
@@ -169,7 +168,7 @@ class Node(object):
"""Clone the node. This is defined as a shallow copy, except for member lists
amongst the child attributes (from get_child_accessors) which are also
copied. Lists containing child nodes are thus seen as a way for the node
to hold multiple children directly; the list is not treated as a sep
e
rate
to hold multiple children directly; the list is not treated as a sep
a
rate
level in the tree."""
result
=
copy
.
copy
(
self
)
for
attrname
in
result
.
child_attrs
:
...
...
@@ -722,8 +721,7 @@ class CArgDeclNode(Node):
if
is_self_arg
:
self
.
base_type
.
is_self_arg
=
self
.
is_self_arg
=
True
if
self
.
type
is
None
:
# The parser may missinterpret names as types...
# We fix that here.
# The parser may misinterpret names as types. We fix that here.
if
isinstance
(
self
.
declarator
,
CNameDeclaratorNode
)
and
self
.
declarator
.
name
==
''
:
if
nonempty
:
if
self
.
base_type
.
is_basic_c_type
:
...
...
@@ -940,7 +938,9 @@ class CNestedBaseTypeNode(CBaseTypeNode):
# name string
# base_type CBaseTypeNode
child_attrs
=
[
'base_type'
]
def
analyse
(
self
,
env
,
could_be_name
=
None
):
base_type
=
self
.
base_type
.
analyse
(
env
)
if
base_type
is
PyrexTypes
.
error_type
:
...
...
@@ -964,7 +964,6 @@ class TemplatedTypeNode(CBaseTypeNode):
# After analysis:
# type PyrexTypes.BufferType or PyrexTypes.CppClassType ...containing the right options
child_attrs
=
[
"base_type_node"
,
"positional_args"
,
"keyword_args"
,
"dtype_node"
]
...
...
@@ -980,7 +979,7 @@ class TemplatedTypeNode(CBaseTypeNode):
if
base_type
.
is_cpp_class
:
# Templated class
if
self
.
keyword_args
and
self
.
keyword_args
.
key_value_pairs
:
error
(
self
.
pos
,
"c++ templates cannot take keyword arguments"
)
;
error
(
self
.
pos
,
"c++ templates cannot take keyword arguments"
)
self
.
type
=
PyrexTypes
.
error_type
else
:
template_types
=
[]
...
...
@@ -1640,7 +1639,7 @@ class FuncDefNode(StatNode, BlockNode):
cenv
.
scope_class
.
type
.
declaration_code
(
''
),
Naming
.
self_cname
))
if
lenv
.
is_passthrough
:
code
.
putln
(
"%s = %s;"
%
(
Naming
.
cur_scope_cname
,
outer_scope_cname
))
;
code
.
putln
(
"%s = %s;"
%
(
Naming
.
cur_scope_cname
,
outer_scope_cname
))
elif
self
.
needs_closure
:
# inner closures own a reference to their outer parent
code
.
put_incref
(
outer_scope_cname
,
cenv
.
scope_class
.
type
)
...
...
@@ -1837,7 +1836,7 @@ class FuncDefNode(StatNode, BlockNode):
default_retval
=
self
.
return_type
.
default_value
err_val
=
self
.
error_value
()
if
err_val
is
None
and
default_retval
:
err_val
=
default_retval
err_val
=
default_retval
# FIXME: why is err_val not used?
if
self
.
return_type
.
is_pyobject
:
code
.
put_xgiveref
(
self
.
return_type
.
as_pyobject
(
Naming
.
retval_cname
))
...
...
@@ -1854,7 +1853,7 @@ class FuncDefNode(StatNode, BlockNode):
code
.
put_trace_return
(
"Py_None"
)
if
not
lenv
.
nogil
:
# GIL holding funcion
# GIL holding func
t
ion
code
.
put_finish_refcount_context
()
if
acquire_gil
or
(
lenv
.
nogil
and
lenv
.
has_with_gil_block
):
...
...
@@ -2509,7 +2508,7 @@ class DefNode(FuncDefNode):
self
.
py_wrapper
.
analyse_declarations
(
env
)
def
analyse_argument_types
(
self
,
env
):
directive_locals
=
self
.
directive_locals
=
env
.
directives
[
'locals'
]
self
.
directive_locals
=
env
.
directives
[
'locals'
]
allow_none_for_extension_args
=
env
.
directives
[
'allow_none_for_extension_args'
]
f2s
=
env
.
fused_to_specific
...
...
@@ -2644,7 +2643,7 @@ class DefNode(FuncDefNode):
sig
=
self
.
entry
.
signature
expected_str
=
"%d"
%
sig
.
num_fixed_args
()
if
sig
.
has_generic_args
:
expected_str
=
expected_str
+
" or more"
expected_str
+=
" or more"
name
=
self
.
name
if
name
.
startswith
(
"__"
)
and
name
.
endswith
(
"__"
):
desc
=
"Special method"
...
...
@@ -2767,10 +2766,9 @@ class DefNode(FuncDefNode):
return
arg_code_list
=
[]
if
self
.
entry
.
signature
.
has_dummy_arg
:
if
self
.
needs_outer_scope
:
self_arg
=
'PyObject *%s'
%
Naming
.
self_cname
else
:
self_arg
=
'CYTHON_UNUSED PyObject *%s'
%
Naming
.
self_cname
self_arg
=
'PyObject *%s'
%
Naming
.
self_cname
if
not
self
.
needs_outer_scope
:
self_arg
=
'CYTHON_UNUSED '
+
self_arg
arg_code_list
.
append
(
self_arg
)
def
arg_decl_code
(
arg
):
...
...
@@ -2780,9 +2778,9 @@ class DefNode(FuncDefNode):
else
:
cname
=
entry
.
cname
decl
=
entry
.
type
.
declaration_code
(
cname
)
if
entry
.
cf_used
:
return
decl
return
'CYTHON_UNUSED '
+
decl
if
not
entry
.
cf_used
:
decl
=
'CYTHON_UNUSED '
+
decl
return
decl
for
arg
in
self
.
args
:
arg_code_list
.
append
(
arg_decl_code
(
arg
))
...
...
@@ -3646,7 +3644,7 @@ class GeneratorDefNode(DefNode):
code
.
put_incref
(
classobj_cname
,
py_object_type
)
code
.
put_giveref
(
classobj_cname
)
code
.
put_finish_refcount_context
()
code
.
putln
(
'return (PyObject *) gen;'
)
;
code
.
putln
(
'return (PyObject *) gen;'
)
code
.
putln
(
'}'
)
def
generate_function_definitions
(
self
,
env
,
code
):
...
...
@@ -3690,7 +3688,7 @@ class GeneratorBodyDefNode(DefNode):
if
proto
:
code
.
putln
(
'%s; /* proto */'
%
header
)
else
:
code
.
putln
(
'%s /* generator body */
\
n
{'
%
header
)
;
code
.
putln
(
'%s /* generator body */
\
n
{'
%
header
)
def
generate_function_definitions
(
self
,
env
,
code
):
lenv
=
self
.
local_scope
...
...
@@ -3796,10 +3794,9 @@ class OverrideCheckNode(StatNode):
first_arg
=
1
import
ExprNodes
self
.
func_node
=
ExprNodes
.
RawCNameExprNode
(
self
.
pos
,
py_object_type
)
call_tuple
=
ExprNodes
.
TupleNode
(
self
.
pos
,
args
=
[
ExprNodes
.
NameNode
(
self
.
pos
,
name
=
arg
.
name
)
for
arg
in
self
.
args
[
first_arg
:]])
call_node
=
ExprNodes
.
SimpleCallNode
(
self
.
pos
,
function
=
self
.
func_node
,
args
=
[
ExprNodes
.
NameNode
(
self
.
pos
,
name
=
arg
.
name
)
for
arg
in
self
.
args
[
first_arg
:]])
call_node
=
ExprNodes
.
SimpleCallNode
(
self
.
pos
,
function
=
self
.
func_node
,
args
=
[
ExprNodes
.
NameNode
(
self
.
pos
,
name
=
arg
.
name
)
for
arg
in
self
.
args
[
first_arg
:]])
self
.
body
=
ReturnStatNode
(
self
.
pos
,
value
=
call_node
)
self
.
body
.
analyse_expressions
(
env
)
...
...
@@ -3812,7 +3809,7 @@ class OverrideCheckNode(StatNode):
self_arg
=
"((PyObject *)%s)"
%
self
.
args
[
0
].
cname
code
.
putln
(
"/* Check if called by wrapper */"
)
code
.
putln
(
"if (unlikely(%s)) ;"
%
Naming
.
skip_dispatch_cname
)
code
.
putln
(
"/* Check if overriden in Python */"
)
code
.
putln
(
"/* Check if overrid
d
en in Python */"
)
if
self
.
py_func
.
is_module_scope
:
code
.
putln
(
"else {"
)
else
:
...
...
@@ -4134,7 +4131,7 @@ class CClassDefNode(ClassDefNode):
if
not
base_class_entry
.
is_type
:
error
(
self
.
pos
,
"'%s' is not a type name"
%
self
.
base_class_name
)
elif
not
base_class_entry
.
type
.
is_extension_type
and
\
not
(
base_class_entry
.
type
.
is_builtin_type
and
\
not
(
base_class_entry
.
type
.
is_builtin_type
and
base_class_entry
.
type
.
objstruct_cname
):
error
(
self
.
pos
,
"'%s' is not an extension type"
%
self
.
base_class_name
)
elif
not
base_class_entry
.
type
.
is_complete
():
...
...
@@ -4542,8 +4539,8 @@ class CascadedAssignmentNode(AssignmentNode):
def
annotate
(
self
,
code
):
for
i
in
range
(
len
(
self
.
lhs_list
)):
lhs
=
self
.
lhs_list
[
i
].
annotate
(
code
)
rhs
=
self
.
coerced_rhs_list
[
i
].
annotate
(
code
)
self
.
lhs_list
[
i
].
annotate
(
code
)
self
.
coerced_rhs_list
[
i
].
annotate
(
code
)
self
.
rhs
.
annotate
(
code
)
...
...
@@ -5581,10 +5578,9 @@ class ForFromStatNode(LoopNode, StatNode):
self
.
bound2
.
analyse_types
(
env
)
if
self
.
step
is
not
None
:
if
isinstance
(
self
.
step
,
ExprNodes
.
UnaryMinusNode
):
warning
(
self
.
step
.
pos
,
"Probable infinite loop in for-from-by statment. Consider switching the directions of the relations."
,
2
)
warning
(
self
.
step
.
pos
,
"Probable infinite loop in for-from-by stat
e
ment. Consider switching the directions of the relations."
,
2
)
self
.
step
.
analyse_types
(
env
)
target_type
=
self
.
target
.
type
if
self
.
target
.
type
.
is_numeric
:
loop_type
=
self
.
target
.
type
else
:
...
...
@@ -5927,7 +5923,7 @@ class TryExceptStatNode(StatNode):
try_end_label
=
code
.
new_label
(
'try_end'
)
exc_save_vars
=
[
code
.
funcstate
.
allocate_temp
(
py_object_type
,
False
)
for
i
in
xrange
(
3
)]
for
_
in
xrange
(
3
)]
code
.
putln
(
"{"
)
code
.
putln
(
"__Pyx_ExceptionSave(%s);"
%
', '
.
join
([
'&%s'
%
var
for
var
in
exc_save_vars
]))
...
...
@@ -6047,8 +6043,6 @@ class ExceptClauseNode(Node):
self
.
body
.
analyse_declarations
(
env
)
def
analyse_expressions
(
self
,
env
):
import
ExprNodes
genv
=
env
.
global_scope
()
self
.
function_name
=
env
.
qualified_name
if
self
.
pattern
:
# normalise/unpack self.pattern into a list
...
...
@@ -6057,12 +6051,13 @@ class ExceptClauseNode(Node):
self
.
pattern
[
i
]
=
pattern
.
coerce_to_pyobject
(
env
)
if
self
.
target
:
import
ExprNodes
self
.
exc_value
=
ExprNodes
.
ExcValueNode
(
self
.
pos
,
env
)
self
.
target
.
analyse_target_expression
(
env
,
self
.
exc_value
)
if
self
.
excinfo_target
is
not
None
:
import
ExprNodes
self
.
excinfo_tuple
=
ExprNodes
.
TupleNode
(
pos
=
self
.
pos
,
args
=
[
ExprNodes
.
ExcValueNode
(
pos
=
self
.
pos
,
env
=
env
)
for
x
in
range
(
3
)])
ExprNodes
.
ExcValueNode
(
pos
=
self
.
pos
,
env
=
env
)
for
_
in
range
(
3
)])
self
.
excinfo_tuple
.
analyse_expressions
(
env
)
self
.
body
.
analyse_expressions
(
env
)
...
...
@@ -6099,7 +6094,7 @@ class ExceptClauseNode(Node):
exc_vars
=
[
code
.
funcstate
.
allocate_temp
(
py_object_type
,
manage_ref
=
True
)
for
i
in
xrange
(
3
)]
for
_
in
xrange
(
3
)]
code
.
put_add_traceback
(
self
.
function_name
)
# We always have to fetch the exception value even if
# there is no target, because this also normalises the
...
...
@@ -6957,8 +6952,6 @@ class ParallelStatNode(StatNode, ParallelNode):
code
.
globalstate
.
use_utility_code
(
invalid_values_utility_code
)
first
=
False
have_invalid_values
=
True
code
.
putln
(
"%s = %s;"
%
(
entry
.
cname
,
entry
.
type
.
cast_code
(
invalid_value
)))
...
...
@@ -6992,7 +6985,7 @@ class ParallelStatNode(StatNode, ParallelNode):
"""
self
.
modified_entries
=
[]
for
entry
,
(
pos
,
op
)
in
self
.
assignments
.
iteritems
()
:
for
entry
in
self
.
assignments
:
if
entry
.
from_closure
or
entry
.
in_closure
:
self
.
_allocate_closure_temp
(
code
,
entry
)
...
...
@@ -7142,7 +7135,6 @@ class ParallelStatNode(StatNode, ParallelNode):
"""
save_lastprivates_label
=
code
.
new_label
()
dont_return_label
=
code
.
new_label
()
insertion_point
=
code
.
insertion_point
()
self
.
any_label_used
=
False
self
.
breaking_label_used
=
False
...
...
@@ -7501,8 +7493,8 @@ class ParallelRangeNode(ParallelStatNode):
(
self
.
schedule
,))
def
analyse_expressions
(
self
,
env
):
was_nogil
=
env
.
nogil
if
self
.
nogil
:
was_nogil
=
env
.
nogil
env
.
nogil
=
True
if
self
.
target
is
None
:
...
...
@@ -7860,7 +7852,6 @@ class CnameDecoratorNode(StatNode):
if
entry
.
func_cname
:
entry
.
func_cname
=
self
.
mangle
(
entry
.
cname
)
if
entry
.
pyfunc_cname
:
old
=
entry
.
pyfunc_cname
entry
.
pyfunc_cname
=
self
.
mangle
(
entry
.
pyfunc_cname
)
def
mangle
(
self
,
cname
):
...
...
Cython/Compiler/PyrexTypes.py
View file @
d48da4fd
...
...
@@ -447,7 +447,7 @@ class MemoryViewSliceType(PyrexType):
has_attributes
=
1
scope
=
None
# These are specialcased in Defnode
# These are special
cased in Defnode
from_py_function
=
None
to_py_function
=
None
...
...
@@ -457,7 +457,7 @@ class MemoryViewSliceType(PyrexType):
subtypes
=
[
'dtype'
]
def
__init__
(
self
,
base_dtype
,
axes
):
'''
"""
MemoryViewSliceType(base, axes)
Base is the C base type; axes is a list of (access, packing) strings,
...
...
@@ -489,7 +489,7 @@ class MemoryViewSliceType(PyrexType):
Fortran-contiguous memory has 'direct' as the access spec, 'contig' as
the *first* axis' packing spec and 'follow' for all other packing
specs.
'''
"""
import
MemoryView
self
.
dtype
=
base_dtype
...
...
@@ -684,8 +684,6 @@ class MemoryViewSliceType(PyrexType):
return
"__pyx_memoryview_fromslice(%s, %s, %s, %s, %d);"
%
tup
def
dtype_object_conversion_funcs
(
self
,
env
):
import
MemoryView
,
Code
get_function
=
"__pyx_memview_get_%s"
%
self
.
dtype_name
set_function
=
"__pyx_memview_set_%s"
%
self
.
dtype_name
...
...
@@ -724,13 +722,13 @@ class MemoryViewSliceType(PyrexType):
return
get_function
,
set_function
def
axes_to_code
(
self
):
"
Return a list of code constants for each axis
"
"
""Return a list of code constants for each axis""
"
import
MemoryView
d
=
MemoryView
.
_spec_to_const
return
[
"(%s | %s)"
%
(
d
[
a
],
d
[
p
])
for
a
,
p
in
self
.
axes
]
def
axes_to_name
(
self
):
"
Return an abbreviated name for our axes
"
"
""Return an abbreviated name for our axes""
"
import
MemoryView
d
=
MemoryView
.
_spec_to_abbrev
return
""
.
join
([
"%s%s"
%
(
d
[
a
],
d
[
p
])
for
a
,
p
in
self
.
axes
])
...
...
@@ -763,7 +761,7 @@ class MemoryViewSliceType(PyrexType):
return
"%s[%s]"
%
(
dtype_name
,
", "
.
join
(
axes_code_list
))
def
specialize
(
self
,
values
):
"
This does not validate the base type!!
"
"
""This does not validate the base type!!""
"
dtype
=
self
.
dtype
.
specialize
(
values
)
if
dtype
is
not
self
.
dtype
:
return
MemoryViewSliceType
(
dtype
,
self
.
axes
)
...
...
@@ -868,7 +866,7 @@ class PyObjectType(PyrexType):
return
True
def
default_coerced_ctype
(
self
):
"
The default C type that this Python type coerces to, or None.
"
"
""The default C type that this Python type coerces to, or None.""
"
return
None
def
assignable_from
(
self
,
src_type
):
...
...
@@ -990,7 +988,7 @@ class BuiltinObjectType(PyObjectType):
type_check
=
self
.
type_check_function
(
exact
=
True
)
check
=
'likely(%s(%s))'
%
(
type_check
,
arg
)
if
not
notnone
:
check
=
check
+
(
'||((%s) == Py_None)'
%
arg
)
check
+=
'||((%s) == Py_None)'
%
arg
error
=
'(PyErr_Format(PyExc_TypeError, "Expected %s, got %%.200s", Py_TYPE(%s)->tp_name), 0)'
%
(
self
.
name
,
arg
)
return
check
+
'||'
+
error
...
...
@@ -1198,7 +1196,7 @@ class CConstType(BaseType):
if
base_type
==
self
.
const_base_type
:
return
self
else
:
return
ConstType
(
base_type
)
return
C
C
onstType
(
base_type
)
def
create_to_py_utility_code
(
self
,
env
):
if
self
.
const_base_type
.
create_to_py_utility_code
(
env
):
...
...
@@ -1330,7 +1328,7 @@ class CNumericType(CType):
visibility
=
"extern"
)
scope
.
parent_type
=
self
scope
.
directives
=
{}
entry
=
scope
.
declare_cfunction
(
scope
.
declare_cfunction
(
"conjugate"
,
CFuncType
(
self
,
[
CFuncTypeArg
(
"self"
,
self
,
None
)],
nogil
=
True
),
pos
=
None
,
...
...
@@ -1339,7 +1337,7 @@ class CNumericType(CType):
return
True
def
__lt__
(
self
,
other
):
"
Sort based on rank, preferring signed over unsigned
"
"
""Sort based on rank, preferring signed over unsigned""
"
if
other
.
is_numeric
:
return
self
.
rank
>
other
.
rank
and
self
.
signed
>=
other
.
signed
...
...
@@ -1928,7 +1926,7 @@ class CComplexType(CNumericType):
scope
.
directives
=
{}
scope
.
declare_var
(
"real"
,
self
.
real_type
,
None
,
cname
=
"real"
,
is_cdef
=
True
)
scope
.
declare_var
(
"imag"
,
self
.
real_type
,
None
,
cname
=
"imag"
,
is_cdef
=
True
)
entry
=
scope
.
declare_cfunction
(
scope
.
declare_cfunction
(
"conjugate"
,
CFuncType
(
self
,
[
CFuncTypeArg
(
"self"
,
self
,
None
)],
nogil
=
True
),
pos
=
None
,
...
...
@@ -2790,7 +2788,7 @@ class CFuncType(CType):
return
result
def
get_fused_types
(
self
,
result
=
None
,
seen
=
None
,
subtypes
=
None
):
"
Return fused types in the order they appear as parameter types
"
"
""Return fused types in the order they appear as parameter types""
"
return
super
(
CFuncType
,
self
).
get_fused_types
(
result
,
seen
,
subtypes
=
[
'args'
])
...
...
@@ -3223,8 +3221,8 @@ class CppClassType(CType):
def
specialize_here
(
self
,
pos
,
template_values
=
None
):
if
self
.
templates
is
None
:
error
(
pos
,
"'%s' type is not a template"
%
self
)
;
return
PyrexTypes
.
error_type
error
(
pos
,
"'%s' type is not a template"
%
self
)
return
error_type
if
len
(
self
.
templates
)
!=
len
(
template_values
):
error
(
pos
,
"%s templated type receives %d arguments, got %d"
%
(
self
.
name
,
len
(
self
.
templates
),
len
(
template_values
)))
...
...
@@ -3625,8 +3623,6 @@ def best_match(args, functions, pos=None, env=None):
the same weight, we return None (as there is no best match). If pos
is not None, we also generate an error.
"""
from
Cython
import
Utils
# TODO: args should be a list of types, not a list of Nodes.
actual_nargs
=
len
(
args
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment