]> granicus.if.org Git - jq/commitdiff
Make assignment work again: = and |= operators.
authorStephen Dolan <mu@netsoc.tcd.ie>
Mon, 3 Sep 2012 14:33:59 +0000 (15:33 +0100)
committerStephen Dolan <mu@netsoc.tcd.ie>
Mon, 3 Sep 2012 14:33:59 +0000 (15:33 +0100)
c/execute.c
c/jv.h
c/opcode_list.h

index c22d1df3444b91d8434d07f2eae8c89460e587a5..0c31e072a56232763808934a6bcc42f376a52c0f 100644 (file)
@@ -24,14 +24,18 @@ int pathsize; // number of allocated elements
 
 // FIXME mem
 int path_push(stackval sv, jv val) {
-  return 0;
   int pos = sv.pathidx;
   assert(pos <= pathsize);
   assert(pos >= 0);
   if (pos == pathsize) {
-    pathsize = pathsize ? pathsize * 2 : 100;
+    int oldpathsize = pathsize;
+    pathsize = oldpathsize ? oldpathsize * 2 : 100;
     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;
   return pos + 1;
 }
@@ -251,42 +255,30 @@ jv jq_next() {
       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: {
-      assert(0);
-      /*
       stackval replacement = stack_pop();
       stackval path_end = stack_pop();
       stackval path_start = stack_pop();
+      jv_free(path_end.value);
+      jv_free(path_start.value);
 
       uint16_t level = *pc++;
       uint16_t v = *pc++;
       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);
-      */
       break;
     }
 
     case INDEX: {
       stackval t = stack_pop();
       jv k = stack_pop().value;
+      int pathidx = path_push(t, jv_copy(k));
       jv v = jv_lookup(t.value, k);
       if (1 /* fixme invalid lookups */) {
         stackval sv;
         sv.value = v;
-        sv.pathidx = 0; //FIXME path_push(t, k);
+        sv.pathidx = pathidx;
         stack_push(sv);
       } else {
         assert(0 && "bad lookup");
@@ -437,6 +429,13 @@ void jq_teardown() {
   forkable_stack_free(&fork_stk);
   forkable_stack_free(&data_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) {
diff --git a/c/jv.h b/c/jv.h
index 8fbc77abcd78640a944be11cb49c3a00d3250b2c..754f0316555dcce97feafb24be3ebf1c43451fc0 100644 (file)
--- a/c/jv.h
+++ b/c/jv.h
@@ -127,7 +127,7 @@ static jv jv_insert(jv root, jv value, jv* path, int pathlen) {
     jv_free(root);
     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));
 }
 
index 268025e8490085934c3edbb541becb2f974f76d0..7f2c144af9709c27f4afc5ec26cf93a9ae92f915 100644 (file)
@@ -14,7 +14,6 @@ OP(BACKTRACK, NONE, 0, 0)
 OP(APPEND, NONE,    2, 1)
 OP(INSERT, NONE,    4, 2)
 
-OP(ASSIGN_DBG, NONE, 3, 1)
 OP(ASSIGN, VARIABLE, 3, 0)
 
 OP(CALL_BUILTIN_1_1, CFUNC, 1, 1)