added wasm parsing of shared memory modules
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 21 Oct 2021 19:05:49 +0000 (14:05 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 21 Oct 2021 19:05:49 +0000 (14:05 -0500)
core/sync/mutex.onyx
modules/wasm_utils/parser.onyx
modules/wasm_utils/types.onyx

index 982fcb00bfcff1f0c604e83f390a5a3459451d25..1211ecf443c2b64aca9fa08619015893b9453652 100644 (file)
@@ -38,6 +38,8 @@ mutex_lock :: (m: ^Mutex) {
 }
 
 mutex_unlock :: (m: ^Mutex) {
+    if m.owner != context.thread_id do return;
+    
     m.owner = -1;
     __atomic_store(^m.lock, 0);
     __atomic_notify(^m.lock, maximum = 1);
index d72fd2b4d1880fe9fddb411e6a5727201aa97282..5cd7332139eb3c421163b0e68a7b4962f638f3e6 100644 (file)
@@ -56,13 +56,23 @@ parse_import_section :: (use bin: ^WasmBinary, allocator := context.allocator) -
     return parse_vector(^reader, bin, read_import);
 
     read_import :: (reader: ^io.Reader, binary: ^WasmBinary) -> WasmImport {
-        module_name := parse_name(reader, binary);
-        import_name := parse_name(reader, binary);
+        import: WasmImport;
+        import.module_name = parse_name(reader, binary);
+        import.import_name = parse_name(reader, binary);
 
-        kind  := io.read_byte(reader);
-        index := read_uleb128(reader);
+        import.type = ~~io.read_byte(reader);
+
+        switch import.type {
+            case .Memory {
+                import.limits = parse_limits(reader, binary);
+            }
+
+            case #default {
+                import.index = ~~read_uleb128(reader);
+            }
+        }
         
-        return .{ module_name, import_name, ~~kind, ~~index };
+        return import;
     }
 }
 
@@ -219,15 +229,18 @@ parse_data_section :: (use bin: ^WasmBinary, allocator := context.allocator) ->
     stream := io.string_stream_make(data);   
     reader := io.reader_make(^stream);
 
-    io.stream_seek(^stream, map.get(^sections, .Data).offset, .Start);
+    io.stream_seek(^stream, sections[WasmSection.Data].offset, .Start);
 
     return parse_vector(^reader, bin, read_data);
-    
+
     read_data :: (reader: ^io.Reader, bin: ^WasmBinary) -> WasmData {
         memory_index := read_uleb128(reader);
 
-        offset       := parse_instruction(reader, bin);
-        assert(io.read_byte(reader) == ~~0x0B, "Expected '0x0B' after constant expression");
+        offset: WasmInstruction;
+        if memory_index == 0 {
+            offset = parse_instruction(reader, bin);
+            assert(io.read_byte(reader) == ~~0x0B, "Expected '0x0B' after constant expression");
+        }
 
         size := read_uleb128(reader);
         _, pos := io.stream_tell(reader.stream);
@@ -309,8 +322,9 @@ parse_limits :: (reader: ^io.Reader, bin: ^WasmBinary) -> WasmLimits {
     byte := io.read_byte(reader);
 
     minimum, maximum : u32;
+    shared           := (byte & 2) != 0;
 
-    switch byte {
+    switch byte & 1 {
         case 0 {
             minimum =~~ read_uleb128(reader);
             maximum = 0;
@@ -324,7 +338,7 @@ parse_limits :: (reader: ^io.Reader, bin: ^WasmBinary) -> WasmLimits {
         case #default do assert(false, "Bad limit header");
     }
 
-    return .{ minimum=minimum, maximum=maximum };
+    return .{ minimum=minimum, maximum=maximum, shared=shared };
 }
 
 #private
index 446a6c328864fe6f88bb4b1881b95c4901de3690..7812005d4d2bf386a2b803e283352475690cf3a4 100644 (file)
@@ -64,7 +64,11 @@ WasmImport :: struct {
     import_name : str;
 
     type  : WasmForeignType;
-    index : u32;
+
+    use __: struct #union {
+        index  : u32;
+        limits : WasmLimits;
+    };
 }
 
 WasmExport :: struct {
@@ -79,6 +83,7 @@ WasmFunction :: struct {
 
 WasmLimits :: struct {
     minimum, maximum: u32;
+    shared: bool;
 }
 
 WasmMemory :: struct {