Wrong Type Deduction for LEN
XmiliaH opened this issue · 2 comments
XmiliaH commented
The return type for LEN is wrong if the __len
metamethod for floats or integers is overwritten and the length from an array element from a ravi array is taken. As in the following example which errors with src/lvm.c:2428: luaV_execute: Assertion `((((rb))->tt_) == (((3) | ((1) << 4))))' failed.
debug.setmetatable(1, {
__len = function()
return "123"
end
})
local function f(x:integer[])
return #(x[1]) + 1
end
print(f(table.intarray(2)))
The problem is that luaK_exp2anyreg
can change the ravi_type
if it is a load from an index as in the example above. The problematic place is
Line 1270 in 56a59a1
Following is the wrong bytecode with the unexpected ADDII
1 [7] TOIARRAY 0
2 [8] IARRAY_GET 1 0 -1 ; 1
3 [8] LEN 1 1
4 [8] ADDII 1 1 -1 ; - 1
5 [8] RETURN 1 2
6 [9] RETURN 0 1
dibyendumajumdar commented
Thanks for the report.
dibyendumajumdar commented
Hi thanks for the report and analysis - you are correct here. I have pushed a fix.