Make assignment work again: = and |= operators.

This commit is contained in:
Stephen Dolan committed 2012-09-03 15:33:59 +01:00
1 parent d8fad1ed9b
commit 8fe9c8a22a
3 files changed
+19 -21

No files matched your search

+18 -19
View File
@@ -24,14 +24,18 @@ int pathsize; // number of allocated elements
// FIXME mem // FIXME mem
int path_push(stackval sv, jv val) { int path_push(stackval sv, jv val) {
return 0;
int pos = sv.pathidx; int pos = sv.pathidx;
assert(pos <= pathsize); assert(pos <= pathsize);
assert(pos >= 0); assert(pos >= 0);
if (pos == pathsize) { if (pos == pathsize) {
pathsize = pathsize ? pathsize * 2 : 100; int oldpathsize = pathsize;
pathsize = oldpathsize ? oldpathsize * 2 : 100;
pathbuf = realloc(pathbuf, sizeof(pathbuf[0]) * pathsize); pathbuf = realloc(pathbuf, sizeof(pathbuf[0]) * pathsize);
for (int i=oldpathsize; i<pathsize; i++) {
pathbuf[i] = jv_null();
}
} }
jv_free(pathbuf[pos]);
pathbuf[pos] = val; pathbuf[pos] = val;
return pos + 1; return pos + 1;
} }
@@ -251,42 +255,30 @@ jv jq_next() {
break; break;
} }
case ASSIGN_DBG: {
assert(0);
/*
stackval replacement = stack_pop();
stackval path_end = stack_pop();
stackval path_start = stack_pop();
json_t* obj = jv_insert(path_start.value, replacement.value, pathbuf + path_start.pathidx, path_end.pathidx - path_start.pathidx);
stack_push(stackval_replace(path_start, obj));
*/
break;
}
case ASSIGN: { case ASSIGN: {
assert(0);
/*
stackval replacement = stack_pop(); stackval replacement = stack_pop();
stackval path_end = stack_pop(); stackval path_end = stack_pop();
stackval path_start = stack_pop(); stackval path_start = stack_pop();
jv_free(path_end.value);
jv_free(path_start.value);
uint16_t level = *pc++; uint16_t level = *pc++;
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);
json_t** 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); *var = jv_insert(*var, replacement.value, pathbuf + path_start.pathidx, path_end.pathidx - path_start.pathidx);
*/
break; break;
} }
case INDEX: { case INDEX: {
stackval t = stack_pop(); stackval t = stack_pop();
jv k = stack_pop().value; jv k = stack_pop().value;
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 (1 /* fixme invalid lookups */) {
stackval sv; stackval sv;
sv.value = v; sv.value = v;
sv.pathidx = 0; //FIXME path_push(t, k); sv.pathidx = pathidx;
stack_push(sv); stack_push(sv);
} else { } else {
assert(0 && "bad lookup"); assert(0 && "bad lookup");
@@ -437,6 +429,13 @@ void jq_teardown() {
forkable_stack_free(&fork_stk); forkable_stack_free(&fork_stk);
forkable_stack_free(&data_stk); forkable_stack_free(&data_stk);
forkable_stack_free(&frame_stk); forkable_stack_free(&frame_stk);
for (int i=0; i<pathsize; i++) {
jv_free(pathbuf[i]);
}
free(pathbuf);
pathbuf = 0;
pathsize = 0;
} }
void run_program(struct bytecode* bc) { void run_program(struct bytecode* bc) {
+1 -1
View File
@@ -127,7 +127,7 @@ static jv jv_insert(jv root, jv value, jv* path, int pathlen) {
jv_free(root); jv_free(root);
return value; return value;
} }
return jv_modify(root, *path, return jv_modify(root, jv_copy(*path),
jv_insert(jv_lookup(jv_copy(root), jv_copy(*path)), value, path+1, pathlen-1)); jv_insert(jv_lookup(jv_copy(root), jv_copy(*path)), value, path+1, pathlen-1));
} }
-1
View File
@@ -14,7 +14,6 @@ OP(BACKTRACK, NONE, 0, 0)
OP(APPEND, NONE, 2, 1) OP(APPEND, NONE, 2, 1)
OP(INSERT, NONE, 4, 2) OP(INSERT, NONE, 4, 2)
OP(ASSIGN_DBG, NONE, 3, 1)
OP(ASSIGN, VARIABLE, 3, 0) OP(ASSIGN, VARIABLE, 3, 0)
OP(CALL_BUILTIN_1_1, CFUNC, 1, 1) OP(CALL_BUILTIN_1_1, CFUNC, 1, 1)