More operator overloading parsing/testing.
authorRobert Bradshaw <robertwb@math.washington.edu>
Fri, 15 Jan 2010 01:54:55 +0000 (17:54 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Fri, 15 Jan 2010 01:54:55 +0000 (17:54 -0800)
Cython/Compiler/Parsing.py
tests/run/cpp_operators.pyx
tests/run/cpp_operators_helper.h

index 9d0ffecbc6659f813f6652b28f1f15e3c2c03800..a683ed81b89d04d58d8597332fbc9fd73a9ca40a 100644 (file)
@@ -2058,7 +2058,7 @@ def p_c_func_declarator(s, pos, ctx, base, cmethod_flag):
         exception_value = exc_val, exception_check = exc_check,
         nogil = nogil or ctx.nogil or with_gil, with_gil = with_gil)
 
-supported_overloaded_operators = set(['+', '-', '*', '/', '%', '++', '--', '~', '<<', '>>' ])
+supported_overloaded_operators = set(['+', '-', '*', '/', '%', '++', '--', '~', '|', '&', '^', '<<', '>>' ])
 
 def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
                           assignable, nonempty):
@@ -2113,9 +2113,12 @@ def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
                 s.expect(']')
                 op = '[]'
             s.next()
-            if op in ['-', '+'] and s.sy == op:
+            if op in ['-', '+', '|', '&'] and s.sy == op:
                 op = op*2
                 s.next()
+            if s.sy == '=':
+                op += s.sy
+                s.next()
             if op not in supported_overloaded_operators:
                 s.error("Overloading operator '%s' not yet supported." % op)
             name = name+op
index 338b355f5d0adf2ec23fa47fbf3ef124889587d1..380f3f7f089c65b5e0ea3bd289d38a6116c88d69 100644 (file)
@@ -20,13 +20,20 @@ cdef extern from "cpp_operators_helper.h":
         char* operator/(int)
         char* operator%(int)
 
+        char* operator|(int)
+        char* operator&(int)
+        char* operator^(int)
+
+        char* operator<<(int)
+        char* operator>>(int)
+
 def test_unops():
     """
     >>> test_unops()
-    unary+
-    unary-
-    unary~
-    unary*
+    unary +
+    unary -
+    unary ~
+    unary *
     """
     cdef TestOps* t = new TestOps()
     print +t[0]
@@ -38,10 +45,10 @@ def test_unops():
 def test_incdec():
     """
     >>> test_incdec()
-    unary++
-    unary--
-    post++
-    post--
+    unary ++
+    unary --
+    post ++
+    post --
     """
     cdef TestOps* t = new TestOps()
     print cython.preincrement(t[0])
@@ -53,11 +60,16 @@ def test_incdec():
 def test_binop():
     """
     >>> test_binop()
-    binary+
-    binary-
-    binary*
-    binary/
-    binary%
+    binary +
+    binary -
+    binary *
+    binary /
+    binary %
+    binary &
+    binary |
+    binary ^
+    binary <<
+    binary >>
     """
     cdef TestOps* t = new TestOps()
     print t[0] + 1
@@ -65,4 +77,11 @@ def test_binop():
     print t[0] * 1
     print t[0] / 1
     print t[0] % 1
+    
+    print t[0] & 1
+    print t[0] | 1
+    print t[0] ^ 1
+    
+    print t[0] << 1
+    print t[0] >> 1
     del t
index 545266af32dad9f4ca41c5b7f20c6e7ea57925ff..769f3e7c6b3c11073c65a0e2c874bd255ac78e0f 100644 (file)
@@ -1,6 +1,6 @@
-#define UN_OP(op) const char* operator op () { return "unary"#op; }
-#define POST_UN_OP(op) const char* operator op (int x) { return "post"#op; }
-#define BIN_OP(op) const char* operator op (int x) { return "binary"#op; }
+#define UN_OP(op) const char* operator op () { return "unary "#op; }
+#define POST_UN_OP(op) const char* operator op (int x) { return "post "#op; }
+#define BIN_OP(op) const char* operator op (int x) { return "binary "#op; }
 
 class TestOps {
 
@@ -23,5 +23,12 @@ public:
     BIN_OP(*);
     BIN_OP(/);
     BIN_OP(%);
+
+    BIN_OP(<<);
+    BIN_OP(>>);
+    
+    BIN_OP(|);
+    BIN_OP(&);
+    BIN_OP(^);
     
 };