public override void Visit(WriteIdentifierExpression node) { var renamedSymbol = GetRenamedSymbolOf(node.Symbol); unfinishedClone = new WriteIdentifierExpression(renamedSymbol, GetCloneOf(node.Value)); Visit((Identifier)node); }
private void AssignToImplicitReturn(Expression expression) { Debug.Assert(expression == _currExpressionStatement.Expression, "Invalid situation!"); expression.RemoveUser(_currExpressionStatement); //to avoid user complications! var assign = new WriteIdentifierExpression(_implicitReturn, expression); //_currExpressionStatement.Expression = assign; _currExpressionStatement.Replace(_currExpressionStatement.Expression, assign); TerminateCurrBlock(); }
public override void Visit(WriteIdentifierExpression node) { //TODO: Double check the alg var oldType = GetType(node); UpdateType(node, TypeCalculator.GetType(node)); var newType = GetType(node); if (HasTypeChanged(node, oldType) || (GetType(node.Symbol) != newType)) { UpdateType(node.Symbol, GetType(node)); } }
private void AddVarDeclarationsForParams(BlockStatement body) { foreach (var p in _targetFuncMetadata.FunctionIR.Parameters) { var s = p.Symbol; Debug.Assert(s.IsParameter, "Invalid situation, symbol {0} in function {1} must be a Parameter", s.Name, _targetFuncMetadata.Declaration); var renamedSymbol = GetRenamedSymbolOf(s); WriteIdentifierExpression initialization = null; if (s.ParameterIndex < _call.Arguments.Count) { //TODO: in the following, we have not removed the user of the argument, so it will introduce a WriteTemporary. initialization = new WriteIdentifierExpression(renamedSymbol, _call.Arguments[s.ParameterIndex]); } var declaration = new VariableDeclarationStatement(new List <VariableDeclaration>() { new VariableDeclaration(renamedSymbol, initialization) }); body.Statements.Add(declaration); } }
public override void Visit(ReturnStatement node) { var gotoEnd = new GotoStatement(_returnLabelName); if (node.Expression != null) { //We have a return value as well var cloned = new BlockStatement(new List <Statement>()); var returnValue = GetCloneOf(node.Expression); var retAssign = new WriteIdentifierExpression(_returnValueSymbol, returnValue); cloned.Statements.Add(gotoEnd); cloned.Statements.Add(new ExpressionStatement(retAssign)); result = cloned; } else { result = gotoEnd; } }
public override void Visit(WriteIdentifierExpression node) { base.Visit(node); Debug.Assert(node.Symbol.Writers.Contains(node), "Writer {0} is not in the writer list of symbol {0}", node.Symbol); }
public override void Visit(WriteIdentifierExpression node) { Visit((Identifier)node); VisitNode(node.Value); }
public override void Visit(WriteIdentifierExpression node) { Trace.Fail("Cannot directly clone WriteIdentifierExpression"); }
public override void Visit(WriteIdentifierExpression node) { AssignToImplicitReturn(node); }