Skip to content

Commit

Permalink
removes conditional unborrowing on read, fixes jv_object_delete()
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxBrandtner committed Feb 28, 2024
1 parent b80e4f0 commit 52c07c7
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 9 deletions.
6 changes: 6 additions & 0 deletions src/jq_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -562,5 +562,11 @@ static void jv_test() {
assert(jv_get_refcnt(a) == 1);

jv_free(b);

jv o = JV_OBJECT(jv_string("some"), jv_string("value"));
jv od = jv_object_delete(jv_borrow(o), jv_string("some"));
jv ov = jv_getpath(o, JV_ARRAY(jv_string("some")));
assert(jv_equal(ov, jv_string("value")));
jv_free(od);
}
}
23 changes: 14 additions & 9 deletions src/jv.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,12 @@ typedef struct {
jv jv_invalid_with_msg(jv err) {
jvp_invalid* i = jv_mem_alloc(sizeof(jvp_invalid));
i->refcnt = JV_REFCNT_INIT;
i->errmsg = err;

if(jv_is_borrowed(err)){
i->errmsg = jv_unborrow(err);
}else{
i->errmsg = err;
}

jv x = {JVP_FLAGS_INVALID_MSG, 0, 0, 0, 0, {&i->refcnt}};
return x;
Expand All @@ -164,7 +169,7 @@ jv jv_invalid_get_msg(jv inv) {

jv x;
if (JVP_HAS_FLAGS(inv, JVP_FLAGS_INVALID_MSG)) {
x = jv_unborrow(((jvp_invalid*)inv.u.ptr)->errmsg);
x = jv_copy(((jvp_invalid*)inv.u.ptr)->errmsg);
}
else {
x = jv_null();
Expand Down Expand Up @@ -974,7 +979,7 @@ jv jv_array_get(jv j, int idx) {
jv* slot = jvp_array_read(j, idx);
jv val;
if (slot) {
val = jv_unborrow(*slot);
val = jv_copy(*slot);
} else {
val = jv_invalid();
}
Expand Down Expand Up @@ -1018,7 +1023,6 @@ jv jv_array_concat(jv a, jv b) {
a = jv_array_append(a, elem);
}
jv_free(b);
if(jv_is_borrowed(a)) return jv_unborrow(a);
return a;
}

Expand Down Expand Up @@ -1642,8 +1646,8 @@ static jv jvp_object_unshare(jv object) {
struct object_slot* new_slot = jvp_object_get_slot(new_object, i);
*new_slot = *old_slot;
if (jv_get_kind(old_slot->string) != JV_KIND_NULL) {
new_slot->string = jv_unborrow(old_slot->string);
new_slot->value = jv_unborrow(old_slot->value);
new_slot->string = jv_copy(old_slot->string);
new_slot->value = jv_copy(old_slot->value);
}
}

Expand Down Expand Up @@ -1786,12 +1790,13 @@ jv jv_object_set(jv object, jv key, jv value) {
return object;
}

jv jv_object_delete(jv object, jv key) {
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
jv jv_object_delete(jv input, jv key) {
assert(JVP_HAS_KIND(input, JV_KIND_OBJECT));
assert(JVP_HAS_KIND(key, JV_KIND_STRING));
jv object = jv_unborrow(input);
jv_free(input);
jvp_object_delete(&object, key);
jv_free(key);
if(jv_is_borrowed(object)) return jv_unborrow(object);
return object;
}

Expand Down

0 comments on commit 52c07c7

Please sign in to comment.