diff --git a/data/core/bit.lua b/data/core/bit.lua index f357d5fd..e55fb9bf 100644 --- a/data/core/bit.lua +++ b/data/core/bit.lua @@ -11,20 +11,26 @@ local function mask(n) return (~((ALLONES << 1) << ((n) - 1))) end +local function check_args(field, width) + assert(field >= 0, "field cannot be negative") + assert(width > 0, "width must be positive") + assert(field + width < LUA_NBITS and field + width >= 0, + "trying to access non-existent bits") +end + function bit.extract(n, field, width) - local r = trim(field) - local f = width - r = (r >> f) & mask(width) - return r + local w = width or 1 + check_args(field, w) + local m = trim(n) + return m >> field & mask(w) end function bit.replace(n, v, field, width) - local r = trim(v); - local v = trim(field); - local f = width - local m = mask(width); - r = (r & ~(m << f)) | ((v & m) << f); - return r + local w = width or 1 + check_args(field, w) + local m = trim(n) + local x = v & mask(width); + return m & ~(mask(w) << field) | (x << field) end -return bit \ No newline at end of file +return bit diff --git a/data/core/start.lua b/data/core/start.lua index 482f8bd0..b3bcc18e 100644 --- a/data/core/start.lua +++ b/data/core/start.lua @@ -32,3 +32,5 @@ end } table.pack = table.pack or pack or function(...) return {...} end table.unpack = table.unpack or unpack + +bit32 = bit32 or require "core.bit" diff --git a/data/core/tokenizer.lua b/data/core/tokenizer.lua index 03769c46..5fd8c69f 100644 --- a/data/core/tokenizer.lua +++ b/data/core/tokenizer.lua @@ -1,6 +1,5 @@ local syntax = require "core.syntax" local common = require "core.common" -local bit32 = require "core.bit" local tokenizer = {}