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
Kirill Smelkov
cython
Commits
619e2289
Commit
619e2289
authored
Jun 29, 2021
by
Stefan Behnel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move some utility code from ExprNodes.py into utility code files.
parent
54d949f1
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
71 additions
and
84 deletions
+71
-84
Cython/Compiler/Code.py
Cython/Compiler/Code.py
+3
-4
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+14
-80
Cython/Utility/Exceptions.c
Cython/Utility/Exceptions.c
+17
-0
Cython/Utility/ObjectHandling.c
Cython/Utility/ObjectHandling.c
+37
-0
No files found.
Cython/Compiler/Code.py
View file @
619e2289
...
...
@@ -2364,19 +2364,18 @@ class CCodeWriter(object):
return
self
.
putln
(
"if (%s < 0) %s"
%
(
value
,
self
.
error_goto
(
pos
)))
def
put_error_if_unbound
(
self
,
pos
,
entry
,
in_nogil_context
=
False
):
from
.
import
ExprNodes
if
entry
.
from_closure
:
func
=
'__Pyx_RaiseClosureNameError'
self
.
globalstate
.
use_utility_code
(
ExprNodes
.
raise_closure_name_error_utility_code
)
UtilityCode
.
load_cached
(
"RaiseClosureNameError"
,
"ObjectHandling.c"
)
)
elif
entry
.
type
.
is_memoryviewslice
and
in_nogil_context
:
func
=
'__Pyx_RaiseUnboundMemoryviewSliceNogil'
self
.
globalstate
.
use_utility_code
(
ExprNodes
.
raise_unbound_memoryview_utility_code_nogil
)
UtilityCode
.
load_cached
(
"RaiseUnboundMemoryviewSliceNogil"
,
"ObjectHandling.c"
)
)
else
:
func
=
'__Pyx_RaiseUnboundLocalError'
self
.
globalstate
.
use_utility_code
(
ExprNodes
.
raise_unbound_local_error_utility_code
)
UtilityCode
.
load_cached
(
"RaiseUnboundLocalError"
,
"ObjectHandling.c"
)
)
self
.
putln
(
'if (unlikely(!%s)) { %s("%s"); %s }'
%
(
entry
.
type
.
check_for_null_code
(
entry
.
cname
),
...
...
Cython/Compiler/ExprNodes.py
View file @
619e2289
...
...
@@ -245,6 +245,8 @@ def get_exception_handler(exception_value):
def
maybe_check_py_error
(
code
,
check_py_exception
,
pos
,
nogil
):
if
check_py_exception
:
if
nogil
:
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"ErrOccurredWithGIL"
,
"Exceptions.c"
))
code
.
putln
(
code
.
error_goto_if
(
"__Pyx_ErrOccurredWithGIL()"
,
pos
))
else
:
code
.
putln
(
code
.
error_goto_if
(
"PyErr_Occurred()"
,
pos
))
...
...
@@ -5969,10 +5971,6 @@ class SimpleCallNode(CallNode):
# Called in 'nogil' context?
self
.
nogil
=
env
.
nogil
if
(
self
.
nogil
and
func_type
.
exception_check
and
func_type
.
exception_check
!=
'+'
):
env
.
use_utility_code
(
pyerr_occurred_withgil_utility_code
)
# C++ exception handler
if
func_type
.
exception_check
==
'+'
:
if
needs_cpp_exception_conversion
(
func_type
):
...
...
@@ -6118,6 +6116,8 @@ class SimpleCallNode(CallNode):
exc_checks
.
append
(
"%s == %s"
%
(
self
.
result
(),
func_type
.
return_type
.
cast_code
(
exc_val
)))
if
exc_check
:
if
self
.
nogil
:
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"ErrOccurredWithGIL"
,
"Exceptions.c"
))
exc_checks
.
append
(
"__Pyx_ErrOccurredWithGIL()"
)
else
:
exc_checks
.
append
(
"PyErr_Occurred()"
)
...
...
@@ -7792,10 +7792,12 @@ class SequenceNode(ExprNode):
# list/tuple => check size
code
.
putln
(
"Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);"
)
code
.
putln
(
"if (unlikely(size != %d)) {"
%
len
(
self
.
args
))
code
.
globalstate
.
use_utility_code
(
raise_too_many_values_to_unpack
)
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"RaiseTooManyValuesToUnpack"
,
"ObjectHandling.c"
))
code
.
putln
(
"if (size > %d) __Pyx_RaiseTooManyValuesError(%d);"
%
(
len
(
self
.
args
),
len
(
self
.
args
)))
code
.
globalstate
.
use_utility_code
(
raise_need_more_values_to_unpack
)
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"RaiseNeedMoreValuesToUnpack"
,
"ObjectHandling.c"
))
code
.
putln
(
"else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);"
)
# < 0 => exception
code
.
putln
(
code
.
error_goto
(
self
.
pos
))
...
...
@@ -7858,8 +7860,10 @@ class SequenceNode(ExprNode):
code
.
putln
(
"}"
)
def
generate_generic_parallel_unpacking_code
(
self
,
code
,
rhs
,
unpacked_items
,
use_loop
,
terminate
=
True
):
code
.
globalstate
.
use_utility_code
(
raise_need_more_values_to_unpack
)
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"IterFinish"
,
"ObjectHandling.c"
))
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"RaiseNeedMoreValuesToUnpack"
,
"ObjectHandling.c"
))
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"IterFinish"
,
"ObjectHandling.c"
))
code
.
putln
(
"Py_ssize_t index = -1;"
)
# must be at the start of a C block!
if
use_loop
:
...
...
@@ -7967,7 +7971,8 @@ class SequenceNode(ExprNode):
rhs
.
generate_disposal_code
(
code
)
if
unpacked_fixed_items_right
:
code
.
globalstate
.
use_utility_code
(
raise_need_more_values_to_unpack
)
code
.
globalstate
.
use_utility_code
(
UtilityCode
.
load_cached
(
"RaiseNeedMoreValuesToUnpack"
,
"ObjectHandling.c"
))
length_temp
=
code
.
funcstate
.
allocate_temp
(
PyrexTypes
.
c_py_ssize_t_type
,
manage_ref
=
False
)
code
.
putln
(
'%s = PyList_GET_SIZE(%s);'
%
(
length_temp
,
target_list
))
code
.
putln
(
"if (unlikely(%s < %d)) {"
%
(
length_temp
,
len
(
unpacked_fixed_items_right
)))
...
...
@@ -13919,74 +13924,3 @@ class AnnotationNode(ExprNode):
else
:
warning
(
annotation
.
pos
,
"Unknown type declaration in annotation, ignoring"
)
return
base_type
,
arg_type
#------------------------------------------------------------------------------------
#
# Runtime support code
#
#------------------------------------------------------------------------------------
pyerr_occurred_withgil_utility_code
=
UtilityCode
(
proto
=
"""
static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void); /* proto */
"""
,
impl
=
"""
static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void) {
int err;
#ifdef WITH_THREAD
PyGILState_STATE _save = PyGILState_Ensure();
#endif
err = !!PyErr_Occurred();
#ifdef WITH_THREAD
PyGILState_Release(_save);
#endif
return err;
}
"""
)
#------------------------------------------------------------------------------------
raise_unbound_local_error_utility_code
=
UtilityCode
(
proto
=
"""
static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
"""
,
impl
=
"""
static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) {
PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname);
}
"""
)
raise_closure_name_error_utility_code
=
UtilityCode
(
proto
=
"""
static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);
"""
,
impl
=
"""
static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
}
"""
)
# Don't inline the function, it should really never be called in production
raise_unbound_memoryview_utility_code_nogil
=
UtilityCode
(
proto
=
"""
static void __Pyx_RaiseUnboundMemoryviewSliceNogil(const char *varname);
"""
,
impl
=
"""
static void __Pyx_RaiseUnboundMemoryviewSliceNogil(const char *varname) {
#ifdef WITH_THREAD
PyGILState_STATE gilstate = PyGILState_Ensure();
#endif
__Pyx_RaiseUnboundLocalError(varname);
#ifdef WITH_THREAD
PyGILState_Release(gilstate);
#endif
}
"""
,
requires
=
[
raise_unbound_local_error_utility_code
])
#------------------------------------------------------------------------------------
raise_too_many_values_to_unpack
=
UtilityCode
.
load_cached
(
"RaiseTooManyValuesToUnpack"
,
"ObjectHandling.c"
)
raise_need_more_values_to_unpack
=
UtilityCode
.
load_cached
(
"RaiseNeedMoreValuesToUnpack"
,
"ObjectHandling.c"
)
tuple_unpacking_error_code
=
UtilityCode
.
load_cached
(
"UnpackTupleError"
,
"ObjectHandling.c"
)
Cython/Utility/Exceptions.c
View file @
619e2289
...
...
@@ -6,6 +6,23 @@
// __Pyx_GetException()
/////////////// ErrOccurredWithGIL.proto ///////////////
static
CYTHON_INLINE
int
__Pyx_ErrOccurredWithGIL
(
void
);
/* proto */
/////////////// ErrOccurredWithGIL ///////////////
static
CYTHON_INLINE
int
__Pyx_ErrOccurredWithGIL
(
void
)
{
int
err
;
#ifdef WITH_THREAD
PyGILState_STATE
_save
=
PyGILState_Ensure
();
#endif
err
=
!!
PyErr_Occurred
();
#ifdef WITH_THREAD
PyGILState_Release
(
_save
);
#endif
return
err
;
}
/////////////// PyThreadStateGet.proto ///////////////
//@substitute: naming
...
...
Cython/Utility/ObjectHandling.c
View file @
619e2289
...
...
@@ -3030,6 +3030,7 @@ __Pyx_PyType_GetName(PyTypeObject* tp)
}
#endif
/////////////// RaiseUnexpectedTypeError.proto ///////////////
static
int
__Pyx_RaiseUnexpectedTypeError
(
const
char
*
expected
,
PyObject
*
obj
);
/*proto*/
...
...
@@ -3045,3 +3046,39 @@ __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj)
__Pyx_DECREF_TypeName
(
obj_type_name
);
return
0
;
}
/////////////// RaiseUnboundLocalError.proto ///////////////
static
CYTHON_INLINE
void
__Pyx_RaiseUnboundLocalError
(
const
char
*
varname
);
/*proto*/
/////////////// RaiseUnboundLocalError ///////////////
static
CYTHON_INLINE
void
__Pyx_RaiseUnboundLocalError
(
const
char
*
varname
)
{
PyErr_Format
(
PyExc_UnboundLocalError
,
"local variable '%s' referenced before assignment"
,
varname
);
}
/////////////// RaiseClosureNameError.proto ///////////////
static
CYTHON_INLINE
void
__Pyx_RaiseClosureNameError
(
const
char
*
varname
);
/*proto*/
/////////////// RaiseClosureNameError ///////////////
static
CYTHON_INLINE
void
__Pyx_RaiseClosureNameError
(
const
char
*
varname
)
{
PyErr_Format
(
PyExc_NameError
,
"free variable '%s' referenced before assignment in enclosing scope"
,
varname
);
}
/////////////// RaiseUnboundMemoryviewSliceNogil.proto ///////////////
static
void
__Pyx_RaiseUnboundMemoryviewSliceNogil
(
const
char
*
varname
);
/*proto*/
/////////////// RaiseUnboundMemoryviewSliceNogil ///////////////
//@requires: RaiseUnboundLocalError
// Don't inline the function, it should really never be called in production
static
void
__Pyx_RaiseUnboundMemoryviewSliceNogil
(
const
char
*
varname
)
{
#ifdef WITH_THREAD
PyGILState_STATE
gilstate
=
PyGILState_Ensure
();
#endif
__Pyx_RaiseUnboundLocalError
(
varname
);
#ifdef WITH_THREAD
PyGILState_Release
(
gilstate
);
#endif
}
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