137 lines
2.5 KiB
C
137 lines
2.5 KiB
C
/*
|
|
* 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 <gmp.h>
|
|
|
|
typedef enum {
|
|
__base__,
|
|
__class__,
|
|
__name__,
|
|
|
|
BUILT_IN_ARRAY_COUNT,
|
|
|
|
__binding__,
|
|
__function__,
|
|
__add__,
|
|
__string__,
|
|
__subtract__,
|
|
__multiply__,
|
|
__divide__,
|
|
__new__,
|
|
__init__,
|
|
__boolean__,
|
|
__getattr__,
|
|
field__address,
|
|
__call__,
|
|
__number__,
|
|
field_length,
|
|
__getattribute__,
|
|
__setattr__,
|
|
__getitem__,
|
|
__setitem__,
|
|
__hash__,
|
|
__repr__,
|
|
|
|
BUILT_IN_FIELDS_COUNT,
|
|
} built_in_fields;
|
|
|
|
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_DICTIONARY,
|
|
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;
|
|
char *data;
|
|
size_t length;
|
|
bool hash_computed;
|
|
};
|
|
|
|
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;
|
|
};
|
|
|
|
struct built_in_slot {
|
|
built_in_fields field;
|
|
ArgonObject *value;
|
|
};
|
|
|
|
struct as_number {
|
|
union {
|
|
mpq_t *mpq;
|
|
int64_t i64;
|
|
} n;
|
|
bool is_int64;
|
|
};
|
|
|
|
// full definition of ArgonObject (no typedef again!)
|
|
struct ArgonObject {
|
|
struct hashmap_GC *dict;
|
|
size_t built_in_slot_length;
|
|
struct built_in_slot built_in_slot[BUILT_IN_ARRAY_COUNT];
|
|
union {
|
|
struct as_number *as_number;
|
|
struct hashmap_GC *as_hashmap;
|
|
struct string_struct *as_str;
|
|
native_fn native_fn;
|
|
struct argon_function_struct *argon_fn;
|
|
} value;
|
|
ArgonType type;
|
|
bool as_bool;
|
|
};
|
|
|
|
#endif // AROBJECT_H
|