comparison 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
comparison
equal deleted inserted replaced
797:86e477945676 798:9eccfede1094
99 super.destroy(); 99 super.destroy();
100 } 100 }
101 */ 101 */
102 102
103 public Object call_rpc(String fnName,Object... args) throws LuanException { 103 public Object call_rpc(String fnName,Object... args) throws LuanException {
104 LuanState luan = this.luan; 104 lock.readLock().lock();
105 synchronized(luan) { 105 try {
106 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); 106 LuanFunction fn;
107 luan = (LuanState)cloner.clone(luan); 107 LuanState luan = this.luan;
108 synchronized(luan) {
109 PackageLuan.enableLoad(luan,"luan:Rpc.luan");
110 LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
111 LuanTable fns = (LuanTable)rpc.get(luan,"functions");
112 fn = (LuanFunction)fns.get(luan,fnName);
113 if( fn == null )
114 throw new LuanException( "function not found: " + fnName );
115 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
116 luan = (LuanState)cloner.clone(luan);
117 fn = (LuanFunction)cloner.get(fn);
118 }
119 return fn.call(luan,args);
120 } finally {
121 lock.readLock().unlock();
108 } 122 }
109 LuanTable rpc = (LuanTable)PackageLuan.require(luan,"luan:Rpc.luan");
110 LuanTable fns = (LuanTable)rpc.get(luan,"functions");
111 LuanFunction fn = (LuanFunction)fns.get(luan,fnName);
112 if( fn == null )
113 throw new LuanException( "function not found: " + fnName );
114 return fn.call(luan,args);
115 } 123 }
116 124
117 public void reset_luan() { 125 public void reset_luan() {
118 new Thread() { 126 new Thread() {
119 public void run() { 127 public void run() {
144 } 152 }
145 153
146 public Object runLuan(String sourceText,String sourceName) throws LuanException { 154 public Object runLuan(String sourceText,String sourceName) throws LuanException {
147 LuanFunction fn = Luan.load(sourceText,sourceName); 155 LuanFunction fn = Luan.load(sourceText,sourceName);
148 synchronized(luan) { 156 synchronized(luan) {
157 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
158 LuanState luan = (LuanState)cloner.clone(this.luan);
149 return fn.call(luan); 159 return fn.call(luan);
150 } 160 }
151 } 161 }
152 162
153 } 163 }