#ifndef AMALGAM_COMPILER_H #define AMALGAM_COMPILER_H #include "std/misc.h" #include "std/buffer.h" #include "std/buffer_view.h" #include "std/arena_allocator.h" #include "std/thread_pool.h" #include "compiler_options.h" #include "ast.h" #include "program.h" #define AMAL_COMPILER_OK 0 /* General error */ #define AMAL_COMPILER_ERR -1 #define AMAL_COMPILER_WORK_FAIL_ABORT -2 #define NUM_ARITHMETIC_TYPES 10 typedef struct { LhsExpr lhs_expr; bool is_signed; } amal_default_type; typedef struct { amal_default_type *i8; amal_default_type *i16; amal_default_type *i32; amal_default_type *i64; amal_default_type *u8; amal_default_type *u16; amal_default_type *u32; amal_default_type *u64; amal_default_type *isize; amal_default_type *usize; amal_default_type *f32; amal_default_type *f64; amal_default_type *str; amal_default_type *arithmetic_types[NUM_ARITHMETIC_TYPES]; } amal_default_types; bool is_arithmetic_type(LhsExpr *expr, amal_compiler *compiler); struct amal_compiler { amal_default_types default_types; amal_compiler_options options; amal_program *program; ArenaAllocator allocator; Scope root_scope; Buffer/**/ parsers; HashMapType(BufferView, FileScopeReference*) file_scopes; bool started; amal_mutex mutex; amal_thread_pool stage_task_thread_pool; }; void amal_compiler_options_init(amal_compiler_options *self); /* If @options is NULL, then default values are used. @options are copied. You should run @amal_program_deinit even @amal_compiler_load_file fails, to cleanup memory. This function creates a copy of @filepath so it doesn't have to survive longer than this function call. The file has to be in utf-8 format and it can optionally have utf-8 BOM. */ CHECK_RESULT int amal_compiler_load_file(amal_compiler_options *options, amal_program *program, const char *filepath); CHECK_RESULT int amal_compiler_internal_load_file(amal_compiler *self, const char *filepath, FileScopeReference **file_scope); /* Returns a reference to the parsers tokenizer that contains the code reference, or NULL. Note: The lifetime of the tokenizer returned is the same as the lifetime of the parser that owns it. */ Tokenizer* amal_compiler_find_tokenizer_by_code_reference(amal_compiler *self, const char *code_ref); #endif