comparison src/luan/LuanFunction.java @ 1335:e0cf0d108a77

major cleanup
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 14 Feb 2019 03:10:45 -0700
parents 25746915a241
children e1a13e707bf3
comparison
equal deleted inserted replaced
1334:c88b486a9511 1335:e0cf0d108a77
1 package luan; 1 package luan;
2 2
3 3
4 public abstract class LuanFunction { 4 public abstract class LuanFunction implements LuanCloneable, Cloneable {
5 private Luan luan;
6 private LuanCloner cloner;
7 private boolean clone;
5 8
6 public abstract Object call(Luan luan,Object[] args) throws LuanException; 9 public LuanFunction(Luan luan) {
10 if( luan==null ) throw new NullPointerException();
11 this.luan = luan;
12 this.clone = true;
13 }
14
15 public LuanFunction(boolean clone) {
16 this.clone = clone;
17 }
18
19 // for LuanJavaFunction
20 void dontClone() {
21 luan = null;
22 clone = false;
23 }
24
25 @Override public LuanFunction shallowClone() {
26 if( !clone )
27 return this;
28 check();
29 try {
30 return (LuanFunction)clone();
31 } catch(CloneNotSupportedException e) {
32 throw new RuntimeException(e);
33 }
34 }
35
36 private void check() {
37 if( cloner != null ) {
38 completeClone(this,cloner);
39 cloner = null;
40 }
41 }
42
43 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) {
44 if( !clone )
45 return;
46 LuanFunction clone = (LuanFunction)dc;
47 switch( cloner.type ) {
48 case COMPLETE:
49 completeClone(clone,cloner);
50 return;
51 case INCREMENTAL:
52 clone.cloner = cloner;
53 return;
54 }
55 }
56
57 protected void completeClone(LuanFunction clone,LuanCloner cloner) {
58 clone.luan = (Luan)cloner.clone(luan);
59 }
60
61 public Luan luan() {
62 check();
63 return luan;
64 }
65
66 public abstract Object call(Object... args) throws LuanException;
7 67
8 public static final Object[] NOTHING = new Object[0]; 68 public static final Object[] NOTHING = new Object[0];
9
10 public final Object call(Luan luan) throws LuanException {
11 return call(luan,NOTHING);
12 }
13 69
14 @Override public String toString() { 70 @Override public String toString() {
15 return "function: " + Integer.toHexString(hashCode()); 71 return "function: " + Integer.toHexString(hashCode());
16 } 72 }
17 73