1
0
Fork 0
mirror of https://github.com/jashkenas/coffeescript.git synced 2022-11-09 12:23:24 -05:00

pulling out pushes into a pushnode

This commit is contained in:
Jeremy Ashkenas 2010-01-13 21:33:46 -05:00
parent bb9fdd3015
commit 2d206e7b60

View file

@ -658,6 +658,17 @@ module CoffeeScript
end
end
# A faux-node that is never created by the grammar, but is used during
# code generation to generate a quick "array.push(value)" tree of nodes.
class PushNode
def self.wrap(array, expressions)
Expressions.wrap(CallNode.new(
ValueNode.new(LiteralNode.new(array), [AccessorNode.new('push')]),
[expressions.unwrap]
))
end
end
# A while loop, the only sort of low-level loop exposed by CoffeeScript. From
# it, all other loops can be manufactured.
class WhileNode < Node
@ -683,9 +694,7 @@ module CoffeeScript
if !top
rvar = o[:scope].free_variable
set = "#{idt}#{rvar} = [];\n"
@body = Expressions.wrap(CallNode.new(
ValueNode.new(LiteralNode.new(rvar), [AccessorNode.new('push')]), [@body.unwrap]
))
@body = PushNode.wrap(rvar, @body)
end
post = returns ? "\n#{idt}return #{rvar};" : ''
return write("#{set}#{idt}while (#{cond}) null;#{post}") if @body.nil?
@ -743,9 +752,7 @@ module CoffeeScript
if top_level
body = Expressions.wrap(body)
else
body = Expressions.wrap(CallNode.new(
ValueNode.new(LiteralNode.new(rvar), [AccessorNode.new('push')]), [body.unwrap]
))
body = PushNode.wrap(rvar, body)
end
if o[:return]
return_result = "return #{return_result}" if o[:return]