Skip to content

Instantly share code, notes, and snippets.

@amalloy
Last active February 6, 2019 21:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amalloy/dd0d118b7be0347606db59e2830739c2 to your computer and use it in GitHub Desktop.
Save amalloy/dd0d118b7be0347606db59e2830739c2 to your computer and use it in GitHub Desktop.
;; consumes all memory
((fn foo [s]
((^:once fn bar []
(last s))))
(range))
;; bytecode inspection summary: foo clears its local copy of s, but bar never clears its closed-over copy
;; disassembly of bar:
user> (println (disassemble-str
((fn foo [s]
(^:once fn bar [] (last s)))
(range))))
// Compiled from eb4fe7045dd90b031abb30e4e26ac1dfd5eb76ac-init.clj (version 1.5 : 49.0, super bit)
public final class user$eval2344$foo__2345$bar__2346 extends clojure.lang.AFunction {
// Field descriptor #7 Ljava/lang/Object;
java.lang.Object s;
// Field descriptor #18 Lclojure/lang/Var;
public static final clojure.lang.Var const__0;
// Method descriptor #9 (Ljava/lang/Object;)V
// Stack: 2, Locals: 2
public user$eval2344$foo__2345$bar__2346(java.lang.Object arg0);
0 aload_0 [this]
1 invokespecial clojure.lang.AFunction() [12]
4 aload_0 [this]
5 aload_1 [arg0]
6 putfield user$eval2344$foo__2345$bar__2346.s : java.lang.Object [14]
9 return
Line numbers:
[pc: 0, line: 1]
// Method descriptor #16 ()Ljava/lang/Object;
// Stack: 2, Locals: 1
public java.lang.Object invoke();
0 getstatic user$eval2344$foo__2345$bar__2346.const__0 : clojure.lang.Var [20]
3 invokevirtual clojure.lang.Var.getRawRoot() : java.lang.Object [25]
6 checkcast clojure.lang.IFn [27]
9 aload_0 [this]
10 getfield user$eval2344$foo__2345$bar__2346.s : java.lang.Object [14]
13 invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [30] [nargs: 2]
18 areturn
Line numbers:
[pc: 0, line: 1]
[pc: 6, line: 1]
[pc: 13, line: 1]
Local variable table:
[pc: 0, pc: 18] local: this index: 0 type: java.lang.Object
// Method descriptor #10 ()V
// Stack: 2, Locals: 0
public static {};
0 ldc <String "clojure.core"> [34]
2 ldc <String "last"> [36]
4 invokestatic clojure.lang.RT.var(java.lang.String, java.lang.String) : clojure.lang.Var [42]
7 checkcast clojure.lang.Var [22]
10 putstatic user$eval2344$foo__2345$bar__2346.const__0 : clojure.lang.Var [20]
13 return
Line numbers:
[pc: 0, line: 1]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment