comparison core/src/luan/modules/JavaLuan.java @ 511:e3fb9768dbb3

better error messages
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 22 May 2015 10:47:56 -0600
parents 2da0bcb979b5
children f1601a4ce1aa
comparison
equal deleted inserted replaced
510:2da0bcb979b5 511:e3fb9768dbb3
47 throw luan.exception("Java isn't allowed"); 47 throw luan.exception("Java isn't allowed");
48 } 48 }
49 49
50 static final Object FAIL = new Object(); 50 static final Object FAIL = new Object();
51 51
52 public static Object __index(LuanBit bit,Object obj,Object key) throws LuanException { 52 public static Object __index(LuanBit bit,Object obj,Object key,boolean canReturnFail) throws LuanException {
53 LuanState luan = bit.luan; 53 LuanState luan = bit.luan;
54 Object rtn = __index(luan,obj,key);
55 if( rtn != FAIL )
56 return rtn;
57 if( bit.el != null )
58 throw bit.exception( "invalid index for java "+obj.getClass()+" in '"+bit.el.text()+"'" );
59 else
60 throw bit.exception( "invalid index for java "+obj.getClass() );
61 }
62
63 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException {
64 checkJava(luan); 54 checkJava(luan);
55 Class cls;
65 if( obj instanceof Static ) { 56 if( obj instanceof Static ) {
57 Static st = (Static)obj;
58 cls = st.cls;
66 if( key instanceof String ) { 59 if( key instanceof String ) {
67 String name = (String)key; 60 String name = (String)key;
68 Static st = (Static)obj;
69 Class cls = st.cls;
70 if( "class".equals(name) ) { 61 if( "class".equals(name) ) {
71 return cls; 62 return cls;
72 } else if( "new".equals(name) ) { 63 } else if( "new".equals(name) ) {
73 Constructor[] constructors = cls.getConstructors(); 64 Constructor[] constructors = cls.getConstructors();
74 if( constructors.length > 0 ) { 65 if( constructors.length > 0 ) {
94 return member(null,members); 85 return member(null,members);
95 } 86 }
96 } 87 }
97 } 88 }
98 } else { 89 } else {
99 Class cls = obj.getClass(); 90 cls = obj.getClass();
100 if( cls.isArray() ) { 91 if( cls.isArray() ) {
101 if( "length".equals(key) ) { 92 if( "length".equals(key) ) {
102 return Array.getLength(obj); 93 return Array.getLength(obj);
103 } 94 }
104 Integer i = Luan.asInteger(key); 95 Integer i = Luan.asInteger(key);
117 } 108 }
118 } 109 }
119 } 110 }
120 } 111 }
121 //System.out.println("invalid member '"+key+"' for java object: "+obj); 112 //System.out.println("invalid member '"+key+"' for java object: "+obj);
122 return FAIL; 113 if( canReturnFail )
114 return FAIL;
115 if( bit.el != null )
116 throw bit.exception( "invalid index for java "+cls+" in '"+bit.el.text()+"'" );
117 else
118 throw bit.exception( "invalid index for java "+cls );
123 } 119 }
124 120
125 private static Object member(Object obj,List<Member> members) throws LuanException { 121 private static Object member(Object obj,List<Member> members) throws LuanException {
126 try { 122 try {
127 if( members.size()==1 ) { 123 if( members.size()==1 ) {
147 } catch(IllegalAccessException e) { 143 } catch(IllegalAccessException e) {
148 throw new RuntimeException(e); 144 throw new RuntimeException(e);
149 } 145 }
150 } 146 }
151 147
152 public static void __new_index(LuanState luan,Object obj,Object key,Object value) throws LuanException { 148 public static void __new_index(LuanBit bit,Object obj,Object key,Object value) throws LuanException {
149 LuanState luan = bit.luan;
153 checkJava(luan); 150 checkJava(luan);
151 Class cls;
154 if( obj instanceof Static ) { 152 if( obj instanceof Static ) {
153 Static st = (Static)obj;
154 cls = st.cls;
155 if( key instanceof String ) { 155 if( key instanceof String ) {
156 String name = (String)key; 156 String name = (String)key;
157 Static st = (Static)obj;
158 Class cls = st.cls;
159 List<Member> members = getStaticMembers(cls,name); 157 List<Member> members = getStaticMembers(cls,name);
160 if( !members.isEmpty() ) { 158 if( !members.isEmpty() ) {
161 if( members.size() != 1 ) 159 if( members.size() != 1 )
162 throw new RuntimeException("not field '"+name+"' of "+obj); 160 throw new RuntimeException("not field '"+name+"' of "+obj);
163 setMember(obj,members,value); 161 setMember(obj,members,value);
164 return; 162 return;
165 } 163 }
166 } 164 }
167 throw luan.exception("invalid member '"+key+"' for: "+obj); 165 // throw luan.exception("invalid member '"+key+"' for: "+obj);
168 } 166 } else {
169 Class cls = obj.getClass(); 167 cls = obj.getClass();
170 if( cls.isArray() ) { 168 if( cls.isArray() ) {
171 Integer i = Luan.asInteger(key); 169 Integer i = Luan.asInteger(key);
172 if( i != null ) { 170 if( i != null ) {
173 Array.set(obj,i,value); 171 Array.set(obj,i,value);
174 return; 172 return;
175 } 173 }
176 throw luan.exception("invalid member '"+key+"' for java array: "+obj); 174 // throw luan.exception("invalid member '"+key+"' for java array: "+obj);
177 } 175 } else if( key instanceof String ) {
178 if( key instanceof String ) { 176 String name = (String)key;
179 String name = (String)key; 177 List<Member> members = getMembers(cls,name);
180 List<Member> members = getMembers(cls,name); 178 if( !members.isEmpty() ) {
181 if( !members.isEmpty() ) { 179 if( members.size() != 1 )
182 if( members.size() != 1 ) 180 throw new RuntimeException("not field '"+name+"' of "+obj);
183 throw new RuntimeException("not field '"+name+"' of "+obj); 181 setMember(obj,members,value);
184 setMember(obj,members,value); 182 return;
185 return; 183 }
186 } 184 }
187 } 185 }
188 throw luan.exception("invalid member '"+key+"' for java object: "+obj); 186 if( bit.el != null )
187 throw bit.exception( "invalid index for java "+cls+" in '"+bit.el.text()+"'" );
188 else
189 throw bit.exception( "invalid index for java "+cls );
189 } 190 }
190 191
191 private static void setMember(Object obj,List<Member> members,Object value) { 192 private static void setMember(Object obj,List<Member> members,Object value) {
192 Field field = (Field)members.get(0); 193 Field field = (Field)members.get(0);
193 try { 194 try {