Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r66206:dab095843f89 Date: 2013-08-19 10:15 +0200 http://bitbucket.org/pypy/pypy/changeset/dab095843f89/
Log: Simplify the write barrier by only passing one argument, which is the object we write into --- and not the new value written. See comments in minimark. This allows means that assume_young_pointers is removed because it's now the same as write_barrier. diff --git a/rpython/jit/backend/arm/opassembler.py b/rpython/jit/backend/arm/opassembler.py --- a/rpython/jit/backend/arm/opassembler.py +++ b/rpython/jit/backend/arm/opassembler.py @@ -452,7 +452,7 @@ # Write code equivalent to write_barrier() in the GC: it checks # a flag in the object at arglocs[0], and if set, it calls a # helper piece of assembler. The latter saves registers as needed - # and call the function jit_remember_young_pointer() from the GC. + # and call the function remember_young_pointer() from the GC. if we_are_translated(): cls = self.cpu.gc_ll_descr.has_write_barrier_class() assert cls is not None and isinstance(descr, cls) 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 @@ -136,7 +136,7 @@ """ Allocate a new frame, overwritten by tests """ frame = jitframe.JITFRAME.allocate(frame_info) - llop.gc_assume_young_pointers(lltype.Void, frame) + llop.gc_writebarrier(lltype.Void, frame) return frame class JitFrameDescrs: @@ -360,8 +360,7 @@ def _check_valid_gc(self): # we need the hybrid or minimark GC for rgc._make_sure_does_not_move() - # to work. Additionally, 'hybrid' is missing some stuff like - # jit_remember_young_pointer() for now. + # to work. 'hybrid' could work but isn't tested with the JIT. if self.gcdescr.config.translation.gc not in ('minimark',): raise NotImplementedError("--gc=%s not implemented with the JIT" % (self.gcdescr.config.translation.gc,)) diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py --- a/rpython/jit/backend/llsupport/llmodel.py +++ b/rpython/jit/backend/llsupport/llmodel.py @@ -97,7 +97,7 @@ new_frame.jf_savedata = frame.jf_savedata new_frame.jf_guard_exc = frame.jf_guard_exc # all other fields are empty - llop.gc_assume_young_pointers(lltype.Void, new_frame) + llop.gc_writebarrier(lltype.Void, new_frame) return lltype.cast_opaque_ptr(llmemory.GCREF, new_frame) except Exception, e: print "Unhandled exception", e, "in realloc_frame" diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -2022,7 +2022,7 @@ # Write code equivalent to write_barrier() in the GC: it checks # a flag in the object at arglocs[0], and if set, it calls a # helper piece of assembler. The latter saves registers as needed - # and call the function jit_remember_young_pointer() from the GC. + # and call the function remember_young_pointer() from the GC. if we_are_translated(): cls = self.cpu.gc_ll_descr.has_write_barrier_class() assert cls is not None and isinstance(descr, cls) diff --git a/rpython/memory/gc/base.py b/rpython/memory/gc/base.py --- a/rpython/memory/gc/base.py +++ b/rpython/memory/gc/base.py @@ -101,7 +101,7 @@ def set_root_walker(self, root_walker): self.root_walker = root_walker - def write_barrier(self, newvalue, addr_struct): + def write_barrier(self, addr_struct): pass def size_gc_header(self, typeid=0): diff --git a/rpython/memory/gc/generation.py b/rpython/memory/gc/generation.py --- a/rpython/memory/gc/generation.py +++ b/rpython/memory/gc/generation.py @@ -336,7 +336,7 @@ addr = pointer.address[0] newaddr = self.copy(addr) pointer.address[0] = newaddr - self.write_into_last_generation_obj(obj, newaddr) + self.write_into_last_generation_obj(obj) # ____________________________________________________________ # Implementation of nursery-only collections @@ -467,9 +467,9 @@ # "if addr_struct.int0 & JIT_WB_IF_FLAG: remember_young_pointer()") JIT_WB_IF_FLAG = GCFLAG_NO_YOUNG_PTRS - def write_barrier(self, newvalue, addr_struct): + def write_barrier(self, addr_struct): if self.header(addr_struct).tid & GCFLAG_NO_YOUNG_PTRS: - self.remember_young_pointer(addr_struct, newvalue) + self.remember_young_pointer(addr_struct) def _setup_wb(self): DEBUG = self.DEBUG @@ -480,43 +480,30 @@ # For x86, there is also an extra requirement: when the JIT calls # remember_young_pointer(), it assumes that it will not touch the SSE # registers, so it does not save and restore them (that's a *hack*!). - def remember_young_pointer(addr_struct, addr): + def remember_young_pointer(addr_struct): #llop.debug_print(lltype.Void, "\tremember_young_pointer", - # addr_struct, "<-", addr) + # addr_struct) if DEBUG: ll_assert(not self.is_in_nursery(addr_struct), "nursery object with GCFLAG_NO_YOUNG_PTRS") # # What is important in this function is that it *must* # clear the flag GCFLAG_NO_YOUNG_PTRS from 'addr_struct' - # if 'addr' is in the nursery. It is ok if, accidentally, - # it also clears the flag in some more rare cases, like - # 'addr' being a tagged pointer whose value happens to be - # a large integer that fools is_in_nursery(). - if self.appears_to_be_in_nursery(addr): - self.old_objects_pointing_to_young.append(addr_struct) - self.header(addr_struct).tid &= ~GCFLAG_NO_YOUNG_PTRS - self.write_into_last_generation_obj(addr_struct, addr) + # if the newly written value is in the nursery. It is ok + # if it also clears the flag in some more cases --- it is + # a win to not actually pass the 'newvalue' pointer here. + self.old_objects_pointing_to_young.append(addr_struct) + self.header(addr_struct).tid &= ~GCFLAG_NO_YOUNG_PTRS + self.write_into_last_generation_obj(addr_struct) remember_young_pointer._dont_inline_ = True self.remember_young_pointer = remember_young_pointer - def write_into_last_generation_obj(self, addr_struct, addr): + def write_into_last_generation_obj(self, addr_struct): objhdr = self.header(addr_struct) if objhdr.tid & GCFLAG_NO_HEAP_PTRS: - if (self.is_valid_gc_object(addr) and - not self.is_last_generation(addr)): - objhdr.tid &= ~GCFLAG_NO_HEAP_PTRS - self.last_generation_root_objects.append(addr_struct) - write_into_last_generation_obj._always_inline_ = True - - def assume_young_pointers(self, addr_struct): - objhdr = self.header(addr_struct) - if objhdr.tid & GCFLAG_NO_YOUNG_PTRS: - self.old_objects_pointing_to_young.append(addr_struct) - objhdr.tid &= ~GCFLAG_NO_YOUNG_PTRS - if objhdr.tid & GCFLAG_NO_HEAP_PTRS: objhdr.tid &= ~GCFLAG_NO_HEAP_PTRS self.last_generation_root_objects.append(addr_struct) + write_into_last_generation_obj._always_inline_ = True def writebarrier_before_copy(self, source_addr, dest_addr, source_start, dest_start, length): diff --git a/rpython/memory/gc/minimark.py b/rpython/memory/gc/minimark.py --- a/rpython/memory/gc/minimark.py +++ b/rpython/memory/gc/minimark.py @@ -1059,16 +1059,16 @@ def JIT_minimal_size_in_nursery(cls): return cls.minimal_size_in_nursery - def write_barrier(self, newvalue, addr_struct): + def write_barrier(self, addr_struct): if self.header(addr_struct).tid & GCFLAG_TRACK_YOUNG_PTRS: - self.remember_young_pointer(addr_struct, newvalue) + self.remember_young_pointer(addr_struct) - def write_barrier_from_array(self, newvalue, addr_array, index): + def write_barrier_from_array(self, addr_array, index): if self.header(addr_array).tid & GCFLAG_TRACK_YOUNG_PTRS: if self.card_page_indices > 0: # <- constant-folded self.remember_young_pointer_from_array2(addr_array, index) else: - self.remember_young_pointer(addr_array, newvalue) + self.remember_young_pointer(addr_array) def _init_writebarrier_logic(self): DEBUG = self.DEBUG @@ -1076,9 +1076,8 @@ # instead of keeping it as a regular method is to # make the code in write_barrier() marginally smaller # (which is important because it is inlined *everywhere*). - def remember_young_pointer(addr_struct, newvalue): + def remember_young_pointer(addr_struct): # 'addr_struct' is the address of the object in which we write. - # 'newvalue' is the address that we are going to write in there. # We know that 'addr_struct' has GCFLAG_TRACK_YOUNG_PTRS so far. # if DEBUG: # note: PYPY_GC_DEBUG=1 does not enable this @@ -1086,22 +1085,25 @@ self.header(addr_struct).tid & GCFLAG_HAS_CARDS != 0, "young object with GCFLAG_TRACK_YOUNG_PTRS and no cards") # - # If it seems that what we are writing is a pointer to a young obj - # (as checked with appears_to_be_young()), then we need - # to remove the flag GCFLAG_TRACK_YOUNG_PTRS and add the object - # to the list 'old_objects_pointing_to_young'. We know that - # 'addr_struct' cannot be in the nursery, because nursery objects - # never have the flag GCFLAG_TRACK_YOUNG_PTRS to start with. + # We need to remove the flag GCFLAG_TRACK_YOUNG_PTRS and add + # the object to the list 'old_objects_pointing_to_young'. + # We know that 'addr_struct' cannot be in the nursery, + # because nursery objects never have the flag + # GCFLAG_TRACK_YOUNG_PTRS to start with. Note that in + # theory we don't need to do that if the pointer that we're + # writing into the object isn't pointing to a young object. + # However, it isn't really a win, because then sometimes + # we're going to call this function a lot of times for the + # same object; moreover we'd need to pass the 'newvalue' as + # an argument here. The JIT has always called a + # 'newvalue'-less version, too. + self.old_objects_pointing_to_young.append(addr_struct) objhdr = self.header(addr_struct) - if self.appears_to_be_young(newvalue): - self.old_objects_pointing_to_young.append(addr_struct) - objhdr.tid &= ~GCFLAG_TRACK_YOUNG_PTRS + objhdr.tid &= ~GCFLAG_TRACK_YOUNG_PTRS # # Second part: if 'addr_struct' is actually a prebuilt GC # object and it's the first time we see a write to it, we - # add it to the list 'prebuilt_root_objects'. Note that we - # do it even in the (rare?) case of 'addr' being NULL or another - # prebuilt object, to simplify code. + # add it to the list 'prebuilt_root_objects'. if objhdr.tid & GCFLAG_NO_HEAP_PTRS: objhdr.tid &= ~GCFLAG_NO_HEAP_PTRS self.prebuilt_root_objects.append(addr_struct) @@ -1109,17 +1111,6 @@ remember_young_pointer._dont_inline_ = True self.remember_young_pointer = remember_young_pointer # - def jit_remember_young_pointer(addr_struct): - # minimal version of the above, with just one argument, - # called by the JIT when GCFLAG_TRACK_YOUNG_PTRS is set - self.old_objects_pointing_to_young.append(addr_struct) - objhdr = self.header(addr_struct) - objhdr.tid &= ~GCFLAG_TRACK_YOUNG_PTRS - if objhdr.tid & GCFLAG_NO_HEAP_PTRS: - objhdr.tid &= ~GCFLAG_NO_HEAP_PTRS - self.prebuilt_root_objects.append(addr_struct) - self.jit_remember_young_pointer = jit_remember_young_pointer - # if self.card_page_indices > 0: self._init_writebarrier_with_card_marker() @@ -1179,13 +1170,13 @@ # called by the JIT when GCFLAG_TRACK_YOUNG_PTRS is set # but GCFLAG_CARDS_SET is cleared. This tries to set # GCFLAG_CARDS_SET if possible; otherwise, it falls back - # to jit_remember_young_pointer(). + # to remember_young_pointer(). objhdr = self.header(addr_array) if objhdr.tid & GCFLAG_HAS_CARDS: self.old_objects_with_cards_set.append(addr_array) objhdr.tid |= GCFLAG_CARDS_SET else: - self.jit_remember_young_pointer(addr_array) + self.remember_young_pointer(addr_array) self.jit_remember_young_pointer_from_array = ( jit_remember_young_pointer_from_array) @@ -1196,19 +1187,6 @@ return llarena.getfakearenaaddress(addr_byte) + (~byteindex) - def assume_young_pointers(self, addr_struct): - """Called occasionally by the JIT to mean ``assume that 'addr_struct' - may now contain young pointers.'' - """ - objhdr = self.header(addr_struct) - if objhdr.tid & GCFLAG_TRACK_YOUNG_PTRS: - self.old_objects_pointing_to_young.append(addr_struct) - objhdr.tid &= ~GCFLAG_TRACK_YOUNG_PTRS - # - if objhdr.tid & GCFLAG_NO_HEAP_PTRS: - objhdr.tid &= ~GCFLAG_NO_HEAP_PTRS - self.prebuilt_root_objects.append(addr_struct) - def writebarrier_before_copy(self, source_addr, dest_addr, source_start, dest_start, length): """ This has the same effect as calling writebarrier over diff --git a/rpython/memory/gc/test/test_direct.py b/rpython/memory/gc/test/test_direct.py --- a/rpython/memory/gc/test/test_direct.py +++ b/rpython/memory/gc/test/test_direct.py @@ -87,19 +87,17 @@ def write(self, p, fieldname, newvalue): if self.gc.needs_write_barrier: - newaddr = llmemory.cast_ptr_to_adr(newvalue) addr_struct = llmemory.cast_ptr_to_adr(p) - self.gc.write_barrier(newaddr, addr_struct) + self.gc.write_barrier(addr_struct) setattr(p, fieldname, newvalue) def writearray(self, p, index, newvalue): if self.gc.needs_write_barrier: - newaddr = llmemory.cast_ptr_to_adr(newvalue) addr_struct = llmemory.cast_ptr_to_adr(p) if hasattr(self.gc, 'write_barrier_from_array'): - self.gc.write_barrier_from_array(newaddr, addr_struct, index) + self.gc.write_barrier_from_array(addr_struct, index) else: - self.gc.write_barrier(newaddr, addr_struct) + self.gc.write_barrier(addr_struct) p[index] = newvalue def malloc(self, TYPE, n=None): @@ -416,13 +414,13 @@ assert calls == ['semispace_collect'] calls = [] - def test_assume_young_pointers(self): + def test_write_barrier_direct(self): s0 = lltype.malloc(S, immortal=True) self.consider_constant(s0) s = self.malloc(S) s.x = 1 s0.next = s - self.gc.assume_young_pointers(llmemory.cast_ptr_to_adr(s0)) + self.gc.write_barrier(llmemory.cast_ptr_to_adr(s0)) self.gc.collect(0) @@ -558,12 +556,10 @@ assert hdr_src.tid & minimark.GCFLAG_HAS_CARDS assert hdr_dst.tid & minimark.GCFLAG_HAS_CARDS # - young_p = self.malloc(S) - self.gc.write_barrier_from_array(young_p, addr_src, 0) + self.gc.write_barrier_from_array(addr_src, 0) index_in_third_page = int(2.5 * self.gc.card_page_indices) assert index_in_third_page < largeobj_size - self.gc.write_barrier_from_array(young_p, addr_src, - index_in_third_page) + self.gc.write_barrier_from_array(addr_src, index_in_third_page) # assert hdr_src.tid & minimark.GCFLAG_CARDS_SET addr_byte = self.gc.get_card(addr_src, 0) diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py --- a/rpython/memory/gctransform/framework.py +++ b/rpython/memory/gctransform/framework.py @@ -317,13 +317,6 @@ else: self.shrink_array_ptr = None - if hasattr(GCClass, 'assume_young_pointers'): - # xxx should really be a noop for gcs without generations - self.assume_young_pointers_ptr = getfn( - GCClass.assume_young_pointers.im_func, - [s_gc, annmodel.SomeAddress()], - annmodel.s_None) - if hasattr(GCClass, 'heap_stats'): self.heap_stats_ptr = getfn(GCClass.heap_stats.im_func, [s_gc], annmodel.SomePtr(lltype.Ptr(ARRAY_TYPEID_MAP)), @@ -474,11 +467,10 @@ if GCClass.needs_write_barrier: self.write_barrier_ptr = getfn(GCClass.write_barrier.im_func, [s_gc, - annmodel.SomeAddress(), annmodel.SomeAddress()], annmodel.s_None, inline=True) - func = getattr(gcdata.gc, 'jit_remember_young_pointer', None) + func = getattr(gcdata.gc, 'remember_young_pointer', None) if func is not None: # func should not be a bound method, but a real function assert isinstance(func, types.FunctionType) @@ -490,7 +482,6 @@ self.write_barrier_from_array_ptr = getfn(func.im_func, [s_gc, annmodel.SomeAddress(), - annmodel.SomeAddress(), annmodel.SomeInteger()], annmodel.s_None, inline=True) @@ -740,15 +731,15 @@ v_addr, v_length], resultvar=op.result) - def gct_gc_assume_young_pointers(self, hop): - if not hasattr(self, 'assume_young_pointers_ptr'): + def gct_gc_writebarrier(self, hop): + if self.write_barrier_ptr is None: return op = hop.spaceop v_addr = op.args[0] if v_addr.concretetype != llmemory.Address: v_addr = hop.genop('cast_ptr_to_adr', [v_addr], resulttype=llmemory.Address) - hop.genop("direct_call", [self.assume_young_pointers_ptr, + hop.genop("direct_call", [self.write_barrier_ptr, self.c_const_gc, v_addr]) def gct_gc_heap_stats(self, hop): @@ -1120,8 +1111,6 @@ and not isinstance(v_newvalue, Constant) and v_struct.concretetype.TO._gckind == "gc" and hop.spaceop not in self.clean_sets): - v_newvalue = hop.genop("cast_ptr_to_adr", [v_newvalue], - resulttype = llmemory.Address) v_structaddr = hop.genop("cast_ptr_to_adr", [v_struct], resulttype = llmemory.Address) if (self.write_barrier_from_array_ptr is not None and @@ -1131,14 +1120,12 @@ assert v_index.concretetype == lltype.Signed hop.genop("direct_call", [self.write_barrier_from_array_ptr, self.c_const_gc, - v_newvalue, v_structaddr, v_index]) else: self.write_barrier_calls += 1 hop.genop("direct_call", [self.write_barrier_ptr, self.c_const_gc, - v_newvalue, v_structaddr]) hop.rename('bare_' + opname) diff --git a/rpython/memory/gctransform/shadowstack.py b/rpython/memory/gctransform/shadowstack.py --- a/rpython/memory/gctransform/shadowstack.py +++ b/rpython/memory/gctransform/shadowstack.py @@ -304,12 +304,12 @@ "save_current_state_away: broken shadowstack") #shadowstackref.fullstack = True # - # cannot use llop.gc_assume_young_pointers() here, because + # cannot use llop.gc_writebarrier() here, because # we are in a minimally-transformed GC helper :-/ gc = self.gcdata.gc - if hasattr(gc.__class__, 'assume_young_pointers'): + if hasattr(gc.__class__, 'write_barrier'): shadowstackadr = llmemory.cast_ptr_to_adr(shadowstackref) - gc.assume_young_pointers(shadowstackadr) + gc.write_barrier(shadowstackadr) # self.gcdata.root_stack_top = llmemory.NULL # to detect missing restore diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py --- a/rpython/memory/gcwrapper.py +++ b/rpython/memory/gcwrapper.py @@ -106,7 +106,6 @@ assert (type(index) is int # <- fast path or lltype.typeOf(index) == lltype.Signed) self.gc.write_barrier_from_array( - llmemory.cast_ptr_to_adr(newvalue), llmemory.cast_ptr_to_adr(toplevelcontainer), index) wb = False @@ -114,7 +113,6 @@ # if wb: self.gc.write_barrier( - llmemory.cast_ptr_to_adr(newvalue), llmemory.cast_ptr_to_adr(toplevelcontainer)) llheap.setinterior(toplevelcontainer, inneraddr, INNERTYPE, newvalue) diff --git a/rpython/memory/test/test_transformed_gc.py b/rpython/memory/test/test_transformed_gc.py --- a/rpython/memory/test/test_transformed_gc.py +++ b/rpython/memory/test/test_transformed_gc.py @@ -1186,7 +1186,7 @@ res = run([100, 100]) assert res == 200 - def define_assume_young_pointers(cls): + def define_write_barrier_direct(cls): from rpython.rlib import rgc S = lltype.GcForwardReference() S.become(lltype.GcStruct('S', @@ -1198,8 +1198,7 @@ s = lltype.malloc(S) s.x = 42 llop.bare_setfield(lltype.Void, s0, void('next'), s) - llop.gc_assume_young_pointers(lltype.Void, - llmemory.cast_ptr_to_adr(s0)) + llop.gc_writebarrier(lltype.Void, llmemory.cast_ptr_to_adr(s0)) rgc.collect(0) return s0.next.x @@ -1208,8 +1207,8 @@ return f, cleanup, None - def test_assume_young_pointers(self): - run = self.runner("assume_young_pointers") + def test_write_barrier_direct(self): + run = self.runner("write_barrier_direct") res = run([]) assert res == 42 diff --git a/rpython/rlib/_stacklet_asmgcc.py b/rpython/rlib/_stacklet_asmgcc.py --- a/rpython/rlib/_stacklet_asmgcc.py +++ b/rpython/rlib/_stacklet_asmgcc.py @@ -303,7 +303,7 @@ self.suspstack = NULL_SUSPSTACK ll_assert(bool(s.anchor), "s.anchor should not be null") s.handle = handle - llop.gc_assume_young_pointers(lltype.Void, llmemory.cast_ptr_to_adr(s)) + llop.gc_writebarrier(lltype.Void, llmemory.cast_ptr_to_adr(s)) return s def get_result_suspstack(self, h): diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py --- a/rpython/rtyper/lltypesystem/lloperation.py +++ b/rpython/rtyper/lltypesystem/lloperation.py @@ -477,7 +477,7 @@ 'gc_thread_die' : LLOp(), 'gc_thread_before_fork':LLOp(), # returns an opaque address 'gc_thread_after_fork': LLOp(), # arguments: (result_of_fork, opaqueaddr) - 'gc_assume_young_pointers': LLOp(canrun=True), + 'gc_writebarrier': LLOp(canrun=True), 'gc_writebarrier_before_copy': LLOp(canrun=True), 'gc_heap_stats' : LLOp(canmallocgc=True), diff --git a/rpython/rtyper/lltypesystem/opimpl.py b/rpython/rtyper/lltypesystem/opimpl.py --- a/rpython/rtyper/lltypesystem/opimpl.py +++ b/rpython/rtyper/lltypesystem/opimpl.py @@ -643,7 +643,7 @@ def op_get_member_index(memberoffset): raise NotImplementedError -def op_gc_assume_young_pointers(addr): +def op_gc_writebarrier(addr): pass def op_shrink_array(array, smallersize): diff --git a/rpython/translator/c/gc.py b/rpython/translator/c/gc.py --- a/rpython/translator/c/gc.py +++ b/rpython/translator/c/gc.py @@ -85,7 +85,7 @@ def OP_GC_THREAD_AFTER_FORK(self, funcgen, op): return '' - def OP_GC_ASSUME_YOUNG_POINTERS(self, funcgen, op): + def OP_GC_WRITEBARRIER(self, funcgen, op): return '' def OP_GC_STACK_BOTTOM(self, funcgen, op): @@ -404,7 +404,7 @@ self.tid_fieldname(tid_field), funcgen.expr(c_skipoffset))) - def OP_GC_ASSUME_YOUNG_POINTERS(self, funcgen, op): + def OP_GC_WRITEBARRIER(self, funcgen, op): raise Exception("the FramewokGCTransformer should handle this") def OP_GC_GCFLAG_EXTRA(self, funcgen, op): diff --git a/rpython/translator/c/test/test_boehm.py b/rpython/translator/c/test/test_boehm.py --- a/rpython/translator/c/test/test_boehm.py +++ b/rpython/translator/c/test/test_boehm.py @@ -369,13 +369,12 @@ run = self.getcompiled(f) assert run() == 0x62024230 - def test_assume_young_pointers_nop(self): + def test_write_barrier_nop(self): S = lltype.GcStruct('S', ('x', lltype.Signed)) s = lltype.malloc(S) s.x = 0 def f(): - llop.gc_assume_young_pointers(lltype.Void, - llmemory.cast_ptr_to_adr(s)) + llop.gc_writebarrier(lltype.Void, llmemory.cast_ptr_to_adr(s)) return True run = self.getcompiled(f) assert run() == True _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit