[pypy-svn] r39737 - in pypy/dist/pypy/lib/distributed: . test

fijal at codespeak.net fijal at codespeak.net
Fri Mar 2 18:30:40 CET 2007


Author: fijal
Date: Fri Mar  2 18:30:38 2007
New Revision: 39737

Modified:
   pypy/dist/pypy/lib/distributed/objkeeper.py
   pypy/dist/pypy/lib/distributed/protocol.py
   pypy/dist/pypy/lib/distributed/test/test_distributed.py
Log:
Remote type instantiation works!


Modified: pypy/dist/pypy/lib/distributed/objkeeper.py
==============================================================================
--- pypy/dist/pypy/lib/distributed/objkeeper.py	(original)
+++ pypy/dist/pypy/lib/distributed/objkeeper.py	Fri Mar  2 18:30:38 2007
@@ -14,12 +14,15 @@
 class RemoteBase(object):
     pass
 
+from types import FunctionType
+
 class ObjKeeper(object):
     def __init__(self, exported_names = {}):
         self.exported_objects = [] # list of object that we've exported outside
         self.exported_names = exported_names # dictionary of visible objects
         self.exported_types = {} # dict of exported types
         self.remote_types = {}
+        self.reverse_remote_types = {}
         self.remote_objects = {}
         self.exported_types_id = 0 # unique id of exported types
         self.exported_types_reverse = {} # reverse dict of exported types
@@ -62,12 +65,16 @@
         if '__doc__' in _dict:
             d['__doc__'] = protocol.unwrap(_dict['__doc__'])
         tp = type(_name, (RemoteBase,), d)
-        tp.__metaremote__ = type_id
         # Make sure we cannot instantiate the remote type
         self.remote_types[type_id] = tp
+        self.reverse_remote_types[tp] = type_id
         for key, value in _dict.items():
             if key != '__doc__':
-                setattr(tp, key, protocol.unwrap(value))
+                v = protocol.unwrap(value)
+                if isinstance(v, FunctionType):
+                    setattr(tp, key, staticmethod(v))
+                else:
+                    setattr(tp, key, v)
             #elif key == '__new__':
             #    import pdb
             #    pdb.set_trace()

Modified: pypy/dist/pypy/lib/distributed/protocol.py
==============================================================================
--- pypy/dist/pypy/lib/distributed/protocol.py	(original)
+++ pypy/dist/pypy/lib/distributed/protocol.py	Fri Mar  2 18:30:38 2007
@@ -132,10 +132,8 @@
             id = self.keeper.register_object(obj)
             return (self.type_letters[tp], id)
         elif tp is type:
-            if isinstance(obj, RemoteBase):
-                import pdb
-                pdb.set_trace()
-                return "reg", obj.__metaremote__
+            if issubclass(obj, RemoteBase):
+                return "reg", self.keeper.reverse_remote_types[obj]
             try:
                 return self.type_letters[tp], self.type_letters[obj]
             except KeyError:
@@ -379,12 +377,12 @@
     remote_protocol = RemoteProtocol(inp.send, out.receive, exported_names)
     t = tasklet(remote_loop)(remote_protocol)
     
-    def send_trace(data):
-        print "Sending %s" % (data,)
-        out.send(data)
+    #def send_trace(data):
+    #    print "Sending %s" % (data,)
+    #    out.send(data)
 
-    def receive_trace():
-        data = inp.receive()
-        print "Received %s" % (data,)
-        return data
-    return RemoteProtocol(send_trace, receive_trace)
+    #def receive_trace():
+    #    data = inp.receive()
+    #    print "Received %s" % (data,)
+    #    return data
+    return RemoteProtocol(out.send, inp.receive)

Modified: pypy/dist/pypy/lib/distributed/test/test_distributed.py
==============================================================================
--- pypy/dist/pypy/lib/distributed/test/test_distributed.py	(original)
+++ pypy/dist/pypy/lib/distributed/test/test_distributed.py	Fri Mar  2 18:30:38 2007
@@ -213,10 +213,16 @@
         assert res == 8
 
     def test_instantiate_remote_type(self):
-        skip("Doesn't work yet")
+        #skip("Doesn't work yet")
         class C:
-            pass
+            def __init__(self, y):
+                self.y = y
+            
+            def x(self):
+                return self.y
 
         protocol = self.test_env({'C':C})
         xC = protocol.get_remote('C')
-        xC()
+        res = xC(3).x()
+        assert res == 3
+



More information about the Pypy-commit mailing list