Mercurial Hosting > luan
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); } }