[pypy-svn] r46341 - in pypy/dist/pypy: rlib rlib/test rpython/module

arigo at codespeak.net arigo at codespeak.net
Wed Sep 5 14:17:23 CEST 2007


Author: arigo
Date: Wed Sep  5 14:17:21 2007
New Revision: 46341

Modified:
   pypy/dist/pypy/rlib/rmarshal.py
   pypy/dist/pypy/rlib/test/test_rmarshal.py
   pypy/dist/pypy/rpython/module/ll_os_stat.py
Log:
Fix rlib.rmarshal.


Modified: pypy/dist/pypy/rlib/rmarshal.py
==============================================================================
--- pypy/dist/pypy/rlib/rmarshal.py	(original)
+++ pypy/dist/pypy/rlib/rmarshal.py	Wed Sep  5 14:17:21 2007
@@ -8,7 +8,6 @@
 from pypy.annotation.pairtype import pair, pairtype
 from pypy.rlib.rarithmetic import formatd, r_longlong, intmask
 from pypy.rlib.unroll import unrolling_iterable
-from pypy.rpython import controllerentry
 
 class CannotMarshal(Exception):
     pass
@@ -303,10 +302,28 @@
 class __extend__(pairtype(MTag, annmodel.SomeObject)):
 
     def install_marshaller((tag, s_obj)):
-        raise CannotMarshal(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)
 
     def install_unmarshaller((tag, s_obj)):
-        raise CannotUnmarshall(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)
 
 
 class __extend__(pairtype(MTag, annmodel.SomeList)):
@@ -380,23 +397,24 @@
         add_loader(s_tuple, load_tuple)
 
 
-class __extend__(pairtype(MTag, controllerentry.SomeControlledInstance)):
-    # marshal a ControlledInstance by marshalling the underlying object
-
-    def install_marshaller((tag, s_obj)):
-        def dump_controlled_instance(buf, x):
-            real_obj = controllerentry.controlled_instance_unbox(controller, x)
-            realdumper(buf, real_obj)
-
-        controller = s_obj.controller
-        realdumper = get_marshaller(s_obj.s_real_obj)
-        add_dumper(s_obj, dump_controlled_instance)
-
-    def install_unmarshaller((tag, s_obj)):
-        def load_controlled_instance(loader):
-            real_obj = realloader(loader)
-            return controllerentry.controlled_instance_box(controller,
-                                                           real_obj)
-        controller = s_obj.controller
-        realloader = get_loader(s_obj.s_real_obj)
-        add_loader(s_obj, load_controlled_instance)
+## -- not used any more right now --
+##class __extend__(pairtype(MTag, controllerentry.SomeControlledInstance)):
+##    # marshal a ControlledInstance by marshalling the underlying object
+
+##    def install_marshaller((tag, s_obj)):
+##        def dump_controlled_instance(buf, x):
+##            real_obj = controllerentry.controlled_instance_unbox(controller, x)
+##            realdumper(buf, real_obj)
+
+##        controller = s_obj.controller
+##        realdumper = get_marshaller(s_obj.s_real_obj)
+##        add_dumper(s_obj, dump_controlled_instance)
+
+##    def install_unmarshaller((tag, s_obj)):
+##        def load_controlled_instance(loader):
+##            real_obj = realloader(loader)
+##            return controllerentry.controlled_instance_box(controller,
+##                                                           real_obj)
+##        controller = s_obj.controller
+##        realloader = get_loader(s_obj.s_real_obj)
+##        add_loader(s_obj, load_controlled_instance)

Modified: pypy/dist/pypy/rlib/test/test_rmarshal.py
==============================================================================
--- pypy/dist/pypy/rlib/test/test_rmarshal.py	(original)
+++ pypy/dist/pypy/rlib/test/test_rmarshal.py	Wed Sep  5 14:17:21 2007
@@ -116,21 +116,10 @@
     res = ''.join(res.chars)
     assert res == '5=hello;7=world;'
 
-def test_tuple_stat_result():
-    from pypy.rpython.module.ll_os_stat import STAT_FIELDS, s_tuple_StatResult
-    marshaller = get_marshaller(s_tuple_StatResult)
-    unmarshaller = get_unmarshaller(s_tuple_StatResult)
-
-    sttuple = (0,) * len(STAT_FIELDS)
-    buf = []
-    marshaller(buf, sttuple)
-    res = unmarshaller(''.join(buf))
-    assert res == sttuple
-
 def test_stat_result():
     import os
     from pypy.translator.c.test.test_genc import compile
-    from pypy.rpython.module.ll_os_stat import STAT_FIELDS, s_StatResult
+    from pypy.rpython.module.ll_os_stat import s_StatResult
     marshal_stat_result = get_marshaller(s_StatResult)
     unmarshal_stat_result = get_unmarshaller(s_StatResult)
     def f(path):
@@ -152,4 +141,4 @@
     assert sttuple[3] == st[3]
     assert sttuple[4] == st[4]
     assert sttuple[5] == st[5]
-    assert len(sttuple) == len(STAT_FIELDS)
+    assert len(sttuple) == 10

Modified: pypy/dist/pypy/rpython/module/ll_os_stat.py
==============================================================================
--- pypy/dist/pypy/rpython/module/ll_os_stat.py	(original)
+++ pypy/dist/pypy/rpython/module/ll_os_stat.py	Wed Sep  5 14:17:21 2007
@@ -90,6 +90,19 @@
         TYPE = STAT_FIELD_TYPES[attrname]
         return annmodel.lltype_to_annotation(TYPE)
 
+    def _get_rmarshall_support_(self):     # for rlib.rmarshal
+        # reduce and recreate stat_result objects from 10-tuples
+        # (we ignore the extra values here for simplicity and portability)
+        def stat_result_reduce(st):
+            return (st[0], st[1], st[2], st[3], st[4],
+                    st[5], st[6], st[7], st[8], st[9])
+        def stat_result_recreate(tup):
+            return make_stat_result(tup + extra_zeroes)
+        s_reduced = annmodel.SomeTuple([annmodel.lltype_to_annotation(TYPE)
+                                       for name, TYPE in PORTABLE_STAT_FIELDS])
+        extra_zeroes = (0,) * (len(STAT_FIELDS) - len(PORTABLE_STAT_FIELDS))
+        return s_reduced, stat_result_reduce, stat_result_recreate
+
 class __extend__(pairtype(SomeStatResult, annmodel.SomeInteger)):
     def getitem((s_sta, s_int)):
         assert s_int.is_constant(), "os.stat()[index]: index must be constant"



More information about the Pypy-commit mailing list