Example #1
0
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)
Example #2
0
 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)
Example #3
0
    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
Example #4
0
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
Example #5
0
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)
Example #6
0
 def release(self, h, w_obj):
     rffi.free_nonmovingbuffer_ll(self.llbuf, self.llstring, self.flag)