-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathpyrite-lib.h
167 lines (135 loc) · 4.49 KB
/
pyrite-lib.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/* Pyrite: a BASIC "compiler" implemented entirely using the C
* macro system
*
* All components are in the public domain
*
* This file declares the few functions needed by the Pyrite runtime
* (mainly GC and exceptions)
*/
#ifndef PYRITE_LIB_H
#define PYRITE_LIB_H
#include <stdlib.h>
#include <stdint.h>
#include <setjmp.h>
#include <string.h>
/* */
#include "cmacros.h"
// TODO
#define THREADLOCAL
// Dummy GC markers for primitive types
#define _gc_Markint(x)
#define _gc_Markshort(x)
#define _gc_Markchar(x)
#define _gc_Markint64(x)
#define _gc_Markint32(x)
#define _gc_Markfloat(x)
#define _gc_Markdouble(x)
#define _gc_Markpointer(x)
#define _gc_MarkintArray _gc_Mark_primitiveArray
#define _gc_MarkshortArray _gc_Mark_primitiveArray
#define _gc_MarkcharArray _gc_Mark_primitiveArray
#define _gc_Markint64Array _gc_Mark_primitiveArray
#define _gc_Markint32Array _gc_Mark_primitiveArray
#define _gc_MarkfloatArray _gc_Mark_primitiveArray
#define _gc_MarkdoubleArray _gc_Mark_primitiveArray
#define _gc_MarkpointerArray _gc_Mark_primitiveArray
#define _gc_Markstring _gc_Mark_primitiveArray
#define _gc_MarkstringArray _gc_Mark_ObjectArray
// Dummy GC pushes
#define _gc_Pushint(x)
#define _gc_Pushshort(x)
#define _gc_Pushchar(x)
#define _gc_Pushint64(x)
#define _gc_Pushint32(x)
#define _gc_Pushfloat(x)
#define _gc_Pushdouble(x)
#define _gc_Pushpointer(x)
#define _gc_Pushvoid(x)
#define _gc_PushintArray(A) _gc_Push_Variable((_Object *)A)
#define _gc_PushshortArray(A) _gc_Push_Variable((_Object *)A)
#define _gc_PushcharArray(A) _gc_Push_Variable((_Object *)A)
#define _gc_Pushint64Array(A) _gc_Push_Variable((_Object *)A)
#define _gc_Pushint32Array(A) _gc_Push_Variable((_Object *)A)
#define _gc_PushfloatArray(A) _gc_Push_Variable((_Object *)A)
#define _gc_PushdoubleArray(A) _gc_Push_Variable((_Object *)A)
#define _gc_PushpointerArray(A) _gc_Push_Variable((_Object *)A)
#define _gc_Pushstring(A) _gc_Push_Variable((_Object *)A)
#define _gc_PushstringArray(A) _gc_Push_Variable((_Object *)A)
typedef void * pointer;
typedef int32_t int32;
typedef int64_t int64;
typedef struct objdata * objdataP;
typedef objdataP * _Object;
struct objdata {
unsigned int d:1, l:1;
char * ttag;
void(*mark)(_Object);
void(*del)(_Object);
size_t sz;
_Object nx;
};
typedef struct MetaArray { objdataP __meta; size_t len, es; void * data; } * MetaArray;
#define arraytype(T) typedef struct T##Array { struct MetaArray arr; T data[]; } * T##Array;
#define functype(N, T) typedef M_REST T(*N)M_FIRST T; arraytype(N) \
static inline void _gc_Push##N(void * _) {} \
static void(* const _gc_Mark##N##Array)(_Object) = _gc_Mark_primitiveArray; \
static inline void _gc_Push##N##Array(N##Array * a) {_gc_Push_Variable((_Object *)a);}
#define new(T) (T)GC_Allocate(sizeof(struct T), _gc_Mark##T, #T)
#define array(T, S) (T##Array)_gc_MakeArray(GC_Allocate(sizeof(struct T##Array) + (S) * sizeof(T), \
_gc_Mark##T##Array, M_STR_(T##Array)), S, sizeof(T))
#define setfinaliser(OBJ) _gc_SetFinaliser(OBJ)
#define arraylen(A) ((A)->arr.len)
THREADLOCAL static MetaArray _ArrayTmp;
//#define elem(A, E) ((_ArrayTmp = (MetaArray)(A))[_arrayBoundsCheck(E)])
#define elem(A, E) (A)->data[E]
arraytype(int)
arraytype(short)
arraytype(char)
arraytype(int64)
arraytype(int32)
arraytype(float)
arraytype(double)
arraytype(pointer)
typedef charArray string;
arraytype(string)
struct _VarSlot {
_Object * var;
struct _VarSlot * nx;
};
enum _Frame_Type { FT_CALL_FRAME, FT_BLK_FRAME, FT_TRY_FRAME };
struct _Frame {
enum _Frame_Type tag;
struct _Frame * prev;
struct _VarSlot * vars;
jmp_buf * bufp;
};
extern struct _Frame _rootFrame;
extern struct _Frame * _topFrame;
extern _Object _currentException;
enum GC_Mode { GC_ON, GC_OFF };
void GC_Init(void);
void * GC_Allocate(size_t, void(*)(_Object), char *);
size_t GC_Collect(void);
void GC_SetMode(enum GC_Mode);
void GC_SetThreshold(size_t);
void _gc_FreeDefault(_Object);
void _gc_Mark_primitiveArray(_Object);
void _gc_Mark_ObjectArray(_Object);
void _gc_SetFinaliser(_Object, void(*)(_Object));
void _gc_LockObject(_Object, unsigned int);
void _gc_Push_Variable(_Object *);
void _gc_Push_Frame(struct _Frame *, enum _Frame_Type);
void _gc_Pop_Frame(enum _Frame_Type);
void ThrowException(_Object);
_Object GetException(void);
MetaArray _gc_MakeArray(_Object, size_t, size_t);
//int _arrayBoundsCheck(int);
string str(const char *);
int len(string);
string substr(string, unsigned int, unsigned int);
string join(string, string);
string upper(string);
string lower(string);
void print(string);
void write(string);
#endif