Mercurial Hosting > luan
annotate src/luan/LuanClosure.java @ 1330:f41919741100
fix security
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 11 Feb 2019 01:38:55 -0700 |
parents | src/luan/impl/Closure.java@3ef883468fd0 |
children | 25746915a241 |
rev | line source |
---|---|
1330 | 1 package luan; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
1330 | 3 import luan.impl.Pointer; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
4 |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 |
1330 | 6 public abstract class LuanClosure extends LuanFunction implements LuanCloneable, Cloneable { |
7 public Pointer[] upValues; | |
8 public boolean javaOk; | |
9 public final String sourceName; | |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
10 private LuanCloner cloner; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 |
1330 | 12 public LuanClosure(int nUpValues,boolean javaOk,String sourceName) throws LuanException { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
13 this.upValues = new Pointer[nUpValues]; |
1133 | 14 this.javaOk = javaOk; |
1330 | 15 this.sourceName = sourceName; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 |
1330 | 18 @Override public LuanClosure shallowClone() { |
1159
3ef883468fd0
remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
19 check(); |
667
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
20 try { |
1330 | 21 return (LuanClosure)clone(); |
667
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
22 } catch(CloneNotSupportedException e) { |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
23 throw new RuntimeException(e); |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
664
diff
changeset
|
24 } |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
25 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
26 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
27 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { |
1330 | 28 LuanClosure clone = (LuanClosure)dc; |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
29 switch( cloner.type ) { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
30 case COMPLETE: |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
31 clone.upValues = (Pointer[])cloner.clone(upValues); |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
32 return; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
33 case INCREMENTAL: |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
34 clone.cloner = cloner; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
35 clone.upValues = upValues; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
36 return; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
37 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
38 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
39 |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
40 private void check() { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
41 if( cloner != null ) { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
42 upValues = (Pointer[])cloner.clone(upValues); |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
43 cloner = null; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
44 } |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
45 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
46 |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
47 @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
|
48 if( luan.isLocked ) |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
49 throw new RuntimeException("luan is locked"); |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
50 check(); |
1330 | 51 luan.push(this); |
659
f1150518c467
remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
52 try { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
53 return doCall(luan,args); |
681 | 54 } catch(StackOverflowError e) { |
55 throw new LuanException( "stack overflow" ); | |
659
f1150518c467
remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
56 } finally { |
1330 | 57 luan.pop(); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
58 } |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
59 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
60 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
61 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
|
62 } |