summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Dolan <mu@netsoc.tcd.ie>2012-09-09 19:17:07 +0100
committerStephen Dolan <mu@netsoc.tcd.ie>2012-09-09 19:17:07 +0100
commite258d20ba203adb1e91969a593c036179475deb6 (patch)
treef40fdcecd972021fdc89dae05533ec179c83d402
parenta4ff3d4670b6a64f41569fa0f7ae1fba0781625f (diff)
Make the '+' operator merge objects.
-rw-r--r--c/builtin.c2
-rw-r--r--c/jv.c10
-rw-r--r--c/jv.h6
-rw-r--r--c/testdata4
4 files changed, 22 insertions, 0 deletions
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.