#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 } // }