diff options
author | Nathan Ringo <nathan@remexre.com> | 2024-11-18 00:34:23 -0600 |
---|---|---|
committer | Nathan Ringo <nathan@remexre.com> | 2024-11-18 00:34:23 -0600 |
commit | 943a6597b2bcd1b3ed208458a5cba61ad5b4051c (patch) | |
tree | d0acf34996941417aca241f5f01e399aaa90af39 /src/value.c | |
parent | 57331ba9756df043b5c665aa4952a0a7b38799e5 (diff) |
...
Diffstat (limited to 'src/value.c')
-rw-r--r-- | src/value.c | 111 |
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 + } + + // +} |