summaryrefslogtreecommitdiff
path: root/src/value.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/value.c')
-rw-r--r--src/value.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/value.c b/src/value.c
index 66d388c..07af689 100644
--- a/src/value.c
+++ b/src/value.c
@@ -1 +1,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
+ }
+
+ //
+}