From: Brendan Hansen Date: Thu, 16 Nov 2023 16:38:40 +0000 (-0600) Subject: starting working on support for MacOS X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=f563da8c1786e4581e5a3f5a615812c5b2d266c2;p=onyx.git starting working on support for MacOS --- diff --git a/.github/workflows/onyx-build.yml b/.github/workflows/onyx-build.yml index cb1ec272..e1a4bb14 100644 --- a/.github/workflows/onyx-build.yml +++ b/.github/workflows/onyx-build.yml @@ -70,6 +70,7 @@ jobs: ONYX_RUNTIME_LIBRARY: ${{ matrix.runtime_library }} ONYX_INCLUDE_DIR: ../shared/include ONYX_LIBRARY_DIR: ${{ env.ONYX_LIBRARY_DIR }} + ONYX_USE_DYNCALL: '1' - name: Build Onyx for ${{ matrix.build }} if: matrix.build == 'windows-amd64' diff --git a/compiler/include/astnodes.h b/compiler/include/astnodes.h index 7ce5ab5c..21bed634 100644 --- a/compiler/include/astnodes.h +++ b/compiler/include/astnodes.h @@ -951,7 +951,7 @@ struct AstSwitch { u32 flags; \ OnyxToken* token; \ struct Entity* entity; \ - void* __unused; \ + void* next; \ u64 type_id; \ Type* type struct AstType { AstType_base; }; diff --git a/compiler/src/astnodes.c b/compiler/src/astnodes.c index 1c4583f7..d0102cb5 100644 --- a/compiler/src/astnodes.c +++ b/compiler/src/astnodes.c @@ -1756,8 +1756,8 @@ b32 static_if_resolution(AstIf* static_if) { AstPolyCallType* convert_call_to_polycall(AstCall* call) { // HACK HACK HACK AstPolyCallType *pct = onyx_ast_node_new(context.ast_alloc, sizeof(AstPolyCallType), Ast_Kind_Poly_Call_Type); - pct->token = call->token; - pct->__unused = call->next; + pct->token = call->token; + pct->next = call->next; pct->callee = (AstType *) call->callee; pct->params = (AstNode **) bh_arr_copy(global_heap_allocator, call->args.values); bh_arr_each(AstNode *, pp, pct->params) { diff --git a/compiler/src/builtins.c b/compiler/src/builtins.c index 09d63ad1..2ebcf646 100644 --- a/compiler/src/builtins.c +++ b/compiler/src/builtins.c @@ -618,6 +618,9 @@ void introduce_build_options(bh_allocator a) { #ifdef _BH_WINDOWS os = 2; #endif + #ifdef _BH_DARWIN + os = 3; + #endif AstType* OS_Type = (AstType *) symbol_raw_resolve(p->scope, "OS"); if (OS_Type == NULL) { diff --git a/compiler/src/checker.c b/compiler/src/checker.c index 496bff56..b0bc672a 100644 --- a/compiler/src/checker.c +++ b/compiler/src/checker.c @@ -1923,7 +1923,7 @@ CheckStatus check_address_of(AstAddressOf** paof) { AstPointerType *pt = onyx_ast_node_new(context.ast_alloc, sizeof(AstPointerType), Ast_Kind_Pointer_Type); pt->token = aof->token; pt->elem = (AstType *) expr; - pt->__unused = aof->next; + pt->next = aof->next; *paof = (AstAddressOf *) pt; CHECK(type, (AstType **) &pt); return Check_Success; diff --git a/compiler/src/onyx.c b/compiler/src/onyx.c index 444a5342..96095e29 100644 --- a/compiler/src/onyx.c +++ b/compiler/src/onyx.c @@ -128,7 +128,7 @@ static CompileOptions compile_opts_parse(bh_allocator alloc, int argc, char *arg bh_arr_new(alloc, options.defined_variables, 2); char* core_installation = NULL; - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) core_installation = getenv("ONYX_PATH"); #endif #ifdef _BH_WINDOWS diff --git a/compiler/src/symres.c b/compiler/src/symres.c index 447b1a4a..ff929261 100644 --- a/compiler/src/symres.c +++ b/compiler/src/symres.c @@ -584,7 +584,7 @@ static SymresStatus symres_address_of(AstAddressOf** paof) { AstPointerType *pt = onyx_ast_node_new(context.ast_alloc, sizeof(AstPointerType), Ast_Kind_Pointer_Type); pt->token = aof->token; pt->elem = (AstType *) expr; - pt->__unused = aof->next; + pt->next = aof->next; *paof = (AstAddressOf *) pt; SYMRES(type, (AstType **) &pt); return Symres_Success; diff --git a/core/runtime/build_opts.onyx b/core/runtime/build_opts.onyx index 9d2c577c..3740bbab 100644 --- a/core/runtime/build_opts.onyx +++ b/core/runtime/build_opts.onyx @@ -12,6 +12,7 @@ Runtime :: enum { OS :: enum { Linux :: 1; Windows :: 2; + MacOS :: 3; } // arch: Arch This is set by the compiler. diff --git a/misc/vscode/extension.ts b/misc/vscode/extension.ts index b0258545..7ca3a707 100644 --- a/misc/vscode/extension.ts +++ b/misc/vscode/extension.ts @@ -20,24 +20,34 @@ export async function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider)); context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider)); - let serverOptions: vslc.ServerOptions = { - command: "onyx-lsp", - transport: vslc.TransportKind.stdio, - }; - - let clientOptions: vslc.LanguageClientOptions = { - documentSelector: [ - { scheme: "file", language: "onyx" }, - ], - connectionOptions: { - cancellationStrategy: null, - maxRestartCount: 5 - } - }; - - client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions); - - client.start(); + let onyx_path = process.env['ONYX_PATH']; + if (!onyx_path) { + onyx_path = require('os').homedir() + "/.onyx"; + process.env["ONYX_PATH"] = onyx_path; + process.env["PATH"] = process.env["PATH"] + ":" + onyx_path + "/bin" + } + + if (onyx_path) { + let serverOptions: vslc.ServerOptions = { + command: `${onyx_path}/bin/onyx`, + args: ["lsp"], + transport: vslc.TransportKind.stdio, + }; + + let clientOptions: vslc.LanguageClientOptions = { + documentSelector: [ + { scheme: "file", language: "onyx" }, + ], + connectionOptions: { + cancellationStrategy: null, + maxRestartCount: 5 + } + }; + + client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions); + + client.start(); + } console.appendLine("Onyx Extension loaded."); } diff --git a/misc/vscode/onyx-0.1.8.vsix b/misc/vscode/onyx-0.1.8.vsix index 56d7d70b..59d5dc45 100644 Binary files a/misc/vscode/onyx-0.1.8.vsix and b/misc/vscode/onyx-0.1.8.vsix differ diff --git a/misc/vscode/out/extension.js b/misc/vscode/out/extension.js index 5ed52058..264fa5c3 100644 --- a/misc/vscode/out/extension.js +++ b/misc/vscode/out/extension.js @@ -26,21 +26,30 @@ function activate(context) { context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, documentSymbolProvider)); context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider)); context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider)); - let serverOptions = { - command: "onyx-lsp", - transport: vslc.TransportKind.stdio, - }; - let clientOptions = { - documentSelector: [ - { scheme: "file", language: "onyx" }, - ], - connectionOptions: { - cancellationStrategy: null, - maxRestartCount: 5 - } - }; - client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions); - client.start(); + let onyx_path = process.env['ONYX_PATH']; + if (!onyx_path) { + onyx_path = require('os').homedir() + "/.onyx"; + process.env["ONYX_PATH"] = onyx_path; + process.env["PATH"] = process.env["PATH"] + ":" + onyx_path + "/bin"; + } + if (onyx_path) { + let serverOptions = { + command: `${onyx_path}/bin/onyx`, + args: ["lsp"], + transport: vslc.TransportKind.stdio, + }; + let clientOptions = { + documentSelector: [ + { scheme: "file", language: "onyx" }, + ], + connectionOptions: { + cancellationStrategy: null, + maxRestartCount: 5 + } + }; + client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions); + client.start(); + } console.appendLine("Onyx Extension loaded."); }); } diff --git a/shared/include/bh.h b/shared/include/bh.h index d347344a..641e2290 100644 --- a/shared/include/bh.h +++ b/shared/include/bh.h @@ -27,20 +27,34 @@ #define _BH_LINUX 1 #endif +#if defined(__MACH__) && defined(__APPLE__) + #define _BH_DARWIN 1 +#endif + #include -#include #include -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) #include #include #include #include #include - #include #include #endif +#if defined(_BH_LINUX) || defined(_BH_WINDOWS) + #include +#endif + +#if defined(_BH_LINUX) + #include +#endif + +#if defined(_BH_DARWIN) + #include +#endif + #include #include #include // TODO: Replace with needed functions @@ -209,7 +223,7 @@ BH_DEF i64 leb128_to_int(u8* bytes, i32 *byte_count); #define forir(var, hi, lo) for (i64 var = (hi); var >= (lo); var--) #define forll(T, var, start, step) for (T* var = (start); var != NULL; var = (T *) var->step) -#if defined(BH_DEBUG) && !defined(_BH_WINDOWS) +#if defined(BH_DEBUG) && defined(_BH_LINUX) && false #define DEBUG_HERE __asm("int $3") #else #define DEBUG_HERE @@ -497,8 +511,8 @@ void bh_dir_close(bh_dir dir); fd_set fds; } bh_file_watch; #endif -#ifdef _BH_WINDOWS - // TODO: Make these work on Windows +#if defined(_BH_WINDOWS) || defined(_BH_DARWIN) + // TODO: Make these work on Windows and MacOS typedef u32 bh_file_watch; #endif @@ -998,7 +1012,7 @@ BH_ALLOCATOR_PROC(bh_heap_allocator_proc) { case bh_allocator_action_alloc: { #if defined(_BH_WINDOWS) retval = _aligned_malloc(size, alignment); -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) i32 success = posix_memalign(&retval, alignment, size); #endif if (flags & bh_allocator_flag_clear && retval != NULL) { @@ -1010,7 +1024,7 @@ BH_ALLOCATOR_PROC(bh_heap_allocator_proc) { // TODO: Maybe replace with better custom function #if defined(_BH_WINDOWS) retval = _aligned_realloc(prev_memory, size, alignment); -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) retval = realloc(prev_memory, size); #endif } break; @@ -1018,7 +1032,7 @@ BH_ALLOCATOR_PROC(bh_heap_allocator_proc) { case bh_allocator_action_free: { #if defined(_BH_WINDOWS) _aligned_free(prev_memory); -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) free(prev_memory); #endif } break; @@ -1045,7 +1059,7 @@ void bh_managed_heap_free(bh_managed_heap* mh) { l->magic_number = 0; #if defined(_BH_WINDOWS) _aligned_free((void *) l); -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) free((void *) l); #endif } @@ -1595,7 +1609,7 @@ bh_file_error bh_file_get_standard(bh_file* file, bh_file_standard stand) { } file->fd = sd_fd; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) i32 sd_fd = -1; switch (stand) { @@ -1683,7 +1697,7 @@ bh_file_error bh_file_open_mode(bh_file* file, bh_file_mode mode, const char* fi file->filename = filename; return BH_FILE_ERROR_NONE; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) i32 os_mode = 0; switch (mode & BH_FILE_MODE_MODES) { @@ -1723,7 +1737,7 @@ b32 bh_file_read_at(bh_file* file, i64 offset, void* buffer, isize buff_size, is if (res) return 1; else return 0; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) if (file->fd == 0) { isize res = read(file->fd, buffer, buff_size); if (res < 0) return 0; @@ -1748,7 +1762,7 @@ b32 bh_file_write_at(bh_file* file, i64 offset, void const* buffer, isize buff_s res = (isize) WriteFile(file->fd, buffer, buff_size, (i32 *) bytes_wrote, NULL); return res; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) if (current_offset == offset || file->fd == 1 || file->fd == 2) { // Standard in and out do like pwrite() res = write(file->fd, buffer, buff_size); @@ -1779,6 +1793,13 @@ static b32 bh__file_seek_wrapper(bh_file_descriptor fd, i64 offset, bh_file_when if (new_offset) *new_offset = res; return 1; #endif + +#elif defined(_BH_DARWIN) + i64 res = lseek(fd, offset, whence); + if (res < 0) return 0; + if (new_offset) *new_offset = res; + return 1; +#endif } // Returns new offset @@ -1821,7 +1842,7 @@ bh_file_error bh_file_close(bh_file* file) { return err; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) i32 res = close(file->fd); if (res < 0) err = BH_FILE_ERROR_INVALID; @@ -1839,7 +1860,7 @@ b32 bh_file_write(bh_file* file, void* buffer, isize buff_size) { } void bh_file_flush(bh_file* file) { - #ifdef _BH_LINUX + #ifdef _BH_LINUX || defined (_BH_DARWIN) fdatasync(file->fd); #endif } @@ -1896,7 +1917,7 @@ b32 bh_file_stat(char const* filename, bh_file_stats* out) { if ((s.st_mode & S_IFMT) == S_IFDIR) out->file_type = BH_FILE_TYPE_DIRECTORY; if ((s.st_mode & S_IFMT) == S_IFREG) out->file_type = BH_FILE_TYPE_FILE; -#if defined(_BH_LINUX) +#if defined(_BH_LINUX) || defined (_BH_DARWIN) if ((s.st_mode & S_IFMT) == S_IFLNK) out->file_type = BH_FILE_TYPE_LINK; #endif @@ -1912,7 +1933,7 @@ b32 bh_file_remove(char const* filename) { #if defined(_BH_WINDOWS) return DeleteFileA(filename); -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) return unlink(filename) == 0; #endif } @@ -1929,7 +1950,7 @@ char* bh_path_get_full_name(char const* filename, bh_allocator a) { return result; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined (_BH_DARWIN) char* p = realpath(filename, NULL); // Check if the file did not exists. @@ -1948,7 +1969,7 @@ char* bh_path_get_full_name(char const* filename, bh_allocator a) { } // NOTE: This assumes the filename is the full path, not relative to anything else. -#if defined(_BH_LINUX) +#if defined(_BH_LINUX) || defined(_BH_DARWIN) #define DIR_SEPARATOR '/' #elif defined(_BH_WINDOWS) #define DIR_SEPARATOR '\\' @@ -2008,7 +2029,7 @@ char* bh_lookup_file(char* filename, char* relative_to, char *suffix, b32 add_su // // Modifies the path in-place. char* bh_path_convert_separators(char* path) { -#if defined(_BH_LINUX) +#if defined(_BH_LINUX) || defined(_BH_DARWIN) #define DIR_SEPARATOR '/' #define OTHER_SEPARATOR '\\' #elif defined(_BH_WINDOWS) @@ -2042,7 +2063,7 @@ bh_dir bh_dir_open(char* path) { return dir; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) DIR* dir = opendir(path); return dir; #endif @@ -2067,7 +2088,7 @@ b32 bh_dir_read(bh_dir dir, bh_dirent* out) { return 1; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) struct dirent *ent; while (1) { ent = readdir(dir); @@ -2107,7 +2128,7 @@ void bh_dir_close(bh_dir dir) { free(dir); #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) if (dir == NULL) return; closedir(dir); #endif @@ -3048,7 +3069,7 @@ u64 bh_time_curr() { QueryPerformanceCounter(&result); return (u64) result.QuadPart; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined(_BH_DARWIN) struct timespec spec; clock_gettime(CLOCK_REALTIME, &spec); @@ -3074,7 +3095,7 @@ u64 bh_time_duration(u64 old) { duration /= freq.QuadPart; return duration; -#elif defined(_BH_LINUX) +#elif defined(_BH_LINUX) || defined(_BH_DARWIN) u64 curr = bh_time_curr(); return curr - old; #endif