Fix bug #252, mangle illegal optional c argument names. 0.12.alpha0
authorRobert Bradshaw <robertwb@math.washington.edu>
Thu, 5 Nov 2009 05:41:14 +0000 (21:41 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Thu, 5 Nov 2009 05:41:14 +0000 (21:41 -0800)
Cython/Compiler/ExprNodes.py
Cython/Compiler/Nodes.py
Cython/Compiler/PyrexTypes.py
tests/bugs.txt
tests/run/bad_c_struct_T252.pyx

index bd6b2ff88dd2cae9abbc4bd0526cdc88770b21ca..bc05047b66e653f41ae49e72b2ba3a6b6b5ca53d 100644 (file)
@@ -2572,7 +2572,7 @@ class SimpleCallNode(CallNode):
                 for formal_arg, actual_arg in args[expected_nargs:actual_nargs]:
                     code.putln("%s.%s = %s;" % (
                             self.opt_arg_struct,
-                            formal_arg.name,
+                            func_type.opt_arg_cname(formal_arg.name),
                             actual_arg.result_as(formal_arg.type)))
             exc_checks = []
             if self.type.is_pyobject:
index 386e58eb015b34ddcc32c17086d7def7d88ef75b..dd9036566306045fb37c8551470edf8d3884aac8 100644 (file)
@@ -1473,13 +1473,11 @@ class CFuncDefNode(FuncDefNode):
             code.putln('if (%s) {' % Naming.optional_args_cname)
             for arg in self.args:
                 if arg.default:
-                    # FIXME: simple name prefixing doesn't work when
-                    # argument name mangling is in place
                     code.putln('if (%s->%sn > %s) {' % (Naming.optional_args_cname, Naming.pyrex_prefix, i))
                     declarator = arg.declarator
                     while not hasattr(declarator, 'name'):
                         declarator = declarator.base
-                    code.putln('%s = %s->%s;' % (arg.cname, Naming.optional_args_cname, declarator.name))
+                    code.putln('%s = %s->%s;' % (arg.cname, Naming.optional_args_cname, self.type.opt_arg_cname(declarator.name)))
                     i += 1
             for _ in range(self.type.optional_arg_count):
                 code.putln('}')
index 05ee6380423db6129a21da27f615d42a88b1b3fd..a50760a4e1072bba4001a4fef533bc428bb5abf1 100644 (file)
@@ -1535,6 +1535,9 @@ class CFuncType(CType):
     def signature_cast_string(self):
         s = self.declaration_code("(*)", with_calling_convention=False)
         return '(%s)' % s
+    
+    def opt_arg_cname(self, arg_name):
+        return self.op_arg_struct.base_type.scope.lookup(arg_name).cname
 
 
 class CFuncTypeArg(object):
index 31d6ff3a85e7a844e75046f3a61098b3c86cf220..23dca0c7b4b73e717d6a2e9fbd763bd074fc219f 100644 (file)
@@ -5,5 +5,4 @@ methodmangling_T5
 class_attribute_init_values_T18
 numpy_ValueError_T172
 unsignedbehaviour_T184
-bad_c_struct_T252
 missing_baseclass_in_predecl_T262
index e011ec2d3c43d79067af9283a6708ab6f6d061b4..2b457f235d16615d3c2aa867ffcc59525cd9a158 100644 (file)
@@ -1,10 +1,10 @@
 cdef cf(default=None):
     return default
 
-cpdef cpf(default=None):
+cpdef cpf(default=100):
     """
     >>> cpf()
-    None
+    100
     >>> cpf(1)
     1
     >>> cpf(default=2)
@@ -13,10 +13,10 @@ cpdef cpf(default=None):
     default = cf(default)
     return default
 
-def pf(default=None):
+def pf(default=100):
     """
     >>> pf()
-    None
+    100
     >>> pf(1)
     1
     >>> pf(default=2)