/* * SPDX-FileCopyrightText: 2025 William Bell * * SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef AROBJECT_H #define AROBJECT_H #include "dynamic_array/darray.h" #include "runtime/internals/dynamic_array_armem/darray_armem.h" #include "runtime/internals/hashmap/hashmap.h" #include typedef struct ArErr ArErr; typedef struct RuntimeState RuntimeState; typedef struct ArgonObject ArgonObject; // forward declaration typedef ArgonObject *(*native_fn)(size_t argc, ArgonObject **argv, ArErr *err, RuntimeState *state); typedef enum ArgonType { TYPE_NULL, TYPE_BOOL, TYPE_NUMBER, TYPE_STRING, TYPE_FUNCTION, TYPE_NATIVE_FUNCTION, TYPE_METHOD, TYPE_OBJECT, } ArgonType; typedef struct { void *data; size_t capacity; size_t size; struct hashmap *hashmap; } ConstantArena; typedef struct { uint8_t registerCount; uint8_t registerAssignment; DArray *return_jumps; DArray bytecode; ConstantArena constants; char *path; } Translated; struct string_struct { uint64_t prehash; uint64_t hash; bool hash_computed; char *data; size_t length; }; typedef struct Stack { uint64_t fake_new_scopes; struct hashmap_GC *scope; struct Stack *prev; } Stack; struct argon_function_struct { Translated translated; uint8_t *bytecode; size_t bytecode_length; Stack *stack; size_t number_of_parameters; struct string_struct *parameters; uint64_t line; uint64_t column; }; // full definition of ArgonObject (no typedef again!) struct ArgonObject { ArgonType type; ArgonType child_type; struct hashmap_GC *dict; bool as_bool; union { struct as_number { bool is_int64; union { mpq_t *mpq; int64_t i64; } n; }as_number; struct string_struct as_str; native_fn native_fn; struct argon_function_struct argon_fn; } value; }; #endif // AROBJECT_H