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)); } }
ksymbol_t knh_addname(CTX ctx, kString *s, knh_Fdictset f) { size_t n = knh_Map_size(ctx->share->symbolDictCaseSet); if(unlikely(!(n+1 < KFLAG_MN_SETTER))) { /* Integer overflowed */ KNH_DIE("too many names, last nameid(fn)=%d < %d", (int)(n+1), (int)KFLAG_MN_SETTER); } knh_Array_add(ctx, ctx->share->symbolList, s); f(ctx, ctx->share->symbolDictCaseSet, s, n + 1); return (ksymbol_t)(n); }
static ktype_t msgpack_read(CTX ctx, msgpack_object obj, ksfp_t *sfp) { switch (obj.type) { case MSGPACK_OBJECT_NIL: KNH_SETv(ctx, sfp[0].o, KNH_NULL); return CLASS_Tdynamic; case MSGPACK_OBJECT_BOOLEAN: sfp[0].bvalue = obj.via.boolean; return CLASS_Boolean; case MSGPACK_OBJECT_NEGATIVE_INTEGER: sfp[0].ivalue = obj.via.i64; return CLASS_Int; case MSGPACK_OBJECT_POSITIVE_INTEGER: sfp[0].uvalue = obj.via.u64; return CLASS_Int; case MSGPACK_OBJECT_DOUBLE: sfp[0].fvalue = obj.via.dec; return CLASS_Float; case MSGPACK_OBJECT_RAW: KNH_SETv(ctx, sfp[0].o, new_String(ctx, obj.via.raw.ptr)); return CLASS_String; case MSGPACK_OBJECT_ARRAY: { msgpack_object *a = obj.via.array.ptr; size_t asize = obj.via.array.size; const msgpack_object *array_end = obj.via.array.ptr + asize; KNH_SETv(ctx, sfp[0].o, new_Array(ctx, CLASS_Tdynamic, asize)); for (; a < array_end; a++) { ktype_t type = msgpack_read(ctx, *a, sfp+1); knh_boxing(ctx, sfp+1, type); knh_Array_add(ctx, sfp[0].a, sfp[1].o); } return CLASS_Array; } case MSGPACK_OBJECT_MAP: { if (obj.via.map.size == 0) break; msgpack_object_kv *map = obj.via.map.ptr; msgpack_object_kv *map_end = obj.via.map.ptr + obj.via.map.size; KNH_SETv(ctx, sfp[0].o, new_DataMap(ctx/*, obj.via.map.size*/)); for (; map < map_end; map++) { const char *key = map->key.via.raw.ptr; ktype_t type = msgpack_read(ctx, map->val, sfp+1); knh_boxing(ctx, sfp+1, type); klr_setesp(ctx, sfp+2); knh_DataMap_set(ctx, sfp[0].m, new_String(ctx, key), sfp[1].o); } return CLASS_Map; } } return CLASS_Tvoid; }
static METHOD knh__String_split(Ctx *ctx, knh_sfp_t *sfp) { Array *a = NULL; int istrim = IS_NULL(sfp[2].o) ? 0 : (int)sfp[2].ivalue; if(IS_NULL(sfp[1].o)) { a = knh_String_toCharArray(ctx, sfp[0].s, istrim); } else { knh_bytes_t delim = knh_String_tobytes(sfp[1].s); if(delim.len == 0) { a = knh_String_toCharArray(ctx, sfp[0].s, istrim); } else { knh_bytes_t base = knh_String_tobytes(sfp[0].s); a = new_Array(ctx, CLASS_String, 8); while(1) { knh_index_t loc = knh_bytes_indexOf(base, delim); if(loc == -1) { if(istrim) base = knh_bytes_trim(base); knh_Array_add(ctx, a, UP(new_String(ctx, base, sfp[0].s))); break; } else if(loc == 0) { knh_Array_add(ctx, a, UP(TS_EMPTY)); } else { knh_bytes_t t = knh_bytes_first(base, loc); if(istrim) t = knh_bytes_trim(t); knh_Array_add(ctx, a, UP(new_String(ctx, t, sfp[0].s))); } base.buf = base.buf + loc + delim.len; base.len = base.len - loc - delim.len; } } } KNH_ASSERT(a != NULL); KNH_RETURN(ctx, sfp, a); }
static Array *knh_String_toCharArray(Ctx *ctx, String *bs, int istrim) { knh_bytes_t base = knh_String_tobytes(bs); if(knh_String_isASCII(bs)) { size_t i, n = base.len; Array *a = new_Array(ctx, CLASS_String, n); for(i = 0; i < n; i++) { if(istrim && isspace(base.buf[i])) continue; knh_bytes_t sub = { base.buf + i, 1}; knh_Array_add(ctx, a, UP(new_String(ctx, sub, bs))); } return a; } else { size_t i, n = knh_bytes_mlen(base); Array *a = new_Array(ctx, CLASS_String, n); for(i = 0; i < n; i++) { if(istrim && isspace(base.buf[i])) continue; knh_bytes_t sub = knh_bytes_mofflen(base, n, 1); knh_Array_add(ctx, a, UP(new_String(ctx, sub, bs))); } return a; } }
kuri_t knh_getURI(CTX ctx, kbytes_t t) { OLD_LOCK(ctx, LOCK_SYSTBL, NULL); kindex_t idx = knh_DictSet_index(ctx->share->urnDictSet, t); if(idx == -1) { kString *s = new_String2(ctx, CLASS_String, t.text, t.len, SPOL_POOLALWAYS); idx = knh_Array_size(ctx->share->urns); knh_DictSet_set(ctx, ctx->share->urnDictSet, s, idx); knh_Array_add(ctx, ctx->share->urns, s); KNH_NTRACE2(ctx, "konoha:newuri", K_OK, KNH_LDATA(LOG_s("urn", S_totext(s)), LOG_i("uri", idx))); } else { idx = knh_DictSet_valueAt(ctx->share->urnDictSet, idx); } OLD_UNLOCK(ctx, LOCK_SYSTBL, NULL); return (kuri_t)idx; }
int main(int argc, const char *argv[]) { int i, argc_ = argc; const char *argv_[argc_]; const char *fname = parse_option(&argc_, argv, argv_); if (fname == NULL) { fprintf(stderr, "%s [--emit-llvm/--emit-js] file\n", argv[0]); return 1; } konoha_t konoha = konoha_open(); CTX ctx = konoha; kString *s = new_T(fname); knh_DictMap_set(ctx, ctx->share->props, new_T("script.name"), s); kArray *a = new_Array(ctx, CLASS_String, argc_); for(i = 2; i < argc_; i++) { knh_Array_add(ctx, a, new_String2(ctx, CLASS_String, argv_[i], knh_strlen(argv_[i]), SPOL_TEXT|SPOL_POOLALWAYS)); } knh_DictMap_set(ctx, ctx->share->props, new_T("script.argv"), a); kbytes_t t = knh_bytes_nsname(S_tobytes(s)); knh_Script_setNSName(ctx, ctx->script, new_S(t.text, t.len)); kbytes_t pkgname = STEXT("konoha.compiler"); knh_loadPackage(ctx, pkgname); load_codegenerator(ctx); if (!compiler_run_main) { knh_setCompileMode(ctx, 1); } knh_startScript(ctx, (const char*)fname); /* CompilerAPI->dump() */ kMethod *mtd = load_method(ctx, O_cid(ctx->share->konoha_compiler), STEXT("dump")); BEGIN_LOCAL(ctx, lsfp, K_CALLDELTA+1); { KNH_SETv(ctx, lsfp[K_CALLDELTA].o, ctx->share->konoha_compiler); KNH_SCALL(ctx, lsfp, 0, mtd, 0); } END_LOCAL(ctx, lsfp); if (compiler_run_main) { knh_stack_clear(ctx, ctx->stack); knh_runMain(ctx, argc_, argv_); } konoha_close(konoha); return 0; }
static void knh_parsearg(CTX ctx, int argc, const char **argv) { int i; kArray *a = new_Array(ctx, CLASS_String, argc); for(i = 1; i < argc; i++) { knh_Array_add(ctx, a, new_String2(ctx, CLASS_String, argv[i], knh_strlen(argv[i]), SPOL_TEXT|SPOL_POOLALWAYS)); } knh_DictMap_set(ctx, ctx->share->props, new_T("script.argv"), a); if(argc > 0) { kString *s = new_T(argv[0]); knh_DictMap_set(ctx, ctx->share->props, new_T("script.name"), s); kbytes_t t = knh_bytes_nsname(S_tobytes(s)); knh_Script_setNSName(ctx, ctx->script, new_String2(ctx, CLASS_String, t.text, t.len, SPOL_TEXT|SPOL_POOLALWAYS)); } else { knh_Script_setNSName(ctx, ctx->script, TS_main); } }
static knh_String_t *Gamma_vperror(CTX ctx, int pe, const char *fmt, va_list ap) { knh_String_t *msg = TS_EMPTY; int isPRINT = (pe <= KC_DWARN) ? 1 : 0; if(pe != KC_DEBUG && (CTX_isInteractive(ctx) || knh_isCompileOnly(ctx))) { isPRINT = 1; } if(Gamma_isQuiet(ctx->gma) || ctx->gma->uline == 0) { isPRINT = 0; } //DBG_P("/*isPRINT=%d*/ uline=%d", isPRINT, ctx->gma->uline); if(isPRINT == 1) { knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_write_uline(ctx, cwb->w, ctx->gma->uline); knh_write_ascii(ctx, cwb->w, KC__(pe)); knh_vprintf(ctx, cwb->w, fmt, ap); msg = knh_cwb_newString(ctx, cwb); knh_Array_add(ctx, DP(ctx->gma)->errmsgs, msg); fprintf(stderr, "%s - %s%s\n", TERM_BNOTE(ctx, pe), S_tochar(msg), TERM_ENOTE(ctx, pe)); } return msg; }
Array *knh_Regex_split(Ctx *ctx, Regex *o, String *s) { char *str = knh_String_tochar(s); knh_regmatch_t pmatch[KNH_REGEX_NMATCH_SIZE]; int res = o->df->regexec(ctx, o->reg, str, KNH_REGEX_NMATCH_SIZE, pmatch, 0); if(res == 0) { Array *a = new_Array(ctx, CLASS_String, KNH_REGEX_NMATCH_SIZE); knh_bytes_t sub = knh_String_tobytes(s); int i; for(i = 1; i < KNH_REGEX_NMATCH_SIZE; i++) { if(pmatch[i].rm_so == -1) break; //DBG_P("[%d], rm_so=%d, rm_eo=%d", i, pmatch[i].rm_so, pmatch[i].rm_eo); sub.buf = (knh_uchar_t*)str + pmatch[i].rm_so; sub.len = pmatch[i].rm_eo - pmatch[i].rm_so; knh_Array_add(ctx, a, UP(new_String(ctx, sub, s))); } return a; } else { return (Array*)knh_getClassDefaultValue(ctx, ACLASS_String); //return (Array*)KNH_NULL; } }
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; }
/* added by Wakamori */ void loadPolicy(CTX ctx) { if (enforce_security == 0) return; // load $konoha.home.path/policy knh_setProperty(ctx, new_String(ctx, "role"), (dynamic *)new_String(ctx, role)); CWB_t cwbbuf, *cwb = CWB_open0(ctx, &cwbbuf); kString *s = knh_getPropertyNULL(ctx, STEXT("konoha.home.path")); CWB_write(ctx, cwb, S_tobytes(s)); CWB_write(ctx, cwb, STEXT("/policy")); kInputStream *is = new_InputStream(ctx, NULL, new_Path(ctx, CWB_newString0(ctx, cwb))); if (is == NULL) { DBG_P("policy file not found. All @Restricted annotated method is rescricted"); } else { /* if (enforce_security == 0) { enforce_security = 1; knh_memcpy(role, "Default", 7); role[7] = '\0'; } */ // parse policy file written in JSON // it must be refactored in the future kDictMap *dmap = ctx->share->securityDictMap; kString *line = knh_InputStream_readLine(ctx, is); while (IS_NOTNULL(line)) { //fprintf(stderr, "line=%s\n", S_totext(line)); if (S_equals(line, STEXT("[")) || S_equals(line, STEXT("]"))) { /* ignore */ } else { kString *key = NULL; kArray *a = new_Array(ctx, CLASS_String, 0); const char *idx = NULL; char *p = strstr(S_totext(line), "\"name\": \""); if (p != NULL) { p += 9; // == strlen("\"name\": \"") idx = strchr((const char *)p, '"'); if (idx != NULL) { p[idx - p] = '\0'; //fprintf(stderr, "name: %s\n", p); //knh_DictMap_set(ctx, dmap, new_String(ctx, "name"), new_String(ctx, p)); key = new_String(ctx, p); p = (char *)idx + 1; } } p = strstr((const char *)p, "\"permission\": ["); if (p != NULL) { p += 16; // == strlen("\"permission\": \[\"") idx = strchr((const char *)p, '"'); while (idx != NULL) { p[idx - p] = '\0'; if (strstr((const char *)p, ", ") == NULL) { //fprintf(stderr, "permission: %s\n", p); knh_Array_add(ctx, a, new_String(ctx, p)); } p = (char *)idx + 1; idx = strchr((const char *)p, '"'); } } if (key != NULL) { knh_DictMap_set(ctx, dmap, key, a); } } line = knh_InputStream_readLine(ctx, is); } knh_InputStream_close(ctx, is); } }