       return yes if node.jumps loop: yes
     no
 
-  containsPureStatement: ->
-    {expressions} = @body
-    i = expressions.length
-    return true if expressions[--i]?.containsPureStatement()
-    ret = (node) -> node instanceof Return
-    return true while i-- when expressions[i].contains ret
-    false
-
   # The main difference from a JavaScript *while* is that the CoffeeScript
   # *while* can be used as a part of a larger expression -- while loops may
   # return an array containing the computed result of each iteration.

# which is helpful for recording the result arrays from comprehensions.
Push =
  wrap: (name, exps) ->
    return exps if exps.isEmpty() or last(exps.expressions).containsPureStatement()
    exps.push new Call new Value(new Literal(name), [new Access new Literal 'push']), [exps.pop()]

#### Closure

    @returns = yes
    this

  # Welcome to the hairiest method in all of CoffeeScript. Handles the inner
  # loop, filtering, stepping, and result saving for array, object, and range
  # comprehensions. Some of the generated code can be shared in common, and
  # some cannot.
  compileNode: (o) ->
    body          = Expressions.wrap [@body]
    hasPureLast   = last(body.expressions)?.jumps()
    source        = if @range then @source.base else @source
    scope         = o.scope
    name          = @name  and @name.compile o, LEVEL_LIST
