From bf90c745825ffcfd7e84e469f21381b8db45c8fc Mon Sep 17 00:00:00 2001 From: Ian Farmer Date: Fri, 10 Oct 2008 23:37:47 +0000 Subject: [PATCH] Fix tonumber() to match standard Lua's behavior more closely. --- src/core/org/luaj/vm/LString.java | 10 +++++++++- src/test/res/baselib.lua | 11 +++++++++++ version.properties | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/core/org/luaj/vm/LString.java b/src/core/org/luaj/vm/LString.java index cb968f08..bff8a350 100644 --- a/src/core/org/luaj/vm/LString.java +++ b/src/core/org/luaj/vm/LString.java @@ -366,8 +366,16 @@ public class LString extends LValue { public LValue luaToNumber( int base ) { if ( base >= 2 && base <= 36 ) { String str = toJavaString().trim(); + if ( ( base == 10 || base == 16 ) && ( str.startsWith("0x") || str.startsWith("0X") ) ) { + base = 16; + str = str.substring(2); + } try { - return LInteger.valueOf( Integer.parseInt( str, base ) ); + long x = Long.parseLong(str, base); + if (x < Integer.MIN_VALUE || x > Integer.MAX_VALUE) + return new LDouble((double) x); + else + return LInteger.valueOf((int) x); } catch ( NumberFormatException nfe ) { if ( base == 10 ) { try { diff --git a/src/test/res/baselib.lua b/src/test/res/baselib.lua index a2e3da83..f68e572b 100644 --- a/src/test/res/baselib.lua +++ b/src/test/res/baselib.lua @@ -207,6 +207,17 @@ print( 'pcall(tonumber,{"one","two",a="aa",b="bb"})', pcall(tonumber,{"one","two print( 'pcall(tonumber,"123.456")', pcall(tonumber,"123.456") ) print( 'pcall(tonumber," 123.456")', pcall(tonumber," 123.456") ) print( 'pcall(tonumber," 234qwer")', pcall(tonumber," 234qwer") ) +print( 'pcall(tonumber,"0x20")', pcall(tonumber,"0x20") ) +print( 'pcall(tonumber," 0x20")', pcall(tonumber," 0x20") ) +print( 'pcall(tonumber,"0x20 ")', pcall(tonumber,"0x20 ") ) +print( 'pcall(tonumber," 0x20 ")', pcall(tonumber," 0x20 ") ) +print( 'pcall(tonumber,"0X20")', pcall(tonumber,"0X20") ) +print( 'pcall(tonumber," 0X20")', pcall(tonumber," 0X20") ) +print( 'pcall(tonumber,"0X20 ")', pcall(tonumber,"0X20 ") ) +print( 'pcall(tonumber," 0X20 ")', pcall(tonumber," 0X20 ") ) +print( 'pcall(tonumber,"0x20",10)', pcall(tonumber,"0x20",10) ) +print( 'pcall(tonumber,"0x20",16)', pcall(tonumber,"0x20",16) ) +print( 'pcall(tonumber,"0x20",8)', pcall(tonumber,"0x20",8) ) -- tostring print( 'pcall(tostring)', pcall(tostring) ) diff --git a/version.properties b/version.properties index 91de5b1d..1c31e41d 100644 --- a/version.properties +++ b/version.properties @@ -1 +1 @@ -version: 0.53 +version: 0.54