static void knh_Exception_addStackTrace(CTX ctx, kException *e, ksfp_t *sfp) { CWB_t cwbbuf, *cwb = CWB_open0(ctx, &cwbbuf); kMethod *mtd = sfp[K_MTDIDX].mtdNC; if((mtd)->mn != MN_LAMBDA) { int i = 0, psize = knh_Method_psize(mtd); kline_t uline = knh_stack_uline(ctx, sfp); knh_write_uline(ctx, cwb->w, uline); knh_write_type(ctx, cwb->w, (mtd)->cid); knh_putc(ctx, cwb->w, '.'); knh_write_mn(ctx, cwb->w, (mtd)->mn); knh_putc(ctx, cwb->w, '('); for(i = 0; i < psize; i++) { kparam_t *p = knh_Param_get(DP(mtd)->mp, i); ktype_t type = ktype_tocid(ctx, p->type, O_cid(sfp[0].o)); if(i > 0) { knh_putc(ctx, cwb->w, ','); } knh_write_fn(ctx, cwb->w, p->fn); knh_putc(ctx, cwb->w, '='); knh_write_sfp(ctx, cwb->w, type, &sfp[i+1], FMT_line); } knh_putc(ctx, cwb->w, ')'); if(e->tracesNULL == NULL) { KNH_INITv(e->tracesNULL, new_Array(ctx, CLASS_String, 0)); } knh_Array_add(ctx, e->tracesNULL, CWB_newString0(ctx, cwb)); } }
static void knh_stack_writeStackTrace(Ctx *ctx, knh_sfp_t *sfp, knh_OutputStream_t *w) { knh_Method_t *mtd = sfp[K_MTDIDX].callmtd; knh_write_sname(ctx, w, DP(mtd)->cid); if(DP(mtd)->mn != MN_LAMBDA) { int i = 0, psize = knh_Method_psize(mtd); knh_putc(ctx, w, '.'); knh_write_mn(ctx, w, DP(mtd)->mn); knh_putc(ctx, w, '('); for(i = 0; i < psize; i++) { knh_param_t *p = knh_ParamArray_get(DP(mtd)->mp, i); knh_type_t type = knh_type_tocid(ctx, p->type, knh_Object_cid(sfp[0].o)); if(i > 0) { knh_putc(ctx, w, ','); } knh_write_fn(ctx, w, p->fn); knh_putc(ctx, w, '='); if(!knh_write_ndata(ctx, w, type, sfp[i+1].data)) { knh_Method_t *mtdf = knh_getSystemFormatter(ctx, type, MN__k); knh_write_Object(ctx, w, ctx->esp, &mtdf, sfp[i+1].o); } } knh_putc(ctx, w, ')'); } }
static void knh_write_Method(CTX ctx, knh_OutputStream_t *w, const knh_ClassTBL_t *ct, knh_Method_t *o) { knh_write_TAB(ctx, w); if(Method_isAbstract(o)) { knh_write_ascii(ctx, w, "@Abstract "); } knh_write_type(ctx, w, knh_type_tocid(ctx, knh_ParamArray_rtype(DP(o)->mp), ct->cid)); knh_putc(ctx, w, ' '); if(Method_isStatic(o)) { knh_write_ascii(ctx, w, S_tochar(ct->sname)); knh_putc(ctx, w, '.'); } knh_write_mn(ctx, w, SP(o)->mn); knh_putc(ctx, w, '('); size_t i; for(i = 0; i < knh_Method_psize(o); i++) { knh_param_t *p = knh_ParamArray_get(DP(o)->mp, i); if(i > 0) { knh_write_delim(ctx, w); } knh_write_type(ctx, w, knh_type_tocid(ctx, p->type, ct->cid)); knh_putc(ctx, w, ' '); knh_write_ascii(ctx, w, FN__(p->fn)); } if(ParamArray_isVARGs(DP(o)->mp)) { knh_write_delim(ctx, w); knh_write_dots(ctx, w); } knh_putc(ctx, w, ')'); knh_write_EOL(ctx, w); }
static void knh_write_cline(Ctx *ctx, knh_OutputStream_t *w, const char *file, long line) { knh_putc(ctx, w, '['); knh_write_text(ctx, w, knh_sfile(file)); knh_putc(ctx, w, ':'); knh_write_dfmt(ctx, w, K_INTPTR_FMT, line); knh_putc(ctx, w, ']'); knh_putc(ctx, w, ' '); }
static void knh_write_cline(CTX ctx, kOutputStream *w, const char *file, kuintptr_t line) { knh_putc(ctx, w, '('); knh_write_ascii(ctx, w, knh_sfile(file)); knh_putc(ctx, w, ':'); knh_write_dfmt(ctx, w, K_INTPTR_FMT, line); knh_putc(ctx, w, ')'); knh_putc(ctx, w, ' '); }
void knh_write_flag(Ctx *ctx, knh_OutputStream_t *w, knh_flag_t flag) { knh_intptr_t i; knh_flag_t f = 1 << 15; for(i = 0; i < 16; i++) { if(i > 0 && i % 8 == 0) knh_putc(ctx, w, ' '); if((f & flag) == f) { knh_putc(ctx, w, '1'); }else{ knh_putc(ctx, w, '0'); } f = f >> 1; } }
void knh_write_end(Ctx *ctx, knh_OutputStream_t *w, int ch) { DP(w)->indent--; if(ch != 0) { knh_write_BOL(ctx, w); knh_putc(ctx, w, ch); } }
void knh_write_begin(Ctx *ctx, knh_OutputStream_t *w, int ch) { if(ch != 0) { knh_putc(ctx, w, ch); knh_write_EOL(ctx, w); } DP(w)->indent++; }
void knh_write_cap(Ctx *ctx, knh_OutputStream_t *w, knh_bytes_t t) { if(islower(t.ustr[0])) { knh_putc(ctx, w, toupper(t.ustr[0])); t.ustr = t.ustr+1; t.len = t.len -1; } knh_write(ctx, w, t); }
void knh_write_mline(CTX ctx, kOutputStream *w, kmethodn_t mn, kline_t uline) { kuri_t uri = ULINE_uri(uline); kuintptr_t line = ULINE_line(uline); if(uline != 0 && uri != URI_unknown && line != 0) { if(mn == MN_) { knh_write_cline(ctx, w, FILENAME__(uri), line); } else { knh_putc(ctx, w, '('); knh_write_mn(ctx, w, mn); knh_putc(ctx, w, ':'); knh_write_dfmt(ctx, w, K_INTPTR_FMT, line); knh_putc(ctx, w, ')'); knh_putc(ctx, w, ' '); } } }
void knh_HashMap__k(Ctx *ctx, knh_Hash_t *o, OutputStream *w, String *m) { size_t pos = 0, c = 0; size_t max = (KNH_HASH_TABLESIZE / o->hashop->size) * DP(o)->tables_size; knh_putc(ctx, w, '{'); while(pos < max) { knh_hashentry_t *e = knh_hashentry_at((knh_Hash_t*)o, pos); if(e != NULL) { if(c > 0) { knh_write_delim(ctx,w); } knh_format(ctx, w, METHODN__k, e->key, KNH_NULL); knh_putc(ctx, w, ':'); knh_putc(ctx, w, ' '); knh_format(ctx, w, METHODN__k, e->value, KNH_NULL); c++; } pos++; } knh_putc(ctx, w, '}'); }
void knh_Stmt__s(Ctx *ctx, Stmt *o, OutputStream *w, String *m) { knh_intptr_t i; knh_putc(ctx, w, '('); if(SP(o)->stt != STT_OP && SP(o)->stt != STT_NEW && SP(o)->stt != STT_CALL ) { knh_write_char(ctx, w, knh_stmt_tochar(SP(o)->stt)); if(DP(o)->size > 0) { knh_putc(ctx, w, ' '); } } for(i = 0; i < DP(o)->size; i++) { if(i > 0) knh_putc(ctx, w, ' '); if(IS_Token(DP(o)->terms[i])) { knh_Token__s(ctx, DP(o)->tokens[i], w, m); } else { KNH_ASSERT(IS_Stmt(DP(o)->terms[i])); knh_Stmt__s(ctx, DP(o)->stmts[i], w, m); if(IS_NOTNULL(DP(DP(o)->stmts[i])->next)) { knh_write_dots(ctx, w); } } } knh_putc(ctx, w, ')'); }
void knh_Stmt__dump(Ctx *ctx, Stmt *o, OutputStream *w, String *m) { L_RESTART: ; if(IS_DictMap(DP(o)->metaDictMap)) { knh_StmtMETA_dump(ctx, o, w, m); } knh_printf(ctx, w, "%s\t", knh_stmt_tochar(SP(o)->stt)); knh_Stmt__s(ctx, o, w, m); if(IS_NOTNULL(DP(o)->next)) { knh_putc(ctx, w, '\n'); o = DP(o)->next; goto L_RESTART; } }
static knh_sfp_t *knh_Exception_addStackTrace(Ctx *ctx, knh_Exception_t *e, knh_sfp_t *sfp) { knh_intptr_t shift = sfp[K_SHIFTIDX].shift; knh_sfp_t *psfp = sfp - shift; if(ctx->stack < psfp && psfp < sfp) { if(psfp[K_MTDIDX].callmtd != NULL && isCalledMethod(ctx, psfp + K_MTDIDX)) { knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_opline_t *pc = psfp[K_SHIFTIDX].pc; knh_Method_t *mtd = psfp[K_MTDIDX].callmtd; int linenum = pc->line; const char *file = knh_Method_file(ctx, mtd); knh_write_cline(ctx, cwb->w, file, linenum); knh_putc(ctx, cwb->w, ':'); knh_stack_writeStackTrace(ctx, sfp, cwb->w); if(DP(e)->tracesNULL == NULL) { KNH_INITv(DP(e)->tracesNULL, new_Array(ctx, CLASS_String, 0)); } knh_Array_add(ctx, DP(e)->tracesNULL, knh_cwb_newString(ctx, cwb)); sfp = psfp; } } return sfp - 1; }
void knh_Regex__s(Ctx *ctx, Regex *o, OutputStream *w, String *m) { knh_putc(ctx, w, '\''); knh_write(ctx, w, knh_String_tobytes(o->pattern)); knh_putc(ctx, w, '\''); }
static void knh_String__k(Ctx *ctx, String *o, OutputStream *w, String *m) { int quote = '\''; if(knh_Object_cid(o) == CLASS_String) quote = '"'; knh_putc(ctx, w, quote); knh_bytes_t t = knh_String_tobytes(o); knh_bytes_t sub = t; size_t i, s = 0; for(i = 0; i < o->size; i++) { switch(t.buf[i]) { case '\t' : sub.buf = t.buf + s; sub.len = i - s; knh_print(ctx, w, sub); s = i + 1; knh_putc(ctx, w, '\\'); knh_putc(ctx, w, 't'); break ; case '\n' : sub.buf = t.buf + s; sub.len = i - s; knh_print(ctx, w, sub); s = i + 1; knh_putc(ctx, w, '\\'); knh_putc(ctx, w, 'n'); break ; case '\r' : sub.buf = t.buf + s; sub.len = i - s; knh_print(ctx, w, sub); s = i + 1; knh_putc(ctx, w, '\\'); knh_putc(ctx, w, 'r'); break ; case '\\' : sub.buf = t.buf + s; sub.len = i - s; knh_print(ctx, w, sub); s = i + 1; knh_putc(ctx, w, '\\'); knh_putc(ctx, w, '\\'); break ; default: if(t.buf[i] == quote) { sub.buf = t.buf + s; sub.len = i - s; knh_print(ctx, w, sub); s = i + 1; knh_putc(ctx, w, '\\'); knh_putc(ctx, w, quote); } } } if (s < t.len) { sub.buf = t.buf + s; sub.len = t.len - s; knh_print(ctx, w, sub); } knh_putc(ctx, w, quote); }
void knh_vprintf(Ctx *ctx, knh_OutputStream_t *w, const char *fmt, va_list ap) { knh_valist_t args[10]; const char *c = fmt; int i, ch, bindex = 0, bindex_max = 10; for(i = 0; i < bindex_max; i++) args[i].atype = 0; while((ch = *c) != '\0') { c++; if(ch == '%') { int index; ch = *c; if(ch == '%') { c++; continue; } index = bindex++; c = knh_vprintf_parseindex(c++, &index); //DBG_P("bindex=%d, index=%d", bindex, index); switch(ch) { case 'd': case 'u': args[index].atype = VA_DIGIT; break; case 'l': case 'i': args[index].atype = VA_LONG; break; case 'f': case 'e': args[index].atype = VA_FLOAT; break; case 's': args[index].atype = VA_CHAR; break; case 'p': args[index].atype = VA_POINTER; break; case 'L': case 'K': case 'k': case 'O': case 'o': args[index].atype = VA_OBJECT; break; case 'N': case 'F': args[index].atype = VA_FIELDN; break; case 'M': args[index].atype = VA_METHODN; break; case 'C': args[index].atype = VA_CLASS; break; case 'T': args[index].atype = VA_TYPE; break; case 'B': args[index].atype = VA_BYTES; break; // TODO // we should care if "fmt" has "%%". // sometimes, next args is NULL. case '%': index--; c++; default: bindex--; } if(bindex == 10) { DBG_ASSERT(bindex < 10); break; } } } for(i = 0; i < 10; i++) { switch(args[i].atype) { case VA_DIGIT: args[i].dvalue = (knh_intptr_t)va_arg(ap, knh_intptr_t); break; case VA_LONG: args[i].ivalue = (knh_int_t)va_arg(ap, knh_int_t); break; case VA_FLOAT: #if defined(K_USING_NOFLOAT) args[i].fvalue = (knh_float_t)va_arg(ap, knh_float_t); #else args[i].fvalue = (knh_float_t)va_arg(ap, double); #endif break; case VA_CHAR: args[i].svalue = (char*)va_arg(ap, char*); break; case VA_POINTER: args[i].pvalue = (void*)va_arg(ap, void*); break; case VA_OBJECT: args[i].ovalue = (Object*)va_arg(ap, Object*); break; case VA_FIELDN: args[i].fn = (knh_fieldn_t)va_arg(ap, int/*knh_fieldn_t*/); break; case VA_METHODN: args[i].mn = (knh_methodn_t)va_arg(ap, int/*knh_methodn_t*/); break; case VA_CLASS: args[i].cid = (knh_class_t)va_arg(ap, int/*knh_class_t*/); break; case VA_TYPE: args[i].type = (knh_type_t)va_arg(ap, int/*knh_type_t*/); break; case VA_BYTES: args[i].bvalue = (knh_bytes_t)va_arg(ap, knh_bytes_t); break; default: bindex_max = i; goto L_FORMAT; } } L_FORMAT: { knh_bytes_t b; knh_Method_t *mtd = NULL; knh_sfp_t *esp = ctx->esp; c = fmt; bindex = 0; b.text = c; b.len = 0; while((ch = *c) != '\0') { c++; if(ch == '\\') { if(b.len > 0) { knh_print(ctx, w, b); } ch = *c; switch(ch) { case '\0' : return ; case 'n': knh_println(ctx, w, STEXT("")); break; case 't': knh_write_TAB(ctx, w); break; default: knh_putc(ctx, w, '\\'); knh_putc(ctx, w, ch); } b.text = c; b.len = 0; } else if(ch == '%') { if(b.len > 0) { knh_print(ctx, w, b); } ch = *c; if(ch == '%') { knh_putc(ctx, w, '%'); c++; b.text = c; b.len = 0; continue; } int index = bindex++; c = knh_vprintf_parseindex(++c, &index); switch(ch) { case '\0' : return ; case 'd': DBG_ASSERT(args[index].atype == VA_DIGIT); knh_write_dfmt(ctx, w, K_INTPTR_FMT, args[index].dvalue); break; case 'u': DBG_ASSERT(args[index].atype == VA_DIGIT); knh_write_dfmt(ctx, w, K_INTPTR_UFMT, args[index].uvalue); break; case 'l': case 'i' : DBG_ASSERT(args[index].atype == VA_LONG); knh_write_ifmt(ctx, w, K_INT_FMT, args[index].ivalue); break; case 'f': DBG_ASSERT(args[index].atype == VA_FLOAT); knh_write_ffmt(ctx, w, K_FLOAT_FMT, args[index].fvalue); break; case 'e': DBG_ASSERT(args[index].atype == VA_FLOAT); knh_write_ffmt(ctx, w, K_FLOAT_FMTE, args[index].fvalue); break; case 's': DBG_ASSERT(args[index].atype == VA_CHAR); knh_write(ctx, w, B(args[index].svalue)); break; case 'p': DBG_ASSERT(args[index].atype == VA_POINTER); knh_write__p(ctx, w, args[index].pvalue); break; case 'L': DBG_ASSERT(args[index].atype == VA_OBJECT); if(IS_Token(args[index].ovalue)) { knh_write_token(ctx, w, (knh_Token_t*)args[index].ovalue); break; } case 'O': case 'o': DBG_ASSERT(args[index].atype == VA_OBJECT); mtd = knh_getSystemFormatter(ctx, knh_Object_cid(args[index].ovalue), MN__s); knh_write_Object(ctx, w, esp, &mtd, args[index].ovalue); break; case 'K': case 'k': DBG_ASSERT(args[index].atype == VA_OBJECT); mtd = knh_getSystemFormatter(ctx, knh_Object_cid(args[index].ovalue), MN__k); knh_write_Object(ctx, w, esp, &mtd, args[index].ovalue); break; case 'N': case 'F': DBG_ASSERT(args[index].atype == VA_FIELDN); knh_write_text(ctx, w, FN__(args[index].fn)); break; case 'M': DBG_ASSERT(args[index].atype == VA_METHODN); knh_write_mn(ctx, w, args[index].mn); break; case 'C': DBG_ASSERT(args[index].atype == VA_CLASS); knh_write_sname(ctx, w, args[index].cid); break; case 'T': DBG_ASSERT(args[index].atype == VA_TYPE); knh_write_type(ctx, w, args[index].type); break; case 'B': DBG_ASSERT(args[index].atype == VA_BYTES); knh_write(ctx,w, args[index].bvalue); break; case '%': index--; bindex--; default: //knh_putc(ctx, w, '%'); knh_putc(ctx, w, ch); } b.text = c; b.len = 0; if(!(bindex <= bindex_max)) { DBG_ASSERT(bindex <= bindex_max); break; } } else { b.len = b.len+1; } } if(b.len > 0) { knh_print(ctx, w, b); } } }