@@ -658,6 +658,17 @@ def compile_node(o)
658658 end
659659 end
660660
661+ # A faux-node that is never created by the grammar, but is used during
662+ # code generation to generate a quick "array.push(value)" tree of nodes.
663+ class PushNode
664+ def self . wrap ( array , expressions )
665+ Expressions . wrap ( CallNode . new (
666+ ValueNode . new ( LiteralNode . new ( array ) , [ AccessorNode . new ( 'push' ) ] ) ,
667+ [ expressions . unwrap ]
668+ ) )
669+ end
670+ end
671+
661672 # A while loop, the only sort of low-level loop exposed by CoffeeScript. From
662673 # it, all other loops can be manufactured.
663674 class WhileNode < Node
@@ -683,9 +694,7 @@ def compile_node(o)
683694 if !top
684695 rvar = o [ :scope ] . free_variable
685696 set = "#{ idt } #{ rvar } = [];\n "
686- @body = Expressions . wrap ( CallNode . new (
687- ValueNode . new ( LiteralNode . new ( rvar ) , [ AccessorNode . new ( 'push' ) ] ) , [ @body . unwrap ]
688- ) )
697+ @body = PushNode . wrap ( rvar , @body )
689698 end
690699 post = returns ? "\n #{ idt } return #{ rvar } ;" : ''
691700 return write ( "#{ set } #{ idt } while (#{ cond } ) null;#{ post } " ) if @body . nil?
@@ -743,9 +752,7 @@ def compile_node(o)
743752 if top_level
744753 body = Expressions . wrap ( body )
745754 else
746- body = Expressions . wrap ( CallNode . new (
747- ValueNode . new ( LiteralNode . new ( rvar ) , [ AccessorNode . new ( 'push' ) ] ) , [ body . unwrap ]
748- ) )
755+ body = PushNode . wrap ( rvar , body )
749756 end
750757 if o [ :return ]
751758 return_result = "return #{ return_result } " if o [ :return ]
0 commit comments