mirror of
https://github.com/ProgramSnail/Lama.git
synced 2025-12-06 06:48:48 +00:00
Removed extra word in sexp
This commit is contained in:
parent
dd7cbc7869
commit
3937ecf387
4 changed files with 114 additions and 86 deletions
|
|
@ -7,20 +7,15 @@
|
|||
//#define FULL_INVARIANT_CHECKS
|
||||
|
||||
#define STRING_TAG 0x00000001
|
||||
//# define STRING_TAG 0x00000000
|
||||
#define ARRAY_TAG 0x00000003
|
||||
//# define ARRAY_TAG 0x00000002
|
||||
#define SEXP_TAG 0x00000005
|
||||
//# define SEXP_TAG 0x00000004
|
||||
#define CLOSURE_TAG 0x00000007
|
||||
//# define CLOSURE_TAG 0x00000006
|
||||
#define UNBOXED_TAG 0x00000009 // Not actually a data_header; used to return from LkindOf
|
||||
|
||||
#define LEN(x) ((x & 0xFFFFFFF8) >> 3)
|
||||
#define TAG(x) (x & 0x00000007)
|
||||
//# define TAG(x) (x & 0x00000006)
|
||||
|
||||
#define SEXP_ONLY_HEADER_SZ (2 * sizeof(int))
|
||||
#define SEXP_ONLY_HEADER_SZ (sizeof(int))
|
||||
|
||||
#ifndef FULL_INVARIANT_CHECKS
|
||||
# define DATA_HEADER_SZ (sizeof(size_t) + sizeof(int))
|
||||
|
|
@ -31,7 +26,7 @@
|
|||
#define MEMBER_SIZE sizeof(int)
|
||||
|
||||
#define TO_DATA(x) ((data *)((char *)(x)-DATA_HEADER_SZ))
|
||||
#define TO_SEXP(x) ((sexp *)((char *)(x)-DATA_HEADER_SZ - SEXP_ONLY_HEADER_SZ))
|
||||
#define TO_SEXP(x) ((sexp *)((char *)(x)-DATA_HEADER_SZ))
|
||||
|
||||
#define UNBOXED(x) (((int)(x)) & 0x0001)
|
||||
#define UNBOX(x) (((int)(x)) >> 1)
|
||||
|
|
@ -60,11 +55,19 @@ typedef struct {
|
|||
} data;
|
||||
|
||||
typedef struct {
|
||||
// duplicates contents.data_header in order to be able to understand if it is s-exp during iteration over heap
|
||||
int sexp_header;
|
||||
// stores hashed s-expression constructor name
|
||||
int tag;
|
||||
data contents;
|
||||
// store tag in the last three bits to understand what structure this is, other bits are filled with
|
||||
// other utility info (i.e., size for array, number of fields for s-expression)
|
||||
int data_header;
|
||||
|
||||
#ifdef FULL_INVARIANT_CHECKS
|
||||
size_t id;
|
||||
#endif
|
||||
|
||||
// last bit is used as MARK-BIT, the rest are used to store address where object should move
|
||||
// last bit can be used because due to alignment we can assume that last two bits are always 0's
|
||||
size_t forward_address;
|
||||
int tag;
|
||||
int contents[0];
|
||||
} sexp;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue