[pypy-svn] r25123 - pypy/dist/pypy/objspace

auc at codespeak.net auc at codespeak.net
Wed Mar 29 19:30:09 CEST 2006


Author: auc
Date: Wed Mar 29 19:30:08 2006
New Revision: 25123

Modified:
   pypy/dist/pypy/objspace/logic.py
Log:
multimethod frenzy


Modified: pypy/dist/pypy/objspace/logic.py
==============================================================================
--- pypy/dist/pypy/objspace/logic.py	(original)
+++ pypy/dist/pypy/objspace/logic.py	Wed Mar 29 19:30:08 2006
@@ -186,10 +186,11 @@
     return W_Var()
 app_newvar = gateway.interp2app(newvar)
 
-def wait(space, w_self):
+def wait__Root(space, w_self):
+    return w_self
+
+def wait__Var(space, w_self):
     while 1:
-        if not isinstance(w_self, W_Var):
-            return w_self
         #print " :wait", w_self
         if space.is_true(is_free(space, w_self)):
             if not have_uthreads():
@@ -220,13 +221,19 @@
                                          space.wrap("blocked on variable, but no uthread that can bind it"))
         else:
             return w_self.w_bound_to
+
+def wait(space, w_obj):
+    return space.wait(w_obj)
 app_wait = gateway.interp2app(wait)
 
-def wait_needed(space, w_self):
+wait_mm = StdObjSpaceMultiMethod('wait', 1)
+wait_mm.register(wait__Var, W_Var)
+wait_mm.register(wait__Root, W_Root)
+all_mms['wait'] = wait_mm
+
+
+def wait_needed__Var(space, w_self):
     while 1:
-        if not isinstance(w_self, W_Var):
-            raise OperationError(space.w_RuntimeError,
-                                 space.wrap("wait_needed operates only on logic variables"))
         print " :needed", w_self
         if space.is_true(is_free(space, w_self)):
             if w_self.w_needed:
@@ -254,23 +261,41 @@
         else:
             raise OperationError(space.w_RuntimeError,
                                  space.wrap("wait_needed only supported on unbound variables"))
+
+def wait_needed(space, w_var):
+    return space.wait_needed(w_var)
 app_wait_needed = gateway.interp2app(wait_needed)            
 
+wait_needed_mm = StdObjSpaceMultiMethod('wait_needed', 1)
+wait_needed_mm.register(wait_needed__Var, W_Var)
+all_mms['wait_needed'] = wait_needed_mm
+
 
 #-- PREDICATES --------------------
 
 def is_aliased(space, w_var): # FIXME: this appears to block
+    assert isinstance(w_var, W_Var)
     if space.is_true(space.is_nb_(deref(space, w_var), w_var)):
         return space.newbool(False)
     return space.newbool(True)
 app_is_aliased = gateway.interp2app(is_aliased)
 
-def is_free(space, w_var):
-    if not isinstance(w_var, W_Var):
-        return space.newbool(False)
+def is_free(space, w_obj):
+    return space.is_free(w_obj)
+
+def is_free__Root(space, w_obj):
+    return space.newbool(False)
+
+def is_free__Var(space, w_var):
     return space.newbool(isinstance(w_var.w_bound_to, W_Var))
+
 app_is_free = gateway.interp2app(is_free)
 
+is_free_mm = StdObjSpaceMultiMethod('is_free', 1)
+is_free_mm.register(is_free__Root, W_Root)
+is_free_mm.register(is_free__Var, W_Var)
+all_mms['is_free'] = is_free_mm
+
 def is_bound(space, w_var):
     return space.newbool(not space.is_true(is_free(space, w_var)))
 app_is_bound = gateway.interp2app(is_bound)
@@ -350,12 +375,13 @@
     l = len(a_str) - 1
     return a_str[l-3:l]
 
+
+#FIXME : does not work at all,
+# even a pure applevel version ...
 def _sleep(space, w_var, w_barrier):
     wait(space, w_var)
     bind(space, w_barrier, space.newint(1))
 
-#FIXME : does not work at all,
-# even a pure applevel version ...
 def wait_two(space, w_1, w_2):
     """waits until one out of two logic variables
        becomes bound, then tells which one,
@@ -681,10 +707,9 @@
         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_
+
     space.setitem(space.builtin.w_dict, space.wrap('newvar'),
                   space.wrap(app_newvar))
     space.setitem(space.builtin.w_dict, space.wrap('is_free'),
@@ -714,6 +739,7 @@
             if schedule_state.have_blocked_threads():
                 os.write(2, "there are still blocked uthreads!")
         app_exitfunc = gateway.interp2app(exitfunc, unwrap_spec=[])
+
         space.setitem(space.sys.w_dict, space.wrap("exitfunc"), space.wrap(app_exitfunc))
         space.setitem(space.builtin.w_dict, space.wrap('uthread'),
                      space.wrap(app_uthread))
@@ -721,4 +747,5 @@
                      space.wrap(app_wait))
         space.setitem(space.builtin.w_dict, space.wrap('wait_needed'),
                       space.wrap(app_wait_needed))
+    patch_space_in_place(space, 'logic', proxymaker)
     return space



More information about the Pypy-commit mailing list