Skip to content

Commit 2d206e7

Browse files
committed
pulling out pushes into a pushnode
1 parent bb9fdd3 commit 2d206e7

1 file changed

Lines changed: 13 additions & 6 deletions

File tree

lib/coffee_script/nodes.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)