Better error handling and messages for invalid index/assign operations.

This commit is contained in:
Stephen Dolan committed 2012-09-11 10:37:44 +01:00
1 parent 0ce437ea97
commit 4c7bede5a4
3 files changed
+42 -42

No files matched your search

+20 -14
View File
@@ -133,7 +133,14 @@ static struct closure make_closure(struct forkable_stack* stk, frame_ptr fr, uin
} }
} }
void print_error(jv value) {
assert(!jv_is_valid(value));
jv msg = jv_invalid_get_msg(value);
if (jv_get_kind(msg) == JV_KIND_STRING) {
fprintf(stderr, "jq: error: %s\n", jv_string_value(msg));
}
jv_free(msg);
}
#define ON_BACKTRACK(op) ((op)+NUM_OPCODES) #define ON_BACKTRACK(op) ((op)+NUM_OPCODES)
jv jq_next() { jv jq_next() {
@@ -273,7 +280,13 @@ jv jq_next() {
uint16_t v = *pc++; uint16_t v = *pc++;
frame_ptr fp = frame_get_level(&frame_stk, frame_current(&frame_stk), level); frame_ptr fp = frame_get_level(&frame_stk, frame_current(&frame_stk), level);
jv* var = frame_local_var(fp, v); jv* var = frame_local_var(fp, v);
*var = jv_insert(*var, replacement.value, pathbuf + path_start.pathidx, path_end.pathidx - path_start.pathidx); jv result = jv_insert(*var, replacement.value, pathbuf + path_start.pathidx, path_end.pathidx - path_start.pathidx);
if (jv_is_valid(result)) {
*var = result;
} else {
print_error(result);
*var = jv_null();
}
break; break;
} }
@@ -282,13 +295,14 @@ jv jq_next() {
jv k = stack_pop().value; jv k = stack_pop().value;
int pathidx = path_push(t, jv_copy(k)); int pathidx = path_push(t, jv_copy(k));
jv v = jv_lookup(t.value, k); jv v = jv_lookup(t.value, k);
if (1 /* fixme invalid lookups */) { if (jv_is_valid(v)) {
stackval sv; stackval sv;
sv.value = v; sv.value = v;
sv.pathidx = pathidx; sv.pathidx = pathidx;
stack_push(sv); stack_push(sv);
} else { } else {
assert(0 && "bad lookup"); print_error(v);
goto do_backtrack;
} }
break; break;
} }
@@ -379,11 +393,7 @@ jv jq_next() {
if (jv_is_valid(top.value)) { if (jv_is_valid(top.value)) {
stack_push(top); stack_push(top);
} else { } else {
jv msg = jv_invalid_get_msg(top.value); print_error(top.value);
if (jv_get_kind(msg) == JV_KIND_STRING) {
fprintf(stderr, "jq: error: %s\n", jv_string_value(msg));
}
jv_free(msg);
goto do_backtrack; goto do_backtrack;
} }
break; break;
@@ -405,11 +415,7 @@ jv jq_next() {
if (jv_is_valid(top.value)) { if (jv_is_valid(top.value)) {
stack_push(top); stack_push(top);
} else { } else {
jv msg = jv_invalid_get_msg(top.value); print_error(top.value);
if (jv_get_kind(msg) == JV_KIND_STRING) {
fprintf(stderr, "jq: error: %s\n", jv_string_value(msg));
}
jv_free(msg);
goto do_backtrack; goto do_backtrack;
} }
break; break;
+1 -1
View File
@@ -49,7 +49,7 @@ const char* jv_kind_name(jv_kind k) {
case JV_KIND_ARRAY: return "array"; case JV_KIND_ARRAY: return "array";
case JV_KIND_OBJECT: return "object"; case JV_KIND_OBJECT: return "object";
} }
assert(0); assert(0 && "invalid kind");
return "<unknown>"; return "<unknown>";
} }
+21 -27
View File
@@ -126,39 +126,33 @@ static jv jv_lookup(jv t, jv k) {
jv_free(k); jv_free(k);
v = jv_null(); v = jv_null();
} else { } else {
assert(0&&"bad lookup"); v = jv_invalid_with_msg(jv_string_fmt("Cannot index %s with %s",
jv_kind_name(jv_get_kind(t)),
jv_kind_name(jv_get_kind(k))));
jv_free(t);
jv_free(k);
} }
return v; return v;
// FIXME: invalid indexes, JV_KIND_INVALID
/*
if (v)
return v;
else
return jv_null();
*/
} }
static jv jv_modify(jv t, jv k, jv v) { static jv jv_modify(jv t, jv k, jv v) {
if (jv_get_kind(k) == JV_KIND_STRING) { int isnull = jv_get_kind(t) == JV_KIND_NULL;
if (jv_get_kind(t) == JV_KIND_NULL) { if (jv_get_kind(k) == JV_KIND_STRING &&
t = jv_object(); (jv_get_kind(t) == JV_KIND_OBJECT || isnull)) {
} if (isnull) t = jv_object();
if (jv_get_kind(t) == JV_KIND_OBJECT) { t = jv_object_set(t, k, v);
t = jv_object_set(t, k, v); } else if (jv_get_kind(k) == JV_KIND_NUMBER &&
} else { (jv_get_kind(t) == JV_KIND_ARRAY || isnull)) {
assert(0 && "bad mod - not an object"); if (isnull) t = jv_array();
} t = jv_array_set(t, (int)jv_number_value(k), v);
} else if (jv_get_kind(k) == JV_KIND_NUMBER) {
if (jv_get_kind(t) == JV_KIND_NULL) {
t = jv_array();
}
if (jv_get_kind(t) == JV_KIND_ARRAY) {
t = jv_array_set(t, (int)jv_number_value(k), v);
} else {
assert(0 && "bad mod - not an array");
}
} else { } else {
assert(0 && "bad mod - seriously, wtf"); jv err = jv_invalid_with_msg(jv_string_fmt("Cannot update field at %s index of %s",
jv_kind_name(jv_get_kind(t)),
jv_kind_name(jv_get_kind(v))));
jv_free(t);
jv_free(k);
jv_free(v);
t = err;
} }
return t; return t;
} }