Indirect function calls through Var instances fail to clear locals

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

Environment

Probably all, but observed on Ubuntu 12.04, OpenJDK 6

Attachments

3
  • 22 Oct 2013, 03:13 PM
  • 06 Sep 2013, 12:18 AM
  • 29 Nov 2012, 08:57 PM

Activity

Show:

Andy Fingerhut September 6, 2013 at 12:18 AM

Patch var-clear-locals-patch-v2.txt is identical to var-clear-locals.diff (and preserves credit to its author), except it eliminates trailing whitespace in some added lines that cause git to give warnings when applying the patch.

Alex Miller August 23, 2013 at 4:35 AM

Switching back to Triaged as afaict Rich has not Vetted this one.

import November 30, 2012 at 8:22 PM

Comment made by: stfactual

Sounds great, and the patch looks good too. Let me know if I need to do anything else.

Timothy Baldridge November 29, 2012 at 9:17 PM

And as a note, both examples in the original report now have extremely similar memory usages.

Timothy Baldridge November 29, 2012 at 8:57 PM

adding a patch. Since most of Clojure ends up running this code in one way or another, I'd assert that tests are included as part of the normal Clojure test process.

Patch simply calls Util.ret1(argx, argx=null) on all invoke calls.

Completed

Details

Assignee

Reporter

Approval

Ok

Patch

Code

Priority

Affects versions

Fix versions

Created October 23, 2012 at 12:43 AM
Updated October 25, 2013 at 10:03 PM
Resolved October 25, 2013 at 10:03 PM