Added opaque types

This commit is contained in:
Justin Ethier 2016-04-18 22:07:57 -04:00
parent 45d87b6cb0
commit baa2be0bcf
2 changed files with 15 additions and 1 deletions

View file

@ -197,6 +197,7 @@ typedef long tag_type;
#define mutex_tag 19
#define cond_var_tag 20
#define bytevector_tag 21
#define c_opaque_tag 22
#define nil NULL
#define eq(x,y) (x == y)
@ -239,6 +240,15 @@ typedef struct {gc_header_type hdr; tag_type tag; object *pvar;} cvar_type;
typedef cvar_type *cvar;
#define make_cvar(n,v) cvar_type n; n.hdr.mark = gc_color_red; n.hdr.grayed = 0; n.tag = cvar_tag; n.pvar = v;
/* C Opaque type - a wrapper around a pointer of any type.
Note this requires application code to free any memory
before an object is collected by GC. */
typedef struct {gc_header_type hdr; tag_type tag; void *ptr;} c_opaque_type;
typedef c_opaque_type *c_opaque;
#define make_c_opaque(var, ptr) c_opaque_type var; var.hdr.mark = gc_color_red; n.ndr.grayed = 0; n.tag = c_opaque_type; n.ptr = ptr;
#define opaque_ptr(x) (((c_opaque)x)->ptr)
/* Define mutex type */
typedef struct {gc_header_type hdr; tag_type tag; pthread_mutex_t lock;} mutex_type;
typedef mutex_type *mutex;

View file

@ -27,7 +27,7 @@ object Cyc_global_set(void *thd, object *glo, object value)
/* Error checking section - type mismatch, num args, etc */
/* Type names to use for error messages */
const char *tag_names[23] = { \
const char *tag_names[24] = { \
"pair" \
, "symbol" \
, "" \
@ -50,6 +50,7 @@ const char *tag_names[23] = { \
, "mutex" \
, "condition variable" \
, "bytevector" \
, "opaque" \
, "Reserved for future use" };
void Cyc_invalid_type_error(void *data, int tag, object found) {
@ -565,6 +566,9 @@ object Cyc_display(object x, FILE *port)
case cvar_tag:
Cyc_display(Cyc_get_cvar(x), port);
break;
case c_opaque_tag:
fprintf(port, "<C opaque %p>", opaque_ptr(x));
break;
case mutex_tag:
fprintf(port, "<mutex %p>", x);
break;