       range = [+@fromNum..+@toNum]
       range.pop() if @exclusive
       return "[#{ range.join(', ') }]"
-    i = o.scope.freeVariable()
-    result = o.scope.freeVariable()
+    i = o.scope.freeVariable 'index'
+    result = o.scope.freeVariable 'result'
     pre    = "\n#{idt}#{result} = []; #{vars}"
     if @fromNum and @toNum
       o.index = i

      sourcePart  = source.compileVariables(o)
      forPart     = source.compile merge o, index: ivar, step: @step
    else
      svar        = scope.freeVariable()
      sourcePart  = "#{svar} = #{ @source.compile(o) };"
      if @pattern
        namePart  = new AssignNode(@name, literal("#{svar}[#{ivar}]")).compile(merge o, {indent: @idt(1), top: true}) + '\n'
      else
        namePart  = "#{name} = #{svar}[#{ivar}]" if name
      unless @object
        lvar      = scope.freeVariable()
        stepPart  = if @step then "#{ivar} += #{ @step.compile(o) }" else "#{ivar}++"
        forPart   = "#{ivar} = 0, #{lvar} = #{svar}.length; #{ivar} < #{lvar}; #{stepPart}"
    sourcePart    = (if rvar then "#{rvar} = []; " else '') + sourcePart

      @source = baseline
      if prop.soakNode
        if @base.containsType(CallNode) and i is 0
          temp = o.scope.freeVariable 'cache'
          complete = "(#{ baseline = temp } = (#{complete}))"
        complete = if i is 0
          "(typeof #{complete} === \"undefined\" || #{baseline} === null) ? undefined : "
