speedo, w32: Add w32-wixlib target for MSI package
[gnupg.git] / tests / gpgscm / scheme-private.h
index 0ddfdbc..7f92bda 100644 (file)
@@ -3,6 +3,7 @@
 #ifndef _SCHEME_PRIVATE_H
 #define _SCHEME_PRIVATE_H
 
+#include <stdint.h>
 #include "scheme.h"
 /*------------------ Ugly internals -----------------------------------*/
 /*------------------ Of interest only to FFI users --------------------*/
@@ -27,10 +28,6 @@ typedef struct port {
     struct {
       FILE *file;
       int closeit;
-#if SHOW_ERROR_LINE
-      int curr_line;
-      char *filename;
-#endif
     } stdio;
     struct {
       char *start;
@@ -38,26 +35,66 @@ typedef struct port {
       char *curr;
     } string;
   } rep;
+#if SHOW_ERROR_LINE
+  pointer curr_line;
+  pointer filename;
+#endif
 } port;
 
 /* cell structure */
 struct cell {
-  unsigned int _flag;
+  uintptr_t _flag;
   union {
+    num _number;
     struct {
       char   *_svalue;
       int   _length;
     } _string;
-    num _number;
     port *_port;
     foreign_func _ff;
     struct {
       struct cell *_car;
       struct cell *_cdr;
     } _cons;
+    struct {
+      size_t _length;
+      pointer _elements[0];
+    } _vector;
+    struct {
+         char *_data;
+         const foreign_object_vtable *_vtable;
+    } _foreign_object;
   } _object;
 };
 
+#if USE_HISTORY
+/* The history is a two-dimensional ring buffer.  A donut-shaped data
+ * structure.  This data structure is inspired by MIT/GNU Scheme.  */
+struct history {
+  /* Number of calls to store.  Must be a power of two.  */
+  size_t N;
+
+  /* Number of tail-calls to store in each call frame.  Must be a
+   * power of two.  */
+  size_t M;
+
+  /* Masks for fast index calculations.  */
+  size_t mask_N;
+  size_t mask_M;
+
+  /* A vector of size N containing calls.  */
+  pointer callstack;
+
+  /* A vector of size N containing vectors of size M containing tail
+   * calls.  */
+  pointer tailstacks;
+
+  /* Our current position.  */
+  size_t n;
+  size_t *m;
+};
+#endif
+
 struct scheme {
 /* arrays for segments */
 func_alloc malloc;
@@ -71,18 +108,26 @@ int tracing;
 #ifndef CELL_SEGSIZE
 #define CELL_SEGSIZE    5000  /* # of cells in one segment */
 #endif
-#ifndef CELL_NSEGMENT
-#define CELL_NSEGMENT   10    /* # of segments for cells */
+
+/* If less than # of cells are recovered in a garbage collector run,
+ * allocate a new cell segment to avoid fruitless collection cycles in
+ * the near future.  */
+#ifndef CELL_MINRECOVER
+#define CELL_MINRECOVER    (CELL_SEGSIZE >> 2)
 #endif
-char *alloc_seg[CELL_NSEGMENT];
-pointer cell_seg[CELL_NSEGMENT];
-int     last_cell_seg;
+struct cell_segment *cell_segments;
 
 /* We use 4 registers. */
 pointer args;            /* register for arguments of function */
 pointer envir;           /* stack register for current environment */
 pointer code;            /* register for current code */
 pointer dump;            /* stack register for next evaluation */
+pointer frame_freelist;
+
+#if USE_HISTORY
+struct history history;  /* we keep track of the call history for
+                          * error messages */
+#endif
 
 int interactive_repl;    /* are we in an interactive REPL? */
 
@@ -111,10 +156,17 @@ pointer FEED_TO;         /* => */
 pointer COLON_HOOK;      /* *colon-hook* */
 pointer ERROR_HOOK;      /* *error-hook* */
 pointer SHARP_HOOK;  /* *sharp-hook* */
+#if USE_COMPILE_HOOK
 pointer COMPILE_HOOK;  /* *compile-hook* */
+#endif
 
 pointer free_cell;       /* pointer to top of free cells */
 long    fcells;          /* # of free cells */
+size_t  inhibit_gc;      /* nesting of gc_disable */
+size_t  reserved_cells;  /* # of reserved cells */
+#ifndef NDEBUG
+int     reserved_lineno;   /* location of last reservation */
+#endif
 
 pointer inport;
 pointer outport;
@@ -145,19 +197,17 @@ FILE *tmpfp;
 int tok;
 int print_flag;
 pointer value;
-int op;
+unsigned int flags;
 
 void *ext_data;     /* For the benefit of foreign functions */
 long gensym_cnt;
 
-struct scheme_interface *vptr;
-void *dump_base;    /* pointer to base of allocated dump stack */
-int dump_size;      /* number of frames allocated for dump stack */
+const struct scheme_interface *vptr;
 };
 
 /* operator code */
 enum scheme_opcodes {
-#define _OP_DEF(A,B,C,D,E,OP) OP,
+#define _OP_DEF(A,B,C,D,OP) OP,
 #include "opdefines.h"
   OP_MAXDEFINED
 };
@@ -207,6 +257,10 @@ int is_environment(pointer p);
 int is_immutable(pointer p);
 void setimmutable(pointer p);
 
+int is_foreign_object(pointer p);
+const foreign_object_vtable *get_foreign_object_vtable(pointer p);
+void *get_foreign_object_data(pointer p);
+
 #ifdef __cplusplus
 }
 #endif