[pypy-commit] pypy stmgc-c4: start implementing repeated write and read barriers in stmrewrite and gc (WIP)
Raemi
noreply at buildbot.pypy.org
Tue Oct 22 14:50:57 CEST 2013
Author: Remi Meier <remi.meier at gmail.com>
Branch: stmgc-c4
Changeset: r67512:bea8518a7ce2
Date: 2013-10-22 12:19 +0200
http://bitbucket.org/pypy/pypy/changeset/bea8518a7ce2/
Log: start implementing repeated write and read barriers in stmrewrite
and gc (WIP)
diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -428,10 +428,13 @@
class STMReadBarrierDescr(STMBarrierDescr):
def __init__(self, gc_ll_descr, stmcat):
- assert stmcat == 'P2R'
- STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
- 'stm_DirectReadBarrier')
- # XXX: implement fastpath then change to stm_DirectReadBarrier
+ assert stmcat in ['A2R', 'Q2R']
+ if stmcat == 'A2R':
+ STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
+ 'stm_DirectReadBarrier')
+ else:
+ STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
+ 'stm_RepeatReadBarrier')
@specialize.arg(2)
def _do_barrier(self, gcref_struct, returns_modified_object):
@@ -440,20 +443,27 @@
objadr = llmemory.cast_ptr_to_adr(gcref_struct)
objhdr = rffi.cast(StmGC.GCHDRP, gcref_struct)
- # if h_revision == privat_rev of transaction
- priv_rev = self.llop1.stm_get_adr_of_private_rev_num(rffi.SIGNEDP)
- if objhdr.h_revision == priv_rev[0]:
- return gcref_struct
+ if self.stmcat == 'A2R':
+ # if h_revision == privat_rev of transaction
+ priv_rev = self.llop1.stm_get_adr_of_private_rev_num(rffi.SIGNEDP)
+ if objhdr.h_revision == priv_rev[0]:
+ return gcref_struct
- # readcache[obj] == obj
- read_cache = self.llop1.stm_get_adr_of_read_barrier_cache(rffi.SIGNEDP)
- objint = llmemory.cast_adr_to_int(objadr)
- assert WORD == 8, "check for 32bit compatibility"
- index = (objint & StmGC.FX_MASK) / WORD
- CP = lltype.Ptr(rffi.CArray(lltype.Signed))
- rcp = rffi.cast(CP, read_cache[0])
- if rcp[index] == objint:
- return gcref_struct
+ # readcache[obj] == obj
+ read_cache = self.llop1.stm_get_adr_of_read_barrier_cache(rffi.SIGNEDP)
+ objint = llmemory.cast_adr_to_int(objadr)
+ assert WORD == 8, "check for 32bit compatibility"
+ index = (objint & StmGC.FX_MASK) / WORD
+ CP = lltype.Ptr(rffi.CArray(lltype.Signed))
+ rcp = rffi.cast(CP, read_cache[0])
+ if rcp[index] == objint:
+ return gcref_struct
+ else: # 'Q2R'
+ # is GCFLAG_PUBLIC_TO_PRIVATE or GCFLAG_MOVED set?
+ if not (objhdr.h_tid &
+ (StmGC.GCFLAG_PUBLIC_TO_PRIVATE | StmGC.GCFLAG_MOVED)):
+ # no.
+ return gcref_struct
funcptr = self.get_barrier_funcptr(returns_modified_object)
res = funcptr(objadr)
@@ -462,9 +472,14 @@
class STMWriteBarrierDescr(STMBarrierDescr):
def __init__(self, gc_ll_descr, stmcat):
- assert stmcat in ['P2W']
- STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
- 'stm_WriteBarrier')
+ assert stmcat in ['A2W', 'V2W']
+ if stmcat == 'A2W':
+ STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
+ 'stm_WriteBarrier')
+ else:
+ STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
+ 'stm_RepeatWriteBarrier')
+
@specialize.arg(2)
def _do_barrier(self, gcref_struct, returns_modified_object):
@@ -473,9 +488,9 @@
objadr = llmemory.cast_ptr_to_adr(gcref_struct)
objhdr = rffi.cast(StmGC.GCHDRP, gcref_struct)
- # if h_revision == privat_rev of transaction
+ # if it is a repeated WB or h_revision == privat_rev of transaction
priv_rev = self.llop1.stm_get_adr_of_private_rev_num(rffi.SIGNEDP)
- if objhdr.h_revision == priv_rev[0]:
+ if self.stmcat == 'V2W' or objhdr.h_revision == priv_rev[0]:
# also WRITE_BARRIER not set?
if not (objhdr.h_tid & StmGC.GCFLAG_WRITE_BARRIER):
return gcref_struct
@@ -580,8 +595,10 @@
def _setup_write_barrier(self):
if self.stm:
- self.P2Rdescr = STMReadBarrierDescr(self, 'P2R')
- self.P2Wdescr = STMWriteBarrierDescr(self, 'P2W')
+ self.A2Rdescr = STMReadBarrierDescr(self, 'A2R')
+ self.Q2Rdescr = STMReadBarrierDescr(self, 'Q2R')
+ self.A2Wdescr = STMWriteBarrierDescr(self, 'A2W')
+ self.V2Wdescr = STMWriteBarrierDescr(self, 'V2W')
self.write_barrier_descr = "wbdescr: do not use"
else:
self.write_barrier_descr = WriteBarrierDescr(self)
diff --git a/rpython/jit/backend/llsupport/stmrewrite.py b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -12,7 +12,7 @@
#
# Any SETFIELD_GC, SETARRAYITEM_GC, SETINTERIORFIELD_GC must be done on a
# W object. The operation that forces an object p1 to be W is
-# COND_CALL_STM_B(p1, descr=x2Wdescr), for x in 'PGORL'. This
+# COND_CALL_STM_B(p1, descr=x2Wdescr), for x in 'AIQRVWZ'. This
# COND_CALL_STM_B is a bit special because if p1 is not W, it *replaces*
# its value with the W copy (by changing the register's value and
# patching the stack location if any). It's still conceptually the same
@@ -25,6 +25,8 @@
#
+
+
class GcStmRewriterAssembler(GcRewriterAssembler):
# This class performs the same rewrites as its base class,
# plus the rewrites described above.
@@ -33,14 +35,7 @@
GcRewriterAssembler.__init__(self, *args)
self.known_category = {} # variable: letter (R, W, ...)
self.always_inevitable = False
- self.more_precise_categories = {
- 'P': {'R': self.gc_ll_descr.P2Rdescr,
- 'W': self.gc_ll_descr.P2Wdescr,
- },
- 'R': {'W': self.gc_ll_descr.P2Wdescr,
- },
- 'W': {},
- }
+
def rewrite(self, operations):
# overridden method from parent class
@@ -115,8 +110,6 @@
continue
# ---------- mallocs ----------
if op.is_malloc():
- # write barriers not valid after possible collection
- self.write_to_read_categories()
self.handle_malloc_operation(op)
continue
# ---------- calls ----------
@@ -195,20 +188,45 @@
assert not insert_transaction_break
return self.newops
+ def emitting_an_operation_that_can_collect(self):
+ GcRewriterAssembler.emitting_an_operation_that_can_collect(self)
+ self.invalidate_write_categories()
+
def next_op_may_be_in_new_transaction(self):
self.known_category.clear()
-
- def write_to_read_categories(self):
+
+ def invalidate_write_categories(self):
for v, c in self.known_category.items():
if c == 'W':
- self.known_category[v] = 'R'
+ self.known_category[v] = 'V'
- def clear_readable_statuses(self, reason):
+ def invalidate_read_categories(self, reason):
# XXX: needs aliasing info to be better
# XXX: move to optimizeopt to only invalidate same typed vars?
for v, c in self.known_category.items():
if c == 'R':
- self.known_category[v] = 'P'
+ self.known_category[v] = 'Q'
+
+
+ def get_barrier_descr(self, from_cat, to_cat):
+ # compare with translator.stm.funcgen.stm_barrier
+ # XXX: specialize more with info of IMMUTABLE and NOPTR
+ if from_cat >= to_cat:
+ return None
+
+ gc = self.gc_ll_descr
+ if to_cat == 'W':
+ if from_cat >= 'V':
+ return gc.V2Wdescr
+ return gc.A2Wdescr
+ elif to_cat == 'V':
+ return gc.A2Wdescr
+ elif to_cat == 'R':
+ if from_cat >= 'Q':
+ return gc.Q2Rdescr
+ return gc.A2Rdescr
+ elif to_cat == 'I':
+ return gc.A2Rdescr
def gen_initialize_tid(self, v_newgcobj, tid):
GcRewriterAssembler.gen_initialize_tid(self, v_newgcobj, tid)
@@ -217,24 +235,23 @@
descr=self.gc_ll_descr.fielddescr_rev)
self.newops.append(op)
-
-
def gen_write_barrier(self, v):
raise NotImplementedError
def gen_barrier(self, v_base, target_category):
v_base = self.unconstifyptr(v_base)
assert isinstance(v_base, BoxPtr)
- source_category = self.known_category.get(v_base, 'P')
+ source_category = self.known_category.get(v_base, 'A')
+ write_barrier_descr = self.get_barrier_descr(source_category,
+ target_category)
+ if write_barrier_descr is None:
+ return v_base # no barrier needed
+
if target_category == 'W':
# if *any* of the readable vars is the same object,
# it must repeat the read_barrier now
- self.clear_readable_statuses(v_base)
- mpcat = self.more_precise_categories[source_category]
- try:
- write_barrier_descr = mpcat[target_category]
- except KeyError:
- return v_base # no barrier needed
+ self.invalidate_read_categories(v_base)
+
args = [v_base,]
op = rop.COND_CALL_STM_B
self.newops.append(ResOperation(op, args, None,
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -93,7 +93,7 @@
jump()
""", """
[p1, p2]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
stm_transaction_break(1)
jump()
@@ -109,7 +109,7 @@
""", """
[p1, p2]
p3 = same_as(ConstPtr(t))
- cond_call_stm_b(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=A2Wdescr)
setfield_gc(p3, p2, descr=tzdescr)
stm_transaction_break(1)
jump()
@@ -130,11 +130,11 @@
[p0]
p1 = same_as(ConstPtr(t))
p2 = same_as(ConstPtr(t))
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p3 = getfield_gc(p1, descr=tzdescr)
- cond_call_stm_b(p2, descr=P2Wdescr)
+ cond_call_stm_b(p2, descr=A2Wdescr)
setfield_gc(p2, p0, descr=tzdescr)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=Q2Rdescr)
p4 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break(1)
jump()
@@ -153,11 +153,11 @@
[p0]
p1 = same_as(p0)
p2 = same_as(p0)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p4 = getfield_gc(p1, descr=tzdescr)
- cond_call_stm_b(p2, descr=P2Wdescr)
+ cond_call_stm_b(p2, descr=A2Wdescr)
setfield_gc(p2, p0, descr=tzdescr)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=Q2Rdescr)
p5 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break(1)
jump()
@@ -174,14 +174,14 @@
jump()
""", """
[p0]
- cond_call_stm_b(p0, descr=P2Rdescr)
+ cond_call_stm_b(p0, descr=A2Rdescr)
p1 = getfield_gc(p0, descr=tzdescr)
p2 = getfield_gc(p0, descr=tzdescr)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p3 = getfield_gc(p1, descr=tzdescr)
- cond_call_stm_b(p2, descr=P2Wdescr)
+ cond_call_stm_b(p2, descr=A2Wdescr)
setfield_gc(p2, p0, descr=tzdescr)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=Q2Rdescr)
p4 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break(1)
jump()
@@ -200,14 +200,14 @@
"""
rewritten = """
[p0, i1, i2]
- cond_call_stm_b(p0, descr=P2Rdescr)
+ cond_call_stm_b(p0, descr=A2Rdescr)
p1 = %s(p0, i1, descr=adescr)
p2 = %s(p0, i2, descr=adescr)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p3 = getfield_gc(p1, descr=tzdescr)
- cond_call_stm_b(p2, descr=P2Wdescr)
+ cond_call_stm_b(p2, descr=A2Wdescr)
setfield_gc(p2, p0, descr=tzdescr)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=Q2Rdescr)
p4 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break(1)
jump()
@@ -225,12 +225,12 @@
jump(p2)
""", """
[p1, p3]
- cond_call_stm_b(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=A2Wdescr)
setfield_gc(p3, p1, descr=tzdescr)
p2 = call_malloc_nursery(%(tdescr.size)d)
setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
stm_set_revision_gc(p2, descr=revdescr)
- cond_call_stm_b(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=V2Wdescr)
setfield_gc(p3, p1, descr=tzdescr)
stm_transaction_break(1)
jump(p2)
@@ -245,7 +245,7 @@
jump(p2)
""", """
[p1]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
p3 = call_malloc_nursery(%(tdescr.size)d)
setfield_gc(p3, %(tdescr.tid)d, descr=tiddescr)
@@ -279,9 +279,9 @@
jump()
""", """
[p1, p2, p3, p4]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
- cond_call_stm_b(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=A2Wdescr)
setfield_gc(p3, p4, descr=tzdescr)
stm_transaction_break(1)
jump()
@@ -295,7 +295,7 @@
jump()
""", """
[p1, p2, i3]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
setfield_gc(p1, i3, descr=tydescr)
stm_transaction_break(1)
@@ -311,10 +311,10 @@
jump(p1)
""", """
[p1, p2, i3]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
label(p1, i3)
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, i3, descr=tydescr)
stm_transaction_break(1)
jump(p1)
@@ -358,7 +358,7 @@
jump(p2)
""", """
[p1]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break(1)
jump(p2)
@@ -374,7 +374,7 @@
""", """
[p1]
p3 = same_as(ConstPtr(t))
- cond_call_stm_b(p3, descr=P2Rdescr)
+ cond_call_stm_b(p3, descr=A2Rdescr)
p2 = getfield_gc(p3, descr=tzdescr)
stm_transaction_break(1)
jump(p2)
@@ -388,7 +388,7 @@
jump(i3)
""", """
[p1, i2]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
i3 = getarrayitem_gc(p1, i2, descr=adescr)
stm_transaction_break(1)
jump(i3)
@@ -401,7 +401,7 @@
jump(i3)
""", """
[p1, i2]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
i3 = getinteriorfield_gc(p1, i2, descr=adescr)
stm_transaction_break(1)
jump(i3)
@@ -415,7 +415,7 @@
jump(p2, i2)
""", """
[p1]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
i2 = getfield_gc(p1, descr=tydescr)
stm_transaction_break(1)
@@ -430,9 +430,9 @@
jump(p2, i2)
""", """
[p1]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
- cond_call_stm_b(p2, descr=P2Rdescr)
+ cond_call_stm_b(p2, descr=A2Rdescr)
i2 = getfield_gc(p2, descr=tydescr)
stm_transaction_break(1)
jump(p2, i2)
@@ -449,10 +449,10 @@
jump(p1)
""", """
[p1]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
i1 = getfield_gc(p1, descr=tydescr)
i2 = int_add(i1, 1)
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, i2, descr=tydescr)
stm_transaction_break(1)
jump(p1)
@@ -466,7 +466,7 @@
jump(p2)
""", """
[p1]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, 123, descr=tydescr)
p2 = getfield_gc(p1, descr=tzdescr)
stm_transaction_break(1)
@@ -506,10 +506,10 @@
jump(p2)
""", """
[p1]
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
p2 = getfield_gc(p1, descr=tzdescr)
call(p2, descr=calldescr1)
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, 5, descr=tydescr)
stm_transaction_break(1)
jump(p2)
@@ -589,9 +589,9 @@
jump()
""", """
[p1, i1, p2, p3, i3, p4]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setarrayitem_gc(p1, i1, p2, descr=adescr)
- cond_call_stm_b(p3, descr=P2Wdescr)
+ cond_call_stm_b(p3, descr=A2Wdescr)
setarrayitem_gc(p3, i3, p4, descr=adescr)
stm_transaction_break(1)
jump()
@@ -606,7 +606,7 @@
jump()
""", """
[p1, p2, i2, p3, i3]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setarrayitem_gc(p1, i2, p2, descr=adescr)
i4 = read_timestamp()
setarrayitem_gc(p1, i3, p3, descr=adescr)
@@ -623,7 +623,7 @@
jump()
""", """
[p1, p2, i2, p3, i3]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setinteriorfield_gc(p1, i2, p2, descr=adescr)
i4 = read_timestamp()
setinteriorfield_gc(p1, i3, p3, descr=adescr)
@@ -639,7 +639,7 @@
jump()
""", """
[p1, i2, i3]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
strsetitem(p1, i2, i3)
unicodesetitem(p1, i2, i3)
stm_transaction_break(1)
@@ -660,12 +660,12 @@
jump(i2, p7)
""", """
[i1, i2, i3, p7]
- cond_call_stm_b(p7, descr=P2Wdescr)
+ cond_call_stm_b(p7, descr=A2Wdescr)
setfield_gc(p7, 10, descr=tydescr)
call_release_gil(123, descr=calldescr2)
guard_not_forced() []
stm_transaction_break(0)
- cond_call_stm_b(p7, descr=P2Wdescr)
+ cond_call_stm_b(p7, descr=A2Wdescr)
setfield_gc(p7, 20, descr=tydescr)
stm_transaction_break(1)
jump(i2, p7)
@@ -689,11 +689,11 @@
jump(i2, p7)
""" % op, """
[i1, i2, i3, p7]
- cond_call_stm_b(p7, descr=P2Wdescr)
+ cond_call_stm_b(p7, descr=A2Wdescr)
setfield_gc(p7, 10, descr=tydescr)
$INEV
%s
- cond_call_stm_b(p7, descr=P2Wdescr)
+ cond_call_stm_b(p7, descr=A2Wdescr)
setfield_gc(p7, 20, descr=tydescr)
stm_transaction_break(1)
jump(i2, p7)
@@ -706,8 +706,8 @@
jump()
""", """
[p1, p2, i1, i2, i3]
- cond_call_stm_b(p2, descr=P2Wdescr)
- cond_call_stm_b(p1, descr=P2Rdescr)
+ cond_call_stm_b(p2, descr=A2Wdescr)
+ cond_call_stm_b(p1, descr=A2Rdescr)
copystrcontent(p1, p2, i1, i2, i3)
stm_transaction_break(1)
jump()
@@ -727,7 +727,7 @@
jump(p1)
""" % op, """
[p1]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, 10, descr=tydescr)
%s
setfield_gc(p1, 20, descr=tydescr)
@@ -758,12 +758,12 @@
jump(p1)
""" % (op, guard), """
[p1]
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, 10, descr=tydescr)
%s
%s
%s
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setfield_gc(p1, 20, descr=tydescr)
stm_transaction_break(1)
jump(p1)
@@ -1141,7 +1141,7 @@
stm_set_revision_gc(p1, descr=revdescr)
setfield_gc(p1, 5, descr=clendescr)
label(p1, i2, p3)
- cond_call_stm_b(p1, descr=P2Wdescr)
+ cond_call_stm_b(p1, descr=A2Wdescr)
setarrayitem_gc(p1, i2, p3, descr=cdescr)
""")
More information about the pypy-commit
mailing list