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));
        }
Example #2
0
 /// <summary>
 /// Visit a parse tree produced by the <c>ExprOpComp</c>
 /// labeled alternative in <see cref="GamaParser.expr"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitExprOpComp([NotNull] GamaParser.ExprOpCompContext context)
 {
     return(VisitChildren(context));
 }
Example #3
0
 /// <summary>
 /// Exit a parse tree produced by the <c>ExprOpComp</c>
 /// labeled alternative in <see cref="GamaParser.expr"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitExprOpComp([NotNull] GamaParser.ExprOpCompContext context)
 {
 }