Make assignment work again: = and |= operators.
This commit is contained in:
1 parent
d8fad1ed9b
commit
8fe9c8a22a
3 files changed
+19
-21
No files matched your search
+18
-19
@@ -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) {
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user