Example #1
0
static void
show_error_stack_trace(CRB_Interpreter *inter)
{
    int error_code;
    CRB_Object *exception;
    CRB_Value *func;

    if ((error_code = setjmp(inter->current_recovery_environment.environment))
        == 0) {
        if (inter->current_exception.type != CRB_ASSOC_VALUE) {
            crb_runtime_error(inter, NULL, 0,
                              EXCEPTION_IS_NOT_ASSOC_ERR,
                              CRB_MESSAGE_ARGUMENT_END);
        }
        exception = inter->current_exception.u.object;
        func = CRB_search_assoc_member(exception,
                                       EXCEPTION_MEMBER_PRINT_STACK_TRACE);
        if (func == NULL) {
            crb_runtime_error(inter, NULL, 0,
                              EXCEPTION_HAS_NO_PRINT_STACK_TRACE_METHOD_ERR,
                              CRB_MESSAGE_ARGUMENT_END);
        }
        if (func->type != CRB_CLOSURE_VALUE) {
            crb_runtime_error(inter, NULL, 0,
                              PRINT_STACK_TRACE_IS_NOT_CLOSURE_ERR,
                              CRB_MESSAGE_ARGUMENT_END);
        }
        CRB_call_function(inter, NULL, 0, func, 0, NULL);
    } else {
        fprintf(stderr, "Exception occured in print_stack_trace.\n");
        show_error_stack_trace(inter);
    }
}
Example #2
0
CRB_Value *
CRB_search_local_variable(CRB_LocalEnvironment *env, char *identifier)
{
    CRB_Value *value;
    CRB_Object  *sc; /* scope chain */

    if (env == NULL)
        return NULL;

    DBG_assert(env->variable->type == SCOPE_CHAIN_OBJECT,
               ("type..%d\n", env->variable->type));

    for (sc = env->variable; sc; sc = sc->u.scope_chain.next) {
        DBG_assert(sc->type == SCOPE_CHAIN_OBJECT,
                   ("sc->type..%d\n", sc->type));
        value = CRB_search_assoc_member(sc->u.scope_chain.frame, identifier);
        if (value)
            break;
    }

    return value;
}