starting working on support for MacOS
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 16 Nov 2023 16:38:40 +0000 (10:38 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 16 Nov 2023 16:38:40 +0000 (10:38 -0600)
12 files changed:
.github/workflows/onyx-build.yml
compiler/include/astnodes.h
compiler/src/astnodes.c
compiler/src/builtins.c
compiler/src/checker.c
compiler/src/onyx.c
compiler/src/symres.c
core/runtime/build_opts.onyx
misc/vscode/extension.ts
misc/vscode/onyx-0.1.8.vsix
misc/vscode/out/extension.js
shared/include/bh.h

index cb1ec272e3f5981d035569d58296ced0cbb8ac3d..e1a4bb14fc739af85885b229a9179430d11d0051 100644 (file)
@@ -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'
index 7ce5ab5c1c345f2988781d70ffd181612efa505f..21bed6344299d934fbfdf0990c237f8f85e90ab8 100644 (file)
@@ -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; };
index 1c4583f72c6ca38d4e4a0e92f7643456c603efcc..d0102cb534edb95ffab269228f0c35dcfe65de6a 100644 (file)
@@ -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) {
index 09d63ad119cc8fe2173c436a3cb364da3303bc82..2ebcf64656159be7ab7f7d41cef7c37c8800ee9c 100644 (file)
@@ -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) {
index 496bff563006e1734bc25811fa913db89f644490..b0bc672ad1dba1c2b63b14f4a668d9601187eb24 100644 (file)
@@ -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;
index 444a5342833908fdb4f896659ca11a696738c003..96095e293d39c3dc648b6686924669363e47cd32 100644 (file)
@@ -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
index 447b1a4aae51be097113982cb2be47f7cd062ee8..ff92926168806d5bbe3f4a32e674cbb87e233dfa 100644 (file)
@@ -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;
index 9d2c577c365281ff8a43c0813d4f7b556f8bb447..3740bbab72ced96a9f0a6d02381bc2c0bac76495 100644 (file)
@@ -12,6 +12,7 @@ Runtime :: enum {
 OS :: enum {
     Linux       :: 1;
     Windows     :: 2;
+    MacOS       :: 3;
 }
 
 // arch: Arch         This is set by the compiler.
index b02585456d5947e2398af0bc6dbd773b06072670..7ca3a7075d6b003cab79aee22fb945db0f2059c0 100644 (file)
@@ -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.");
 }
index 56d7d70b015aaeaeee672a2a3d990c949ed51072..59d5dc45918640b6965b18bb10bdd8e107670497 100644 (file)
Binary files a/misc/vscode/onyx-0.1.8.vsix and b/misc/vscode/onyx-0.1.8.vsix differ
index 5ed52058819943c84a024723cbf3f35117b96fb7..264fa5c3ea87f8709d5580a92203b245a618a246 100644 (file)
@@ -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.");
     });
 }
index d347344ad8d1f14f3f2a1e4c93e5f0ed1fc0e86a..641e2290d3482eb45688004c5c19e1bd57cacfb2 100644 (file)
     #define _BH_LINUX 1
 #endif
 
+#if defined(__MACH__) && defined(__APPLE__)
+    #define _BH_DARWIN 1
+#endif
+
 #include <sys/stat.h>
-#include <malloc.h>
 #include <time.h>
 
-#ifdef _BH_LINUX
+#if defined(_BH_LINUX) || defined(_BH_DARWIN)
     #include <errno.h>
     #include <fcntl.h>
     #include <unistd.h>
     #include <dirent.h>
     #include <pthread.h>
-    #include <sys/inotify.h>
     #include <sys/select.h>
 #endif
 
+#if defined(_BH_LINUX) || defined(_BH_WINDOWS)
+    #include <malloc.h>
+#endif
+
+#if defined(_BH_LINUX)
+    #include <sys/inotify.h>
+#endif
+
+#if defined(_BH_DARWIN)
+    #include <sys/malloc.h>
+#endif
+
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h> // 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