Example #1
0
        private void _emitRecursiveTailCall(CompilerTarget target, ArgumentsProxy symbolArgs)
        {
            var symbolParams = target.Function.Parameters;
            var nullNode = new AstNull(File, Line, Column);

            //copy parameters to temporary variables
            for (var i = 0; i < symbolParams.Count; i++)
            {
                if (i < symbolArgs.Count)
                    symbolArgs[i].EmitValueCode(target);
                else
                    nullNode.EmitValueCode(target);
            }
            //overwrite parameters
            for (var i = symbolParams.Count - 1; i >= 0; i--)
            {
                target.EmitStoreLocal(Position, symbolParams[i]);
            }

            target.EmitJump(Position, 0);
        }
Example #2
0
        public void RemoveRedundant1()
        {
            const string file = "THE_FILE";
            const int line = 666;
            const int col = 555;
            //test case from MissingMapped
            var subject = new AstNull(file, line, col);
            var argv = new List<AstExpr>
                {
                    subject,
                    _createPlaceholder(1),
                    _createPlaceholder(2)
                };
            var originalArgv = argv.ToList();

            _placeholderArgvProcessing(argv);

            Assert.AreEqual(3, argv.Count, "argc changed");
            for (var i = 0; i < argv.Count; i++)
                Assert.AreSame(originalArgv[i], argv[i]);
        }
Example #3
0
        public static AstGetSet CreateNeutralExpression(AstGetSet invocation)
        {
            var nullLiteral = new AstNull(invocation.File, invocation.Line, invocation.Column);
            var call = new AstIndirectCall(invocation.File, invocation.Line, invocation.Column,
                invocation.Call, nullLiteral);
            if (invocation.Call == PCall.Set)
                call.Arguments.Add(new AstNull(invocation.File, invocation.Line, invocation.Column));

            return call;
        }
Example #4
0
        public override bool TryOptimize(CompilerTarget target, out AstExpr expr)
        {
            expr = null;

            //Optimize arguments
            for (var i = 0; i < _expressions.Count; i++)
            {
                var arg = _expressions[i];
                if (arg == null)
                    throw new PrexoniteException(
                        "Invalid (null) argument in GetSet node (" + ToString() +
                            ") detected at position " + _expressions.IndexOf(arg) + ".");
                var oArg = _GetOptimizedNode(target, arg);
                if (!ReferenceEquals(oArg, arg))
                    _expressions[i] = oArg;
            }

            var nonNullExpressions = _expressions.Where(_exprIsNotNull).ToArray();
            _expressions.Clear();
            _expressions.AddRange(nonNullExpressions);

            if (_expressions.Count == 1)
            {
                var pExpr = _expressions[0];
                expr = pExpr is AstPlaceholder ? ((AstPlaceholder) pExpr).IdFunc() : pExpr;
                return true;
            }
            else if (_expressions.Count == 0)
            {
                expr = new AstNull(File, Line, Column);
                return true;
            }
            else
            {
                return false;
            }
        }