static kNode *ParseSource(KonohaContext *kctx, kNameSpace *ns, const char *script, size_t len) { KBuffer wb; KLIB KBuffer_Init(&(kctx->stack->cwb), &wb); KLIB KBuffer_Write(kctx, &wb, "(", 1); KLIB KBuffer_Write(kctx, &wb, script, len); KLIB KBuffer_Write(kctx, &wb, ")", 1); KTokenSeq tokens = {ns, KGetParserContext(kctx)->preparedTokenList}; KTokenSeq_Push(kctx, tokens); const char *buf = KLIB KBuffer_text(kctx, &wb, EnsureZero); SUGAR Tokenize(kctx, ns, buf, 0, 0, tokens.tokenList); KTokenSeq_End(kctx, tokens); KTokenSeq step2 = {ns, tokens.tokenList, kArray_size(tokens.tokenList)}; SUGAR Preprocess(kctx, ns, RangeTokenSeq(tokens), NULL, step2.tokenList); KTokenSeq_End(kctx, step2); kNode *newexpr = SUGAR ParseNewNode(kctx, ns, step2.tokenList, &step2.beginIdx, step2.endIdx, 0, NULL); KTokenSeq_Pop(kctx, tokens); KLIB KBuffer_Free(&wb); return newexpr; }
static kstatus_t kNameSpace_Eval(KonohaContext *kctx, kNameSpace *ns, const char *script, kfileline_t uline, KTraceInfo *trace) { kstatus_t result; KPARSERM->h.setupModelContext(kctx, (KRuntimeModel *)KPARSERM, 0/*lazy*/); INIT_GCSTACK(); { KTokenSeq tokens = {ns, KGetParserContext(kctx)->preparedTokenList}; KTokenSeq_Push(kctx, tokens); Tokenize(kctx, ns, script, uline, 0, tokens.tokenList); KTokenSeq_End(kctx, tokens); result = KLIB EvalTokenList(kctx, &tokens, trace); KTokenSeq_Pop(kctx, tokens); } RESET_GCSTACK(); return result; }
static KMETHOD Statement_namespace(KonohaContext *kctx, KonohaStack *sfp) { VAR_TypeCheck(stmt, ns, reqc); kstatus_t result = K_CONTINUE; kToken *tk = SUGAR kNode_GetToken(kctx, stmt, KSymbol_BlockPattern, NULL); if(tk != NULL && tk->resolvedSyntaxInfo->keyword == TokenType_LazyBlock) { INIT_GCSTACK(); kNameSpace *ns = new_(NameSpace, kNode_ns(stmt), _GcStack); KTokenSeq range = {ns, KGetParserContext(kctx)->preparedTokenList}; KTokenSeq_Push(kctx, range); SUGAR Tokenize(kctx, ns, kString_text(tk->text), tk->uline, tk->indent, range.tokenList); KTokenSeq_End(kctx, range); result = SUGAR EvalTokenList(kctx, &range, NULL/*trace*/); KTokenSeq_Pop(kctx, range); RESET_GCSTACK(); kNode_Type(kctx, stmt, KNode_Done, KType_void); } KReturnUnboxValue(result == K_CONTINUE); }