diff core/src/luan/modules/JavaLuan.java @ 509:e3b0846dc2ef

throw exception for invalid indexes of string, binary, or java
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 22 May 2015 02:02:49 -0600
parents 92c3d22745b8
children 2da0bcb979b5
line wrap: on
line diff
--- a/core/src/luan/modules/JavaLuan.java	Thu May 21 20:20:54 2015 -0600
+++ b/core/src/luan/modules/JavaLuan.java	Fri May 22 02:02:49 2015 -0600
@@ -23,6 +23,7 @@
 import luan.LuanFunction;
 import luan.LuanJavaFunction;
 import luan.LuanElement;
+import luan.LuanBit;
 
 
 public final class JavaLuan {
@@ -46,6 +47,19 @@
 			throw luan.exception("Java isn't allowed");
 	}
 
+	static final Object FAIL = new Object();
+
+	public static Object __index(LuanBit bit,Object obj,Object key) throws LuanException {
+		LuanState luan = bit.luan;
+		Object rtn = __index(luan,obj,key);
+		if( rtn != FAIL )
+			return rtn;
+		if( bit.el != null )
+			throw bit.exception( "invalid index ["+luan.toString(key)+"] for ("+bit.el.text()+") java: "+obj.getClass() );
+		else
+			throw bit.exception( "invalid index ["+luan.toString(key)+"] for java: "+obj.getClass() );
+	}
+
 	public static Object __index(LuanState luan,Object obj,Object key) throws LuanException {
 		checkJava(luan);
 		if( obj instanceof Static ) {
@@ -81,33 +95,32 @@
 					}
 				}
 			}
-			throw luan.exception("invalid member '"+key+"' for: "+obj);
-		}
-		Class cls = obj.getClass();
-		if( cls.isArray() ) {
-			if( "length".equals(key) ) {
-				return Array.getLength(obj);
-			}
-			Integer i = Luan.asInteger(key);
-			if( i != null ) {
-				return Array.get(obj,i);
+		} else {
+			Class cls = obj.getClass();
+			if( cls.isArray() ) {
+				if( "length".equals(key) ) {
+					return Array.getLength(obj);
+				}
+				Integer i = Luan.asInteger(key);
+				if( i != null ) {
+					return Array.get(obj,i);
+				}
+				throw luan.exception("invalid member '"+key+"' for java array: "+obj);
 			}
-			throw luan.exception("invalid member '"+key+"' for java array: "+obj);
-		}
-		if( key instanceof String ) {
-			String name = (String)key;
-			if( "instanceof".equals(name) ) {
-				return new LuanJavaFunction(instanceOf,new InstanceOf(obj));
-			} else {
-				List<Member> members = getMembers(cls,name);
-				if( !members.isEmpty() ) {
-					return member(obj,members);
+			if( key instanceof String ) {
+				String name = (String)key;
+				if( "instanceof".equals(name) ) {
+					return new LuanJavaFunction(instanceOf,new InstanceOf(obj));
+				} else {
+					List<Member> members = getMembers(cls,name);
+					if( !members.isEmpty() ) {
+						return member(obj,members);
+					}
 				}
 			}
 		}
-//		throw luan.exception("invalid member '"+key+"' for java object: "+obj);
 //System.out.println("invalid member '"+key+"' for java object: "+obj);
-		return null;
+		return FAIL;
 	}
 
 	private static Object member(Object obj,List<Member> members) throws LuanException {