     extend this, head
     @step  or= new Literal 1 unless @object
     @pattern = @name instanceof Value
-    throw SyntaxError 'cannot pattern match a range loop' if @range and @pattern
     @returns = false
 
   makeReturn: ->

    name    = not @pattern and @name?.compile o
    index   = @index?.compile o
    ivar    = if not index then scope.freeVariable 'i' else index
    varPart = ''
    body    = Expressions.wrap [@body]
    idt     = @idt 1
    scope.find(name,  immediate: yes) if name

          lvar = scope.freeVariable 'len'
          vars = "#{ivar} = 0, #{lvar} = #{svar}.length"
          cond = "#{ivar} < #{lvar}"
    if @object
      forPart   = ivar + ' in ' + sourcePart
      guardPart = if @raw then '' else
        idt + "if (!#{ utility 'hasProp' }.call(#{svar}, #{ivar})) continue;\n"
    else
      vars   += ', ' + step if step isnt pvar
      defPart = @tab + sourcePart + ';\n' if svar isnt sourcePart
      forPart = vars + "; #{cond}; " + ivar + switch +pvar
        when  1 then '++'
        when -1 then '--'
        else (if pvar < 0 then ' -= ' + pvar.slice 1 else ' += ' + pvar)
    if o.level > LVL_TOP or @returns
      rvar     = scope.freeVariable 'result'
      defPart += @tab + rvar + ' = [];\n'
      retPart  = @compileReturnValue rvar, o
      body     = Push.wrap rvar, body
    body     = Expressions.wrap [new If @guard, body] if @guard
    varPart  = idt + namePart + ';\n' if namePart
    o.indent = idt
    defPart + """
    #{@tab}for (#{forPart}) {
    #{ guardPart or '' }#{varPart}#{ body.compile o, LVL_TOP }
    #{@tab}}
    """ + retPart

#### Switch

