def rust_pretty_printer_lookup_function(gdb_val): """ Returns the correct Rust pretty printer for the given value if there is one """ val = GdbValue(gdb_val) type_kind = val.type.get_type_kind() if type_kind == rustpp.TYPE_KIND_EMPTY: return RustEmptyPrinter(val) if type_kind == rustpp.TYPE_KIND_REGULAR_STRUCT: return RustStructPrinter(val, omit_first_field = False, omit_type_name = False, is_tuple_like = False) if type_kind == rustpp.TYPE_KIND_STRUCT_VARIANT: return RustStructPrinter(val, omit_first_field = True, omit_type_name = False, is_tuple_like = False) if type_kind == rustpp.TYPE_KIND_SLICE: return RustSlicePrinter(val) if type_kind == rustpp.TYPE_KIND_STR_SLICE: return RustStringSlicePrinter(val) if type_kind == rustpp.TYPE_KIND_STD_VEC: return RustStdVecPrinter(val) if type_kind == rustpp.TYPE_KIND_STD_VECDEQUE: return RustStdVecDequePrinter(val) if type_kind == rustpp.TYPE_KIND_STD_BTREESET: return RustStdBTreeSetPrinter(val) if type_kind == rustpp.TYPE_KIND_STD_BTREEMAP: return RustStdBTreeMapPrinter(val) if type_kind == rustpp.TYPE_KIND_STD_STRING: return RustStdStringPrinter(val) if type_kind == rustpp.TYPE_KIND_OS_STRING: return RustOsStringPrinter(val) if type_kind == rustpp.TYPE_KIND_TUPLE: return RustStructPrinter(val, omit_first_field = False, omit_type_name = True, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_TUPLE_STRUCT: return RustStructPrinter(val, omit_first_field = False, omit_type_name = False, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_CSTYLE_VARIANT: return RustCStyleVariantPrinter(val.get_child_at_index(0)) if type_kind == rustpp.TYPE_KIND_TUPLE_VARIANT: return RustStructPrinter(val, omit_first_field = True, omit_type_name = False, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_SINGLETON_ENUM: variant = get_field_at_index(gdb_val, 0) return rust_pretty_printer_lookup_function(gdb_val[variant]) if type_kind == rustpp.TYPE_KIND_REGULAR_ENUM: # This is a regular enum, extract the discriminant discriminant_val = rustpp.get_discriminant_value_as_integer(val) variant = get_field_at_index(gdb_val, discriminant_val) return rust_pretty_printer_lookup_function(gdb_val[variant]) if type_kind == rustpp.TYPE_KIND_COMPRESSED_ENUM: encoded_enum_info = rustpp.EncodedEnumInfo(val) if encoded_enum_info.is_null_variant(): return IdentityPrinter(encoded_enum_info.get_null_variant_name()) non_null_val = encoded_enum_info.get_non_null_variant_val() return rust_pretty_printer_lookup_function(non_null_val.get_wrapped_value()) # No pretty printer has been found return None
def rust_pretty_printer_lookup_function(gdb_val): """ Returns the correct Rust pretty printer for the given value if there is one """ val = GdbValue(gdb_val) type_kind = val.type.get_type_kind() if type_kind == rustpp.TYPE_KIND_SLICE: return RustSlicePrinter(val) if type_kind == rustpp.TYPE_KIND_STD_VEC: return RustStdVecPrinter(val) if type_kind == rustpp.TYPE_KIND_STD_VECDEQUE: return RustStdVecDequePrinter(val) if type_kind == rustpp.TYPE_KIND_STD_BTREESET and gdb_81: return RustStdBTreeSetPrinter(val) if type_kind == rustpp.TYPE_KIND_STD_BTREEMAP and gdb_81: return RustStdBTreeMapPrinter(val) if type_kind == rustpp.TYPE_KIND_STD_STRING: return RustStdStringPrinter(val) if type_kind == rustpp.TYPE_KIND_OS_STRING: return RustOsStringPrinter(val) # Checks after this point should only be for "compiler" types -- # things that gdb's Rust language support knows about. if rust_enabled: return None if type_kind == rustpp.TYPE_KIND_EMPTY: return RustEmptyPrinter(val) if type_kind == rustpp.TYPE_KIND_REGULAR_STRUCT: return RustStructPrinter(val, omit_first_field=False, omit_type_name=False, is_tuple_like=False) if type_kind == rustpp.TYPE_KIND_STRUCT_VARIANT: return RustStructPrinter(val, omit_first_field=True, omit_type_name=False, is_tuple_like=False) if type_kind == rustpp.TYPE_KIND_STR_SLICE: return RustStringSlicePrinter(val) if type_kind == rustpp.TYPE_KIND_TUPLE: return RustStructPrinter(val, omit_first_field=False, omit_type_name=True, is_tuple_like=True) if type_kind == rustpp.TYPE_KIND_TUPLE_STRUCT: return RustStructPrinter(val, omit_first_field=False, omit_type_name=False, is_tuple_like=True) if type_kind == rustpp.TYPE_KIND_CSTYLE_VARIANT: return RustCStyleVariantPrinter(val.get_child_at_index(0)) if type_kind == rustpp.TYPE_KIND_TUPLE_VARIANT: return RustStructPrinter(val, omit_first_field=True, omit_type_name=False, is_tuple_like=True) if type_kind == rustpp.TYPE_KIND_SINGLETON_ENUM: variant = get_field_at_index(gdb_val, 0) return rust_pretty_printer_lookup_function(gdb_val[variant]) if type_kind == rustpp.TYPE_KIND_REGULAR_ENUM: # This is a regular enum, extract the discriminant discriminant_val = rustpp.get_discriminant_value_as_integer(val) variant = get_field_at_index(gdb_val, discriminant_val) return rust_pretty_printer_lookup_function(gdb_val[variant]) if type_kind == rustpp.TYPE_KIND_COMPRESSED_ENUM: encoded_enum_info = rustpp.EncodedEnumInfo(val) if encoded_enum_info.is_null_variant(): return IdentityPrinter(encoded_enum_info.get_null_variant_name()) non_null_val = encoded_enum_info.get_non_null_variant_val() return rust_pretty_printer_lookup_function( non_null_val.get_wrapped_value()) # No pretty printer has been found return None
def print_val(lldb_val, internal_dict): val = LldbValue(lldb_val) type_kind = val.type.get_type_kind() if (type_kind == rustpp.TYPE_KIND_REGULAR_STRUCT or type_kind == rustpp.TYPE_KIND_REGULAR_UNION or type_kind == rustpp.TYPE_KIND_EMPTY): return print_struct_val(val, internal_dict, omit_first_field=False, omit_type_name=False, is_tuple_like=False) if type_kind == rustpp.TYPE_KIND_STRUCT_VARIANT: return print_struct_val(val, internal_dict, omit_first_field=True, omit_type_name=False, is_tuple_like=False) if type_kind == rustpp.TYPE_KIND_SLICE: return print_vec_slice_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_STR_SLICE: return print_str_slice_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_STD_VEC: return print_std_vec_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_STD_STRING: return print_std_string_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_TUPLE: return print_struct_val(val, internal_dict, omit_first_field=False, omit_type_name=True, is_tuple_like=True) if type_kind == rustpp.TYPE_KIND_TUPLE_STRUCT: return print_struct_val(val, internal_dict, omit_first_field=False, omit_type_name=False, is_tuple_like=True) if type_kind == rustpp.TYPE_KIND_CSTYLE_VARIANT: return val.type.get_unqualified_type_name() if type_kind == rustpp.TYPE_KIND_TUPLE_VARIANT: return print_struct_val(val, internal_dict, omit_first_field=True, omit_type_name=False, is_tuple_like=True) if type_kind == rustpp.TYPE_KIND_SINGLETON_ENUM: return print_val(lldb_val.GetChildAtIndex(0), internal_dict) if type_kind == rustpp.TYPE_KIND_PTR: return print_pointer_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_FIXED_SIZE_VEC: return print_fixed_size_vec_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_REGULAR_ENUM: # This is a regular enum, extract the discriminant discriminant_val = rustpp.get_discriminant_value_as_integer(val) return print_val(lldb_val.GetChildAtIndex(discriminant_val), internal_dict) if type_kind == rustpp.TYPE_KIND_COMPRESSED_ENUM: encoded_enum_info = rustpp.EncodedEnumInfo(val) if encoded_enum_info.is_null_variant(): return encoded_enum_info.get_null_variant_name() non_null_val = encoded_enum_info.get_non_null_variant_val() return print_val(non_null_val.get_wrapped_value(), internal_dict) # No pretty printer has been found return lldb_val.GetValue()
def print_val(lldb_val, internal_dict): val = LldbValue(lldb_val) type_kind = val.type.get_type_kind() if (type_kind == rustpp.TYPE_KIND_REGULAR_STRUCT or type_kind == rustpp.TYPE_KIND_EMPTY): return print_struct_val(val, internal_dict, omit_first_field = False, omit_type_name = False, is_tuple_like = False) if type_kind == rustpp.TYPE_KIND_STRUCT_VARIANT: return print_struct_val(val, internal_dict, omit_first_field = True, omit_type_name = False, is_tuple_like = False) if type_kind == rustpp.TYPE_KIND_SLICE: return print_vec_slice_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_STR_SLICE: return print_str_slice_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_STD_VEC: return print_std_vec_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_STD_STRING: return print_std_string_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_TUPLE: return print_struct_val(val, internal_dict, omit_first_field = False, omit_type_name = True, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_TUPLE_STRUCT: return print_struct_val(val, internal_dict, omit_first_field = False, omit_type_name = False, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_CSTYLE_VARIANT: return val.type.get_unqualified_type_name() if type_kind == rustpp.TYPE_KIND_TUPLE_VARIANT: return print_struct_val(val, internal_dict, omit_first_field = True, omit_type_name = False, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_SINGLETON_ENUM: return print_val(lldb_val.GetChildAtIndex(0), internal_dict) if type_kind == rustpp.TYPE_KIND_PTR: return print_pointer_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_FIXED_SIZE_VEC: return print_fixed_size_vec_val(val, internal_dict) if type_kind == rustpp.TYPE_KIND_REGULAR_ENUM: # This is a regular enum, extract the discriminant discriminant_val = rustpp.get_discriminant_value_as_integer(val) return print_val(lldb_val.GetChildAtIndex(discriminant_val), internal_dict) if type_kind == rustpp.TYPE_KIND_COMPRESSED_ENUM: encoded_enum_info = rustpp.EncodedEnumInfo(val) if encoded_enum_info.is_null_variant(): return encoded_enum_info.get_null_variant_name() non_null_val = encoded_enum_info.get_non_null_variant_val() return print_val(non_null_val.get_wrapped_value(), internal_dict) # No pretty printer has been found return lldb_val.GetValue()
def rust_pretty_printer_lookup_function(gdb_val): """ Returns the correct Rust pretty printer for the given value if there is one """ val = GdbValue(gdb_val) type_kind = val.type.get_type_kind() if type_kind == rustpp.TYPE_KIND_EMPTY: return RustEmptyPrinter(val) if type_kind == rustpp.TYPE_KIND_REGULAR_STRUCT: return RustStructPrinter(val, omit_first_field = False, omit_type_name = False, is_tuple_like = False) if type_kind == rustpp.TYPE_KIND_STRUCT_VARIANT: return RustStructPrinter(val, omit_first_field = True, omit_type_name = False, is_tuple_like = False) if type_kind == rustpp.TYPE_KIND_SLICE: return RustSlicePrinter(val) if type_kind == rustpp.TYPE_KIND_STR_SLICE: return RustStringSlicePrinter(val) if type_kind == rustpp.TYPE_KIND_STD_VEC: return RustStdVecPrinter(val) if type_kind == rustpp.TYPE_KIND_STD_STRING: return RustStdStringPrinter(val) if type_kind == rustpp.TYPE_KIND_OS_STRING: return RustOsStringPrinter(val) if type_kind == rustpp.TYPE_KIND_TUPLE: return RustStructPrinter(val, omit_first_field = False, omit_type_name = True, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_TUPLE_STRUCT: return RustStructPrinter(val, omit_first_field = False, omit_type_name = False, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_CSTYLE_VARIANT: return RustCStyleVariantPrinter(val.get_child_at_index(0)) if type_kind == rustpp.TYPE_KIND_TUPLE_VARIANT: return RustStructPrinter(val, omit_first_field = True, omit_type_name = False, is_tuple_like = True) if type_kind == rustpp.TYPE_KIND_SINGLETON_ENUM: variant = get_field_at_index(gdb_val, 0) return rust_pretty_printer_lookup_function(gdb_val[variant]) if type_kind == rustpp.TYPE_KIND_REGULAR_ENUM: # This is a regular enum, extract the discriminant discriminant_val = rustpp.get_discriminant_value_as_integer(val) variant = get_field_at_index(gdb_val, discriminant_val) return rust_pretty_printer_lookup_function(gdb_val[variant]) if type_kind == rustpp.TYPE_KIND_COMPRESSED_ENUM: encoded_enum_info = rustpp.EncodedEnumInfo(val) if encoded_enum_info.is_null_variant(): return IdentityPrinter(encoded_enum_info.get_null_variant_name()) non_null_val = encoded_enum_info.get_non_null_variant_val() return rust_pretty_printer_lookup_function(non_null_val.get_wrapped_value()) # No pretty printer has been found return None