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
eabb40f2
Commit
eabb40f2
authored
May 27, 2009
by
Kurt Smith
Committed by
Mark Florisson
Sep 30, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
partial fix of #299. Refactored buffer auxiliary vars.
parent
e97c6e59
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
121 additions
and
76 deletions
+121
-76
Cython/Compiler/Buffer.py
Cython/Compiler/Buffer.py
+101
-60
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+1
-3
Cython/Compiler/Naming.py
Cython/Compiler/Naming.py
+2
-4
Cython/Compiler/Nodes.py
Cython/Compiler/Nodes.py
+2
-3
Cython/Compiler/Options.py
Cython/Compiler/Options.py
+3
-0
Cython/Compiler/PyrexTypes.py
Cython/Compiler/PyrexTypes.py
+9
-0
Cython/Compiler/Symtab.py
Cython/Compiler/Symtab.py
+3
-6
No files found.
Cython/Compiler/Buffer.py
View file @
eabb40f2
...
@@ -5,6 +5,7 @@ from ExprNodes import *
...
@@ -5,6 +5,7 @@ from ExprNodes import *
from
StringEncoding
import
EncodedString
from
StringEncoding
import
EncodedString
from
Errors
import
CompileError
from
Errors
import
CompileError
from
Code
import
UtilityCode
from
Code
import
UtilityCode
import
Cython.Compiler.Options
import
Interpreter
import
Interpreter
import
PyrexTypes
import
PyrexTypes
import
Naming
import
Naming
...
@@ -32,6 +33,7 @@ class IntroduceBufferAuxiliaryVars(CythonTransform):
...
@@ -32,6 +33,7 @@ class IntroduceBufferAuxiliaryVars(CythonTransform):
self
.
max_ndim
=
0
self
.
max_ndim
=
0
result
=
super
(
IntroduceBufferAuxiliaryVars
,
self
).
__call__
(
node
)
result
=
super
(
IntroduceBufferAuxiliaryVars
,
self
).
__call__
(
node
)
if
self
.
buffers_exists
:
if
self
.
buffers_exists
:
use_bufstruct_declare_code
(
node
.
scope
)
use_py2_buffer_functions
(
node
.
scope
)
use_py2_buffer_functions
(
node
.
scope
)
use_empty_bufstruct_code
(
node
.
scope
,
self
.
max_ndim
)
use_empty_bufstruct_code
(
node
.
scope
,
self
.
max_ndim
)
return
result
return
result
...
@@ -60,36 +62,27 @@ class IntroduceBufferAuxiliaryVars(CythonTransform):
...
@@ -60,36 +62,27 @@ class IntroduceBufferAuxiliaryVars(CythonTransform):
name
=
entry
.
name
name
=
entry
.
name
buftype
=
entry
.
type
buftype
=
entry
.
type
if
buftype
.
ndim
>
Options
.
buffer_max_dims
:
raise
CompileError
(
node
.
pos
,
"Buffer ndims exceeds Options.buffer_max_dims = %d"
%
Options
.
buffer_max_dims
)
if
buftype
.
ndim
>
self
.
max_ndim
:
if
buftype
.
ndim
>
self
.
max_ndim
:
self
.
max_ndim
=
buftype
.
ndim
self
.
max_ndim
=
buftype
.
ndim
# Declare auxiliary vars
# Declare auxiliary vars
cname
=
scope
.
mangle
(
Naming
.
bufstruct_prefix
,
name
)
def
decvar
(
type
,
prefix
):
bufinfo
=
scope
.
declare_var
(
name
=
None
,
cname
=
cname
,
cname
=
scope
.
mangle
(
prefix
,
name
)
type
=
PyrexTypes
.
c_py_buffer_type
,
pos
=
node
.
pos
)
aux_var
=
scope
.
declare_var
(
name
=
"$%s"
%
cname
,
cname
=
cname
,
if
entry
.
is_arg
:
type
=
type
,
pos
=
node
.
pos
)
bufinfo
.
used
=
True
# otherwise, NameNode will mark whether it is used
def
var
(
prefix
,
idx
,
initval
):
cname
=
scope
.
mangle
(
prefix
,
"%d_%s"
%
(
idx
,
name
))
result
=
scope
.
declare_var
(
None
,
PyrexTypes
.
c_py_ssize_t_type
,
node
.
pos
,
cname
=
cname
,
is_cdef
=
True
)
result
.
init
=
initval
if
entry
.
is_arg
:
if
entry
.
is_arg
:
result
.
used
=
True
aux_var
.
used
=
True
# otherwise, NameNode will mark whether it is used
return
result
return
aux_var
stridevars
=
[
var
(
Naming
.
bufstride_prefix
,
i
,
"0"
)
for
i
in
range
(
entry
.
type
.
ndim
)]
auxvars
=
((
PyrexTypes
.
c_pyx_buffer_nd_type
,
Naming
.
pybuffernd_prefix
),
shapevars
=
[
var
(
Naming
.
bufshape_prefix
,
i
,
"0"
)
for
i
in
range
(
entry
.
type
.
ndim
)]
(
PyrexTypes
.
c_pyx_buffer_type
,
Naming
.
pybufferstruct_prefix
))
mode
=
entry
.
type
.
mode
pybuffernd
,
rcbuffer
=
[
decvar
(
type
,
prefix
)
for
(
type
,
prefix
)
in
auxvars
]
if
mode
==
'full'
:
suboffsetvars
=
[
var
(
Naming
.
bufsuboffset_prefix
,
i
,
"-1"
)
for
i
in
range
(
entry
.
type
.
ndim
)]
else
:
suboffsetvars
=
None
entry
.
buffer_aux
=
Symtab
.
BufferAux
(
bufinfo
,
stridevars
,
shapevars
,
suboffsetvars
)
entry
.
buffer_aux
=
Symtab
.
BufferAux
(
pybuffernd
,
rcbuffer
)
scope
.
buffer_entries
=
bufvars
scope
.
buffer_entries
=
bufvars
self
.
scope
=
scope
self
.
scope
=
scope
...
@@ -188,6 +181,15 @@ def analyse_buffer_options(globalpos, env, posargs, dictargs, defaults=None, nee
...
@@ -188,6 +181,15 @@ def analyse_buffer_options(globalpos, env, posargs, dictargs, defaults=None, nee
# Code generation
# Code generation
#
#
def
get_buf_suboffsetvars
(
entry
):
return
[(
"%s.diminfo[%d].suboffsets"
%
\
(
entry
.
buffer_aux
.
buflocal_nd_var
.
cname
,
i
))
for
i
in
range
(
entry
.
type
.
ndim
)]
def
get_buf_stridevars
(
entry
):
return
[(
"%s.diminfo[%d].strides"
%
\
(
entry
.
buffer_aux
.
buflocal_nd_var
.
cname
,
i
))
for
i
in
range
(
entry
.
type
.
ndim
)]
def
get_buf_shapevars
(
entry
):
return
[(
"%s.diminfo[%d].shape"
%
\
(
entry
.
buffer_aux
.
buflocal_nd_var
.
cname
,
i
))
for
i
in
range
(
entry
.
type
.
ndim
)]
def
get_flags
(
buffer_aux
,
buffer_type
):
def
get_flags
(
buffer_aux
,
buffer_type
):
flags
=
'PyBUF_FORMAT'
flags
=
'PyBUF_FORMAT'
...
@@ -207,26 +209,39 @@ def get_flags(buffer_aux, buffer_type):
...
@@ -207,26 +209,39 @@ def get_flags(buffer_aux, buffer_type):
def
used_buffer_aux_vars
(
entry
):
def
used_buffer_aux_vars
(
entry
):
buffer_aux
=
entry
.
buffer_aux
buffer_aux
=
entry
.
buffer_aux
buffer_aux
.
buffer_info_var
.
used
=
True
buffer_aux
.
buflocal_nd_var
.
used
=
True
for
s
in
buffer_aux
.
shapevars
:
s
.
used
=
True
buffer_aux
.
rcbuf_var
.
used
=
True
for
s
in
buffer_aux
.
stridevars
:
s
.
used
=
True
if
buffer_aux
.
suboffsetvars
:
for
s
in
buffer_aux
.
suboffsetvars
:
s
.
used
=
True
def
put_unpack_buffer_aux_into_scope
(
buf
fer_aux
,
mode
,
code
):
def
put_unpack_buffer_aux_into_scope
(
buf
_entry
,
code
):
# Generate code to copy the needed struct info into local
# Generate code to copy the needed struct info into local
# variables.
# variables.
bufstruct
=
buffer_aux
.
buffer_info_var
.
cname
buffer_aux
,
mode
=
buf_entry
.
buffer_aux
,
buf_entry
.
type
.
mode
pybuffernd_struct
=
buffer_aux
.
buflocal_nd_var
.
cname
varspec
=
[(
"strides"
,
buffer_aux
.
stridevars
),
fldnames
=
[
'strides'
,
'shape'
]
(
"shape"
,
buffer_aux
.
shapevars
)]
if
mode
==
'full'
:
if
mode
==
'full'
:
varspec
.
append
((
"suboffsets"
,
buffer_aux
.
suboffsetvars
))
fldnames
.
append
(
'suboffsets'
)
ln
=
[]
for
i
in
range
(
buf_entry
.
type
.
ndim
):
for
fldname
in
fldnames
:
ln
.
append
(
"%s.diminfo[%d].%s = %s.rcbuffer->pybuffer.%s[%d];"
%
\
(
pybuffernd_struct
,
i
,
fldname
,
pybuffernd_struct
,
fldname
,
i
))
code
.
putln
(
' '
.
join
(
ln
))
for
field
,
vars
in
varspec
:
def
put_init_vars
(
entry
,
code
):
code
.
putln
(
" "
.
join
([
"%s = %s.%s[%d];"
%
bufaux
=
entry
.
buffer_aux
(
s
.
cname
,
bufstruct
,
field
,
idx
)
pybuffernd_struct
=
bufaux
.
buflocal_nd_var
.
cname
for
idx
,
s
in
enumerate
(
vars
)]))
pybuffer_struct
=
bufaux
.
rcbuf_var
.
cname
# init pybuffer_struct
code
.
putln
(
"%s.pybuffer.buf = NULL;"
%
pybuffer_struct
)
code
.
putln
(
"%s.refcount = 0;"
%
pybuffer_struct
)
# init the buffer object
# code.put_init_var_to_py_none(entry)
# init the pybuffernd_struct
code
.
putln
(
"%s.data = NULL;"
%
pybuffernd_struct
)
code
.
putln
(
"%s.rcbuffer = &%s;"
%
(
pybuffernd_struct
,
pybuffer_struct
))
def
put_acquire_arg_buffer
(
entry
,
code
,
pos
):
def
put_acquire_arg_buffer
(
entry
,
code
,
pos
):
code
.
globalstate
.
use_utility_code
(
acquire_utility_code
)
code
.
globalstate
.
use_utility_code
(
acquire_utility_code
)
...
@@ -240,25 +255,25 @@ def put_acquire_arg_buffer(entry, code, pos):
...
@@ -240,25 +255,25 @@ def put_acquire_arg_buffer(entry, code, pos):
code
.
putln
(
"}"
)
code
.
putln
(
"}"
)
# An exception raised in arg parsing cannot be catched, so no
# An exception raised in arg parsing cannot be catched, so no
# need to care about the buffer then.
# need to care about the buffer then.
put_unpack_buffer_aux_into_scope
(
buffer_aux
,
entry
.
type
.
mode
,
code
)
put_unpack_buffer_aux_into_scope
(
entry
,
code
)
def
put_release_buffer_code
(
code
,
entry
):
def
put_release_buffer_code
(
code
,
entry
):
code
.
globalstate
.
use_utility_code
(
acquire_utility_code
)
code
.
globalstate
.
use_utility_code
(
acquire_utility_code
)
code
.
putln
(
"__Pyx_SafeReleaseBuffer(&%s
);"
%
entry
.
buffer_aux
.
buffer_info
_var
.
cname
)
code
.
putln
(
"__Pyx_SafeReleaseBuffer(&%s
.rcbuffer->pybuffer);"
%
entry
.
buffer_aux
.
buflocal_nd
_var
.
cname
)
def
get_getbuffer_call
(
code
,
obj_cname
,
buffer_aux
,
buffer_type
):
def
get_getbuffer_call
(
code
,
obj_cname
,
buffer_aux
,
buffer_type
):
ndim
=
buffer_type
.
ndim
ndim
=
buffer_type
.
ndim
cast
=
int
(
buffer_type
.
cast
)
cast
=
int
(
buffer_type
.
cast
)
flags
=
get_flags
(
buffer_aux
,
buffer_type
)
flags
=
get_flags
(
buffer_aux
,
buffer_type
)
bufstruct
=
buffer_aux
.
buffer_info
_var
.
cname
pybuffernd_struct
=
buffer_aux
.
buflocal_nd
_var
.
cname
dtype_typeinfo
=
get_type_information_cname
(
code
,
buffer_type
.
dtype
)
dtype_typeinfo
=
get_type_information_cname
(
code
,
buffer_type
.
dtype
)
return
(
"__Pyx_GetBufferAndValidate(&%(
bufstruct)s
, "
return
(
"__Pyx_GetBufferAndValidate(&%(
pybuffernd_struct)s.rcbuffer->pybuffer
, "
"(PyObject*)%(obj_cname)s, &%(dtype_typeinfo)s, %(flags)s, %(ndim)d, "
"(PyObject*)%(obj_cname)s, &%(dtype_typeinfo)s, %(flags)s, %(ndim)d, "
"%(cast)d, __pyx_stack)"
%
locals
())
"%(cast)d, __pyx_stack)"
%
locals
())
def
put_assign_to_buffer
(
lhs_cname
,
rhs_cname
,
buf
fer_aux
,
buffer_type
,
def
put_assign_to_buffer
(
lhs_cname
,
rhs_cname
,
buf
_entry
,
is_initialized
,
pos
,
code
):
is_initialized
,
pos
,
code
):
"""
"""
Generate code for reassigning a buffer variables. This only deals with getting
Generate code for reassigning a buffer variables. This only deals with getting
...
@@ -274,8 +289,9 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
...
@@ -274,8 +289,9 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
(which may or may not succeed).
(which may or may not succeed).
"""
"""
buffer_aux
,
buffer_type
=
buf_entry
.
buffer_aux
,
buf_entry
.
type
code
.
globalstate
.
use_utility_code
(
acquire_utility_code
)
code
.
globalstate
.
use_utility_code
(
acquire_utility_code
)
bufstruct
=
buffer_aux
.
buffer_info
_var
.
cname
pybuffernd_struct
=
buffer_aux
.
buflocal_nd
_var
.
cname
flags
=
get_flags
(
buffer_aux
,
buffer_type
)
flags
=
get_flags
(
buffer_aux
,
buffer_type
)
code
.
putln
(
"{"
)
# Set up necesarry stack for getbuffer
code
.
putln
(
"{"
)
# Set up necesarry stack for getbuffer
...
@@ -285,7 +301,7 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
...
@@ -285,7 +301,7 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
if
is_initialized
:
if
is_initialized
:
# Release any existing buffer
# Release any existing buffer
code
.
putln
(
'__Pyx_SafeReleaseBuffer(&%s
);'
%
buf
struct
)
code
.
putln
(
'__Pyx_SafeReleaseBuffer(&%s
.rcbuffer->pybuffer);'
%
pybuffernd_
struct
)
# Acquire
# Acquire
retcode_cname
=
code
.
funcstate
.
allocate_temp
(
PyrexTypes
.
c_int_type
,
manage_ref
=
False
)
retcode_cname
=
code
.
funcstate
.
allocate_temp
(
PyrexTypes
.
c_int_type
,
manage_ref
=
False
)
code
.
putln
(
"%s = %s;"
%
(
retcode_cname
,
getbuffer
%
rhs_cname
))
code
.
putln
(
"%s = %s;"
%
(
retcode_cname
,
getbuffer
%
rhs_cname
))
...
@@ -308,7 +324,7 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
...
@@ -308,7 +324,7 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
code
.
putln
(
'}'
)
code
.
putln
(
'}'
)
code
.
putln
(
'}'
)
code
.
putln
(
'}'
)
# Unpack indices
# Unpack indices
put_unpack_buffer_aux_into_scope
(
buf
fer_aux
,
buffer_type
.
mode
,
code
)
put_unpack_buffer_aux_into_scope
(
buf
_entry
,
code
)
code
.
putln
(
code
.
error_goto_if_neg
(
retcode_cname
,
pos
))
code
.
putln
(
code
.
error_goto_if_neg
(
retcode_cname
,
pos
))
code
.
funcstate
.
release_temp
(
retcode_cname
)
code
.
funcstate
.
release_temp
(
retcode_cname
)
else
:
else
:
...
@@ -316,14 +332,14 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
...
@@ -316,14 +332,14 @@ def put_assign_to_buffer(lhs_cname, rhs_cname, buffer_aux, buffer_type,
# In this case, auxiliary vars should be set up right in initialization to a zero-buffer,
# In this case, auxiliary vars should be set up right in initialization to a zero-buffer,
# so it suffices to set the buf field to NULL.
# so it suffices to set the buf field to NULL.
code
.
putln
(
'if (%s) {'
%
code
.
unlikely
(
"%s == -1"
%
(
getbuffer
%
rhs_cname
)))
code
.
putln
(
'if (%s) {'
%
code
.
unlikely
(
"%s == -1"
%
(
getbuffer
%
rhs_cname
)))
code
.
putln
(
'%s = %s; __Pyx_INCREF(Py_None); %s.buf = NULL;'
%
code
.
putln
(
'%s = %s; __Pyx_INCREF(Py_None); %s.
rcbuffer->pybuffer.
buf = NULL;'
%
(
lhs_cname
,
(
lhs_cname
,
PyrexTypes
.
typecast
(
buffer_type
,
PyrexTypes
.
py_object_type
,
"Py_None"
),
PyrexTypes
.
typecast
(
buffer_type
,
PyrexTypes
.
py_object_type
,
"Py_None"
),
buf
struct
))
pybuffernd_
struct
))
code
.
putln
(
code
.
error_goto
(
pos
))
code
.
putln
(
code
.
error_goto
(
pos
))
code
.
put
(
'} else {'
)
code
.
put
(
'} else {'
)
# Unpack indices
# Unpack indices
put_unpack_buffer_aux_into_scope
(
buf
fer_aux
,
buffer_type
.
mode
,
code
)
put_unpack_buffer_aux_into_scope
(
buf
_entry
,
code
)
code
.
putln
(
'}'
)
code
.
putln
(
'}'
)
code
.
putln
(
"}"
)
# Release stack
code
.
putln
(
"}"
)
# Release stack
...
@@ -342,7 +358,8 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
...
@@ -342,7 +358,8 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
"""
"""
bufaux
=
entry
.
buffer_aux
bufaux
=
entry
.
buffer_aux
bufstruct
=
bufaux
.
buffer_info_var
.
cname
pybuffernd_struct
=
bufaux
.
buflocal_nd_var
.
cname
# bufstruct = bufaux.buffer_info_var.cname
negative_indices
=
directives
[
'wraparound'
]
and
entry
.
type
.
negative_indices
negative_indices
=
directives
[
'wraparound'
]
and
entry
.
type
.
negative_indices
if
directives
[
'boundscheck'
]:
if
directives
[
'boundscheck'
]:
...
@@ -353,12 +370,12 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
...
@@ -353,12 +370,12 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
tmp_cname
=
code
.
funcstate
.
allocate_temp
(
PyrexTypes
.
c_int_type
,
manage_ref
=
False
)
tmp_cname
=
code
.
funcstate
.
allocate_temp
(
PyrexTypes
.
c_int_type
,
manage_ref
=
False
)
code
.
putln
(
"%s = -1;"
%
tmp_cname
)
code
.
putln
(
"%s = -1;"
%
tmp_cname
)
for
dim
,
(
signed
,
cname
,
shape
)
in
enumerate
(
zip
(
index_signeds
,
index_cnames
,
for
dim
,
(
signed
,
cname
,
shape
)
in
enumerate
(
zip
(
index_signeds
,
index_cnames
,
bufaux
.
shapevars
)):
get_buf_shapevars
(
entry
)
)):
if
signed
!=
0
:
if
signed
!=
0
:
# not unsigned, deal with negative index
# not unsigned, deal with negative index
code
.
putln
(
"if (%s < 0) {"
%
cname
)
code
.
putln
(
"if (%s < 0) {"
%
cname
)
if
negative_indices
:
if
negative_indices
:
code
.
putln
(
"%s += %s;"
%
(
cname
,
shape
.
cname
))
code
.
putln
(
"%s += %s;"
%
(
cname
,
shape
))
code
.
putln
(
"if (%s) %s = %d;"
%
(
code
.
putln
(
"if (%s) %s = %d;"
%
(
code
.
unlikely
(
"%s < 0"
%
cname
),
tmp_cname
,
dim
))
code
.
unlikely
(
"%s < 0"
%
cname
),
tmp_cname
,
dim
))
else
:
else
:
...
@@ -370,7 +387,7 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
...
@@ -370,7 +387,7 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
else
:
else
:
cast
=
"(size_t)"
cast
=
"(size_t)"
code
.
putln
(
"if (%s) %s = %d;"
%
(
code
.
putln
(
"if (%s) %s = %d;"
%
(
code
.
unlikely
(
"%s >= %s%s"
%
(
cname
,
cast
,
shape
.
cname
)),
code
.
unlikely
(
"%s >= %s%s"
%
(
cname
,
cast
,
shape
)),
tmp_cname
,
dim
))
tmp_cname
,
dim
))
code
.
globalstate
.
use_utility_code
(
raise_indexerror_code
)
code
.
globalstate
.
use_utility_code
(
raise_indexerror_code
)
code
.
putln
(
"if (%s) {"
%
code
.
unlikely
(
"%s != -1"
%
tmp_cname
))
code
.
putln
(
"if (%s) {"
%
code
.
unlikely
(
"%s != -1"
%
tmp_cname
))
...
@@ -381,9 +398,9 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
...
@@ -381,9 +398,9 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
elif
negative_indices
:
elif
negative_indices
:
# Only fix negative indices.
# Only fix negative indices.
for
signed
,
cname
,
shape
in
zip
(
index_signeds
,
index_cnames
,
for
signed
,
cname
,
shape
in
zip
(
index_signeds
,
index_cnames
,
bufaux
.
shapevars
):
get_buf_shapevars
(
entry
)
):
if
signed
!=
0
:
if
signed
!=
0
:
code
.
putln
(
"if (%s < 0) %s += %s;"
%
(
cname
,
cname
,
shape
.
cname
))
code
.
putln
(
"if (%s < 0) %s += %s;"
%
(
cname
,
cname
,
shape
))
# Create buffer lookup and return it
# Create buffer lookup and return it
# This is done via utility macros/inline functions, which vary
# This is done via utility macros/inline functions, which vary
...
@@ -392,10 +409,10 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
...
@@ -392,10 +409,10 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
nd
=
entry
.
type
.
ndim
nd
=
entry
.
type
.
ndim
mode
=
entry
.
type
.
mode
mode
=
entry
.
type
.
mode
if
mode
==
'full'
:
if
mode
==
'full'
:
for
i
,
s
,
o
in
zip
(
index_cnames
,
bufaux
.
stridevars
,
bufaux
.
suboffsetvars
):
for
i
,
s
,
o
in
zip
(
index_cnames
,
get_buf_stridevars
(
entry
),
get_buf_suboffsetvars
(
entry
)
):
params
.
append
(
i
)
params
.
append
(
i
)
params
.
append
(
s
.
cname
)
params
.
append
(
s
)
params
.
append
(
o
.
cname
)
params
.
append
(
o
)
funcname
=
"__Pyx_BufPtrFull%dd"
%
nd
funcname
=
"__Pyx_BufPtrFull%dd"
%
nd
funcgen
=
buf_lookup_full_code
funcgen
=
buf_lookup_full_code
else
:
else
:
...
@@ -410,9 +427,9 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
...
@@ -410,9 +427,9 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
funcgen
=
buf_lookup_fortran_code
funcgen
=
buf_lookup_fortran_code
else
:
else
:
assert
False
assert
False
for
i
,
s
in
zip
(
index_cnames
,
bufaux
.
stridevars
):
for
i
,
s
in
zip
(
index_cnames
,
get_buf_stridevars
(
entry
)
):
params
.
append
(
i
)
params
.
append
(
i
)
params
.
append
(
s
.
cname
)
params
.
append
(
s
)
# Make sure the utility code is available
# Make sure the utility code is available
if
funcname
not
in
code
.
globalstate
.
utility_codes
:
if
funcname
not
in
code
.
globalstate
.
utility_codes
:
...
@@ -422,13 +439,16 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
...
@@ -422,13 +439,16 @@ def put_buffer_lookup_code(entry, index_signeds, index_cnames, directives, pos,
funcgen
(
protocode
,
defcode
,
name
=
funcname
,
nd
=
nd
)
funcgen
(
protocode
,
defcode
,
name
=
funcname
,
nd
=
nd
)
ptr_type
=
entry
.
type
.
buffer_ptr_type
ptr_type
=
entry
.
type
.
buffer_ptr_type
ptrcode
=
"%s(%s, %s.buf, %s)"
%
(
funcname
,
ptrcode
=
"%s(%s, %s.
rcbuffer->pybuffer.
buf, %s)"
%
(
funcname
,
ptr_type
.
declaration_code
(
""
),
ptr_type
.
declaration_code
(
""
),
buf
struct
,
pybuffernd_
struct
,
", "
.
join
(
params
))
", "
.
join
(
params
))
return
ptrcode
return
ptrcode
def
use_bufstruct_declare_code
(
env
):
env
.
use_utility_code
(
buffer_struct_declare_code
)
def
use_empty_bufstruct_code
(
env
,
max_ndim
):
def
use_empty_bufstruct_code
(
env
,
max_ndim
):
code
=
dedent
(
"""
code
=
dedent
(
"""
Py_ssize_t __Pyx_zeros[] = {%s};
Py_ssize_t __Pyx_zeros[] = {%s};
...
@@ -660,6 +680,27 @@ def get_type_information_cname(code, dtype, maxdepth=None):
...
@@ -660,6 +680,27 @@ def get_type_information_cname(code, dtype, maxdepth=None):
),
safe
=
True
)
),
safe
=
True
)
return
name
return
name
buffer_struct_declare_code
=
UtilityCode
(
proto
=
"""
/* structs for buffer access */
typedef struct {
Py_ssize_t shape, strides, suboffsets;
} __Pyx_Buf_DimInfo;
typedef struct {
size_t refcount;
Py_buffer pybuffer;
} __Pyx_Buffer;
typedef struct {
__Pyx_Buffer *rcbuffer;
char *data;
__Pyx_Buf_DimInfo diminfo[%d];
} __Pyx_LocalBuf_ND;
"""
%
Options
.
buffer_max_dims
)
# Utility function to set the right exception
# Utility function to set the right exception
# The caller should immediately goto_error
# The caller should immediately goto_error
...
...
Cython/Compiler/ExprNodes.py
View file @
eabb40f2
...
@@ -1699,10 +1699,8 @@ class NameNode(AtomicExprNode):
...
@@ -1699,10 +1699,8 @@ class NameNode(AtomicExprNode):
rhstmp
=
code
.
funcstate
.
allocate_temp
(
self
.
entry
.
type
,
manage_ref
=
False
)
rhstmp
=
code
.
funcstate
.
allocate_temp
(
self
.
entry
.
type
,
manage_ref
=
False
)
code
.
putln
(
'%s = %s;'
%
(
rhstmp
,
rhs
.
result_as
(
self
.
ctype
())))
code
.
putln
(
'%s = %s;'
%
(
rhstmp
,
rhs
.
result_as
(
self
.
ctype
())))
buffer_aux
=
self
.
entry
.
buffer_aux
bufstruct
=
buffer_aux
.
buffer_info_var
.
cname
import
Buffer
import
Buffer
Buffer
.
put_assign_to_buffer
(
self
.
result
(),
rhstmp
,
buffer_aux
,
self
.
entry
.
type
,
Buffer
.
put_assign_to_buffer
(
self
.
result
(),
rhstmp
,
self
.
entry
,
is_initialized
=
not
self
.
lhs_of_first_assignment
,
is_initialized
=
not
self
.
lhs_of_first_assignment
,
pos
=
self
.
pos
,
code
=
code
)
pos
=
self
.
pos
,
code
=
code
)
...
...
Cython/Compiler/Naming.py
View file @
eabb40f2
...
@@ -38,10 +38,8 @@ typeobj_prefix = pyrex_prefix + "type_"
...
@@ -38,10 +38,8 @@ typeobj_prefix = pyrex_prefix + "type_"
var_prefix
=
pyrex_prefix
+
"v_"
var_prefix
=
pyrex_prefix
+
"v_"
varptr_prefix
=
pyrex_prefix
+
"vp_"
varptr_prefix
=
pyrex_prefix
+
"vp_"
wrapperbase_prefix
=
pyrex_prefix
+
"wrapperbase_"
wrapperbase_prefix
=
pyrex_prefix
+
"wrapperbase_"
bufstruct_prefix
=
pyrex_prefix
+
"bstruct_"
pybuffernd_prefix
=
pyrex_prefix
+
"pybuffernd_"
bufstride_prefix
=
pyrex_prefix
+
"bstride_"
pybufferstruct_prefix
=
pyrex_prefix
+
"pybuffer_"
bufshape_prefix
=
pyrex_prefix
+
"bshape_"
bufsuboffset_prefix
=
pyrex_prefix
+
"boffset_"
vtable_prefix
=
pyrex_prefix
+
"vtable_"
vtable_prefix
=
pyrex_prefix
+
"vtable_"
vtabptr_prefix
=
pyrex_prefix
+
"vtabptr_"
vtabptr_prefix
=
pyrex_prefix
+
"vtabptr_"
vtabstruct_prefix
=
pyrex_prefix
+
"vtabstruct_"
vtabstruct_prefix
=
pyrex_prefix
+
"vtabstruct_"
...
...
Cython/Compiler/Nodes.py
View file @
eabb40f2
...
@@ -1405,9 +1405,8 @@ class FuncDefNode(StatNode, BlockNode):
...
@@ -1405,9 +1405,8 @@ class FuncDefNode(StatNode, BlockNode):
code
.
put_var_incref
(
entry
)
code
.
put_var_incref
(
entry
)
# ----- Initialise local buffer auxiliary variables
# ----- Initialise local buffer auxiliary variables
for
entry
in
lenv
.
var_entries
+
lenv
.
arg_entries
:
for
entry
in
lenv
.
var_entries
+
lenv
.
arg_entries
:
if
entry
.
type
.
is_buffer
and
entry
.
buffer_aux
.
buffer_info_var
.
used
:
if
entry
.
type
.
is_buffer
and
entry
.
buffer_aux
.
buflocal_nd_var
.
used
:
code
.
putln
(
"%s.buf = NULL;"
%
Buffer
.
put_init_vars
(
entry
,
code
)
entry
.
buffer_aux
.
buffer_info_var
.
cname
)
# ----- Check and convert arguments
# ----- Check and convert arguments
self
.
generate_argument_type_tests
(
code
)
self
.
generate_argument_type_tests
(
code
)
# ----- Acquire buffer arguments
# ----- Acquire buffer arguments
...
...
Cython/Compiler/Options.py
View file @
eabb40f2
...
@@ -67,6 +67,9 @@ old_style_globals = False
...
@@ -67,6 +67,9 @@ old_style_globals = False
cimport_from_pyx
=
False
cimport_from_pyx
=
False
# max # of dims for buffers -- set to same value as max # of dims for numpy
# arrays.
buffer_max_dims
=
32
# Declare compiler directives
# Declare compiler directives
directive_defaults
=
{
directive_defaults
=
{
...
...
Cython/Compiler/PyrexTypes.py
View file @
eabb40f2
...
@@ -2481,6 +2481,15 @@ c_size_t_ptr_type = CPtrType(c_size_t_type)
...
@@ -2481,6 +2481,15 @@ c_size_t_ptr_type = CPtrType(c_size_t_type)
c_py_buffer_type
=
CStructOrUnionType
(
"Py_buffer"
,
"struct"
,
None
,
1
,
"Py_buffer"
)
c_py_buffer_type
=
CStructOrUnionType
(
"Py_buffer"
,
"struct"
,
None
,
1
,
"Py_buffer"
)
c_py_buffer_ptr_type
=
CPtrType
(
c_py_buffer_type
)
c_py_buffer_ptr_type
=
CPtrType
(
c_py_buffer_type
)
# buffer-related structs
c_buf_diminfo_type
=
CStructOrUnionType
(
"__Pyx_Buf_DimInfo"
,
"struct"
,
None
,
1
,
"__Pyx_Buf_DimInfo"
)
c_pyx_buffer_type
=
CStructOrUnionType
(
"__Pyx_Buffer"
,
"struct"
,
None
,
1
,
"__Pyx_Buffer"
)
c_pyx_buffer_ptr_type
=
CPtrType
(
c_pyx_buffer_type
)
c_pyx_buffer_nd_type
=
CStructOrUnionType
(
"__Pyx_LocalBuf_ND"
,
"struct"
,
None
,
1
,
"__Pyx_LocalBuf_ND"
)
error_type
=
ErrorType
()
error_type
=
ErrorType
()
unspecified_type
=
UnspecifiedType
()
unspecified_type
=
UnspecifiedType
()
...
...
Cython/Compiler/Symtab.py
View file @
eabb40f2
...
@@ -39,12 +39,9 @@ def c_safe_identifier(cname):
...
@@ -39,12 +39,9 @@ def c_safe_identifier(cname):
class BufferAux(object):
class BufferAux(object):
writable_needed = False
writable_needed = False
def __init__(self, buffer_info_var, stridevars, shapevars,
def __init__(self, buflocal_nd_var, rcbuf_var):
suboffsetvars):
self.buflocal_nd_var = buflocal_nd_var
self.buffer_info_var = buffer_info_var
self.rcbuf_var = rcbuf_var
self.stridevars = stridevars
self.shapevars = shapevars
self.suboffsetvars = suboffsetvars
def __repr__(self):
def __repr__(self):
return "
<
BufferAux
%
r
>
" % self.__dict__
return "
<
BufferAux
%
r
>
" % self.__dict__
...
...
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