summaryrefslogtreecommitdiffstats
path: root/src/jv_aux.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/jv_aux.c')
-rw-r--r--src/jv_aux.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/jv_aux.c b/src/jv_aux.c
index 129cd043..eca2345f 100644
--- a/src/jv_aux.c
+++ b/src/jv_aux.c
@@ -2,6 +2,16 @@
#include <stdlib.h>
#include <assert.h>
#include "jv_alloc.h"
+#include "jv_type_private.h"
+
+// making this static verbose function here
+// until we introduce a less confusing naming scheme
+// of jv_* API with regards to the memory management
+static double jv_number_get_value_and_consume(jv number) {
+ double value = jv_number_value(number);
+ jv_free(number);
+ return value;
+}
static int parse_slice(jv j, jv slice, int* pstart, int* pend) {
// Array slices
@@ -32,6 +42,8 @@ static int parse_slice(jv j, jv slice, int* pstart, int* pend) {
} else {
double dstart = jv_number_value(start_jv);
double dend = jv_number_value(end_jv);
+ jv_free(start_jv);
+ jv_free(end_jv);
if (dstart < 0) dstart += len;
if (dend < 0) dend += len;
if (dstart < 0) dstart = 0;
@@ -69,6 +81,7 @@ jv jv_get(jv t, jv k) {
jv_free(v);
v = jv_null();
}
+ jv_free(k);
} else {
jv_free(t);
jv_free(k);
@@ -135,6 +148,7 @@ jv jv_set(jv t, jv k, jv v) {
(jv_get_kind(t) == JV_KIND_ARRAY || isnull)) {
if (isnull) t = jv_array();
t = jv_array_set(t, (int)jv_number_value(k), v);
+ jv_free(k);
} else if (jv_get_kind(k) == JV_KIND_OBJECT &&
(jv_get_kind(t) == JV_KIND_ARRAY || isnull)) {
if (isnull) t = jv_array();
@@ -202,6 +216,7 @@ jv jv_has(jv t, jv k) {
jv_get_kind(k) == JV_KIND_NUMBER) {
jv elem = jv_array_get(t, (int)jv_number_value(k));
ret = jv_bool(jv_is_valid(elem));
+ jv_free(k);
jv_free(elem);
} else {
ret = jv_invalid_with_msg(jv_string_fmt("Cannot check whether %s has a %s key",
@@ -240,6 +255,7 @@ static jv jv_dels(jv t, jv keys) {
ends = jv_array_append(ends, jv_number(end));
} else {
jv_free(new_array);
+ jv_free(key);
new_array = jv_invalid_with_msg(jv_string_fmt("Start and end indices of an array slice must be numbers"));
goto arr_out;
}
@@ -258,7 +274,7 @@ static jv jv_dels(jv t, jv keys) {
jv_array_foreach(t, i, elem) {
int del = 0;
while (neg_idx < jv_array_length(jv_copy(neg_keys))) {
- int delidx = len + (int)jv_number_value(jv_array_get(jv_copy(neg_keys), neg_idx));
+ int delidx = len + (int)jv_number_get_value_and_consume(jv_array_get(jv_copy(neg_keys), neg_idx));
if (i == delidx) {
del = 1;
}
@@ -268,7 +284,7 @@ static jv jv_dels(jv t, jv keys) {
neg_idx++;
}
while (nonneg_idx < jv_array_length(jv_copy(nonneg_keys))) {
- int delidx = (int)jv_number_value(jv_array_get(jv_copy(nonneg_keys), nonneg_idx));
+ int delidx = (int)jv_number_get_value_and_consume(jv_array_get(jv_copy(nonneg_keys), nonneg_idx));
if (i == delidx) {
del = 1;
}
@@ -278,8 +294,8 @@ static jv jv_dels(jv t, jv keys) {
nonneg_idx++;
}
for (int sidx=0; !del && sidx<jv_array_length(jv_copy(starts)); sidx++) {
- if ((int)jv_number_value(jv_array_get(jv_copy(starts), sidx)) <= i &&
- i < (int)jv_number_value(jv_array_get(jv_copy(ends), sidx))) {
+ if ((int)jv_number_get_value_and_consume(jv_array_get(jv_copy(starts), sidx)) <= i &&
+ i < (int)jv_number_get_value_and_consume(jv_array_get(jv_copy(ends), sidx))) {
del = 1;
}
}
@@ -511,14 +527,13 @@ int jv_cmp(jv a, jv b) {
break;
case JV_KIND_NUMBER: {
- double da = jv_number_value(a), db = jv_number_value(b);
-
- // handle NaN as though it were null
- if (da != da) r = jv_cmp(jv_null(), jv_number(db));
- else if (db != db) r = jv_cmp(jv_number(da), jv_null());
- else if (da < db) r = -1;
- else if (da == db) r = 0;
- else r = 1;
+ if (jvp_number_is_nan(a)) {
+ r = jv_cmp(jv_null(), jv_copy(b));
+ } else if (jvp_number_is_nan(b)) {
+ r = jv_cmp(jv_copy(a), jv_null());
+ } else {
+ r = jvp_number_cmp(a, b);
+ }
break;
}