static SCM frscm_scm_from_frame (struct frame_info *frame, struct inferior *inferior) { frame_smob *f_smob, f_smob_for_lookup; SCM f_scm; htab_t htab; eqable_gdb_smob **slot; struct frame_id frame_id = null_frame_id; struct gdbarch *gdbarch = NULL; int frame_id_is_next = 0; /* If we've already created a gsmob for this frame, return it. This makes frames eq?-able. */ htab = frscm_inferior_frame_map (inferior); f_smob_for_lookup.frame_id = get_frame_id (frame); f_smob_for_lookup.inferior = inferior; slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &f_smob_for_lookup.base); if (*slot != NULL) return (*slot)->containing_scm; TRY { /* Try to get the previous frame, to determine if this is the last frame in a corrupt stack. If so, we need to store the frame_id of the next frame and not of this one (which is possibly invalid). */ if (get_prev_frame (frame) == NULL && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON && get_next_frame (frame) != NULL) { frame_id = get_frame_id (get_next_frame (frame)); frame_id_is_next = 1; } else { frame_id = get_frame_id (frame); frame_id_is_next = 0; } gdbarch = get_frame_arch (frame); } CATCH (except, RETURN_MASK_ALL) { return gdbscm_scm_from_gdb_exception (except); } END_CATCH f_scm = frscm_make_frame_smob (); f_smob = (frame_smob *) SCM_SMOB_DATA (f_scm); f_smob->frame_id = frame_id; f_smob->gdbarch = gdbarch; f_smob->inferior = inferior; f_smob->frame_id_is_next = frame_id_is_next; gdbscm_fill_eqable_gsmob_ptr_slot (slot, &f_smob->base); return f_scm; }
SCM syscm_scm_from_symbol (struct symbol *symbol) { htab_t htab; eqable_gdb_smob **slot; symbol_smob *s_smob, s_smob_for_lookup; SCM s_scm; /* If we've already created a gsmob for this symbol, return it. This makes symbols eq?-able. */ htab = syscm_objfile_symbol_map (symbol); s_smob_for_lookup.symbol = symbol; slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &s_smob_for_lookup.base); if (*slot != NULL) return (*slot)->containing_scm; s_scm = syscm_make_symbol_smob (); s_smob = (symbol_smob *) SCM_SMOB_DATA (s_scm); s_smob->symbol = symbol; gdbscm_fill_eqable_gsmob_ptr_slot (slot, &s_smob->base); return s_scm; }