altos/lisp: Overflow int computations to float
[fw/altos] / src / lisp / ao_lisp_mem.c
index f333073a339f920db13348227cc6673ece557c97..3a704380d715ac53b08c7532e1edda482ff64728 100644 (file)
@@ -148,6 +148,7 @@ struct ao_lisp_root {
 
 static struct ao_lisp_cons     *save_cons[2];
 static char                    *save_string[2];
+static struct ao_lisp_frame    *save_frame[1];
 static ao_poly                 save_poly[3];
 
 static const struct ao_lisp_root       ao_lisp_root[] = {
@@ -167,6 +168,10 @@ static const struct ao_lisp_root   ao_lisp_root[] = {
                .type = &ao_lisp_string_type,
                .addr = (void **) &save_string[1],
        },
+       {
+               .type = &ao_lisp_frame_type,
+               .addr = (void **) &save_frame[0],
+       },
        {
                .type = NULL,
                .addr = (void **) (void *) &save_poly[0]
@@ -455,10 +460,12 @@ static const struct ao_lisp_type *ao_lisp_types[AO_LISP_NUM_TYPE] = {
        [AO_LISP_ATOM] = &ao_lisp_atom_type,
        [AO_LISP_BUILTIN] = &ao_lisp_builtin_type,
        [AO_LISP_FRAME] = &ao_lisp_frame_type,
+       [AO_LISP_FRAME_VALS] = &ao_lisp_frame_vals_type,
        [AO_LISP_LAMBDA] = &ao_lisp_lambda_type,
        [AO_LISP_STACK] = &ao_lisp_stack_type,
        [AO_LISP_BOOL] = &ao_lisp_bool_type,
        [AO_LISP_BIGINT] = &ao_lisp_bigint_type,
+       [AO_LISP_FLOAT] = &ao_lisp_float_type,
 };
 
 static int
@@ -494,6 +501,7 @@ ao_lisp_collect(uint8_t style)
 
        MDBG_MOVE("collect %d\n", ao_lisp_collects[style]);
 #endif
+       MDBG_DO(ao_lisp_frame_write(ao_lisp_frame_poly(ao_lisp_frame_global)));
 
        /* The first time through, we're doing a full collect */
        if (ao_lisp_last_top == 0)
@@ -619,6 +627,29 @@ ao_lisp_collect(uint8_t style)
  * Mark interfaces for objects
  */
 
+
+/*
+ * Mark a block of memory with an explicit size
+ */
+
+int
+ao_lisp_mark_block(void *addr, int size)
+{
+       int offset;
+       if (!AO_LISP_IS_POOL(addr))
+               return 1;
+
+       offset = pool_offset(addr);
+       MDBG_MOVE("mark memory %d\n", MDBG_OFFSET(addr));
+       if (busy(ao_lisp_busy, offset)) {
+               MDBG_MOVE("already marked\n");
+               return 1;
+       }
+       mark(ao_lisp_busy, offset);
+       note_chunk(offset, size);
+       return 0;
+}
+
 /*
  * Note a reference to memory and collect information about a few
  * object sizes at a time
@@ -845,6 +876,7 @@ ao_lisp_alloc(int size)
        }
        addr = ao_lisp_pool + ao_lisp_top;
        ao_lisp_top += size;
+       MDBG_MOVE("alloc %d size %d\n", MDBG_OFFSET(addr), size);
        return addr;
 }
 
@@ -890,3 +922,16 @@ ao_lisp_string_fetch(int id)
        return string;
 }
 
+void
+ao_lisp_frame_stash(int id, struct ao_lisp_frame *frame)
+{
+       save_frame[id] = frame;
+}
+
+struct ao_lisp_frame *
+ao_lisp_frame_fetch(int id)
+{
+       struct ao_lisp_frame *frame = save_frame[id];
+       save_frame[id] = NULL;
+       return frame;
+}