-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathagate.h
284 lines (224 loc) · 8.56 KB
/
agate.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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
// SPDX-License-Identifier: MIT
// Copyright (c) 2013-2021 Robert Nystrom and Wren Contributors
// Copyright (c) 2022 Julien Bernard
#ifndef AGATE_H
#define AGATE_H
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define AGATE_VERSION_MAJOR 0
#define AGATE_VERSION_MINOR 1
#define AGATE_VERSION_PATCH 0
#define AGATE_VERSION_STRING "0.1.0"
// tag::vm[]
typedef struct AgateVM AgateVM;
// end::vm[]
typedef struct AgateHandle AgateHandle;
// tag::assert[]
typedef enum {
AGATE_ASSERT_ABORT,
AGATE_ASSERT_NIL,
AGATE_ASSERT_NONE,
} AgateAssertHandling;
// end::assert[]
// tag::realloc[]
typedef void * (*AgateReallocFunc)(void *ptr, ptrdiff_t size, void *user_data);
// end::realloc[]
// tag::number_parsing[]
typedef bool (*AgateParseIntFunc)(const char *text, ptrdiff_t size, int base, int64_t *result);
typedef bool (*AgateParseFloatFunc)(const char *text, ptrdiff_t size, double *result);
// end::number_parsing[]
// tag::print[]
typedef void (*AgatePrintFunc)(AgateVM *vm, const char* text);
// end::print[]
// tag::write[]
typedef void (*AgateWriteFunc)(AgateVM *vm, uint8_t byte);
// end::write[]
// tag::error[]
typedef enum {
AGATE_ERROR_COMPILE,
AGATE_ERROR_RUNTIME,
AGATE_ERROR_STACKTRACE,
} AgateErrorKind;
typedef void (*AgateErrorFunc)(AgateVM *vm, AgateErrorKind kind, const char *unit_name, int line, const char *message);
// end::error[]
// tag::input[]
typedef bool (*AgateInputFunc)(AgateVM *vm, char *buffer, size_t size);
// end::input[]
// tag::unit_handler[]
typedef const char *(*AgateUnitLoadFunc)(const char *name, void *user_data);
typedef void (*AgateUnitReleaseFunc)(const char *source, void *user_data);
typedef struct {
AgateUnitLoadFunc load;
AgateUnitReleaseFunc release;
void *user_data;
} AgateUnitHandler;
typedef AgateUnitHandler (*AgateUnitHandlerFunc)(AgateVM *vm, const char *name);
// end::unit_handler[]
// tag::foreign_class_handler[]
typedef ptrdiff_t (*AgateForeignAllocateFunc)(AgateVM *vm, const char *unit_name, const char *class_name);
typedef uint64_t (*AgateForeignTagFunc)(AgateVM *vm, const char *unit_name, const char *class_name);
typedef void (*AgateForeignDestroyFunc)(AgateVM *vm, const char *unit_name, const char *class_name, void *data);
typedef struct {
AgateForeignAllocateFunc allocate;
AgateForeignTagFunc tag;
AgateForeignDestroyFunc destroy;
} AgateForeignClassHandler;
typedef AgateForeignClassHandler (*AgateForeignClassHandlerFunc)(AgateVM *vm, const char *unit_name, const char *class_name);
// end::foreign_class_handler[]
// tag::foreign_method_handler[]
typedef void (*AgateForeignMethodFunc)(AgateVM *vm);
typedef enum {
AGATE_FOREIGN_METHOD_INSTANCE,
AGATE_FOREIGN_METHOD_CLASS,
} AgateForeignMethodKind;
typedef AgateForeignMethodFunc (*AgateForeignMethodHandlerFunc)(AgateVM *vm, const char *unit_name, const char *class_name, AgateForeignMethodKind kind, const char *signature);
// end::foreign_method_handler[]
// tag::config[]
typedef struct {
AgateReallocFunc reallocate;
AgateUnitHandlerFunc unit_handler;
AgateForeignClassHandlerFunc foreign_class_handler;
AgateForeignMethodHandlerFunc foreign_method_handler;
AgateParseIntFunc parse_int;
AgateParseFloatFunc parse_float;
AgateAssertHandling assert_handling;
AgatePrintFunc print;
AgateWriteFunc write;
AgateErrorFunc error;
AgateInputFunc input;
void *user_data;
} AgateConfig;
// end::config[]
// tag::status[]
typedef enum {
AGATE_STATUS_OK,
AGATE_STATUS_COMPILE_ERROR,
AGATE_STATUS_RUNTIME_ERROR,
} AgateStatus;
// end::status[]
// tag::type[]
typedef enum {
AGATE_TYPE_UNKNOWN,
AGATE_TYPE_ARRAY,
AGATE_TYPE_BOOL,
AGATE_TYPE_CHAR,
AGATE_TYPE_FLOAT,
AGATE_TYPE_FOREIGN,
AGATE_TYPE_INT,
AGATE_TYPE_MAP,
AGATE_TYPE_NIL,
AGATE_TYPE_STRING,
AGATE_TYPE_TUPLE,
} AgateType;
// end::type[]
// tag::initialize[]
void agateConfigInitialize(AgateConfig *config);
// end::initialize[]
// tag::vm_new[]
AgateVM *agateNewVM(const AgateConfig *config);
// end::vm_new[]
// tag::vm_delete[]
void agateDeleteVM(AgateVM *vm);
// end::vm_delete[]
void agateSetArgs(AgateVM *vm, int argc, const char *argv[]);
void *agateMemoryAllocate(AgateVM *vm, void *ptr, ptrdiff_t size);
// tag::handle_call[]
AgateHandle *agateMakeCallHandle(AgateVM *vm, const char *signature);
// end::handle_call[]
// tag::stack[]
void agateStackStart(AgateVM *vm);
void agateStackFinish(AgateVM *vm);
// end::stack[]
// tag::call_handle[]
AgateStatus agateCallHandle(AgateVM *vm, AgateHandle *method);
// end::call_handle[]
// tag::call_string[]
AgateStatus agateCallString(AgateVM *vm, const char *unit, const char *source);
// end::call_string[]
// tag::slot_management[]
ptrdiff_t agateSlotCount(AgateVM *vm);
AgateType agateSlotType(AgateVM *vm, ptrdiff_t slot);
void agateSlotCopy(AgateVM *vm, ptrdiff_t dest, ptrdiff_t orig);
// end::slot_management[]
#define AGATE_RETURN_SLOT 0
// tag::slot_for_call[]
ptrdiff_t agateSlotAllocate(AgateVM *vm);
ptrdiff_t agateSlotAllocateMany(AgateVM *vm, ptrdiff_t count);
// end::slot_for_call[]
// tag::slot_get_primitive[]
bool agateSlotGetBool(AgateVM *vm, ptrdiff_t slot);
uint32_t agateSlotGetChar(AgateVM *vm, ptrdiff_t slot);
int64_t agateSlotGetInt(AgateVM *vm, ptrdiff_t slot);
double agateSlotGetFloat(AgateVM *vm, ptrdiff_t slot);
void *agateSlotGetForeign(AgateVM *vm, ptrdiff_t slot);
uint64_t agateSlotGetForeignTag(AgateVM *vm, ptrdiff_t slot);
const char *agateSlotGetString(AgateVM *vm, ptrdiff_t slot);
const char *agateSlotGetStringSize(AgateVM *vm, ptrdiff_t slot, ptrdiff_t *size);
// end::slot_get_primitive[]
// tag::handle_get[]
AgateHandle *agateSlotGetHandle(AgateVM *vm, ptrdiff_t slot);
// end::handle_get[]
// tag::handle_release[]
void agateReleaseHandle(AgateVM *vm, AgateHandle *handle);
// end::handle_release[]
// tag::slot_set_primitive[]
void agateSlotSetNil(AgateVM *vm, ptrdiff_t slot);
void agateSlotSetBool(AgateVM *vm, ptrdiff_t slot, bool value);
void agateSlotSetChar(AgateVM *vm, ptrdiff_t slot, uint32_t value);
void agateSlotSetInt(AgateVM *vm, ptrdiff_t slot, int64_t value);
void agateSlotSetFloat(AgateVM *vm, ptrdiff_t slot, double value);
void *agateSlotSetForeign(AgateVM *vm, ptrdiff_t slot, ptrdiff_t class_slot);
void agateSlotSetString(AgateVM *vm, ptrdiff_t slot, const char *text);
void agateSlotSetStringSize(AgateVM *vm, ptrdiff_t slot, const char *text, ptrdiff_t size);
// end::slot_set_primitive[]
// tag::handle_set[]
void agateSlotSetHandle(AgateVM *vm, ptrdiff_t slot, AgateHandle *handle);
// end::handle_set[]
// tag::slot_array[]
void agateSlotArrayNew(AgateVM *vm, ptrdiff_t slot);
ptrdiff_t agateSlotArraySize(AgateVM *vm, ptrdiff_t slot);
void agateSlotArrayGet(AgateVM *vm, ptrdiff_t array_slot, ptrdiff_t index, ptrdiff_t element_slot);
void agateSlotArraySet(AgateVM *vm, ptrdiff_t array_slot, ptrdiff_t index, ptrdiff_t element_slot);
void agateSlotArrayInsert(AgateVM *vm, ptrdiff_t array_slot, ptrdiff_t index, ptrdiff_t element_slot);
void agateSlotArrayErase(AgateVM *vm, ptrdiff_t array_slot, ptrdiff_t index, ptrdiff_t element_slot);
// end::slot_array[]
// tag::slot_map[]
void agateSlotMapNew(AgateVM *vm, ptrdiff_t slot);
ptrdiff_t agateSlotMapSize(AgateVM *vm, ptrdiff_t slot);
bool agateSlotMapContains(AgateVM *vm, ptrdiff_t map_slot, ptrdiff_t key_slot);
void agateSlotMapGet(AgateVM *vm, ptrdiff_t map_slot, ptrdiff_t key_slot, ptrdiff_t value_slot);
void agateSlotMapSet(AgateVM *vm, ptrdiff_t map_slot, ptrdiff_t key_slot, ptrdiff_t value_slot);
void agateSlotMapErase(AgateVM *vm, ptrdiff_t map_slot, ptrdiff_t key_slot, ptrdiff_t value_slot);
// end::slot_map[]
// tag::slot_tuple[]
ptrdiff_t agateSlotTupleSize(AgateVM *vm, ptrdiff_t slot);
void agateSlotTupleGet(AgateVM *vm, ptrdiff_t tuple_slot, ptrdiff_t index, ptrdiff_t component_slot);
// end::slot_tuple[]
// tag::slot_object[]
void agateSlotGetField(AgateVM *vm, ptrdiff_t object_slot, ptrdiff_t index, ptrdiff_t result_slot);
void agateSlotSetField(AgateVM *vm, ptrdiff_t object_slot, ptrdiff_t index, ptrdiff_t value_slot);
// end::slot_object[]
// tag::has_unit[]
bool agateHasUnit(AgateVM *vm, const char *unit_name);
// end::has_unit[]
// tag::has_variable[]
bool agateHasVariable(AgateVM *vm, const char *unit_name, const char *variable_name);
// end::has_variable[]
// tag::get_variable[]
void agateGetVariable(AgateVM *vm, const char *unit_name, const char *variable_name, ptrdiff_t slot);
// end::get_variable[]
// tag::abort[]
void agateAbort(AgateVM *vm, ptrdiff_t slot);
// end::abort[]
// tag::user_data[]
void *agateGetUserData(AgateVM *vm);
void agateSetUserData(AgateVM *vm, void *user_data);
// end::user_data[]
#ifdef __cplusplus
}
#endif
#endif /* AGATE_H */