Mercurial Hosting > luan
annotate src/luan/impl/Closure.java @ 1133:ba4daf107e07
fix security bug
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 17 Jan 2018 20:59:42 -0700 |
parents | c49980cdece6 |
children | 3ef883468fd0 |
rev | line source |
---|---|
166
4eaee12f6c65
move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
132
diff
changeset
|
1 package luan.impl; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
111
2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
86
diff
changeset
|
3 import luan.Luan; |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
4 import luan.LuanFunction; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
5 import luan.LuanState; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
6 import luan.LuanException; |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
7 import luan.LuanCloner; |
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
8 import luan.LuanCloneable; |
1133 | 9 import luan.LuanJavaOk; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
10 |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
12 public abstract class Closure extends LuanFunction implements LuanCloneable, Cloneable { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
13 public Pointer[] upValues; |
1133 | 14 public LuanJavaOk javaOk; |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
15 private LuanCloner cloner; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 |
1133 | 17 public Closure(int nUpValues,LuanJavaOk javaOk) throws LuanException { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
18 this.upValues = new Pointer[nUpValues]; |
1133 | 19 this.javaOk = javaOk; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
20 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
21 |
784
6a7c6879158d
revert shallowClone()
Franklin Schmidt <fschmidt@gmail.com>
parents:
782
diff
changeset
|
22 @Override public Closure shallowClone() { |
667
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
23 try { |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
24 return (Closure)clone(); |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
25 } catch(CloneNotSupportedException e) { |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
26 throw new RuntimeException(e); |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
27 } |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
28 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
29 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
30 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
31 check(); |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
32 Closure clone = (Closure)dc; |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
33 switch( cloner.type ) { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
34 case COMPLETE: |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
35 clone.upValues = (Pointer[])cloner.clone(upValues); |
1133 | 36 clone.javaOk = (LuanJavaOk)cloner.clone(javaOk); |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
37 return; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
38 case INCREMENTAL: |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
39 clone.cloner = cloner; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
40 clone.upValues = upValues; |
1133 | 41 clone.javaOk = javaOk; |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
42 return; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
43 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
44 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
45 |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
46 private void check() { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
47 if( cloner != null ) { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
48 upValues = (Pointer[])cloner.clone(upValues); |
1133 | 49 javaOk = (LuanJavaOk)cloner.clone(javaOk); |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
50 cloner = null; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
51 } |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
52 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
53 |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
54 @Override public final Object call(LuanState luan,Object[] args) throws LuanException { |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
55 if( luan.isLocked ) |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
56 throw new RuntimeException("luan is locked"); |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
57 check(); |
1133 | 58 LuanJavaOk old = luan.javaOk; |
59 luan.javaOk = javaOk; | |
659
f1150518c467
remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
60 try { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
61 return doCall(luan,args); |
681 | 62 } catch(StackOverflowError e) { |
63 throw new LuanException( "stack overflow" ); | |
659
f1150518c467
remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
64 } finally { |
1133 | 65 luan.javaOk = old; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
66 } |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
67 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
68 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
69 public abstract Object doCall(LuanState luan,Object[] args) throws LuanException; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
70 } |