[pypy-svn] r25087 - in pypy/dist/pypy/objspace: . test

auc at codespeak.net auc at codespeak.net
Tue Mar 28 19:09:56 CEST 2006


Author: auc
Date: Tue Mar 28 19:09:54 2006
New Revision: 25087

Modified:
   pypy/dist/pypy/objspace/logic.py
   pypy/dist/pypy/objspace/test/test_logicobjspace.py
Log:
hack to get multimethods from logic space


Modified: pypy/dist/pypy/objspace/logic.py
==============================================================================
--- pypy/dist/pypy/objspace/logic.py	(original)
+++ pypy/dist/pypy/objspace/logic.py	Tue Mar 28 19:09:54 2006
@@ -660,10 +660,55 @@
     return proxy
 
 
+
+
+from pypy.objspace.std.model import StdObjSpaceMultiMethod
+from pypy.objspace.std.intobject import W_IntObject
+from pypy.objspace.std.floatobject import W_FloatObject
+from pypy.objspace.std import stdtypedef 
+from pypy.tool.sourcetools import func_with_new_name
+
+def foo__Int_Int(space, w_a, w_b):
+    print "i'm foo int int"
+
+def foo__Int_Float(space, w_a, w_b):
+    print "i'm foo int float"
+
+def foo__Float_Int(space, w_a, w_b):
+    space.foo(w_b, w_a)
+
+
+foo_mm = StdObjSpaceMultiMethod('foo', 2)
+foo_mm.register(foo__Int_Int, W_IntObject, W_IntObject)
+foo_mm.register(foo__Int_Float, W_IntObject, W_FloatObject)
+foo_mm.register(foo__Float_Int, W_FloatObject, W_IntObject)
+
+def my_foo(space, w_1, w_2):
+    space.foo(w_1, w_2)
+app_foo = gateway.interp2app(my_foo)
+
 def Space(*args, **kwds):
     # for now, always make up a wrapped StdObjSpace
     from pypy.objspace import std
     space = std.Space(*args, **kwds)
+
+    # multimethods hack
+    name = 'foo'
+    exprargs, expr, miniglobals, fallback = (
+        foo_mm.install_not_sliced(space.model.typeorder, baked_perform_call=False))
+    func = stdtypedef.make_perform_trampoline('__foo_mm_'+name,
+                                              exprargs, expr, miniglobals,
+                                              foo_mm)
+    # e.g. add(space, w_x, w_y)
+    def make_boundmethod(func=func):
+        def boundmethod(*args):
+            return func(space, *args)
+        return func_with_new_name(boundmethod, 'boundmethod_'+name)
+    boundmethod = make_boundmethod()
+    setattr(space, name, boundmethod)  # store into 'space' instance
+    # /multimethod hack
+
+
     is_nb_ = space.is_ # capture the original is_ op (?)
     patch_space_in_place(space, 'logic', proxymaker)
     space.is_nb_ = is_nb_
@@ -683,6 +728,8 @@
                  space.wrap(app_bind))
     space.setitem(space.builtin.w_dict, space.wrap('unify'),
                  space.wrap(app_unify))
+    space.setitem(space.builtin.w_dict, space.wrap('foo'),
+                 space.wrap(app_foo))
     if USE_COROUTINES:
         import os
         def exitfunc():
@@ -701,8 +748,7 @@
                      space.wrap(app_uthread))
         space.setitem(space.builtin.w_dict, space.wrap('wait'),
                      space.wrap(app_wait))
-##         space.setitem(space.builtin.w_dict, space.wrap('wait_two'),
-##                      space.wrap(app_wait_two))
         space.setitem(space.builtin.w_dict, space.wrap('wait_needed'),
                       space.wrap(app_wait_needed))
     return space
+

Modified: pypy/dist/pypy/objspace/test/test_logicobjspace.py
==============================================================================
--- pypy/dist/pypy/objspace/test/test_logicobjspace.py	(original)
+++ pypy/dist/pypy/objspace/test/test_logicobjspace.py	Tue Mar 28 19:09:54 2006
@@ -195,6 +195,11 @@
         unify(f2.b, 'foo')
         assert f1.b == f2.b == 'foo'
                 
+    def test_foo(self):
+        foo(1, 2)
+        foo(1, 2.0)
+        foo(2.0, 1)
+
 
 class AppTest_LogicThreads(object):
 



More information about the Pypy-commit mailing list