mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-15 16:57:35 +02:00
Doxygen comments
This commit is contained in:
parent
27b77daa87
commit
b8cd4f0035
1 changed files with 144 additions and 24 deletions
|
@ -277,7 +277,7 @@ struct gc_thread_data_t {
|
||||||
* The possible types are:
|
* The possible types are:
|
||||||
*
|
*
|
||||||
* - 0x00 - pointer (an object type)
|
* - 0x00 - pointer (an object type)
|
||||||
* - 0x01 - integer
|
* - 0x01 - integer (also known as fixnum)
|
||||||
* - 0x10 - char
|
* - 0x10 - char
|
||||||
*/
|
*/
|
||||||
/**@{*/
|
/**@{*/
|
||||||
|
@ -326,21 +326,40 @@ struct gc_thread_data_t {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \defgroup objects Object Types
|
* \defgroup objects Object Types
|
||||||
|
*
|
||||||
|
* Most Scheme data types are defined as object types.
|
||||||
|
*
|
||||||
|
* Each object type contains a header for garbage collection and a
|
||||||
|
* tag that identifies the type of object, as well as any object-specific
|
||||||
|
* fields.
|
||||||
|
*
|
||||||
|
* Most object types are allocated on the nursery (the C stack) and
|
||||||
|
* relocated to the garbage-collected heap during minor GC. It is only
|
||||||
|
* safe for an object on the nursery to be used by the thread that
|
||||||
|
* created it, as that object could be relocated at any time.
|
||||||
*/
|
*/
|
||||||
/**@{*/
|
/**@{*/
|
||||||
|
|
||||||
/* Function type */
|
/** Function type */
|
||||||
|
|
||||||
typedef void (*function_type) ();
|
typedef void (*function_type) ();
|
||||||
|
|
||||||
|
/** Variable-argument function type */
|
||||||
typedef void (*function_type_va) (int, object, object, object, ...);
|
typedef void (*function_type_va) (int, object, object, object, ...);
|
||||||
|
|
||||||
/* Define C-variable integration type */
|
/**
|
||||||
|
* Defines the C-variable integration type
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
object *pvar; /* GC assumes this is a Cyclone object! */
|
/** Variable pointer. Note GC assumes this is a Cyclone object! */
|
||||||
|
object *pvar;
|
||||||
} cvar_type;
|
} cvar_type;
|
||||||
typedef cvar_type *cvar;
|
typedef cvar_type *cvar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new cvar in the nursery
|
||||||
|
*/
|
||||||
#define make_cvar(n,v) \
|
#define make_cvar(n,v) \
|
||||||
cvar_type n; \
|
cvar_type n; \
|
||||||
n.hdr.mark = gc_color_red; \
|
n.hdr.mark = gc_color_red; \
|
||||||
|
@ -348,15 +367,20 @@ typedef cvar_type *cvar;
|
||||||
n.tag = cvar_tag; \
|
n.tag = cvar_tag; \
|
||||||
n.pvar = v;
|
n.pvar = v;
|
||||||
|
|
||||||
/* C Opaque type - a wrapper around a pointer of any type.
|
/**
|
||||||
Note this requires application code to free any memory
|
* C Opaque type - a wrapper around a pointer of any type.
|
||||||
before an object is collected by GC. */
|
* Note this requires application code to free any memory
|
||||||
|
* before an object is collected by GC.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
void *ptr; /* Can be anything, GC will not collect it */
|
/** This pointer can be anything, GC will not collect it */
|
||||||
|
void *ptr;
|
||||||
} c_opaque_type;
|
} c_opaque_type;
|
||||||
typedef c_opaque_type *c_opaque;
|
typedef c_opaque_type *c_opaque;
|
||||||
|
|
||||||
|
/** Create a new opaque in the nursery */
|
||||||
#define make_c_opaque(var, p) \
|
#define make_c_opaque(var, p) \
|
||||||
c_opaque_type var; \
|
c_opaque_type var; \
|
||||||
var.hdr.mark = gc_color_red; \
|
var.hdr.mark = gc_color_red; \
|
||||||
|
@ -364,9 +388,14 @@ typedef c_opaque_type *c_opaque;
|
||||||
var.tag = c_opaque_tag; \
|
var.tag = c_opaque_tag; \
|
||||||
var.ptr = p;
|
var.ptr = p;
|
||||||
|
|
||||||
|
/** Access the Opaque's pointer */
|
||||||
#define opaque_ptr(x) (((c_opaque)x)->ptr)
|
#define opaque_ptr(x) (((c_opaque)x)->ptr)
|
||||||
|
|
||||||
/* Define mutex type */
|
/**
|
||||||
|
* Define mutex type
|
||||||
|
*
|
||||||
|
* Mutexes are always allocated directly on the heap.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -374,7 +403,11 @@ typedef struct {
|
||||||
} mutex_type;
|
} mutex_type;
|
||||||
typedef mutex_type *mutex;
|
typedef mutex_type *mutex;
|
||||||
|
|
||||||
/* Define condition variable type */
|
/**
|
||||||
|
* Define condition variable type i
|
||||||
|
*
|
||||||
|
* Condition variables are always allocated directly on the heap.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -382,7 +415,12 @@ typedef struct {
|
||||||
} cond_var_type;
|
} cond_var_type;
|
||||||
typedef cond_var_type *cond_var;
|
typedef cond_var_type *cond_var;
|
||||||
|
|
||||||
/* Define boolean type. */
|
/**
|
||||||
|
* Define boolean type.
|
||||||
|
*
|
||||||
|
* Booleans always refer to one of the objects `boolean_t` or `boolean_f`
|
||||||
|
* which are created by the runtime.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
const tag_type tag;
|
const tag_type tag;
|
||||||
|
@ -392,8 +430,15 @@ typedef boolean_type *boolean;
|
||||||
|
|
||||||
#define boolean_desc(x) (((boolean_type *) x)->desc)
|
#define boolean_desc(x) (((boolean_type *) x)->desc)
|
||||||
|
|
||||||
/* Define symbol type. */
|
/**
|
||||||
|
* Define symbol type.
|
||||||
|
*
|
||||||
|
* Symbols are similar to strings, but only one instance of each
|
||||||
|
* unique symbol is created, so comparisons are O(1).
|
||||||
|
*
|
||||||
|
* A thread-safe symbol table is used at runtime to store all of
|
||||||
|
* the program's symbols.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
const tag_type tag;
|
const tag_type tag;
|
||||||
|
@ -408,8 +453,10 @@ static object quote_##name = NULL;
|
||||||
|
|
||||||
/* Define numeric types */
|
/* Define numeric types */
|
||||||
|
|
||||||
// Integer object type is deprecated, integers should be stored using value types instead.
|
/**
|
||||||
// This is only still here because it is used internally by the runtime.
|
* The integer object type is deprecated, integers should be stored using value types instead.
|
||||||
|
* This is only still here because it is used internally by the runtime.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -417,20 +464,33 @@ typedef struct {
|
||||||
int padding; // Prevent mem corruption if sizeof(int) < sizeof(ptr)
|
int padding; // Prevent mem corruption if sizeof(int) < sizeof(ptr)
|
||||||
} integer_type;
|
} integer_type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bignums are exact integers of unlimited precision.
|
||||||
|
* The backing store is the `mp_int` data type from LibTomMath.
|
||||||
|
*
|
||||||
|
* Note memory for `mp_int` is allocated via `malloc`, so bignums must
|
||||||
|
* always be allocated on Cyclone's heap.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
mp_int bn;
|
mp_int bn;
|
||||||
} bignum_type;
|
} bignum_type;
|
||||||
|
|
||||||
|
/** Allocate a new bignum on the heap */
|
||||||
#define alloc_bignum(data, p) \
|
#define alloc_bignum(data, p) \
|
||||||
bignum_type *p = gc_alloc_bignum((gc_thread_data *)data);
|
bignum_type *p = gc_alloc_bignum((gc_thread_data *)data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Double-precision floating point type, also known as a flonum.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
double value;
|
double value;
|
||||||
} double_type;
|
} double_type;
|
||||||
|
|
||||||
|
/** Create a new double in the nursery */
|
||||||
#define make_double(n,v) \
|
#define make_double(n,v) \
|
||||||
double_type n; \
|
double_type n; \
|
||||||
n.hdr.mark = gc_color_red; \
|
n.hdr.mark = gc_color_red; \
|
||||||
|
@ -438,16 +498,26 @@ typedef struct {
|
||||||
n.tag = double_tag; \
|
n.tag = double_tag; \
|
||||||
n.value = v;
|
n.value = v;
|
||||||
|
|
||||||
|
/** Assign given double value to the given double object pointer */
|
||||||
#define assign_double(pobj,v) \
|
#define assign_double(pobj,v) \
|
||||||
((double_type *)pobj)->hdr.mark = gc_color_red; \
|
((double_type *)pobj)->hdr.mark = gc_color_red; \
|
||||||
((double_type *)pobj)->hdr.grayed = 0; \
|
((double_type *)pobj)->hdr.grayed = 0; \
|
||||||
((double_type *)pobj)->tag = double_tag; \
|
((double_type *)pobj)->tag = double_tag; \
|
||||||
double_value(pobj) = v;
|
double_value(pobj) = v;
|
||||||
|
|
||||||
|
/** Access the integer_type integer value directly */
|
||||||
#define integer_value(x) (((integer_type *) x)->value)
|
#define integer_value(x) (((integer_type *) x)->value)
|
||||||
|
|
||||||
|
/** Access the double directly */
|
||||||
#define double_value(x) (((double_type *) x)->value)
|
#define double_value(x) (((double_type *) x)->value)
|
||||||
|
|
||||||
|
/** Access a bignum's `mp_int` directly */
|
||||||
#define bignum_value(x) (((bignum_type *) x)->bn)
|
#define bignum_value(x) (((bignum_type *) x)->bn)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This enumeration complements the comparison types from LibTomMath,
|
||||||
|
* and provides constants for each of the comparison operators.
|
||||||
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CYC_BN_LTE = -2
|
CYC_BN_LTE = -2
|
||||||
, CYC_BN_LT = MP_LT
|
, CYC_BN_LT = MP_LT
|
||||||
|
@ -456,13 +526,15 @@ typedef enum {
|
||||||
, CYC_BN_GTE = 2
|
, CYC_BN_GTE = 2
|
||||||
} bn_cmp_type;
|
} bn_cmp_type;
|
||||||
|
|
||||||
/* Define string type */
|
/** Define the string type */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
int len;
|
int len;
|
||||||
char *str;
|
char *str;
|
||||||
} string_type;
|
} string_type;
|
||||||
|
|
||||||
|
/** Create a new string in the nursery */
|
||||||
#define make_string(cs, s) string_type cs; \
|
#define make_string(cs, s) string_type cs; \
|
||||||
{ int len = strlen(s); \
|
{ int len = strlen(s); \
|
||||||
cs.hdr.mark = gc_color_red; \
|
cs.hdr.mark = gc_color_red; \
|
||||||
|
@ -471,6 +543,11 @@ typedef struct {
|
||||||
cs.len = len; \
|
cs.len = len; \
|
||||||
cs.str = alloca(sizeof(char) * (len + 1)); \
|
cs.str = alloca(sizeof(char) * (len + 1)); \
|
||||||
memcpy(cs.str, s, len + 1);}
|
memcpy(cs.str, s, len + 1);}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new string with the given length
|
||||||
|
* (so it does not need to be computed)
|
||||||
|
*/
|
||||||
#define make_string_with_len(cs, s, length) string_type cs; \
|
#define make_string_with_len(cs, s, length) string_type cs; \
|
||||||
{ int len = length; \
|
{ int len = length; \
|
||||||
cs.hdr.mark = gc_color_red; \
|
cs.hdr.mark = gc_color_red; \
|
||||||
|
@ -479,12 +556,20 @@ typedef struct {
|
||||||
cs.str = alloca(sizeof(char) * (len + 1)); \
|
cs.str = alloca(sizeof(char) * (len + 1)); \
|
||||||
memcpy(cs.str, s, len); \
|
memcpy(cs.str, s, len); \
|
||||||
cs.str[len] = '\0';}
|
cs.str[len] = '\0';}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a string object using the given C string and length.
|
||||||
|
* No allocation is done for the given C string.
|
||||||
|
*/
|
||||||
#define make_string_noalloc(cs, s, length) string_type cs; \
|
#define make_string_noalloc(cs, s, length) string_type cs; \
|
||||||
{ cs.hdr.mark = gc_color_red; cs.hdr.grayed = 0; \
|
{ cs.hdr.mark = gc_color_red; cs.hdr.grayed = 0; \
|
||||||
cs.tag = string_tag; cs.len = length; \
|
cs.tag = string_tag; cs.len = length; \
|
||||||
cs.str = s; }
|
cs.str = s; }
|
||||||
|
|
||||||
|
/** Get the length of a string */
|
||||||
#define string_len(x) (((string_type *) x)->len)
|
#define string_len(x) (((string_type *) x)->len)
|
||||||
|
|
||||||
|
/** Get a string object's C string */
|
||||||
#define string_str(x) (((string_type *) x)->str)
|
#define string_str(x) (((string_type *) x)->str)
|
||||||
|
|
||||||
/* I/O types */
|
/* I/O types */
|
||||||
|
@ -493,6 +578,8 @@ typedef struct {
|
||||||
// consider http://stackoverflow.com/questions/6206893/how-to-implement-char-ready-in-c
|
// consider http://stackoverflow.com/questions/6206893/how-to-implement-char-ready-in-c
|
||||||
// TODO: a simple wrapper around FILE may not be good enough long-term
|
// TODO: a simple wrapper around FILE may not be good enough long-term
|
||||||
// TODO: how exactly mode will be used. need to know r/w, bin/txt
|
// TODO: how exactly mode will be used. need to know r/w, bin/txt
|
||||||
|
|
||||||
|
/** The port object type */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -502,6 +589,7 @@ typedef struct {
|
||||||
size_t mem_buf_len;
|
size_t mem_buf_len;
|
||||||
} port_type;
|
} port_type;
|
||||||
|
|
||||||
|
/** Create a new port object in the nursery */
|
||||||
#define make_port(p,f,m) \
|
#define make_port(p,f,m) \
|
||||||
port_type p; \
|
port_type p; \
|
||||||
p.hdr.mark = gc_color_red; \
|
p.hdr.mark = gc_color_red; \
|
||||||
|
@ -512,8 +600,7 @@ typedef struct {
|
||||||
p.mem_buf = NULL; \
|
p.mem_buf = NULL; \
|
||||||
p.mem_buf_len = 0;
|
p.mem_buf_len = 0;
|
||||||
|
|
||||||
/* Vector type */
|
/** Vector type */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -522,6 +609,7 @@ typedef struct {
|
||||||
} vector_type;
|
} vector_type;
|
||||||
typedef vector_type *vector;
|
typedef vector_type *vector;
|
||||||
|
|
||||||
|
/** Create a new vector in the nursery */
|
||||||
#define make_empty_vector(v) \
|
#define make_empty_vector(v) \
|
||||||
vector_type v; \
|
vector_type v; \
|
||||||
v.hdr.mark = gc_color_red; \
|
v.hdr.mark = gc_color_red; \
|
||||||
|
@ -530,8 +618,12 @@ typedef vector_type *vector;
|
||||||
v.num_elements = 0; \
|
v.num_elements = 0; \
|
||||||
v.elements = NULL;
|
v.elements = NULL;
|
||||||
|
|
||||||
/* Bytevector type */
|
/**
|
||||||
|
* Bytevector type
|
||||||
|
*
|
||||||
|
* Bytevectors are similar to regular vectors, but instead of containing
|
||||||
|
* objects, each bytevector member is a 8-bit integer.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -540,6 +632,7 @@ typedef struct {
|
||||||
} bytevector_type;
|
} bytevector_type;
|
||||||
typedef bytevector_type *bytevector;
|
typedef bytevector_type *bytevector;
|
||||||
|
|
||||||
|
/** Create a new bytevector in the nursery */
|
||||||
#define make_empty_bytevector(v) \
|
#define make_empty_bytevector(v) \
|
||||||
bytevector_type v; \
|
bytevector_type v; \
|
||||||
v.hdr.mark = gc_color_red; \
|
v.hdr.mark = gc_color_red; \
|
||||||
|
@ -549,7 +642,14 @@ typedef bytevector_type *bytevector;
|
||||||
v.data = NULL;
|
v.data = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pair (cons) type
|
* The pair (cons) type.
|
||||||
|
*
|
||||||
|
* Contrary to popular belief, Scheme does not actually have a list type.
|
||||||
|
*
|
||||||
|
* Instead there is a pair object composed two objects, the `car` and `cdr`.
|
||||||
|
* A list can be created by storing values in the `car` and a pointer to
|
||||||
|
* the rest of the list in `cdr`. A `NULL` in the `cdr` indicates the end
|
||||||
|
* of a list.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
|
@ -560,6 +660,7 @@ typedef struct {
|
||||||
typedef pair_type *list;
|
typedef pair_type *list;
|
||||||
typedef pair_type *pair;
|
typedef pair_type *pair;
|
||||||
|
|
||||||
|
/** Create a new pair in the nursery */
|
||||||
#define make_pair(n,a,d) \
|
#define make_pair(n,a,d) \
|
||||||
pair_type n; \
|
pair_type n; \
|
||||||
n.hdr.mark = gc_color_red; \
|
n.hdr.mark = gc_color_red; \
|
||||||
|
@ -575,9 +676,15 @@ typedef pair_type *pair;
|
||||||
n->pair_car = a; \
|
n->pair_car = a; \
|
||||||
n->pair_cdr = d;
|
n->pair_cdr = d;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a pair with a single value.
|
||||||
|
* This is useful to create an object that can be modified.
|
||||||
|
*/
|
||||||
#define make_cell(n,a) make_pair(n,a,NULL);
|
#define make_cell(n,a) make_pair(n,a,NULL);
|
||||||
|
|
||||||
|
/** Unsafely access a pair's `car` */
|
||||||
#define car(x) (((pair_type *) x)->pair_car)
|
#define car(x) (((pair_type *) x)->pair_car)
|
||||||
|
/** Unsafely access a pair's `cdr` */
|
||||||
#define cdr(x) (((pair_type *) x)->pair_cdr)
|
#define cdr(x) (((pair_type *) x)->pair_cdr)
|
||||||
#define caar(x) (car(car(x)))
|
#define caar(x) (car(car(x)))
|
||||||
#define cadr(x) (car(cdr(x)))
|
#define cadr(x) (car(cdr(x)))
|
||||||
|
@ -640,18 +747,22 @@ typedef pair_type *pair;
|
||||||
|
|
||||||
/* Closure types */
|
/* Closure types */
|
||||||
|
|
||||||
|
/** Closure for macro */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
function_type fn;
|
function_type fn;
|
||||||
int num_args;
|
int num_args;
|
||||||
} macro_type;
|
} macro_type;
|
||||||
|
|
||||||
|
/** A closed-over function with no variables */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
function_type fn;
|
function_type fn;
|
||||||
int num_args;
|
int num_args;
|
||||||
} closure0_type;
|
} closure0_type;
|
||||||
|
/** A closed-over function with one variable */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -659,6 +770,7 @@ typedef struct {
|
||||||
int num_args;
|
int num_args;
|
||||||
object element;
|
object element;
|
||||||
} closure1_type;
|
} closure1_type;
|
||||||
|
/** A closed-over function with zero or more closed-over variables */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -699,7 +811,10 @@ typedef closure0_type *macro;
|
||||||
c.num_args = -1; \
|
c.num_args = -1; \
|
||||||
c.element = a;
|
c.element = a;
|
||||||
|
|
||||||
/* Primitive types */
|
/**
|
||||||
|
* The primitive type
|
||||||
|
* Primitives are functions built into the runtime.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
@ -715,7 +830,12 @@ static const object primitive_##name = &name##_primitive
|
||||||
#define prim(x) (x && ((primitive)x)->tag == primitive_tag)
|
#define prim(x) (x && ((primitive)x)->tag == primitive_tag)
|
||||||
#define prim_name(x) (((primitive_type *) x)->desc)
|
#define prim_name(x) (((primitive_type *) x)->desc)
|
||||||
|
|
||||||
/* All constant-size objects */
|
/**
|
||||||
|
* A union of all the constant-size objects.
|
||||||
|
*
|
||||||
|
* This type is used internally to (for example) pass a pointer
|
||||||
|
* to an inline function that might need to use it for an allocation.
|
||||||
|
*/
|
||||||
typedef union {
|
typedef union {
|
||||||
boolean_type boolean_t;
|
boolean_type boolean_t;
|
||||||
pair_type pair_t;
|
pair_type pair_t;
|
||||||
|
|
Loading…
Add table
Reference in a new issue