Beispiel #1
0
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;
}