Add implicit LString to number coercions.
This commit is contained in:
@@ -109,19 +109,7 @@ public class LuaCompat extends LFunction {
|
|||||||
if ( first+1 < top ) {
|
if ( first+1 < top ) {
|
||||||
base = stack[first+1].luaAsInt();
|
base = stack[first+1].luaAsInt();
|
||||||
}
|
}
|
||||||
if ( base >= 2 && base <= 36 ) {
|
return ( (LString) input ).luaToNumber( base );
|
||||||
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 result;
|
return result;
|
||||||
|
|||||||
@@ -46,6 +46,44 @@ public class LString extends LValue {
|
|||||||
return false;
|
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() {
|
public String luaAsString() {
|
||||||
return m_string;
|
return m_string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,10 @@ public class LuaJTest extends TestCase {
|
|||||||
runTest( "boolean" );
|
runTest( "boolean" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCoercions() throws IOException, InterruptedException {
|
||||||
|
runTest( "coercions" );
|
||||||
|
}
|
||||||
|
|
||||||
public void testCompare() throws IOException, InterruptedException {
|
public void testCompare() throws IOException, InterruptedException {
|
||||||
runTest( "compare" );
|
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