def ll_weakref_create(targetaddr): link = llop.boehm_malloc_atomic(llmemory.Address, sizeof_weakreflink) if not link: raise MemoryError plink = llmemory.cast_adr_to_ptr(link, lltype.Ptr(WEAKLINK)) plink[0] = targetaddr llop.boehm_disappearing_link(lltype.Void, link, targetaddr) return llmemory.cast_ptr_to_weakrefptr(plink)
def weakref_create_getlazy(self, objgetter): # we have to be lazy in reading the llinterp variable containing # the 'obj' pointer, because the gc.malloc() call below could # move it around type_id = self.get_type_id(gctypelayout.WEAKREF) addr = self.gc.malloc(type_id, None, zero=False) result = llmemory.cast_adr_to_ptr(addr, gctypelayout.WEAKREFPTR) result.weakptr = llmemory.cast_ptr_to_adr(objgetter()) return llmemory.cast_ptr_to_weakrefptr(result)
def __setitem__(self, index, newvalue): if index != 0: raise IndexError("address of local vars only support [0] indexing") if self.v.concretetype == llmemory.WeakRefPtr: # fish some more assert isinstance(newvalue, llmemory.fakeaddress) p = llmemory.cast_ptr_to_weakrefptr(newvalue.ptr) else: p = llmemory.cast_adr_to_ptr(newvalue, self.v.concretetype) self.frame.setvar(self.v, p)
def ll_weakref_create(target_gcref): if revdb: plink = llop.revdb_weakref_create(lltype.Ptr(WEAKLINK), target_gcref) else: link = llop.boehm_malloc_atomic(llmemory.Address, sizeof_weakreflink) if not link: raise MemoryError plink = llmemory.cast_adr_to_ptr(link, lltype.Ptr(WEAKLINK)) plink.addr = llmemory.cast_ptr_to_adr(target_gcref) llop.boehm_disappearing_link(lltype.Void, link, target_gcref) return llmemory.cast_ptr_to_weakrefptr(plink)
def op_cast_ptr_to_weakrefptr(self, obj): return llmemory.cast_ptr_to_weakrefptr(obj)
def op_cast_ptr_to_weakrefptr(self, obj): assert self.llinterpreter.typer.getconfig().translation.rweakref return llmemory.cast_ptr_to_weakrefptr(obj)