Add implicit LString to number coercions.
This commit is contained in:
@@ -109,19 +109,7 @@ public class LuaCompat extends LFunction {
|
||||
if ( first+1 < top ) {
|
||||
base = stack[first+1].luaAsInt();
|
||||
}
|
||||
if ( base >= 2 && base <= 36 ) {
|
||||
String str = input.luaAsString().trim();
|
||||
try {
|
||||
result = new LInteger( Integer.parseInt( str, base ) );
|
||||
} catch ( NumberFormatException nfe ) {
|
||||
if ( base == 10 ) {
|
||||
try {
|
||||
result = new LDouble( Double.parseDouble( str ) );
|
||||
} catch ( NumberFormatException nfe2 ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ( (LString) input ).luaToNumber( base );
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -46,6 +46,44 @@ public class LString extends LValue {
|
||||
return false;
|
||||
}
|
||||
|
||||
public LValue luaBinOpDouble( int opcode, double m_value ) {
|
||||
return luaToNumber().luaBinOpDouble( opcode, m_value );
|
||||
}
|
||||
|
||||
public LValue luaBinOpInteger( int opcode, int m_value ) {
|
||||
return luaToNumber().luaBinOpInteger( opcode, m_value );
|
||||
}
|
||||
|
||||
public LValue luaBinOpUnknown( int opcode, LValue lhs ) {
|
||||
return luaToNumber().luaBinOpUnknown( opcode, lhs );
|
||||
}
|
||||
|
||||
public LValue luaUnaryMinus() {
|
||||
return luaToNumber().luaUnaryMinus();
|
||||
}
|
||||
|
||||
public LValue luaToNumber() {
|
||||
return luaToNumber( 10 );
|
||||
}
|
||||
|
||||
public LValue luaToNumber( int base ) {
|
||||
if ( base >= 2 && base <= 36 ) {
|
||||
String str = m_string.trim();
|
||||
try {
|
||||
return new LInteger( Integer.parseInt( str, base ) );
|
||||
} catch ( NumberFormatException nfe ) {
|
||||
if ( base == 10 ) {
|
||||
try {
|
||||
return new LDouble( Double.parseDouble( str ) );
|
||||
} catch ( NumberFormatException nfe2 ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return LNil.NIL;
|
||||
}
|
||||
|
||||
public String luaAsString() {
|
||||
return m_string;
|
||||
}
|
||||
|
||||
@@ -51,6 +51,10 @@ public class LuaJTest extends TestCase {
|
||||
runTest( "boolean" );
|
||||
}
|
||||
|
||||
public void testCoercions() throws IOException, InterruptedException {
|
||||
runTest( "coercions" );
|
||||
}
|
||||
|
||||
public void testCompare() throws IOException, InterruptedException {
|
||||
runTest( "compare" );
|
||||
}
|
||||
|
||||
5
src/test/res/coercions.lua
Normal file
5
src/test/res/coercions.lua
Normal file
@@ -0,0 +1,5 @@
|
||||
print("5.0"+3.1)
|
||||
print(4+"7.5")
|
||||
print(3.14*" 2.75")
|
||||
print("-33"/"11")
|
||||
print(-"-5")
|
||||
BIN
src/test/res/coercions.luac
Normal file
BIN
src/test/res/coercions.luac
Normal file
Binary file not shown.
Reference in New Issue
Block a user