mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-09 22:17:33 +02:00
Added opaque types
This commit is contained in:
parent
45d87b6cb0
commit
baa2be0bcf
2 changed files with 15 additions and 1 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue