[pypy-commit] pypy singledispatch: use singledispatch in rlib.rmarshal

rlamy noreply at buildbot.pypy.org
Sun Feb 16 04:24:24 CET 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: singledispatch
Changeset: r69171:be668feb3655
Date: 2014-02-16 03:23 +0000
http://bitbucket.org/pypy/pypy/changeset/be668feb3655/

Log:	use singledispatch in rlib.rmarshal

diff --git a/rpython/rlib/rmarshal.py b/rpython/rlib/rmarshal.py
--- a/rpython/rlib/rmarshal.py
+++ b/rpython/rlib/rmarshal.py
@@ -1,11 +1,11 @@
 """A way to serialize data in the same format as the 'marshal' module
 but accessible to RPython programs.
 """
+from rpython.tool.singledispatch.singledispatch import singledispatch
 
 from rpython.annotator import model as annmodel
 from rpython.annotator.signature import annotation
 from rpython.annotator.listdef import ListDef, TooLateForChange
-from rpython.tool.pairtype import pair, pairtype
 from rpython.rlib.rarithmetic import r_longlong, intmask, LONG_BIT, ovfcheck
 from rpython.rlib.rfloat import formatd, rstring_to_float
 from rpython.rlib.unroll import unrolling_iterable
@@ -29,7 +29,7 @@
         return find_dumper(s_obj)
     except CannotMarshal:
         # ask the annotation to produce an appropriate dumper
-        pair(_tag, s_obj).install_marshaller()
+        install_marshaller(s_obj)
         return find_dumper(s_obj)
 get_marshaller._annspecialcase_ = 'specialize:memo'
 
@@ -40,7 +40,7 @@
         return find_loader(s_obj)
     except CannotUnmarshall:
         # ask the annotation to produce an appropriate loader
-        pair(_tag, s_obj).install_unmarshaller()
+        install_unmarshaller(s_obj)
         return find_loader(s_obj)
 
 def get_unmarshaller(type):
@@ -325,11 +325,6 @@
 #
 # Annotations => dumpers and loaders
 
-class MTag(object):
-    """Tag for pairtype(), for the purpose of making the get_marshaller()
-    and get_unmarshaller() methods of SomeObject only locally visible."""
-_tag = MTag()
-
 def weakly_contains(s_bigger, s_smaller):
     # a special version of s_bigger.contains(s_smaller).  Warning, to
     # support ListDefs properly, this works by trying to produce a side-effect
@@ -342,145 +337,156 @@
     except (annmodel.UnionError, TooLateForChange):
         return False
 
+ at singledispatch
+def install_marshaller(obj):
+    raise NotImplementedError
 
-class __extend__(pairtype(MTag, annmodel.SomeObject)):
 
-    def install_marshaller((tag, s_obj)):
-        if not hasattr(s_obj, '_get_rmarshall_support_'):
-            raise CannotMarshal(s_obj)
-        # special support for custom annotation like SomeStatResult:
-        # the annotation tells us how to turn an object into something
-        # else that can be marshalled
-        def dump_with_custom_reduce(buf, x):
-            reduced_obj = fn_reduce(x)
-            reduceddumper(buf, reduced_obj)
-        s_reduced_obj, fn_reduce, fn_recreate = s_obj._get_rmarshall_support_()
-        reduceddumper = get_marshaller(s_reduced_obj)
-        add_dumper(s_obj, dump_with_custom_reduce)
+ at singledispatch
+def install_unmarshaller(obj):
+    raise NotImplementedError
 
-    def install_unmarshaller((tag, s_obj)):
-        if not hasattr(s_obj, '_get_rmarshall_support_'):
-            raise CannotUnmarshall(s_obj)
-        # special support for custom annotation like SomeStatResult
-        def load_with_custom_recreate(loader):
-            reduced_obj = reducedloader(loader)
-            return fn_recreate(reduced_obj)
-        s_reduced_obj, fn_reduce, fn_recreate = s_obj._get_rmarshall_support_()
-        reducedloader = get_loader(s_reduced_obj)
-        add_loader(s_obj, load_with_custom_recreate)
 
+ at install_marshaller.register(annmodel.SomeObject)
+def _(s_obj):
+    if not hasattr(s_obj, '_get_rmarshall_support_'):
+        raise CannotMarshal(s_obj)
 
-class __extend__(pairtype(MTag, annmodel.SomeList)):
+    # special support for custom annotation like SomeStatResult:
+    # the annotation tells us how to turn an object into something
+    # else that can be marshalled
+    def dump_with_custom_reduce(buf, x):
+        reduced_obj = fn_reduce(x)
+        reduceddumper(buf, reduced_obj)
+    s_reduced_obj, fn_reduce, fn_recreate = s_obj._get_rmarshall_support_()
+    reduceddumper = get_marshaller(s_reduced_obj)
+    add_dumper(s_obj, dump_with_custom_reduce)
 
-    def install_marshaller((tag, s_list)):
-        def dump_list_or_none(buf, x):
-            if x is None:
-                dump_none(buf, x)
-            else:
-                buf.append(TYPE_LIST)
-                w_long(buf, len(x))
-                for item in x:
-                    itemdumper(buf, item)
+ at install_unmarshaller.register(annmodel.SomeObject)
+def _(s_obj):
+    if not hasattr(s_obj, '_get_rmarshall_support_'):
+        raise CannotUnmarshall(s_obj)
 
-        itemdumper = get_marshaller(s_list.listdef.listitem.s_value)
-        if s_list.listdef.listitem.dont_change_any_more:
-            s_general_list = s_list
+    # special support for custom annotation like SomeStatResult
+    def load_with_custom_recreate(loader):
+        reduced_obj = reducedloader(loader)
+        return fn_recreate(reduced_obj)
+    s_reduced_obj, fn_reduce, fn_recreate = s_obj._get_rmarshall_support_()
+    reducedloader = get_loader(s_reduced_obj)
+    add_loader(s_obj, load_with_custom_recreate)
+
+
+ at install_marshaller.register(annmodel.SomeList)
+def _(s_list):
+    def dump_list_or_none(buf, x):
+        if x is None:
+            dump_none(buf, x)
         else:
-            s_item = get_dumper_annotation(itemdumper)
-            s_general_list = annotation([s_item])
-        add_dumper(s_general_list, dump_list_or_none)
+            buf.append(TYPE_LIST)
+            w_long(buf, len(x))
+            for item in x:
+                itemdumper(buf, item)
 
-    def install_unmarshaller((tag, s_list)):
-        def load_list_or_none(loader):
-            t = readchr(loader)
-            if t == TYPE_LIST:
-                length = readlong(loader)
-                result = []
-                for i in range(length):
-                    result.append(itemloader(loader))
-                return result
-            elif t == TYPE_NONE:
-                return None
-            else:
-                raise ValueError("expected a list or None")
+    itemdumper = get_marshaller(s_list.listdef.listitem.s_value)
+    if s_list.listdef.listitem.dont_change_any_more:
+        s_general_list = s_list
+    else:
+        s_item = get_dumper_annotation(itemdumper)
+        s_general_list = annotation([s_item])
+    add_dumper(s_general_list, dump_list_or_none)
 
-        itemloader = get_loader(s_list.listdef.listitem.s_value)
-        add_loader(s_list, load_list_or_none)
+ at install_unmarshaller.register(annmodel.SomeList)
+def _(s_list):
+    def load_list_or_none(loader):
+        t = readchr(loader)
+        if t == TYPE_LIST:
+            length = readlong(loader)
+            result = []
+            for i in range(length):
+                result.append(itemloader(loader))
+            return result
+        elif t == TYPE_NONE:
+            return None
+        else:
+            raise ValueError("expected a list or None")
 
+    itemloader = get_loader(s_list.listdef.listitem.s_value)
+    add_loader(s_list, load_list_or_none)
 
-class __extend__(pairtype(MTag, annmodel.SomeDict)):
 
-    def install_marshaller((tag, s_dict)):
-        def dump_dict_or_none(buf, x):
-            if x is None:
-                dump_none(buf, x)
-            else:
-                buf.append(TYPE_DICT)
-                for key, value in x.items():
-                    keydumper(buf, key)
-                    valuedumper(buf, value)
-                buf.append('0')    # end of dict
+ at install_marshaller.register(annmodel.SomeDict)
+def _(s_dict):
+    def dump_dict_or_none(buf, x):
+        if x is None:
+            dump_none(buf, x)
+        else:
+            buf.append(TYPE_DICT)
+            for key, value in x.items():
+                keydumper(buf, key)
+                valuedumper(buf, value)
+            buf.append('0')    # end of dict
 
-        keydumper = get_marshaller(s_dict.dictdef.dictkey.s_value)
-        valuedumper = get_marshaller(s_dict.dictdef.dictvalue.s_value)
-        if (s_dict.dictdef.dictkey.dont_change_any_more or
+    keydumper = get_marshaller(s_dict.dictdef.dictkey.s_value)
+    valuedumper = get_marshaller(s_dict.dictdef.dictvalue.s_value)
+    if (s_dict.dictdef.dictkey.dont_change_any_more or
             s_dict.dictdef.dictvalue.dont_change_any_more):
-            s_general_dict = s_dict
+        s_general_dict = s_dict
+    else:
+        s_key = get_dumper_annotation(keydumper)
+        s_value = get_dumper_annotation(valuedumper)
+        s_general_dict = annotation({s_key: s_value})
+    add_dumper(s_general_dict, dump_dict_or_none)
+
+ at install_unmarshaller.register(annmodel.SomeDict)
+def _(s_dict):
+    def load_dict_or_none(loader):
+        t = readchr(loader)
+        if t == TYPE_DICT:
+            result = {}
+            while peekchr(loader) != '0':
+                key = keyloader(loader)
+                value = valueloader(loader)
+                result[key] = value
+            readchr(loader)   # consume the final '0'
+            return result
+        elif t == TYPE_NONE:
+            return None
         else:
-            s_key = get_dumper_annotation(keydumper)
-            s_value = get_dumper_annotation(valuedumper)
-            s_general_dict = annotation({s_key: s_value})
-        add_dumper(s_general_dict, dump_dict_or_none)
+            raise ValueError("expected a dict or None")
 
-    def install_unmarshaller((tag, s_dict)):
-        def load_dict_or_none(loader):
-            t = readchr(loader)
-            if t == TYPE_DICT:
-                result = {}
-                while peekchr(loader) != '0':
-                    key = keyloader(loader)
-                    value = valueloader(loader)
-                    result[key] = value
-                readchr(loader)   # consume the final '0'
-                return result
-            elif t == TYPE_NONE:
-                return None
-            else:
-                raise ValueError("expected a dict or None")
+    keyloader = get_loader(s_dict.dictdef.dictkey.s_value)
+    valueloader = get_loader(s_dict.dictdef.dictvalue.s_value)
+    add_loader(s_dict, load_dict_or_none)
 
-        keyloader = get_loader(s_dict.dictdef.dictkey.s_value)
-        valueloader = get_loader(s_dict.dictdef.dictvalue.s_value)
-        add_loader(s_dict, load_dict_or_none)
 
+ at install_marshaller.register(annmodel.SomeTuple)
+def _(s_tuple):
+    def dump_tuple(buf, x):
+        buf.append(TYPE_TUPLE)
+        w_long(buf, len(x))
+        for i, itemdumper in unroll_item_dumpers:
+            itemdumper(buf, x[i])
 
-class __extend__(pairtype(MTag, annmodel.SomeTuple)):
+    itemdumpers = [get_marshaller(s_item) for s_item in s_tuple.items]
+    unroll_item_dumpers = unrolling_iterable(enumerate(itemdumpers))
+    dumper_annotations = [get_dumper_annotation(itemdumper)
+                          for itemdumper in itemdumpers]
+    s_general_tuple = annmodel.SomeTuple(dumper_annotations)
+    add_dumper(s_general_tuple, dump_tuple)
 
-    def install_marshaller((tag, s_tuple)):
-        def dump_tuple(buf, x):
-            buf.append(TYPE_TUPLE)
-            w_long(buf, len(x))
-            for i, itemdumper in unroll_item_dumpers:
-                itemdumper(buf, x[i])
+ at install_unmarshaller.register(annmodel.SomeTuple)
+def _(s_tuple):
+    def load_tuple(loader):
+        if readchr(loader) != TYPE_TUPLE:
+            raise ValueError("expected a tuple")
+        if readlong(loader) != expected_length:
+            raise ValueError("wrong tuple length")
+        result = ()
+        for i, itemloader in unroll_item_loaders:
+            result += (itemloader(loader),)
+        return result
 
-        itemdumpers = [get_marshaller(s_item) for s_item in s_tuple.items]
-        unroll_item_dumpers = unrolling_iterable(enumerate(itemdumpers))
-        dumper_annotations = [get_dumper_annotation(itemdumper)
-                              for itemdumper in itemdumpers]
-        s_general_tuple = annmodel.SomeTuple(dumper_annotations)
-        add_dumper(s_general_tuple, dump_tuple)
-
-    def install_unmarshaller((tag, s_tuple)):
-        def load_tuple(loader):
-            if readchr(loader) != TYPE_TUPLE:
-                raise ValueError("expected a tuple")
-            if readlong(loader) != expected_length:
-                raise ValueError("wrong tuple length")
-            result = ()
-            for i, itemloader in unroll_item_loaders:
-                result += (itemloader(loader),)
-            return result
-
-        itemloaders = [get_loader(s_item) for s_item in s_tuple.items]
-        expected_length = len(itemloaders)
-        unroll_item_loaders = unrolling_iterable(enumerate(itemloaders))
-        add_loader(s_tuple, load_tuple)
+    itemloaders = [get_loader(s_item) for s_item in s_tuple.items]
+    expected_length = len(itemloaders)
+    unroll_item_loaders = unrolling_iterable(enumerate(itemloaders))
+    add_loader(s_tuple, load_tuple)


More information about the pypy-commit mailing list