/// <summary> /// if式のコンパイル /// </summary> /// <param name="ilgen">IL Generator</param> /// <param name="expr">if式</param> static void CompileIfExpr(ILGenerator ilgen, MIfExpr expr) { var l1 = ilgen.DefineLabel(); var l2 = ilgen.DefineLabel(); CompileExpr(ilgen, expr.Cond); ilgen.Emit(OpCodes.Brfalse, l1); CompileExpr(ilgen, expr.ThenExpr); ilgen.Emit(OpCodes.Br, l2); ilgen.MarkLabel(l1); CompileExpr(ilgen, expr.ElseExpr); ilgen.MarkLabel(l2); }
/// <summary> /// if式の型推論 /// </summary> /// <param name="expr">if式</param> static void TypeinfIfExpr(MIfExpr expr) { TypeinfExpr(expr.Cond); Unification(expr.Pos, expr.Cond.Type, new DotNetType(typeof(bool))); TypeinfExpr(expr.ThenExpr); TypeinfExpr(expr.ElseExpr); Unification(expr.Pos, expr.ThenExpr.Type, expr.ElseExpr.Type); }