diff src/luan/modules/http/LuanHandler.java @ 798:9eccfede1094

fix cloning bug
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 06 Sep 2016 12:23:03 -0600
parents ca81307adf7c
children e2a446c5c7c4
line wrap: on
line diff
--- a/src/luan/modules/http/LuanHandler.java	Tue Sep 06 11:50:30 2016 -0600
+++ b/src/luan/modules/http/LuanHandler.java	Tue Sep 06 12:23:03 2016 -0600
@@ -101,17 +101,25 @@
 */
 
 	public Object call_rpc(String fnName,Object... args) throws LuanException {
-		LuanState luan = this.luan;
-		synchronized(luan) {
-			LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE);
-			luan = (LuanState)cloner.clone(luan);
+		lock.readLock().lock();
+		try {
+			LuanFunction fn;
+			LuanState luan = this.luan;
+			synchronized(luan) {
+				PackageLuan.enableLoad(luan,"luan:Rpc.luan");
+				LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
+				LuanTable fns = (LuanTable)rpc.get(luan,"functions");
+				fn = (LuanFunction)fns.get(luan,fnName);
+				if( fn == null )
+					throw new LuanException( "function not found: " + fnName );
+				LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
+				luan = (LuanState)cloner.clone(luan);
+				fn = (LuanFunction)cloner.get(fn);
+			}
+			return fn.call(luan,args);
+		} finally {
+			lock.readLock().unlock();
 		}
-		LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
-		LuanTable fns = (LuanTable)rpc.get(luan,"functions");
-		LuanFunction fn = (LuanFunction)fns.get(luan,fnName);
-		if( fn == null )
-			throw new LuanException( "function not found: " + fnName );
-		return fn.call(luan,args);
 	}
 
 	public void reset_luan() {
@@ -146,6 +154,8 @@
 	public Object runLuan(String sourceText,String sourceName) throws LuanException {
 		LuanFunction fn = Luan.load(sourceText,sourceName);
 		synchronized(luan) {
+			LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
+			LuanState luan = (LuanState)cloner.clone(this.luan);
 			return fn.call(luan);
 		}
 	}