public override object VisitIfStatement([NotNull] ClepsParser.IfStatementContext context) { IValue conditionValue = Visit(context.rightHandExpression()) as IValue; CurrMethodGenerator.CreateIfStatementBlock(conditionValue); Visit(context.statementBlock()); CurrMethodGenerator.CloseBlock(); return(conditionValue); }
public override object VisitIfStatement([NotNull] ClepsParser.IfStatementContext context) { IValue conditionValue = Visit(context.rightHandExpression()) as IValue; IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); methodRegister.CreateIfStatementBlock(conditionValue); Visit(context.statementBlock()); methodRegister.CloseBlock(); return(conditionValue); }
public override LLVMRegister VisitIfStatement([NotNull] ClepsParser.IfStatementContext context) { ClepsParser.RightHandExpressionContext condition = context.rightHandExpression(); LLVMRegister expressionValue = Visit(condition); ClepsType nativeBooleanType = ClepsType.GetBasicType("System.LLVMTypes.I1", 0 /* ptr indirection level */); LLVMValueRef?conditionRegisterPtr = null; //handle native llvm boolean type if (expressionValue.VariableType == nativeBooleanType) { conditionRegisterPtr = expressionValue.LLVMPtrValueRef; } //handle cleps llvm boolean type else if (ClassManager.RawLLVMTypeMappingClasses.ContainsKey(nativeBooleanType)) { ClepsClass mappedBooleanClass = ClassManager.RawLLVMTypeMappingClasses[nativeBooleanType]; ClepsType mappedBooleanType = ClepsType.GetBasicType(mappedBooleanClass.FullyQualifiedName, 0 /* ptr indirection level */); if (expressionValue.VariableType == mappedBooleanType) { //if the mapped type exists, then below can never be null, so call value automatically LLVMTypeRef mappedBooleanTypeInLLVM = ClepsLLVMTypeConvertorInst.GetLLVMTypeOrNull(mappedBooleanType).Value; //get the first field in the mapped type - see rawtypemap for more details conditionRegisterPtr = LLVM.BuildStructGEP(Builder, expressionValue.LLVMPtrValueRef, 0, "ifCondBooleanFieldPtr"); } } if (conditionRegisterPtr == null) { string errorMessage = String.Format("The condition expression in the if condition returns type {0} instead of a boolean expression. ", expressionValue.VariableType.GetTypeName()); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); //just assume this is condition is true to avoid stalling the compilation conditionRegisterPtr = LLVM.ConstInt(LLVM.Int1TypeInContext(Context), (ulong)1, false); } LLVMValueRef conditionRegister = LLVM.BuildLoad(Builder, conditionRegisterPtr.Value, "ifCondBooleanField"); LLVMValueRef currentFunction = LLVM.GetInsertBlock(Builder).GetBasicBlockParent(); LLVMBasicBlockRef ifThenBlock = LLVM.AppendBasicBlockInContext(Context, currentFunction, "ifthen"); LLVMBasicBlockRef ifEndBlock = LLVM.AppendBasicBlockInContext(Context, currentFunction, "ifend"); LLVM.BuildCondBr(Builder, conditionRegister, ifThenBlock, ifEndBlock); LLVM.PositionBuilderAtEnd(Builder, ifThenBlock); Visit(context.statementBlock()); LLVM.BuildBr(Builder, ifEndBlock); LLVM.PositionBuilderAtEnd(Builder, ifEndBlock); return(expressionValue); }