   # depending on whether it's being used as part of a larger expression, or is a
   # top-level statement within the function body.
   compile: (o) ->
-    @options = if o then merge o else {}
-    @tab     = o.indent
-    top     = if @topSensitive() then @options.top else del @options, 'top'
-    closure = @isStatement(o) and not @isPureStatement() and not top and
-              not @options.asStatement and this not instanceof Comment
-    code = if closure then @compileClosure(@options) else @compileNode(@options)
-    code
+    o    = if o then merge o else {}
+    top  = if @topSensitive() then o.top else del o, 'top'
+    @tab = o.indent
+    if top or o.asStatement or this instanceof Comment or
+       @isPureStatement() or not @isStatement(o)
+      @compileNode o
+    else
+      @compileClosure o
 
   # Statements converted into expressions via closure-wrapping share a scope
   # object with their parent closure, to preserve the expected lexical scope.
   compileClosure: (o) ->
+    if @containsPureStatement()
+      throw SyntaxError 'cannot include a pure statement in an expression.'
     o.sharedScope = o.scope
-    throw SyntaxError 'cannot include a pure statement in an expression.' if @containsPureStatement()
     Closure.wrap(this).compile o
 
   # If the code generation wishes to use the result of a complex expression


  # Break and continue must be treated as pure statements -- they lose their
  # meaning when wrapped in a closure.
  isStatement: ->
    @value in ['break', 'continue', 'debugger']
  isPureStatement: Literal::isStatement

  isComplex: NO

  isReserved: ->
    !!@value.reserved

  assigns: (name) -> name is @value

  compileNode: (o) ->
    idt = if @isStatement o then @idt()          else ''
    end = if @isStatement o then ';'             else ''
    val = if @isReserved()  then "\"#{@value}\"" else @value
    idt + val + end

  toString: -> ' "' + @value + '"'


    return "#{utility 'bind'}(#{func}, #{@context})" if @bound
    if @tags.front then "(#{func})" else func

  # Short-circuit `traverseChildren` method to prevent it from crossing scope boundaries
  # unless `crossScope` is `true`.
  traverseChildren: (crossScope, func) -> super(crossScope, func) if crossScope

#### Param
