summaryrefslogtreecommitdiff
path: root/src/value.c
blob: 07af689a87dfd8e957223c2fb82fd23fedd1829c (plain)
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
  }

  //
}