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
Gwenaël Samain
cython
Commits
3b167e95
Commit
3b167e95
authored
Oct 21, 2009
by
Robert Bradshaw
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
eeb23d53
4c7745cd
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
586 additions
and
32 deletions
+586
-32
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+0
-1
Cython/Compiler/Main.py
Cython/Compiler/Main.py
+2
-0
Cython/Compiler/Optimize.py
Cython/Compiler/Optimize.py
+86
-19
Cython/Compiler/ParseTreeTransforms.py
Cython/Compiler/ParseTreeTransforms.py
+9
-1
Tools/site_scons/site_tools/cython.py
Tools/site_scons/site_tools/cython.py
+67
-0
Tools/site_scons/site_tools/pyext.py
Tools/site_scons/site_tools/pyext.py
+233
-0
tests/run/locals.pyx
tests/run/locals.pyx
+13
-7
tests/run/locals_expressions_T430.pyx
tests/run/locals_expressions_T430.pyx
+30
-0
tests/run/locals_rebind_T429.pyx
tests/run/locals_rebind_T429.pyx
+25
-0
tests/run/parallel_swap_assign_T425.pyx
tests/run/parallel_swap_assign_T425.pyx
+121
-4
No files found.
Cython/Compiler/ExprNodes.py
View file @
3b167e95
...
@@ -3719,7 +3719,6 @@ class DictNode(ExprNode):
...
@@ -3719,7 +3719,6 @@ class DictNode(ExprNode):
is_temp
=
1
is_temp
=
1
type
=
dict_type
type
=
dict_type
type
=
dict_type
obj_conversion_errors
=
[]
obj_conversion_errors
=
[]
def
calculate_constant_result
(
self
):
def
calculate_constant_result
(
self
):
...
...
Cython/Compiler/Main.py
View file @
3b167e95
...
@@ -93,6 +93,7 @@ class Context(object):
...
@@ -93,6 +93,7 @@ class Context(object):
from
AutoDocTransforms
import
EmbedSignature
from
AutoDocTransforms
import
EmbedSignature
from
Optimize
import
FlattenInListTransform
,
SwitchTransform
,
IterationTransform
from
Optimize
import
FlattenInListTransform
,
SwitchTransform
,
IterationTransform
from
Optimize
import
OptimizeBuiltinCalls
,
ConstantFolding
,
FinalOptimizePhase
from
Optimize
import
OptimizeBuiltinCalls
,
ConstantFolding
,
FinalOptimizePhase
from
Optimize
import
DropRefcountingTransform
from
Buffer
import
IntroduceBufferAuxiliaryVars
from
Buffer
import
IntroduceBufferAuxiliaryVars
from
ModuleNode
import
check_c_declarations
,
check_c_declarations_pxd
from
ModuleNode
import
check_c_declarations
,
check_c_declarations_pxd
...
@@ -138,6 +139,7 @@ class Context(object):
...
@@ -138,6 +139,7 @@ class Context(object):
OptimizeBuiltinCalls
(),
OptimizeBuiltinCalls
(),
IterationTransform
(),
IterationTransform
(),
SwitchTransform
(),
SwitchTransform
(),
DropRefcountingTransform
(),
FinalOptimizePhase
(
self
),
FinalOptimizePhase
(
self
),
GilCheck
(),
GilCheck
(),
# ClearResultCodes(self),
# ClearResultCodes(self),
...
...
Cython/Compiler/Optimize.py
View file @
3b167e95
...
@@ -528,39 +528,106 @@ class DropRefcountingTransform(Visitor.VisitorTransform):
...
@@ -528,39 +528,106 @@ class DropRefcountingTransform(Visitor.VisitorTransform):
visit_Node
=
Visitor
.
VisitorTransform
.
recurse_to_children
visit_Node
=
Visitor
.
VisitorTransform
.
recurse_to_children
def
visit_ParallelAssignmentNode
(
self
,
node
):
def
visit_ParallelAssignmentNode
(
self
,
node
):
left
,
right
,
temps
=
[],
[],
[]
left_names
,
right_names
=
[],
[]
left_indices
,
right_indices
=
[],
[]
temps
=
[]
for
stat
in
node
.
stats
:
for
stat
in
node
.
stats
:
if
isinstance
(
stat
,
Nodes
.
SingleAssignmentNode
):
if
isinstance
(
stat
,
Nodes
.
SingleAssignmentNode
):
lhs
=
unwrap_node
(
stat
.
lhs
)
if
not
self
.
_extract_operand
(
stat
.
lhs
,
left_names
,
if
not
isinstance
(
lhs
,
ExprNodes
.
NameNode
):
left_indices
,
temps
):
return
node
return
node
left
.
append
(
lhs
)
if
not
self
.
_extract_operand
(
stat
.
rhs
,
right_names
,
rhs
=
unwrap_node
(
stat
.
rhs
)
right_indices
,
temps
):
if
isinstance
(
rhs
,
ExprNodes
.
CoerceToTempNode
):
temps
.
append
(
rhs
)
rhs
=
rhs
.
arg
if
not
isinstance
(
rhs
,
ExprNodes
.
NameNode
):
return
node
return
node
right
.
append
(
rhs
)
elif
isinstance
(
stat
,
Nodes
.
CascadedAssignmentNode
):
# FIXME
return
node
else
:
else
:
return
node
return
node
for
name_node
in
left
+
right
:
if
left_names
or
right_names
:
if
name_node
.
entry
.
is_builtin
or
name_node
.
entry
.
is_pyglobal
:
# lhs/rhs names must be a non-redundant permutation
lnames
=
[
n
.
name
for
n
in
left_names
]
rnames
=
[
n
.
name
for
n
in
right_names
]
if
set
(
lnames
)
!=
set
(
rnames
):
return
node
if
len
(
set
(
lnames
))
!=
len
(
right_names
):
return
node
return
node
left_names
=
[
n
.
name
for
n
in
left
]
if
left_indices
or
right_indices
:
right_names
=
[
n
.
name
for
n
in
right
]
# base name and index of index nodes must be a
if
set
(
left_names
)
!=
set
(
right_names
):
# non-redundant permutation
return
node
lindices
=
[]
if
len
(
set
(
left_names
))
!=
len
(
right
):
for
lhs_node
in
left_indices
:
index_id
=
self
.
_extract_index_id
(
lhs_node
)
if
not
index_id
:
return
node
lindices
.
append
(
index_id
)
rindices
=
[]
for
rhs_node
in
right_indices
:
index_id
=
self
.
_extract_index_id
(
rhs_node
)
if
not
index_id
:
return
node
rindices
.
append
(
index_id
)
if
set
(
lindices
)
!=
set
(
rindices
):
return
node
if
len
(
set
(
lindices
))
!=
len
(
right_indices
):
return
node
# really supporting IndexNode requires support in
# __Pyx_GetItemInt(), so let's stop short for now
return
node
return
node
for
name_node
in
left
+
right
+
temps
:
temp_args
=
[
t
.
arg
for
t
in
temps
]
name_node
.
use_managed_ref
=
False
for
temp
in
temps
:
temp
.
use_managed_ref
=
False
for
name_node
in
left_names
+
right_names
:
if
name_node
not
in
temp_args
:
name_node
.
use_managed_ref
=
False
for
index_node
in
left_indices
+
right_indices
:
index_node
.
use_managed_ref
=
False
return
node
return
node
def
_extract_operand
(
self
,
node
,
names
,
indices
,
temps
):
node
=
unwrap_node
(
node
)
if
not
node
.
type
.
is_pyobject
:
return
False
if
isinstance
(
node
,
ExprNodes
.
CoerceToTempNode
):
temps
.
append
(
node
)
node
=
node
.
arg
if
isinstance
(
node
,
ExprNodes
.
NameNode
):
if
node
.
entry
.
is_builtin
or
node
.
entry
.
is_pyglobal
:
return
False
names
.
append
(
node
)
elif
isinstance
(
node
,
ExprNodes
.
IndexNode
):
if
node
.
base
.
type
!=
Builtin
.
list_type
:
return
False
if
not
node
.
index
.
type
.
is_int
:
return
False
if
not
isinstance
(
node
.
base
,
ExprNodes
.
NameNode
):
return
False
indices
.
append
(
node
)
else
:
return
False
return
True
def
_extract_index_id
(
self
,
index_node
):
base
=
index_node
.
base
index
=
index_node
.
index
if
isinstance
(
index
,
ExprNodes
.
NameNode
):
index_val
=
index
.
name
elif
isinstance
(
index
,
ExprNodes
.
ConstNode
):
# FIXME:
return
None
else
:
return
None
return
(
base
.
name
,
index_val
)
class
OptimizeBuiltinCalls
(
Visitor
.
VisitorTransform
):
class
OptimizeBuiltinCalls
(
Visitor
.
VisitorTransform
):
"""Optimize some common methods calls and instantiation patterns
"""Optimize some common methods calls and instantiation patterns
...
...
Cython/Compiler/ParseTreeTransforms.py
View file @
3b167e95
...
@@ -957,6 +957,7 @@ class TransformBuiltinMethods(EnvTransform):
...
@@ -957,6 +957,7 @@ class TransformBuiltinMethods(EnvTransform):
return
node
return
node
def
visit_AttributeNode
(
self
,
node
):
def
visit_AttributeNode
(
self
,
node
):
self
.
visitchildren
(
node
)
return
self
.
visit_cython_attribute
(
node
)
return
self
.
visit_cython_attribute
(
node
)
def
visit_NameNode
(
self
,
node
):
def
visit_NameNode
(
self
,
node
):
...
@@ -978,8 +979,15 @@ class TransformBuiltinMethods(EnvTransform):
...
@@ -978,8 +979,15 @@ class TransformBuiltinMethods(EnvTransform):
# locals builtin
# locals builtin
if
isinstance
(
node
.
function
,
ExprNodes
.
NameNode
):
if
isinstance
(
node
.
function
,
ExprNodes
.
NameNode
):
if
node
.
function
.
name
==
'locals'
:
if
node
.
function
.
name
==
'locals'
:
pos
=
node
.
pos
lenv
=
self
.
env_stack
[
-
1
]
lenv
=
self
.
env_stack
[
-
1
]
entry
=
lenv
.
lookup_here
(
'locals'
)
if
entry
:
# not the builtin 'locals'
return
node
if
len
(
node
.
args
)
>
0
:
error
(
self
.
pos
,
"Builtin 'locals()' called with wrong number of args, expected 0, got %d"
%
len
(
node
.
args
))
return
node
pos
=
node
.
pos
items
=
[
ExprNodes
.
DictItemNode
(
pos
,
items
=
[
ExprNodes
.
DictItemNode
(
pos
,
key
=
ExprNodes
.
StringNode
(
pos
,
value
=
var
),
key
=
ExprNodes
.
StringNode
(
pos
,
value
=
var
),
value
=
ExprNodes
.
NameNode
(
pos
,
name
=
var
))
for
var
in
lenv
.
entries
]
value
=
ExprNodes
.
NameNode
(
pos
,
name
=
var
))
for
var
in
lenv
.
entries
]
...
...
Tools/site_scons/site_tools/cython.py
0 → 100644
View file @
3b167e95
"""
Tool to run Cython files (.pyx) into .c and .cpp.
TODO:
- Add support for dynamically selecting in-process Cython
through CYTHONINPROCESS variable.
- Have a CYTHONCPP option which turns on C++ in flags and
changes output extension at the same time
VARIABLES:
- CYTHON - The path to the "cython" command line tool.
- CYTHONFLAGS - Flags to pass to the "cython" command line tool.
AUTHORS:
- David Cournapeau
- Dag Sverre Seljebotn
"""
import
SCons
from
SCons.Builder
import
Builder
from
SCons.Action
import
Action
#def cython_action(target, source, env):
# print target, source, env
# from Cython.Compiler.Main import compile as cython_compile
# res = cython_compile(str(source[0]))
cythonAction
=
Action
(
"$CYTHONCOM"
)
def
create_builder
(
env
):
try
:
cython
=
env
[
'BUILDERS'
][
'Cython'
]
except
KeyError
:
cython
=
SCons
.
Builder
.
Builder
(
action
=
cythonAction
,
emitter
=
{},
suffix
=
cython_suffix_emitter
,
single_source
=
1
)
env
[
'BUILDERS'
][
'Cython'
]
=
cython
return
cython
def
cython_suffix_emitter
(
env
,
source
):
print
'emitter called'
return
"$CYTHONCFILESUFFIX"
def
generate
(
env
):
env
[
"CYTHON"
]
=
"cython"
env
[
"CYTHONCOM"
]
=
"$CYTHON $CYTHONFLAGS -o $TARGET $SOURCE"
env
[
"CYTHONCFILESUFFIX"
]
=
".c"
c_file
,
cxx_file
=
SCons
.
Tool
.
createCFileBuilders
(
env
)
c_file
.
suffix
[
'.pyx'
]
=
cython_suffix_emitter
c_file
.
add_action
(
'.pyx'
,
cythonAction
)
c_file
.
suffix
[
'.py'
]
=
cython_suffix_emitter
c_file
.
add_action
(
'.py'
,
cythonAction
)
create_builder
(
env
)
def
exists
(
env
):
try
:
# import Cython
return
True
except
ImportError
:
return
False
Tools/site_scons/site_tools/pyext.py
0 → 100644
View file @
3b167e95
"""SCons.Tool.pyext
Tool-specific initialization for python extensions builder.
AUTHORS:
- David Cournapeau
- Dag Sverre Seljebotn
"""
#
# __COPYRIGHT__
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
__revision__
=
"__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import
sys
import
SCons
from
SCons.Tool
import
SourceFileScanner
,
ProgramScanner
# Create common python builders
def
createPythonObjectBuilder
(
env
):
"""This is a utility function that creates the PythonObject Builder in an
Environment if it is not there already.
If it is already there, we return the existing one.
"""
try
:
pyobj
=
env
[
'BUILDERS'
][
'PythonObject'
]
except
KeyError
:
pyobj
=
SCons
.
Builder
.
Builder
(
action
=
{},
emitter
=
{},
prefix
=
'$PYEXTOBJPREFIX'
,
suffix
=
'$PYEXTOBJSUFFIX'
,
src_builder
=
[
'CFile'
,
'CXXFile'
],
source_scanner
=
SourceFileScanner
,
single_source
=
1
)
env
[
'BUILDERS'
][
'PythonObject'
]
=
pyobj
return
pyobj
def
createPythonExtensionBuilder
(
env
):
"""This is a utility function that creates the PythonExtension Builder in
an Environment if it is not there already.
If it is already there, we return the existing one.
"""
try
:
pyext
=
env
[
'BUILDERS'
][
'PythonExtension'
]
except
KeyError
:
import
SCons.Action
import
SCons.Defaults
action
=
SCons
.
Action
.
Action
(
"$PYEXTLINKCOM"
,
"$PYEXTLINKCOMSTR"
)
action_list
=
[
SCons
.
Defaults
.
SharedCheck
,
action
]
pyext
=
SCons
.
Builder
.
Builder
(
action
=
action_list
,
emitter
=
"$SHLIBEMITTER"
,
prefix
=
'$PYEXTPREFIX'
,
suffix
=
'$PYEXTSUFFIX'
,
target_scanner
=
ProgramScanner
,
src_suffix
=
'$PYEXTOBJSUFFIX'
,
src_builder
=
'PythonObject'
)
env
[
'BUILDERS'
][
'PythonExtension'
]
=
pyext
return
pyext
def
pyext_coms
(
platform
):
"""Return PYEXTCCCOM, PYEXTCXXCOM and PYEXTLINKCOM for the given
platform."""
if
platform
==
'win32'
:
pyext_cccom
=
"$PYEXTCC /Fo$TARGET /c $PYEXTCCSHARED "
\
"$PYEXTCFLAGS $PYEXTCCFLAGS $_CCCOMCOM "
\
"$_PYEXTCPPINCFLAGS $SOURCES"
pyext_cxxcom
=
"$PYEXTCXX /Fo$TARGET /c $PYEXTCSHARED "
\
"$PYEXTCXXFLAGS $PYEXTCCFLAGS $_CCCOMCOM "
\
"$_PYEXTCPPINCFLAGS $SOURCES"
pyext_linkcom
=
'${TEMPFILE("$PYEXTLINK $PYEXTLINKFLAGS '
\
'/OUT:$TARGET.windows $( $_LIBDIRFLAGS $) '
\
'$_LIBFLAGS $_PYEXTRUNTIME $SOURCES.windows")}'
else
:
pyext_cccom
=
"$PYEXTCC -o $TARGET -c $PYEXTCCSHARED "
\
"$PYEXTCFLAGS $PYEXTCCFLAGS $_CCCOMCOM "
\
"$_PYEXTCPPINCFLAGS $SOURCES"
pyext_cxxcom
=
"$PYEXTCXX -o $TARGET -c $PYEXTCSHARED "
\
"$PYEXTCXXFLAGS $PYEXTCCFLAGS $_CCCOMCOM "
\
"$_PYEXTCPPINCFLAGS $SOURCES"
pyext_linkcom
=
"$PYEXTLINK -o $TARGET $PYEXTLINKFLAGS "
\
"$SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_PYEXTRUNTIME"
if
platform
==
'darwin'
:
pyext_linkcom
+=
' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
return
pyext_cccom
,
pyext_cxxcom
,
pyext_linkcom
def
set_basic_vars
(
env
):
# Set construction variables which are independant on whether we are using
# distutils or not.
env
[
'PYEXTCPPPATH'
]
=
SCons
.
Util
.
CLVar
(
'$PYEXTINCPATH'
)
env
[
'_PYEXTCPPINCFLAGS'
]
=
'$( ${_concat(INCPREFIX, PYEXTCPPPATH, '
\
'INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
env
[
'PYEXTOBJSUFFIX'
]
=
'$SHOBJSUFFIX'
env
[
'PYEXTOBJPREFIX'
]
=
'$SHOBJPREFIX'
env
[
'PYEXTRUNTIME'
]
=
SCons
.
Util
.
CLVar
(
""
)
# XXX: this should be handled with different flags
env
[
'_PYEXTRUNTIME'
]
=
'$( ${_concat(LIBLINKPREFIX, PYEXTRUNTIME, '
\
'LIBLINKSUFFIX, __env__)} $)'
# XXX: This won't work in all cases (using mingw, for example). To make
# this work, we need to know whether PYEXTCC accepts /c and /Fo or -c -o.
# This is difficult with the current way tools work in scons.
pycc
,
pycxx
,
pylink
=
pyext_coms
(
sys
.
platform
)
env
[
'PYEXTLINKFLAGSEND'
]
=
SCons
.
Util
.
CLVar
(
'$LINKFLAGSEND'
)
env
[
'PYEXTCCCOM'
]
=
pycc
env
[
'PYEXTCXXCOM'
]
=
pycxx
env
[
'PYEXTLINKCOM'
]
=
pylink
def
_set_configuration_nodistutils
(
env
):
# Set env variables to sensible values when not using distutils
def_cfg
=
{
'PYEXTCC'
:
'$SHCC'
,
'PYEXTCFLAGS'
:
'$SHCFLAGS'
,
'PYEXTCCFLAGS'
:
'$SHCCFLAGS'
,
'PYEXTCXX'
:
'$SHCXX'
,
'PYEXTCXXFLAGS'
:
'$SHCXXFLAGS'
,
'PYEXTLINK'
:
'$LDMODULE'
,
'PYEXTSUFFIX'
:
'$LDMODULESUFFIX'
,
'PYEXTPREFIX'
:
''
}
if
sys
.
platform
==
'darwin'
:
def_cfg
[
'PYEXTSUFFIX'
]
=
'.so'
for
k
,
v
in
def_cfg
.
items
():
ifnotset
(
env
,
k
,
v
)
ifnotset
(
env
,
'PYEXT_ALLOW_UNDEFINED'
,
SCons
.
Util
.
CLVar
(
'$ALLOW_UNDEFINED'
))
ifnotset
(
env
,
'PYEXTLINKFLAGS'
,
SCons
.
Util
.
CLVar
(
'$LDMODULEFLAGS'
))
env
.
AppendUnique
(
PYEXTLINKFLAGS
=
env
[
'PYEXT_ALLOW_UNDEFINED'
])
def
ifnotset
(
env
,
name
,
value
):
if
not
env
.
has_key
(
name
):
env
[
name
]
=
value
def
set_configuration
(
env
,
use_distutils
):
"""Set construction variables which are platform dependants.
If use_distutils == True, use distutils configuration. Otherwise, use
'sensible' default.
Any variable already defined is untouched."""
# We define commands as strings so that we can either execute them using
# eval (same python for scons and distutils) or by executing them through
# the shell.
dist_cfg
=
{
'PYEXTCC'
:
"sysconfig.get_config_var('CC')"
,
'PYEXTCFLAGS'
:
"sysconfig.get_config_var('CFLAGS')"
,
'PYEXTCCSHARED'
:
"sysconfig.get_config_var('CCSHARED')"
,
'PYEXTLINKFLAGS'
:
"sysconfig.get_config_var('LDFLAGS')"
,
'PYEXTLINK'
:
"sysconfig.get_config_var('LDSHARED')"
,
'PYEXTINCPATH'
:
"sysconfig.get_python_inc()"
,
'PYEXTSUFFIX'
:
"sysconfig.get_config_var('SO')"
}
from
distutils
import
sysconfig
# We set the python path even when not using distutils, because we rarely
# want to change this, even if not using distutils
ifnotset
(
env
,
'PYEXTINCPATH'
,
sysconfig
.
get_python_inc
())
if
use_distutils
:
for
k
,
v
in
dist_cfg
.
items
():
ifnotset
(
env
,
k
,
eval
(
v
))
else
:
_set_configuration_nodistutils
(
env
)
def
generate
(
env
):
"""Add Builders and construction variables for python extensions to an
Environment."""
if
not
env
.
has_key
(
'PYEXT_USE_DISTUTILS'
):
env
[
'PYEXT_USE_DISTUTILS'
]
=
False
# This sets all constructions variables used for pyext builders.
set_basic_vars
(
env
)
set_configuration
(
env
,
env
[
'PYEXT_USE_DISTUTILS'
])
# Create the PythonObject builder
pyobj
=
createPythonObjectBuilder
(
env
)
action
=
SCons
.
Action
.
Action
(
"$PYEXTCCCOM"
,
"$PYEXTCCCOMSTR"
)
pyobj
.
add_emitter
(
'.c'
,
SCons
.
Defaults
.
SharedObjectEmitter
)
pyobj
.
add_action
(
'.c'
,
action
)
action
=
SCons
.
Action
.
Action
(
"$PYEXTCXXCOM"
,
"$PYEXTCXXCOMSTR"
)
pyobj
.
add_emitter
(
'$CXXFILESUFFIX'
,
SCons
.
Defaults
.
SharedObjectEmitter
)
pyobj
.
add_action
(
'$CXXFILESUFFIX'
,
action
)
# Create the PythonExtension builder
createPythonExtensionBuilder
(
env
)
def
exists
(
env
):
try
:
# This is not quite right: if someone defines all variables by himself,
# it would work without distutils
from
distutils
import
sysconfig
return
True
except
ImportError
:
return
False
tests/run/locals.pyx
View file @
3b167e95
__doc__
=
u"""
__doc__
=
u"""
>>> sorted( get_locals(1,2,3, k=5) .items())
>>> sorted( get_locals(1,2,3, k=5) .items())
[('args', (2, 3)), ('kwds', {'k': 5}), ('x', 1), ('y', 'hi'), ('z', 5)]
[('args', (2, 3)), ('kwds', {'k': 5}), ('x', 1), ('y', 'hi'), ('z', 5)]
"""
import
sys
>>> in_locals('z')
IS_PY3
=
sys
.
version_info
[
0
]
>=
3
True
>>> in_locals('args')
True
>>> in_locals('X')
False
"""
def
get_locals
(
x
,
*
args
,
**
kwds
):
def
get_locals
(
x
,
*
args
,
**
kwds
):
cdef
int
z
=
5
cdef
int
z
=
5
if
IS_PY3
:
y
=
"hi"
y
=
u"hi"
else
:
y
=
"hi"
return
locals
()
return
locals
()
def
in_locals
(
x
,
*
args
,
**
kwds
):
cdef
int
z
=
5
y
=
"hi"
return
x
in
locals
()
def
sorted
(
it
):
def
sorted
(
it
):
l
=
list
(
it
)
l
=
list
(
it
)
l
.
sort
()
l
.
sort
()
...
...
tests/run/locals_expressions_T430.pyx
0 → 100644
View file @
3b167e95
__doc__
=
u"""
>>> sorted( get_locals(1,2,3, k=5) .items())
[('args', (2, 3)), ('kwds', {'k': 5}), ('x', 1), ('y', 'hi'), ('z', 5)]
>>> sorted(get_locals_items(1,2,3, k=5))
[('args', (2, 3)), ('kwds', {'k': 5}), ('x', 1), ('y', 'hi'), ('z', 5)]
>>> sorted(get_locals_items_listcomp(1,2,3, k=5))
[('args', (2, 3)), ('kwds', {'k': 5}), ('x', 1), ('y', 'hi'), ('z', 5)]
"""
def
get_locals
(
x
,
*
args
,
**
kwds
):
cdef
int
z
=
5
y
=
"hi"
return
locals
()
def
get_locals_items
(
x
,
*
args
,
**
kwds
):
cdef
int
z
=
5
y
=
"hi"
return
locals
().
items
()
def
get_locals_items_listcomp
(
x
,
*
args
,
**
kwds
):
cdef
int
z
=
5
y
=
"hi"
return
[
item
for
item
in
locals
().
items
()
]
def
sorted
(
it
):
l
=
list
(
it
)
l
.
sort
()
return
l
tests/run/locals_rebind_T429.pyx
0 → 100644
View file @
3b167e95
__doc__
=
u"""
>>> sorted( get_locals(1,2,3, k=5) .items())
[('args', (2, 3)), ('kwds', {'k': 5}), ('x', 1), ('y', 'hi'), ('z', 5)]
>>> get_locals_rebound(1,2,3)
'REBOUND'
"""
def
get_locals
(
x
,
*
args
,
**
kwds
):
cdef
int
z
=
5
y
=
"hi"
return
locals
()
def
get_locals_rebound
(
x
,
*
args
,
**
kwds
):
cdef
int
z
=
5
locals
=
_locals
y
=
"hi"
return
locals
()
def
_locals
():
return
"REBOUND"
def
sorted
(
it
):
l
=
list
(
it
)
l
.
sort
()
return
l
tests/run/parallel_swap_assign_T425.pyx
View file @
3b167e95
__doc__
=
u"""
>>> swap(1,2)
(2, 1)
"""
cimport
cython
@
cython
.
test_assert_path_exists
(
"//ParallelAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode/NameNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=False]/NameNode"
,
)
@
cython
.
test_fail_if_path_exists
(
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=True]"
,
)
def
swap
(
a
,
b
):
def
swap
(
a
,
b
):
"""
>>> swap(1,2)
(2, 1)
"""
a
,
b
=
b
,
a
a
,
b
=
b
,
a
return
a
,
b
return
a
,
b
@
cython
.
test_assert_path_exists
(
"//ParallelAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode/NameNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=False]/NameNode"
,
)
@
cython
.
test_fail_if_path_exists
(
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=True]"
,
)
def
swap5
(
a
,
b
,
c
,
d
,
e
):
"""
>>> swap5(1,2,3,4,5)
(5, 4, 3, 2, 1)
"""
a
,
b
,
c
,
d
,
e
=
e
,
d
,
c
,
b
,
a
return
a
,
b
,
c
,
d
,
e
@
cython
.
test_assert_path_exists
(
"//ParallelAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode/NameNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=False]/NameNode"
,
)
@
cython
.
test_fail_if_path_exists
(
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=True]"
,
)
cdef
bint
c_swap_cmp5
(
a
,
b
,
c
,
d
,
e
):
a
,
b
,
c
,
d
,
e
=
e
,
d
,
c
,
b
,
a
return
a
>
b
>
c
>
d
>
e
def
swap_cmp5
(
a
,
b
,
c
,
d
,
e
):
"""
>>> swap_cmp5(1,2,3,4,5)
True
"""
return
c_swap_cmp5
(
a
,
b
,
c
,
d
,
e
)
@
cython
.
test_assert_path_exists
(
"//ParallelAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode/NameNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=True]/NameNode"
,
)
@
cython
.
test_fail_if_path_exists
(
"//ParallelAssignmentNode/SingleAssignmentNode//CoerceToTempNode[@use_managed_ref=False]"
,
)
def
swap_py
(
a
,
b
):
a
,
a
=
b
,
a
return
a
,
b
@
cython
.
test_assert_path_exists
(
# "//ParallelAssignmentNode",
# "//ParallelAssignmentNode/SingleAssignmentNode",
# "//ParallelAssignmentNode/SingleAssignmentNode//IndexNode",
# "//ParallelAssignmentNode/SingleAssignmentNode//IndexNode[@use_managed_ref=False]",
)
@
cython
.
test_fail_if_path_exists
(
# "//ParallelAssignmentNode/SingleAssignmentNode//IndexNode[@use_managed_ref=True]",
)
def
swap_list_items
(
list
a
,
int
i
,
int
j
):
"""
>>> l = [1,2,3,4]
>>> swap_list_items(l, 1, 2)
>>> l
[1, 3, 2, 4]
>>> swap_list_items(l, 3, 0)
>>> l
[4, 3, 2, 1]
>>> swap_list_items(l, 0, 5)
Traceback (most recent call last):
IndexError: list index out of range
>>> l
[4, 3, 2, 1]
"""
a
[
i
],
a
[
j
]
=
a
[
j
],
a
[
i
]
@
cython
.
test_assert_path_exists
(
"//ParallelAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//IndexNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//IndexNode[@use_managed_ref=True]"
,
)
@
cython
.
test_fail_if_path_exists
(
"//ParallelAssignmentNode/SingleAssignmentNode//IndexNode[@use_managed_ref=False]"
,
)
def
swap_list_items_py1
(
list
a
,
int
i
,
int
j
):
a
[
i
],
a
[
j
]
=
a
[
j
+
1
],
a
[
i
]
@
cython
.
test_assert_path_exists
(
"//ParallelAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//IndexNode"
,
"//ParallelAssignmentNode/SingleAssignmentNode//IndexNode[@use_managed_ref=True]"
,
)
@
cython
.
test_fail_if_path_exists
(
"//ParallelAssignmentNode/SingleAssignmentNode//IndexNode[@use_managed_ref=False]"
,
)
def
swap_list_items_py2
(
list
a
,
int
i
,
int
j
):
a
[
i
],
a
[
j
]
=
a
[
i
],
a
[
i
]
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