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); } }
METHOD knh__System_setMethodCompilationListener(Ctx *ctx, knh_sfp_t *sfp) { String *key; if(IS_NULL(sfp[2].s)) { key = T__("MethodC"); } else { knh_cwb_t cwbbuf, *cwb = knh_cwb_openinit(ctx, &cwbbuf, STEXT("MethodC")); knh_bytes_t anno = knh_String_tobytes(sfp[2].s); if(anno.buf[0] != '@') { knh_cwb_putc(ctx, cwb, '@'); } knh_cwb_write(ctx, cwb, anno); key = knh_cwb_newString(ctx, cwb); } KNH_LOCK(ctx, LOCK_SYSTBL, NULL); { DictMap *dm = DP(ctx->sys)->listenerDictMap; knh_DictMap_set(ctx, dm, key, sfp[1].o); } KNH_UNLOCK(ctx, LOCK_SYSTBL, NULL); KNH_RETURN_void(ctx, sfp); }
int knh_addClassConst(CTX, kcid_t cid, kString* name, Object *value) { int ret; kDictMap *cmap = ClassTBL(cid)->constDictCaseMapNULL; DBG_ASSERT_cid(cid); if(cmap == NULL) { kclass_t *t = varClassTBL(cid); cmap = new_DictMap0(_ctx, 0, 1/*isCaseMap*/, "ClassTBL.constDictMap"); KINITv(t->constDictCaseMapNULL, cmap); } DBG_ASSERT(IS_Map(cmap)); OLD_LOCK(_ctx, LOCK_SYSTBL, NULL); int idx = knh_DictMap_index(cmap, S_tobytes(name)); if(idx != -1) { ret = 0; goto L_UNLOCK; } knh_DictMap_set(_ctx, cmap, name, value); ret = 1; L_UNLOCK: OLD_UNLOCK(_ctx, LOCK_SYSTBL, NULL); return ret; }
/* 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); } }