public override GamaValueRef VisitExprOpLogic([NotNull] GamaParser.ExprOpLogicContext context) { var lhs = Visit(context.expr(0)); var rhs = Visit(context.expr(1)); var op = context.opLogic().GetText(); GamaFunctionList oplist; if (op == "&&") { oplist = lhs.Type.Meta.Operators.And; } else if (op == "||") { oplist = lhs.Type.Meta.Operators.Or; } else { oplist = lhs.Type.Meta.Operators.Xor; } var target = !IsEmptyTT ? TopTT : null; GamaFunctionRef fnref = null; if (target == null) { fnref = oplist.FindFunction(new[] { lhs.Type, rhs.Type }); } else { fnref = oplist.FindFunction(target, new[] { lhs.Type, rhs.Type }); } if (fnref == null) { GamaCompiledFunctionList coplist; if (op == "&&") { coplist = lhs.Type.Meta.CompiledOperators.And; } else if (op == "||") { coplist = lhs.Type.Meta.CompiledOperators.Or; } else { coplist = lhs.Type.Meta.CompiledOperators.Xor; } GamaCompiledFunctionRef cfnref = null; if (target == null) { cfnref = coplist.FindFunction(lhs.Type, rhs.Type); } else { cfnref = coplist.FindFunction(target, new[] { lhs.Type, rhs.Type }); } if (cfnref == null) { Parent.NamespaceContext.Context.AddError(new ErrorNoViableOperator(context)); return(null); } var cbuilder = Parent.Builder; Parent.CurrentBlock.PositionBuilderAtEnd(cbuilder); return(cfnref.Call(cbuilder, lhs, rhs)); } /* LLVM */ var block = Parent.CurrentBlock; var builder = Parent.Builder; block.PositionBuilderAtEnd(builder); var result = builder.BuildCall(fnref.Value, new LLVMValueRef[] { lhs.Value, rhs.Value }); return(new GamaValueRef(fnref.ReturnType, result, false)); }
public override GamaValueRef VisitExprOpComp([NotNull] GamaParser.ExprOpCompContext context) { var lhs = Visit(context.expr(0)); var rhs = Visit(context.expr(1)); var op = context.opComp().GetText(); GamaFunctionList oplist; if (op == ">") { oplist = lhs.Type.Meta.Operators.Gt; } else if (op == "<") { oplist = lhs.Type.Meta.Operators.Lt; } else if (op == ">=") { oplist = lhs.Type.Meta.Operators.Ge; } else if (op == "<=") { oplist = lhs.Type.Meta.Operators.Le; } else if (op == "==") { oplist = lhs.Type.Meta.Operators.Eq; } else { oplist = lhs.Type.Meta.Operators.Neq; } GamaFunctionRef fnref = oplist.FindFunction(InstanceTypes.Bool, new[] { lhs.Type, rhs.Type }); if (fnref == null) { GamaCompiledFunctionList coplist; if (op == ">") { coplist = lhs.Type.Meta.CompiledOperators.Gt; } else if (op == "<") { coplist = lhs.Type.Meta.CompiledOperators.Lt; } else if (op == ">=") { coplist = lhs.Type.Meta.CompiledOperators.Ge; } else if (op == "<=") { coplist = lhs.Type.Meta.CompiledOperators.Le; } else if (op == "==") { coplist = lhs.Type.Meta.CompiledOperators.Eq; } else { coplist = lhs.Type.Meta.CompiledOperators.Neq; } GamaCompiledFunctionRef cfnref = coplist.FindFunction(InstanceTypes.Bool, new[] { lhs.Type, rhs.Type }); if (cfnref == null) { Parent.NamespaceContext.Context.AddError(new ErrorNoViableOperator(context)); return(null); } var cbuilder = Parent.Builder; Parent.CurrentBlock.PositionBuilderAtEnd(cbuilder); return(cfnref.Call(cbuilder, lhs, rhs)); } /* LLVM */ var block = Parent.CurrentBlock; var builder = Parent.Builder; block.PositionBuilderAtEnd(builder); var result = builder.BuildCall(fnref.Value, new LLVMValueRef[] { lhs.Value, rhs.Value }); return(new GamaValueRef(fnref.ReturnType, result, false)); }