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;
char tmpbuf[64];
for (int j = 0; j < argc; j++) {
unsigned idx = j + 1;
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'.
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 {
PushError(lua_, "Lua redis() command arguments must be strings or integers");
cmd_depth_--;
return raise_error ? RaiseError(lua_) : 1;
for (int idx = 1; idx <= argc; idx++) {
switch (lua_type(lua_, idx)) {
case LUA_TNUMBER:
if (lua_isinteger(lua_, idx)) {
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;
}
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;
}
}
// 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;
if (lua_isinteger(lua_, idx)) {
char* next = absl::numbers_internal::FastIntToBuffer(lua_tointeger(lua_, idx), cur);
len = next - cur;
} else if (lua_isnumber(lua_, idx)) {
// we pass `end - cur + 1` because we do not want to skip the last character
// if it's the last argument.
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.
}
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;
} else if (lua_isnumber(lua_, idx)) {
// we pass `end - cur + 1` because we do not want to skip the last character
// if it's the last argument.
int fmt_len = absl::SNPrintF(cur, end - cur + 1, "%.17g", lua_tonumber(lua_, idx));
CHECK_GT(fmt_len, 0);
len = fmt_len;
}
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;
}