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

auc at codespeak.net auc at codespeak.net
Wed Apr 5 13:25:31 CEST 2006


Author: auc
Date: Wed Apr  5 13:25:31 2006
New Revision: 25365

Modified:
   pypy/dist/pypy/objspace/logic.py
Log:
some renaming, more assertions


Modified: pypy/dist/pypy/objspace/logic.py
==============================================================================
--- pypy/dist/pypy/objspace/logic.py	(original)
+++ pypy/dist/pypy/objspace/logic.py	Wed Apr  5 13:25:31 2006
@@ -188,7 +188,6 @@
 
 class W_Var(W_Root, object):
     def __init__(w_self):
-        #w_self.typedef = 'Variable'
         w_self.w_bound_to = w_self 
         w_self.w_needed = False    
 
@@ -203,20 +202,20 @@
     return W_Var()
 app_newvar = gateway.interp2app(newvar)
 
-def wait__Root(space, w_self):
-    return w_self
+def wait__Root(space, w_obj):
+    return w_obj
 
-def wait__Var(space, w_self):
+def wait__Var(space, w_var):
     while 1:
-        #print " :wait", w_self
-        if space.is_true(space.is_free(w_self)):
+        #print " :wait", w_var
+        if space.is_true(space.is_free(w_var)):
             if not have_uthreads():
                 raise OperationError(space.w_RuntimeError,
                                      space.wrap("trying to perform an operation on an unbound variable"))
             else:
                 # notify wait_needed clients, give them a chance to run
-                w_self.w_needed = True
-                for w_alias in aliases(space, w_self):
+                w_var.w_needed = True
+                for w_alias in aliases(space, w_var):
                     need_waiters = schedule_state.pop_blocked_byneed_on(w_alias)
                     w_alias.w_needed = True
                     for waiter in need_waiters:
@@ -224,7 +223,7 @@
                         schedule_state.add_to_runnable(waiter)
                 # set curr thread to blocked, switch to runnable thread
                 current = get_current_coroutine()
-                schedule_state.add_to_blocked(w_self, current)
+                schedule_state.add_to_blocked(w_var, current)
                 while schedule_state.have_runnable_threads():
                     next_coro = schedule_state.pop_runnable_thread()
                     if next_coro.is_alive():
@@ -237,7 +236,7 @@
                     raise OperationError(space.w_RuntimeError,
                                          space.wrap("blocked on variable, but no uthread that can bind it"))
         else:
-            return w_self.w_bound_to
+            return w_var.w_bound_to
 
 def wait(space, w_obj):
     assert isinstance(w_obj, W_Root)
@@ -250,11 +249,11 @@
 all_mms['wait'] = wait_mm
 
 
-def wait_needed__Var(space, w_self):
+def wait_needed__Var(space, w_var):
     while 1:
-        #print " :needed", w_self
-        if space.is_true(space.is_free(w_self)):
-            if w_self.w_needed:
+        #print " :needed", w_var
+        if space.is_true(space.is_free(w_var)):
+            if w_var.w_needed:
                 break # we're done
             if not have_uthreads():
                 raise OperationError(space.w_RuntimeError,
@@ -262,7 +261,7 @@
             else:
                 # add current thread to blocked byneed and switch
                 current = get_current_coroutine()
-                for w_alias in aliases(space, w_self):
+                for w_alias in aliases(space, w_var):
                     schedule_state.add_to_blocked_byneed(w_alias, current)
                 while schedule_state.have_runnable_threads():
                     next_coro = schedule_state.pop_runnable_thread()
@@ -451,27 +450,30 @@
     space.bind(w_var, w_obj)
 app_bind = gateway.interp2app(bind)
 
-def bind__Var_Var(space, w_var, w_obj):
-    if space.is_true(space.is_bound(w_var)):
-        if space.is_true(space.is_bound(w_obj)):
+def bind__Var_Var(space, w_v1, w_v2):
+    if space.is_true(space.is_bound(w_v1)):
+        if space.is_true(space.is_bound(w_v2)):
             return unify(space, #FIXME: we could just raise
-                         deref(space, w_var),
-                         deref(space, w_obj))
+                         deref(space, w_v1),
+                         deref(space, w_v2))
         # 2. a (obj unbound, var bound)
-        return _assign(space, w_obj, deref(space, w_var))
-    elif space.is_true(space.is_bound(w_obj)):
+        return _assign(space, w_v2, deref(space, w_v1))
+    elif space.is_true(space.is_bound(w_v2)):
         # 2. b (var unbound, obj bound)
-        return _assign(space, w_var, deref(space, w_obj))
+        return _assign(space, w_v1, deref(space, w_v2))
     else: # 1. both are unbound
-        return _alias(space, w_var, w_obj)
+        return _alias(space, w_v1, w_v2)
 
 
-def bind__Var_Root(space, w_v1, w_v2):
+def bind__Var_Root(space, w_var, w_obj):
     # 3. var and value
-    if space.is_true(space.is_free(w_v1)):
-        return _assign(space, w_v1, w_v2)
-    #print "uh !"
-    fail(space, w_v1, w_v2)
+    if space.is_true(space.is_free(w_var)):
+        return _assign(space, w_var, w_obj)
+    # for dataflow behaviour we should allow
+    # rebinding of unifiable values
+    raise OperationError(space.w_RuntimeError,
+                         space.wrap("Cannot bind twice"))
+    
 
 bind_mm = StdObjSpaceMultiMethod('bind', 2)
 bind_mm.register(bind__Var_Root, W_Var, W_Root)
@@ -520,6 +522,8 @@
     return space.w_None
 
 def _add_to_aliases(space, w_v1, w_v2):
+    assert isinstance(w_v1, W_Var)
+    assert isinstance(w_v2, W_Var)
     #print "   :add to aliases", w_v1, w_v2
     w_tail = w_v1.w_bound_to
     w_v1.w_bound_to = w_v2
@@ -527,6 +531,8 @@
     return space.w_None
     
 def _merge_aliases(space, w_v1, w_v2):
+    assert isinstance(w_v1, W_Var)
+    assert isinstance(w_v2, W_Var)
     #print "   :merge aliases", w_v1, w_v2
     w_tail1 = get_ring_tail(space, w_v1)
     w_tail2 = get_ring_tail(space, w_v2)



More information about the Pypy-commit mailing list