From ee098145c08e04e9513a6be0046625c998d260b6 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Sat, 17 Apr 2010 14:29:33 +0000 Subject: [PATCH] Improve compatibility with luaj 1.0 --- src/core/org/luaj/vm2/LuaTable.java | 2 + src/core/org/luaj/vm2/LuaUserdata.java | 4 ++ src/core/org/luaj/vm2/LuaValue.java | 10 ++--- src/core/org/luaj/vm2/lib/BaseLib.java | 40 ++++++++++-------- src/core/org/luaj/vm2/lib/PackageLib.java | 2 +- test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip | Bin 31828 -> 31856 bytes 6 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaTable.java b/src/core/org/luaj/vm2/LuaTable.java index b8fd9a29..df706230 100644 --- a/src/core/org/luaj/vm2/LuaTable.java +++ b/src/core/org/luaj/vm2/LuaTable.java @@ -303,6 +303,8 @@ public class LuaTable extends LuaValue { break; } } + if ( hashKeys.length == 0 ) + error( "invalid key to 'next'" ); i = hashFindSlot(key); if ( hashKeys[i] == null ) error( "invalid key to 'next'" ); diff --git a/src/core/org/luaj/vm2/LuaUserdata.java b/src/core/org/luaj/vm2/LuaUserdata.java index 2fc4040f..e0aaca1a 100644 --- a/src/core/org/luaj/vm2/LuaUserdata.java +++ b/src/core/org/luaj/vm2/LuaUserdata.java @@ -36,6 +36,10 @@ public class LuaUserdata extends LuaValue { m_metatable = metatable; } + public String toString() { + return String.valueOf(m_instance); + } + public int type() { return LuaValue.TUSERDATA; } diff --git a/src/core/org/luaj/vm2/LuaValue.java b/src/core/org/luaj/vm2/LuaValue.java index e379793f..022ceb3d 100644 --- a/src/core/org/luaj/vm2/LuaValue.java +++ b/src/core/org/luaj/vm2/LuaValue.java @@ -150,8 +150,8 @@ public class LuaValue extends Varargs { public static LuaValue error(int iarg, String message) { throw new LuaError("arg "+iarg+": "+message); } public static void assert_(boolean b,String msg) { if(!b) throw new LuaError(msg); } public static void argerror(int i,String msg) { throw new LuaError("arg "+i+": "+msg); } - protected LuaValue typerror(String expected) { throw new LuaError("expected "+expected+" got "+typename()); } - protected LuaValue typerror(int iarg, String expected) { throw new LuaError("arg "+iarg+": expected "+expected+" got "+typename()); } + protected LuaValue typerror(String expected) { throw new LuaError(expected+" expected, got "+typename()); } + protected LuaValue typerror(int iarg, String expected) { throw new LuaError("arg "+iarg+": "+expected+" expected, got "+typename()); } protected LuaValue unimplemented(String fun) { throw new LuaError("'"+fun+"' not implemented for "+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()); } @@ -178,9 +178,9 @@ public class LuaValue extends Varargs { public void rawset( String key, int value ) { rawset(valueOf(key),valueOf(value)); } public void rawset( String key, String value ) { rawset(valueOf(key),valueOf(value)); } public void rawsetlist( int key0, Varargs values ) { for ( int i=0, n=values.narg(); i env "getmetatable", // ( object ) -> table - "tostring", // (e) -> value } ); bind2( env, new String[] { "collectgarbage", // ( opt [,arg] ) -> value "error", // ( message [,level] ) -> ERR "rawequal", // (v1, v2) -> boolean "setfenv", // (f, table) -> void - "tonumber", // (e [,base]) -> value } ); bindv( env, new String[] { "assert", // ( v [,message] ) -> v, message | ERR @@ -104,6 +102,8 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { "rawget", // (table, index) -> value "rawset", // (table, index, value) -> table "setmetatable", // (table, metatable) -> table + "tostring", // (e) -> value + "tonumber", // (e [,base]) -> value "pairs", // "pairs" (t) -> iter-func, t, nil "ipairs", // "ipairs", // (t) -> iter-func, t, 0 "next", // "next" ( table, [index] ) -> next-index, next-value @@ -139,8 +139,6 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { case 1: // "getmetatable", // ( object ) -> table LuaValue mt = arg.getmetatable(); return mt!=null? mt: NIL; - case 2: // "tostring", // (e) -> value - return arg.type() == LuaValue.TSTRING? arg: valueOf(arg.toString()); } return NIL; } @@ -173,16 +171,6 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { f.setfenv(t); return f.isthread()? NONE: f; } - case 4: // "tonumber", // (e [,base]) -> value - final int base = arg2.optint(10); - if (base == 10) { /* standard conversion */ - return arg1.tonumber(); - } else { - if ( base < 2 || base > 36 ) - argerror(2, "base out of range"); - final LuaString str = arg1.optstring(null); - return str!=null? str.tonumber(base): NIL; - } } return NIL; } @@ -332,13 +320,29 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { t.setmetatable(mt.isnil()? null: mt.checktable()); return t; } - case 14: // "pairs" (t) -> iter-func, t, nil + case 14: { // "tostring", // (e) -> value + LuaValue arg = args.checkvalue(1); + return arg.type() == LuaValue.TSTRING? arg: valueOf(arg.toString()); + } + case 15: { // "tonumber", // (e [,base]) -> value + LuaValue arg1 = args.checkvalue(1); + final int base = args.optint(2,10); + if (base == 10) { /* standard conversion */ + return arg1.tonumber(); + } else { + if ( base < 2 || base > 36 ) + argerror(2, "base out of range"); + final LuaString str = arg1.optstring(null); + return str!=null? str.tonumber(base): NIL; + } + } + case 16: // "pairs" (t) -> iter-func, t, nil return varargsOf( next, args.checktable(1) ); - case 15: // "ipairs", // (t) -> iter-func, t, 0 + case 17: // "ipairs", // (t) -> iter-func, t, 0 return varargsOf( inext, args.checktable(1), ZERO ); - case 16: // "next" ( table, [index] ) -> next-index, next-value + case 18: // "next" ( table, [index] ) -> next-index, next-value return args.arg1().next(args.arg(2)); - case 17: // "inext" ( table, [int-index] ) -> next-index, next-value + case 19: // "inext" ( table, [int-index] ) -> next-index, next-value return args.arg1().inext(args.arg(2)); } return NONE; diff --git a/src/core/org/luaj/vm2/lib/PackageLib.java b/src/core/org/luaj/vm2/lib/PackageLib.java index 0ee1e705..d4eea5b2 100644 --- a/src/core/org/luaj/vm2/lib/PackageLib.java +++ b/src/core/org/luaj/vm2/lib/PackageLib.java @@ -177,7 +177,7 @@ public class PackageLib extends OneArgFunction { } // set the environment of the current function - LuaFunction f = LuaThread.getCallstackFunction(0); + LuaFunction f = LuaThread.getCallstackFunction(1); if ( f == null ) error(1, "no calling function"); f.setfenv(module); diff --git a/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip b/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip index 1528ada3233fc06a25d644e4f8464a4ec251de54..e7d455907f458db7ccc3e4bb8b9d7942f6868246 100644 GIT binary patch delta 1303 zcmZvcX;9Ng7{>ogIiyew!y#a#a%x3LA|&K80s>-D%Ao{N(@Kf7$YJh4kZ?sosT>O^ z8np@)MMy(Ign%H5s2t(}Vr9e#q@t*JAPq!m|BRnH)7hEdKKt%|c=wroc0dc>Xn~Ti zFI`M6qU$`m9jyR@Sm+^$F@hj`HjnS^ks#P5D+&v~hR57^Vx%+M;1i_GQJz<3;-_yJ znNM5nINs0~1l>2jVzdnn_C3GmjCDAo`)6L1XJSP?C;6Vels+(XCni4Sh#lb+@Q1pI z%qnbcax9$Vwz_2`YWto>Do1NH(v9-&Klg7;x#wR$_R>eT*e~O4H0EgIYy!hXV{PB@ zq3QZ}B_pOd279{n>C2;>pt(!jJ=MKI7oAvtJ+pT>a4XAV15#U5t{kTDtPZU&o9c8{ zc@8}Evr<+zRWvb&@?Eu;hWLfqgUv4OvhX;Krc?`edb_TZjZAh*FSZ8Odd-F}(}n(X zh)P$TJiEGfsNXC?m8N1=&!&)P>ZS;Gxel?5h&5MSkEQF^-e>G?D~|st$JJjj*hH7= zQHtn}CAbe(sB7&82(k!uE{QGXFBo?sqDOHYkJ)LIC$*^q&OQ#$w+_0!bqQP2Mea~_ z9!|Jl`OCYhWs7s@&(FB^%7=Pwt}gG-tXE`L@ZItC*$>NEoocV9k(GD8%pp9w!iwq< zUfu6o6-Kzc-eCKKZRUo%FH>u-WK0#g5}zeccE(iuj;i-~W|sAv z6@=4PDSo%j?O)4l-RyWiy)K0G#wC5jH$ObF7>#;tjH$|2hj=;J7>--ct)2dsy7wy8 zWP2wbQ$lWbmQBWrJl{pW!R5b@ZN?6>)h|3w?6*PWV`=5_;l$Ar^DIP4sc?-b=HG~n z5p`w;{V+dCPaM?kWvA9^X)4-#Grh`E}`g^L{t1xA+wH znHZO1JNC2I@h8)0VcC&FN2yY3(%S12qD-4?kQ1VBYyDTJPG*0wUEw$K_m;LP<4I3e zju;pHUeJQkRXrJ)E$-+ZE4b6Wo=}!1r^Tl>1ghH)XB99z9+_m+t=gUcv{`YXNwJ5{ zVO^K==!ua%r?$4fb4qwH-^A*gnE5pLYB(WnMryl`<;j>Ys=F0jLV5k$i$n&VG%{I$ zKW6RYexO6Vc5I*ceoOGL%zg>`Zt};QmG?}SwjYRV#PunA;*!eE9?u(u27jRsH;L`) zUHmQGzxq%3U?3+5oP`A(5-@^YD0AQ^4i(j8E)itGBrX+b;CYm>aGXm4%b-1vjA|y2 z3esUQj|eK^O&$YuK_fl^Oh5{s0>&YaPX-mR24y7F@JZ-NtbmHvnF2Ck!$JWK5MZx> z0?t80p*K)LhL8#jV2aQSR6~W31olD=N+!gLXdnYdiHN`&9u|@HTj&S^X{mN_Tx3t_ zU?50ha;zYMz3}!!gMpqUVu_|<5%PZ-K{pV9EJry3X<{O9f*dgk^uTjsZ@`CYROiDb zDP;5tp();AAIwFmhF8!E52CRIm*JXJUvLugQ;DD(R;QBmKolHBCkqy|laRq<7$G5n pDR@vq0b#Hc)jX(^kep;mpMN&b&rKQ_E;K?!N23XXRPJ3^{R^LPIN$&P delta 1248 zcmZvbdo+}J7{}iqVn%7KTgfyiWM(3l-to?8vMgIE_So9oHr8w-3`sNN9b?drOD-ew zQ>`?XlG^0brfhU$ipsWa5!H4X(vpapW~8m`+y1xb>_4C9d%ov;&U4Q9JkQiy(DxQJ ziwv^*<6mMQ;-r*C06{$U5QK~%h=?x~dATNvV>0&o3Ub^`b0_7qF$lx{tve73w0h#1;%@%%B;qgf+jss@1+H&;9$oQHPYr1V-Wqb5pP2hYRX9jzF^C56C z@)+|xIpUYz+5;b3?)%+7m_QS@KNzTZvt6~q1_buI!edgl@ zr|afySe2!6DZp^6YQ-C(KEWIWArbX$=SxJN+EZ@4xu??2boDZ`Nw*1#1#6q(V4b0m*%J`i(Hcb73 zQ)$Ayusz{>dfOATXUsn&AA1G4+BBH;E{RzbA0^P%MJEByHZ_z zbiq&Y0(om_N1=fo-?6q_()c2*U$%VIz)#l;Y>I$DaMe+EDMFx$6B#W_EB@8Kuu3IZiQOMTNh&_Ob9dx3Z&a zR^?e4Xg>bBBC;-{brw0j)ZfF!79twpVkPRD!DEJu;3s-|4xK!j0Cg3+BHh2z8L>M>@uMv!dK+GbN zn3zNOLNNvs;7PGJnPrb4TlqZkHh2m*hx(~B&;XaDdVxzYB9#M-;l9+BhE47W5}*8U zV2B8aA;4MSTZrM_q+B+FB*lp0;1q5FOYlX&2A;q%a2Yq3|Oyrnf*=ItDsmaykq2!n$-eK%tt@p>TnWMf4RcqZ;P#__Y5Y%UU7m