-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontext.h
More file actions
204 lines (169 loc) · 6.65 KB
/
context.h
File metadata and controls
204 lines (169 loc) · 6.65 KB
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
#include <stdint.h>
#include <stdbool.h>
#include "defs.h"
#include "object.h"
#pragma region --- CONTEXT ---
struct ExecutionContextTypeInfo
{
uint8_t native;
struct ExecutionContextStructDefinition* complex;
};
struct ExecutionContextStructFieldDefinition
{
char name[MAX_IDENTIFIER_LENGTH];
uint8_t flags; // optional?
struct ExecutionContextTypeInfo type;
int offset;
};
struct ExecutionContextStructFunctionDefintion
{
int code_position;
int parameters_count;
struct ExecutionContextStructFieldDefinition parameters[8];
};
struct ExecutionContextStructDefinitionFieldList
{
struct ExecutionContextStructFieldDefinition data[8];
int count;
int capacity;
};
void context_struct_definition_field_list_add(
struct ExecutionContextStructDefinitionFieldList* list,
struct ExecutionContextStructFieldDefinition def
);
enum ExecutionContextStructDefinitionFlags
{
EXECUTION_CONTEXT_STRUCT_DEFINITION_FLAG_NONE,
EXECUTION_CONTEXT_STRUCT_DEFINITION_FLAG_IS_NATIVE,
EXECUTION_CONTEXT_STRUCT_DEFINITION_FLAG_IS_STRUCT,
EXECUTION_CONTEXT_STRUCT_DEFINITION_FLAG_IS_CLASS,
EXECUTION_CONTEXT_STRUCT_DEFINITION_FLAG_NEEDS_DESTRUCTOR,
EXECUTION_CONTEXT_STRUCT_DEFINITION_FLAG_IS_TUPLE,
};
struct ExecutionContextStructDefinition
{
struct ExecutionContextStructDefinitionFieldList fields;
struct ExecutionContextStructDefinitionFieldList static_fields;
// see ExecutionContextStructDefinitionFlags
uint8_t flags;
int size;
int static_size;
uint8_t* static_data;
uint8_t native_type;
};
struct ExecutionContextVariable
{
char name[MAX_IDENTIFIER_LENGTH];
int stack_index;
};
struct ExecutionContextScope
{
struct ExecutionContextVariable variables[16];
int variable_count;
int min_stack_index;
};
struct ExecutionContextStackValue
{
uint8_t type;
int size;
uint64_t* ptr;
};
struct ExecutionContext
{
const char* code;
int code_len;
int position;
struct ExecutionContextScope* global_scope;
struct ExecutionContextScope scopes[16];
int scope_index;
uint64_t stack[64];
uint8_t stack_type[64];
int stack_index;
int stack_variables;
struct ExecutionContextStructDefinition native_types[18];
};
enum ExecutionContextIdentifierResultType
{
EXECUTION_CONTEXT_IDENTIFIER_RESULT_HANDLED,
EXECUTION_CONTEXT_IDENTIFIER_RESULT_TYPE,
EXECUTION_CONTEXT_IDENTIFIER_RESULT_VARIABLE,
EXECUTION_CONTEXT_IDENTIFIER_RESULT_VALUE,
EXECUTION_CONTEXT_IDENTIFIER_RESULT_ERROR,
};
struct ExecutionContextIdentifierResult
{
uint8_t data_type;
union {
struct ExecutionContextTypeInfo type_data;
struct ExecutionContextVariable* variable_data;
};
};
struct ExecutionContextStackIterator
{
int stack_index;
};
int context_eof(struct ExecutionContext* context);
void context_skip_spaces(struct ExecutionContext* context);
bool check_type_is_assignable_to(uint8_t current_type, uint8_t new_type);
int get_size_of_native_type(uint8_t type);
int get_size_of_type(struct ExecutionContextTypeInfo type_info);
void destruct_struct(struct ExecutionContextStructDefinition* definition, uint8_t* data);
void destruct_field_list(struct ExecutionContextStructDefinitionFieldList* fields, uint8_t* data);
void destruct_struct(struct ExecutionContextStructDefinition* definition, uint8_t* data);
#pragma region --- CONTEXT STACK ---
struct ExecutionContextStackValue context_stack_get_value_at_index(struct ExecutionContext* context, int index);
struct ExecutionContextStackValue context_stack_get_last_value(struct ExecutionContext* context);
void context_stack_reset_value_at_index(struct ExecutionContext* context, int index, struct ExecutionContextStackValue value);
struct ExecutionContextStackValue context_stack_unset_value_at_index(struct ExecutionContext* context, int index);
void context_stack_set_value_at_index(struct ExecutionContext* context, int index, struct ExecutionContextStackValue value);
int context_stack_push_value(struct ExecutionContext* context, struct ExecutionContextStackValue value);
int context_stack_pop_value(struct ExecutionContext* context);
struct ExecutionContextStackIterator context_stack_iterate(struct ExecutionContext* context);
struct ExecutionContextStackValue context_stack_iterator_next(struct ExecutionContext* context, struct ExecutionContextStackIterator* iterator);
#pragma endregion --- CONTEXT STACK ---
#pragma region --- CONTEXT SCOPE ---
void context_scope_init(struct ExecutionContext* context);
struct ExecutionContextScope* context_get_scope(struct ExecutionContext* context);
struct ExecutionContextScope* context_push_scope(struct ExecutionContext* context);
struct ExecutionContextScope* context_pop_scope(struct ExecutionContext* context);
int context_scope_variables_binary_search(struct ExecutionContextScope* scope, int l, int r, const char* x);
int context_scope_variables_add_sorted(struct ExecutionContextScope* scope, int n, const char* x, int capacity);
int context_scope_variables_linear_search(struct ExecutionContextScope* scope, const char* x);
struct ExecutionContextVariable* context_scope_add_variable(
struct ExecutionContextScope* scope,
const char* name,
int stack_index
);
struct ExecutionContextStackValue context_scope_get_last_value_on_stack_in_scope(struct ExecutionContext* context);
#pragma endregion --- CONTEXT SCOPE ---
void context_variable_set_value(struct ExecutionContext* context, struct ExecutionContextVariable* info, struct ExecutionContextStackValue value);
struct ExecutionContextStackValue context_variable_get_value(struct ExecutionContext* context, struct ExecutionContextVariable* variable);
void context_variable_push_into_stack(struct ExecutionContext* context, struct ExecutionContextVariable* variable);
struct ExecutionContextVariable* context_add_variable(
struct ExecutionContext* context,
struct ExecutionContextScope* scope,
const char* name,
uint8_t declaration_type,
size_t size_in_bytes,
bool override
);
struct ExecutionContextVariable* context_add_local_variable(
struct ExecutionContext* context,
const char* name,
uint8_t declaration_type,
size_t size_in_bytes
);
struct ExecutionContextVariable* context_add_global_variable(
struct ExecutionContext* context,
const char* name,
uint8_t declaration_type,
size_t size_in_bytes
);
struct ExecutionContextVariable* context_lookup_variable(struct ExecutionContext* context, const char* name);
struct ExecutionContextTypeInfo context_get_type_from_identifier(
struct ExecutionContext* context,
const char* identifier,
int identifier_length,
struct ExecutionContextVariable** variable
);
#pragma endregion --- CONTEXT ---