Esempio n. 1
0
def ll_shrink_array(p, smallerlength):
    from rpython.rtyper.lltypesystem.lloperation import llop
    from rpython.rlib.objectmodel import keepalive_until_here

    if llop.shrink_array(lltype.Bool, p, smallerlength):
        return p  # done by the GC
    # XXX we assume for now that the type of p is GcStruct containing a
    # variable array, with no further pointers anywhere, and exactly one
    # field in the fixed part -- like STR and UNICODE.

    TP = lltype.typeOf(p).TO
    newp = lltype.malloc(TP, smallerlength)

    assert len(TP._names) == 2
    field = getattr(p, TP._names[0])
    setattr(newp, TP._names[0], field)

    ARRAY = getattr(TP, TP._arrayfld)
    offset = (llmemory.offsetof(TP, TP._arrayfld) +
              llmemory.itemoffsetof(ARRAY, 0))
    source_addr = llmemory.cast_ptr_to_adr(p) + offset
    dest_addr = llmemory.cast_ptr_to_adr(newp) + offset
    llmemory.raw_memcopy(source_addr, dest_addr,
                         llmemory.sizeof(ARRAY.OF) * smallerlength)

    keepalive_until_here(p)
    keepalive_until_here(newp)
    return newp
Esempio n. 2
0
def ll_shrink_array(p, smallerlength):
    from rpython.rtyper.lltypesystem.lloperation import llop
    from rpython.rlib.objectmodel import keepalive_until_here

    if llop.shrink_array(lltype.Bool, p, smallerlength):
        return p  # done by the GC
    # XXX we assume for now that the type of p is GcStruct containing a
    # variable array, with no further pointers anywhere, and exactly one
    # field in the fixed part -- like STR and UNICODE.

    TP = lltype.typeOf(p).TO
    newp = lltype.malloc(TP, smallerlength)

    assert len(TP._names) == 2
    field = getattr(p, TP._names[0])
    setattr(newp, TP._names[0], field)

    ARRAY = getattr(TP, TP._arrayfld)
    offset = llmemory.offsetof(TP, TP._arrayfld) + llmemory.itemoffsetof(ARRAY, 0)
    source_addr = llmemory.cast_ptr_to_adr(p) + offset
    dest_addr = llmemory.cast_ptr_to_adr(newp) + offset
    llmemory.raw_memcopy(source_addr, dest_addr, llmemory.sizeof(ARRAY.OF) * smallerlength)

    keepalive_until_here(p)
    keepalive_until_here(newp)
    return newp
Esempio n. 3
0
 def str_from_buffer(raw_buf, gc_buf, case_num, allocated_size, needed_size):
     """
     Converts from a pair returned by alloc_buffer to a high-level string.
     The returned string will be truncated to needed_size.
     """
     assert allocated_size >= needed_size
     if allocated_size != needed_size:
         from rpython.rtyper.lltypesystem.lloperation import llop
         if llop.shrink_array(lltype.Bool, gc_buf, needed_size):
             pass     # now 'gc_buf' is smaller
         else:
             gc_buf = mallocfn(needed_size)
             case_num = 2
     if case_num == 2:
         copy_raw_to_string(raw_buf, gc_buf, 0, needed_size)
     return hlstrtype(gc_buf)
Esempio n. 4
0
 def str_from_buffer(raw_buf, gc_buf, case_num, allocated_size, needed_size):
     """
     Converts from a pair returned by alloc_buffer to a high-level string.
     The returned string will be truncated to needed_size.
     """
     assert allocated_size >= needed_size
     if allocated_size != needed_size:
         from rpython.rtyper.lltypesystem.lloperation import llop
         if llop.shrink_array(lltype.Bool, gc_buf, needed_size):
             pass     # now 'gc_buf' is smaller
         else:
             gc_buf = mallocfn(needed_size)
             case_num = 2
     if case_num == 2:
         copy_raw_to_string(raw_buf, gc_buf, 0, needed_size)
     return hlstrtype(gc_buf)