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

      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

    o.scope.find name
    end = ''
    if @trailings.length
      len = o.scope.freeVariable 'cache'
      o.scope.assign len, "arguments.length"
      variadic = o.scope.freeVariable 'result'
      o.scope.assign variadic, len + ' >= ' + @arglength
      end = if @trailings.length then ", #{len} - #{@trailings.length}"
      for trailing, idx in @trailings
        if trailing.attach
          assign        = trailing.assign
          trailing      = literal o.scope.freeVariable 'arg'
          assign.value  = trailing
        pos = @trailings.length - idx
        o.scope.assign(trailing.compile(o), "arguments[#{variadic} ? #{len} - #{pos} : #{@index + idx}]")
