--- source: src/main.rs assertion_line: 136 expression: compiled input_file: test-data/lua5.4-tests/bwcoercion.lua --- local tonumber, tointeger = tonumber, math.tointeger local type, getmetatable, rawget, error = type, getmetatable, rawget, error local strsub = string.sub local print = print _ENV = nil local fn toint(x) { x = tonumber(x) if !x { return false } return tointeger(x) } local fn trymt(x, y, mtname) { if type(y) != "string" { local mt = getmetatable(y) local mm = mt && rawget(mt, mtname) if mm { return mm(x, y) } } error("attempt to '" .. strsub(mtname, 3) .. "' a " .. type(x) .. " with a " .. type(y), 4); } local fn checkargs(x, y, mtname) { local xi = toint(x) local yi = toint(y) if xi && yi { return xi, yi } else { return trymt(x, y, mtname), nil } } local smt = getmetatable("") smt.__band = fn (x, y) { local x, y = checkargs(x, y, "__band") return y && x & y || x } smt.__bor = fn (x, y) { local x, y = checkargs(x, y, "__bor") return y && x | y || x } smt.__bxor = fn (x, y) { local x, y = checkargs(x, y, "__bxor") return y && x ^^ y || x } smt.__shl = fn (x, y) { local x, y = checkargs(x, y, "__shl") return y && x << y || x } smt.__shr = fn (x, y) { local x, y = checkargs(x, y, "__shr") return y && x >> y || x } smt.__bnot = fn (x) { local x, y = checkargs(x, x, "__bnot") return y && ~x || x }