[PATCH v3 1/6] lua: fix decimal comparison with nil
Serge Petrenko
sergepetrenko at tarantool.org
Tue Aug 20 20:09:59 MSK 2019
Previously decimal comparison with nil failed with following error:
`expected decimal, number or string as 2 argument`.
Fix this. Throw a more verbose error in case of '>', '<', '>=', '<='
and fix equality check.
Follow-up #692
---
src/lua/decimal.c | 19 ++++++++++++++++++-
test/app/decimal.result | 26 ++++++++++++++++++++++++++
test/app/decimal.test.lua | 8 ++++++++
3 files changed, 52 insertions(+), 1 deletion(-)
diff --git a/src/lua/decimal.c b/src/lua/decimal.c
index de6586c8b..7f9358787 100644
--- a/src/lua/decimal.c
+++ b/src/lua/decimal.c
@@ -69,6 +69,10 @@ ldecimal_##name(struct lua_State *L) { \
static int \
ldecimal_##name(struct lua_State *L) { \
assert(lua_gettop(L) == 2); \
+ if (lua_isnil(L, 1) || lua_isnil(L, 2)) { \
+ luaL_error(L, "attempt to compare decimal with nil"); \
+ return 1; \
+ } \
decimal_t *lhs = lua_todecimal(L, 1); \
decimal_t *rhs = lua_todecimal(L, 2); \
lua_pushboolean(L, decimal_compare(lhs, rhs) cmp 0); \
@@ -226,10 +230,23 @@ LDECIMAL_FUNC(exp, exp)
LDECIMAL_FUNC(sqrt, sqrt)
LDECIMAL_FUNC(abs, abs)
-LDECIMAL_CMPOP(eq, ==)
LDECIMAL_CMPOP(lt, <)
LDECIMAL_CMPOP(le, <=)
+static int
+ldecimal_eq(struct lua_State *L)
+{
+ assert(lua_gettop(L) == 2);
+ if (lua_isnil(L, 1) || lua_isnil(L, 2)) {
+ lua_pushboolean(L, false);
+ return 1;
+ }
+ decimal_t *lhs = lua_todecimal(L, 1);
+ decimal_t *rhs = lua_todecimal(L, 2);
+ lua_pushboolean(L, decimal_compare(lhs, rhs) == 0);
+ return 1;
+}
+
static int
ldecimal_minus(struct lua_State *L)
{
diff --git a/test/app/decimal.result b/test/app/decimal.result
index c632f57a7..2e44928bb 100644
--- a/test/app/decimal.result
+++ b/test/app/decimal.result
@@ -223,6 +223,32 @@ b
| - '0.1'
| ...
+-- check comparsion with nil
+a == nil
+ | ---
+ | - false
+ | ...
+a ~= nil
+ | ---
+ | - true
+ | ...
+a > nil
+ | ---
+ | - error: '[string "return a > nil "]:1: attempt to compare decimal with nil'
+ | ...
+a < nil
+ | ---
+ | - error: '[string "return a < nil "]:1: attempt to compare decimal with nil'
+ | ...
+a >= nil
+ | ---
+ | - error: '[string "return a >= nil "]:1: attempt to compare decimal with nil'
+ | ...
+a <= nil
+ | ---
+ | - error: '[string "return a <= nil "]:1: attempt to compare decimal with nil'
+ | ...
+
decimal.sqrt(a)
| ---
| - '3.1622776601683793319988935444327185337'
diff --git a/test/app/decimal.test.lua b/test/app/decimal.test.lua
index 40f1f29de..d83522b45 100644
--- a/test/app/decimal.test.lua
+++ b/test/app/decimal.test.lua
@@ -62,6 +62,14 @@ a ~= b
a
b
+-- check comparsion with nil
+a == nil
+a ~= nil
+a > nil
+a < nil
+a >= nil
+a <= nil
+
decimal.sqrt(a)
decimal.ln(a)
decimal.log10(a)
--
2.20.1 (Apple Git-117)
More information about the Tarantool-patches
mailing list