   # in which case, no dice. If the body mentions `this` or `arguments`,
   # then make sure that the closure wrapper preserves the original values.
   wrap: (expressions, statement, noReturn) ->
-    return expressions if expressions.containsPureStatement()
+    return expressions if expressions.jumps()
     func = new Code [], Expressions.wrap [expressions]
     args = []
     if (mentionsArgs = expressions.contains @literalArgs) or

# 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
