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); }
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]); }
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; }
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; } }