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 mutex_tag 19
#define cond_var_tag 20 #define cond_var_tag 20
#define bytevector_tag 21 #define bytevector_tag 21
#define c_opaque_tag 22
#define nil NULL #define nil NULL
#define eq(x,y) (x == y) #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; 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; #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 */ /* Define mutex type */
typedef struct {gc_header_type hdr; tag_type tag; pthread_mutex_t lock;} mutex_type; typedef struct {gc_header_type hdr; tag_type tag; pthread_mutex_t lock;} mutex_type;
typedef mutex_type *mutex; 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 */ /* Error checking section - type mismatch, num args, etc */
/* Type names to use for error messages */ /* Type names to use for error messages */
const char *tag_names[23] = { \ const char *tag_names[24] = { \
"pair" \ "pair" \
, "symbol" \ , "symbol" \
, "" \ , "" \
@ -50,6 +50,7 @@ const char *tag_names[23] = { \
, "mutex" \ , "mutex" \
, "condition variable" \ , "condition variable" \
, "bytevector" \ , "bytevector" \
, "opaque" \
, "Reserved for future use" }; , "Reserved for future use" };
void Cyc_invalid_type_error(void *data, int tag, object found) { 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: case cvar_tag:
Cyc_display(Cyc_get_cvar(x), port); Cyc_display(Cyc_get_cvar(x), port);
break; break;
case c_opaque_tag:
fprintf(port, "<C opaque %p>", opaque_ptr(x));
break;
case mutex_tag: case mutex_tag:
fprintf(port, "<mutex %p>", x); fprintf(port, "<mutex %p>", x);
break; break;