Esempio n. 1
0
        public override GamaValueRef VisitExprFQMB([NotNull] GamaParser.ExprFQMBContext context)
        {
            PushLoad(false);
            var lexpr = Visit(context.expr());

            PopLoad();
            if (lexpr == null)
            {
                return(null);
            }

            var block   = Parent.CurrentBlock;
            var builder = Parent.Builder;

            block.PositionBuilderAtEnd(builder);

            var syms = context.Symbol().Select(s => s.GetText()).ToArray();

            Reference = lexpr; // for single fqmb (eg: foo.bar(...))

            for (int i = 0; i < syms.Length; i++)
            {
                var fieldref = lexpr.Type.Meta.GetField(syms[i]);
                if (fieldref == null)
                {
                    var method = lexpr.Type.Meta.GetMethod(syms[i]);
                    if (method != null)
                    {
                        if (i != syms.Length - 1)
                        {
                            Parent.NamespaceContext.Context.AddError(new ErrorFunctionIndexing(context));
                            return(null);
                        }
                        PushCall(method);
                        return(null);
                    }

                    Parent.NamespaceContext.Context.AddError(new ErrorMemberNotFound(context));
                    return(null);
                }
                /* LLVM */
                var gep = builder.BuildStructGEP(lexpr.Value, (uint)fieldref.Index);
                lexpr = new GamaValueRef(fieldref.Type, gep, true); // TODO: check editability

                Reference = lexpr;
            }

            if (!IsEmptyLoad)
            {
                if (!TopLoad)
                {
                    return(lexpr); // dont load it, for assign probably
                }
            }
            if (lexpr == null) // TODO: check this, this should not happen, in loop lexpr is ALWAYS assigned to a new value
            {
                Console.WriteLine(">>> It happened: {0}", Environment.StackTrace);
                return(null);
            }

            var load = builder.BuildLoad(lexpr.Value);
            return(new GamaValueRef(lexpr.Type, load, false));
        }
Esempio n. 2
0
 /// <summary>
 /// Visit a parse tree produced by the <c>ExprFQMB</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 VisitExprFQMB([NotNull] GamaParser.ExprFQMBContext context)
 {
     return(VisitChildren(context));
 }
Esempio n. 3
0
 /// <summary>
 /// Exit a parse tree produced by the <c>ExprFQMB</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 ExitExprFQMB([NotNull] GamaParser.ExprFQMBContext context)
 {
 }