Ejemplo n.º 1
0
def container_of(val: gdb.Value, gdbtype: gdb.Type, member: str) -> gdb.Value:
    """
    Returns an object that contains the specified object at the given
    offset.

    Args:
        val (gdb.Value): The value to be converted.  It can refer to an
            allocated structure or a pointer.
        gdbtype (gdb.Type): The type of the object that will be generated
        member (str):
            The name of the member in the target struct that contains `val`.

    Returns:
        gdb.Value<gdbtype>: The converted object, of the type specified by
            the caller.
    Raises:
        TypeError: val is not a gdb.Value
    """
    if not isinstance(val, gdb.Value):
        raise ArgumentTypeError('val', val, gdb.Value)
    if not isinstance(gdbtype, gdb.Type):
        raise ArgumentTypeError('gdbtype', gdbtype, gdb.Type)
    charp = types.char_p_type
    if val.type.code != gdb.TYPE_CODE_PTR:
        val = val.address
    offset = offsetof(gdbtype, member)
    return (val.cast(charp) - offset).cast(gdbtype.pointer()).dereference()
Ejemplo n.º 2
0
def print_icolumn_type(col: gdb.Value) -> str:
    obj_type: gdb.Type = col.dynamic_type
    obj_casted: gdb.Value = col.cast(obj_type)

    if obj_type == t_col_array:
        offsets: gdb.Value = gdb.dereference(obj_casted["offsets"]).cast(t_col_offsets)["data"]

        start, end, _= get_podarray_bounds(offsets)

        nested_printed: str = print_icolumn_type(gdb.dereference(obj_casted["data"]))

        return "ColumnArray[size: {}, {}]".format(end - start, nested_printed)
    elif obj_type == t_col_const:
        data: gdb.Value = gdb.dereference(obj_casted["data"])
        nested_printed: str = print_icolumn_type(data)

        return "ColumnConst[size: {}, {}]".format(obj_casted["s"], nested_printed)
    elif obj_type == t_col_lc:
        dictionary: gdb.Value = obj_casted["dictionary"]
        index: gdb.Value = obj_casted["idx"]

        size_of_index_type: int = int(index["size_of_type"])

        index_type: str = "UInt8"

        if size_of_index_type == t_uint16.sizeof:
            index_type = "UInt16"
        elif size_of_index_type == t_uint32.sizeof:
            index_type = "UInt32"
        else:
            index_type = "UInt64"

        nested_col: gdb.Value = gdb.dereference(
            gdb.dereference(dictionary["column_unique"])["column_holder"])

        nested_printed: str = print_icolumn_type(nested_col)

        return "ColumnLowCardinality[index: {}, {}]".format(index_type, nested_printed)
    elif obj_type == t_col_nullable:
        col_nested: gdb.Value = gdb.dereference(obj_casted["nested_column"])
        nested_printed: str = print_icolumn_type(col_nested)

        return "ColumnNullable[{}]".format(nested_printed)
    elif obj_type == t_col_vector:
        nested_type = obj_casted.template_argument(0)
        start, end, _ = get_podarray_bounds(obj_casted["data"])

        return "ColumnArray[size: {}, {}]".format(nested_type, end - start)
    else:
        return "NI {}".format(obj_type)
def cast_interface(obj: gdb.Value, type: str) -> gdb.Value:
    gdb_type = gdb.lookup_type(type)
    return obj.cast(gdb_type)
def cast_address(obj: gdb.Value, type: str) -> gdb.Value:
    gdb_type = gdb.lookup_type(type).pointer()
    return obj.cast(gdb_type)
Ejemplo n.º 5
0
 def pointer_to_ast(self, pointer: gdb.Value) -> gdb.Value:
     return pointer.cast(gdb.lookup_type("ast_t").pointer())