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; }
static kMethod *new_FieldGetter(KonohaContext *kctx, kArray *gcstack, ktypeattr_t cid, ksymbol_t sym, ktypeattr_t ty, int idx) { kmethodn_t mn = KMethodName_ToGetter(sym); KMethodFunc f = (KType_Is(UnboxType, ty)) ? KMethodFunc_UnboxFieldGetter : KMethodFunc_ObjectFieldGetter; kMethod *mtd = KLIB new_kMethod(kctx, gcstack, kMethod_Public|kMethod_Immutable, cid, mn, f); KLIB kMethod_SetParam(kctx, mtd, ty, 0, NULL); ((kMethodVar *)mtd)->delta = idx; // FIXME return mtd; }
static kMethod *new_FieldSetter(KonohaContext *kctx, kArray *gcstack, ktypeattr_t cid, kmethodn_t sym, ktypeattr_t ty, int idx) { kmethodn_t mn = KMethodName_ToSetter(sym); KMethodFunc f = (KType_Is(UnboxType, ty)) ? KMethodFunc_UnboxFieldSetter : KMethodFunc_ObjectFieldSetter; kparamtype_t p = {ty, KFieldName_("x")}; kMethod *mtd = KLIB new_kMethod(kctx, gcstack, kMethod_Public, cid, mn, f); KLIB kMethod_SetParam(kctx, mtd, ty, 1, &p); ((kMethodVar *)mtd)->delta = idx; // FIXME return mtd; }