Mercurial Hosting > luan
annotate src/luan/LuanClosure.java @ 1563:8fbcc4747091
remove LuanFunction.luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 09 Nov 2020 01:37:57 -0700 |
parents | e1a13e707bf3 |
children | c922446f53aa |
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 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
6 public abstract class LuanClosure extends LuanFunction implements LuanCloneable, Cloneable { |
1330 | 7 public Pointer[] upValues; |
8 public boolean javaOk; | |
9 public final String sourceName; | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
10 private LuanCloner cloner; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
11 private Luan luan; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
13 public LuanClosure(Pointer[] upValues,boolean javaOk,String sourceName) throws LuanException { |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1347
diff
changeset
|
14 this.upValues = upValues; |
1133 | 15 this.javaOk = javaOk; |
1330 | 16 this.sourceName = sourceName; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
18 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
19 @Override public final LuanClosure shallowClone() { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
20 check(); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
21 try { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
22 return (LuanClosure)clone(); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
23 } catch(CloneNotSupportedException e) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
24 throw new RuntimeException(e); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
25 } |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
26 } |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
27 |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
28 private void check() { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
29 if( cloner != null ) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
30 completeClone(this,cloner); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
31 cloner = null; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
32 } |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
33 } |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
34 |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
35 private void checkLuan(Luan luan) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
36 check(); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
37 if( this.luan==null ) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
38 this.luan = luan; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
39 } else if( this.luan != luan ) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
40 throw new RuntimeException("wrong luan"); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
41 } |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
42 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
43 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
44 @Override public final void deepenClone(LuanCloneable dc,LuanCloner cloner) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
45 LuanClosure clone = (LuanClosure)dc; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
46 switch( cloner.type ) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
47 case COMPLETE: |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
48 completeClone(clone,cloner); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
49 return; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
50 case INCREMENTAL: |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
51 clone.cloner = cloner; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
52 return; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
53 } |
1561 | 54 } |
55 | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
56 private void completeClone(LuanClosure dc,LuanCloner cloner) { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
57 LuanClosure clone = (LuanClosure)dc; |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
58 clone.upValues = (Pointer[])cloner.clone(upValues); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
59 clone.luan = (Luan)cloner.clone(luan); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
60 } |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
61 |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
62 @Override public final void makeImmutable(LuanImmutabler immutabler) throws LuanException { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
63 immutabler.makeImmutable(upValues); |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
64 } |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
65 |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
66 @Override public final Object call(Luan luan,Object... args) throws LuanException { |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1561
diff
changeset
|
67 check(); |
1330 | 68 luan.push(this); |
659
f1150518c467
remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
69 try { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
70 return doCall(luan,args); |
681 | 71 } catch(StackOverflowError e) { |
1347
643cf1c37723
move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
72 throw new LuanException( "stack overflow", e ); |
659
f1150518c467
remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
73 } finally { |
1330 | 74 luan.pop(); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
668
diff
changeset
|
75 } |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
76 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
77 |
1335 | 78 @Override public String toString() { |
79 return super.toString()+"="+sourceName; | |
80 } | |
81 | |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
82 public abstract Object doCall(Luan luan,Object[] args) throws LuanException; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
83 } |