Beispiel #1
0
        public LinkedList<Statement> ReorderStatements()
        {
            if (!reordered) {
                var iter = Statements.First;

                var nodeVars = new LinkedListNode<Statement>(null);
                var nodeFuncs = new LinkedListNode<Statement>(null);

                Statements.AddFirst(nodeVars);
                Statements.AddFirst(nodeFuncs);

                while (iter != null) {
                    var next = iter.Next;
                    if (iter.Value is VariableDeclarationStatement) {
                        //Statements.Remove(iter);
                        var varDecl = new VariableDeclarationStatement();
                        varDecl.Identifier = ((VariableDeclarationStatement)iter.Value).Identifier;
                        varDecl.Global = ((VariableDeclarationStatement)iter.Value).Global;
                        Statements.AddBefore(nodeVars, varDecl);
                    }
                    if (iter.Value is FunctionDeclarationStatement) {
                        Statements.Remove(iter);
                        Statements.AddBefore(nodeFuncs, iter);
                    }

                    iter = next;
                }

                Statements.Remove(nodeFuncs);
                Statements.Remove(nodeVars);

                reordered = true;
            }

            return Statements;
        }
Beispiel #2
0
		public void Visit(VariableDeclarationStatement expression)
		{
			Builder.Append("var ")
				.Append(expression.Identifier);
			if (expression.Expression == null)
			{
				Builder.AppendLine(";");
				return;
			}
			Builder.Append(" = ");
			expression.Expression.Accept(this);
			Builder.AppendLine(";");
		}
Beispiel #3
0
        public void Visit(VariableDeclarationStatement statement)
        {
            Result = JsUndefined.Instance;

            // if the right expression is not defined, declare the variable as undefined
            if (statement.Expression != null) {
                statement.Expression.Accept(this);
                if (statement.Global) {
                    throw new InvalidOperationException("Cant declare a global variable");
                    // todo: where is it from?
                }
                else {
                    if (!CurrentScope.HasOwnProperty(statement.Identifier))
                        CurrentScope.DefineOwnProperty(statement.Identifier, Result);
                    else
                        CurrentScope[statement.Identifier] = Result;
                }
            }
            else {
                // a var declaration should not affect existing one
                if (!CurrentScope.HasOwnProperty(statement.Identifier))
                    CurrentScope.DefineOwnProperty(statement.Identifier, JsUndefined.Instance);
            }
        }
Beispiel #4
0
        public void Visit(VariableDeclarationStatement statement)
        {
            Result = JsUndefined.Instance;

            // if the right expression is not defined, declare the variable as undefined
            if (statement.Expression != null)
            {
                statement.Expression.Accept(this);
            }

            if (statement.Global)
            {
                SetInScopes(statement.Identifier, Result);
            }
            else
            {
                CurrentScope.DefineOwnProperty(statement.Identifier, Result);
            }

        }
Beispiel #5
0
        void Analyze(VariableDeclarationStatement Stmt)
        {
            SetCurrentLineAndCharNos(Stmt);
            ItemChecker TC = new ItemChecker(this);
            if (Stmt.Identifier != null)
            {
                List<JintItem> LeftItems = new List<JintItem>() { new JintItem(Stmt.Source, JintState.Identifier, Stmt.Identifier, this)};
                int StatusIndex = AddToJintStack(Stmt.Source, JintState.Identifier, Stmt.Identifier);

                if (Stmt.Expression != null)
                {
                    int RightExpIndex = AddToJintStack(Stmt.Source, JintState.AssignmentExpressionRight);
                    Analyze(Stmt.Expression);

                    List<JintItem> RightItems = RemoveJintStackFrom(RightExpIndex + 1);

                    if (Stmt.Expression.GetType().Name.Equals("AssignmentExpression"))
                    {
                        Analyze(((AssignmentExpression)Stmt.Expression).Left);
                        RightItems = RemoveJintStackFrom(RightExpIndex + 1);
                    }

                    List<List<JintItem>> RightItemParts = ItemChecker.GetItemParts(RightItems);
                    UpdateMappings(LeftItems, RightItemParts);

                    foreach (List<JintItem> RightItemPart in RightItemParts)
                    {
                        TaintResult RightResult = TC.Check(RightItemPart);
                        if (RightResult.SourceTaint)
                        {
                            foreach (JintItem Item in LeftItems)
                            {
                                Item.SourceReasons.AddRange(RightResult.SourceReasons);
                            }
                            AddToSourceObjects(LeftItems);
                            if (RightItems.Count > 0)
                                AddSourceLine(RightItemPart[0].LineNo, RightResult.SourceReasons);
                            else
                                AddSourceLine(CurrentLineNo, RightResult.SourceReasons);
                        }
                        if (RightResult.SinkTaint)
                        {
                            foreach (JintItem Item in LeftItems)
                            {
                                Item.SinkReasons.AddRange(RightResult.SinkReasons);
                            }
                            AddToSinkObjects(LeftItems);
                            if (RightItems.Count > 0)
                                AddSinkLine(RightItemPart[0].LineNo, RightResult.SinkReasons);
                            else
                                AddSinkLine(CurrentLineNo, RightResult.SinkReasons);
                        }
                    }
                    RemoveJintStackFrom(StatusIndex);
                }
            }
        }