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
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
cython
Commits
be78fb70
Commit
be78fb70
authored
Jul 19, 2008
by
Dag Sverre Seljebotn
Browse files
Options
Browse Files
Download
Plain Diff
Merge with cython-devel
parents
582f2f67
dcb7ee06
Changes
15
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
143 additions
and
116 deletions
+143
-116
Cython/CodeWriter.py
Cython/CodeWriter.py
+17
-3
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+34
-17
Cython/Compiler/Future.py
Cython/Compiler/Future.py
+1
-0
Cython/Compiler/Main.py
Cython/Compiler/Main.py
+1
-0
Cython/Compiler/ModuleNode.py
Cython/Compiler/ModuleNode.py
+9
-1
Cython/Compiler/Naming.py
Cython/Compiler/Naming.py
+1
-0
Cython/Compiler/Nodes.py
Cython/Compiler/Nodes.py
+31
-24
Cython/Compiler/Optimize.py
Cython/Compiler/Optimize.py
+2
-0
Cython/Compiler/ParseTreeTransforms.py
Cython/Compiler/ParseTreeTransforms.py
+0
-5
Cython/Compiler/Parsing.py
Cython/Compiler/Parsing.py
+8
-3
Cython/Compiler/Visitor.py
Cython/Compiler/Visitor.py
+1
-0
bin/update_references
bin/update_references
+0
-49
runtests.py
runtests.py
+12
-4
tests/run/future_division.pyx
tests/run/future_division.pyx
+16
-0
tests/run/switch.pyx
tests/run/switch.pyx
+10
-10
No files found.
Cython/CodeWriter.py
View file @
be78fb70
...
@@ -70,9 +70,9 @@ class CodeWriter(TreeVisitor):
...
@@ -70,9 +70,9 @@ class CodeWriter(TreeVisitor):
if
len
(
items
)
>
0
:
if
len
(
items
)
>
0
:
for
item
in
items
[:
-
1
]:
for
item
in
items
[:
-
1
]:
self
.
visit
(
item
)
self
.
visit
(
item
)
if
output_rhs
and
item
.
rhs
is
not
None
:
if
output_rhs
and
item
.
default
is
not
None
:
self
.
put
(
u" = "
)
self
.
put
(
u" = "
)
self
.
visit
(
item
.
rhs
)
self
.
visit
(
item
.
default
)
self
.
put
(
u", "
)
self
.
put
(
u", "
)
self
.
visit
(
items
[
-
1
])
self
.
visit
(
items
[
-
1
])
...
@@ -123,12 +123,26 @@ class CodeWriter(TreeVisitor):
...
@@ -123,12 +123,26 @@ class CodeWriter(TreeVisitor):
self
.
visit
(
node
.
rhs
)
self
.
visit
(
node
.
rhs
)
self
.
endline
()
self
.
endline
()
def
visit_CascadedAssignmentNode
(
self
,
node
):
self
.
startline
()
for
lhs
in
node
.
lhs_list
:
self
.
visit
(
lhs
)
self
.
put
(
u" = "
)
self
.
visit
(
node
.
rhs
)
self
.
endline
()
def
visit_NameNode
(
self
,
node
):
def
visit_NameNode
(
self
,
node
):
self
.
putname
(
node
.
name
)
self
.
putname
(
node
.
name
)
def
visit_IntNode
(
self
,
node
):
def
visit_IntNode
(
self
,
node
):
self
.
put
(
node
.
value
)
self
.
put
(
node
.
value
)
def
visit_StringNode
(
self
,
node
):
value
=
node
.
value
if
value
.
encoding
is
not
None
:
value
=
value
.
encode
(
value
.
encoding
)
self
.
put
(
repr
(
value
))
def
visit_IfStatNode
(
self
,
node
):
def
visit_IfStatNode
(
self
,
node
):
# The IfClauseNode is handled directly without a seperate match
# The IfClauseNode is handled directly without a seperate match
# for clariy.
# for clariy.
...
...
Cython/Compiler/ExprNodes.py
View file @
be78fb70
...
@@ -1678,6 +1678,17 @@ class SimpleCallNode(CallNode):
...
@@ -1678,6 +1678,17 @@ class SimpleCallNode(CallNode):
func_type
=
func_type
.
base_type
func_type
=
func_type
.
base_type
return
func_type
return
func_type
def
exception_checks
(
self
):
func_type
=
self
.
function_type
()
exc_val
=
func_type
.
exception_value
exc_check
=
func_type
.
exception_check
if
exc_val
is
None
and
self
.
function
.
entry
.
visibility
!=
'extern'
:
return_type
=
func_type
.
return_type
if
not
return_type
.
is_struct_or_union
and
not
return_type
.
is_void
:
exc_val
=
return_type
.
cast_code
(
Naming
.
default_error
)
exc_check
=
1
return
exc_val
,
exc_check
def
analyse_c_function_call
(
self
,
env
):
def
analyse_c_function_call
(
self
,
env
):
func_type
=
self
.
function_type
()
func_type
=
self
.
function_type
()
# Check function type
# Check function type
...
@@ -1719,12 +1730,13 @@ class SimpleCallNode(CallNode):
...
@@ -1719,12 +1730,13 @@ class SimpleCallNode(CallNode):
"Python object cannot be passed as a varargs parameter"
)
"Python object cannot be passed as a varargs parameter"
)
# Calc result type and code fragment
# Calc result type and code fragment
self
.
type
=
func_type
.
return_type
self
.
type
=
func_type
.
return_type
if
self
.
type
.
is_pyobject
\
or
func_type
.
exception_value
is
not
None
\
or
func_type
.
exception_check
:
self
.
is_temp
=
1
if
self
.
type
.
is_pyobject
:
if
self
.
type
.
is_pyobject
:
self
.
is_temp
=
1
self
.
result_ctype
=
py_object_type
self
.
result_ctype
=
py_object_type
else
:
exc_val
,
exc_check
=
self
.
exception_checks
()
if
self
.
type
.
is_pyobject
or
exc_val
is
not
None
or
exc_check
:
self
.
is_temp
=
1
# C++ exception handler
# C++ exception handler
if
func_type
.
exception_check
==
'+'
:
if
func_type
.
exception_check
==
'+'
:
if
func_type
.
exception_value
is
None
:
if
func_type
.
exception_value
is
None
:
...
@@ -1789,8 +1801,7 @@ class SimpleCallNode(CallNode):
...
@@ -1789,8 +1801,7 @@ class SimpleCallNode(CallNode):
if
self
.
type
.
is_pyobject
:
if
self
.
type
.
is_pyobject
:
exc_checks
.
append
(
"!%s"
%
self
.
result_code
)
exc_checks
.
append
(
"!%s"
%
self
.
result_code
)
else
:
else
:
exc_val
=
func_type
.
exception_value
exc_val
,
exc_check
=
self
.
exception_checks
()
exc_check
=
func_type
.
exception_check
if
exc_val
is
not
None
:
if
exc_val
is
not
None
:
exc_checks
.
append
(
"%s == %s"
%
(
self
.
result_code
,
exc_val
))
exc_checks
.
append
(
"%s == %s"
%
(
self
.
result_code
,
exc_val
))
if
exc_check
:
if
exc_check
:
...
@@ -3142,7 +3153,7 @@ class NumBinopNode(BinopNode):
...
@@ -3142,7 +3153,7 @@ class NumBinopNode(BinopNode):
"+"
:
"PyNumber_Add"
,
"+"
:
"PyNumber_Add"
,
"-"
:
"PyNumber_Subtract"
,
"-"
:
"PyNumber_Subtract"
,
"*"
:
"PyNumber_Multiply"
,
"*"
:
"PyNumber_Multiply"
,
"/"
:
"PyNumber_Divide"
,
"/"
:
"
__Pyx_
PyNumber_Divide"
,
"//"
:
"PyNumber_FloorDivide"
,
"//"
:
"PyNumber_FloorDivide"
,
"%"
:
"PyNumber_Remainder"
,
"%"
:
"PyNumber_Remainder"
,
"**"
:
"PyNumber_Power"
"**"
:
"PyNumber_Power"
...
@@ -4046,6 +4057,7 @@ class PersistentNode(ExprNode):
...
@@ -4046,6 +4057,7 @@ class PersistentNode(ExprNode):
subexprs
=
[
"arg"
]
subexprs
=
[
"arg"
]
temp_counter
=
0
temp_counter
=
0
generate_counter
=
0
generate_counter
=
0
analyse_counter
=
0
result_code
=
None
result_code
=
None
def
__init__
(
self
,
arg
,
uses
):
def
__init__
(
self
,
arg
,
uses
):
...
@@ -4054,13 +4066,15 @@ class PersistentNode(ExprNode):
...
@@ -4054,13 +4066,15 @@ class PersistentNode(ExprNode):
self
.
uses
=
uses
self
.
uses
=
uses
def
analyse_types
(
self
,
env
):
def
analyse_types
(
self
,
env
):
if
self
.
analyse_counter
==
0
:
self
.
arg
.
analyse_types
(
env
)
self
.
arg
.
analyse_types
(
env
)
self
.
type
=
self
.
arg
.
type
self
.
type
=
self
.
arg
.
type
self
.
result_ctype
=
self
.
arg
.
result_ctype
self
.
result_ctype
=
self
.
arg
.
result_ctype
self
.
is_temp
=
1
self
.
is_temp
=
1
self
.
analyse_counter
+=
1
def
calculate_result_code
(
self
):
def
calculate_result_code
(
self
):
return
self
.
arg
.
result_code
return
self
.
result_code
def
generate_evaluation_code
(
self
,
code
):
def
generate_evaluation_code
(
self
,
code
):
if
self
.
generate_counter
==
0
:
if
self
.
generate_counter
==
0
:
...
@@ -4080,12 +4094,15 @@ class PersistentNode(ExprNode):
...
@@ -4080,12 +4094,15 @@ class PersistentNode(ExprNode):
def
allocate_temps
(
self
,
env
,
result
=
None
):
def
allocate_temps
(
self
,
env
,
result
=
None
):
if
self
.
temp_counter
==
0
:
if
self
.
temp_counter
==
0
:
self
.
arg
.
allocate_temps
(
env
)
self
.
arg
.
allocate_temps
(
env
)
self
.
allocate_temp
(
env
,
result
)
self
.
arg
.
release_temp
(
env
)
self
.
temp_counter
+=
1
def
allocate_temp
(
self
,
env
,
result
=
None
):
if
result
is
None
:
if
result
is
None
:
self
.
result_code
=
env
.
allocate_temp
(
self
.
type
)
self
.
result_code
=
env
.
allocate_temp
(
self
.
type
)
else
:
else
:
self
.
result_code
=
result
self
.
result_code
=
result
self
.
arg
.
release_temp
(
env
)
self
.
temp_counter
+=
1
def
release_temp
(
self
,
env
):
def
release_temp
(
self
,
env
):
if
self
.
temp_counter
==
self
.
uses
:
if
self
.
temp_counter
==
self
.
uses
:
...
...
Cython/Compiler/Future.py
View file @
be78fb70
...
@@ -8,5 +8,6 @@ def _get_feature(name):
...
@@ -8,5 +8,6 @@ def _get_feature(name):
unicode_literals
=
_get_feature
(
"unicode_literals"
)
unicode_literals
=
_get_feature
(
"unicode_literals"
)
with_statement
=
_get_feature
(
"with_statement"
)
with_statement
=
_get_feature
(
"with_statement"
)
division
=
_get_feature
(
"division"
)
del
_get_feature
del
_get_feature
Cython/Compiler/Main.py
View file @
be78fb70
...
@@ -354,6 +354,7 @@ def create_generate_code(context, options, result):
...
@@ -354,6 +354,7 @@ def create_generate_code(context, options, result):
return
generate_code
return
generate_code
def
create_default_pipeline
(
context
,
options
,
result
):
def
create_default_pipeline
(
context
,
options
,
result
):
from
Visitor
import
PrintTree
from
ParseTreeTransforms
import
WithTransform
,
NormalizeTree
,
PostParse
from
ParseTreeTransforms
import
WithTransform
,
NormalizeTree
,
PostParse
from
ParseTreeTransforms
import
AnalyseDeclarationsTransform
,
AnalyseExpressionsTransform
from
ParseTreeTransforms
import
AnalyseDeclarationsTransform
,
AnalyseExpressionsTransform
from
ParseTreeTransforms
import
CreateClosureClasses
,
MarkClosureVisitor
,
DecoratorTransform
from
ParseTreeTransforms
import
CreateClosureClasses
,
MarkClosureVisitor
,
DecoratorTransform
...
...
Cython/Compiler/ModuleNode.py
View file @
be78fb70
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
import
os
,
time
import
os
,
time
from
cStringIO
import
StringIO
from
cStringIO
import
StringIO
from
PyrexTypes
import
CPtrType
from
PyrexTypes
import
CPtrType
import
Future
try
:
try
:
set
set
...
@@ -467,8 +468,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
...
@@ -467,8 +468,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code
.
putln
(
" #define PyInt_AsSsize_t PyLong_AsSsize_t"
)
code
.
putln
(
" #define PyInt_AsSsize_t PyLong_AsSsize_t"
)
code
.
putln
(
" #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask"
)
code
.
putln
(
" #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask"
)
code
.
putln
(
" #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask"
)
code
.
putln
(
" #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask"
)
code
.
putln
(
" #define PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y)"
)
code
.
putln
(
" #define
__Pyx_
PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y)"
)
code
.
putln
(
"#else"
)
code
.
putln
(
"#else"
)
if
Future
.
division
in
env
.
context
.
future_directives
:
code
.
putln
(
" #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y)"
)
else
:
code
.
putln
(
" #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y)"
)
code
.
putln
(
" #define PyBytes_Type PyString_Type"
)
code
.
putln
(
" #define PyBytes_Type PyString_Type"
)
code
.
putln
(
"#endif"
)
code
.
putln
(
"#endif"
)
...
@@ -482,6 +487,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
...
@@ -482,6 +487,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code
.
putln
(
"#ifndef __cdecl"
)
code
.
putln
(
"#ifndef __cdecl"
)
code
.
putln
(
" #define __cdecl"
)
code
.
putln
(
" #define __cdecl"
)
code
.
putln
(
"#endif"
)
code
.
putln
(
"#endif"
)
code
.
putln
(
''
);
code
.
putln
(
'#define %s 0xB0000000B000B0BBLL'
%
Naming
.
default_error
);
code
.
putln
(
''
);
self
.
generate_extern_c_macro_definition
(
code
)
self
.
generate_extern_c_macro_definition
(
code
)
code
.
putln
(
"#include <math.h>"
)
code
.
putln
(
"#include <math.h>"
)
code
.
putln
(
"#define %s"
%
Naming
.
api_guard_prefix
+
self
.
api_name
(
env
))
code
.
putln
(
"#define %s"
%
Naming
.
api_guard_prefix
+
self
.
api_name
(
env
))
...
...
Cython/Compiler/Naming.py
View file @
be78fb70
...
@@ -74,6 +74,7 @@ import_star = pyrex_prefix + "import_star"
...
@@ -74,6 +74,7 @@ import_star = pyrex_prefix + "import_star"
import_star_set
=
pyrex_prefix
+
"import_star_set"
import_star_set
=
pyrex_prefix
+
"import_star_set"
cur_scope_cname
=
pyrex_prefix
+
"cur_scope"
cur_scope_cname
=
pyrex_prefix
+
"cur_scope"
enc_scope_cname
=
pyrex_prefix
+
"enc_scope"
enc_scope_cname
=
pyrex_prefix
+
"enc_scope"
default_error
=
pyrex_prefix
+
"ERROR"
line_c_macro
=
"__LINE__"
line_c_macro
=
"__LINE__"
...
...
Cython/Compiler/Nodes.py
View file @
be78fb70
...
@@ -177,7 +177,7 @@ class Node(object):
...
@@ -177,7 +177,7 @@ class Node(object):
if
isinstance
(
x
,
Node
):
if
isinstance
(
x
,
Node
):
return
x
.
dump
(
level
)
return
x
.
dump
(
level
)
elif
isinstance
(
x
,
list
):
elif
isinstance
(
x
,
list
):
return
"[%s]"
%
", "
.
join
(
dump_child
(
item
,
level
)
for
item
in
x
)
return
"[%s]"
%
", "
.
join
(
[
dump_child
(
item
,
level
)
for
item
in
x
]
)
else
:
else
:
return
repr
(
x
)
return
repr
(
x
)
...
@@ -359,9 +359,11 @@ class CDeclaratorNode(Node):
...
@@ -359,9 +359,11 @@ class CDeclaratorNode(Node):
class
CNameDeclaratorNode
(
CDeclaratorNode
):
class
CNameDeclaratorNode
(
CDeclaratorNode
):
# name string The Pyrex name being declared
# name string The Pyrex name being declared
# cname string or None C name, if specified
# cname string or None C name, if specified
#
rhs
ExprNode or None the value assigned on declaration
#
default
ExprNode or None the value assigned on declaration
child_attrs
=
[]
child_attrs
=
[
'default'
]
default
=
None
def
analyse
(
self
,
base_type
,
env
,
nonempty
=
0
):
def
analyse
(
self
,
base_type
,
env
,
nonempty
=
0
):
if
nonempty
and
self
.
name
==
''
:
if
nonempty
and
self
.
name
==
''
:
...
@@ -373,25 +375,25 @@ class CNameDeclaratorNode(CDeclaratorNode):
...
@@ -373,25 +375,25 @@ class CNameDeclaratorNode(CDeclaratorNode):
def
analyse_expressions
(
self
,
env
):
def
analyse_expressions
(
self
,
env
):
self
.
entry
=
env
.
lookup
(
self
.
name
)
self
.
entry
=
env
.
lookup
(
self
.
name
)
if
self
.
rhs
is
not
None
:
if
self
.
default
is
not
None
:
env
.
control_flow
.
set_state
(
self
.
rhs
.
end_pos
(),
(
self
.
entry
.
name
,
'initalized'
),
True
)
env
.
control_flow
.
set_state
(
self
.
default
.
end_pos
(),
(
self
.
entry
.
name
,
'initalized'
),
True
)
env
.
control_flow
.
set_state
(
self
.
rhs
.
end_pos
(),
(
self
.
entry
.
name
,
'source'
),
'assignment'
)
env
.
control_flow
.
set_state
(
self
.
default
.
end_pos
(),
(
self
.
entry
.
name
,
'source'
),
'assignment'
)
self
.
entry
.
used
=
1
self
.
entry
.
used
=
1
if
self
.
type
.
is_pyobject
:
if
self
.
type
.
is_pyobject
:
self
.
entry
.
init_to_none
=
False
self
.
entry
.
init_to_none
=
False
self
.
entry
.
init
=
0
self
.
entry
.
init
=
0
self
.
rhs
.
analyse_types
(
env
)
self
.
default
.
analyse_types
(
env
)
self
.
rhs
=
self
.
rhs
.
coerce_to
(
self
.
type
,
env
)
self
.
default
=
self
.
default
.
coerce_to
(
self
.
type
,
env
)
self
.
rhs
.
allocate_temps
(
env
)
self
.
default
.
allocate_temps
(
env
)
self
.
rhs
.
release_temp
(
env
)
self
.
default
.
release_temp
(
env
)
def
generate_execution_code
(
self
,
code
):
def
generate_execution_code
(
self
,
code
):
if
self
.
rhs
is
not
None
:
if
self
.
default
is
not
None
:
self
.
rhs
.
generate_evaluation_code
(
code
)
self
.
default
.
generate_evaluation_code
(
code
)
if
self
.
type
.
is_pyobject
:
if
self
.
type
.
is_pyobject
:
self
.
rhs
.
make_owned_reference
(
code
)
self
.
default
.
make_owned_reference
(
code
)
code
.
putln
(
'%s = %s;'
%
(
self
.
entry
.
cname
,
self
.
rhs
.
result_as
(
self
.
entry
.
type
)))
code
.
putln
(
'%s = %s;'
%
(
self
.
entry
.
cname
,
self
.
default
.
result_as
(
self
.
entry
.
type
)))
self
.
rhs
.
generate_post_assignment_code
(
code
)
self
.
default
.
generate_post_assignment_code
(
code
)
code
.
putln
()
code
.
putln
()
class
CPtrDeclaratorNode
(
CDeclaratorNode
):
class
CPtrDeclaratorNode
(
CDeclaratorNode
):
...
@@ -1211,10 +1213,17 @@ class CFuncDefNode(FuncDefNode):
...
@@ -1211,10 +1213,17 @@ class CFuncDefNode(FuncDefNode):
if
self
.
return_type
.
is_pyobject
:
if
self
.
return_type
.
is_pyobject
:
return
"0"
return
"0"
else
:
else
:
#return None
if
self
.
entry
.
type
.
exception_value
is
not
None
:
return
self
.
entry
.
type
.
exception_value
return
self
.
entry
.
type
.
exception_value
elif
self
.
return_type
.
is_struct_or_union
or
self
.
return_type
.
is_void
:
return
None
else
:
return
self
.
return_type
.
cast_code
(
Naming
.
default_error
)
def
caller_will_check_exceptions
(
self
):
def
caller_will_check_exceptions
(
self
):
if
self
.
entry
.
type
.
exception_value
is
None
:
return
1
else
:
return
self
.
entry
.
type
.
exception_check
return
self
.
entry
.
type
.
exception_check
def
generate_optarg_wrapper_function
(
self
,
env
,
code
):
def
generate_optarg_wrapper_function
(
self
,
env
,
code
):
...
@@ -1917,9 +1926,7 @@ class OverrideCheckNode(StatNode):
...
@@ -1917,9 +1926,7 @@ class OverrideCheckNode(StatNode):
function
=
self
.
func_node
,
function
=
self
.
func_node
,
args
=
[
ExprNodes
.
NameNode
(
self
.
pos
,
name
=
arg
.
name
)
for
arg
in
self
.
args
[
first_arg
:]])
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
=
ReturnStatNode
(
self
.
pos
,
value
=
call_node
)
# self.func_temp = env.allocate_temp_pyobject()
self
.
body
.
analyse_expressions
(
env
)
self
.
body
.
analyse_expressions
(
env
)
# env.release_temp(self.func_temp)
def
generate_execution_code
(
self
,
code
):
def
generate_execution_code
(
self
,
code
):
# Check to see if we are an extension type
# Check to see if we are an extension type
...
@@ -1934,7 +1941,7 @@ class OverrideCheckNode(StatNode):
...
@@ -1934,7 +1941,7 @@ class OverrideCheckNode(StatNode):
code
.
putln
(
"else {"
)
code
.
putln
(
"else {"
)
else
:
else
:
code
.
putln
(
"else if (unlikely(Py_TYPE(%s)->tp_dictoffset != 0)) {"
%
self_arg
)
code
.
putln
(
"else if (unlikely(Py_TYPE(%s)->tp_dictoffset != 0)) {"
%
self_arg
)
err
=
code
.
error_goto_if_null
(
self
_arg
,
self
.
pos
)
err
=
code
.
error_goto_if_null
(
self
.
func_node
.
result_code
,
self
.
pos
)
# need to get attribute manually--scope would return cdef method
# need to get attribute manually--scope would return cdef method
code
.
putln
(
"%s = PyObject_GetAttr(%s, %s); %s"
%
(
self
.
func_node
.
result_code
,
self_arg
,
self
.
py_func
.
interned_attr_cname
,
err
))
code
.
putln
(
"%s = PyObject_GetAttr(%s, %s); %s"
%
(
self
.
func_node
.
result_code
,
self_arg
,
self
.
py_func
.
interned_attr_cname
,
err
))
# It appears that this type is not anywhere exposed in the Python/C API
# It appears that this type is not anywhere exposed in the Python/C API
...
@@ -1943,7 +1950,7 @@ class OverrideCheckNode(StatNode):
...
@@ -1943,7 +1950,7 @@ class OverrideCheckNode(StatNode):
code
.
putln
(
'if (!%s || %s) {'
%
(
is_builtin_function_or_method
,
is_overridden
))
code
.
putln
(
'if (!%s || %s) {'
%
(
is_builtin_function_or_method
,
is_overridden
))
self
.
body
.
generate_execution_code
(
code
)
self
.
body
.
generate_execution_code
(
code
)
code
.
putln
(
'}'
)
code
.
putln
(
'}'
)
# code.put_decref(self.func_temp
, PyrexTypes.py_object_type)
code
.
put_decref_clear
(
self
.
func_node
.
result_code
,
PyrexTypes
.
py_object_type
)
code
.
putln
(
"}"
)
code
.
putln
(
"}"
)
class
ClassDefNode
(
StatNode
,
BlockNode
):
class
ClassDefNode
(
StatNode
,
BlockNode
):
...
...
Cython/Compiler/Optimize.py
View file @
be78fb70
...
@@ -71,6 +71,8 @@ class SwitchTransform(Visitor.VisitorTransform):
...
@@ -71,6 +71,8 @@ class SwitchTransform(Visitor.VisitorTransform):
cases
.
append
(
Nodes
.
SwitchCaseNode
(
pos
=
if_clause
.
pos
,
cases
.
append
(
Nodes
.
SwitchCaseNode
(
pos
=
if_clause
.
pos
,
conditions
=
conditions
,
conditions
=
conditions
,
body
=
if_clause
.
body
))
body
=
if_clause
.
body
))
common_var
=
unwrap_node
(
common_var
)
return
Nodes
.
SwitchStatNode
(
pos
=
node
.
pos
,
return
Nodes
.
SwitchStatNode
(
pos
=
node
.
pos
,
test
=
common_var
,
test
=
common_var
,
cases
=
cases
,
cases
=
cases
,
...
...
Cython/Compiler/ParseTreeTransforms.py
View file @
be78fb70
...
@@ -72,11 +72,6 @@ class NormalizeTree(CythonTransform):
...
@@ -72,11 +72,6 @@ class NormalizeTree(CythonTransform):
else
:
else
:
return
[]
return
[]
# Eliminate CascadedAssignmentNode
def
visit_CascadedAssignmentNode
(
self
,
node
):
tmpname
=
temp_name_handle
()
class
PostParseError
(
CompileError
):
pass
class
PostParseError
(
CompileError
):
pass
...
...
Cython/Compiler/Parsing.py
View file @
be78fb70
...
@@ -8,7 +8,7 @@ from Scanning import PyrexScanner, FileSourceDescriptor
...
@@ -8,7 +8,7 @@ from Scanning import PyrexScanner, FileSourceDescriptor
import
Nodes
import
Nodes
import
ExprNodes
import
ExprNodes
from
ModuleNode
import
ModuleNode
from
ModuleNode
import
ModuleNode
from
Errors
import
error
,
InternalError
from
Errors
import
error
,
warning
,
InternalError
from
Cython
import
Utils
from
Cython
import
Utils
import
Future
import
Future
...
@@ -1784,7 +1784,7 @@ def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
...
@@ -1784,7 +1784,7 @@ def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
name
=
""
name
=
""
cname
=
None
cname
=
None
result
=
Nodes
.
CNameDeclaratorNode
(
pos
,
result
=
Nodes
.
CNameDeclaratorNode
(
pos
,
name
=
name
,
cname
=
cname
,
rhs
=
rhs
)
name
=
name
,
cname
=
cname
,
default
=
rhs
)
result
.
calling_convention
=
calling_convention
result
.
calling_convention
=
calling_convention
return
result
return
result
...
@@ -2281,9 +2281,14 @@ def p_property_decl(s):
...
@@ -2281,9 +2281,14 @@ def p_property_decl(s):
def
p_doc_string
(
s
):
def
p_doc_string
(
s
):
if
s
.
sy
==
'BEGIN_STRING'
:
if
s
.
sy
==
'BEGIN_STRING'
:
_
,
result
=
p_cat_string_literal
(
s
)
pos
=
s
.
position
()
kind
,
result
=
p_cat_string_literal
(
s
)
if
s
.
sy
!=
'EOF'
:
if
s
.
sy
!=
'EOF'
:
s
.
expect_newline
(
"Syntax error in doc string"
)
s
.
expect_newline
(
"Syntax error in doc string"
)
if
kind
!=
'u'
:
# warning(pos, "Python 3 requires docstrings to be unicode strings")
if
kind
==
'b'
:
result
.
encoding
=
None
# force a unicode string
return
result
return
result
else
:
else
:
return
None
return
None
...
...
Cython/Compiler/Visitor.py
View file @
be78fb70
...
@@ -213,6 +213,7 @@ class PrintTree(TreeVisitor):
...
@@ -213,6 +213,7 @@ class PrintTree(TreeVisitor):
def
__call__
(
self
,
tree
,
phase
=
None
):
def
__call__
(
self
,
tree
,
phase
=
None
):
print
(
"Parse tree dump at phase '%s'"
%
phase
)
print
(
"Parse tree dump at phase '%s'"
%
phase
)
self
.
visit
(
tree
)
self
.
visit
(
tree
)
return
tree
# Don't do anything about process_list, the defaults gives
# Don't do anything about process_list, the defaults gives
# nice-looking name[idx] nodes which will visually appear
# nice-looking name[idx] nodes which will visually appear
...
...
bin/update_references
deleted
100755 → 0
View file @
582f2f67
#!/usr/bin/env python
#
# Go through the Tests directory and its subdirectories
# copying the latest versions of the test outputs into
# the Reference directories.
#
import
os
,
sys
ignore_names
=
[
".DS_Store"
,
"Icon
\
r
"
]
def
copy_file
(
from_path
,
to_path
):
# We copy the contents from one file to the other
# so as to preserve metadata on the Mac.
#print from_path, "-->", to_path
f
=
open
(
from_path
)
g
=
open
(
to_path
,
"w+"
)
g
.
write
(
f
.
read
())
f
.
close
()
g
.
close
()
def
update_references
(
out_dir
,
ref_dir
):
for
name
in
os
.
listdir
(
ref_dir
):
if
name
not
in
ignore_names
:
out_file
=
os
.
path
.
join
(
out_dir
,
name
)
ref_file
=
os
.
path
.
join
(
ref_dir
,
name
)
if
os
.
path
.
isfile
(
out_file
):
print
"Updating"
,
name
copy_file
(
out_file
,
ref_file
)
def
update_references_in_dir
(
dir
):
print
"Updating references in"
,
dir
for
name
in
os
.
listdir
(
dir
):
if
name
<>
"Reference"
and
not
name
.
startswith
(
"("
):
item_path
=
os
.
path
.
join
(
dir
,
name
)
if
os
.
path
.
isdir
(
item_path
):
update_references_in_dir
(
item_path
)
ref_dir
=
os
.
path
.
join
(
dir
,
"Reference"
)
if
os
.
path
.
isdir
(
ref_dir
):
update_references
(
dir
,
ref_dir
)
def
main
():
bin_dir
=
os
.
path
.
dirname
(
sys
.
argv
[
0
])
source_dir
=
os
.
path
.
dirname
(
bin_dir
)
tests_dir
=
os
.
path
.
join
(
source_dir
,
"Tests"
)
update_references_in_dir
(
tests_dir
)
if
__name__
==
"__main__"
:
main
()
runtests.py
View file @
be78fb70
...
@@ -45,13 +45,15 @@ class ErrorWriter(object):
...
@@ -45,13 +45,15 @@ class ErrorWriter(object):
return
self
.
_collect
(
True
,
True
)
return
self
.
_collect
(
True
,
True
)
class
TestBuilder
(
object
):
class
TestBuilder
(
object
):
def
__init__
(
self
,
rootdir
,
workdir
,
selectors
,
annotate
,
cleanup_workdir
,
cleanup_sharedlibs
):
def
__init__
(
self
,
rootdir
,
workdir
,
selectors
,
annotate
,
cleanup_workdir
,
cleanup_sharedlibs
,
with_pyregr
):
self
.
rootdir
=
rootdir
self
.
rootdir
=
rootdir
self
.
workdir
=
workdir
self
.
workdir
=
workdir
self
.
selectors
=
selectors
self
.
selectors
=
selectors
self
.
annotate
=
annotate
self
.
annotate
=
annotate
self
.
cleanup_workdir
=
cleanup_workdir
self
.
cleanup_workdir
=
cleanup_workdir
self
.
cleanup_sharedlibs
=
cleanup_sharedlibs
self
.
cleanup_sharedlibs
=
cleanup_sharedlibs
self
.
with_pyregr
=
with_pyregr
def
build_suite
(
self
):
def
build_suite
(
self
):
suite
=
unittest
.
TestSuite
()
suite
=
unittest
.
TestSuite
()
...
@@ -63,6 +65,8 @@ class TestBuilder(object):
...
@@ -63,6 +65,8 @@ class TestBuilder(object):
continue
continue
path
=
os
.
path
.
join
(
self
.
rootdir
,
filename
)
path
=
os
.
path
.
join
(
self
.
rootdir
,
filename
)
if
os
.
path
.
isdir
(
path
)
and
filename
in
TEST_DIRS
:
if
os
.
path
.
isdir
(
path
)
and
filename
in
TEST_DIRS
:
if
filename
==
'pyregr'
and
not
self
.
with_pyregr
:
continue
suite
.
addTest
(
suite
.
addTest
(
self
.
handle_directory
(
path
,
filename
))
self
.
handle_directory
(
path
,
filename
))
return
suite
return
suite
...
@@ -117,6 +121,7 @@ class CythonCompileTestCase(unittest.TestCase):
...
@@ -117,6 +121,7 @@ class CythonCompileTestCase(unittest.TestCase):
self
.
expect_errors
=
expect_errors
self
.
expect_errors
=
expect_errors
self
.
annotate
=
annotate
self
.
annotate
=
annotate
self
.
cleanup_workdir
=
cleanup_workdir
self
.
cleanup_workdir
=
cleanup_workdir
self
.
cleanup_sharedlibs
=
cleanup_sharedlibs
unittest
.
TestCase
.
__init__
(
self
)
unittest
.
TestCase
.
__init__
(
self
)
def
shortDescription
(
self
):
def
shortDescription
(
self
):
...
@@ -301,7 +306,7 @@ def collect_unittests(path, suite, selectors):
...
@@ -301,7 +306,7 @@ def collect_unittests(path, suite, selectors):
module
=
__import__
(
modulename
)
module
=
__import__
(
modulename
)
for
x
in
modulename
.
split
(
'.'
)[
1
:]:
for
x
in
modulename
.
split
(
'.'
)[
1
:]:
module
=
getattr
(
module
,
x
)
module
=
getattr
(
module
,
x
)
suite
.
addTests
(
loader
.
loadTestsFromModule
(
module
)
)
suite
.
addTests
(
[
loader
.
loadTestsFromModule
(
module
)]
)
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
from
optparse
import
OptionParser
from
optparse
import
OptionParser
...
@@ -321,6 +326,9 @@ if __name__ == '__main__':
...
@@ -321,6 +326,9 @@ if __name__ == '__main__':
parser
.
add_option
(
"--no-file"
,
dest
=
"filetests"
,
parser
.
add_option
(
"--no-file"
,
dest
=
"filetests"
,
action
=
"store_false"
,
default
=
True
,
action
=
"store_false"
,
default
=
True
,
help
=
"do not run the file based tests"
)
help
=
"do not run the file based tests"
)
parser
.
add_option
(
"--no-pyregr"
,
dest
=
"pyregr"
,
action
=
"store_false"
,
default
=
True
,
help
=
"do not run the regression tests of CPython in tests/pyregr/"
)
parser
.
add_option
(
"-C"
,
"--coverage"
,
dest
=
"coverage"
,
parser
.
add_option
(
"-C"
,
"--coverage"
,
dest
=
"coverage"
,
action
=
"store_true"
,
default
=
False
,
action
=
"store_true"
,
default
=
False
,
help
=
"collect source coverage data for the Compiler"
)
help
=
"collect source coverage data for the Compiler"
)
...
@@ -378,8 +386,8 @@ if __name__ == '__main__':
...
@@ -378,8 +386,8 @@ if __name__ == '__main__':
if
options
.
filetests
:
if
options
.
filetests
:
filetests
=
TestBuilder
(
ROOTDIR
,
WORKDIR
,
selectors
,
filetests
=
TestBuilder
(
ROOTDIR
,
WORKDIR
,
selectors
,
options
.
annotate_source
,
options
.
cleanup_workdir
,
options
.
annotate_source
,
options
.
cleanup_workdir
,
options
.
cleanup_sharedlibs
)
options
.
cleanup_sharedlibs
,
options
.
pyregr
)
test_suite
.
addTests
(
filetests
.
build_suite
()
)
test_suite
.
addTests
(
[
filetests
.
build_suite
()]
)
unittest
.
TextTestRunner
(
verbosity
=
options
.
verbosity
).
run
(
test_suite
)
unittest
.
TextTestRunner
(
verbosity
=
options
.
verbosity
).
run
(
test_suite
)
...
...
tests/run/future_division.pyx
0 → 100644
View file @
be78fb70
from
__future__
import
division
__doc__
=
"""
>>> from future_division import doit
>>> doit(1,2)
(0.5, 0)
>>> doit(4,3)
(1.3333333333333333, 1)
>>> doit(4,3.0)
(1.3333333333333333, 1.0)
>>> doit(4,2)
(2.0, 2)
"""
def
doit
(
x
,
y
):
return
x
/
y
,
x
//
y
tests/run/switch.pyx
View file @
be78fb70
...
@@ -25,9 +25,9 @@ __doc__ = u"""
...
@@ -25,9 +25,9 @@ __doc__ = u"""
>>> switch_py(8)
>>> switch_py(8)
4
4
>>> switch_py(10)
>>> switch_py(10)
7
10
>>> switch_py(12)
>>> switch_py(12)
8
12
>>> switch_py(13)
>>> switch_py(13)
0
0
...
@@ -57,9 +57,9 @@ __doc__ = u"""
...
@@ -57,9 +57,9 @@ __doc__ = u"""
>>> switch_c(8)
>>> switch_c(8)
4
4
>>> switch_c(10)
>>> switch_c(10)
7
10
>>> switch_c(12)
>>> switch_c(12)
8
12
>>> switch_c(13)
>>> switch_c(13)
0
0
"""
"""
...
@@ -86,10 +86,10 @@ def switch_py(x):
...
@@ -86,10 +86,10 @@ def switch_py(x):
return
3
return
3
elif
x
in
[
4
,
5
,
7
,
8
]:
elif
x
in
[
4
,
5
,
7
,
8
]:
return
4
return
4
elif
x
in
(
10
,
11
):
# doesn't work: (7,8,10,11)
elif
x
in
(
10
,
11
):
return
7
return
10
elif
x
in
(
12
,):
elif
x
in
(
12
,):
return
8
return
12
else
:
else
:
return
0
return
0
return
-
1
return
-
1
...
@@ -116,10 +116,10 @@ def switch_c(int x):
...
@@ -116,10 +116,10 @@ def switch_c(int x):
return
3
return
3
elif
x
in
[
4
,
5
,
7
,
8
]:
elif
x
in
[
4
,
5
,
7
,
8
]:
return
4
return
4
elif
x
in
(
10
,
11
):
# doesn't work: (7,8,10,11)
elif
x
in
(
10
,
11
):
return
7
return
10
elif
x
in
(
12
,):
elif
x
in
(
12
,):
return
8
return
12
else
:
else
:
return
0
return
0
return
-
1
return
-
1
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