Author: Tim Felgentreff <timfelgentr...@gmail.com> Branch: 64bit Changeset: r574:4661bff0c7d3 Date: 2014-01-10 23:08 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/4661bff0c7d3/
Log: make more code word-size agnostic diff --git a/spyvm/constants.py b/spyvm/constants.py --- a/spyvm/constants.py +++ b/spyvm/constants.py @@ -142,7 +142,7 @@ "timerSemaphore" : SO_TIMER_SEMAPHORE, } -LONG_BIT = 32 +from rpython.rlib.rarithmetic import LONG_BIT TAGGED_MAXINT = 2 ** (LONG_BIT - 2) - 1 TAGGED_MININT = -2 ** (LONG_BIT - 2) diff --git a/spyvm/interpreter_proxy.py b/spyvm/interpreter_proxy.py --- a/spyvm/interpreter_proxy.py +++ b/spyvm/interpreter_proxy.py @@ -414,12 +414,12 @@ @expose_on_virtual_machine_proxy([int], oop) def positive32BitIntegerFor(n): - return IProxy.space.wrap_positive_32bit_int(n) + return IProxy.space.wrap_positive_1word_int(n) @expose_on_virtual_machine_proxy([oop], int) def positive32BitValueOf(n): from rpython.rlib.rarithmetic import intmask - return intmask(IProxy.space.unwrap_positive_32bit_int(n)) + return intmask(IProxy.space.unwrap_positive_1word_int(n)) # /* InterpreterProxy methodsFor: 'special objects' */ @@ -1165,4 +1165,4 @@ # class __extend__(model.W_WordsObject): # def as_c_array(self, proxy): -# return map(lambda x: proxy.object_to_oop(proxy.space.wrap_positive_32bit_int(x), self.words) +# return map(lambda x: proxy.object_to_oop(proxy.space.wrap_positive_1word_int(x), self.words) diff --git a/spyvm/model.py b/spyvm/model.py --- a/spyvm/model.py +++ b/spyvm/model.py @@ -174,7 +174,7 @@ upperbound = intmask(r_uint(-1) >> shift) if 0 <= self.value <= upperbound: shifted = intmask(self.value << shift) - return space.wrap_positive_32bit_int(shifted) + return space.wrap_positive_1word_int(shifted) else: try: shifted = ovfcheck(self.value << shift) @@ -280,7 +280,7 @@ upperbound = intmask(r_uint(-1) >> shift) if 0 <= self.value <= upperbound: shifted = intmask(self.value << shift) - return space.wrap_positive_32bit_int(shifted) + return space.wrap_positive_1word_int(shifted) else: raise error.PrimitiveFailedError() @@ -395,11 +395,11 @@ from rpython.rlib.rstruct.ieee import float_pack r = float_pack(self.value, 8) # C double if n0 == 0: - return space.wrap_positive_32bit_int(intmask(r >> 32)) + return space.wrap_positive_1word_int(intmask(r >> 32)) else: # bounds-check for primitive access is done in the primitive assert n0 == 1 - return space.wrap_positive_32bit_int(intmask(r)) + return space.wrap_positive_1word_int(intmask(r)) def store(self, space, n0, w_obj): from rpython.rlib.rstruct.ieee import float_unpack, float_pack diff --git a/spyvm/objspace.py b/spyvm/objspace.py --- a/spyvm/objspace.py +++ b/spyvm/objspace.py @@ -216,14 +216,14 @@ raise WrappingError("negative integer") if val >= 0: try: - return self.wrap_positive_32bit_int(intmask(val)) + return self.wrap_positive_1word_int(intmask(val)) except WrappingError: pass # XXX this code sucks import math bytes_len = int(math.log(val) / math.log(0xff)) + 1 if bytes_len <= 4: - return self.wrap_positive_32bit_int(intmask(val)) + return self.wrap_positive_1word_int(intmask(val)) else: return self._wrap_uint_loop(val, bytes_len) @@ -235,9 +235,9 @@ w_result.setchar(i, chr(intmask((val >> i*8) & 255))) return w_result - def wrap_positive_32bit_int(self, val): + def wrap_positive_1word_int(self, val): # This will always return a positive value. - # XXX: For now, we assume that val is at most 32bit, i.e. overflows are + # XXX: For now, we assume that val is at most 1word, i.e. overflows are # checked for before wrapping. if int_between(0, val, constants.TAGGED_MAXINT + 1): return model.W_SmallInteger(val) @@ -280,13 +280,13 @@ if w_value.value >= 0: return intmask(w_value.value) else: - raise UnwrappingError("The value is negative when interpreted as 32bit value.") + raise UnwrappingError("The value is negative when interpreted as 1 word value.") raise UnwrappingError("expected a W_SmallInteger or W_LargePositiveInteger1Word, got %s" % (w_value,)) def unwrap_uint(self, w_value): return w_value.unwrap_uint(self) - def unwrap_positive_32bit_int(self, w_value): + def unwrap_positive_1word_int(self, w_value): if isinstance(w_value, model.W_SmallInteger): if w_value.value >= 0: return r_uint(w_value.value) diff --git a/spyvm/plugins/fileplugin.py b/spyvm/plugins/fileplugin.py --- a/spyvm/plugins/fileplugin.py +++ b/spyvm/plugins/fileplugin.py @@ -112,7 +112,7 @@ except OSError: raise PrimitiveFailedError else: - return interp.space.wrap_positive_32bit_int(rarithmetic.intmask(pos)) + return interp.space.wrap_positive_1word_int(rarithmetic.intmask(pos)) @FilePlugin.expose_primitive(unwrap_spec=[object, int, int]) def primitiveFileSetPosition(interp, s_frame, w_rcvr, fd, position): @@ -128,7 +128,7 @@ file_info = os.fstat(fd) except OSError: raise PrimitiveFailedError - return interp.space.wrap_positive_32bit_int(rarithmetic.intmask(file_info.st_size)) + return interp.space.wrap_positive_1word_int(rarithmetic.intmask(file_info.st_size)) @FilePlugin.expose_primitive(unwrap_spec=[object]) def primitiveFileStdioHandles(interp, s_frame, w_rcvr): @@ -148,7 +148,7 @@ except OSError: raise PrimitiveFailedError else: - return space.wrap_positive_32bit_int(rarithmetic.intmask(written)) + return space.wrap_positive_1word_int(rarithmetic.intmask(written)) @jit.elidable def smalltalk_timestamp(space, sec_since_epoch): diff --git a/spyvm/primitives.py b/spyvm/primitives.py --- a/spyvm/primitives.py +++ b/spyvm/primitives.py @@ -49,7 +49,7 @@ # converted to an index0 index1_0 = object() char = object() -pos_32bit_int = object() +pos_1word_int = object() def expose_primitive(code, unwrap_spec=None, no_result=False, result_is_new_frame=False, may_context_switch=True, @@ -121,8 +121,8 @@ w_arg = s_frame.peek(index) if spec is int: args += (interp.space.unwrap_int(w_arg), ) - elif spec is pos_32bit_int: - args += (interp.space.unwrap_positive_32bit_int(w_arg),) + elif spec is pos_1word_int: + args += (interp.space.unwrap_positive_1word_int(w_arg),) elif spec is index1_0: args += (interp.space.unwrap_int(w_arg)-1, ) elif spec is float: @@ -204,10 +204,10 @@ } for (code,op) in bitwise_binary_ops.items(): def make_func(op): - @expose_primitive(code, unwrap_spec=[pos_32bit_int, pos_32bit_int]) + @expose_primitive(code, unwrap_spec=[pos_1word_int, pos_1word_int]) def func(interp, s_frame, receiver, argument): res = op(receiver, argument) - return interp.space.wrap_positive_32bit_int(rarithmetic.intmask(res)) + return interp.space.wrap_int(rarithmetic.intmask(res)) make_func(op) # #/ -- return the result of a division, only succeed if the division is exact @@ -248,8 +248,6 @@ @expose_primitive(BIT_SHIFT, unwrap_spec=[object, int]) def func(interp, s_frame, receiver, argument): from rpython.rlib.rarithmetic import LONG_BIT - # XXX: 32-bit images only! - # LONG_BIT = 32 if -LONG_BIT < argument < LONG_BIT: # overflow-checking done in lshift implementations if argument > 0: @@ -1072,7 +1070,7 @@ raise PrimitiveFailedError return w_receiver.short_atput0(interp.space, n0, w_value) -@expose_primitive(FILL, unwrap_spec=[object, pos_32bit_int]) +@expose_primitive(FILL, unwrap_spec=[object, pos_1word_int]) def func(interp, s_frame, w_arg, new_value): space = interp.space if isinstance(w_arg, model.W_BytesObject): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit