[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