annotate core/src/luan/LuanBit.java @ 575:7c3ad6db8ac3

make LuanState.JAVA private
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 13 Jul 2015 18:34:31 -0600
parents 6cc2f047019b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
1 package luan;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
3 import java.util.List;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
4
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
5
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
6 public final class LuanBit {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
7 public final LuanState luan;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
8 public final LuanElement el;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
10 LuanBit(LuanState luan,LuanElement el) {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
11 this.luan = luan;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
12 this.el = el;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
13 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
14
481
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
15 public LuanException exception(Object msg) throws LuanException {
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
16 return new LuanException(this,msg);
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
17 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
18
481
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
19 public StackTraceElement[] stackTrace() {
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
20 List<StackTraceElement> stackTrace = luan.stackTrace;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
21 if( el != null )
481
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
22 stackTrace.add(new StackTraceElement(el,null));
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
23 StackTraceElement[] rtn = stackTrace.toArray(new StackTraceElement[0]);
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
24 if( el != null )
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
25 stackTrace.remove(stackTrace.size()-1);
5d4a78c93383 luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 461
diff changeset
26 return rtn;
132
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 130
diff changeset
27 }
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 130
diff changeset
28
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 130
diff changeset
29 public void dumpStack() {
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 130
diff changeset
30 System.err.println( stackTrace() );
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 130
diff changeset
31 }
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 130
diff changeset
32
112
f5af13062b10 fix previous rev
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 111
diff changeset
33 public Object call(LuanFunction fn,String fnName,Object[] args) throws LuanException {
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
34 push(fnName);
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
35 try {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
36 return fn.call(luan,args);
459
30544d1a9cbf better stack overflow handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 446
diff changeset
37 } catch(StackOverflowError e) {
30544d1a9cbf better stack overflow handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 446
diff changeset
38 throw exception("stack overflow");
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
39 } finally {
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
40 pop();
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
41 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
42 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
43
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
44 private void push(String fnName) {
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
45 if( el == null ) throw new RuntimeException();
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
46 List<StackTraceElement> stackTrace = luan.stackTrace;
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
47 stackTrace.add( new StackTraceElement(el,fnName) );
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
48 }
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
49
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
50 private void pop() {
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
51 List<StackTraceElement> stackTrace = luan.stackTrace;
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
52 stackTrace.remove(stackTrace.size()-1);
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
53 }
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
54
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
55 public String toString(Object obj) throws LuanException {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
56 push(null);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
57 try {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
58 return luan.toString(obj);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
59 } finally {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
60 pop();
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
61 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
62 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
63
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
64 public Object index(Object obj,Object key) throws LuanException {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
65 push(null);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
66 try {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
67 return luan.index(obj,key);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
68 } finally {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
69 pop();
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 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
72
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
73 public int length(LuanTable t) throws LuanException {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
74 push(null);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
75 try {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
76 return t.length(luan);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
77 } finally {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
78 pop();
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 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
81
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
82 public void put(LuanTable t,Object key,Object value) throws LuanException {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
83 push(null);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
84 try {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
85 t.put(luan,key,value);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
86 } finally {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
87 pop();
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 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
90
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
91 public String checkString(Object obj) throws LuanException {
440
93e6e67768d7 remove Luan.asString()
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
92 if( obj instanceof String )
93e6e67768d7 remove Luan.asString()
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
93 return (String)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
94 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
95 throw exception( "attempt to use '"+el.text()+"' (a " + Luan.type(obj) + " value) as a string" );
191
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
96 } else {
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
97 throw exception( "attempt to use a " + Luan.type(obj) + " as a string" );
191
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
98 }
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
99 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
100
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
101 public Number checkNumber(Object obj) throws LuanException {
446
bbad2d06f728 remove automatic conversion from string to number
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
102 if( obj instanceof Number )
bbad2d06f728 remove automatic conversion from string to number
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
103 return (Number)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
104 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
105 throw exception( "attempt to perform arithmetic on '"+el.text()+"' (a " + Luan.type(obj) + " value)" );
191
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
106 } else {
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
107 throw exception( "attempt to perform arithmetic on a " + Luan.type(obj) + " value" );
191
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
108 }
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
109 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
110
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
111 public LuanFunction checkFunction(Object obj) throws LuanException {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
112 if( obj instanceof LuanFunction )
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
113 return (LuanFunction)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
114 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
115 throw exception( "attempt to call '"+el.text()+"' (a " + Luan.type(obj) + " value)" );
191
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
116 } else {
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
117 throw exception( "attempt to call a " + Luan.type(obj) + " value" );
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
118 }
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
119 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
120
151
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
121 public Boolean checkBoolean(Object obj) throws LuanException {
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
122 if( obj instanceof Boolean )
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
123 return (Boolean)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
124 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
125 throw exception( "attempt to use '"+el.text()+"' (a " + Luan.type(obj) + " value) as a boolean" );
191
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
126 } else {
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
127 throw exception( "attempt to use a " + Luan.type(obj) + " as a boolean" );
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
128 }
151
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
129 }
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
130
404
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
131 public LuanFunction getHandlerFunction(String op,LuanTable t) throws LuanException {
419
8fbb961aabd5 improve repr() to check metamethod recursively
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
132 Object f = t.getHandler(op);
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
133 if( f == null )
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
134 return null;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
135 return checkFunction(f);
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
136 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
137
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
138 public LuanFunction getBinHandler(String op,Object o1,Object o2) throws LuanException {
404
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
139 if( o1 instanceof LuanTable ) {
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
140 LuanFunction f1 = getHandlerFunction(op,(LuanTable)o1);
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
141 if( f1 != null )
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
142 return f1;
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
143 }
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
144 return o2 instanceof LuanTable ? getHandlerFunction(op,(LuanTable)o2) : null;
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
145 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
146
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
147 public boolean isLessThan(Object o1,Object o2) throws LuanException {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
148 if( o1 instanceof Number && o2 instanceof Number ) {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
149 Number n1 = (Number)o1;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
150 Number n2 = (Number)o2;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
151 return n1.doubleValue() < n2.doubleValue();
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
152 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
153 if( o1 instanceof String && o2 instanceof String ) {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
154 String s1 = (String)o1;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
155 String s2 = (String)o2;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
156 return s1.compareTo(s2) < 0;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
157 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
158 LuanFunction fn = getBinHandler("__lt",o1,o2);
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
159 if( fn != null )
443
bf5e62a9090c remove toBoolean() and to_boolean()
Franklin Schmidt <fschmidt@gmail.com>
parents: 440
diff changeset
160 return checkBoolean( Luan.first(call(fn,"__lt",new Object[]{o1,o2})) );
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
161 throw exception( "attempt to compare " + Luan.type(o1) + " with " + Luan.type(o2) );
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
162 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
163
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
164 public Object arithmetic(String op,Object o1,Object o2) throws LuanException {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
165 LuanFunction fn = getBinHandler(op,o1,o2);
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
166 if( fn != null )
112
f5af13062b10 fix previous rev
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 111
diff changeset
167 return Luan.first(call(fn,op,new Object[]{o1,o2}));
446
bbad2d06f728 remove automatic conversion from string to number
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
168 String type = !(o1 instanceof Number) ? Luan.type(o1) : Luan.type(o2);
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
169 throw exception("attempt to perform arithmetic on a "+type+" value");
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
170 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
171
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
172 }