def setinterior(self, toplevelcontainer, inneraddr, INNERTYPE, newvalue): if (lltype.typeOf(toplevelcontainer).TO._gckind == 'gc' and isinstance(INNERTYPE, lltype.Ptr) and INNERTYPE.TO._gckind == 'gc'): self.gc.write_barrier(llmemory.cast_ptr_to_adr(newvalue), llmemory.cast_ptr_to_adr(toplevelcontainer)) llheap.setinterior(toplevelcontainer, inneraddr, INNERTYPE, newvalue)
def setinterior(self, toplevelcontainer, inneraddr, INNERTYPE, newvalue, offsets=()): if (lltype.typeOf(toplevelcontainer).TO._gckind == 'gc' and isinstance(INNERTYPE, lltype.Ptr) and INNERTYPE.TO._gckind == 'gc'): # wb = True if self.has_write_barrier_from_array: for index in offsets: if type(index) is not str: 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 break # if wb: self.gc.write_barrier( llmemory.cast_ptr_to_adr(newvalue), llmemory.cast_ptr_to_adr(toplevelcontainer)) llheap.setinterior(toplevelcontainer, inneraddr, INNERTYPE, newvalue)
def setinterior(self, toplevelcontainer, inneraddr, INNERTYPE, newvalue): if ( lltype.typeOf(toplevelcontainer).TO._gckind == "gc" and isinstance(INNERTYPE, lltype.Ptr) and INNERTYPE.TO._gckind == "gc" ): self.gc.write_barrier(llmemory.cast_ptr_to_adr(newvalue), llmemory.cast_ptr_to_adr(toplevelcontainer)) llheap.setinterior(toplevelcontainer, inneraddr, INNERTYPE, newvalue)
def op_bare_setinteriorfield(self, obj, *fieldnamesval): offsets, fieldvalue = fieldnamesval[:-1], fieldnamesval[-1] inneraddr, FIELD = self.getinneraddr(obj, *offsets) if FIELD is not lltype.Void: llheap.setinterior(obj, inneraddr, FIELD, fieldvalue)