/// <summary> /// if文のコンパイル /// </summary> /// <param name="ilgen">IL Generator</param> /// <param name="stmt">if文</param> static void CompileIfStmt(ILGenerator ilgen, MIfStmt stmt) { var l1 = ilgen.DefineLabel(); var l2 = ilgen.DefineLabel(); CompileExpr(ilgen, stmt.Cond); ilgen.Emit(OpCodes.Brfalse, l1); CompileStmt(ilgen, stmt.ThenStmt); ilgen.Emit(OpCodes.Br, l2); ilgen.MarkLabel(l1); CompileStmt(ilgen, stmt.ElseStmt); ilgen.MarkLabel(l2); }
/// <summary> /// if文の型推論 /// </summary> /// <param name="stmt">if文</param> static void TypeinfIfStmt(MIfStmt stmt) { TypeinfExpr(stmt.Cond); Unification(stmt.Pos, stmt.Cond.Type, new DotNetType(typeof(bool))); TypeinfStmt(stmt.ThenStmt); TypeinfStmt(stmt.ElseStmt); }