コード例 #1
0
ファイル: array_glue.c プロジェクト: hisaboh/minikonoha
static KMETHOD TypeCheck_Bracket(KonohaContext *kctx, KonohaStack *sfp)
{
	VAR_TypeCheck(stmt, expr, gma, reqty);
	// [0] currentToken, [1] NULL, [2] ....
	size_t i;
	KonohaClass *requestClass = CT_(reqty);
	KonohaClass *paramType = (requestClass->baseTypeId == TY_Array) ? CT_(requestClass->p0) : CT_INFER;
	for(i = 2; i < kArray_size(expr->cons); i++) {
		kExpr *typedExpr = SUGAR kStmt_TypeCheckExprAt(kctx, stmt, expr, i, gma, paramType, 0);
		if(typedExpr == K_NULLEXPR) {
			KReturn(typedExpr);
		}
		if(paramType->typeId == TY_var) {
			paramType = CT_(typedExpr->attrTypeId);
		}
	}
	if(requestClass->baseTypeId != TY_Array) {
		requestClass = (paramType->typeId == TY_var) ? CT_Array : CT_p0(kctx, CT_Array, paramType->typeId);
	}
	kMethod *mtd = KLIB kNameSpace_GetMethodByParamSizeNULL(kctx, Stmt_ns(stmt), CT_Array, MN_("[]"), -1, MethodMatch_NoOption);
	DBG_ASSERT(mtd != NULL);
	KFieldSet(expr, expr->cons->MethodItems[0], mtd);
	KFieldSet(expr, expr->cons->ExprItems[1], SUGAR kExpr_SetVariable(kctx, NULL, gma, TEXPR_NEW, requestClass->typeId, kArray_size(expr->cons) - 2));
	KReturn(Expr_typed(expr, TEXPR_CALL, requestClass->typeId));
}
コード例 #2
0
ファイル: sugar_glue.c プロジェクト: kkuramitsu/minikonoha
//## Expr Expr.setVariable(Gamma gma, int build, cid typeid, int index);
static KMETHOD Expr_setVariable(KonohaContext *kctx, KonohaStack *sfp)
{
	kExpr *expr    = sfp[0].asExpr;
	kGamma *gma    = sfp[1].asGamma;
	kexpr_t build  = (kexpr_t)sfp[2].intValue;
	ktype_t cid    = (ktype_t)sfp[3].intValue;
	intptr_t index = sfp[4].unboxValue;
	KReturn(SUGAR kExpr_SetVariable(kctx, expr, gma, build, cid, index));
}