static kMethod *CompileClosure(KonohaContext *kctx, kNameSpace *ns, kNode *expr, KClass *envCt, kToken *typeTk, kNode **texprRef) { INIT_GCSTACK(); kParam *pa = kNode_GetParamNULL(kctx, expr, typeTk, ns); kMethodVar *mtd = (kMethodVar *) KLIB new_kMethod(kctx, _GcStack, 0, envCt->typeId, 0/*mn*/, NULL); KLIB kMethod_SetParam(kctx, mtd, pa->rtype, pa->psize, (kparamtype_t *)pa->paramtypeItems); int errorCount = KGetParserContext(kctx)->errorMessageCount; KGammaStackDecl lvarItems[32] = {}; struct KGammaLocalData newgma = {}; newgma.flag = 0; newgma.currentWorkingMethod = mtd; newgma.thisClass = envCt; newgma.localScope.varItems = lvarItems; newgma.localScope.capacity = 32; newgma.localScope.varsize = 0; newgma.localScope.allocsize = 0; kNameSpace_InitParam(kctx, ns, &newgma, pa, envCt); KPushGammaStack(ns, &newgma); *texprRef = SUGAR TypeCheckNodeByName(kctx, expr, KSymbol_BlockPattern, ns, KClass_var, TypeCheckPolicy_AllowVoid); kNode *block = SUGAR kNode_GetNode(kctx, expr, KSymbol_BlockPattern, NULL); KLIB kMethod_GenCode(kctx, mtd, block, HatedLazyCompile); KPopGammaStack(ns, &newgma); kMethod_Set(StaticError, mtd, KGetParserContext(kctx)->errorMessageCount > errorCount); RESET_GCSTACK(); return mtd; }
void FuelVM_Recompile(KonohaContext *kctx, kMethod *mtd) { #ifdef FUELVM_USE_LLVM if(FuelVM_HasOptimizedCode(mtd) == false) { KLIB kMethod_GenCode(kctx, mtd, mtd->CompiledNode, O2Compile); } #endif }