[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