Author: Tim Felgentreff <timfelgentr...@gmail.com> Branch: vref Changeset: r848:a0a057d2e444 Date: 2014-07-02 13:05 +0200 http://bitbucket.org/pypy/lang-smalltalk/changeset/a0a057d2e444/
Log: commit first translating version where all senders are vrefs diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py --- a/spyvm/interpreter.py +++ b/spyvm/interpreter.py @@ -86,6 +86,7 @@ s_new_context = self.c_loop(s_new_context) except StackOverflow, e: s_new_context = e.s_context + s_new_context.unvirtualize_sender() except Return, nlr: s_new_context = s_sender while s_new_context is not nlr.s_target_context: @@ -98,9 +99,11 @@ except ProcessSwitch, p: if self.trace: print "====== Switch from: %s to: %s ======" % (s_new_context.short_str(), p.s_new_context.short_str()) + s_new_context.unvirtualize_sender() s_new_context = p.s_new_context def c_loop(self, s_context, may_context_switch=True): + assert isinstance(s_context, ContextPartShadow) old_pc = 0 if not jit.we_are_jitted() and may_context_switch: self.quick_check_for_interrupt(s_context) diff --git a/spyvm/model.py b/spyvm/model.py --- a/spyvm/model.py +++ b/spyvm/model.py @@ -203,7 +203,7 @@ return r_uint(val) - @jit.elidable + # @jit.elidable def as_repr_string(self): return "W_SmallInteger(%d)" % self.value @@ -457,7 +457,7 @@ name = self.s_class.name return "a %s" % (name or '?',) - @jit.elidable + # @jit.elidable def as_repr_string(self): return self.as_embellished_string("W_O /w Class", "") @@ -491,7 +491,7 @@ class W_AbstractPointersObject(W_AbstractObjectWithClassReference): """Common object.""" _attrs_ = ['shadow'] - + def changed(self): # This is invoked when an instance-variable is changed. # Kept here in case it might be usefull in the future. @@ -550,7 +550,7 @@ def _get_shadow(self): return self.shadow - + @objectmodel.specialize.arg(2) def attach_shadow_of_class(self, space, TheClass): shadow = TheClass(space, self) @@ -632,7 +632,7 @@ w_other.changed() return True - @jit.elidable + # @jit.elidable def as_repr_string(self): return W_AbstractObjectWithClassReference.as_embellished_string(self, className='W_PointersObject', @@ -651,11 +651,11 @@ self.fieldtypes = fieldtypes_of_length(self.s_class, size) for i in range(size): # do it by hand for the JIT's sake vars[i] = w_nil - + def set_vars(self, new_vars): self._vars = new_vars make_sure_not_resized(self._vars) - + def fillin(self, space, g_self): W_AbstractPointersObject.fillin(self, space, g_self) from spyvm.fieldtypes import fieldtypes_of @@ -1013,7 +1013,7 @@ _immutable_fields_ = ['_realsize', 'display', '_depth', '_real_depth_buffer'] pixelbuffer = None - + @staticmethod def create(space, w_class, size, depth, display): if depth < 8: diff --git a/spyvm/primitives.py b/spyvm/primitives.py --- a/spyvm/primitives.py +++ b/spyvm/primitives.py @@ -1315,7 +1315,7 @@ # Set some fields s_block_ctx.store_pc(s_block_ctx.initialip()) try: - s_block_ctx.store_s_sender(s_frame) + s_block_ctx.store_s_sender(virtual=jit.virtual_ref(s_frame)) except SenderChainManipulation, e: assert e.s_context == s_block_ctx return s_block_ctx diff --git a/spyvm/shadow.py b/spyvm/shadow.py --- a/spyvm/shadow.py +++ b/spyvm/shadow.py @@ -34,7 +34,7 @@ import_from_mixin(version.VersionMixin) version = None - + def __init__(self, space, w_self): AbstractShadow.__init__(self, space, w_self) self.changed() @@ -78,7 +78,7 @@ _attrs_ = ["name", "_instance_size", "instance_varsized", "instance_kind", "_s_methoddict", "_s_superclass", "subclass_s"] - + def __init__(self, space, w_self): # fields added here should also be in objspace.py:56ff, 300ff self.name = '' @@ -449,17 +449,19 @@ class ContextPartShadow(AbstractRedirectingShadow): __metaclass__ = extendabletype - _attrs_ = ['_s_sender', '_pc', '_temps_and_stack', + _attrs_ = ['_direct_s_sender', '_virtual_s_sender', '_pc', '_temps_and_stack', '_stack_ptr', 'instances_w'] _virtualizable_ = [ - "_s_sender", "_pc", + "_virtual_s_sender", "_direct_s_sender", + "_pc", "_temps_and_stack[*]", "_stack_ptr", "_w_self", "_w_self_size" ] def __init__(self, space, w_self): - self._s_sender = None + self._virtual_s_sender = jit.vref_None + self._direct_s_sender = None AbstractRedirectingShadow.__init__(self, space, w_self) self.instances_w = {} @@ -541,25 +543,35 @@ " Return self of the method, or the method that contains the block " return self.s_home().w_receiver() - def store_s_sender(self, s_sender): - assert s_sender is None or isinstance(s_sender, ContextPartShadow) - self._s_sender = s_sender - raise error.SenderChainManipulation(self) + def store_s_sender(self, direct=None, virtual=jit.vref_None, raiseError=True): + assert direct is None or virtual is jit.vref_None # can only set one or the other + if self._virtual_s_sender is not jit.vref_None and virtual is jit.vref_None: + # if we have a vref but we're removing it... + sender = self._virtual_s_sender() + jit.virtual_ref_finish(self._virtual_s_sender, sender) + self._virtual_s_sender = virtual + self._direct_s_sender = direct + if raiseError: + raise error.SenderChainManipulation(self) def store_w_sender(self, w_sender): assert isinstance(w_sender, model.W_PointersObject) if w_sender.is_same_object(self.space.w_nil): - self._s_sender = None + self.store_s_sender(raiseError=False) else: - self.store_s_sender(w_sender.as_context_get_shadow(self.space)) + self.store_s_sender(direct=w_sender.as_context_get_shadow(self.space)) def w_sender(self): - if self._s_sender is None: + sender = self.s_sender() + if sender is None: return self.space.w_nil - return self._s_sender.w_self() + return sender.w_self() def s_sender(self): - return self._s_sender + if self._direct_s_sender: + return self._direct_s_sender + else: + return self._virtual_s_sender() def store_unwrap_pc(self, w_pc): if w_pc.is_same_object(self.space.w_nil): @@ -592,10 +604,16 @@ def mark_returned(self): self.store_pc(-1) try: - self.store_s_sender(None) + self.store_s_sender() except error.SenderChainManipulation, e: assert self == e.s_context + def unvirtualize_sender(self): + sender = self.s_sender() + self.store_s_sender(direct=sender, raiseError=False) + if sender: + sender.unvirtualize_sender() + def is_returned(self): return self.pc() == -1 and self.w_sender is self.space.w_nil @@ -879,7 +897,7 @@ s_new_context.store_w_method(s_method.w_self()) if s_sender: try: - s_new_context.store_s_sender(s_sender) + s_new_context.store_s_sender(virtual=jit.virtual_ref(s_sender)) except error.SenderChainManipulation, e: assert s_new_context == e.s_context s_new_context.store_w_receiver(w_receiver) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit