diff --git a/js/ast.go b/js/ast.go index 16d51b9..61be683 100644 --- a/js/ast.go +++ b/js/ast.go @@ -113,6 +113,7 @@ type Scope struct { Declared VarArray // Link in Var are always nil Undeclared VarArray NumVarDecls uint16 // number of variable declaration statements in a function scope + NumForInit uint16 // offset into Declared to mark variables used in for initializer NumArguments uint16 // offset into Undeclared to mark variables used in arguments IsGlobalOrFunc bool HasWith bool @@ -213,6 +214,11 @@ func (s *Scope) findUndeclared(name []byte) *Var { return nil } +func (s *Scope) MarkForInit() { + // set the offset for variables declared in for initializer to distinguish from declarations in body + s.NumForInit = uint16(len(s.Declared)) +} + func (s *Scope) MarkArguments() { // set the offset for variables used for arguments, to ensure different b's for: function f(a=b){var b} s.NumArguments = uint16(len(s.Undeclared)) diff --git a/js/parse.go b/js/parse.go index fd644ec..717b36f 100644 --- a/js/parse.go +++ b/js/parse.go @@ -333,6 +333,7 @@ func (p *Parser) parseStmt(allowDeclaration bool) (stmt IStmt) { if !p.consume("for statement", CloseParenToken) { return } + p.scope.MarkForInit() if p.tt == OpenBraceToken { body.List = p.parseStmtList("") } else if p.tt != SemicolonToken { @@ -352,6 +353,7 @@ func (p *Parser) parseStmt(allowDeclaration bool) (stmt IStmt) { if !p.consume("for statement", CloseParenToken) { return } + p.scope.MarkForInit() if p.tt == OpenBraceToken { body.List = p.parseStmtList("") } else if p.tt != SemicolonToken { @@ -368,6 +370,7 @@ func (p *Parser) parseStmt(allowDeclaration bool) (stmt IStmt) { if !p.consume("for statement", CloseParenToken) { return } + p.scope.MarkForInit() if p.tt == OpenBraceToken { body.List = p.parseStmtList("") } else if p.tt != SemicolonToken {