]> granicus.if.org Git - jq/commitdiff
Add LOADVN opcode.
authorStephen Dolan <mu@netsoc.tcd.ie>
Thu, 16 May 2013 13:32:18 +0000 (14:32 +0100)
committerStephen Dolan <mu@netsoc.tcd.ie>
Thu, 16 May 2013 14:02:18 +0000 (15:02 +0100)
Does a variable load, but sets the variable to be null afterwards.

execute.c
opcode_list.h

index f5bd033eef8d96dc01e09959d3859c4ef65bb5ca..8d6e76a9fd3c4e1b5a777ec91b3927fc71f49574 100644 (file)
--- a/execute.c
+++ b/execute.c
@@ -311,6 +311,23 @@ jv jq_next(jq_state *jq) {
       break;
     }
 
+      // Does a load but replaces the variable with null
+    case LOADVN: {
+      uint16_t level = *pc++;
+      uint16_t v = *pc++;
+      frame_ptr fp = frame_get_level(&jq->frame_stk, frame_current(&jq->frame_stk), level);
+      jv* var = frame_local_var(fp, v);
+      if (jq->debug_trace_enabled) {
+        printf("V%d = ", v);
+        jv_dump(jv_copy(*var), 0);
+        printf("\n");
+      }
+      jv_free(stack_pop(jq));
+      stack_push(jq, *var);
+      *var = jv_null();
+      break;
+    }
+
     case STOREV: {
       uint16_t level = *pc++;
       uint16_t v = *pc++;
index 14450c5187a6081620e0e8e823d25600449f94d9..c9730baef493f45d2c37642e915f22e592d73e0b 100644 (file)
@@ -3,6 +3,7 @@ OP(DUP,   NONE,     1, 2)
 OP(DUP2,  NONE,     2, 3)
 OP(POP,   NONE,     1, 0)
 OP(LOADV, VARIABLE, 1, 1)
+OP(LOADVN, VARIABLE, 1, 1)
 OP(STOREV, VARIABLE, 1, 0)
 OP(INDEX, NONE,     2, 1)
 OP(EACH,  NONE,     1, 1)