[pypy-svn] r75665 - in pypy/branch/interplevel-codecs/pypy: interpreter interpreter/pyparser module/_codecs objspace/std

afa at codespeak.net afa at codespeak.net
Tue Jun 29 17:46:52 CEST 2010


Author: afa
Date: Tue Jun 29 17:46:51 2010
New Revision: 75665

Modified:
   pypy/branch/interplevel-codecs/pypy/interpreter/pyparser/parsestring.py
   pypy/branch/interplevel-codecs/pypy/interpreter/unicodehelper.py
   pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py
   pypy/branch/interplevel-codecs/pypy/objspace/std/marshal_impl.py
Log:
Simplify interpreter/unicodehelper.py, now it calls functions in interp_codecs, 
and avoids applevel code.

rlib.runicode can't be used directly, we need app-level exceptions.


Modified: pypy/branch/interplevel-codecs/pypy/interpreter/pyparser/parsestring.py
==============================================================================
--- pypy/branch/interplevel-codecs/pypy/interpreter/pyparser/parsestring.py	(original)
+++ pypy/branch/interplevel-codecs/pypy/interpreter/pyparser/parsestring.py	Tue Jun 29 17:46:51 2010
@@ -72,12 +72,12 @@
             bufp = 0
             bufq = len(buf)
         assert 0 <= bufp <= bufq
-        w_substr = space.wrap(buf[bufp : bufq])
+        substr = buf[bufp:bufq]
         if rawmode:
-            w_v = unicodehelper.PyUnicode_DecodeRawUnicodeEscape(space, w_substr)
+            v = unicodehelper.PyUnicode_DecodeRawUnicodeEscape(space, substr)
         else:
-            w_v = unicodehelper.PyUnicode_DecodeUnicodeEscape(space, w_substr)
-        return w_v
+            v = unicodehelper.PyUnicode_DecodeUnicodeEscape(space, substr)
+        return space.wrap(v)
 
     need_encoding = (encoding is not None and
                      encoding != "utf-8" and encoding != "iso-8859-1")
@@ -86,7 +86,7 @@
     substr = s[ps : q]
     if rawmode or '\\' not in s[ps:]:
         if need_encoding:
-            w_u = unicodehelper.PyUnicode_DecodeUTF8(space, space.wrap(substr))
+            w_u = space.wrap(unicodehelper.PyUnicode_DecodeUTF8(space, substr))
             #w_v = space.wrap(space.unwrap(w_u).encode(encoding)) this works
             w_v = unicodehelper.PyUnicode_AsEncodedString(space, w_u, space.wrap(encoding))
             return w_v
@@ -200,7 +200,7 @@
     # while (s < end && *s != '\\') s++; */ /* inefficient for u".."
     while ps < end and ord(s[ps]) & 0x80:
         ps += 1
-    w_u = unicodehelper.PyUnicode_DecodeUTF8(space, space.wrap(s[pt : ps]))
+    w_u = space.wrap(unicodehelper.PyUnicode_DecodeUTF8(space, s[pt:ps]))
     w_v = unicodehelper.PyUnicode_AsEncodedString(space, w_u, space.wrap(encoding))
     v = space.str_w(w_v)
     return v, ps

Modified: pypy/branch/interplevel-codecs/pypy/interpreter/unicodehelper.py
==============================================================================
--- pypy/branch/interplevel-codecs/pypy/interpreter/unicodehelper.py	(original)
+++ pypy/branch/interplevel-codecs/pypy/interpreter/unicodehelper.py	Tue Jun 29 17:46:51 2010
@@ -1,30 +1,10 @@
-from pypy.interpreter import gateway
+from pypy.module._codecs import interp_codecs
 
-app = gateway.applevel(r'''
-    def PyUnicode_DecodeUnicodeEscape(data):
-        import _codecs
-        return _codecs.unicode_escape_decode(data)[0]
+def PyUnicode_AsEncodedString(space, w_data, w_encoding):
+    return interp_codecs.encode(space, w_data, w_encoding)
 
-    def PyUnicode_DecodeRawUnicodeEscape(data):
-        import _codecs
-        return _codecs.raw_unicode_escape_decode(data)[0]
-
-    def PyUnicode_DecodeUTF8(data):
-        import _codecs
-        return _codecs.utf_8_decode(data)[0]
-
-    def PyUnicode_AsEncodedString(data, encoding):
-        import _codecs
-        return _codecs.encode(data, encoding)
-
-    def PyUnicode_EncodeUTF8(data):
-        import _codecs
-        return _codecs.utf_8_encode(data)[0]
-
-''')
-
-PyUnicode_DecodeUnicodeEscape = app.interphook('PyUnicode_DecodeUnicodeEscape')
-PyUnicode_DecodeRawUnicodeEscape = app.interphook('PyUnicode_DecodeRawUnicodeEscape')
-PyUnicode_DecodeUTF8 = app.interphook('PyUnicode_DecodeUTF8')
-PyUnicode_AsEncodedString = app.interphook('PyUnicode_AsEncodedString')
-PyUnicode_EncodeUTF8 = app.interphook('PyUnicode_EncodeUTF8') 
+# These functions take and return unwrapped rpython strings and unicodes
+PyUnicode_DecodeUnicodeEscape = interp_codecs.make_raw_decoder('unicode_escape')
+PyUnicode_DecodeRawUnicodeEscape = interp_codecs.make_raw_decoder('raw_unicode_escape')
+PyUnicode_DecodeUTF8 = interp_codecs.make_raw_decoder('utf_8')
+PyUnicode_EncodeUTF8 = interp_codecs.make_raw_encoder('utf_8')

Modified: pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py
==============================================================================
--- pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py	(original)
+++ pypy/branch/interplevel-codecs/pypy/module/_codecs/interp_codecs.py	Tue Jun 29 17:46:51 2010
@@ -339,6 +339,31 @@
 
 from pypy.rlib import runicode
 
+def make_raw_encoder(name):
+    rname = "unicode_encode_%s" % (name.replace("_encode", ""), )
+    assert hasattr(runicode, rname)
+    def raw_encoder(space, uni):
+        state = space.fromcache(CodecState)
+        func = getattr(runicode, rname)
+        errors = "strict"
+        return func(uni, len(uni), errors, state.encode_error_handler)
+    raw_encoder.func_name = rname
+    return raw_encoder
+
+def make_raw_decoder(name):
+    rname = "str_decode_%s" % (name.replace("_decode", ""), )
+    assert hasattr(runicode, rname)
+    def raw_decoder(space, string):
+        final = True
+        errors = "strict"
+        state = space.fromcache(CodecState)
+        func = getattr(runicode, rname)
+        result, consumed = func(string, len(string), errors,
+                                final, state.decode_error_handler)
+        return result
+    raw_decoder.func_name = rname
+    return raw_decoder
+
 def make_encoder_wrapper(name):
     rname = "unicode_encode_%s" % (name.replace("_encode", ""), )
     assert hasattr(runicode, rname)

Modified: pypy/branch/interplevel-codecs/pypy/objspace/std/marshal_impl.py
==============================================================================
--- pypy/branch/interplevel-codecs/pypy/objspace/std/marshal_impl.py	(original)
+++ pypy/branch/interplevel-codecs/pypy/objspace/std/marshal_impl.py	Tue Jun 29 17:46:51 2010
@@ -447,11 +447,11 @@
 register(TYPE_CODE, unmarshal_pycode)
 
 def marshal_w__Unicode(space, w_unicode, m):
-    s = space.str_w(unicodehelper.PyUnicode_EncodeUTF8(space, w_unicode))
+    s = unicodehelper.PyUnicode_EncodeUTF8(space, space.unicode_w(w_unicode))
     m.atom_str(TYPE_UNICODE, s)
 
 def unmarshal_Unicode(space, u, tc):
-    return unicodehelper.PyUnicode_DecodeUTF8(space, space.wrap(u.get_str()))
+    return space.wrap(unicodehelper.PyUnicode_DecodeUTF8(space, u.get_str()))
 register(TYPE_UNICODE, unmarshal_Unicode)
 
 app = gateway.applevel(r'''



More information about the Pypy-commit mailing list