Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: 
Changeset: r62731:1f13a64d358d
Date: 2013-03-24 23:54 -0700
http://bitbucket.org/pypy/pypy/changeset/1f13a64d358d/

Log:    merge

diff --git a/rpython/rlib/signature.py b/rpython/rlib/signature.py
--- a/rpython/rlib/signature.py
+++ b/rpython/rlib/signature.py
@@ -38,3 +38,13 @@
             paramtypes, returntype = attr._signature_
             attr._signature_ = (tuple(fix(t) for t in paramtypes), 
fix(returntype))
     return cls
+
+
+class FieldSpec(object):
+    def __init__(self, tp):
+        pass
+
+
+class ClassSpec(object):
+    def __init__(self, fields, inherit=False):
+        pass
diff --git a/rpython/rlib/test/test_signature.py 
b/rpython/rlib/test/test_signature.py
--- a/rpython/rlib/test/test_signature.py
+++ b/rpython/rlib/test/test_signature.py
@@ -1,5 +1,5 @@
 import py
-from rpython.rlib.signature import signature, finishsigs
+from rpython.rlib.signature import signature, finishsigs, FieldSpec, ClassSpec
 from rpython.rlib import types
 from rpython.annotator import model
 from rpython.translator.translator import TranslationContext, graphof
@@ -284,3 +284,64 @@
     exc = py.test.raises(Exception, annotate_at, cannot_add_string).value
     assert 'Blocked block' in repr(exc.args)
     assert 'cannot_add_string' in repr(exc.args)
+
+
+
+@py.test.mark.xfail
+def test_class_basic():
+    class C(object):
+        _fields_ = ClassSpec({'x': FieldSpec(types.int)})
+
+    def wrong_type():
+        c = C()
+        c.x = 'a'
+    check_annotator_fails(wrong_type)
+
+    def bad_field():
+        c = C()
+        c.y = 3
+    check_annotator_fails(bad_field)
+
+
+@py.test.mark.xfail
+def test_class_shorthand():
+    class C1(object):
+        _fields_ = {'x': FieldSpec(types.int)}
+    def wrong_type_1():
+        c = C1()
+        c.x = 'a'
+    check_annotator_fails(wrong_type_1)
+
+    class C2(object):
+        _fields_ = ClassSpec({'x': types.int})
+    def wrong_type_2():
+        c = C2()
+        c.x = 'a'
+    check_annotator_fails(wrong_type_1)
+
+
+@py.test.mark.xfail
+def test_class_inherit():
+    class C(object):
+        _fields_ = ClassSpec({'x': FieldSpec(types.int)})
+
+    class C1(object):
+        _fields_ = ClassSpec({'y': FieldSpec(types.int)})
+
+    class C2(object):
+        _fields_ = ClassSpec({'y': FieldSpec(types.int)}, inherit=True)
+
+    def no_inherit():
+        c = C1()
+        c.x = 3
+    check_annotator_fails(no_inherit)
+
+    def good():
+        c = C2()
+        c.x = 3
+    annotate_at(good)
+
+    def wrong_type():
+        c = C2()
+        c.x = 'a'
+    check_annotator_fails(wrong_type)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to