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
Xavier Thompson
cython
Commits
014fed72
Commit
014fed72
authored
4 years ago
by
Xavier Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support wrapping cypclass with multiple bases
parent
7ecbe620
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
28 additions
and
17 deletions
+28
-17
Cython/Compiler/CypclassWrapper.py
Cython/Compiler/CypclassWrapper.py
+7
-10
Cython/Compiler/ModuleNode.py
Cython/Compiler/ModuleNode.py
+9
-3
Cython/Compiler/Nodes.py
Cython/Compiler/Nodes.py
+10
-4
Cython/Compiler/PyrexTypes.py
Cython/Compiler/PyrexTypes.py
+2
-0
No files found.
Cython/Compiler/CypclassWrapper.py
View file @
014fed72
...
@@ -155,9 +155,6 @@ class CypclassWrapperInjection(VisitorTransform):
...
@@ -155,9 +155,6 @@ class CypclassWrapperInjection(VisitorTransform):
if
not
node_has_suite
:
if
not
node_has_suite
:
return
None
return
None
if
len
(
node
.
base_classes
)
>
1
:
return
None
# TODO: take nesting into account for the name
# TODO: take nesting into account for the name
cclass_name
=
EncodedString
(
"%s_cyp_wrapper"
%
node
.
name
)
cclass_name
=
EncodedString
(
"%s_cyp_wrapper"
%
node
.
name
)
...
@@ -217,13 +214,12 @@ class CypclassWrapperInjection(VisitorTransform):
...
@@ -217,13 +214,12 @@ class CypclassWrapperInjection(VisitorTransform):
return
wrapper
return
wrapper
def
synthesize_underlying_cyobject_attribute
(
self
,
node
):
def
synthesize_underlying_cyobject_attribute
(
self
,
node
):
nested_names
=
[
node
.
name
for
node
in
self
.
nesting_stack
]
underlying_base_typ
e
=
Nodes
.
CSimpleBaseTypeNode
(
void_type_nod
e
=
Nodes
.
CSimpleBaseTypeNode
(
node
.
pos
,
node
.
pos
,
name
=
node
.
name
,
name
=
"void"
,
module_path
=
nested_names
,
module_path
=
[]
,
is_basic_c_type
=
0
,
is_basic_c_type
=
1
,
signed
=
1
,
signed
=
1
,
complex
=
0
,
complex
=
0
,
longness
=
0
,
longness
=
0
,
...
@@ -232,11 +228,12 @@ class CypclassWrapperInjection(VisitorTransform):
...
@@ -232,11 +228,12 @@ class CypclassWrapperInjection(VisitorTransform):
)
)
underlying_name_declarator
=
Nodes
.
CNameDeclaratorNode
(
node
.
pos
,
name
=
underlying_name
,
cname
=
None
)
underlying_name_declarator
=
Nodes
.
CNameDeclaratorNode
(
node
.
pos
,
name
=
underlying_name
,
cname
=
None
)
underlying_name_declarator
=
Nodes
.
CPtrDeclaratorNode
(
node
.
pos
,
base
=
underlying_name_declarator
)
underlying_cyobject
=
Nodes
.
CVarDefNode
(
underlying_cyobject
=
Nodes
.
CVarDefNode
(
pos
=
node
.
pos
,
pos
=
node
.
pos
,
visibility
=
'private'
,
visibility
=
'private'
,
base_type
=
underlying_base_typ
e
,
base_type
=
void_type_nod
e
,
declarators
=
[
underlying_name_declarator
],
declarators
=
[
underlying_name_declarator
],
in_pxd
=
node
.
in_pxd
,
in_pxd
=
node
.
in_pxd
,
doc
=
None
,
doc
=
None
,
...
...
This diff is collapsed.
Click to expand it.
Cython/Compiler/ModuleNode.py
View file @
014fed72
...
@@ -1684,10 +1684,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
...
@@ -1684,10 +1684,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
"static void %s(PyObject *o) {"
%
slot_func_cname
)
"static void %s(PyObject *o) {"
%
slot_func_cname
)
# for cyp wrappers, just decrement the atomic counter of the underlying type
# for cyp wrappers, just decrement the atomic counter of the underlying type
is_cyp_wrapper
=
scope
.
parent_type
.
is_cyp_wrapper
parent_type
=
scope
.
parent_type
if
is_cyp_wrapper
:
if
parent_type
.
is_cyp_wrapper
:
underlying_type_decl
=
parent_type
.
wrapped_decl
underlying_attribute_name
=
CypclassWrapper
.
underlying_name
self
.
generate_self_cast
(
scope
,
code
)
self
.
generate_self_cast
(
scope
,
code
)
code
.
putln
(
"Cy_DECREF(p->%s);"
%
CypclassWrapper
.
underlying_name
)
code
.
putln
(
"%s * p_nogil_cyobject = (%s *) (p->%s);"
%
(
underlying_type_decl
,
underlying_type_decl
,
underlying_attribute_name
)
)
code
.
putln
(
"Cy_DECREF(p_nogil_cyobject);"
)
code
.
putln
(
"}"
)
code
.
putln
(
"}"
)
if
cdealloc_func_entry
is
None
:
if
cdealloc_func_entry
is
None
:
code
.
putln
(
"#endif"
)
code
.
putln
(
"#endif"
)
...
...
This diff is collapsed.
Click to expand it.
Cython/Compiler/Nodes.py
View file @
014fed72
...
@@ -5570,6 +5570,8 @@ class CypclassWrapperDefNode(CClassDefNode):
...
@@ -5570,6 +5570,8 @@ class CypclassWrapperDefNode(CClassDefNode):
self
.
entry
.
type
.
is_cyp_wrapper
=
1
self
.
entry
.
type
.
is_cyp_wrapper
=
1
# > associate the wrapper type to the wrapped type
# > associate the wrapper type to the wrapped type
self
.
wrapped_cypclass
.
entry
.
type
.
wrapper_type
=
self
.
entry
.
type
self
.
wrapped_cypclass
.
entry
.
type
.
wrapper_type
=
self
.
entry
.
type
# > remember the cname of the wrapped type
self
.
entry
.
type
.
wrapped_decl
=
self
.
wrapped_cypclass
.
entry
.
type
.
empty_declaration_code
()
# > insert and analyse each method wrapper
# > insert and analyse each method wrapper
self
.
insert_cypclass_method_wrappers
(
env
)
self
.
insert_cypclass_method_wrappers
(
env
)
...
@@ -5650,16 +5652,20 @@ class CypclassWrapperDefNode(CClassDefNode):
...
@@ -5650,16 +5652,20 @@ class CypclassWrapperDefNode(CClassDefNode):
# > reference to the self argument of the wrapper method
# > reference to the self argument of the wrapper method
self_obj
=
ExprNodes
.
NameNode
(
self_pos
,
name
=
self_name
)
self_obj
=
ExprNodes
.
NameNode
(
self_pos
,
name
=
self_name
)
# > access the
method of the
underlying cyobject from the self argument of the wrapper method
# > access the underlying cyobject from the self argument of the wrapper method
underlying_obj
=
ExprNodes
.
AttributeNode
(
cfunc_method
.
pos
,
obj
=
self_obj
,
attribute
=
underlying_name
)
underlying_obj
=
ExprNodes
.
AttributeNode
(
cfunc_method
.
pos
,
obj
=
self_obj
,
attribute
=
underlying_name
)
empty_declarator
=
CNameDeclaratorNode
(
cfunc_method
.
pos
,
name
=
""
,
cname
=
None
)
empty_declarator
=
CNameDeclaratorNode
(
cfunc_method
.
pos
,
name
=
""
,
cname
=
None
)
cast_
underlying_obj
=
ExprNodes
.
TypecastNode
(
cast_
operation
=
ExprNodes
.
TypecastNode
(
cfunc_method
.
pos
,
cfunc_method
.
pos
,
type
=
self
.
wrapped_cypclass
.
entry
.
type
,
type
=
self
.
wrapped_cypclass
.
entry
.
type
,
operand
=
underlying_obj
,
operand
=
underlying_obj
,
typecheck
=
False
typecheck
=
False
)
)
cast_underlying_obj
=
ExprNodes
.
NameNode
(
self_pos
,
name
=
EncodedString
(
"cast_cyobject"
))
cast_assignment
=
SingleAssignmentNode
(
self_pos
,
lhs
=
cast_underlying_obj
,
rhs
=
cast_operation
)
# > access the method of the underlying object
cfunc
=
ExprNodes
.
AttributeNode
(
cfunc_method
.
pos
,
obj
=
cast_underlying_obj
,
attribute
=
cfunc_name
)
cfunc
=
ExprNodes
.
AttributeNode
(
cfunc_method
.
pos
,
obj
=
cast_underlying_obj
,
attribute
=
cfunc_name
)
# > call to the underlying method
# > call to the underlying method
...
@@ -5674,7 +5680,7 @@ class CypclassWrapperDefNode(CClassDefNode):
...
@@ -5674,7 +5680,7 @@ class CypclassWrapperDefNode(CClassDefNode):
py_stat
=
ExprStatNode
(
cfunc_method
.
pos
,
expr
=
c_call
)
py_stat
=
ExprStatNode
(
cfunc_method
.
pos
,
expr
=
c_call
)
else
:
else
:
py_stat
=
ReturnStatNode
(
cfunc_method
.
pos
,
return_type
=
PyrexTypes
.
py_object_type
,
value
=
c_call
)
py_stat
=
ReturnStatNode
(
cfunc_method
.
pos
,
return_type
=
PyrexTypes
.
py_object_type
,
value
=
c_call
)
py_body
=
StatListNode
(
cfunc_method
.
pos
,
stats
=
[
py_stat
])
py_body
=
StatListNode
(
cfunc_method
.
pos
,
stats
=
[
cast_assignment
,
py_stat
])
# > lock around the call in checklock mode
# > lock around the call in checklock mode
if
self
.
wrapped_cypclass
.
lock_mode
==
'checklock'
:
if
self
.
wrapped_cypclass
.
lock_mode
==
'checklock'
:
...
@@ -5682,7 +5688,7 @@ class CypclassWrapperDefNode(CClassDefNode):
...
@@ -5682,7 +5688,7 @@ class CypclassWrapperDefNode(CClassDefNode):
lock_node
=
LockCypclassNode
(
lock_node
=
LockCypclassNode
(
cfunc_method
.
pos
,
cfunc_method
.
pos
,
state
=
'wlocked'
if
need_wlock
else
'rlocked'
,
state
=
'wlocked'
if
need_wlock
else
'rlocked'
,
obj
=
underlying_obj
,
obj
=
cast_
underlying_obj
,
body
=
py_body
body
=
py_body
)
)
py_body
=
lock_node
py_body
=
lock_node
...
...
This diff is collapsed.
Click to expand it.
Cython/Compiler/PyrexTypes.py
View file @
014fed72
...
@@ -1499,11 +1499,13 @@ class PyExtensionType(PyObjectType):
...
@@ -1499,11 +1499,13 @@ class PyExtensionType(PyObjectType):
# defered_declarations [thunk] Used to declare class hierarchies in order
# defered_declarations [thunk] Used to declare class hierarchies in order
# check_size 'warn', 'error', 'ignore' What to do if tp_basicsize does not match
# check_size 'warn', 'error', 'ignore' What to do if tp_basicsize does not match
# is_cyp_wrapper boolean Whether this extension type wraps a cypclass
# is_cyp_wrapper boolean Whether this extension type wraps a cypclass
# wrapped_decl string or None The declaration code of the wrapped cypclass type when this is a cyp_wrapper
is_extension_type
=
1
is_extension_type
=
1
has_attributes
=
1
has_attributes
=
1
early_init
=
1
early_init
=
1
is_cyp_wrapper
=
0
is_cyp_wrapper
=
0
wrapped_decl
=
None
objtypedef_cname
=
None
objtypedef_cname
=
None
...
...
This diff is collapsed.
Click to expand it.
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