mirror of
https://github.com/luau-lang/luau.git
synced 2025-04-10 22:00:54 +01:00
bit32.tohex from BitOp
This commit is contained in:
parent
e8a7acb802
commit
ddc473e481
6 changed files with 40 additions and 0 deletions
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue