Mercurial Hosting > luan
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 { |