void knh_throw(CTX ctx, ksfp_t *sfp, long start) { if(IS_Exception(ctx->e)) { ksfp_t *sp = (sfp == NULL) ? ctx->esp : sfp + start; kExceptionHandler *hdr = ctx->ehdrNC; if((ctx->e)->uline == 0) { (ctx->e)->uline = knh_stack_uline(ctx, sfp); } while(ctx->stack <= sp) { if(sp[0].mtdNC != NULL && isCalledMethod(ctx, sp)) { knh_Exception_addStackTrace(ctx, ctx->e, sp+1); sp[0].mtdNC = 0; } if(sp[0].hdr == hdr) { size_t i = 0, size = knh_Array_size(hdr->stacklist); for(i = 0; i < size; i++) { kObject *o = knh_Array_n(hdr->stacklist, i); O_cTBL(o)->cdef->checkout(ctx, RAWPTR(o), 1); } kArrayrimSize(ctx, hdr->stacklist, 0); #ifdef K_USING_SETJMP_ knh_longjmp(DP(hdr)->jmpbuf, 1); #else knh_ExceptionHandler_longjmp(ctx, hdr); #endif goto L_NOCATCH; } sp--; } L_NOCATCH:; knh_write_Object(ctx, KNH_STDERR, UPCAST(ctx->e), FMT_dump); knh_exit(ctx, 0); } }
static void UI_ReportCaughtException(KonohaContext *kctx, kException *e, KonohaStack *bottomStack, KonohaStack *topStack) { const char *exceptionName; const char *optionalMessage; int fault; KonohaStack *sfp; KBuffer wb; DBG_ASSERT(IS_Exception(e)); exceptionName = KSymbol_text(e->symbol); optionalMessage = kString_text(e->Message); fault = e->fault; PLATAPI printf_i("%s", BeginTag(kctx, ErrTag)); if(optionalMessage != NULL && optionalMessage[0] != 0) { PLATAPI printf_i("%s: SoftwareFault %s", exceptionName, optionalMessage); } else { PLATAPI printf_i("%s:", exceptionName); if(KFlag_Is(int, fault, SoftwareFault)) { PLATAPI printf_i(" SoftwareFault"); } if(KFlag_Is(int, fault, UserFault)) { PLATAPI printf_i(" UserFault"); }
static void Kthrow(KonohaContext *kctx, KonohaStack *sfp, kException *e) { if(IS_Exception(e)) { KonohaStack *p = (sfp == NULL) ? kctx->esp : sfp - 1; KonohaStack *bottom = kctx->stack->stack; while(bottom < p) { if(p[0].calledMethod != NULL && isCalledMethod(kctx, p)) { kException_AddStackTrace(kctx, p+1, e); p[0].calledMethod = 0; //p = p[-1]; } p--; } } KLIB KRuntime_raise(kctx, e->symbol, SoftwareFault, NULL, sfp); }
static void Kthrow(KonohaContext *kctx, KonohaStack *sfp) { KonohaExceptionContext *ctx = KonohaContext_getExceptionContext(kctx); kException *e = ctx->thrownException; if(IS_Exception(e)) { KonohaStack *p = (sfp == NULL) ? kctx->esp : sfp - 1; KonohaStack *bottom = kctx->stack->jump_bottom; while(bottom < p) { if(p[0].mtdNC != NULL && isCalledMethod(kctx, p)) { kException_addStackTrace(kctx, p+1, e); p[0].mtdNC = 0; //p = p[-1]; } p--; } } //KLIB Kraise(kctx, 1); }
void knh_throw(Ctx *ctx, knh_sfp_t *sfp, long start) { if(IS_Exception(ctx->e)) { knh_sfp_t *sp = (sfp == NULL) ? ctx->esp : sfp + start; while(ctx->stack <= sp) { DBG_P("[%d] cid=%s ivalue=%lld", (sp - ctx->stack), CLASS__(knh_Object_cid(sp[0].o)), sp[0].ivalue); if(sp[0].callmtd != NULL && isCalledMethod(ctx, sp)) { sp = knh_Exception_addStackTrace(ctx, ctx->e, sp+1); } if(IS_ExceptionHandler(sp[0].hdr) && DP(sp[0].hdr)->return_address != NULL) { knh_ExceptionHandler_longjmp(ctx, sp[0].hdr); goto L_NOCATCH; } sp--; } L_NOCATCH:; { knh_Method_t *mtdf = knh_getSystemFormatter(ctx, CLASS_Exception, MN__dump); knh_write_Object(ctx, KNH_STDERR, sfp, &mtdf, UPCAST(ctx->e)); } knh_exit(ctx, 0); } }