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); } }
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; }