Author: Lars Wassermann <lars.wasserm...@gmail.com> Branch: Changeset: r415:8646558cfea0 Date: 2013-05-24 13:56 +0200 http://bitbucket.org/pypy/lang-smalltalk/changeset/8646558cfea0/
Log: added short access to bytes/words-objects (primitives 143, 144) diff --git a/spyvm/model.py b/spyvm/model.py --- a/spyvm/model.py +++ b/spyvm/model.py @@ -728,6 +728,26 @@ assert len(character) == 1 self.bytes[n0] = character + def short_at0(self, space, index0): + from rpython.rlib.rarithmetic import intmask + byte_index0 = index0 * 2 + byte0 = ord(self.getchar(byte_index0)) + byte1 = ord(self.getchar(byte_index0 + 1)) << 8 + if byte1 & 0x8000 != 0: + byte1 = intmask(0xffff0000 | byte1) + return space.wrap_int(byte1 | byte0) + + def short_atput0(self, space, index0, w_value): + from rpython.rlib.rarithmetic import int_between + i_value = space.unwrap_int(w_value) + if not int_between(-32768, i_value, 0x8000): + raise error.PrimitiveFailedError + byte_index0 = index0 * 2 + byte0 = i_value & 0xff + byte1 = (i_value & 0xff00) >> 8 + self.setchar(byte_index0, chr(byte0)) + self.setchar(byte_index0 + 1, chr(byte1)) + def size(self): return len(self.bytes) @@ -797,6 +817,29 @@ def setword(self, n, word): self.words[n] = r_uint(word) + def short_at0(self, space, index0): + word = self.getword(index0 / 2) + if index0 % 2 == 0: + short = word & 0xffff + else: + short = (word >> 16) & 0xffff + if short & 0x8000 != 0: + short = 0xffff0000 | short + return space.wrap_int(intmask(short)) + + def short_atput0(self, space, index0, w_value): + from rpython.rlib.rarithmetic import int_between + i_value = space.unwrap_int(w_value) + if not int_between(-32768, i_value, 0x8000): + raise error.PrimitiveFailedError + word_index0 = index0 / 2 + word = self.getword(word_index0) + if index0 % 2 == 0: + word = (word & 0xffff0000) | (i_value & 0xffff) + else: + word = (i_value << 16) | (word & 0xffff) + self.setword(word_index0, word) + def size(self): return len(self.words) diff --git a/spyvm/primitives.py b/spyvm/primitives.py --- a/spyvm/primitives.py +++ b/spyvm/primitives.py @@ -975,12 +975,27 @@ #____________________________________________________________________________ # Misc Primitives (138 - 149) VM_PATH = 142 +SHORT_AT = 143 +SHORT_AT_PUT = 144 CLONE = 148 @expose_primitive(VM_PATH, unwrap_spec=[object]) def func(interp, s_frame, w_receiver): return interp.space.wrap_string(os.path.join(os.getcwd(), '')) +@expose_primitive(SHORT_AT, unwrap_spec=[object, index1_0]) +def func(interp, s_frame, w_receiver, n0): + if not isinstance(w_receiver, (model.W_BytesObject, model.W_WordsObject)): + raise PrimitiveFailedError + return w_receiver.short_at0(interp.space, n0) + +@expose_primitive(SHORT_AT_PUT, unwrap_spec=[object, index1_0, object]) +def func(interp, s_frame, w_receiver, n0, w_value): + if not isinstance(w_receiver, (model.W_BytesObject, model.W_WordsObject)): + raise PrimitiveFailedError + return w_receiver.short_atput0(interp.space, n0) + + @expose_primitive(CLONE, unwrap_spec=[object]) def func(interp, s_frame, w_arg): return w_arg.clone(interp.space) diff --git a/spyvm/test/test_model.py b/spyvm/test/test_model.py --- a/spyvm/test/test_model.py +++ b/spyvm/test/test_model.py @@ -288,6 +288,42 @@ assert target.at0(space, i) == source.at0(space, i) assert hex(r_uint(target.value)) == hex(r_uint(source.value)) +def test_BytesObject_short_at(): + target = model.W_BytesObject(space, None, 4) + target.setchar(0, chr(0x00)) + target.setchar(1, chr(0x01)) + target.setchar(2, chr(0x10)) + target.setchar(3, chr(0x81)) + assert target.short_at0(space, 0).value == 0x0100 + assert target.short_at0(space, 1).value == intmask(0xffff8110) + +def test_BytesObject_short_atput(): + target = model.W_BytesObject(space, None, 4) + target.short_atput0(space, 0, space.wrap_int(0x0100)) + target.short_atput0(space, 1, space.wrap_int(intmask(0xffff8110))) + assert target.getchar(0) == chr(0x00) + assert target.getchar(1) == chr(0x01) + assert target.getchar(2) == chr(0x10) + assert target.getchar(3) == chr(0x81) + +def test_WordsObject_short_at(): + target = model.W_WordsObject(space, None, 2) + target.setword(0, r_uint(0x00018000)) + target.setword(1, r_uint(0x80010111)) + assert target.short_at0(space, 0).value == intmask(0xffff8000) + assert target.short_at0(space, 1).value == intmask(0x0001) + assert target.short_at0(space, 2).value == intmask(0x0111) + assert target.short_at0(space, 3).value == intmask(0xffff8001) + +def test_WordsObject_short_atput(): + target = model.W_WordsObject(space, None, 2) + target.short_atput0(space, 0, space.wrap_int(0x0100)) + target.short_atput0(space, 1, space.wrap_int(-1)) + target.short_atput0(space, 2, space.wrap_int(intmask(0xffff8000))) + target.short_atput0(space, 3, space.wrap_int(0x7fff)) + assert target.getword(0) == 0xffff0100 + assert target.getword(1) == 0x7fff8000 + @py.test.mark.skipif("socket.gethostname() == 'precise32'") def test_display_bitmap(): # XXX: Patch SDLDisplay -> get_pixelbuffer() to circumvent _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit