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; }
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(";"); }
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); } }
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); } }
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); } } }