Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #203 from vmx/const-pointer

Add support for const pointers
  • Loading branch information...
commit 37ceab84816c5805a7a10476d03590981fe4302c 2 parents 7538ecd + 5e14973
@robertwb robertwb authored
View
13 Cython/Compiler/Nodes.py
@@ -713,6 +713,19 @@ def declare_optional_arg_struct(self, func_type, env, fused_cname=None):
func_type.op_arg_struct = PyrexTypes.c_ptr_type(op_args_struct.type)
+class CConstDeclaratorNode(CDeclaratorNode):
+ # base CDeclaratorNode
+
+ child_attrs = ["base"]
+
+ def analyse(self, base_type, env, nonempty = 0):
+ if base_type.is_pyobject:
+ error(self.pos,
+ "Const base type cannot be a Python object")
+ const = PyrexTypes.c_const_type(base_type)
+ return self.base.analyse(const, env, nonempty = nonempty)
+
+
class CArgDeclNode(Node):
# Item in a function declaration argument list.
#
View
16 Cython/Compiler/Parsing.py
@@ -2366,9 +2366,19 @@ def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
calling_convention = p_calling_convention(s)
if s.sy == '*':
s.next()
- base = p_c_declarator(s, ctx, empty = empty, is_type = is_type,
- cmethod_flag = cmethod_flag,
- assignable = assignable, nonempty = nonempty)
+ if s.systring == 'const':
+ const_pos = s.position()
+ s.next()
+ const_base = p_c_declarator(s, ctx, empty = empty,
+ is_type = is_type,
+ cmethod_flag = cmethod_flag,
+ assignable = assignable,
+ nonempty = nonempty)
+ base = Nodes.CConstDeclaratorNode(const_pos, base = const_base)
+ else:
+ base = p_c_declarator(s, ctx, empty = empty, is_type = is_type,
+ cmethod_flag = cmethod_flag,
+ assignable = assignable, nonempty = nonempty)
result = Nodes.CPtrDeclaratorNode(pos,
base = base)
elif s.sy == '**': # scanner returns this as a single token
View
5 tests/compile/const_decl.pyx
@@ -1,11 +1,12 @@
# mode: compile
-cdef const_args(const int a, const int *b, const (int*) c):
+cdef const_args(const int a, const int *b, const (int*) c, int *const d):
print a
print b[0]
b = NULL # OK, the pointer itself is not const
c[0] = 4 # OK, the value is not const
+ d[0] = 7 # OK, the value is not const
def call_const_args(x):
cdef int k = x
- const_args(x, &k, &k)
+ const_args(x, &k, &k, &k)
View
15 tests/errors/const_decl_errors.pyx
@@ -10,17 +10,22 @@ cdef const int x = 10
cdef struct S:
int member
-cdef func(const int a, const int* b, const (int*) c, const S s):
+cdef func(const int a, const int* b, const (int*) c, const S s, int *const d,
+ const S *const t):
a = 10
c = NULL
b[0] = 100
s.member = 1000
+ d = NULL
+ t = &s
_ERRORS = """
3:5: Const base type cannot be a Python object
8:5: Assignment to const 'x'
-14:6: Assignment to const 'a'
-15:6: Assignment to const 'c'
-16:5: Assignment to const dereference
-17:5: Assignment to const attribute 'member'
+15:6: Assignment to const 'a'
+16:6: Assignment to const 'c'
+17:5: Assignment to const dereference
+18:5: Assignment to const attribute 'member'
+19:6: Assignment to const 'd'
+20:6: Assignment to const 't'
"""
Please sign in to comment.
Something went wrong with that request. Please try again.