annotate core/src/luan/LuanState.java @ 694:b620b8e1010f

remove Luan.load() allow_expression param and add Luan.eval()
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 20 Apr 2016 20:56:08 -0600
parents d3e5414bdf4c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
1 package luan;
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
527
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
3 import java.io.Closeable;
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
4 import java.io.IOException;
521
8a217fe5b4f3 cleaner LuanState.onClose()
Franklin Schmidt <fschmidt@gmail.com>
parents: 517
diff changeset
5 import java.lang.ref.Reference;
8a217fe5b4f3 cleaner LuanState.onClose()
Franklin Schmidt <fschmidt@gmail.com>
parents: 517
diff changeset
6 import java.lang.ref.WeakReference;
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
7 import java.util.List;
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
8 import java.util.ArrayList;
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
9 import java.util.Map;
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
10 import java.util.HashMap;
166
4eaee12f6c65 move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 163
diff changeset
11 import luan.impl.LuanCompiler;
168
ebe9db183eb7 rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 167
diff changeset
12 import luan.modules.BasicLuan;
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
13 import luan.modules.JavaLuan;
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
14
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
15
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
16 public final class LuanState implements DeepCloneable {
130
0594c132888b cleanup
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 128
diff changeset
17
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
18 public LuanJava java;
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
19 private Map registry;
527
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
20 private final List<Reference<Closeable>> onClose = new ArrayList<Reference<Closeable>>();
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 66
diff changeset
21
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
22 public LuanState() {
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
23 java = new LuanJava();
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
24 registry = new HashMap();
200
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 199
diff changeset
25 }
9fb218211763 add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 199
diff changeset
26
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
27 private LuanState(LuanState luan) {}
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 75
diff changeset
28
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
29 @Override public LuanState shallowClone() {
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
30 return new LuanState(this);
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 75
diff changeset
31 }
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 75
diff changeset
32
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
33 @Override public void deepenClone(DeepCloneable dc,DeepCloner cloner) {
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
34 LuanState clone = (LuanState)dc;
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
35 clone.registry = cloner.deepClone(registry);
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
36 clone.java = (LuanJava)cloner.deepClone(java);
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
37 }
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 75
diff changeset
38
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
39 public final Map registry() {
202
75750ceb45ee add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 200
diff changeset
40 return registry;
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 91
diff changeset
41 }
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 91
diff changeset
42
527
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
43 public void onClose(Closeable c) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
44 onClose.add(new WeakReference<Closeable>(c));
517
8dcf9e12446b add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
45 }
8dcf9e12446b add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
46
527
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
47 public void close() throws IOException {
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
48 for( Reference<Closeable> ref : onClose ) {
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
49 Closeable c = ref.get();
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
50 if( c != null )
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
51 c.close();
517
8dcf9e12446b add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
52 }
8dcf9e12446b add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
53 onClose.clear();
8dcf9e12446b add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
54 }
694
b620b8e1010f remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents: 672
diff changeset
55 /*
320
fed1893821bf remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 319
diff changeset
56 public final Object eval(String cmd) throws LuanException {
408
1b38de2b1845 merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents: 404
diff changeset
57 return eval(cmd,new LuanTable());
157
1de3e4a6e82d remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 150
diff changeset
58 }
1de3e4a6e82d remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 150
diff changeset
59
320
fed1893821bf remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 319
diff changeset
60 public final Object eval(String cmd,LuanTable env) throws LuanException {
fed1893821bf remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 319
diff changeset
61 LuanFunction fn = BasicLuan.load(this,cmd,"eval",env,true);
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
62 return fn.call(this);
59
5c9cadd0acce move standard calls from CmdLine to LuanState
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
63 }
694
b620b8e1010f remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents: 672
diff changeset
64 */
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
65
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
66 public String toString(Object obj) throws LuanException {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
67 if( obj instanceof LuanTable ) {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
68 LuanTable tbl = (LuanTable)obj;
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
69 return tbl.toString(this);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
70 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
71 if( obj == null )
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
72 return "nil";
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
73 if( obj instanceof Number )
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
74 return Luan.toString((Number)obj);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
75 if( obj instanceof byte[] )
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
76 return "binary: " + Integer.toHexString(obj.hashCode());
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
77 return obj.toString();
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
78 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
79
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
80 public Object index(Object obj,Object key) throws LuanException {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
81 if( obj instanceof LuanTable ) {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
82 LuanTable tbl = (LuanTable)obj;
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
83 return tbl.get(this,key);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
84 }
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
85 if( obj != null && java.ok )
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
86 return JavaLuan.__index(this,obj,key,false);
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
87 throw new LuanException("attempt to index a " + Luan.type(obj) + " value" );
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
88 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
89
576
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
90 /*
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
91 public Number checkNumber(Object obj) throws LuanException {
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
92 if( obj instanceof Number )
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
93 return (Number)obj;
647
8e8c30b72e9b move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
94 throw new LuanException( "attempt to perform arithmetic on '"+context()+"' (a " + Luan.type(obj) + " value)" );
576
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
95 }
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
96 */
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
97 }