dibyendumajumdar/ravi

Wrong Type Deduction for LEN

XmiliaH opened this issue · 2 comments

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

ravi/src/lcode.c

Line 1270 in 56a59a1

int r = luaK_exp2anyreg(fs, e); /* opcodes operate only on registers */

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.