Uploaded image for project: 'Clojure'
  1. CLJ-1090

Indirect function calls through Var instances fail to clear locals

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Minor
    • Resolution: Completed
    • Affects versions: Release 1.4
    • Fix versions: Release 1.6
    • Labels:
    • Environment:

      Probably all, but observed on Ubuntu 12.04, OpenJDK 6

    • Approval:
      Ok
    • Patch:
      Code

      Description

      If you make a function call indirectly by invoking a Var object (which derefs itself and invokes the result), the invocation parameters remain in the thread's local stack for the duration of the function call, even though they are needed only long enough to be passed into the deref'd function. As a result, passing a lazy seq into a function invoked in its Var form may run out of memory if the seq is forced inside that function. For example:

      (defn total [xs] (reduce + 0 xs))
      (total (range 1000000000))   ; this works, though takes a while
      (#'total (range 1000000000)) ; this dies with out of memory error
      

      Solution: Similar to RestFn, wrap each argN in Var inside a Util.ret1(argN, argN = null).

      Patch: var-clear-locals-patch-v2.diff

      Screened by: Alex Miller

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              alex+import import
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: