Add implicit LString to number coercions.

This commit is contained in:
Ian Farmer
2007-07-22 06:20:14 +00:00
parent daf71ee672
commit ee5007e718
5 changed files with 48 additions and 13 deletions

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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" );
}

View 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

Binary file not shown.