From e258d20ba203adb1e91969a593c036179475deb6 Mon Sep 17 00:00:00 2001 From: Stephen Dolan Date: Sun, 9 Sep 2012 19:17:07 +0100 Subject: [PATCH] Make the '+' operator merge objects. --- c/builtin.c | 2 ++ c/jv.c | 10 ++++++++++ c/jv.h | 6 ++++++ c/testdata | 4 ++++ 4 files changed, 22 insertions(+) diff --git a/c/builtin.c b/c/builtin.c index 35e15471..26698680 100644 --- a/c/builtin.c +++ b/c/builtin.c @@ -24,6 +24,8 @@ static void f_plus(jv input[], jv output[]) { jv_number_value(b)); } else if (jv_get_kind(a) == JV_KIND_ARRAY && jv_get_kind(b) == JV_KIND_ARRAY) { output[0] = jv_array_concat(a, b); + } else if (jv_get_kind(a) == JV_KIND_OBJECT && jv_get_kind(b) == JV_KIND_OBJECT) { + output[0] = jv_object_merge(a, b); } else { output[0] = jv_string("wtf gaize"); jv_free(a); diff --git a/c/jv.c b/c/jv.c index 1d5c9816..762bad89 100644 --- a/c/jv.c +++ b/c/jv.c @@ -729,6 +729,16 @@ int jv_object_length(jv object) { return n; } +jv jv_object_merge(jv a, jv b) { + assert(jv_get_kind(a) == JV_KIND_OBJECT); + jv_object_foreach(i, b) { + a = jv_object_set(a, + jv_object_iter_key(b, i), + jv_object_iter_value(b, i)); + } + return a; +} + /* * Object iteration (internal helpers) */ diff --git a/c/jv.h b/c/jv.h index 6872ec5c..2ec18629 100644 --- a/c/jv.h +++ b/c/jv.h @@ -78,12 +78,18 @@ jv jv_object_get(jv object, jv key); jv jv_object_set(jv object, jv key, jv value); jv jv_object_delete(jv object, jv key); int jv_object_length(jv object); +jv jv_object_merge(jv, jv); int jv_object_iter(jv); int jv_object_iter_next(jv, int); int jv_object_iter_valid(jv, int); jv jv_object_iter_key(jv, int); jv jv_object_iter_value(jv, int); +#define jv_object_foreach(i,t) \ + for (int i = jv_object_iter(t); \ + jv_object_iter_valid(t, i); \ + i = jv_object_iter_next(t, i)) \ + int jv_get_refcnt(jv); diff --git a/c/testdata b/c/testdata index 5aa3efed..f80249e4 100644 --- a/c/testdata +++ b/c/testdata @@ -155,6 +155,10 @@ null null [1,2,3,null] +{"a":1} + {"b":2} + {"c":3} +"asdfasdf" +{"a":1, "b":2, "c":3} + # # User-defined functions # Oh god.