cpp () operator
authorRobert Bradshaw <robertwb@math.washington.edu>
Sat, 16 Jan 2010 02:14:56 +0000 (18:14 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Sat, 16 Jan 2010 02:14:56 +0000 (18:14 -0800)
Cython/Compiler/ExprNodes.py
Cython/Compiler/Parsing.py
tests/run/cpp_operators.pyx
tests/run/cpp_operators_helper.h

index 6e9388b69f787f0b8b31b0d679a2722ad408af5b..ffbacdec3c9b645c97d9c44fbdf660247d834351 100755 (executable)
@@ -2579,7 +2579,15 @@ class SimpleCallNode(CallNode):
         return func_type
     
     def analyse_c_function_call(self, env):
-        entry = PyrexTypes.best_match(self.args, self.function.entry.all_alternatives(), self.pos)
+        if self.function.type.is_cpp_class:
+            function = self.function.type.scope.lookup("operator()")
+            if function is None:
+                self.type = PyrexTypes.error_type
+                self.result_code = "<error>"
+                return
+        else:
+            function = self.function.entry
+        entry = PyrexTypes.best_match(self.args, function.all_alternatives(), self.pos)
         if not entry:
             self.type = PyrexTypes.error_type
             self.result_code = "<error>"
index b1dd18473e05f75b2cefd339f97a72c16be9962a..a2bab2881cb6e1b9bf1ad58d6b782fc5ef63ea0c 100644 (file)
@@ -2061,7 +2061,7 @@ supported_overloaded_operators = set([
     '+', '-', '*', '/', '%', 
     '++', '--', '~', '|', '&', '^', '<<', '>>',
     '==', '!=', '>=', '>', '<=', '<',
-    '[]',
+    '[]', '()',
 ])
 
 def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
index d1b8500765bfd3be69da22fb2f8e0d0c900d2efe..cdce50e8ea65464c3e504817f64fdb3180f2aed3 100644 (file)
@@ -34,6 +34,9 @@ cdef extern from "cpp_operators_helper.h":
         char* operator>(int)
         char* operator<(int)
 
+        char* operator[](int)
+        char* operator()(int)
+
 def test_unops():
     """
     >>> test_unops()
@@ -111,3 +114,14 @@ def test_cmp():
     print t[0] <= 1
     print t[0] < 1
     del t
+
+def test_index_call():
+    """
+    >>> test_index_call()
+    binary []
+    binary ()
+    """
+    cdef TestOps* t = new TestOps()
+    print t[0][100]
+    print t[0](100)
+    del t
index f85218e1dff445fd095c8aef0ee6d78351dabd15..b8372f2722705ec19cc8736854bc6ba7e12e47e0 100644 (file)
@@ -38,4 +38,7 @@ public:
     BIN_OP(>=);
     BIN_OP(>);
 
+    BIN_OP([]);
+    BIN_OP(());
+
 };