[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