[pypy-svn] r63037 - pypy/branch/virtualizable-specnodes/pypy/jit/metainterp
fijal at codespeak.net
fijal at codespeak.net
Wed Mar 18 15:51:39 CET 2009
Author: fijal
Date: Wed Mar 18 15:51:38 2009
New Revision: 63037
Modified:
pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py
pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py
pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py
Log:
Remove terrible hacks by creating a BoxRetriever class
Modified: pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py (original)
+++ pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/optimize.py Wed Mar 18 15:51:38 2009
@@ -6,7 +6,7 @@
VirtualInstanceSpecNode, VirtualizableSpecNode, NotSpecNode,
DelayedSpecNode, SpecNodeWithBox, DelayedFixedListSpecNode,
VirtualFixedListSpecNode, MatchEverythingSpecNode,
- VirtualizableListSpecNode, av_eq, av_hash)
+ VirtualizableListSpecNode, av_eq, av_hash, BoxRetriever)
from pypy.jit.metainterp import executor
from pypy.rlib.objectmodel import we_are_translated
from pypy.rpython.lltypesystem import lltype, llmemory
@@ -503,19 +503,13 @@
def expanded_version_of(self, boxlist, oplist):
# oplist is None means at the start
- newboxlist = []
+ newboxes = BoxRetriever()
assert len(boxlist) == len(self.specnodes)
for i in range(len(boxlist)):
box = boxlist[i]
specnode = self.specnodes[i]
- specnode.expand_boxlist(self.nodes[box], newboxlist, oplist)
- l = []
- for i, (group, arg) in enumerate(newboxlist):
- l.append((group, i, arg))
- l.sort()
- return [e[2] for e in l]
-
- return newboxlist
+ specnode.expand_boxlist(self.nodes[box], newboxes, oplist)
+ return newboxes.flatten()
def deal_with_boxes(self, boxes):
storage = AllocationStorage()
@@ -836,14 +830,13 @@
old_mp = old_operations[0]
jump_op = self.loop.operations[-1]
self.specnodes = old_mp.specnodes
- newboxlist = []
+ newboxlist = BoxRetriever()
extensions = []
for i in range(len(old_mp.specnodes)):
old_specnode = old_mp.specnodes[i]
new_instnode = self.nodes[jump_op.args[i]]
old_specnode.adapt_to(new_instnode, newboxlist, extensions, num)
- newboxlist = [i for _, i in newboxlist]
- return newboxlist, extensions
+ return newboxlist.flatten(), extensions
class Chooser(object):
def __init__(self, boxes_from_frame, allocated_boxes, allocated_lists):
Modified: pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/pyjitpl.py Wed Mar 18 15:51:38 2009
@@ -17,6 +17,7 @@
from pypy.jit.metainterp import codewriter, optimize, executor
from pypy.rlib.rarithmetic import intmask
from pypy.rlib.objectmodel import specialize
+from pypy.jit.metainterp.specnode import BoxRetriever
# ____________________________________________________________
@@ -894,15 +895,11 @@
if mp.specnodes is None: # it is None only for tests
return args
assert len(mp.specnodes) == len(args)
- expanded_args = []
+ expanded_args = BoxRetriever()
for i in range(len(mp.specnodes)):
specnode = mp.specnodes[i]
specnode.extract_runtime_data(self.cpu, args[i], expanded_args)
- l = []
- for i, (group, arg) in enumerate(expanded_args):
- l.append((group, i, arg))
- l.sort()
- return [e[2] for e in l]
+ return expanded_args.flatten()
def _initialize_from_start(self, original_boxes, num_green_args, *args):
if args:
Modified: pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py (original)
+++ pypy/branch/virtualizable-specnodes/pypy/jit/metainterp/specnode.py Wed Mar 18 15:51:38 2009
@@ -8,13 +8,35 @@
def av_hash(self):
return self.sort_key()
+class BoxRetriever(object):
+ def __init__(self):
+ self.lists = [[]]
+ self.current = self.lists[0]
+
+ def flatten(self):
+ res = self.lists[0]
+ for i in range(1, len(self.lists)):
+ res.extend(self.lists[i])
+ return res
+
+ def extend(self, group):
+ while len(self.lists) <= group:
+ self.lists.append([])
+ self.current = self.lists[group]
+
+ def append(self, box):
+ self.current.append(box)
+
+ def reset(self):
+ self.current = self.lists[0]
+
class SpecNode(object):
- def expand_boxlist(self, instnode, newboxlist, start):
- newboxlist.append((0, instnode.source))
+ def expand_boxlist(self, instnode, newboxes, start):
+ newboxes.append(instnode.source)
def extract_runtime_data(self, cpu, valuebox, resultlist):
- resultlist.append((0, valuebox))
+ resultlist.append(valuebox)
def adapt_to(self, instnode, newboxlist, newspecnodes, num):
instnode.escaped = True
@@ -33,15 +55,15 @@
self.redirect_to = specnode
self.group = group
- def expand_boxlist(self, instnode, newboxlist, start):
- l = []
- self.redirect_to.expand_boxlist(instnode, l, start)
- newboxlist.extend([(self.group, e) for _, e in l])
-
- def extract_runtime_data(self, cpu, valuebox, resultlist):
- l = []
- self.redirect_to.extract_runtime_data(cpu, valuebox, l)
- resultlist.extend([(self.group, e) for _, e in l])
+ def expand_boxlist(self, instnode, newboxes, start):
+ newboxes.extend(self.group)
+ self.redirect_to.expand_boxlist(instnode, newboxes, start)
+ newboxes.reset()
+
+ def extract_runtime_data(self, cpu, valuebox, result):
+ result.extend(self.group)
+ self.redirect_to.extract_runtime_data(cpu, valuebox, result)
+ result.reset()
def adapt_to(self, *args):
self.redirect_to.adapt_to(*args)
@@ -167,11 +189,11 @@
class VirtualizedOrDelayedSpecNode(SpecNodeWithFields):
def expand_boxlist(self, instnode, newboxlist, start):
- newboxlist.append((0, instnode.source))
+ newboxlist.append(instnode.source)
SpecNodeWithFields.expand_boxlist(self, instnode, newboxlist, start)
def extract_runtime_data(self, cpu, valuebox, resultlist):
- resultlist.append((0, valuebox))
+ resultlist.append(valuebox)
SpecNodeWithFields.extract_runtime_data(self, cpu, valuebox, resultlist)
def adapt_to(self, instnode, newboxlist, newspecnodes, num):
@@ -183,21 +205,21 @@
def expand_boxlist(self, instnode, newboxlist, oplist):
from pypy.jit.metainterp.history import AbstractDescr
- newboxlist.append((0, instnode.source))
+ newboxlist.append(instnode.source)
for ofs, subspecnode in self.fields:
assert isinstance(subspecnode, SpecNodeWithBox)
if oplist is None:
instnode.cleanfields[ofs] = instnode.origfields[ofs]
- newboxlist.append((0, instnode.curfields[ofs].source))
+ newboxlist.append(instnode.curfields[ofs].source)
else:
if ofs in instnode.cleanfields:
- newboxlist.append((0, instnode.cleanfields[ofs].source))
+ newboxlist.append(instnode.cleanfields[ofs].source)
else:
box = subspecnode.box.clonebox()
assert isinstance(ofs, AbstractDescr)
oplist.append(ResOperation(rop.GETFIELD_GC,
[instnode.source], box, ofs))
- newboxlist.append((0, box))
+ newboxlist.append(box)
class DelayedFixedListSpecNode(DelayedSpecNode):
@@ -206,7 +228,7 @@
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.optimize import FixedList
- newboxlist.append((0, instnode.source))
+ newboxlist.append(instnode.source)
cls = self.known_class
assert isinstance(cls, FixedList)
arraydescr = cls.arraydescr
@@ -214,22 +236,22 @@
assert isinstance(subspecnode, SpecNodeWithBox)
if oplist is None:
instnode.cleanfields[ofs] = instnode.origfields[ofs]
- newboxlist.append((0, instnode.curfields[ofs].source))
+ newboxlist.append(instnode.curfields[ofs].source)
else:
if ofs in instnode.cleanfields:
- newboxlist.append((0, instnode.cleanfields[ofs].source))
+ newboxlist.append(instnode.cleanfields[ofs].source)
else:
box = subspecnode.box.clonebox()
oplist.append(ResOperation(rop.GETARRAYITEM_GC,
[instnode.source, ofs], box, arraydescr))
- newboxlist.append((0, box))
+ newboxlist.append(box)
def extract_runtime_data(self, cpu, valuebox, resultlist):
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.optimize import FixedList
from pypy.jit.metainterp.history import check_descr
- resultlist.append((0, valuebox))
+ resultlist.append(valuebox)
cls = self.known_class
assert isinstance(cls, FixedList)
arraydescr = cls.arraydescr
@@ -293,7 +315,7 @@
from pypy.jit.metainterp.optimize import FixedList
from pypy.jit.metainterp.history import check_descr
- resultlist.append((0, valuebox))
+ resultlist.append(valuebox)
cls = self.known_class
assert isinstance(cls, FixedList)
arraydescr = cls.arraydescr
More information about the Pypy-commit
mailing list