commit 8c5edcb07f56102922ce11898d55e82080495ad0
parent f356e6217ece3187666cc957b3b7ee2a94ad27c7
Author: William Casarin <jb55@jb55.com>
Date:   Sun, 12 Nov 2017 21:54:22 -0800
tests pass!
for now
Diffstat:
4 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/script.c b/script.c
@@ -557,7 +557,6 @@ script_eval(u8 *script, size_t script_size, struct stack *stack) {
         switch (opcode)
         {
         case OP_ADD:
-          printf("%d + %d\n", bn1->val, bn2->val);
           bn.val = bn1->val + bn2->val;
           break;
 
diff --git a/script_num.c b/script_num.c
@@ -153,16 +153,25 @@ sn_to_val(struct num *sn) {
   struct num *snref;
   int ind;
 
-  //TODO: implement return overflowed scriptnums
-  assert(!sn_overflowed(sn));
-
-  val.type = VT_SCRIPTNUM;
-  if (sn->ind > -1)
-    val.ind = sn->ind;
-  else {
-    snref = num_pool_new(&ind);
-    snref->val = sn->val;
+  if (sn_overflowed(sn)) {
+    u16 ind, len;
+    static u8 tmp[8];
+    sn_serialize(sn, tmp, 8, &len);
+    u8 *data = byte_pool_new(len, &ind);
+    memcpy(data, tmp, len);
+    val.type = VT_DATA;
     val.ind = ind;
   }
+  else
+  {
+    val.type = VT_SCRIPTNUM;
+    if (sn->ind > -1)
+      val.ind = sn->ind;
+    else {
+      snref = num_pool_new(&ind);
+      snref->val = sn->val;
+      val.ind = ind;
+    }
+  }
   return val;
 }
diff --git a/val.c b/val.c
@@ -45,10 +45,19 @@ val_serialize(struct val val, u16 *len, u8 *buf, int bufsize) {
     *len = 1;
     *buf = val.ind & 0xFF;
     return;
-  case VT_DATA:
-    assert("!implement val_serialize VT_DATA");
-    byte_pool_get(val.ind, len);
+  case VT_DATA: {
+    u8 *p;
+    p = byte_pool_get(val.ind, len);
+    if (*len <= 0xFF) {
+      *buf++ = *len & 0xFF;
+      memcpy(buf, p, *len);
+      *len = *len + 1;
+    }
+    else {
+      assert(!"serialize bigger pushdatas");
+    }
     return;
+  }
   case VT_SMALLINT:
     *len = 1;
     n = val.ind;
diff --git a/valstack.h b/valstack.h
@@ -4,6 +4,7 @@
 
 #include "op.h"
 #include "val.h"
+#include "alloc.h"
 
 static inline struct val
 stack_top_val(struct stack *stack, int ind) {