Commit 468cc9c1 authored by Robert Bradshaw's avatar Robert Bradshaw

Fix wrapping of pointer types.

Of course it's "cdef char *foo()" not "cdef char* foo()"
parent 1cd370dc
...@@ -1271,13 +1271,12 @@ class CVarDefNode(StatNode): ...@@ -1271,13 +1271,12 @@ class CVarDefNode(StatNode):
"Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). " + "Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). " +
"Each pointer declaration should be on its own line.", 1) "Each pointer declaration should be on its own line.", 1)
create_extern_wrapper = False create_extern_wrapper = (self.overridable
and self.visibility == 'extern'
and env.is_module_scope)
if create_extern_wrapper:
declarator.overridable = False
if isinstance(declarator, CFuncDeclaratorNode): if isinstance(declarator, CFuncDeclaratorNode):
create_extern_wrapper = (self.overridable
and self.visibility == 'extern'
and env.is_module_scope)
if create_extern_wrapper:
declarator.overridable = False
name_declarator, type = declarator.analyse(base_type, env, directive_locals=self.directive_locals) name_declarator, type = declarator.analyse(base_type, env, directive_locals=self.directive_locals)
else: else:
name_declarator, type = declarator.analyse(base_type, env) name_declarator, type = declarator.analyse(base_type, env)
......
...@@ -1236,7 +1236,10 @@ class CConstType(BaseType): ...@@ -1236,7 +1236,10 @@ class CConstType(BaseType):
def declaration_code(self, entity_code, def declaration_code(self, entity_code,
for_display = 0, dll_linkage = None, pyrex = 0): for_display = 0, dll_linkage = None, pyrex = 0):
return self.const_base_type.declaration_code("const %s" % entity_code, for_display, dll_linkage, pyrex) if for_display or pyrex:
return "const " + self.const_base_type.declaration_code(entity_code, for_display, dll_linkage, pyrex)
else:
return self.const_base_type.declaration_code("const %s" % entity_code, for_display, dll_linkage, pyrex)
def specialize(self, values): def specialize(self, values):
base_type = self.const_base_type.specialize(values) base_type = self.const_base_type.specialize(values)
......
# cython: c_string_type=str
# cython: c_string_encoding=ascii
cdef extern from "math.h": cdef extern from "math.h":
cpdef double pxd_sqrt "sqrt"(double) cpdef double pxd_sqrt "sqrt"(double)
# cython: c_string_type=str
# cython: c_string_encoding=ascii
__doc__ = """ __doc__ = """
>>> sqrt(1) >>> sqrt(1)
1.0 1.0
...@@ -7,10 +10,17 @@ __doc__ = """ ...@@ -7,10 +10,17 @@ __doc__ = """
3.0 3.0
>>> log(10) >>> log(10)
Traceback (most recent call last): Traceback (most recent call last):
...
NameError: name 'log' is not defined NameError: name 'log' is not defined
>>> strchr('abcabc', ord('c'))
'cabc'
""" """
cdef extern from "math.h": cdef extern from "math.h":
cpdef double sqrt(double) cpdef double sqrt(double)
cpdef double pyx_sqrt "sqrt"(double) cpdef double pyx_sqrt "sqrt"(double)
cdef double log(double) # not wrapped cdef double log(double) # not wrapped
cdef extern from "string.h":
cpdef char* strchr(const char *haystack, int needle);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment