ravi icon indicating copy to clipboard operation
ravi copied to clipboard

Wrong Type Deduction for LEN

Open XmiliaH opened this issue 4 years ago • 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 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

XmiliaH avatar Feb 14 '21 18:02 XmiliaH

Thanks for the report.

dibyendumajumdar avatar Feb 14 '21 20:02 dibyendumajumdar

Hi thanks for the report and analysis - you are correct here. I have pushed a fix.

dibyendumajumdar avatar Feb 15 '21 00:02 dibyendumajumdar