comparison core/src/luan/LuanState.java @ 521:8a217fe5b4f3

cleaner LuanState.onClose()
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 27 May 2015 03:12:28 -0600
parents 8dcf9e12446b
children ef0336efe33c
comparison
equal deleted inserted replaced
520:fcb9b4c8e972 521:8a217fe5b4f3
1 package luan; 1 package luan;
2 2
3 import java.lang.ref.Reference;
4 import java.lang.ref.WeakReference;
3 import java.util.List; 5 import java.util.List;
4 import java.util.ArrayList; 6 import java.util.ArrayList;
5 import java.util.Map; 7 import java.util.Map;
6 import java.util.HashMap; 8 import java.util.HashMap;
7 import luan.impl.LuanCompiler; 9 import luan.impl.LuanCompiler;
11 public abstract class LuanState implements DeepCloneable { 13 public abstract class LuanState implements DeepCloneable {
12 14
13 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>(); 15 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>();
14 16
15 private Map registry; 17 private Map registry;
16 private final List<LuanFunction> onClose = new ArrayList<LuanFunction>(); 18 private final List<Reference<Runnable>> onClose = new ArrayList<Reference<Runnable>>();
17 19
18 protected LuanState() { 20 protected LuanState() {
19 registry = new HashMap(); 21 registry = new HashMap();
20 } 22 }
21 23
31 33
32 public final Map registry() { 34 public final Map registry() {
33 return registry; 35 return registry;
34 } 36 }
35 37
36 public void onClose(LuanFunction fn) { 38 public void onClose(Runnable fn) {
37 onClose.add(fn); 39 onClose.add(new WeakReference<Runnable>(fn));
38 } 40 }
39 41
40 public void close() throws LuanException { 42 public void close() {
41 for( LuanFunction fn : onClose ) { 43 for( Reference<Runnable> ref : onClose ) {
42 call(fn); 44 Runnable r = ref.get();
45 if( r != null )
46 r.run();
43 } 47 }
44 onClose.clear(); 48 onClose.clear();
45 } 49 }
46 50
47 public static LuanState newInstance() { 51 public static LuanState newInstance() {