[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