hoist: new hoisting context inside closures and loops; don't hoist loop vars
This commit is contained in:
parent
a9dfd3d6b9
commit
ae04fa73ef
27
hoistpass.go
27
hoistpass.go
@ -31,6 +31,9 @@ func (this *hoistPass) Enter(n_ *node.Node) error {
|
|||||||
// can't contain any hoistable statements
|
// can't contain any hoistable statements
|
||||||
return this.enterStmtList(&n.Stmts)
|
return this.enterStmtList(&n.Stmts)
|
||||||
|
|
||||||
|
case *expr.Closure:
|
||||||
|
return this.enterStmtList(&n.Stmts)
|
||||||
|
|
||||||
case *node.Root:
|
case *node.Root:
|
||||||
return this.enterStmtList(&n.Stmts)
|
return this.enterStmtList(&n.Stmts)
|
||||||
|
|
||||||
@ -46,6 +49,30 @@ func (this *hoistPass) Enter(n_ *node.Node) error {
|
|||||||
case *binary.LogicalOr:
|
case *binary.LogicalOr:
|
||||||
return this.enterShortCircuitingBinOp(&n.Left, &n.Right)
|
return this.enterShortCircuitingBinOp(&n.Left, &n.Right)
|
||||||
|
|
||||||
|
// Don't try to hoist a ++i statement in the loop conditional
|
||||||
|
// Bypass by just walking the stmts in a new hoist context
|
||||||
|
// TODO handle hoisting within closures in conditional statements
|
||||||
|
case *stmt.For:
|
||||||
|
if sl, ok := n.Stmt.(*stmt.StmtList); ok {
|
||||||
|
return this.enterStmtList(&sl.Stmts)
|
||||||
|
} else {
|
||||||
|
// single statement, ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
case *stmt.Do:
|
||||||
|
if sl, ok := n.Stmt.(*stmt.StmtList); ok {
|
||||||
|
return this.enterStmtList(&sl.Stmts)
|
||||||
|
} else {
|
||||||
|
// single statement, ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
case *stmt.While:
|
||||||
|
if sl, ok := n.Stmt.(*stmt.StmtList); ok {
|
||||||
|
return this.enterStmtList(&sl.Stmts)
|
||||||
|
} else {
|
||||||
|
// single statement, ignore
|
||||||
|
}
|
||||||
|
|
||||||
case *expr.PreInc:
|
case *expr.PreInc:
|
||||||
// Hoist the whole increment expression up to statement context
|
// Hoist the whole increment expression up to statement context
|
||||||
// We also have to convert it to a post-increment
|
// We also have to convert it to a post-increment
|
||||||
|
Loading…
Reference in New Issue
Block a user