[pypy-commit] pypy optresult: whack whack whack
fijal
noreply at buildbot.pypy.org
Tue May 26 14:07:12 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77574:5dd0334a5f3b
Date: 2015-05-26 14:07 +0200
http://bitbucket.org/pypy/pypy/changeset/5dd0334a5f3b/
Log: whack whack whack
diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -126,6 +126,19 @@
count += 1
return count
+ def visitor_walk_recursive(self, instbox, visitor, optimizer):
+ if visitor.already_seen_virtual(instbox):
+ return
+ lst = self.vdescr.all_fielddescrs
+ assert self.is_virtual()
+ visitor.register_virtual_fields(instbox, [box for box in self._fields])
+ for i in range(len(lst)):
+ op = self._fields[i]
+ if op and op.type == 'r':
+ fieldinfo = optimizer.getptrinfo(op)
+ if fieldinfo and fieldinfo.is_virtual():
+ fieldinfo.visitor_walk_recursive(op, visitor, optimizer)
+
class InstancePtrInfo(AbstractStructPtrInfo):
_attrs_ = ('_known_class',)
_fields = None
@@ -137,18 +150,6 @@
def get_known_class(self, cpu):
return self._known_class
- def visitor_walk_recursive(self, instbox, visitor):
- if visitor.already_seen_virtual(instbox):
- return
- #lst = op.getdescr().parent_descr.all_fielddescrs
- assert self.is_virtual()
- visitor.register_virtual_fields(instbox,
- [box for box in self._fields if box])
- #for i in range(len(lst)):
- # descr = lst[descr]
- # fieldvalue = self._fields[ofs]
- # fieldvalue.visitor_walk_recursive(visitor)
-
@specialize.argtype(1)
def visitor_dispatch_virtual_type(self, visitor):
fielddescrs = self.vdescr.all_fielddescrs
@@ -158,9 +159,15 @@
class StructPtrInfo(AbstractStructPtrInfo):
def __init__(self, vdescr=None):
self.vdescr = vdescr
-
+
+ @specialize.argtype(1)
+ def visitor_dispatch_virtual_type(self, visitor):
+ fielddescrs = self.vdescr.all_fielddescrs
+ assert self.is_virtual()
+ return visitor.visit_vstruct(self.vdescr, fielddescrs)
+
class ArrayPtrInfo(AbstractVirtualPtrInfo):
- _attrs_ = ('length', '_items', 'lenbound')
+ _attrs_ = ('length', '_items', 'lenbound', '_clear')
_items = None
lenbound = None
@@ -170,6 +177,7 @@
self.vdescr = vdescr
if vdescr is not None:
self._init_items(const, size, clear)
+ self._clear = clear
def _init_items(self, const, size, clear):
self.length = size
@@ -211,6 +219,19 @@
def getlength(self):
return self.length
+ def visitor_walk_recursive(self, instbox, visitor, optimizer):
+ itemops = [item for item in self._items if item]
+ visitor.register_virtual_fields(instbox, itemops)
+ for i in range(self.getlength()):
+ itemop = self._items[i]
+ if itemop is not None and itemop.type == 'r':
+ xxxx
+ itemvalue.visitor_walk_recursive(visitor)
+
+ @specialize.argtype(1)
+ def visitor_dispatch_virtual_type(self, visitor):
+ return visitor.visit_varray(self.vdescr, self._clear)
+
class ArrayStructInfo(ArrayPtrInfo):
def __init__(self, size, vdescr=None):
self.length = size
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -391,7 +391,7 @@
else:
assert tagbits == TAGVIRTUAL
info = optimizer.getptrinfo(box)
- info.visitor_walk_recursive(box, self)
+ info.visitor_walk_recursive(box, self, optimizer)
for setfield_op in pending_setfields:
box = setfield_op.getarg(0)
@@ -400,7 +400,7 @@
self.register_box(fieldbox)
info = optimizer.getptrinfo(fieldbox)
assert info is not None and info.is_virtual()
- info.visitor_walk_recursive(fieldbox, self)
+ info.visitor_walk_recursive(fieldbox, self, optimizer)
self._number_virtuals(liveboxes, optimizer, v)
self._add_pending_fields(pending_setfields)
@@ -482,6 +482,8 @@
box = op.getarg(0)
fieldbox = op.getarg(1)
descr = op.getdescr()
+ if op.getopnum() == rop.SETARRAYITEM_GC:
+ xxx
#descr, box, fieldbox, itemindex = pending_setfields[i]
lldescr = annlowlevel.cast_instance_to_base_ptr(descr)
num = self._gettagged(box)
@@ -494,7 +496,7 @@
rd_pendingfields[i].lldescr = lldescr
rd_pendingfields[i].num = num
rd_pendingfields[i].fieldnum = fieldnum
- rd_pendingfields[i].itemindex = rffi.cast(rffi.INT, 0) # XXXX itemindex
+ rd_pendingfields[i].itemindex = rffi.cast(rffi.INT, -1) # XXXX itemindex
self.storage.rd_pendingfields = rd_pendingfields
def _gettagged(self, box):
@@ -531,7 +533,9 @@
def setfields(self, decoder, struct):
for i in range(len(self.fielddescrs)):
descr = self.fielddescrs[i]
- decoder.setfield(struct, self.fieldnums[i], descr)
+ num = self.fieldnums[i]
+ if not tagged_eq(num, UNINITIALIZED):
+ decoder.setfield(struct, num, descr)
return struct
def debug_prints(self):
More information about the pypy-commit
mailing list