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
|
#include "value.h"
#include "gc.h"
enum builtin {
BUILTIN_BUILTIN_CLASS_BIGNUM,
BUILTIN_BUILTIN_CLASS_BUILTIN_CLASS,
BUILTIN_BUILTIN_CLASS_BUILTIN_FUNCTION,
BUILTIN_BUILTIN_CLASS_BUILTIN_OBJECT,
BUILTIN_BUILTIN_CLASS_CHARACTER,
BUILTIN_BUILTIN_CLASS_COMPILED_FUNCTION,
BUILTIN_BUILTIN_CLASS_CONS,
BUILTIN_BUILTIN_CLASS_DIRECT_SLOT_DEFINITION,
BUILTIN_BUILTIN_CLASS_EFFECTIVE_SLOT_DEFINITION,
BUILTIN_BUILTIN_CLASS_FIXNUM,
BUILTIN_BUILTIN_CLASS_GENERIC_FUNCTION,
BUILTIN_BUILTIN_CLASS_HASHTABLE_EQ,
BUILTIN_BUILTIN_CLASS_HASHTABLE_EQUAL,
BUILTIN_BUILTIN_CLASS_METHOD,
BUILTIN_BUILTIN_CLASS_NULL,
BUILTIN_BUILTIN_CLASS_PACKAGE,
BUILTIN_BUILTIN_CLASS_STANDARD_CLASS,
BUILTIN_BUILTIN_CLASS_STANDARD_OBJECT,
BUILTIN_BUILTIN_CLASS_STRING,
BUILTIN_BUILTIN_CLASS_SYMBOL,
BUILTIN_BUILTIN_CLASS_THREADED_FUNCTION,
BUILTIN_BUILTIN_CLASS_VECTOR_VALUE_ADJ_FILL,
BUILTIN_BUILTIN_CLASS_VECTOR_VALUE_NOADJ_FILL,
BUILTIN_BUILTIN_CLASS_VECTOR_VALUE_NOADJ_NOFILL,
BUILTIN_FUNCTION_CLASS_DIRECT_SLOTS,
BUILTIN_FUNCTION_CLASS_DIRECT_SUBCLASSES,
BUILTIN_FUNCTION_CLASS_DIRECT_SUPERCLASSES,
BUILTIN_FUNCTION_CLASS_NAME,
BUILTIN_FUNCTION_CLASS_PRECEDENCE_LIST,
BUILTIN_FUNCTION_CLASS_SLOTS,
BUILTIN_FUNCTION_EQ,
BUILTIN_FUNCTION_EQUAL,
BUILTIN_FUNCTION_GETHASH,
BUILTIN_FUNCTION_GETSLOT,
BUILTIN_FUNCTION_SETHASH,
BUILTIN_FUNCTION_SETSLOT,
BUILTIN_FUNCTION_SLOT_LOCATION,
BUILTIN_FUNCTION_SLOT_NAME,
BUILTIN_FUNCTION_SLOT_TYPE,
BUILTIN_FUNCTION_VECTOR_GET,
BUILTIN_FUNCTION_VECTOR_PUSH,
BUILTIN_FUNCTION_VECTOR_PUSH_EXTEND,
BUILTIN_FUNCTION_VECTOR_SET,
BUILTIN_VARIABLE_DSTACK,
BUILTIN_VARIABLE_RSTACK,
BUILTINS_COUNT,
};
static struct value builtins[BUILTINS_COUNT];
enum builtin_class_slot_index {
BUILTIN_CLASS__NAME,
BUILTIN_CLASS__FINALIZED,
BUILTIN_CLASS__DIRECT_SUPERCLASSES,
BUILTIN_CLASS__DIRECT_SUBCLASSES,
BUILTIN_CLASS__PRECEDENCE_LIST,
BUILTIN_CLASS_SLOT_COUNT,
};
enum standard_class_slot_index {
STANDARD_CLASS__NAME,
STANDARD_CLASS__FINALIZED,
STANDARD_CLASS__DIRECT_SUPERCLASSES,
STANDARD_CLASS__DIRECT_SUBCLASSES,
STANDARD_CLASS__PRECEDENCE_LIST,
STANDARD_CLASS__DIRECT_SLOTS,
STANDARD_CLASS__SLOTS,
STANDARD_CLASS_SLOT_COUNT,
};
static void push(struct value value) {}
static struct value pop(void) { return (struct value){.bits = 0}; }
struct value alloc_builtin_object(struct value class, size_t value_slot_count,
size_t untraced_slot_count) {
struct object *obj;
if (class.bits == builtins[BUILTIN_BUILTIN_CLASS_COMPILED_FUNCTION].bits)
obj = gc_alloc_compiled_function(value_slot_count, untraced_slot_count);
else if (class.bits == builtins[BUILTIN_BUILTIN_CLASS_HASHTABLE_EQ].bits)
obj = gc_alloc_hashtable_eq(value_slot_count, untraced_slot_count);
else
obj = gc_alloc(value_slot_count, untraced_slot_count);
gc_write_value_slot(obj, 0, class);
return (struct value){
.bits = (uintptr_t)obj | TAG_BUILTIN_OBJECT,
};
}
void bootstrap(void) {
// Since it is its own class, standard-class needs to be constructed
// manually.
{
struct object *obj = gc_alloc(STANDARD_CLASS_SLOT_COUNT + 1, 0);
builtins[BUILTIN_BUILTIN_CLASS_STANDARD_CLASS] = (struct value){
.bits = (uintptr_t)obj | TAG_BUILTIN_OBJECT,
};
gc_write_value_slot(obj, 0, builtins[BUILTIN_BUILTIN_CLASS_STANDARD_CLASS]);
// TODO
}
//
}
|