dibyendumajumdar / ravi

Ravi is a dialect of Lua, featuring limited optional static typing, JIT and AOT compilers
http://ravilang.github.io/
Other
1.16k stars 60 forks source link

Wrong Type Deduction for LEN #210

Open XmiliaH opened 3 years ago

XmiliaH commented 3 years ago

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
dibyendumajumdar commented 3 years ago

Thanks for the report.

dibyendumajumdar commented 3 years ago

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