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
0bb6f98b
Commit
0bb6f98b
authored
Jan 06, 2021
by
Xavier Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Disallow 'const' qualifier for cypclass types
parent
608c29a9
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
106 additions
and
262 deletions
+106
-262
Cython/Compiler/Builtin.py
Cython/Compiler/Builtin.py
+6
-11
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+1
-4
Cython/Compiler/Nodes.py
Cython/Compiler/Nodes.py
+6
-11
Cython/Compiler/Parsing.py
Cython/Compiler/Parsing.py
+3
-2
Cython/Compiler/PyrexTypes.py
Cython/Compiler/PyrexTypes.py
+3
-110
Cython/Compiler/Symtab.py
Cython/Compiler/Symtab.py
+0
-6
Cython/Includes/libcythonplus/dict.pxd
Cython/Includes/libcythonplus/dict.pxd
+16
-16
Cython/Includes/libcythonplus/list.pxd
Cython/Includes/libcythonplus/list.pxd
+14
-14
Cython/Includes/libcythonplus/set.pxd
Cython/Includes/libcythonplus/set.pxd
+39
-39
Cython/Utility/CyObjects.cpp
Cython/Utility/CyObjects.cpp
+5
-5
tests/run/cypclass_acthon.pyx
tests/run/cypclass_acthon.pyx
+11
-12
tests/run/cypclass_is.pyx
tests/run/cypclass_is.pyx
+0
-11
tests/run/cypclass_isinstanceof.pyx
tests/run/cypclass_isinstanceof.pyx
+0
-19
tests/run/cypclass_operator_refcount.pyx
tests/run/cypclass_operator_refcount.pyx
+1
-1
tests/run/cypclass_operators_more.pyx
tests/run/cypclass_operators_more.pyx
+1
-1
No files found.
Cython/Compiler/Builtin.py
View file @
0bb6f98b
...
@@ -431,7 +431,6 @@ def inject_acthon_interfaces(self):
...
@@ -431,7 +431,6 @@ def inject_acthon_interfaces(self):
result_scope
.
var_entries
.
append
(
result_pushVoidStar_entry
)
result_scope
.
var_entries
.
append
(
result_pushVoidStar_entry
)
result_getVoidStar_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_void_ptr_type
,
[],
nogil
=
1
)
result_getVoidStar_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_void_ptr_type
,
[],
nogil
=
1
)
result_getVoidStar_type
.
is_const_method
=
1
result_getVoidStar_entry
=
result_scope
.
declare
(
"getVoidStarResult"
,
"getVoidStarResult"
,
result_getVoidStar_entry
=
result_scope
.
declare
(
"getVoidStarResult"
,
"getVoidStarResult"
,
result_getVoidStar_type
,
None
,
"extern"
)
result_getVoidStar_type
,
None
,
"extern"
)
result_getVoidStar_entry
.
is_cfunction
=
1
result_getVoidStar_entry
.
is_cfunction
=
1
...
@@ -447,7 +446,6 @@ def inject_acthon_interfaces(self):
...
@@ -447,7 +446,6 @@ def inject_acthon_interfaces(self):
result_scope
.
var_entries
.
append
(
result_pushInt_entry
)
result_scope
.
var_entries
.
append
(
result_pushInt_entry
)
result_getInt_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_int_type
,
[],
nogil
=
1
)
result_getInt_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_int_type
,
[],
nogil
=
1
)
result_getInt_type
.
is_const_method
=
1
result_getInt_entry
=
result_scope
.
declare
(
"getIntResult"
,
"getIntResult"
,
result_getInt_entry
=
result_scope
.
declare
(
"getIntResult"
,
"getIntResult"
,
result_getInt_type
,
None
,
"extern"
)
result_getInt_type
,
None
,
"extern"
)
result_getInt_entry
.
is_cfunction
=
1
result_getInt_entry
.
is_cfunction
=
1
...
@@ -495,7 +493,6 @@ def inject_acthon_interfaces(self):
...
@@ -495,7 +493,6 @@ def inject_acthon_interfaces(self):
sync_entry
.
is_type
=
1
sync_entry
.
is_type
=
1
sync_isActivable_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_bint_type
,
[],
nogil
=
1
)
sync_isActivable_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_bint_type
,
[],
nogil
=
1
)
sync_isActivable_type
.
is_const_method
=
1
sync_isActivable_entry
=
sync_scope
.
declare
(
"isActivable"
,
"isActivable"
,
sync_isActivable_entry
=
sync_scope
.
declare
(
"isActivable"
,
"isActivable"
,
sync_isActivable_type
,
None
,
"extern"
)
sync_isActivable_type
,
None
,
"extern"
)
sync_isActivable_entry
.
is_cfunction
=
1
sync_isActivable_entry
.
is_cfunction
=
1
...
@@ -503,7 +500,6 @@ def inject_acthon_interfaces(self):
...
@@ -503,7 +500,6 @@ def inject_acthon_interfaces(self):
sync_scope
.
var_entries
.
append
(
sync_isActivable_entry
)
sync_scope
.
var_entries
.
append
(
sync_isActivable_entry
)
sync_isCompleted_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_bint_type
,
[],
nogil
=
1
)
sync_isCompleted_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_bint_type
,
[],
nogil
=
1
)
sync_isCompleted_type
.
is_const_method
=
1
sync_isCompleted_entry
=
sync_scope
.
declare
(
"isCompleted"
,
"isCompleted"
,
sync_isCompleted_entry
=
sync_scope
.
declare
(
"isCompleted"
,
"isCompleted"
,
sync_isCompleted_type
,
None
,
"extern"
)
sync_isCompleted_type
,
None
,
"extern"
)
sync_isCompleted_entry
.
is_cfunction
=
1
sync_isCompleted_entry
.
is_cfunction
=
1
...
@@ -578,7 +574,6 @@ def inject_acthon_interfaces(self):
...
@@ -578,7 +574,6 @@ def inject_acthon_interfaces(self):
queue_scope
.
var_entries
.
append
(
queue_activate_entry
)
queue_scope
.
var_entries
.
append
(
queue_activate_entry
)
queue_is_empty_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_bint_type
,
[],
nogil
=
1
)
queue_is_empty_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_bint_type
,
[],
nogil
=
1
)
queue_is_empty_type
.
is_const_method
=
1
queue_is_empty_entry
=
queue_scope
.
declare
(
"is_empty"
,
"is_empty"
,
queue_is_empty_entry
=
queue_scope
.
declare
(
"is_empty"
,
"is_empty"
,
queue_is_empty_type
,
None
,
"extern"
)
queue_is_empty_type
,
None
,
"extern"
)
queue_is_empty_entry
.
is_cfunction
=
1
queue_is_empty_entry
.
is_cfunction
=
1
...
@@ -654,21 +649,21 @@ def inject_cypclass_refcount_macros():
...
@@ -654,21 +649,21 @@ def inject_cypclass_refcount_macros():
incref_type
=
PyrexTypes
.
CFuncType
(
incref_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_void_type
,
PyrexTypes
.
c_void_type
,
[
[
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
c
onst_c
y_object_type
,
None
)
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
cy_object_type
,
None
)
],
],
nogil
=
1
)
nogil
=
1
)
decref_type
=
PyrexTypes
.
CFuncType
(
decref_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_void_type
,
PyrexTypes
.
c_void_type
,
[
[
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
CReferenceType
(
PyrexTypes
.
c
onst_c
y_object_type
),
None
)
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
CReferenceType
(
PyrexTypes
.
cy_object_type
),
None
)
],
],
nogil
=
1
)
nogil
=
1
)
getref_type
=
PyrexTypes
.
CFuncType
(
getref_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_int_type
,
PyrexTypes
.
c_int_type
,
[
[
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
c
onst_c
y_object_type
,
None
)
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
cy_object_type
,
None
)
],
],
nogil
=
1
)
nogil
=
1
)
...
@@ -679,7 +674,7 @@ def inject_cypclass_lock_macros():
...
@@ -679,7 +674,7 @@ def inject_cypclass_lock_macros():
blocking_macro_type
=
PyrexTypes
.
CFuncType
(
blocking_macro_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_void_type
,
PyrexTypes
.
c_void_type
,
[
[
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
c
onst_c
y_object_type
,
None
)
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
cy_object_type
,
None
)
],
],
nogil
=
1
)
nogil
=
1
)
for
macro
in
(
"Cy_RLOCK"
,
"Cy_WLOCK"
,
"Cy_UNWLOCK"
,
"Cy_UNRLOCK"
):
for
macro
in
(
"Cy_RLOCK"
,
"Cy_WLOCK"
,
"Cy_UNWLOCK"
,
"Cy_UNRLOCK"
):
...
@@ -687,7 +682,7 @@ def inject_cypclass_lock_macros():
...
@@ -687,7 +682,7 @@ def inject_cypclass_lock_macros():
nonblocking_macro_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_int_type
,
nonblocking_macro_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_int_type
,
[
[
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
c
onst_c
y_object_type
,
None
)
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
cy_object_type
,
None
)
],
],
nogil
=
1
)
nogil
=
1
)
for
macro
in
(
"Cy_TRYRLOCK"
,
"Cy_TRYWLOCK"
):
for
macro
in
(
"Cy_TRYRLOCK"
,
"Cy_TRYWLOCK"
):
...
@@ -698,7 +693,7 @@ def inject_cypclass_typecheck_functions():
...
@@ -698,7 +693,7 @@ def inject_cypclass_typecheck_functions():
isinstanceof_type
=
PyrexTypes
.
CFuncType
(
isinstanceof_type
=
PyrexTypes
.
CFuncType
(
PyrexTypes
.
c_int_type
,
PyrexTypes
.
c_int_type
,
[
[
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
c
onst_c
y_object_type
,
None
),
PyrexTypes
.
CFuncTypeArg
(
"obj"
,
PyrexTypes
.
cy_object_type
,
None
),
PyrexTypes
.
CFuncTypeArg
(
"type"
,
template_placeholder_type
,
None
)
PyrexTypes
.
CFuncTypeArg
(
"type"
,
template_placeholder_type
,
None
)
],
],
nogil
=
1
,
nogil
=
1
,
...
...
Cython/Compiler/ExprNodes.py
View file @
0bb6f98b
...
@@ -2894,7 +2894,7 @@ class CppIteratorNode(ExprNode):
...
@@ -2894,7 +2894,7 @@ class CppIteratorNode(ExprNode):
sequence_type
=
self
.
sequence
.
type
sequence_type
=
self
.
sequence
.
type
if
sequence_type
.
is_ptr
:
if
sequence_type
.
is_ptr
:
sequence_type
=
sequence_type
.
base_type
sequence_type
=
sequence_type
.
base_type
if
sequence_type
.
is_const
or
sequence_type
.
is_const_cyp_class
:
if
sequence_type
.
is_const
:
begin
=
sequence_type
.
scope
.
lookup
(
"const_begin"
)
begin
=
sequence_type
.
scope
.
lookup
(
"const_begin"
)
end
=
sequence_type
.
scope
.
lookup
(
"const_end"
)
end
=
sequence_type
.
scope
.
lookup
(
"const_end"
)
if
not
begin
or
begin
.
cname
!=
"begin"
:
if
not
begin
or
begin
.
cname
!=
"begin"
:
...
@@ -13429,9 +13429,6 @@ class PrimaryCmpNode(ExprNode, CmpNode):
...
@@ -13429,9 +13429,6 @@ class PrimaryCmpNode(ExprNode, CmpNode):
common_type
=
PyrexTypes
.
independent_spanning_type
(
type1
,
type2
)
common_type
=
PyrexTypes
.
independent_spanning_type
(
type1
,
type2
)
if
common_type
.
is_error
:
if
common_type
.
is_error
:
common_type
=
PyrexTypes
.
cy_object_type
common_type
=
PyrexTypes
.
cy_object_type
if
type1
.
is_const_cyp_class
or
type2
.
is_const_cyp_class
:
if
not
common_type
.
is_const_cyp_class
:
common_type
=
PyrexTypes
.
cyp_class_const_type
(
common_type
)
# do not analyse the TypecastNode
# do not analyse the TypecastNode
# to ensure a simple pointer cast is used and not a user-defined conversion method
# to ensure a simple pointer cast is used and not a user-defined conversion method
self
.
operand1
=
TypecastNode
(
self
.
operand1
.
pos
,
operand
=
self
.
operand1
,
type
=
common_type
)
self
.
operand1
=
TypecastNode
(
self
.
operand1
.
pos
,
operand
=
self
.
operand1
,
type
=
common_type
)
...
...
Cython/Compiler/Nodes.py
View file @
0bb6f98b
...
@@ -653,8 +653,6 @@ class CFuncDeclaratorNode(CDeclaratorNode):
...
@@ -653,8 +653,6 @@ class CFuncDeclaratorNode(CDeclaratorNode):
directive_locals
=
{}
directive_locals
=
{}
if
nonempty
:
if
nonempty
:
nonempty
-=
1
nonempty
-=
1
if
self
.
is_const_method
and
env
.
is_cyp_class_scope
:
error
(
self
.
pos
,
"The form 'f(self, ...) const' is not allowed for cypclass methods. Use 'f(const self, ...)' instead"
)
func_type_args
=
[]
func_type_args
=
[]
for
i
,
arg_node
in
enumerate
(
self
.
args
):
for
i
,
arg_node
in
enumerate
(
self
.
args
):
name_declarator
,
type
=
arg_node
.
analyse
(
name_declarator
,
type
=
arg_node
.
analyse
(
...
@@ -682,12 +680,8 @@ class CFuncDeclaratorNode(CDeclaratorNode):
...
@@ -682,12 +680,8 @@ class CFuncDeclaratorNode(CDeclaratorNode):
type
=
env
.
parent_type
type
=
env
.
parent_type
elif
i
==
0
and
env
.
is_cyp_class_scope
and
'staticmethod'
not
in
env
.
directives
and
self
.
declared_name
()
!=
"alloc"
:
elif
i
==
0
and
env
.
is_cyp_class_scope
and
'staticmethod'
not
in
env
.
directives
and
self
.
declared_name
()
!=
"alloc"
:
if
self
.
declared_name
()
!=
"__new__"
:
if
self
.
declared_name
()
!=
"__new__"
:
# Accept 'f(const self, ...)' syntax as equivalent to 'f(self, ...) const'
unqualified_type
=
type
if
type
.
is_const_cyp_class
:
self
.
is_const_method
=
True
unqualified_type
=
type
.
const_base_type
# Accept 'f(<qualifier> self, ...) syntax'
# Accept 'f(<qualifier> self, ...) syntax'
unqualified_type
=
type
if
type
.
is_qualified_cyp_class
:
if
type
.
is_qualified_cyp_class
:
self
.
self_qualifier
=
type
.
qualifier
self
.
self_qualifier
=
type
.
qualifier
unqualified_type
=
type
.
qual_base_type
unqualified_type
=
type
.
qual_base_type
...
@@ -1355,10 +1349,11 @@ class CConstOrVolatileTypeNode(CBaseTypeNode):
...
@@ -1355,10 +1349,11 @@ class CConstOrVolatileTypeNode(CBaseTypeNode):
error
(
self
.
pos
,
error
(
self
.
pos
,
"Const/volatile base type cannot be a Python object"
)
"Const/volatile base type cannot be a Python object"
)
if
base
.
is_cyp_class
:
if
base
.
is_cyp_class
:
if
not
self
.
is_const
or
self
.
is_volatile
:
if
self
.
is_const
:
error
(
self
.
pos
,
"Cypclass doesn't support 'volatile' yet"
)
error
(
self
.
pos
,
"Cypclass reference cannot be 'const'"
)
return
base
elif
self
.
is_volatile
:
return
PyrexTypes
.
cyp_class_const_type
(
base
)
error
(
self
.
pos
,
"Cypclass reference cannot be 'volatile'"
)
return
base
return
PyrexTypes
.
c_const_or_volatile_type
(
base
,
self
.
is_const
,
self
.
is_volatile
)
return
PyrexTypes
.
c_const_or_volatile_type
(
base
,
self
.
is_const
,
self
.
is_volatile
)
...
...
Cython/Compiler/Parsing.py
View file @
0bb6f98b
...
@@ -3383,7 +3383,7 @@ def p_c_func_or_var_declaration(s, pos, ctx):
...
@@ -3383,7 +3383,7 @@ def p_c_func_or_var_declaration(s, pos, ctx):
s
.
next
()
s
.
next
()
p_test
(
s
)
# Keep going, but ignore result.
p_test
(
s
)
# Keep going, but ignore result.
if
s
.
sy
==
':'
:
if
s
.
sy
==
':'
:
if
ctx
.
level
not
in
(
'module'
,
'c_class'
,
'module_pxd'
,
'c_class_pxd'
,
'cpp_class'
)
and
not
ctx
.
templates
:
if
ctx
.
level
not
in
(
'module'
,
'c_class'
,
'module_pxd'
,
'c_class_pxd'
,
'cpp_class'
,
'cyp_class'
)
and
not
ctx
.
templates
:
s
.
error
(
"C function definition not allowed here"
)
s
.
error
(
"C function definition not allowed here"
)
doc
,
suite
=
p_suite_with_docstring
(
s
,
Ctx
(
level
=
'function'
))
doc
,
suite
=
p_suite_with_docstring
(
s
,
Ctx
(
level
=
'function'
))
if
'mutable'
in
modifiers
:
if
'mutable'
in
modifiers
:
...
@@ -3877,7 +3877,8 @@ def p_cpp_class_definition(s, pos, ctx):
...
@@ -3877,7 +3877,8 @@ def p_cpp_class_definition(s, pos, ctx):
# so why not on the cppclass itself ?
# so why not on the cppclass itself ?
p_doc_string
(
s
)
p_doc_string
(
s
)
attributes
=
[]
attributes
=
[]
body_ctx
=
Ctx
(
visibility
=
ctx
.
visibility
,
level
=
'cpp_class'
,
nogil
=
nogil
or
ctx
.
nogil
)
body_level
=
'cyp_class'
if
cypclass
else
'cpp_class'
body_ctx
=
Ctx
(
visibility
=
ctx
.
visibility
,
level
=
body_level
,
nogil
=
nogil
or
ctx
.
nogil
)
body_ctx
.
templates
=
template_names
body_ctx
.
templates
=
template_names
while
s
.
sy
!=
'DEDENT'
:
while
s
.
sy
!=
'DEDENT'
:
if
s
.
sy
!=
'pass'
:
if
s
.
sy
!=
'pass'
:
...
...
Cython/Compiler/PyrexTypes.py
View file @
0bb6f98b
...
@@ -258,7 +258,6 @@ class PyrexType(BaseType):
...
@@ -258,7 +258,6 @@ class PyrexType(BaseType):
is_struct_or_union
=
0
is_struct_or_union
=
0
is_cpp_class
=
0
is_cpp_class
=
0
is_cyp_class
=
0
is_cyp_class
=
0
is_const_cyp_class
=
0
is_qualified_cyp_class
=
0
is_qualified_cyp_class
=
0
is_cpp_string
=
0
is_cpp_string
=
0
is_struct
=
0
is_struct
=
0
...
@@ -4671,13 +4670,11 @@ class CypClassType(CppClassType):
...
@@ -4671,13 +4670,11 @@ class CypClassType(CppClassType):
return
"dynamic_cast<%s>(%s)"
%
(
self
.
declaration_code
(
''
),
expr_code
)
return
"dynamic_cast<%s>(%s)"
%
(
self
.
declaration_code
(
''
),
expr_code
)
def
same_as_resolved_type
(
self
,
other_type
):
def
same_as_resolved_type
(
self
,
other_type
):
if
other_type
.
is_
const
_cyp_class
:
if
other_type
.
is_
qualified
_cyp_class
:
return
0
return
0
return
super
(
CypClassType
,
self
).
same_as_resolved_type
(
other_type
)
return
super
(
CypClassType
,
self
).
same_as_resolved_type
(
other_type
)
def
assignable_from_resolved_type
(
self
,
other_type
):
def
assignable_from_resolved_type
(
self
,
other_type
):
if
other_type
.
is_const_cyp_class
:
return
0
if
other_type
.
is_qualified_cyp_class
and
other_type
.
qualifier
!=
'iso~'
:
if
other_type
.
is_qualified_cyp_class
and
other_type
.
qualifier
!=
'iso~'
:
return
0
return
0
if
other_type
.
is_ptr
and
other_type
.
base_type
.
is_cpp_class
and
other_type
.
base_type
.
is_subclass
(
self
)
or
other_type
.
is_null_ptr
:
if
other_type
.
is_ptr
and
other_type
.
base_type
.
is_cpp_class
and
other_type
.
base_type
.
is_subclass
(
self
)
or
other_type
.
is_null_ptr
:
...
@@ -4685,16 +4682,12 @@ class CypClassType(CppClassType):
...
@@ -4685,16 +4682,12 @@ class CypClassType(CppClassType):
return
super
(
CypClassType
,
self
).
assignable_from_resolved_type
(
other_type
)
return
super
(
CypClassType
,
self
).
assignable_from_resolved_type
(
other_type
)
def
is_subclass
(
self
,
other_type
):
def
is_subclass
(
self
,
other_type
):
if
other_type
.
is_const_cyp_class
:
if
other_type
.
is_qualified_cyp_class
:
other_type
=
other_type
.
const_base_type
elif
other_type
.
is_qualified_cyp_class
:
other_type
=
other_type
.
qual_base_type
other_type
=
other_type
.
qual_base_type
return
super
(
CypClassType
,
self
).
is_subclass
(
other_type
)
return
super
(
CypClassType
,
self
).
is_subclass
(
other_type
)
def
subclass_dist
(
self
,
super_type
):
def
subclass_dist
(
self
,
super_type
):
if
super_type
.
is_const_cyp_class
:
if
super_type
.
is_qualified_cyp_class
:
super_type
=
super_type
.
const_base_type
elif
super_type
.
is_qualified_cyp_class
:
super_type
=
super_type
.
qual_base_type
super_type
=
super_type
.
qual_base_type
return
super
(
CypClassType
,
self
).
subclass_dist
(
super_type
)
return
super
(
CypClassType
,
self
).
subclass_dist
(
super_type
)
...
@@ -4753,94 +4746,6 @@ class CypClassType(CppClassType):
...
@@ -4753,94 +4746,6 @@ class CypClassType(CppClassType):
raise
NotImplementedError
(
"Cy_XDECREF_SET is not defined for decrementing a group of cyobjects"
)
raise
NotImplementedError
(
"Cy_XDECREF_SET is not defined for decrementing a group of cyobjects"
)
class
ConstCypclassType
(
BaseType
):
"A const cypclass"
subtypes
=
[
'const_base_type'
]
is_const_cyp_class
=
1
def
__init__
(
self
,
base_type
):
assert
base_type
.
is_cyp_class
self
.
const_base_type
=
base_type
if
base_type
.
has_attributes
and
base_type
.
scope
is
not
None
:
from
.Symtab
import
CConstOrVolatileScope
self
.
scope
=
CConstOrVolatileScope
(
base_type
.
scope
,
is_const
=
1
,
is_volatile
=
0
)
def
__repr__
(
self
):
return
"<ConstCypclassType %s%r>"
%
self
.
const_base_type
def
__str__
(
self
):
return
self
.
declaration_code
(
""
,
for_display
=
1
)
def
declaration_code
(
self
,
entity_code
,
for_display
=
0
,
dll_linkage
=
None
,
pyrex
=
0
,
template_params
=
None
,
deref
=
0
):
return
"const %s"
%
self
.
const_base_type
.
declaration_code
(
entity_code
,
for_display
,
dll_linkage
,
pyrex
,
template_params
,
deref
)
def
empty_declaration_code
(
self
):
if
self
.
_empty_declaration
is
None
:
self
.
_empty_declaration
=
"const %s"
%
self
.
const_base_type
.
empty_declaration_code
()
return
self
.
_empty_declaration
def
cast_code
(
self
,
expr_code
):
return
"((%s)%s)"
%
(
self
.
declaration_code
(
''
),
expr_code
)
def
dynamic_cast_code
(
self
,
expr_code
):
return
"dynamic_cast<%s>(%s)"
%
(
self
.
declaration_code
(
''
),
expr_code
)
def
resolve
(
self
):
base_type
=
self
.
const_base_type
.
resolve
()
if
base_type
==
self
.
const_base_type
:
return
self
return
ConstCypclassType
(
base_type
)
def
specialize
(
self
,
values
):
base_type
=
self
.
const_base_type
.
specialize
(
values
)
if
base_type
==
self
.
const_base_type
:
return
self
return
ConstCypclassType
(
base_type
)
def
as_argument_type
(
self
):
return
self
def
as_returned_type
(
self
):
return
self
def
deduce_template_params
(
self
,
actual
):
return
self
.
const_base_type
.
deduce_template_params
(
actual
)
def
can_coerce_to_pyobject
(
self
,
env
):
return
self
.
const_base_type
.
can_coerce_to_pyobject
(
env
)
def
can_coerce_from_pyobject
(
self
,
env
):
return
self
.
const_base_type
.
can_coerce_from_pyobject
(
env
)
def
create_to_py_utility_code
(
self
,
env
):
if
self
.
const_base_type
.
create_to_py_utility_code
(
env
):
self
.
to_py_function
=
self
.
const_base_type
.
to_py_function
return
True
def
assignable_from
(
self
,
src_type
):
return
self
.
assignable_from_resolved_type
(
src_type
.
resolve
())
def
assignable_from_resolved_type
(
self
,
src_type
):
if
src_type
.
is_const_cyp_class
:
src_type
=
src_type
.
const_base_type
return
self
.
const_base_type
.
assignable_from_resolved_type
(
src_type
)
def
same_as
(
self
,
other_type
):
if
not
other_type
.
is_const_cyp_class
:
return
0
return
self
.
same_as_resolved_type
(
other_type
.
resolve
())
def
same_as_resolved_type
(
self
,
other_type
):
if
other_type
.
is_const_cyp_class
:
return
self
.
const_base_type
.
same_as_resolved_type
(
other_type
.
const_base_type
)
return
0
def
__getattr__
(
self
,
name
):
return
getattr
(
self
.
const_base_type
,
name
)
class
QualifiedCypclassType
(
BaseType
):
class
QualifiedCypclassType
(
BaseType
):
"A qualified cypclass reference"
"A qualified cypclass reference"
...
@@ -5252,7 +5157,6 @@ unspecified_type = UnspecifiedType()
...
@@ -5252,7 +5157,6 @@ unspecified_type = UnspecifiedType()
py_object_type
=
PyObjectType
()
py_object_type
=
PyObjectType
()
cy_object_type
=
CypClassType
(
'cyobject'
,
None
,
"CyObject"
,
None
)
cy_object_type
=
CypClassType
(
'cyobject'
,
None
,
"CyObject"
,
None
)
const_cy_object_type
=
ConstCypclassType
(
cy_object_type
)
c_void_type
=
CVoidType
()
c_void_type
=
CVoidType
()
...
@@ -5881,13 +5785,6 @@ def c_const_or_volatile_type(base_type, is_const, is_volatile):
...
@@ -5881,13 +5785,6 @@ def c_const_or_volatile_type(base_type, is_const, is_volatile):
else
:
else
:
return
CConstOrVolatileType
(
base_type
,
is_const
,
is_volatile
)
return
CConstOrVolatileType
(
base_type
,
is_const
,
is_volatile
)
def
cyp_class_const_type
(
base_type
):
# Construct a Cypclass const type.
if
base_type
is
error_type
:
return
error_type
else
:
return
ConstCypclassType
(
base_type
)
def
cyp_class_qualified_type
(
base_type
,
qualifier
):
def
cyp_class_qualified_type
(
base_type
,
qualifier
):
# Construct a qualified cypclass type.
# Construct a qualified cypclass type.
if
base_type
is
error_type
:
if
base_type
is
error_type
:
...
@@ -5929,10 +5826,6 @@ def ptr_to_subtype_of(type1, type2):
...
@@ -5929,10 +5826,6 @@ def ptr_to_subtype_of(type1, type2):
def
ptr_to_same_without_cv
(
type1
,
type2
):
def
ptr_to_same_without_cv
(
type1
,
type2
):
if
type1
.
is_cyp_class
and
type2
.
is_cyp_class
:
if
type1
.
is_cyp_class
and
type2
.
is_cyp_class
:
if
type1
.
is_const_cyp_class
:
type1
=
type1
.
const_base_type
if
type2
.
is_const_cyp_class
:
type2
=
type2
.
const_base_type
return
same_type
(
type1
,
type2
)
return
same_type
(
type1
,
type2
)
elif
type1
.
is_ptr
and
type2
.
is_ptr
:
elif
type1
.
is_ptr
and
type2
.
is_ptr
:
type1
=
type1
.
base_type
type1
=
type1
.
base_type
...
...
Cython/Compiler/Symtab.py
View file @
0bb6f98b
...
@@ -564,12 +564,6 @@ class Scope(object):
...
@@ -564,12 +564,6 @@ class Scope(object):
cpp_override_allowed
=
True
cpp_override_allowed
=
True
continue
continue
# allow const overloads
if
alt_type
.
is_const_method
!=
type
.
is_const_method
:
error
(
pos
,
"Cypclass method const-overloads another method: not supported yet"
)
cpp_override_allowed
=
True
continue
elif
alt_entry
.
is_inherited
:
elif
alt_entry
.
is_inherited
:
# if the arguments are compatible, then the signatures need to actually be the
# if the arguments are compatible, then the signatures need to actually be the
...
...
Cython/Includes/libcythonplus/dict.pxd
View file @
0bb6f98b
...
@@ -125,26 +125,26 @@ cdef cypclass cypdict[K, V]:
...
@@ -125,26 +125,26 @@ cdef cypclass cypdict[K, V]:
ctypedef
V
value_type
ctypedef
V
value_type
ctypedef
pair
[
key_type
,
value_type
]
item_type
ctypedef
pair
[
key_type
,
value_type
]
item_type
ctypedef
vector
[
item_type
].
size_type
size_type
ctypedef
vector
[
item_type
].
size_type
size_type
ctypedef
dict_key_iterator_t
[
c
onst
c
ypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
key_type
]
iterator
ctypedef
dict_key_iterator_t
[
cypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
key_type
]
iterator
ctypedef
dict_keys_view_t
[
c
onst
c
ypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
key_type
]
keys_view
ctypedef
dict_keys_view_t
[
cypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
key_type
]
keys_view
ctypedef
dict_values_view_t
[
c
onst
c
ypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
value_type
]
values_view
ctypedef
dict_values_view_t
[
cypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
value_type
]
values_view
ctypedef
dict_items_view_t
[
c
onst
c
ypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
item_type
]
items_view
ctypedef
dict_items_view_t
[
cypdict
[
K
,
V
],
vector
[
item_type
].
const_iterator
,
item_type
]
items_view
vector
[
item_type
]
_items
vector
[
item_type
]
_items
unordered_map
[
key_type
,
size_type
]
_indices
unordered_map
[
key_type
,
size_type
]
_indices
mutable
atomic
[
int
]
_active_iterators
atomic
[
int
]
_active_iterators
__init__
(
self
):
__init__
(
self
):
self
.
_active_iterators
.
store
(
0
)
self
.
_active_iterators
.
store
(
0
)
V
__getitem__
(
const
self
,
const
key_type
key
)
except
~
:
V
__getitem__
(
self
,
key_type
key
)
except
~
:
it
=
self
.
_indices
.
const_find
(
key
)
it
=
self
.
_indices
.
const_find
(
key
)
if
it
!=
self
.
_indices
.
end
():
if
it
!=
self
.
_indices
.
end
():
return
self
.
_items
[
dereference
(
it
).
second
].
second
return
self
.
_items
[
dereference
(
it
).
second
].
second
with
gil
:
with
gil
:
raise
KeyError
(
"Getting nonexistent item"
)
raise
KeyError
(
"Getting nonexistent item"
)
void
__setitem__
(
self
,
const
key_type
key
,
const
value_type
value
)
except
~
:
void
__setitem__
(
self
,
key_type
key
,
value_type
value
)
except
~
:
it
=
self
.
_indices
.
find
(
key
)
it
=
self
.
_indices
.
find
(
key
)
if
it
!=
self
.
_indices
.
end
():
if
it
!=
self
.
_indices
.
end
():
index
=
dereference
(
it
).
second
index
=
dereference
(
it
).
second
...
@@ -156,7 +156,7 @@ cdef cypclass cypdict[K, V]:
...
@@ -156,7 +156,7 @@ cdef cypclass cypdict[K, V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a dictionary with active iterators"
)
raise
RuntimeError
(
"Modifying a dictionary with active iterators"
)
void
__delitem__
(
self
,
const
key_type
key
)
except
~
:
void
__delitem__
(
self
,
key_type
key
)
except
~
:
it
=
self
.
_indices
.
find
(
key
)
it
=
self
.
_indices
.
find
(
key
)
if
it
==
self
.
_indices
.
end
():
if
it
==
self
.
_indices
.
end
():
with
gil
:
with
gil
:
...
@@ -170,7 +170,7 @@ cdef cypclass cypdict[K, V]:
...
@@ -170,7 +170,7 @@ cdef cypclass cypdict[K, V]:
self
.
_items
[
index
]
=
self
.
_items
[
self
.
_indices
.
size
()
-
1
]
self
.
_items
[
index
]
=
self
.
_items
[
self
.
_indices
.
size
()
-
1
]
self
.
_items
.
pop_back
()
self
.
_items
.
pop_back
()
void
update
(
self
,
c
onst
c
ypdict
[
K
,
V
]
other
)
except
~
:
void
update
(
self
,
cypdict
[
K
,
V
]
other
)
except
~
:
for
item
in
other
.
items
():
for
item
in
other
.
items
():
self
[
item
.
first
]
=
item
.
second
self
[
item
.
first
]
=
item
.
second
...
@@ -182,23 +182,23 @@ cdef cypclass cypdict[K, V]:
...
@@ -182,23 +182,23 @@ cdef cypclass cypdict[K, V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a dictionary with active iterators"
)
raise
RuntimeError
(
"Modifying a dictionary with active iterators"
)
iterator
begin
(
const
self
):
iterator
begin
(
self
):
return
iterator
(
self
.
_items
.
const_begin
(),
self
)
return
iterator
(
self
.
_items
.
const_begin
(),
self
)
vector
[
item_type
].
const_iterator
end
(
const
self
):
vector
[
item_type
].
const_iterator
end
(
self
):
return
self
.
_items
.
const_end
()
return
self
.
_items
.
const_end
()
size_type
__len__
(
const
self
):
size_type
__len__
(
self
):
return
self
.
_items
.
size
()
return
self
.
_items
.
size
()
bint
__contains__
(
const
self
,
const
key_type
key
):
bint
__contains__
(
self
,
key_type
key
):
return
self
.
_indices
.
count
(
key
)
return
self
.
_indices
.
count
(
key
)
keys_view
keys
(
const
self
):
keys_view
keys
(
self
):
return
keys_view
(
self
)
return
keys_view
(
self
)
values_view
values
(
const
self
):
values_view
values
(
self
):
return
values_view
(
self
)
return
values_view
(
self
)
items_view
items
(
const
self
):
items_view
items
(
self
):
return
items_view
(
self
)
return
items_view
(
self
)
Cython/Includes/libcythonplus/list.pxd
View file @
0bb6f98b
...
@@ -18,7 +18,7 @@ cdef extern from * nogil:
...
@@ -18,7 +18,7 @@ cdef extern from * nogil:
cdef
cppclass
list_iterator_t
[
list_t
,
base_iterator_t
,
reference_t
]:
cdef
cppclass
list_iterator_t
[
list_t
,
base_iterator_t
,
reference_t
]:
list_iterator_t
()
list_iterator_t
()
list_iterator_t
(
base_iterator_t
)
list_iterator_t
(
base_iterator_t
)
list_iterator_t
(
base_iterator_t
,
const
list_t
)
list_iterator_t
(
base_iterator_t
,
list_t
)
reference_t
operator
*
()
reference_t
operator
*
()
list_iterator_t
operator
++
()
list_iterator_t
operator
++
()
bint
operator
!=
(
base_iterator_t
)
bint
operator
!=
(
base_iterator_t
)
...
@@ -26,22 +26,22 @@ cdef extern from * nogil:
...
@@ -26,22 +26,22 @@ cdef extern from * nogil:
cdef
cypclass
cyplist
[
V
]:
cdef
cypclass
cyplist
[
V
]:
ctypedef
V
value_type
ctypedef
V
value_type
ctypedef
vector
[
value_type
].
size_type
size_type
ctypedef
vector
[
value_type
].
size_type
size_type
ctypedef
list_iterator_t
[
c
onst
c
yplist
[
V
],
vector
[
value_type
].
const_iterator
,
value_type
]
iterator
ctypedef
list_iterator_t
[
cyplist
[
V
],
vector
[
value_type
].
const_iterator
,
value_type
]
iterator
vector
[
value_type
]
_elements
vector
[
value_type
]
_elements
mutable
atomic
[
int
]
_active_iterators
atomic
[
int
]
_active_iterators
__init__
(
self
):
__init__
(
self
):
self
.
_active_iterators
.
store
(
0
)
self
.
_active_iterators
.
store
(
0
)
V
__getitem__
(
const
self
,
const
size_type
index
)
except
~
:
V
__getitem__
(
self
,
size_type
index
)
except
~
:
if
index
<
self
.
_elements
.
size
():
if
index
<
self
.
_elements
.
size
():
return
self
.
_elements
[
index
]
return
self
.
_elements
[
index
]
else
:
else
:
with
gil
:
with
gil
:
raise
IndexError
(
"Getting list index out of range"
)
raise
IndexError
(
"Getting list index out of range"
)
void
__setitem__
(
self
,
size_type
index
,
const
value_type
value
)
except
~
:
void
__setitem__
(
self
,
size_type
index
,
value_type
value
)
except
~
:
if
index
<
self
.
_elements
.
size
():
if
index
<
self
.
_elements
.
size
():
self
.
_elements
[
index
]
=
value
self
.
_elements
[
index
]
=
value
else
:
else
:
...
@@ -60,14 +60,14 @@ cdef cypclass cyplist[V]:
...
@@ -60,14 +60,14 @@ cdef cypclass cyplist[V]:
with
gil
:
with
gil
:
raise
IndexError
(
"Deleting list index out of range"
)
raise
IndexError
(
"Deleting list index out of range"
)
void
append
(
self
,
const
value_type
value
)
except
~
:
void
append
(
self
,
value_type
value
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
self
.
_elements
.
push_back
(
value
)
self
.
_elements
.
push_back
(
value
)
else
:
else
:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a list with active iterators"
)
raise
RuntimeError
(
"Modifying a list with active iterators"
)
void
insert
(
self
,
size_type
index
,
const
value_type
value
)
except
~
:
void
insert
(
self
,
size_type
index
,
value_type
value
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
if
index
<=
self
.
_elements
.
size
():
if
index
<=
self
.
_elements
.
size
():
it
=
self
.
_elements
.
begin
()
+
index
it
=
self
.
_elements
.
begin
()
+
index
...
@@ -86,14 +86,14 @@ cdef cypclass cyplist[V]:
...
@@ -86,14 +86,14 @@ cdef cypclass cyplist[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a list with active iterators"
)
raise
RuntimeError
(
"Modifying a list with active iterators"
)
cyplist
[
V
]
__add__
(
const
self
,
const
cyplist
[
V
]
other
):
cyplist
[
V
]
__add__
(
self
,
cyplist
[
V
]
other
):
result
=
cyplist
[
V
]()
result
=
cyplist
[
V
]()
result
.
_elements
.
reserve
(
self
.
_elements
.
size
()
+
other
.
_elements
.
size
())
result
.
_elements
.
reserve
(
self
.
_elements
.
size
()
+
other
.
_elements
.
size
())
result
.
_elements
.
insert
(
result
.
_elements
.
end
(),
self
.
_elements
.
const_begin
(),
self
.
_elements
.
const_end
())
result
.
_elements
.
insert
(
result
.
_elements
.
end
(),
self
.
_elements
.
const_begin
(),
self
.
_elements
.
const_end
())
result
.
_elements
.
insert
(
result
.
_elements
.
end
(),
other
.
_elements
.
const_begin
(),
other
.
_elements
.
const_end
())
result
.
_elements
.
insert
(
result
.
_elements
.
end
(),
other
.
_elements
.
const_begin
(),
other
.
_elements
.
const_end
())
return
result
return
result
cyplist
[
V
]
__iadd__
(
self
,
c
onst
c
yplist
[
V
]
other
):
cyplist
[
V
]
__iadd__
(
self
,
cyplist
[
V
]
other
):
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
self
.
_elements
.
insert
(
self
.
_elements
.
end
(),
other
.
_elements
.
const_begin
(),
other
.
_elements
.
const_end
())
self
.
_elements
.
insert
(
self
.
_elements
.
end
(),
other
.
_elements
.
const_begin
(),
other
.
_elements
.
const_end
())
return
self
return
self
...
@@ -101,7 +101,7 @@ cdef cypclass cyplist[V]:
...
@@ -101,7 +101,7 @@ cdef cypclass cyplist[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a list with active iterators"
)
raise
RuntimeError
(
"Modifying a list with active iterators"
)
cyplist
[
V
]
__mul__
(
const
self
,
size_type
n
):
cyplist
[
V
]
__mul__
(
self
,
size_type
n
):
result
=
cyplist
[
V
]()
result
=
cyplist
[
V
]()
result
.
_elements
.
reserve
(
self
.
_elements
.
size
()
*
n
)
result
.
_elements
.
reserve
(
self
.
_elements
.
size
()
*
n
)
for
i
in
range
(
n
):
for
i
in
range
(
n
):
...
@@ -125,16 +125,16 @@ cdef cypclass cyplist[V]:
...
@@ -125,16 +125,16 @@ cdef cypclass cyplist[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a list with active iterators"
)
raise
RuntimeError
(
"Modifying a list with active iterators"
)
iterator
begin
(
const
self
):
iterator
begin
(
self
):
return
iterator
(
self
.
_elements
.
const_begin
(),
self
)
return
iterator
(
self
.
_elements
.
const_begin
(),
self
)
vector
[
value_type
].
const_iterator
end
(
const
self
):
vector
[
value_type
].
const_iterator
end
(
self
):
return
self
.
_elements
.
const_end
()
return
self
.
_elements
.
const_end
()
size_type
__len__
(
const
self
):
size_type
__len__
(
self
):
return
self
.
_elements
.
size
()
return
self
.
_elements
.
size
()
bint
__contains__
(
const
self
,
const
value_type
value
):
bint
__contains__
(
self
,
value_type
value
):
for
v
in
self
.
_elements
:
for
v
in
self
.
_elements
:
if
value
is
v
:
if
value
is
v
:
return
1
return
1
...
...
Cython/Includes/libcythonplus/set.pxd
View file @
0bb6f98b
...
@@ -19,7 +19,7 @@ cdef extern from * nogil:
...
@@ -19,7 +19,7 @@ cdef extern from * nogil:
cdef
cppclass
set_iterator_t
[
set_t
,
base_iterator_t
,
reference_t
]:
cdef
cppclass
set_iterator_t
[
set_t
,
base_iterator_t
,
reference_t
]:
set_iterator_t
()
set_iterator_t
()
set_iterator_t
(
base_iterator_t
)
set_iterator_t
(
base_iterator_t
)
set_iterator_t
(
base_iterator_t
,
const
set_t
)
set_iterator_t
(
base_iterator_t
,
set_t
)
reference_t
operator
*
()
reference_t
operator
*
()
set_iterator_t
operator
++
()
set_iterator_t
operator
++
()
bint
operator
!=
(
base_iterator_t
)
bint
operator
!=
(
base_iterator_t
)
...
@@ -27,24 +27,24 @@ cdef extern from * nogil:
...
@@ -27,24 +27,24 @@ cdef extern from * nogil:
cdef
cypclass
cypset
[
V
]:
cdef
cypclass
cypset
[
V
]:
ctypedef
V
value_type
ctypedef
V
value_type
ctypedef
size_t
size_type
ctypedef
size_t
size_type
ctypedef
set_iterator_t
[
c
onst
c
ypset
[
V
],
unordered_set
[
value_type
].
const_iterator
,
value_type
]
iterator
ctypedef
set_iterator_t
[
cypset
[
V
],
unordered_set
[
value_type
].
const_iterator
,
value_type
]
iterator
unordered_set
[
value_type
]
_elements
unordered_set
[
value_type
]
_elements
mutable
atomic
[
int
]
_active_iterators
atomic
[
int
]
_active_iterators
__init__
(
self
):
__init__
(
self
):
self
.
_active_iterators
.
store
(
0
)
self
.
_active_iterators
.
store
(
0
)
# set elementary operations
# set elementary operations
void
add
(
self
,
const
value_type
value
)
except
~
:
void
add
(
self
,
value_type
value
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
self
.
_elements
.
insert
(
value
)
self
.
_elements
.
insert
(
value
)
else
:
else
:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a set with active iterators"
)
raise
RuntimeError
(
"Modifying a set with active iterators"
)
void
remove
(
self
,
const
value_type
value
)
except
~
:
void
remove
(
self
,
value_type
value
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
if
self
.
_elements
.
erase
(
value
)
==
0
:
if
self
.
_elements
.
erase
(
value
)
==
0
:
with
gil
:
with
gil
:
...
@@ -53,7 +53,7 @@ cdef cypclass cypset[V]:
...
@@ -53,7 +53,7 @@ cdef cypclass cypset[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a set with active iterators"
)
raise
RuntimeError
(
"Modifying a set with active iterators"
)
void
discard
(
self
,
const
value_type
value
)
except
~
:
void
discard
(
self
,
value_type
value
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
self
.
_elements
.
erase
(
value
)
self
.
_elements
.
erase
(
value
)
else
:
else
:
...
@@ -79,15 +79,15 @@ cdef cypclass cypset[V]:
...
@@ -79,15 +79,15 @@ cdef cypclass cypset[V]:
# inspection operations
# inspection operations
size_type
__len__
(
const
self
):
size_type
__len__
(
self
):
return
self
.
_elements
.
size
()
return
self
.
_elements
.
size
()
bint
__contains__
(
const
self
,
const
value_type
value
):
bint
__contains__
(
self
,
value_type
value
):
return
self
.
_elements
.
count
(
value
)
return
self
.
_elements
.
count
(
value
)
bint
isdisjoint
(
const
self
,
const
cypset
[
V
]
other
):
bint
isdisjoint
(
self
,
cypset
[
V
]
other
):
cdef
c
onst
c
ypset
[
V
]
smallest
cdef
cypset
[
V
]
smallest
cdef
c
onst
c
ypset
[
V
]
greatest
cdef
cypset
[
V
]
greatest
if
self
.
_elements
.
size
()
<
other
.
_elements
.
size
():
if
self
.
_elements
.
size
()
<
other
.
_elements
.
size
():
smallest
=
self
smallest
=
self
greatest
=
other
greatest
=
other
...
@@ -101,7 +101,7 @@ cdef cypclass cypset[V]:
...
@@ -101,7 +101,7 @@ cdef cypclass cypset[V]:
# set comparisons
# set comparisons
bint
__eq__
(
const
self
,
const
cypset
[
V
]
other
):
bint
__eq__
(
self
,
cypset
[
V
]
other
):
if
self
.
_elements
.
size
()
!=
other
.
_elements
.
size
():
if
self
.
_elements
.
size
()
!=
other
.
_elements
.
size
():
return
0
return
0
for
value
in
self
.
_elements
:
for
value
in
self
.
_elements
:
...
@@ -109,7 +109,7 @@ cdef cypclass cypset[V]:
...
@@ -109,7 +109,7 @@ cdef cypclass cypset[V]:
return
0
return
0
return
1
return
1
bint
__ne__
(
const
self
,
const
cypset
[
V
]
other
):
bint
__ne__
(
self
,
cypset
[
V
]
other
):
if
self
.
_elements
.
size
()
!=
other
.
_elements
.
size
():
if
self
.
_elements
.
size
()
!=
other
.
_elements
.
size
():
return
1
return
1
for
value
in
self
.
_elements
:
for
value
in
self
.
_elements
:
...
@@ -117,7 +117,7 @@ cdef cypclass cypset[V]:
...
@@ -117,7 +117,7 @@ cdef cypclass cypset[V]:
return
1
return
1
return
0
return
0
bint
__le__
(
const
self
,
const
cypset
[
V
]
other
):
bint
__le__
(
self
,
cypset
[
V
]
other
):
if
self
.
_elements
.
size
()
>
other
.
_elements
.
size
():
if
self
.
_elements
.
size
()
>
other
.
_elements
.
size
():
return
0
return
0
for
value
in
self
.
_elements
:
for
value
in
self
.
_elements
:
...
@@ -125,13 +125,13 @@ cdef cypclass cypset[V]:
...
@@ -125,13 +125,13 @@ cdef cypclass cypset[V]:
return
0
return
0
return
1
return
1
bint
__lt__
(
const
self
,
const
cypset
[
V
]
other
):
bint
__lt__
(
self
,
cypset
[
V
]
other
):
return
self
<=
other
and
self
.
_elements
.
size
()
<
other
.
_elements
.
size
()
return
self
<=
other
and
self
.
_elements
.
size
()
<
other
.
_elements
.
size
()
bint
issubset
(
const
self
,
const
cypset
[
V
]
other
):
bint
issubset
(
self
,
cypset
[
V
]
other
):
return
self
<=
other
return
self
<=
other
bint
__ge__
(
const
self
,
const
cypset
[
V
]
other
):
bint
__ge__
(
self
,
cypset
[
V
]
other
):
if
self
.
_elements
.
size
()
<
other
.
_elements
.
size
():
if
self
.
_elements
.
size
()
<
other
.
_elements
.
size
():
return
0
return
0
for
value
in
other
.
_elements
:
for
value
in
other
.
_elements
:
...
@@ -139,27 +139,27 @@ cdef cypclass cypset[V]:
...
@@ -139,27 +139,27 @@ cdef cypclass cypset[V]:
return
0
return
0
return
1
return
1
bint
__gt__
(
const
self
,
const
cypset
[
V
]
other
):
bint
__gt__
(
self
,
cypset
[
V
]
other
):
return
self
>=
other
and
self
.
_elements
.
size
()
>
other
.
_elements
.
size
()
return
self
>=
other
and
self
.
_elements
.
size
()
>
other
.
_elements
.
size
()
bint
issuperset
(
const
self
,
const
cypset
[
V
]
other
):
bint
issuperset
(
self
,
cypset
[
V
]
other
):
return
self
>=
other
return
self
>=
other
# set non-modifying operations
# set non-modifying operations
cypset
[
V
]
__or__
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
__or__
(
self
,
cypset
[
V
]
other
):
result
=
cypset
[
V
]()
result
=
cypset
[
V
]()
result
.
_elements
.
insert
(
self
.
_elements
.
const_begin
(),
self
.
_elements
.
const_end
())
result
.
_elements
.
insert
(
self
.
_elements
.
const_begin
(),
self
.
_elements
.
const_end
())
result
.
_elements
.
insert
(
other
.
_elements
.
const_begin
(),
other
.
_elements
.
const_end
())
result
.
_elements
.
insert
(
other
.
_elements
.
const_begin
(),
other
.
_elements
.
const_end
())
return
result
return
result
cypset
[
V
]
union
"set_union"
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
union
"set_union"
(
self
,
cypset
[
V
]
other
):
return
self
|
other
return
self
|
other
cypset
[
V
]
__and__
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
__and__
(
self
,
cypset
[
V
]
other
):
cdef
c
onst
c
ypset
[
V
]
smallest
cdef
cypset
[
V
]
smallest
cdef
c
onst
c
ypset
[
V
]
greatest
cdef
cypset
[
V
]
greatest
if
self
.
_elements
.
size
()
<
other
.
_elements
.
size
():
if
self
.
_elements
.
size
()
<
other
.
_elements
.
size
():
smallest
=
self
smallest
=
self
greatest
=
other
greatest
=
other
...
@@ -172,20 +172,20 @@ cdef cypclass cypset[V]:
...
@@ -172,20 +172,20 @@ cdef cypclass cypset[V]:
result
.
_elements
.
insert
(
value
)
result
.
_elements
.
insert
(
value
)
return
result
return
result
cypset
[
V
]
intersection
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
intersection
(
self
,
cypset
[
V
]
other
):
return
self
&
other
return
self
&
other
cypset
[
V
]
__sub__
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
__sub__
(
self
,
cypset
[
V
]
other
):
result
=
cypset
[
V
]()
result
=
cypset
[
V
]()
for
value
in
self
.
_elements
:
for
value
in
self
.
_elements
:
if
other
.
_elements
.
count
(
value
)
==
0
:
if
other
.
_elements
.
count
(
value
)
==
0
:
result
.
_elements
.
insert
(
value
)
result
.
_elements
.
insert
(
value
)
return
result
return
result
cypset
[
V
]
difference
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
difference
(
self
,
cypset
[
V
]
other
):
return
self
-
other
return
self
-
other
cypset
[
V
]
__xor__
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
__xor__
(
self
,
cypset
[
V
]
other
):
result
=
cypset
[
V
]()
result
=
cypset
[
V
]()
result
.
_elements
=
other
.
_elements
result
.
_elements
=
other
.
_elements
for
value
in
self
.
_elements
:
for
value
in
self
.
_elements
:
...
@@ -196,13 +196,13 @@ cdef cypclass cypset[V]:
...
@@ -196,13 +196,13 @@ cdef cypclass cypset[V]:
result
.
_elements
.
insert
(
value
)
result
.
_elements
.
insert
(
value
)
return
result
return
result
cypset
[
V
]
symmetric_difference
(
const
self
,
const
cypset
[
V
]
other
):
cypset
[
V
]
symmetric_difference
(
self
,
cypset
[
V
]
other
):
return
self
^
other
return
self
^
other
# set in-place (modifying) operations
# set in-place (modifying) operations
cypset
[
V
]
__ior__
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
__ior__
(
self
,
cypset
[
V
]
other
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
self
.
_elements
.
insert
(
other
.
_elements
.
const_begin
(),
other
.
_elements
.
end
())
self
.
_elements
.
insert
(
other
.
_elements
.
const_begin
(),
other
.
_elements
.
end
())
return
self
return
self
...
@@ -210,11 +210,11 @@ cdef cypclass cypset[V]:
...
@@ -210,11 +210,11 @@ cdef cypclass cypset[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a set with active iterators"
)
raise
RuntimeError
(
"Modifying a set with active iterators"
)
cypset
[
V
]
update
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
update
(
self
,
cypset
[
V
]
other
)
except
~
:
self
|=
other
self
|=
other
return
self
return
self
cypset
[
V
]
__iand__
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
__iand__
(
self
,
cypset
[
V
]
other
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
it
=
self
.
_elements
.
begin
()
it
=
self
.
_elements
.
begin
()
end
=
self
.
_elements
.
end
()
end
=
self
.
_elements
.
end
()
...
@@ -229,11 +229,11 @@ cdef cypclass cypset[V]:
...
@@ -229,11 +229,11 @@ cdef cypclass cypset[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a set with active iterators"
)
raise
RuntimeError
(
"Modifying a set with active iterators"
)
cypset
[
V
]
intersection_update
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
intersection_update
(
self
,
cypset
[
V
]
other
)
except
~
:
self
&=
other
self
&=
other
return
self
return
self
cypset
[
V
]
__isub__
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
__isub__
(
self
,
cypset
[
V
]
other
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
for
value
in
other
.
_elements
:
for
value
in
other
.
_elements
:
self
.
_elements
.
erase
(
value
)
self
.
_elements
.
erase
(
value
)
...
@@ -242,11 +242,11 @@ cdef cypclass cypset[V]:
...
@@ -242,11 +242,11 @@ cdef cypclass cypset[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a set with active iterators"
)
raise
RuntimeError
(
"Modifying a set with active iterators"
)
cypset
[
V
]
difference_update
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
difference_update
(
self
,
cypset
[
V
]
other
)
except
~
:
self
-=
other
self
-=
other
return
self
return
self
cypset
[
V
]
__ixor__
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
__ixor__
(
self
,
cypset
[
V
]
other
)
except
~
:
if
self
.
_active_iterators
==
0
:
if
self
.
_active_iterators
==
0
:
for
value
in
other
.
_elements
:
for
value
in
other
.
_elements
:
if
self
.
_elements
.
erase
(
value
)
==
0
:
if
self
.
_elements
.
erase
(
value
)
==
0
:
...
@@ -255,14 +255,14 @@ cdef cypclass cypset[V]:
...
@@ -255,14 +255,14 @@ cdef cypclass cypset[V]:
with
gil
:
with
gil
:
raise
RuntimeError
(
"Modifying a set with active iterators"
)
raise
RuntimeError
(
"Modifying a set with active iterators"
)
cypset
[
V
]
symmetric_difference_update
(
self
,
c
onst
c
ypset
[
V
]
other
)
except
~
:
cypset
[
V
]
symmetric_difference_update
(
self
,
cypset
[
V
]
other
)
except
~
:
self
^=
other
self
^=
other
return
self
return
self
# iterators
# iterators
iterator
begin
(
const
self
):
iterator
begin
(
self
):
return
iterator
(
self
.
_elements
.
const_begin
(),
self
)
return
iterator
(
self
.
_elements
.
const_begin
(),
self
)
unordered_set
[
value_type
].
const_iterator
end
(
const
self
):
unordered_set
[
value_type
].
const_iterator
end
(
self
):
return
self
.
_elements
.
const_end
()
return
self
.
_elements
.
const_end
()
Cython/Utility/CyObjects.cpp
View file @
0bb6f98b
...
@@ -364,9 +364,9 @@
...
@@ -364,9 +364,9 @@
struct
ActhonResultInterface
:
public
CyObject
{
struct
ActhonResultInterface
:
public
CyObject
{
virtual
void
pushVoidStarResult
(
void
*
result
)
=
0
;
virtual
void
pushVoidStarResult
(
void
*
result
)
=
0
;
virtual
void
*
getVoidStarResult
()
const
=
0
;
virtual
void
*
getVoidStarResult
()
=
0
;
virtual
void
pushIntResult
(
int
result
)
=
0
;
virtual
void
pushIntResult
(
int
result
)
=
0
;
virtual
int
getIntResult
()
const
=
0
;
virtual
int
getIntResult
()
=
0
;
operator
int
()
{
return
this
->
getIntResult
();
}
operator
int
()
{
return
this
->
getIntResult
();
}
operator
void
*
()
{
return
this
->
getVoidStarResult
();
}
operator
void
*
()
{
return
this
->
getVoidStarResult
();
}
};
};
...
@@ -374,8 +374,8 @@
...
@@ -374,8 +374,8 @@
struct
ActhonMessageInterface
;
struct
ActhonMessageInterface
;
struct
ActhonSyncInterface
:
public
CyObject
{
struct
ActhonSyncInterface
:
public
CyObject
{
virtual
int
isActivable
()
const
=
0
;
virtual
int
isActivable
()
=
0
;
virtual
int
isCompleted
()
const
=
0
;
virtual
int
isCompleted
()
=
0
;
virtual
void
insertActivity
()
=
0
;
virtual
void
insertActivity
()
=
0
;
virtual
void
removeActivity
()
=
0
;
virtual
void
removeActivity
()
=
0
;
};
};
...
@@ -391,7 +391,7 @@
...
@@ -391,7 +391,7 @@
struct
ActhonQueueInterface
:
public
CyObject
{
struct
ActhonQueueInterface
:
public
CyObject
{
virtual
void
push
(
ActhonMessageInterface
*
message
)
=
0
;
virtual
void
push
(
ActhonMessageInterface
*
message
)
=
0
;
virtual
int
activate
()
=
0
;
virtual
int
activate
()
=
0
;
virtual
int
is_empty
()
const
=
0
;
virtual
int
is_empty
()
=
0
;
};
};
struct
ActhonActivableClass
:
public
CyObject
{
struct
ActhonActivableClass
:
public
CyObject
{
...
...
tests/run/cypclass_acthon.pyx
View file @
0bb6f98b
...
@@ -23,7 +23,7 @@ cdef cypclass BasicQueue(ActhonQueueInterface):
...
@@ -23,7 +23,7 @@ cdef cypclass BasicQueue(ActhonQueueInterface):
__dealloc__
(
self
):
__dealloc__
(
self
):
del
self
.
_queue
del
self
.
_queue
bint
is_empty
(
const
self
):
bint
is_empty
(
self
):
return
self
.
_queue
.
empty
()
return
self
.
_queue
.
empty
()
void
push
(
locked
self
,
ActhonMessageInterface
message
):
void
push
(
locked
self
,
ActhonMessageInterface
message
):
...
@@ -58,9 +58,9 @@ cdef cypclass NoneResult(ActhonResultInterface):
...
@@ -58,9 +58,9 @@ cdef cypclass NoneResult(ActhonResultInterface):
pass
pass
void
pushIntResult
(
self
,
int
result
):
void
pushIntResult
(
self
,
int
result
):
pass
pass
void
*
getVoidStarResult
(
const
self
):
void
*
getVoidStarResult
(
self
):
return
NULL
return
NULL
int
getIntResult
(
const
self
):
int
getIntResult
(
self
):
return
0
return
0
cdef
cypclass
WaitResult
(
ActhonResultInterface
):
cdef
cypclass
WaitResult
(
ActhonResultInterface
):
...
@@ -89,18 +89,17 @@ cdef cypclass WaitResult(ActhonResultInterface):
...
@@ -89,18 +89,17 @@ cdef cypclass WaitResult(ActhonResultInterface):
self
.
result
.
int_val
=
result
self
.
result
.
int_val
=
result
sem_post
(
&
self
.
semaphore
)
sem_post
(
&
self
.
semaphore
)
result_t
_getRawResult
(
const
self
):
result_t
_getRawResult
(
self
):
# We must ensure a result exists, but we can let others access it immediately
# We must ensure a result exists, but we can let others access it immediately
# The cast here is a way of const-casting (we're modifying the semaphore in a const method)
sem_wait
(
&
self
.
semaphore
)
sem_wait
(
<
sem_t
*>
&
self
.
semaphore
)
sem_post
(
&
self
.
semaphore
)
sem_post
(
<
sem_t
*>
&
self
.
semaphore
)
return
self
.
result
return
self
.
result
void
*
getVoidStarResult
(
const
self
):
void
*
getVoidStarResult
(
self
):
res
=
self
.
_getRawResult
()
res
=
self
.
_getRawResult
()
return
res
.
ptr
return
res
.
ptr
int
getIntResult
(
const
self
):
int
getIntResult
(
self
):
res
=
self
.
_getRawResult
()
res
=
self
.
_getRawResult
()
return
res
.
int_val
return
res
.
int_val
...
@@ -118,10 +117,10 @@ cdef cypclass ActivityCounterSync(ActhonSyncInterface):
...
@@ -118,10 +117,10 @@ cdef cypclass ActivityCounterSync(ActhonSyncInterface):
void
removeActivity
(
self
):
void
removeActivity
(
self
):
self
.
count
-=
1
self
.
count
-=
1
bint
isCompleted
(
const
self
):
bint
isCompleted
(
self
):
return
self
.
count
==
0
return
self
.
count
==
0
bint
isActivable
(
const
self
):
bint
isActivable
(
self
):
cdef
bint
res
=
True
cdef
bint
res
=
True
if
self
.
previous_sync
is
not
NULL
:
if
self
.
previous_sync
is
not
NULL
:
prev_sync
=
self
.
previous_sync
prev_sync
=
self
.
previous_sync
...
@@ -135,7 +134,7 @@ cdef cypclass A activable:
...
@@ -135,7 +134,7 @@ cdef cypclass A activable:
self
.
a
=
0
self
.
a
=
0
self
.
_active_result_class
=
WaitResult
.
construct
self
.
_active_result_class
=
WaitResult
.
construct
self
.
_active_queue_class
=
consume
BasicQueue
()
self
.
_active_queue_class
=
consume
BasicQueue
()
int
getter
(
const
self
):
int
getter
(
self
):
return
self
.
a
return
self
.
a
void
setter
(
self
,
int
a
):
void
setter
(
self
,
int
a
):
self
.
a
=
a
self
.
a
=
a
...
...
tests/run/cypclass_is.pyx
View file @
0bb6f98b
...
@@ -21,14 +21,3 @@ def test_is_cypclass():
...
@@ -21,14 +21,3 @@ def test_is_cypclass():
r
=
<
RightBase
>
d
r
=
<
RightBase
>
d
return
d
is
d
,
l
is
d
,
r
is
d
,
l
is
r
return
d
is
d
,
l
is
d
,
r
is
d
,
l
is
r
def
test_is_cypclass_const
():
"""
>>> test_is_cypclass_const()
(True, True, True, True)
"""
cdef
const
Derived
d
=
Derived
()
cdef
const
LeftBase
l
=
<
LeftBase
>
d
cdef
const
RightBase
r
=
<
RightBase
>
d
return
d
is
d
,
l
is
d
,
r
is
d
,
l
is
r
tests/run/cypclass_isinstanceof.pyx
View file @
0bb6f98b
...
@@ -26,22 +26,3 @@ def test_insinstanceof():
...
@@ -26,22 +26,3 @@ def test_insinstanceof():
cdef
int
r6
=
isinstanceof
[
Derived
](
derived
)
cdef
int
r6
=
isinstanceof
[
Derived
](
derived
)
print
(
r1
,
r2
,
r3
,
r4
,
r5
,
r6
)
print
(
r1
,
r2
,
r3
,
r4
,
r5
,
r6
)
def
test_const_insinstanceof
():
"""
>>> test_const_insinstanceof()
(1, 1, 1, 0, 1, 1)
"""
cdef
const
Base
base
=
Base
()
cdef
const
Base
derived_as_base
=
Derived
()
cdef
const
Derived
derived
=
Derived
()
cdef
int
r1
=
isinstanceof
[
Base
](
base
)
cdef
int
r2
=
isinstanceof
[
Base
](
derived_as_base
)
cdef
int
r3
=
isinstanceof
[
Base
](
derived
)
cdef
int
r4
=
isinstanceof
[
Derived
](
base
)
cdef
int
r5
=
isinstanceof
[
Derived
](
derived_as_base
)
cdef
int
r6
=
isinstanceof
[
Derived
](
derived
)
print
(
r1
,
r2
,
r3
,
r4
,
r5
,
r6
)
tests/run/cypclass_operator_refcount.pyx
View file @
0bb6f98b
...
@@ -105,7 +105,7 @@ cdef cypclass Subscript:
...
@@ -105,7 +105,7 @@ cdef cypclass Subscript:
self
.
value
=
NULL
self
.
value
=
NULL
self
.
index
=
NULL
self
.
index
=
NULL
Value
__getitem__
(
const
self
,
Index
index
):
Value
__getitem__
(
self
,
Index
index
):
if
self
.
index
is
index
:
if
self
.
index
is
index
:
return
value
return
value
return
NULL
return
NULL
...
...
tests/run/cypclass_operators_more.pyx
View file @
0bb6f98b
...
@@ -175,7 +175,7 @@ cdef cypclass Subscript:
...
@@ -175,7 +175,7 @@ cdef cypclass Subscript:
self
.
value
=
NULL
self
.
value
=
NULL
self
.
index
=
NULL
self
.
index
=
NULL
Value
__getitem__
(
const
self
,
Index
index
):
Value
__getitem__
(
self
,
Index
index
):
if
self
.
index
is
index
:
if
self
.
index
is
index
:
return
value
return
value
return
NULL
return
NULL
...
...
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