Example #1
0
 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(toplevelcontainer), index)
                     wb = False
                     break
         #
         if wb:
             self.gc.write_barrier(
                 llmemory.cast_ptr_to_adr(toplevelcontainer))
     llheap.setinterior(toplevelcontainer, inneraddr, INNERTYPE, newvalue)
Example #2
0
 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(toplevelcontainer),
                         index)
                     wb = False
                     break
         #
         if wb:
             self.gc.write_barrier(
                 llmemory.cast_ptr_to_adr(toplevelcontainer))
     llheap.setinterior(toplevelcontainer, inneraddr, INNERTYPE, newvalue)
Example #3
0
 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)
Example #4
0
 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)