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,49 +646,55 @@ int Interpreter::RedisGenericCommand(bool raise_error) {
size_t blob_len = 0; size_t blob_len = 0;
char tmpbuf[64]; char tmpbuf[64];
for (int j = 0; j < argc; j++) { for (int idx = 1; idx <= argc; idx++) {
unsigned idx = j + 1; switch (lua_type(lua_, idx)) {
if (lua_isinteger(lua_, idx)) { case LUA_TNUMBER:
absl::AlphaNum an(lua_tointeger(lua_, idx)); if (lua_isinteger(lua_, idx)) {
blob_len += an.size(); blob_len += absl::AlphaNum{lua_tointeger(lua_, idx)}.size();
} else if (lua_isnumber(lua_, idx)) { } else {
// fmt_len does not include '\0'. int fmt_len = absl::SNPrintF(tmpbuf, sizeof(tmpbuf), "%.17g", lua_tonumber(lua_, idx));
int fmt_len = absl::SNPrintF(tmpbuf, sizeof(tmpbuf), "%.17g", lua_tonumber(lua_, idx)); CHECK_GT(fmt_len, 0);
CHECK_GT(fmt_len, 0); blob_len += fmt_len;
blob_len += fmt_len; }
} else if (lua_isstring(lua_, idx)) { continue;
blob_len += lua_rawlen(lua_, idx); // lua_rawlen does not include '\0'. case LUA_TSTRING:
} else { blob_len += lua_rawlen(lua_, idx);
PushError(lua_, "Lua redis() command arguments must be strings or integers"); continue;
cmd_depth_--; default:
return raise_error ? RaiseError(lua_) : 1; PushError(lua_, "Lua redis() command arguments must be strings or integers");
cmd_depth_--;
return raise_error ? RaiseError(lua_) : 1;
} }
} }
// backing storage. // backing storage.
unique_ptr<char[]> blob(new char[blob_len + 8]); // 8 safety. 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* cur = blob.get();
char* end = cur + blob_len; char* end = cur + blob_len;
for (int j = 0; j < argc; j++) { for (int j = 0; j < argc; j++) {
unsigned idx = j + 1; unsigned idx = j + 1;
size_t len = 0; size_t len = 0;
if (lua_isinteger(lua_, idx)) { switch (lua_type(lua_, idx)) {
char* next = absl::numbers_internal::FastIntToBuffer(lua_tointeger(lua_, idx), cur); case LUA_TNUMBER:
len = next - cur; if (lua_isinteger(lua_, idx)) {
} else if (lua_isnumber(lua_, idx)) { char* next = absl::numbers_internal::FastIntToBuffer(lua_tointeger(lua_, idx), cur);
// we pass `end - cur + 1` because we do not want to skip the last character len = next - cur;
// if it's the last argument. } else if (lua_isnumber(lua_, idx)) {
int fmt_len = absl::SNPrintF(cur, end - cur + 1, "%.17g", lua_tonumber(lua_, idx)); // we pass `end - cur + 1` because we do not want to skip the last character
CHECK_GT(fmt_len, 0); // if it's the last argument.
len = fmt_len; int fmt_len = absl::SNPrintF(cur, end - cur + 1, "%.17g", lua_tonumber(lua_, idx));
} else if (lua_isstring(lua_, idx)) { CHECK_GT(fmt_len, 0);
len = lua_rawlen(lua_, idx); len = fmt_len;
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; cur += len;
} }