contexts (Debugger)

    /*
     *   call-seq:
     *      Debugger.contexts -> array
     *
     *   Returns an array of all contexts.
     */
    static VALUE
    debug_contexts(VALUE self)
    {
        volatile VALUE list;
        volatile VALUE new_list;
        VALUE thread, context;
        threads_table_t *threads_table;
        debug_context_t *debug_context;
        int i;

        debug_check_started();

        new_list = rb_ary_new();
        list = rb_funcall(rb_cThread, idList, 0);
        for(i = 0; i < RARRAY(list)->len; i++)
        {
            thread = rb_ary_entry(list, i);
            thread_context_lookup(thread, &context, NULL);
            rb_ary_push(new_list, context);
        }
        threads_table_clear(threads_tbl);
        Data_Get_Struct(threads_tbl, threads_table_t, threads_table);
        for(i = 0; i < RARRAY(new_list)->len; i++)
        {
            context = rb_ary_entry(new_list, i);
            Data_Get_Struct(context, debug_context_t, debug_context);
            st_insert(threads_table->tbl, debug_context->thread_id, context);
        }

        return new_list;
    }