Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
cython
Commits
6f6e64f5
Commit
6f6e64f5
authored
Mar 07, 2019
by
gsamain
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Cypclass refcount
parent
2a7e9ed0
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
45 additions
and
27 deletions
+45
-27
Cython/Compiler/Code.py
Cython/Compiler/Code.py
+3
-3
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+26
-12
Cython/Compiler/Nodes.py
Cython/Compiler/Nodes.py
+13
-9
Cython/Compiler/UtilNodes.py
Cython/Compiler/UtilNodes.py
+3
-3
No files found.
Cython/Compiler/Code.py
View file @
6f6e64f5
...
...
@@ -1962,7 +1962,7 @@ class CCodeWriter(object):
entry
.
cname
,
dll_linkage
=
dll_linkage
))
if
entry
.
init
is
not
None
:
self
.
put_safe
(
" = %s"
%
entry
.
type
.
literal_code
(
entry
.
init
))
elif
entry
.
type
.
is_pyobject
:
elif
entry
.
type
.
is_pyobject
or
entry
.
type
.
is_cyp_class
:
self
.
put
(
" = NULL"
)
self
.
putln
(
";"
)
...
...
@@ -1974,8 +1974,8 @@ class CCodeWriter(object):
elif
type
.
is_memoryviewslice
:
from
.
import
MemoryView
self
.
putln
(
"%s = %s;"
%
(
decl
,
MemoryView
.
memslice_entry_init
))
elif
type
.
is_
struct
and
type
.
is_extension_type
and
type
.
nogil
:
self
.
putln
(
"%s;"
%
decl
)
elif
type
.
is_
cyp_class
:
self
.
putln
(
"%s
= NULL
;"
%
decl
)
else
:
self
.
putln
(
"%s%s;"
%
(
static
and
"static "
or
""
,
decl
))
...
...
Cython/Compiler/ExprNodes.py
View file @
6f6e64f5
...
...
@@ -751,10 +751,11 @@ class ExprNode(Node):
If result is a pyobject, make sure we own a reference to it.
If the result is in a temp, it is already a new reference.
"""
if
self
.
type
.
is_pyobject
and
not
self
.
result_in_temp
():
code
.
put_incref
(
self
.
result
(),
self
.
ctype
())
elif
self
.
type
.
is_extension_type
and
not
self
.
type
.
is_pyobject
and
not
self
.
result_in_temp
():
code
.
put_cyincref
(
self
.
result
())
if
not
self
.
result_in_temp
():
if
self
.
type
.
is_pyobject
:
code
.
put_incref
(
self
.
result
(),
self
.
ctype
())
elif
self
.
type
.
is_cyp_class
and
"NULL"
not
in
self
.
result
():
code
.
put_cyincref
(
self
.
result
())
def
make_owned_memoryviewslice
(
self
,
code
):
"""
...
...
@@ -802,8 +803,8 @@ class ExprNode(Node):
self
.
result
(),
have_gil
=
not
self
.
in_nogil_context
)
code
.
putln
(
"%s.memview = NULL;"
%
self
.
result
())
code
.
putln
(
"%s.data = NULL;"
%
self
.
result
())
elif
self
.
type
.
is_
extension_type
and
not
self
.
type
.
is_pyobject
:
code
.
put_cydecref
(
self
.
result
())
elif
self
.
type
.
is_
cyp_class
:
code
.
put_cy
x
decref
(
self
.
result
())
else
:
# Already done if self.is_temp
self
.
generate_subexpr_disposal_code
(
code
)
...
...
@@ -825,7 +826,7 @@ class ExprNode(Node):
elif
self
.
type
.
is_memoryviewslice
:
code
.
putln
(
"%s.memview = NULL;"
%
self
.
result
())
code
.
putln
(
"%s.data = NULL;"
%
self
.
result
())
elif
self
.
type
.
is_
extension_type
and
not
self
.
type
.
is_pyobject
:
elif
self
.
type
.
is_
cyp_class
:
code
.
putln
(
"%s = 0;"
%
self
.
result
())
else
:
self
.
generate_subexpr_disposal_code
(
code
)
...
...
@@ -1790,7 +1791,7 @@ class ImagNode(AtomicExprNode):
float
(
self
.
value
),
code
.
error_goto_if_null
(
self
.
result
(),
self
.
pos
)))
code
.
put_gotref
(
self
.
py_result
())
elif
self
.
type
.
is_
extension_type
:
elif
self
.
type
.
is_
cyp_class
:
code
.
put_cygotref
(
self
.
result
())
...
...
@@ -2271,7 +2272,7 @@ class NameNode(AtomicExprNode):
code
.
error_goto_if_null
(
self
.
result
(),
self
.
pos
)))
code
.
put_gotref
(
self
.
py_result
())
elif
entry
.
is_local
and
entry
.
type
.
is_
extension_type
and
not
entry
.
type
.
is_pyobject
:
elif
entry
.
is_local
and
entry
.
type
.
is_
cyp_class
:
code
.
put_cygotref
(
self
.
result
())
#pass
# code.putln(entry.cname)
...
...
@@ -2376,6 +2377,10 @@ class NameNode(AtomicExprNode):
assigned
=
False
if
is_external_ref
:
code
.
put_giveref
(
rhs
.
py_result
())
elif
self
.
type
.
is_cyp_class
:
code
.
put_cyxdecref
(
self
.
result
())
if
isinstance
(
rhs
,
NameNode
):
rhs
.
make_owned_reference
(
code
)
if
not
self
.
type
.
is_memoryviewslice
:
if
not
assigned
:
if
overloaded_assignment
:
...
...
@@ -2493,7 +2498,7 @@ class NameNode(AtomicExprNode):
else
:
code
.
put_xdecref_memoryviewslice
(
self
.
entry
.
cname
,
have_gil
=
not
self
.
nogil
)
elif
self
.
entry
.
type
.
is_
extension_type
:
elif
self
.
entry
.
type
.
is_
cyp_class
:
if
not
self
.
cf_is_null
:
if
self
.
cf_maybe_null
and
not
ignore_nonexisting
:
code
.
put_error_if_unbound
(
self
.
pos
,
self
.
entry
)
...
...
@@ -4104,7 +4109,7 @@ class IndexNode(_IndexingBaseNode):
code
.
error_goto_if
(
error_check
%
self
.
result
(),
self
.
pos
)))
if
self
.
type
.
is_pyobject
:
code
.
put_gotref
(
self
.
py_result
())
elif
self
.
type
.
is_
extension_type
:
elif
self
.
type
.
is_
cyp_class
:
code
.
put_cygotref
(
self
.
result
())
def
generate_setitem_code
(
self
,
value_code
,
code
):
...
...
@@ -6000,7 +6005,7 @@ class SimpleCallNode(CallNode):
if
self
.
result
():
if
self
.
type
.
is_pyobject
:
code
.
put_gotref
(
self
.
py_result
())
elif
self
.
type
.
is_
extension_type
:
elif
self
.
type
.
is_
cyp_class
:
code
.
put_cygotref
(
self
.
result
())
if
self
.
has_optional_args
:
code
.
funcstate
.
release_temp
(
self
.
opt_arg_struct
)
...
...
@@ -7081,6 +7086,8 @@ class AttributeNode(ExprNode):
self
.
op
=
"->"
elif
obj_type
.
is_reference
and
obj_type
.
is_fake_reference
:
self
.
op
=
"->"
elif
obj_type
.
is_cyp_class
:
self
.
op
=
"->"
else
:
self
.
op
=
"."
if
obj_type
.
has_attributes
:
...
...
@@ -7335,6 +7342,11 @@ class AttributeNode(ExprNode):
from
.
import
MemoryView
MemoryView
.
put_assign_to_memviewslice
(
select_code
,
rhs
,
rhs
.
result
(),
self
.
type
,
code
)
elif
self
.
type
.
is_cyp_class
:
rhs
.
make_owned_reference
(
code
)
code
.
put_cygiveref
(
rhs
.
result
())
code
.
put_cygotref
(
select_code
)
code
.
put_cyxdecref
(
select_code
)
if
not
self
.
type
.
is_memoryviewslice
:
code
.
putln
(
...
...
@@ -13500,6 +13512,8 @@ class CoerceToTempNode(CoercionNode):
elif
self
.
type
.
is_memoryviewslice
:
code
.
put_incref_memoryviewslice
(
self
.
result
(),
not
self
.
in_nogil_context
)
elif
self
.
type
.
is_cyp_class
:
code
.
put_cyincref
(
self
.
result
())
class
ProxyNode
(
CoercionNode
):
"""
...
...
Cython/Compiler/Nodes.py
View file @
6f6e64f5
...
...
@@ -960,7 +960,7 @@ class CArgDeclNode(Node):
code
.
putln
(
"%s = %s;"
%
(
target
,
result
))
if
self
.
type
.
is_pyobject
:
code
.
put_giveref
(
default
.
result
())
elif
self
.
type
.
is_
extension_type
:
elif
self
.
type
.
is_
cyp_class
:
code
.
put_cygiveref
(
default
.
result
())
default
.
generate_post_assignment_code
(
code
)
default
.
free_temps
(
code
)
...
...
@@ -1858,7 +1858,7 @@ class FuncDefNode(StatNode, BlockNode):
# Initialize the return variable __pyx_r
init
=
""
if
not
self
.
return_type
.
is_void
:
if
self
.
return_type
.
is_pyobject
:
if
self
.
return_type
.
is_pyobject
or
self
.
return_type
.
is_cyp_class
:
init
=
" = NULL"
elif
self
.
return_type
.
is_memoryviewslice
:
init
=
' = '
+
MemoryView
.
memslice_entry_init
...
...
@@ -1992,7 +1992,7 @@ class FuncDefNode(StatNode, BlockNode):
elif
is_cdef
and
entry
.
type
.
is_memoryviewslice
and
len
(
entry
.
cf_assignments
)
>
1
:
code
.
put_incref_memoryviewslice
(
entry
.
cname
,
have_gil
=
code
.
funcstate
.
gil_owned
)
# We have to Cy_INCREF the nogil classes (ccdef'ed ones)
elif
entry
.
type
.
is_
extension_type
and
not
entry
.
type
.
is_pyobject
and
len
(
entry
.
cf_assignments
)
>
1
:
elif
entry
.
type
.
is_
cyp_class
and
len
(
entry
.
cf_assignments
)
>
1
:
code
.
put_cyincref
(
entry
.
cname
)
for
entry
in
lenv
.
var_entries
:
if
entry
.
is_arg
and
len
(
entry
.
cf_assignments
)
>
1
and
not
entry
.
in_closure
:
...
...
@@ -2145,9 +2145,11 @@ class FuncDefNode(StatNode, BlockNode):
code
.
put_var_xdecref
(
entry
)
else
:
code
.
put_var_decref
(
entry
)
elif
entry
.
type
.
is_
extension_type
and
not
entry
.
type
.
is_pyobject
and
\
elif
entry
.
type
.
is_
cyp_class
and
\
(
not
entry
.
is_arg
or
len
(
entry
.
cf_assignments
)
>
1
):
code
.
put_cydecref
(
entry
.
cname
)
# We must check for NULL because it is possible to have
# NULL as a valid cypclass (with a typecast)
code
.
put_cyxdecref
(
entry
.
cname
)
# Decref any increfed args
for
entry
in
lenv
.
arg_entries
:
...
...
@@ -2160,8 +2162,10 @@ class FuncDefNode(StatNode, BlockNode):
# functions, but not borrowed slices from cdef functions.
code
.
put_xdecref_memoryviewslice
(
entry
.
cname
,
have_gil
=
not
lenv
.
nogil
)
elif
entry
.
type
.
is_extension_type
and
not
entry
.
type
.
is_pyobject
and
len
(
entry
.
cf_assignments
)
>
1
:
code
.
put_cydecref
(
entry
.
cname
)
elif
entry
.
type
.
is_cyp_class
and
len
(
entry
.
cf_assignments
)
>
1
:
# We must check for NULL because it is possible to have
# NULL as a valid cypclass (with a typecast)
code
.
put_cyxdecref
(
entry
.
cname
)
if
self
.
needs_closure
:
code
.
put_decref
(
Naming
.
cur_scope_cname
,
lenv
.
scope_class
.
type
)
...
...
@@ -2175,7 +2179,7 @@ class FuncDefNode(StatNode, BlockNode):
if
self
.
return_type
.
is_pyobject
:
code
.
put_xgiveref
(
self
.
return_type
.
as_pyobject
(
Naming
.
retval_cname
))
# We can always return a CythonExtensionType as it is nogil-compliant
if
self
.
return_type
.
is_
extension_type
and
not
self
.
return_type
.
is_pyobject
:
if
self
.
return_type
.
is_
cyp_class
:
code
.
put_cyxgiveref
(
Naming
.
retval_cname
)
if
self
.
entry
.
is_special
and
self
.
entry
.
name
==
"__hash__"
:
...
...
@@ -6084,7 +6088,7 @@ class ReturnStatNode(StatNode):
# Use specialised default handling for "return None".
value
=
None
if
self
.
return_type
.
is_
extension_type
and
not
self
.
return_type
.
is_pyobject
:
if
self
.
return_type
.
is_
cyp_class
:
code
.
put_cyxdecref
(
Naming
.
retval_cname
)
if
value
:
...
...
Cython/Compiler/UtilNodes.py
View file @
6f6e64f5
...
...
@@ -198,12 +198,12 @@ class ResultRefNode(AtomicExprNode):
pass
def
generate_assignment_code
(
self
,
rhs
,
code
,
overloaded_assignment
=
False
):
if
self
.
type
.
is_pyobject
or
self
.
type
.
is_
extension_type
:
if
self
.
type
.
is_pyobject
or
self
.
type
.
is_
cyp_class
:
rhs
.
make_owned_reference
(
code
)
if
not
self
.
lhs_of_first_assignment
:
if
self
.
type
.
is_pyobject
:
code
.
put_decref
(
self
.
result
(),
self
.
ctype
())
elif
self
.
type
.
is_
extension_type
:
elif
self
.
type
.
is_
cyp_class
:
code
.
put_cydecref
(
self
.
result
())
code
.
putln
(
'%s = %s;'
%
(
self
.
result
(),
...
...
@@ -251,7 +251,7 @@ class LetNodeMixin:
else
:
if
self
.
temp_type
.
is_pyobject
:
code
.
put_decref_clear
(
self
.
temp
,
self
.
temp_type
)
elif
self
.
temp_type
.
is_
extension_type
:
elif
self
.
temp_type
.
is_
cyp_class
:
pass
#code.put_decref_clear(self.temp, self.temp_type)
code
.
funcstate
.
release_temp
(
self
.
temp
)
...
...
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