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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
1 package luan;
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
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
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
7 public Pointer[] upValues;
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
8 public boolean javaOk;
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
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
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 787
diff changeset
15 this.javaOk = javaOk;
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
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
e1a13e707bf3 start immutable
Franklin Schmidt <fschmidt@gmail.com>
parents: 1400
diff changeset
54 }
e1a13e707bf3 start immutable
Franklin Schmidt <fschmidt@gmail.com>
parents: 1400
diff changeset
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
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
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
f1c935be546d improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 672
diff changeset
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
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
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
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
78 @Override public String toString() {
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
79 return super.toString()+"="+sourceName;
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
80 }
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
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 }