Use C++ style constructor declarations rather than __init__.
authorRobert Bradshaw <robertwb@math.washington.edu>
Tue, 15 Dec 2009 10:36:32 +0000 (02:36 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Tue, 15 Dec 2009 10:36:32 +0000 (02:36 -0800)
Cython/Compiler/ExprNodes.py
Cython/Compiler/Symtab.py
tests/compile/cpp_templates.pyx
tests/run/cpp_classes.pyx

index 9ab2b259d11c0e72e9b6ed4b1e868badea17f7f6..5381666acb031ed4d4aba8e8a2e219203f2bdf16 100755 (executable)
@@ -1095,12 +1095,12 @@ class NewExprNode(AtomicExprNode):
             type = entry.type.specialize_here(self.pos, template_types)
         else:
             type = entry.type
-        constructor = type.scope.lookup(u'__init__')
+        constructor = type.scope.lookup(u'<init>')
         if constructor is None:
             return_type = PyrexTypes.CFuncType(type, [])
             return_type = PyrexTypes.CPtrType(return_type)
-            type.scope.declare_cfunction(u'__init__', return_type, self.pos)
-            constructor = type.scope.lookup(u'__init__')
+            type.scope.declare_cfunction(u'<init>', return_type, self.pos)
+            constructor = type.scope.lookup(u'<init>')
         self.class_type = type
         self.entry = constructor
         self.type = constructor.type
@@ -4282,8 +4282,7 @@ class NumBinopNode(BinopNode):
         entry = env.lookup(type1.name)
         function = entry.type.scope.lookup("operator%s" % self.operator)
         if not function:
-            error(self.pos, "'%s' operator not defined for '%s %s %s'"
-                % (self.operator, type1, self.operator, type2))
+            self.type_error()
             return
         entry = PyrexTypes.best_match([self.operand1, self.operand2], function.all_alternatives(), self.pos)
         if entry is None:
@@ -4981,8 +4980,8 @@ class PrimaryCmpNode(NewTempExprNode, CmpNode):
         entry = env.lookup(type1.name)
         function = entry.type.scope.lookup("operator%s" % self.operator)
         if not function:
-            error(self.pos, "'%s' operator not defined for '%s %s %s'"
-                % (self.operator, type1, self.operator, type2))
+            error(self.pos, "Invalid types for '%s' (%s, %s)" %
+                (self.operator, type1, type2))
             return
         entry = PyrexTypes.best_match([self.operand1, self.operand2], function.all_alternatives(), self.pos)
         if entry is None:
index e26f35c88cb3a2229f55caf1dca974befd51d8f3..0be550e879a87b6735fc3e3d23a8491a8e008a73 100644 (file)
@@ -1634,6 +1634,8 @@ class CppClassScope(Scope):
     def declare_cfunction(self, name, type, pos,
             cname = None, visibility = 'extern', defining = 0,
             api = 0, in_pxd = 0, modifiers = ()):
+        if name == self.name.split('::')[-1] and cname is None:
+            name = '<init>'
         entry = self.declare_var(name, type, pos, cname, visibility)
 
     def declare_inherited_cpp_attributes(self, base_scope):
index fb1b2cc3eba2f7cbd7cd815dbe156f53e6491bd0..2476a530c2e2a240a99e94534b60c2c8d71fd2ee 100644 (file)
@@ -1,12 +1,12 @@
 cdef extern from "templates.h":
     cdef cppclass TemplateTest1[T]:
-        __init__()
+        TemplateTest1()
         T value
         int t
         T getValue()
 
     cdef cppclass TemplateTest2[T, U]:
-        __init__()
+        TemplateTest2()
         T value1
         U value2
         T getValue1()
index 84cbfaa03ceed7eeb4369e605fddc00b8c2cd86d..5e5747df03f2f11000ae08663c1f858f2b9de964 100644 (file)
@@ -14,16 +14,16 @@ cdef extern from "shapes.h" namespace shapes:
     
     cdef cppclass Circle(Shape):
         int radius
-        __init__(int)
+        Circle(int)
     
     cdef cppclass Rectangle(Shape):
         int width
         int height
-        __init__(int, int)
+        Rectangle(int, int)
     
     cdef cppclass Square(Rectangle):
         int side
-        __init__(int)
+        Square(int)
         
     int constructor_count, destructor_count