diff src/luan/LuanState.java @ 1330:f41919741100

fix security
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 11 Feb 2019 01:38:55 -0700
parents 503bde9a7c80
children
line wrap: on
line diff
--- a/src/luan/LuanState.java	Sun Feb 10 02:01:49 2019 -0700
+++ b/src/luan/LuanState.java	Mon Feb 11 01:38:55 2019 -0700
@@ -20,7 +20,7 @@
 public final class LuanState implements LuanCloneable {
 	private static final Logger logger = LoggerFactory.getLogger(LuanState.class);
 
-	public LuanJavaOk javaOk;
+	private final List<LuanClosure> stack = new ArrayList<LuanClosure>();
 	private Map registry;
 	public boolean isLocked = false;
 
@@ -30,7 +30,6 @@
 	public OnClose onClose;
 
 	public LuanState() {
-		javaOk = new LuanJavaOk();
 		registry = new HashMap();
 	}
 
@@ -43,11 +42,27 @@
 	@Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) {
 		LuanState clone = (LuanState)dc;
 		clone.registry = cloner.clone(registry);
-		clone.javaOk = (LuanJavaOk)cloner.clone(javaOk);
 		if( cloner.type == LuanCloner.Type.INCREMENTAL )
 			isLocked = true;
 	}
 
+	public LuanClosure peek() {
+		return peek(1);
+	}
+
+	public LuanClosure peek(int i) {
+		int n = stack.size();
+		return n < i ? null : stack.get(n-i);
+	}
+
+	void push(LuanClosure closure) {
+		stack.add(closure);
+	}
+
+	void pop() {
+		stack.remove(stack.size()-1);
+	}
+
 	public Map registry() {
 		return registry;
 	}
@@ -84,7 +99,7 @@
 			LuanTable tbl = (LuanTable)obj;
 			return tbl.get(key);
 		}
-		if( obj != null && javaOk.ok )
+		if( obj != null && peek().javaOk )
 			return JavaLuan.__index(this,obj,key);
 		throw new LuanException("attempt to index a " + Luan.type(obj) + " value" );
 	}