Author: Simon Cross <[email protected]>
Branch: remove-string-smm
Changeset: r63428:5446bd20e6cc
Date: 2013-04-16 22:07 +0200
http://bitbucket.org/pypy/pypy/changeset/5446bd20e6cc/

Log:    Add gateway_chr_w and 'chr' unwrap spec type (fijal, hodgestar)

diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1367,6 +1367,26 @@
                             self.wrap("integer argument expected, got float"))
         return self.int_w(self.int(w_obj))
 
+    def gateway_chr_w(self, w_obj):
+        """Accept string of length 1 or an integer that can be cast to chr
+        """
+        if self.isinstance_w(w_obj, self.w_str):
+            c = self.str_w(w_obj)
+            if len(c) != 1:
+                raise OperationError(self.w_ValueError,
+                                     self.wrap("string must be of size 1"))
+            return c[0]
+        elif self.isinstance_w(w_obj, self.w_int):
+            i = self.int_w(w_obj)
+            if i < 0 or i > 255:
+                raise OperationError(
+                    self.w_ValueError,
+                    self.wrap("byte must be in range(0, 256)"))
+            return chr(i)
+        raise OperationError(
+            self.w_TypeError,
+            self.wrap("an integer or string of size 1 is required"))
+
     def gateway_float_w(self, w_obj):
         return self.float_w(self.float(w_obj))
 
diff --git a/pypy/interpreter/gateway.py b/pypy/interpreter/gateway.py
--- a/pypy/interpreter/gateway.py
+++ b/pypy/interpreter/gateway.py
@@ -129,6 +129,9 @@
     def visit_bufferstr(self, el, app_sig):
         self.checked_space_method(el, app_sig)
 
+    def visit_chr(self, el, app_sig):
+        self.checked_space_method(el, app_sig)
+
     def visit_str_or_None(self, el, app_sig):
         self.checked_space_method(el, app_sig)
 
@@ -242,6 +245,9 @@
     def visit_bufferstr(self, typ):
         self.run_args.append("space.bufferstr_w(%s)" % (self.scopenext(),))
 
+    def visit_chr(self, typ):
+        self.run_args.append("space.gateway_chr_w(%s)" % (self.scopenext(),))
+
     def visit_str_or_None(self, typ):
         self.run_args.append("space.str_or_None_w(%s)" % (self.scopenext(),))
 
@@ -379,6 +385,9 @@
     def visit_bufferstr(self, typ):
         self.unwrap.append("space.bufferstr_w(%s)" % (self.nextarg(),))
 
+    def visit_chr(self, typ):
+        self.unwrap.append("space.gateway_chr_w(%s)" % (self.nextarg(),))
+
     def visit_str_or_None(self, typ):
         self.unwrap.append("space.str_or_None_w(%s)" % (self.nextarg(),))
 
diff --git a/pypy/interpreter/test/test_gateway.py 
b/pypy/interpreter/test/test_gateway.py
--- a/pypy/interpreter/test/test_gateway.py
+++ b/pypy/interpreter/test/test_gateway.py
@@ -238,6 +238,28 @@
         assert self.space.eq_w(space.call_function(w_app_g, space.wrap(True)),
                                space.wrap(True))
 
+    def test_interp2app_unwrap_spec_chr(self):
+        space = self.space
+
+        def g(space, c):
+            return space.wrap(c)
+
+        app_g = gateway.interp2app(g, unwrap_spec=[gateway.ObjSpace, 'chr'])
+        w_app_g = space.wrap(app_g)
+        assert space.str_w(
+            space.call_function(w_app_g, space.wrap(1))) == chr(1)
+        assert space.str_w(
+            space.call_function(w_app_g, space.wrap('a'))) == 'a'
+
+        space.raises_w(space.w_ValueError,
+                       space.call_function, w_app_g, space.wrap('ab'))
+        space.raises_w(space.w_ValueError,
+                       space.call_function, w_app_g, space.wrap(256))
+        space.raises_w(space.w_ValueError,
+                       space.call_function, w_app_g, space.wrap(-1))
+        space.raises_w(space.w_TypeError,
+                       space.call_function, w_app_g, space.w_None)
+
     def test_caching_methods(self):
         class Base(gateway.W_Root):
             def f(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to