def string_to_word(s): assert len(s) == WORD_SIZE ll_chars, llobj, flag = rffi.get_nonmovingbuffer_ll_final_null(s) try: wordarray = rffi.cast(rffi.UNSIGNEDP, ll_chars) return wordarray[0] finally: rffi.free_nonmovingbuffer_ll(ll_chars, llobj, flag)
def close(self): rffi.free_nonmovingbuffer_ll(self.ll_chars, self.llobj, self.flag) lltype.free(self.end_ptr, flavor='raw') # clean up objects that are instances of now blocked maps for w_obj in self.unclear_objects: jsonmap = self._get_jsonmap_from_dict(w_obj) if jsonmap.is_state_blocked(): self._devolve_jsonmap_dict(w_obj)
def _call(self, funcaddr, args_w): space = self.space cif_descr = self.cif_descr # 'self' should have been promoted here size = cif_descr.exchange_size mustfree_max_plus_1 = 0 keepalives = [llstr(None)] * len(args_w) # llstrings buffer = lltype.malloc(rffi.CCHARP.TO, size, flavor='raw') try: for i in range(len(args_w)): data = rffi.ptradd(buffer, cif_descr.exchange_args[i]) w_obj = args_w[i] argtype = self.fargs[i] if argtype.convert_argument_from_object(data, w_obj, keepalives, i): # argtype is a pointer type, and w_obj a list/tuple/str mustfree_max_plus_1 = i + 1 jit_libffi.jit_ffi_call(cif_descr, rffi.cast(rffi.VOIDP, funcaddr), buffer) resultdata = rffi.ptradd(buffer, cif_descr.exchange_result) w_res = self.ctitem.copy_and_convert_to_object(resultdata) finally: for i in range(mustfree_max_plus_1): argtype = self.fargs[i] if isinstance(argtype, W_CTypePointer): data = rffi.ptradd(buffer, cif_descr.exchange_args[i]) flag = get_mustfree_flag(data) raw_cdata = rffi.cast(rffi.CCHARPP, data)[0] if flag == 1: lltype.free(raw_cdata, flavor='raw') elif flag >= 4: llobj = keepalives[i] assert llobj # not NULL rffi.free_nonmovingbuffer_ll(raw_cdata, llobj, chr(flag)) lltype.free(buffer, flavor='raw') keepalive_until_here(args_w) return w_res
def strtod(input): if len(input) > _INT_LIMIT: raise MemoryError if objectmodel.revdb_flag_io_disabled(): return _revdb_strtod(input) end_ptr = lltype.malloc(rffi.CCHARPP.TO, 1, flavor='raw') try: # note: don't use the class scoped_view_charp here, it # break some tests because this function is used by the GC ll_input, llobj, flag = rffi.get_nonmovingbuffer_ll_final_null(input) try: result = dg_strtod(rffi.cast(rffi.CONST_CCHARP, ll_input), end_ptr) endpos = (rffi.cast(lltype.Signed, end_ptr[0]) - rffi.cast(lltype.Signed, ll_input)) finally: rffi.free_nonmovingbuffer_ll(ll_input, llobj, flag) finally: lltype.free(end_ptr, flavor='raw') if endpos == 0 or endpos < len(input): raise ValueError("invalid input at position %d" % (endpos,)) return result
def ll(callable, string, *args): ll_chars, llobj, flag = rffi.get_nonmovingbuffer_ll_final_null(string) try: return callable(ll_chars, *args) finally: rffi.free_nonmovingbuffer_ll(ll_chars, llobj, flag)
def release(self, h, w_obj): rffi.free_nonmovingbuffer_ll(self.llbuf, self.llstring, self.flag)