fix(interpreter): Remove converting type checks (#1051)

Signed-off-by: Vladislav Oleshko <vlad@dragonflydb.io>
This commit is contained in:
Vladislav 2023-04-08 20:09:56 +03:00 committed by GitHub
parent 2cfe1f84dc
commit 6e86fa4063
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -646,19 +646,21 @@ int Interpreter::RedisGenericCommand(bool raise_error) {
size_t blob_len = 0;
char tmpbuf[64];
for (int j = 0; j < argc; j++) {
unsigned idx = j + 1;
for (int idx = 1; idx <= argc; idx++) {
switch (lua_type(lua_, idx)) {
case LUA_TNUMBER:
if (lua_isinteger(lua_, idx)) {
absl::AlphaNum an(lua_tointeger(lua_, idx));
blob_len += an.size();
} else if (lua_isnumber(lua_, idx)) {
// fmt_len does not include '\0'.
blob_len += absl::AlphaNum{lua_tointeger(lua_, idx)}.size();
} else {
int fmt_len = absl::SNPrintF(tmpbuf, sizeof(tmpbuf), "%.17g", lua_tonumber(lua_, idx));
CHECK_GT(fmt_len, 0);
blob_len += fmt_len;
} else if (lua_isstring(lua_, idx)) {
blob_len += lua_rawlen(lua_, idx); // lua_rawlen does not include '\0'.
} else {
}
continue;
case LUA_TSTRING:
blob_len += lua_rawlen(lua_, idx);
continue;
default:
PushError(lua_, "Lua redis() command arguments must be strings or integers");
cmd_depth_--;
return raise_error ? RaiseError(lua_) : 1;
@ -667,13 +669,15 @@ int Interpreter::RedisGenericCommand(bool raise_error) {
// backing storage.
unique_ptr<char[]> blob(new char[blob_len + 8]); // 8 safety.
vector<absl::Span<char>> cmdargs;
vector<absl::Span<char>> cmdargs(argc);
char* cur = blob.get();
char* end = cur + blob_len;
for (int j = 0; j < argc; j++) {
unsigned idx = j + 1;
size_t len = 0;
switch (lua_type(lua_, idx)) {
case LUA_TNUMBER:
if (lua_isinteger(lua_, idx)) {
char* next = absl::numbers_internal::FastIntToBuffer(lua_tointeger(lua_, idx), cur);
len = next - cur;
@ -683,12 +687,14 @@ int Interpreter::RedisGenericCommand(bool raise_error) {
int fmt_len = absl::SNPrintF(cur, end - cur + 1, "%.17g", lua_tonumber(lua_, idx));
CHECK_GT(fmt_len, 0);
len = fmt_len;
} else if (lua_isstring(lua_, idx)) {
len = lua_rawlen(lua_, idx);
memcpy(cur, lua_tostring(lua_, idx), len + 1); // copy \0 as well.
}
break;
case LUA_TSTRING:
len = lua_rawlen(lua_, idx);
memcpy(cur, lua_tostring(lua_, idx), len);
};
cmdargs.emplace_back(cur, len);
cmdargs[j] = {cur, len};
cur += len;
}