When running the following Lua code in LuaJ, the type of the variable a
doesn't change to string
, but remains a number
. This cause an unexpected behaviour when assigning strings that looks like numbers to a variable that was of type number
. This doesn't happen when variables are first initialized to string
type, like b
in the example below.
a = 10 print(type(a)) -- number print(a) -- 10 b = "10.00" print(type(b)) -- string print(b) -- 10.00 a = "10.00" print(type(a)) -- number, expected string! print(a) -- 10, expected 10.00
On other Lua interpreters, the code runs as expected. I think that problem arises in the class NumberValueEntry
in LuaTable.java
, in particular in the method that is called when the entry needs to be changed:
public Entry set(LuaValue value) { LuaValue n = value.tonumber(); if ( !n.isnil() ) { this.value = n.todouble(); return this; } else { return new NormalEntry( this.key, value ); } }
Here you can see that if the new value can be coerced to a number, the entry is updated just by changing its double value to the new value, converted to double. If the new value is not number-like, a new entry is returned. This is incorrect. I don't get why there's the need to have a NumberValueEntry
in the first place, but instead of removing it altogether, it could be fixed keeping the entry-reusing login by checking the new value type instead of trying to coerce it to a number. The change below fixes the example above:
public Entry set(LuaValue value) { if (value.type() == TNUMBER) { LuaValue n = value.tonumber(); if (!n.isnil()) { this.value = n.todouble(); return this; } } return new NormalEntry( this.key, value ); }