Example #1
0
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;
}
Example #2
0
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;
}