def pop_roots(self, hop, livevars): if not livevars: return # mark the values as gc roots for var in livevars: v_adr = gen_cast(hop.llops, llmemory.Address, var) v_newaddr = hop.genop("direct_call", [c_asm_gcroot, v_adr], resulttype=llmemory.Address) hop.genop("gc_reload_possibly_moved", [v_newaddr, var])
def cast_result(self, var): v_result = self.spaceop.result resulttype = v_result.concretetype curtype = var.concretetype if curtype == resulttype: self.genop('same_as', [var], resultvar=v_result) else: v_new = gen_cast(self.llops, resulttype, var) assert v_new != var self.llops[-1].result = v_result
def pop_alive(self, var, llops): PTRTYPE = var.concretetype v_adr = gen_cast(llops, llmemory.Address, var) dealloc_fptr = self.dynamic_deallocation_funcptr_for_type(PTRTYPE.TO) if dealloc_fptr is self.no_pointer_dealloc_ptr.value: # simple case llops.genop("direct_call", [self.decref_simple_ptr, v_adr]) else: cdealloc_fptr = rmodel.inputconst(lltype.typeOf(dealloc_fptr), dealloc_fptr) llops.genop("direct_call", [self.decref_ptr, v_adr, cdealloc_fptr])
def push_roots(self, hop, keep_current_args=False): livevars = self.get_livevars_for_roots(hop, keep_current_args) self.num_pushs += len(livevars) if not livevars: return [] c_len = rmodel.inputconst(lltype.Signed, len(livevars) ) base_addr = hop.genop("direct_call", [self.incr_stack_ptr, c_len ], resulttype=llmemory.Address) for k,var in enumerate(livevars): c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr) v_adr = gen_cast(hop.llops, llmemory.Address, var) hop.genop("raw_store", [base_addr, c_k, v_adr]) return livevars
def push_roots(self, hop, keep_current_args=False): livevars = self.get_livevars_for_roots(hop, keep_current_args) self.num_pushs += len(livevars) if not livevars: return [] c_len = rmodel.inputconst(lltype.Signed, len(livevars)) base_addr = hop.genop("direct_call", [self.incr_stack_ptr, c_len], resulttype=llmemory.Address) for k, var in enumerate(livevars): c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr) v_adr = gen_cast(hop.llops, llmemory.Address, var) hop.genop("raw_store", [base_addr, c_k, v_adr]) return livevars
def push_alive(self, var, llops): v_adr = gen_cast(llops, llmemory.Address, var) llops.genop("direct_call", [self.increfptr, v_adr])