summaryrefslogtreecommitdiffstats
path: root/c/jv.c
diff options
context:
space:
mode:
authorStephen Dolan <mu@netsoc.tcd.ie>2012-09-03 16:16:14 +0100
committerStephen Dolan <mu@netsoc.tcd.ie>2012-09-03 16:16:14 +0100
commita8c3648ca5ebcb9c824f3df86a4c2fbe57c09d6d (patch)
tree33f575305b74b29a9fe655b5140b10b906485c37 /c/jv.c
parentd895d39ba973f7296429aac77c1ad6bc8d7341b4 (diff)
JV_KIND_INVALID values to represent failed lookups, etc + various tests.
Diffstat (limited to 'c/jv.c')
-rw-r--r--c/jv.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/c/jv.c b/c/jv.c
index 198bfeda..4484dc9f 100644
--- a/c/jv.c
+++ b/c/jv.c
@@ -37,10 +37,15 @@ jv_kind jv_get_kind(jv x) {
return x.kind;
}
+static const jv JV_INVALID = {JV_KIND_INVALID, {0}};
static const jv JV_NULL = {JV_KIND_NULL, {0}};
static const jv JV_FALSE = {JV_KIND_FALSE, {0}};
static const jv JV_TRUE = {JV_KIND_TRUE, {0}};
+jv jv_invalid() {
+ return JV_INVALID;
+}
+
jv jv_true() {
return JV_TRUE;
}
@@ -671,7 +676,13 @@ jv jv_object() {
jv jv_object_get(jv object, jv key) {
assert(jv_get_kind(object) == JV_KIND_OBJECT);
assert(jv_get_kind(key) == JV_KIND_STRING);
- jv val = jv_copy(*jvp_object_read(&object.val.complex, jvp_string_ptr(&key.val.complex)));
+ jv* slot = jvp_object_read(&object.val.complex, jvp_string_ptr(&key.val.complex));
+ jv val;
+ if (slot) {
+ val = jv_copy(*slot);
+ } else {
+ val = jv_invalid();
+ }
jv_free(object);
jv_free(key);
return val;