[pypy-commit] lang-smalltalk storage-display-refactoring: Added FormWrapper to clean up display handling code.
anton_gulenko
noreply at buildbot.pypy.org
Tue Jul 22 19:47:43 CEST 2014
Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage-display-refactoring
Changeset: r932:f151c3506b41
Date: 2014-07-21 19:16 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/f151c3506b41/
Log: Added FormWrapper to clean up display handling code.
diff --git a/spyvm/interpreter_proxy.py b/spyvm/interpreter_proxy.py
--- a/spyvm/interpreter_proxy.py
+++ b/spyvm/interpreter_proxy.py
@@ -17,7 +17,7 @@
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rlib.unroll import unrolling_iterable
-from spyvm import error, model, model_display, objspace
+from spyvm import error, model, model_display, objspace, wrapper
sqInt = rffi.INT
sqLong = rffi.LONG
@@ -559,7 +559,8 @@
# display memory
space = IProxy.space
if w_dest_form.is_same_object(space.objtable['w_display']):
- w_display_bitmap = model_display.get_display_bitmap(IProxy.interp, w_dest_form)
+ form = wrapper.FormWrapper(space, w_dest_form)
+ w_display_bitmap = form.get_display_bitmap(IProxy.interp)
w_display_bitmap.update_from_buffer()
w_display_bitmap.flush_to_screen()
return 0
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -734,14 +734,13 @@
if not isinstance(w_rcvr, model.W_PointersObject) or w_rcvr.size() < 4:
raise PrimitiveFailedError
- # the fields required are bits (a pointer to a Bitmap), width, height, depth
-
- # XXX: TODO get the initial image TODO: figure out whether we
- # should decide the width an report it in the other SCREEN_SIZE
- w_bitmap = w_rcvr.fetch(interp.space, 0)
- width = interp.space.unwrap_int(w_rcvr.fetch(interp.space, 1))
- height = interp.space.unwrap_int(w_rcvr.fetch(interp.space, 2))
- depth = interp.space.unwrap_int(w_rcvr.fetch(interp.space, 3))
+
+ # TODO: figure out whether we should decide the width an report it in the SCREEN_SIZE primitive
+ form = wrapper.FormWrapper(interp.space, w_rcvr)
+ w_bitmap = form.bits()
+ width = form.width()
+ height = form.height()
+ depth = form.depth()
sdldisplay = None
@@ -751,7 +750,7 @@
if isinstance(w_prev_bitmap, model_display.W_DisplayBitmap):
sdldisplay = w_prev_bitmap.display
sdldisplay.set_video_mode(width, height, depth)
-
+
if isinstance(w_bitmap, model_display.W_DisplayBitmap):
assert (sdldisplay is None) or (sdldisplay is w_bitmap.display)
sdldisplay = w_bitmap.display
@@ -759,7 +758,7 @@
w_display_bitmap = w_bitmap
else:
assert isinstance(w_bitmap, model.W_WordsObject)
- w_display_bitmap = model_display.get_display_bitmap(interp, w_rcvr, sdldisplay=sdldisplay)
+ w_display_bitmap = form.get_display_bitmap(interp, sdldisplay)
w_display_bitmap.flush_to_screen()
if interp.image:
diff --git a/spyvm/wrapper.py b/spyvm/wrapper.py
--- a/spyvm/wrapper.py
+++ b/spyvm/wrapper.py
@@ -1,4 +1,4 @@
-from spyvm import model, constants
+from spyvm import model, model_display, constants
from spyvm.error import FatalError, WrapperException, PrimitiveFailedError
class Wrapper(object):
@@ -263,6 +263,21 @@
def size(self):
return self._w_self.size() - constants.BLKCLSR_SIZE
+class FormWrapper(Wrapper):
+ bits, store_bits = make_getter_setter(constants.FORM_BITS)
+ width, store_width = make_int_getter_setter(constants.FORM_WIDTH)
+ height, store_height = make_int_getter_setter(constants.FORM_HEIGHT)
+ depth, store_depth = make_int_getter_setter(constants.FORM_DEPTH)
+
+ def get_display_bitmap(self, interp, sdldisplay=None):
+ w_bitmap = self.bits()
+ if not isinstance(w_bitmap, model_display.W_DisplayBitmap):
+ w_display_bitmap = model_display.from_words_object(interp, w_bitmap, self, sdldisplay)
+ self.store_bits(w_display_bitmap)
+ else:
+ w_display_bitmap = w_bitmap
+ return w_display_bitmap
+
# XXX Wrappers below are not used yet.
class OffsetWrapper(Wrapper):
offset_x = make_int_getter(0)
More information about the pypy-commit
mailing list