ravi
ravi copied to clipboard
Wrong Type Deduction for LEN
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
https://github.com/dibyendumajumdar/ravi/blob/56a59a1f3117a8bc88206305b94398678de1bdff/src/lcode.c#L1270
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
Thanks for the report.
Hi thanks for the report and analysis - you are correct here. I have pushed a fix.