Author: Anton Gulenko <anton.gule...@googlemail.com> Branch: storage Changeset: r712:ab97a4252ed3 Date: 2014-03-27 20:52 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/ab97a4252ed3/
Log: Made the different *size() methods in model module more consistent. Removed space parameter. Added a constant. diff --git a/spyvm/constants.py b/spyvm/constants.py --- a/spyvm/constants.py +++ b/spyvm/constants.py @@ -59,6 +59,7 @@ LITERAL_START = 1 # index of the first literal after the method header BYTES_PER_WORD = 4 +WORDS_IN_FLOAT = 2 # Fixed number of word-slots in a Squeak Float object # ___________________________________________________________________________ # Special objects indices diff --git a/spyvm/interpreter_proxy.py b/spyvm/interpreter_proxy.py --- a/spyvm/interpreter_proxy.py +++ b/spyvm/interpreter_proxy.py @@ -192,13 +192,7 @@ @expose_on_virtual_machine_proxy([oop], int) def byteSizeOf(w_object): - s_class = w_object.class_shadow(IProxy.space) - size = s_class.instsize() - if s_class.isvariable(): - size += w_object.varsize(IProxy.space) - if not isinstance(w_object, model.W_BytesObject): - size *= 4 - return size + return w_object.bytesize(IProxy.space) @expose_on_virtual_machine_proxy([int, oop], list) def fetchArrayofObject(fieldIndex, w_object): @@ -308,7 +302,7 @@ @expose_on_virtual_machine_proxy([oop], int) def stSizeOf(w_object): - return w_object.varsize(IProxy.space) + return w_object.varsize() @expose_on_virtual_machine_proxy([int, oop, int], oop) def storeIntegerofObjectwithValue(n0, w_object, a): @@ -727,14 +721,13 @@ # #if VM_PROXY_MINOR > 5 @expose_on_virtual_machine_proxy([oop], bool, minor=5) def isArray(w_object): + # TODO - are ByteObjects and WordObjects not considered Arrays? + # What are the exact semantics of this? Should only the class Array return true? if not isinstance(w_object, model.W_PointersObject): return False space = IProxy.space s_class = w_object.class_shadow(space) - if s_class.instsize() == 0 and s_class.isvariable(): - return True - else: - return False + return s_class.instsize() == 0 and s_class.isvariable() @expose_on_virtual_machine_proxy([], int, minor=5) def forceInterruptCheck(): @@ -1156,7 +1149,7 @@ # # Class extensions for Array conversion # class __extend__(model.W_PointersObject): # def as_c_array(self, proxy): -# return map(lambda x: proxy.object_to_oop(x), self.vars[self.instsize(space):]) +# return map(lambda x: proxy.object_to_oop(x), self.vars[self.instsize():]) # class __extend__(model.W_BytesObject): # def as_c_array(self, proxy): diff --git a/spyvm/model.py b/spyvm/model.py --- a/spyvm/model.py +++ b/spyvm/model.py @@ -32,26 +32,35 @@ _attrs_ = [] # no RPython-level instance variables allowed in W_Object _settled_ = True repr_classname = "W_Object" + bytes_per_slot = constants.BYTES_PER_WORD def size(self): + """Return the number of "slots" or "items" in the receiver object. + This means different things for different objects. + For ByteObject, this means the number of bytes, for WordObject the number of words, + for PointerObject the number of pointers (regardless if it's varsized or not). + """ + return 0 + + def instsize(self): + """Return the number of slots of the object reserved for instance variables (not number of bytes). + Only returns something non-zero for W_PointersObjects, + because all other classes in this model hierarchy represent varsized classes (except for SmallInteger).""" + return 0 + + def varsize(self): + """Return number of slots in the of variable-sized part (not number of bytes). + Not necessarily number of bytes. + Variable sized objects are those created with #new:.""" + return self.size() - self.instsize() + + def bytesize(self): """Return bytesize that conforms to Blue Book. The reported size may differ from the actual size in Spy's object space, as memory representation varies depending on PyPy translation.""" - return 0 - - def instsize(self, space): - """Return the size of the object reserved for instance variables. - Only returns something non-zero for W_PointersObjects, W_Floats, and - W_LargePositiveInteger1Words""" - return 0 - - def varsize(self, space): - """Return bytesize of variable-sized part. - - Variable sized objects are those created with #new:.""" - return self.size() - + return self.size() * self.bytes_per_slot + def getclass(self, space): """Return Squeak class.""" raise NotImplementedError() @@ -279,6 +288,7 @@ """Large positive integer for exactly 1 word""" _attrs_ = ["value", "_exposed_size"] repr_classname = "W_LargePositiveInteger1Word" + bytes_per_slot = 1 def __init__(self, value, size=4): self.value = intmask(value) @@ -348,10 +358,10 @@ new_value = self.value & r_uint(~(0xff << skew)) new_value |= r_uint(byte << skew) self.value = intmask(new_value) - + def size(self): return self._exposed_size - + def invariant(self): return isinstance(self.value, int) @@ -450,7 +460,7 @@ self.value = float_unpack(r, 8) def size(self): - return 2 + return constants.WORDS_IN_FLOAT @signature.finishsigs class W_AbstractObjectWithClassReference(W_AbstractObjectWithIdentityHash): @@ -603,7 +613,7 @@ shadow_info = self.shadow.__repr__() if self.shadow.provides_getname: name = self._get_shadow().getname() - return '(%s) len=%d %s' % (shadow_info, self.size(), name) + return '(%s) len=%d [%s]' % (shadow_info, self.size(), name) def fetch_all(self, space): return [self.fetch(space, i) for i in range(self.size())] @@ -623,11 +633,11 @@ def at0(self, space, index0): # To test, at0 = in varsize part - return self.fetch(space, index0+self.instsize(space)) + return self.fetch(space, index0 + self.instsize()) def atput0(self, space, index0, w_value): # To test, at0 = in varsize part - self.store(space, index0 + self.instsize(space), w_value) + self.store(space, index0 + self.instsize(), w_value) def fetch(self, space, n0): return self._get_shadow().fetch(n0) @@ -635,16 +645,11 @@ def store(self, space, n0, w_value): return self._get_shadow().store(n0, w_value) - def varsize(self, space): - return self.size() - self.instsize(space) - - def instsize(self, space): - return self.class_shadow(space).instsize() - def size(self): - if not self.shadow: - return 0 return self._get_shadow().size() + + def instsize(self): + return self.class_shadow(self.space()).instsize() def store_shadow(self, shadow): self.shadow = shadow @@ -746,6 +751,7 @@ _attrs_ = ['bytes', 'c_bytes', '_size'] _immutable_fields_ = ['_size', 'bytes[*]?'] repr_classname = 'W_BytesObject' + bytes_per_slot = 1 def __init__(self, space, w_class, size): W_AbstractObjectWithClassReference.__init__(self, space, w_class) @@ -1032,7 +1038,7 @@ def size(self): return self._realsize - + def invariant(self): return False @@ -1245,9 +1251,14 @@ hasattr(self, 'primitive') and self.primitive is not None) - def size(self): + def bytesize(self, space): + # This is very special: words and bytes are mixed here. return self.headersize() + self.getliteralsize() + len(self.bytes) + def size(self): + # One word for the header. + return 1 + self.literalsize + len(self.bytes) + def gettempsize(self): return self.tempsize diff --git a/spyvm/primitives.py b/spyvm/primitives.py --- a/spyvm/primitives.py +++ b/spyvm/primitives.py @@ -15,7 +15,7 @@ raise PrimitiveFailedError() def assert_valid_index(space, n0, w_obj): - if not 0 <= n0 < w_obj.varsize(space): + if not 0 <= n0 < w_obj.varsize(): raise PrimitiveFailedError() # return the index, since from here on the annotator knows that # n0 cannot be negative @@ -406,7 +406,7 @@ def func(interp, s_frame, w_obj): if not w_obj.class_shadow(interp.space).isvariable(): raise PrimitiveFailedError() - return interp.space.wrap_int(w_obj.varsize(interp.space)) + return interp.space.wrap_int(w_obj.varsize()) @expose_primitive(STRING_AT, unwrap_spec=[object, index1_0]) def func(interp, s_frame, w_obj, n0): @@ -765,8 +765,8 @@ # might be different (e.g. Symbol and ByteString) if w_rcvr.__class__ is not w_replacement.__class__: raise PrimitiveFailedError - if (w_rcvr.size() - w_rcvr.instsize(interp.space) <= stop - or w_replacement.size() - w_replacement.instsize(interp.space) <= repStart + (stop - start)): + if (w_rcvr.size() - w_rcvr.instsize() <= stop + or w_replacement.size() - w_replacement.instsize() <= repStart + (stop - start)): raise PrimitiveFailedError() repOff = repStart - start for i0 in range(start, stop + 1): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit