enum ext_lang_rc gdbscm_apply_val_pretty_printer (const struct extension_language_defn *extlang, struct type *type, const gdb_byte *valaddr, int embedded_offset, CORE_ADDR address, struct ui_file *stream, int recurse, const struct value *val, const struct value_print_options *options, const struct language_defn *language) { struct gdbarch *gdbarch = get_type_arch (type); SCM exception = SCM_BOOL_F; SCM printer = SCM_BOOL_F; SCM val_obj = SCM_BOOL_F; struct value *value; enum display_hint hint; struct cleanup *cleanups; enum ext_lang_rc result = EXT_LANG_RC_NOP; enum string_repr_result print_result; /* No pretty-printer support for unavailable values. */ if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type))) return EXT_LANG_RC_NOP; if (!gdb_scheme_initialized) return EXT_LANG_RC_NOP; cleanups = make_cleanup (null_cleanup, NULL); /* Instantiate the printer. */ if (valaddr) valaddr += embedded_offset; value = value_from_contents_and_address (type, valaddr, address + embedded_offset); set_value_component_location (value, val); /* set_value_component_location resets the address, so we may need to set it again. */ if (VALUE_LVAL (value) != lval_internalvar && VALUE_LVAL (value) != lval_internalvar_component && VALUE_LVAL (value) != lval_computed) set_value_address (value, address + embedded_offset); val_obj = vlscm_scm_from_value (value); if (gdbscm_is_exception (val_obj)) { exception = val_obj; result = EXT_LANG_RC_ERROR; goto done; } printer = ppscm_find_pretty_printer (val_obj); if (gdbscm_is_exception (printer)) { exception = printer; result = EXT_LANG_RC_ERROR; goto done; } if (gdbscm_is_false (printer)) { result = EXT_LANG_RC_NOP; goto done; } gdb_assert (ppscm_is_pretty_printer_worker (printer)); /* If we are printing a map, we want some special formatting. */ hint = ppscm_get_display_hint_enum (printer); if (hint == HINT_ERROR) { /* Print the error as an exception for consistency. */ SCM hint_scm = ppscm_get_display_hint_scm (printer); ppscm_print_pp_type_error ("Invalid display hint", hint_scm); /* Fall through. A bad hint doesn't stop pretty-printing. */ hint = HINT_NONE; } /* Print the section. */ print_result = ppscm_print_string_repr (printer, hint, stream, recurse, options, gdbarch, language); if (print_result != STRING_REPR_ERROR) { ppscm_print_children (printer, hint, stream, recurse, options, gdbarch, language, print_result == STRING_REPR_NONE); } result = EXT_LANG_RC_OK; done: if (gdbscm_is_exception (exception)) ppscm_print_exception_unless_memory_error (exception, stream); do_cleanups (cleanups); return result; }
break; case VALSCM_LOGNOT: res_val = value_complement (arg1); break; default: gdb_assert_not_reached ("unsupported operation"); } } CATCH (except, RETURN_MASK_ALL) { GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); } END_CATCH gdb_assert (res_val != NULL); result = vlscm_scm_from_value (res_val); do_cleanups (cleanups); if (gdbscm_is_exception (result)) gdbscm_throw (result); return result; } /* Returns a value object which is the result of applying the operation specified by OPCODE to the given arguments. If there's an error a Scheme exception is thrown. */ static SCM vlscm_binop (enum valscm_binary_opcode opcode, SCM x, SCM y,