Author: Lars Wassermann <[email protected]>
Branch:
Changeset: r65:ab075701b725
Date: 2013-02-20 12:00 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/ab075701b725/
Log: refactored pushClosureCopyCopiedValuesBytecode via MethodExtract for
the primitive closureCopyWithCopiedValues(200)
diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -400,6 +400,15 @@
index_in_array, w_indirectTemps = self._extract_index_and_temps()
w_indirectTemps.atput0(self.space, index_in_array, self.pop())
+ def _newClosure(self, numArgs, pc, numCopied):
+ BlockClosureShadow =
self.space.w_BlockClosure.as_class_get_shadow(self.space)
+ w_closure = BlockClosureShadow.new(numCopied)
+ closure = wrapper.BlockClosureWrapper(self.space, w_closure)
+ closure.store_outerContext(self._w_self)
+ closure.store_startpc(pc)
+ closure.store_numArgs(numArgs)
+ return closure, w_closure
+
def pushClosureCopyCopiedValuesBytecode(self, interp):
""" Copied from Blogpost:
http://www.mirandabanda.org/cogblog/2008/07/22/closures-part-ii-the-bytecodes/
ContextPart>>pushClosureCopyNumCopiedValues: numCopied numArgs:
numArgs blockSize: blockSize
@@ -427,12 +436,7 @@
i = self.getbytecode()
blockSize = (j << 8) | i
#create new instance of BlockClosure
- BlockClosureShadow = space.w_BlockClosure.as_class_get_shadow(space)
- w_closure = BlockClosureShadow.new(numCopied)
- closure = wrapper.BlockClosureWrapper(space, w_closure)
- closure.store_outerContext(self._w_self)
- closure.store_startpc(self.pc())
- closure.store_numArgs(numArgs)
+ closure, w_closure = self._newClosure(numArgs, self.pc(), numCopied)
if numCopied > 0:
copiedValues = self.pop_and_return_n(numCopied)
for i0 in range(numCopied):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit