[pypy-svn] r51763 - in pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk: . test

tverwaes at codespeak.net tverwaes at codespeak.net
Fri Feb 22 00:32:32 CET 2008


Author: tverwaes
Date: Fri Feb 22 00:32:32 2008
New Revision: 51763

Modified:
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/squeakimage.py
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_miniimage.py
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py
Log:
added some tests; make context-stack work as described in blue book


Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/model.py	Fri Feb 22 00:32:32 2008
@@ -194,6 +194,10 @@
         shadow.check_for_updates()
         return shadow
 
+    def as_link_get_shadow(self):
+        from pypy.lang.smalltalk.shadow import LinkShadow
+        return self.as_special_get_shadow(LinkShadow)
+    
     def as_semaphore_get_shadow(self):
         from pypy.lang.smalltalk.shadow import SemaphoreShadow
         return self.as_special_get_shadow(SemaphoreShadow)
@@ -225,9 +229,9 @@
     def as_context_get_shadow(self):
         from pypy.lang.smalltalk import classtable
         if self.getclass() == classtable.w_MethodContext:
-            self.as_methodcontext_get_shadow()
+            return self.as_methodcontext_get_shadow()
         elif self.getclass() == classtable.w_BlockContext:
-            self.as_blockcontext_get_shadow()
+            return self.as_blockcontext_get_shadow()
         else:
             # Should not happen...
             raise Exception()
@@ -524,7 +528,7 @@
         elif index == constants.CTXPART_PC_INDEX:
             return utility.wrap_int(self.pc())
         elif index == constants.CTXPART_STACKP_INDEX:
-            return utility.wrap_int(len(self.stack))
+            return utility.wrap_int(len(self.stack)+self.stackstart())
         
         # Invalid!
         raise IndexError

Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/shadow.py	Fri Feb 22 00:32:32 2008
@@ -222,13 +222,13 @@
         self._w_self = w_self
 
     def firstlink(self):
-        return self._w_self.at0(constants.FIRST_LINK_INDEX)
+        return self._w_self.fetch(constants.FIRST_LINK_INDEX)
 
     def store_firstlink(self, w_object):
         return self._w_self.atput0(constants.FIRST_LINK_INDEX, w_object)
 
     def lastlink(self):
-        return self._w_self.at0(constants.LAST_LINK_INDEX)
+        return self._w_self.fetch(constants.LAST_LINK_INDEX)
 
     def store_lastlink(self, w_object):
         return self._w_self.atput0(constants.LAST_LINK_INDEX, w_object)
@@ -266,9 +266,9 @@
 
     def put_to_sleep(self, s_process):
         priority = s_process.priority()
-        s_scheduler = self.scheduler()
+        s_scheduler = self.s_scheduler()
         w_process_lists = s_scheduler.process_lists()
-        w_process_list = w_process_lists.at0(priority)
+        w_process_list = w_process_lists.fetch(priority)
         w_process_list.as_linkedlist_get_shadow().add_last_link(s_process._w_self)
         s_process.store_my_list(w_process_list)
         
@@ -282,7 +282,7 @@
         s_process.store_w_suspended_context(objtable.w_nil)
         #reclaimableContextCount := 0
 
-    def scheduler(self):
+    def s_scheduler(self):
         from pypy.lang.smalltalk import objtable
         w_association = objtable.objtable["w_schedulerassociationpointer"]
         w_scheduler = w_association.as_association_get_shadow().value()
@@ -290,7 +290,7 @@
 
     def resume(self, w_process, interp):
         s_process = w_process.as_process_get_shadow()
-        s_scheduler = self.scheduler()
+        s_scheduler = self.s_scheduler()
         s_active_process = s_scheduler.active_process()
         active_priority = s_active_process.priority()
         new_priority = s_process.priority()
@@ -303,7 +303,7 @@
     def synchronous_signal(self, interp):
         print "SYNCHRONOUS SIGNAL"
         if self.is_empty_list():
-            w_value = self._w_self.at0(constants.EXCESS_SIGNALS_INDEX)
+            w_value = self._w_self.fetch(constants.EXCESS_SIGNALS_INDEX)
             w_value = utility.wrap_int(utility.unwrap_int(w_value) + 1)
             self._w_self.atput0(constants.EXCESS_SIGNALS_INDEX, w_value)
         else:
@@ -311,10 +311,10 @@
 
 class LinkShadow(AbstractShadow):
     def __init__(self, w_self):
-        self._w_self = self
+        self._w_self = w_self
 
     def next(self):
-        return self._w_self.at0(constants.NEXT_LINK_INDEX)
+        return self._w_self.fetch(constants.NEXT_LINK_INDEX)
 
     def store_next(self, w_object):
         self._w_self.atput0(constants.NEXT_LINK_INDEX, w_object)
@@ -326,10 +326,10 @@
         self._w_self = w_self
 
     def priority(self):
-        return utility.unwrap_int(self._w_self.at0(constants.PROCESS_PRIORITY_INDEX))
+        return utility.unwrap_int(self._w_self.fetch(constants.PROCESS_PRIORITY_INDEX))
 
     def my_list(self):
-        return self._w_self.at0(constants.PROCESS_MY_LIST_INDEX)
+        return self._w_self.fetch(constants.PROCESS_MY_LIST_INDEX)
 
     def store_my_list(self, w_object):
         self._w_self.atput0(constants.PROCESS_MY_LIST_INDEX, w_object)
@@ -345,23 +345,23 @@
         self._w_self = w_self
 
     def key(self):
-        return self._w_self.at0(constants.ASSOCIATION_KEY_INDEX)
+        return self._w_self.fetch(constants.ASSOCIATION_KEY_INDEX)
 
     def value(self):
-        return self._w_self.at0(constants.ASSOCIATION_VALUE_INDEX)
+        return self._w_self.fetch(constants.ASSOCIATION_VALUE_INDEX)
 
 class SchedulerShadow(AbstractShadow):
     def __init__(self, w_self):
         self._w_self = w_self
 
     def active_process(self):
-        return self._w_self.at0(constants.SCHEDULER_ACTIVE_PROCESS_INDEX).as_process_get_shadow()
+        return self._w_self.fetch(constants.SCHEDULER_ACTIVE_PROCESS_INDEX).as_process_get_shadow()
 
     def store_active_process(self, w_object):
         self._w_self.atput0(constants.SCHEDULER_ACTIVE_PROCESS_INDEX, w_object)
     
     def process_lists(self):
-        return self._w_self.at0(constants.SCHEDULER_PROCESS_LISTS_INDEX)
+        return self._w_self.fetch(constants.SCHEDULER_PROCESS_LISTS_INDEX)
 
 class ContextPartShadow(AbstractShadow):
 
@@ -378,10 +378,16 @@
         return self.s_home().w_receiver()
 
     def s_sender(self):
-        return self._w_self.fetch(constants.CTXPART_SENDER_INDEX).as_context_get_shadow()
+        # XXX XXX
+        from pypy.lang.smalltalk import objtable
+        w_sender = self.w_self().fetch(constants.CTXPART_SENDER_INDEX)
+        if w_sender == objtable.w_nil:
+            return None
+        else:
+            return w_sender.as_context_get_shadow()
 
     def store_s_sender(self, s_sender):
-        self._w_self.store(constants.CTXPART_SENDER_INDEX, s_sender._w_self())
+        self._w_self.store(constants.CTXPART_SENDER_INDEX, s_sender.w_self())
 
     def pc(self):
         return utility.unwrap_int(self._w_self.fetch(constants.CTXPART_PC_INDEX))
@@ -390,10 +396,10 @@
         self._w_self.store(constants.CTXPART_PC_INDEX, utility.wrap_int(newpc))
 
     def stackpointer(self):
-        return utility.unwrap_int(self._w_self.fetch(constants.CTXPART_SENDER_STACKP_INDEX))
+        return utility.unwrap_int(self._w_self.fetch(constants.CTXPART_STACKP_INDEX))
 
     def store_stackpointer(self, pointer):
-        self._w_self.store(constants.CTXPART_SENDER_STACKP_INDEX,
+        self._w_self.store(constants.CTXPART_STACKP_INDEX,
                           utility.wrap_int(pointer))
 
     # ______________________________________________________________________
@@ -428,13 +434,13 @@
     # Stack Manipulation
     def pop(self):
         idx = self.stackpointer()
-        w_v = self._w_self.fetch(idx)
+        w_v = self.w_self().fetch(idx)
         self.store_stackpointer(idx - 1)
         return w_v
 
     def push(self, w_v):
         idx = self.stackpointer() + 1
-        self._w_self.store(idx, w_v)
+        self.w_self().store(idx, w_v)
         self.store_stackpointer(idx)
 
     def push_all(self, lst):
@@ -445,17 +451,17 @@
         return self.peek(0)
         
     def peek(self, idx):
-        return self._w_self.fetch(self.stackpointer()-idx)
+        return self.w_self().fetch(self.stackpointer()-idx)
 
     def pop_n(self, n):
         assert n >= 0
-        assert n > (self.stackpointer() - self.stackstart())
+        assert n <= self.stackpointer() + 1
         self.store_stackpointer(self.stackpointer() - n)
 
     def pop_and_return_n(self, n):
         self.pop_n(n)
         start = self.stackpointer() + 1
-        return [self._w_self.fetch(i) for i in range(start, start+n)]
+        return [self.w_self().fetch(i) for i in range(start, start+n)]
     
 class BlockContextShadow(ContextPartShadow):
 

Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/squeakimage.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/squeakimage.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/squeakimage.py	Fri Feb 22 00:32:32 2008
@@ -203,6 +203,9 @@
                                 .g_object.pointers]
 
         self.objects = [chunk.g_object.w_object for chunk in reader.chunklist]
+        from pypy.lang.smalltalk import constants, objtable
+        for name, idx in constants.objects_in_special_object_table.items():
+            objtable.objtable["w_" + name] = self.objects[idx]
 
     def special(self, index):
         return self.special_objects[index]

Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_miniimage.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_miniimage.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_miniimage.py	Fri Feb 22 00:32:32 2008
@@ -226,6 +226,11 @@
     w_false = image.special(constants.SO_FALSE)
     assert w_false is objtable.w_false
     
+def test_scheduler():
+    from pypy.lang.smalltalk.shadow import SemaphoreShadow
+    s_semaphore = SemaphoreShadow(None)
+    s_scheduler = s_semaphore.s_scheduler()
+    
 def test_compile_method():
     # py.test.skip("Not working yet.")
     sourcecode = """fib 

Modified: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py
==============================================================================
--- pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py	(original)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_shadow.py	Fri Feb 22 00:32:32 2008
@@ -69,3 +69,75 @@
     w_class = build_smalltalk_class("Demo", 0x90, methods=methods)
     classshadow = w_class.as_class_get_shadow()
     assert classshadow.methoddict == methods
+
+def test_link():
+    w_object = model.W_PointersObject(None, 1)
+    w_object.store(constants.NEXT_LINK_INDEX, 'foo')
+    assert w_object.as_link_get_shadow().next() == 'foo'
+
+def method(tempsize=3,argsize=2, bytes="abcde"):
+    w_m = model.W_CompiledMethod()
+    w_m.bytes = bytes
+    w_m.tempsize = tempsize
+    w_m.argsize = argsize
+    return w_m
+
+def methodcontext(w_sender=objtable.w_nil, pc=1, stackpointer=0, stacksize=5,
+                  method=method()):
+    stackstart = method.argsize + method.tempsize + 7
+    w_object = model.W_PointersObject(classtable.w_MethodContext, stackstart+stacksize)
+    w_object.store(constants.CTXPART_SENDER_INDEX, w_sender)
+    w_object.store(constants.CTXPART_PC_INDEX, utility.wrap_int(pc))
+    w_object.store(constants.CTXPART_STACKP_INDEX, utility.wrap_int(stackstart+stackpointer))
+    w_object.store(constants.MTHDCTX_METHOD, method)
+    # XXX
+    w_object.store(constants.MTHDCTX_RECEIVER_MAP, '???')
+    w_object.store(constants.MTHDCTX_RECEIVER, 'receiver')
+    w_object.store(constants.MTHDCTX_TEMP_FRAME_START,
+                   utility.wrap_int(constants.MTHDCTX_TEMP_FRAME_START))
+    return w_object
+
+def test_methodcontext():
+    w_m = method()
+    w_object = methodcontext(stackpointer=2, method=w_m)
+    w_object2 = methodcontext(w_sender=w_object)
+    s_object = w_object.as_methodcontext_get_shadow()
+    s_object2 = w_object2.as_methodcontext_get_shadow()
+    assert w_object2.fetch(constants.CTXPART_SENDER_INDEX) == w_object
+    assert s_object.w_self() == w_object
+    assert s_object2.w_self() == w_object2
+    assert s_object.s_sender() == None
+    assert s_object2.s_sender() == s_object
+    assert s_object.w_receiver() == 'receiver'
+    s_object2.settemp(0, 'a')
+    s_object2.settemp(1, 'b')
+    assert s_object2.gettemp(0) == 'a'
+    assert s_object2.gettemp(1) == 'b'
+    assert s_object.w_method() == w_m
+    idx = s_object.stackstart()
+    w_object.store(idx + 1, 'f')
+    w_object.store(idx + 2, 'g')
+    w_object.store(idx + 3, 'h')
+    assert s_object.top() == 'h'
+    s_object.push('i')
+    assert s_object.top() == 'i'
+    assert s_object.peek(1) == 'h'
+    assert s_object.pop() == 'i'
+    assert s_object.pop_and_return_n(2) == ['g', 'h']
+    assert s_object.pop() == 'f'
+    assert s_object.stackpointer() == s_object.stackstart()
+
+def test_process(priority=utility.wrap_int(3)):
+    w_context = methodcontext()
+    w_object = model.W_PointersObject(None, 4)
+    w_object.store(constants.NEXT_LINK_INDEX, 'foo')
+    w_object.store(constants.PROCESS_SUSPENDED_CONTEXT_INDEX, w_context)
+    w_object.store(constants.PROCESS_PRIORITY_INDEX, priority)
+    w_object.store(constants.PROCESS_MY_LIST_INDEX, 'mli')
+    s_object = w_object.as_process_get_shadow()
+    assert s_object.next() == 'foo'
+    assert s_object.priority() == 3
+    assert s_object.my_list() == 'mli'
+    assert s_object.s_suspended_context() == w_context.as_context_get_shadow()
+
+



More information about the Pypy-commit mailing list