annotate core/src/luan/LuanBit.java @ 572:f1601a4ce1aa

fix stack when calling meta-methods
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 12 Jul 2015 21:34:23 -0600
parents e3b0846dc2ef
children 6cc2f047019b
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 {
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
34 if( el == null )
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
35 return fn.call(luan,args);
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
36 List<StackTraceElement> stackTrace = luan.stackTrace;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
37 stackTrace.add( new StackTraceElement(el,fnName) );
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
38 try {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
39 return fn.call(luan,args);
459
30544d1a9cbf better stack overflow handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 446
diff changeset
40 } catch(StackOverflowError e) {
30544d1a9cbf better stack overflow handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 446
diff changeset
41 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
42 } finally {
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
43 stackTrace.remove(stackTrace.size()-1);
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
44 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
45 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
46
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
47 public String checkString(Object obj) throws LuanException {
440
93e6e67768d7 remove Luan.asString()
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
48 if( obj instanceof String )
93e6e67768d7 remove Luan.asString()
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
49 return (String)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
50 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
51 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
52 } else {
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
53 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
54 }
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
55 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
56
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
57 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
58 if( obj instanceof Number )
bbad2d06f728 remove automatic conversion from string to number
Franklin Schmidt <fschmidt@gmail.com>
parents: 443
diff changeset
59 return (Number)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
60 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
61 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
62 } else {
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
63 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
64 }
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
65 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
66
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
67 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
68 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
69 return (LuanFunction)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
70 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
71 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
72 } else {
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
73 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
74 }
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
75 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
76
151
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
77 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
78 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
79 return (Boolean)obj;
460
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
80 if( el != null ) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 459
diff changeset
81 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
82 } else {
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
83 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
84 }
151
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
85 }
c9100f29fae0 conditions must be type boolean
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
86
404
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
87 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
88 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
89 if( f == null )
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
90 return null;
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
91 return checkFunction(f);
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
92 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
93
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
94 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
95 if( o1 instanceof LuanTable ) {
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
96 LuanFunction f1 = getHandlerFunction(op,(LuanTable)o1);
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
97 if( f1 != null )
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
98 return f1;
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
99 }
d55e873e1f0d metatables now only apply to tables
Franklin Schmidt <fschmidt@gmail.com>
parents: 191
diff changeset
100 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
101 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
102
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
103 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
104 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
105 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
106 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
107 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
108 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
109 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
110 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
111 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
112 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
113 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
114 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
115 if( fn != null )
443
bf5e62a9090c remove toBoolean() and to_boolean()
Franklin Schmidt <fschmidt@gmail.com>
parents: 440
diff changeset
116 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
117 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
118 }
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 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
121 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
122 if( fn != null )
112
f5af13062b10 fix previous rev
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 111
diff changeset
123 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
124 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
125 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
126 }
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
127
572
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
128 public String toString(Object obj) throws LuanException {
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
129 if( obj instanceof LuanTable ) {
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
130 LuanTable tbl = (LuanTable)obj;
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
131 return tbl.toString(this);
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
132 }
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
133 if( obj == null )
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
134 return "nil";
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
135 if( obj instanceof Number )
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
136 return Luan.toString((Number)obj);
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
137 if( obj instanceof byte[] )
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
138 return "binary: " + Integer.toHexString(obj.hashCode());
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
139 return obj.toString();
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
140 }
f1601a4ce1aa fix stack when calling meta-methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 509
diff changeset
141
88
6ca02b188dba add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
142 }