bit32.tohex from BitOp

This commit is contained in:
karl-police 2024-09-19 15:57:52 +02:00
parent e8a7acb802
commit ddc473e481
6 changed files with 40 additions and 0 deletions

View file

@ -444,6 +444,11 @@ static void applyBuiltinCall(int bfid, BytecodeTypes& types)
types.result = LBC_TYPE_NUMBER; types.result = LBC_TYPE_NUMBER;
types.a = LBC_TYPE_NUMBER; types.a = LBC_TYPE_NUMBER;
break; break;
case LBF_BIT32_TOHEX:
types.result = LBC_TYPE_STRING;
types.a = LBC_TYPE_NUMBER;
types.b = LBC_TYPE_NUMBER;
break;
case LBF_BUFFER_READI8: case LBF_BUFFER_READI8:
case LBF_BUFFER_READU8: case LBF_BUFFER_READU8:
types.result = LBC_TYPE_NUMBER; types.result = LBC_TYPE_NUMBER;

View file

@ -523,6 +523,7 @@ static void handleBuiltinEffects(ConstPropState& state, LuauBuiltinFunction bfid
case LBF_TONUMBER: case LBF_TONUMBER:
case LBF_TOSTRING: case LBF_TOSTRING:
case LBF_BIT32_BYTESWAP: case LBF_BIT32_BYTESWAP:
case LBF_BIT32_TOHEX:
case LBF_BUFFER_READI8: case LBF_BUFFER_READI8:
case LBF_BUFFER_READU8: case LBF_BUFFER_READU8:
case LBF_BUFFER_WRITEU8: case LBF_BUFFER_WRITEU8:

View file

@ -586,6 +586,9 @@ enum LuauBuiltinFunction
// bit32.byteswap(n) // bit32.byteswap(n)
LBF_BIT32_BYTESWAP, LBF_BIT32_BYTESWAP,
// bit32.tohex(n, n)
LBF_BIT32_TOHEX,
// buffer. // buffer.
LBF_BUFFER_READI8, LBF_BUFFER_READI8,
LBF_BUFFER_READU8, LBF_BUFFER_READU8,

View file

@ -168,6 +168,8 @@ static int getBuiltinFunctionId(const Builtin& builtin, const CompileOptions& op
return LBF_BIT32_COUNTRZ; return LBF_BIT32_COUNTRZ;
if (builtin.method == "byteswap") if (builtin.method == "byteswap")
return LBF_BIT32_BYTESWAP; return LBF_BIT32_BYTESWAP;
if (builtin.method == "tohex")
return LBF_BIT32_TOHEX;
} }
if (builtin.object == "string") if (builtin.object == "string")
@ -445,6 +447,7 @@ BuiltinInfo getBuiltinInfo(int bfid)
return {1, 1}; return {1, 1};
case LBF_BIT32_BYTESWAP: case LBF_BIT32_BYTESWAP:
case LBF_BIT32_TOHEX:
return {1, 1, BuiltinInfo::Flag_NoneSafe}; return {1, 1, BuiltinInfo::Flag_NoneSafe};
case LBF_BUFFER_READI8: case LBF_BUFFER_READI8:

View file

@ -681,6 +681,7 @@ struct TypeMapVisitor : AstVisitor
case LBF_TYPE: case LBF_TYPE:
case LBF_STRING_CHAR: case LBF_STRING_CHAR:
case LBF_TYPEOF: case LBF_TYPEOF:
case LBF_BIT32_TOHEX:
case LBF_STRING_SUB: case LBF_STRING_SUB:
case LBF_TOSTRING: case LBF_TOSTRING:
recordResolvedType(node, &builtinTypes.stringType); recordResolvedType(node, &builtinTypes.stringType);

View file

@ -15,6 +15,7 @@
#define mask(n) (~((ALLONES << 1) << ((n)-1))) #define mask(n) (~((ALLONES << 1) << ((n)-1)))
typedef unsigned b_uint; typedef unsigned b_uint;
typedef signed b_int;
static b_uint andaux(lua_State* L) static b_uint andaux(lua_State* L)
{ {
@ -219,6 +220,31 @@ static int b_swap(lua_State* L)
return 1; return 1;
} }
static int b_tohex(lua_State* L)
{
const unsigned digitsBoundary = 8;
b_uint b = luaL_checkunsigned(L, 1);
b_int n = lua_isnone(L, 2) ? digitsBoundary : (b_int)luaL_checkinteger(L, 2);
const char* hexdigits = "0123456789abcdef";
char buf[digitsBoundary];
int i;
if (n < 0)
{
n = -n;
hexdigits = "0123456789ABCDEF";
}
if (n > digitsBoundary)
n = digitsBoundary;
for (i = (int)n; --i >= 0;)
{
buf[i] = hexdigits[b & 15];
b >>= 4;
}
lua_pushlstring(L, buf, (size_t)n);
return 1;
}
static const luaL_Reg bitlib[] = { static const luaL_Reg bitlib[] = {
{"arshift", b_arshift}, {"arshift", b_arshift},
{"band", b_and}, {"band", b_and},
@ -235,6 +261,7 @@ static const luaL_Reg bitlib[] = {
{"countlz", b_countlz}, {"countlz", b_countlz},
{"countrz", b_countrz}, {"countrz", b_countrz},
{"byteswap", b_swap}, {"byteswap", b_swap},
{"tohex", b_tohex},
{NULL, NULL}, {NULL, NULL},
}; };