Improve error reporting.

This commit is contained in:
James Roseborough
2010-05-12 04:46:58 +00:00
parent 282140040e
commit 38acf6a75e
6 changed files with 57 additions and 45 deletions

View File

@@ -388,7 +388,7 @@ public class LuaString extends LuaValue {
public static String decodeAsUtf8(byte[] bytes, int offset, int length) {
int i,j,n,b;
for ( i=offset,j=offset+length,n=0; i<j; ++n ) {
switch ( 0xC0 & bytes[i++] ) {
switch ( 0xE0 & bytes[i++] ) {
case 0xE0: ++i;
case 0xC0: ++i;
}

View File

@@ -118,40 +118,40 @@ public class LuaValue extends Varargs {
public LuaValue tostring() { return NIL; }
// optional argument conversions
public boolean optboolean(boolean defval) { typerror("boolean"); return false; }
public LuaClosure optclosure(LuaClosure defval) { typerror("closure"); return null; }
public double optdouble(double defval) { typerror("double"); return 0; }
public LuaFunction optfunction(LuaFunction defval) { typerror("function"); return null; }
public int optint(int defval) { typerror("int"); return 0; }
public LuaInteger optinteger(LuaInteger defval) { typerror("integer"); return null; }
public long optlong(long defval) { typerror("long"); return 0; }
public LuaNumber optnumber(LuaNumber defval) { typerror("number"); return null; }
public String optjstring(String defval) { typerror("String"); return null; }
public LuaString optstring(LuaString defval) { typerror("string"); return null; }
public LuaTable opttable(LuaTable defval) { typerror("table"); return null; }
public LuaThread optthread(LuaThread defval) { typerror("thread"); return null; }
public Object optuserdata(Object defval) { typerror("object"); return null; }
public Object optuserdata(Class c, Object defval) { typerror(c.getName()); return null; }
public boolean optboolean(boolean defval) { argerror("boolean"); return false; }
public LuaClosure optclosure(LuaClosure defval) { argerror("closure"); return null; }
public double optdouble(double defval) { argerror("double"); return 0; }
public LuaFunction optfunction(LuaFunction defval) { argerror("function"); return null; }
public int optint(int defval) { argerror("int"); return 0; }
public LuaInteger optinteger(LuaInteger defval) { argerror("integer"); return null; }
public long optlong(long defval) { argerror("long"); return 0; }
public LuaNumber optnumber(LuaNumber defval) { argerror("number"); return null; }
public String optjstring(String defval) { argerror("String"); return null; }
public LuaString optstring(LuaString defval) { argerror("string"); return null; }
public LuaTable opttable(LuaTable defval) { argerror("table"); return null; }
public LuaThread optthread(LuaThread defval) { argerror("thread"); return null; }
public Object optuserdata(Object defval) { argerror("object"); return null; }
public Object optuserdata(Class c, Object defval) { argerror(c.getName()); return null; }
public LuaValue optvalue(LuaValue defval) { return this; }
/** @deprecated - use optjstring() instead */
public String optString(String defval) { return optjstring(defval); }
// argument type checks
public boolean checkboolean() { typerror("boolean"); return false; }
public LuaClosure checkclosure() { typerror("closure"); return null; }
public double checkdouble() { typerror("double"); return 0; }
public LuaValue checkfunction() { typerror("function"); return null; }
public int checkint() { typerror("int"); return 0; }
public LuaInteger checkinteger() { typerror("integer"); return null; }
public long checklong() { typerror("long"); return 0; }
public LuaNumber checknumber() { typerror("number"); return null; }
public String checkjstring() { typerror("string"); return null; }
public LuaString checkstring() { typerror("string"); return null; }
public LuaTable checktable() { typerror("table"); return null; }
public LuaThread checkthread() { typerror("thread"); return null; }
public Object checkuserdata() { typerror("userdata"); return null; }
public Object checkuserdata(Class c) { typerror("userdata"); return null; }
public boolean checkboolean() { argerror("boolean"); return false; }
public LuaClosure checkclosure() { argerror("closure"); return null; }
public double checkdouble() { argerror("double"); return 0; }
public LuaValue checkfunction() { argerror("function"); return null; }
public int checkint() { argerror("int"); return 0; }
public LuaInteger checkinteger() { argerror("integer"); return null; }
public long checklong() { argerror("long"); return 0; }
public LuaNumber checknumber() { argerror("number"); return null; }
public String checkjstring() { argerror("string"); return null; }
public LuaString checkstring() { argerror("string"); return null; }
public LuaTable checktable() { argerror("table"); return null; }
public LuaThread checkthread() { argerror("thread"); return null; }
public Object checkuserdata() { argerror("userdata"); return null; }
public Object checkuserdata(Class c) { argerror("userdata"); return null; }
public LuaValue checknotnil() { return this; }
public LuaValue checkvalidkey() { return this; }
@@ -162,10 +162,12 @@ public class LuaValue extends Varargs {
// errors
public static LuaValue error(String message) { throw new LuaError(message); }
public static void assert_(boolean b,String msg) { if(!b) throw new LuaError(msg); }
protected LuaValue argerror(String expected) { throw new LuaError("bad argument: "+expected+" expected, got "+typename()); }
public static void argerror(int iarg,String msg) { throw new LuaError("bad argument #"+iarg+": "+msg); }
protected LuaValue typerror(String expected) { throw new LuaError("bad argument: "+expected+" expected, got "+typename()); }
protected LuaValue typerror(int iarg, String expected) { throw new LuaError("bad argument #"+iarg+": "+expected+" expected, got "+typename()); }
protected LuaValue typerror(String expected) { throw new LuaError(expected+" expected, got "+typename()); }
protected LuaValue unimplemented(String fun) { throw new LuaError("'"+fun+"' not implemented for "+typename()); }
protected LuaValue callerror() { throw new LuaError("attempt to call "+typename()); }
protected LuaValue lenerror() { throw new LuaError("attempt to get length of "+typename()); }
protected LuaValue aritherror() { throw new LuaError("attempt to perform arithmetic on "+typename()); }
protected LuaValue aritherror(String fun) { throw new LuaError("attempt to perform arithmetic '"+fun+"' on "+typename()); }
@@ -208,10 +210,10 @@ public class LuaValue extends Varargs {
public void setfenv(LuaValue env) { typerror("function or thread"); }
// function calls
public LuaValue call() { return unimplemented("call"); }
public LuaValue call(LuaValue arg) { return unimplemented("call"); }
public LuaValue call(LuaValue arg1, LuaValue arg2) { return unimplemented("call"); }
public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) { return unimplemented("call"); }
public LuaValue call() { return callerror(); }
public LuaValue call(LuaValue arg) { return callerror(); }
public LuaValue call(LuaValue arg1, LuaValue arg2) { return callerror(); }
public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) { return callerror(); }
public LuaValue method(String name) { return this.get(name).call(this); }
public LuaValue method(LuaValue name) { return this.get(name).call(this); }
public LuaValue method(String name, LuaValue arg) { return this.get(name).call(this,arg); }
@@ -219,7 +221,7 @@ public class LuaValue extends Varargs {
public LuaValue method(String name, LuaValue arg1, LuaValue arg2) { return this.get(name).call(this,arg1,arg2); }
public LuaValue method(LuaValue name, LuaValue arg1, LuaValue arg2) { return this.get(name).call(this,arg1,arg2); }
public Varargs invoke() { return invoke(NONE); }
public Varargs invoke(Varargs args) { unimplemented("call"); return null; }
public Varargs invoke(Varargs args) { return callerror(); }
public Varargs invoke(LuaValue arg,Varargs varargs) { return invoke(varargsOf(arg,varargs)); }
public Varargs invoke(LuaValue arg1,LuaValue arg2,Varargs varargs) { return invoke(varargsOf(arg1,arg2,varargs)); }
public Varargs invoke(LuaValue[] args) { return invoke(varargsOf(args)); }
@@ -232,8 +234,8 @@ public class LuaValue extends Varargs {
// unary operators
public LuaValue not() { return FALSE; }
public LuaValue neg() { return aritherror("neg"); }
public LuaValue len() { return typerror("len"); }
public int length() { typerror("len"); return 0; }
public LuaValue len() { return lenerror(); }
public int length() { error("attempt to get length of "+typename()); return 0; }
public LuaValue getn() { return typerror("getn"); }
// object equality, used for key comparison
@@ -287,8 +289,8 @@ public class LuaValue extends Varargs {
public boolean gteq_b( double rhs ) { aritherror("gteq"); return false; }
// string comparison
public int strcmp( LuaValue rhs ) { typerror("attempt to compare "+typename()); return 0; }
public int strcmp( LuaString rhs ) { typerror("attempt to compare "+typename()); return 0; }
public int strcmp( LuaValue rhs ) { error("attempt to compare "+typename()); return 0; }
public int strcmp( LuaString rhs ) { error("attempt to compare "+typename()); return 0; }
// concatenation
public LuaValue concat( LuaValue rhs ) { return valueOf(concat_s(rhs)); }

View File

@@ -276,7 +276,7 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
return valueOf(n);
int i = args.checkint(1);
if ( i == 0 || i < -n )
typerror(1,"index out of range");
argerror(1,"index out of range");
return args.subargs(i<0? n+i+2: i+1);
}
case 9: // "unpack", // (list [,i [,j]]) -> result1, ...

View File

@@ -444,7 +444,7 @@ public class IoLib extends OneArgFunction {
else if ( "*l".equals(format) )
v[i] = freadline(f);
else
typerror( i+1, "(invalid format)" );
argerror( i+1, "(invalid format)" );
}
if ( v[i].isnil() )
return i==0? NIL: varargsOf(v,0,i);

View File

@@ -66,6 +66,16 @@ public class StringTest extends TestCase {
}
return sb.toString();
}
public void testUtf820482051() throws UnsupportedEncodingException {
int i = 2048;
char[] c = { (char) (i+0), (char) (i+1), (char) (i+2), (char) (i+3) };
String before = new String(c)+" "+i+"-"+(i+4);
LuaString ls = LuaString.valueOf(before);
String after = ls.tojstring();
assertEquals( userFriendly( before ), userFriendly( after ) );
}
public void testUtf8() {
for ( int i=4; i<0xffff; i+=4 ) {
@@ -101,7 +111,7 @@ public class StringTest extends TestCase {
String before = new String(c);
LuaString ls = LuaString.valueOf(before);
String after = ls.tojstring();
assertEquals( userFriendly( "abc" ), userFriendly( after ) );
assertEquals( userFriendly( "abc\0def" ), userFriendly( after ) );
}
}

View File

@@ -9,7 +9,7 @@ require 'args'
banner('unary -')
negative = function(a) return - a end
checkallpass('negative',{somenumber})
checkallerrors('negative',{notanumber},'attempt to perform arithmetic on')
checkallerrors('negative',{notanumber},'attempt to perform arithmetic')
-- length
banner('#')
@@ -21,7 +21,7 @@ checkallerrors('lengthop',{notatable},'attempt to get length of')
banner('not')
notop = function(a) return not a end
checkallpass('notop',{somenumber})
checkallerrors('notop',{notanumber},'attempt to perform arithmetic on')
checkallpass('notop',{notanumber})
-- function call
banner( '()' )