Beispiel #1
0
            public override void Visit(WriteIdentifierExpression node)
            {
                var renamedSymbol = GetRenamedSymbolOf(node.Symbol);

                unfinishedClone = new WriteIdentifierExpression(renamedSymbol, GetCloneOf(node.Value));
                Visit((Identifier)node);
            }
Beispiel #2
0
            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();
            }
Beispiel #3
0
            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));
                }
            }
Beispiel #4
0
 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);
     }
 }
Beispiel #5
0
            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;
                }
            }
Beispiel #6
0
 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);
 }
Beispiel #7
0
 public override void Visit(WriteIdentifierExpression node)
 {
     Visit((Identifier)node);
     VisitNode(node.Value);
 }
Beispiel #8
0
 public override void Visit(WriteIdentifierExpression node)
 {
     Trace.Fail("Cannot directly clone WriteIdentifierExpression");
 }
Beispiel #9
0
 public override void Visit(WriteIdentifierExpression node)
 {
     AssignToImplicitReturn(node);
 }