/
IoState.h
215 lines (157 loc) · 4.88 KB
/
IoState.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
// metadoc State copyright Steve Dekorte 2002
// metadoc State license BSD revised
#ifndef IOSTATE_DEFINED
#define IOSTATE_DEFINED 1
#include "IoVMApi.h"
//#include "Collector.h"
#include "Stack.h"
#include "PointerHash.h"
#include "CHash.h"
#include "MainArgs.h"
#include "IoObject_struct.h"
#include "RandomGen.h"
#define COLLECTOROBJECTTYPE IoObjectData
#include "Collector.h"
#include "IoSeq.h"
#include "IoCoroutine.h"
#define IOMESSAGE_INLINE_PERFORM 1
//#define IO_BLOCK_LOCALS_RECYCLING 1
//#define IOSTATE_RECYCLING_ON 1
#define IOSTATE_DEFAULT_MAX_RECYCLED_OBJECTS 1000
#ifdef __cplusplus
extern "C" {
#endif
typedef struct IoState IoState;
#include "IoState_callbacks.h"
typedef IoObject *(IoStateProtoFunc)(void *);
struct IoState {
RandomGen *randomGen;
PointerHash *primitives;
CHash *symbols;
// coroutines
IoObject *objectProto;
IoObject *mainCoroutine; // the object that represents the main "thread"
IoObject *currentCoroutine; // the object whose coroutine is active
Stack *currentIoStack; // quick access to current coro's retain stack
// quick access objects
IoSymbol *activateSymbol;
IoSymbol *callSymbol;
IoSymbol *forwardSymbol;
IoSymbol *noShufflingSymbol;
IoSymbol *opShuffleSymbol;
// IoSymbol *performSymbol;
// IoSymbol *referenceIdSymbol;
IoSymbol *semicolonSymbol;
IoSymbol *selfSymbol;
IoSymbol *setSlotSymbol;
IoSymbol *setSlotWithTypeSymbol;
IoSymbol *stackSizeSymbol;
IoSymbol *typeSymbol;
IoSymbol *updateSlotSymbol;
IoSymbol *runTargetSymbol;
IoSymbol *runMessageSymbol;
IoSymbol *runLocalsSymbol;
IoSymbol *parentCoroutineSymbol;
IoSymbol *resultSymbol;
IoSymbol *exceptionSymbol;
IoObject *setSlotBlock;
IoObject *localsUpdateSlotCFunc;
IoObject *localsProto;
IoMessage *asStringMessage;
IoMessage *collectedLinkMessage;
IoMessage *compareMessage;
// IoMessage *doStringMessage;
IoMessage *initMessage;
IoMessage *mainMessage;
IoMessage *nilMessage;
IoMessage *opShuffleMessage;
IoMessage *printMessage;
IoMessage *referenceIdForObjectMessage;
IoMessage *objectForReferenceIdMessage;
IoMessage *runMessage;
IoMessage *willFreeMessage;
IoMessage *yieldMessage;
IoMessage *didFinishMessage;
IoMessage *asBooleanMessage;
List *cachedNumbers;
// singletons
IoObject *ioNil;
IoObject *ioTrue;
IoObject *ioFalse;
// Flow control singletons
IoObject *ioNormal;
IoObject *ioBreak;
IoObject *ioContinue;
IoObject *ioReturn;
IoObject *ioEol;
// garbage collection
Collector *collector;
IoObject *lobby;
IoObject *core;
// recycling
List *recycledObjects;
size_t maxRecycledObjects;
// startup environment
MainArgs *mainArgs;
// current execution state
int stopStatus;
void *returnValue;
// embedding
void *callbackContext;
IoStateBindingsInitCallback *bindingsInitCallback;
IoStatePrintCallback *printCallback;
IoStateExceptionCallback *exceptionCallback;
IoStateExitCallback *exitCallback;
IoStateActiveCoroCallback *activeCoroCallback;
// debugger
int debugOn;
IoObject *debugger;
IoMessage *vmWillSendMessage;
// SandBox limits
int messageCountLimit;
int messageCount;
double timeLimit;
double endTime;
// exiting
int shouldExit;
int exitResult;
int receivedSignal;
int showAllMessages;
// CHash *profiler;
};
#define IOSTATE_STRUCT_DEFINED
// setup
IOVM_API IoState *IoState_new(void);
IOVM_API void IoState_new_atAddress(void *address);
IOVM_API void IoState_init(IoState *self);
void IoState_setupQuickAccessSymbols(IoState *self);
void IoState_setupCachedMessages(IoState *self);
void IoState_setupSingletons(IoState *self);
void IoState_registerProtoWithFunc_(IoState *self, IoObject *proto,
const char *v);
// setup tags
IOVM_API void IoState_registerProtoWithId_(IoState *self, IoObject *proto,
const char *v);
IOVM_API IoObject *IoState_protoWithId_(IoState *self, const char *v);
IOVM_API IoObject *IoState_protoWithName_(IoState *self, const char *name);
IOVM_API void IoState_done(IoState *self);
IOVM_API void IoState_free(IoState *self);
// lobby
IOVM_API IoObject *IoState_lobby(IoState *self);
IOVM_API void IoState_setLobby_(IoState *self, IoObject *obj);
// command line
IOVM_API void IoState_argc_argv_(IoState *self, int argc, const char *argv[]);
IOVM_API void IoState_runCLI(IoState *self);
// store
IOVM_API IoObject *IoState_objectWithPid_(IoState *self, PID_TYPE pid);
IOVM_API int IoState_exitResult(IoState *self);
#include "IoState_coros.h"
#include "IoState_debug.h"
#include "IoState_eval.h"
#include "IoState_symbols.h"
#include "IoState_exceptions.h"
#include "IoState_inline.h"
#ifdef __cplusplus
}
#endif
#endif