mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-11 10:25:47 +02:00
fix(interpreter): Remove converting type checks (#1051)
Signed-off-by: Vladislav Oleshko <vlad@dragonflydb.io>
This commit is contained in:
parent
2cfe1f84dc
commit
6e86fa4063
1 changed files with 37 additions and 31 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue