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