From 330300c7626eaa4579bc9ea4331cb0d87a8b5339 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 1 Jul 2021 22:47:20 -0500 Subject: [PATCH] bugfixes; starting work on wasm module --- bin/onyx | Bin 409160 -> 409160 bytes core/conv.onyx | 59 ++++++++++++++------ core/io/reader.onyx | 17 ++++-- modules/js_events/js_events.onyx | 12 ++-- modules/wasm_utils/module.onyx | 14 +++++ modules/wasm_utils/types.onyx | 91 +++++++++++++++++++++++++++++++ modules/wasm_utils/utils.onyx | 39 +++++++++++++ src/onyxtypes.c | 3 + tests/new_printf | 2 +- tests/new_printf.onyx | 2 +- 10 files changed, 210 insertions(+), 29 deletions(-) create mode 100644 modules/wasm_utils/module.onyx create mode 100644 modules/wasm_utils/types.onyx create mode 100644 modules/wasm_utils/utils.onyx diff --git a/bin/onyx b/bin/onyx index 018c527e86e83b881220b65689209e054c44cecf..592017b57df7b408a5510425bbbf8403a581c85e 100755 GIT binary patch delta 17787 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 W7~(sqrC*rGpawMBdk*#O;`2WtA=OC$ diff --git a/core/conv.onyx b/core/conv.onyx index cd020b69..842407d3 100644 --- a/core/conv.onyx +++ b/core/conv.onyx @@ -186,7 +186,7 @@ f64_to_str :: (f: f64, buf: [] u8) -> str { // This is better than the above version, but still relies on converting the integer // part of the float to an integer, which could overflow. -f64_to_str :: (f: f64, buf: [] u8) -> str { +f64_to_str :: (f: f64, buf: [] u8, digits_after_decimal := 4) -> str { math :: package core.math len := 0; @@ -208,15 +208,14 @@ f64_to_str :: (f: f64, buf: [] u8) -> str { digits := "0123456789"; - decimals :: 4; - for i: decimals { + for i: digits_after_decimal { dec_part *= 10; v := math.trunc(dec_part); dec_part -= v; buf.data[len + i] = digits[cast(i32) v]; } - len += decimals; + len += digits_after_decimal; return str.{ buf.data, len }; } @@ -226,7 +225,6 @@ str_format :: (format: str, buffer: [] u8, va: ..any) -> str { } str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { - @Cleanup Output :: struct { data: ^u8; count: u32; @@ -241,7 +239,12 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { }, (use output: ^Output, s: str) { - for c: s do output->write(c); + for c: s { + if count >= capacity do return; + + data[count] = c; + count += 1; + } } } } @@ -251,7 +254,6 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { Format :: struct { digits_after_decimal := cast(u32) 4; } - formatting := Format.{}; vararg_index := 0; @@ -259,6 +261,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { defer i += 1; ch := format[i]; + formatting := Format.{}; if ch == #char "{" { if format[i + 1] == #char "{" { @@ -267,8 +270,8 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { continue; } + i += 1; while true { - i += 1; ch = format[i]; switch ch { @@ -282,6 +285,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { i += 1; } + ch = format[i]; formatting.digits_after_decimal = digits; } @@ -299,7 +303,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { arg := va[vararg_index]; vararg_index += 1; - print_any(^output, arg); + print_any(^output, formatting, arg); continue; } @@ -309,7 +313,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { return .{ output.data, output.count }; - print_any :: (output: ^Output, v: any) { + print_any :: (output: ^Output, formatting: Format, v: any) { use package builtin.type_info array :: package core.array @@ -320,6 +324,19 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { else do output->write("false"); } + case u8 { + value := *(cast(^u8) v.data); + + if value > 31 { + output->write(value); + + } else { + ibuf : [128] u8; + istr := i64_to_str(~~value, 16, ~~ibuf); + output->write(istr); + } + } + case i32, u32 { value := *(cast(^i32) v.data); @@ -340,7 +357,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { value := *(cast(^f32) v.data); fbuf : [128] u8; - fstr := f64_to_str(~~value, ~~fbuf); + fstr := f64_to_str(~~value, ~~fbuf, formatting.digits_after_decimal); output->write(fstr); } @@ -348,7 +365,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { value := *(cast(^f64) v.data); fbuf : [128] u8; - fstr := f64_to_str(~~value, ~~fbuf); + fstr := f64_to_str(~~value, ~~fbuf, formatting.digits_after_decimal); output->write(fstr); } @@ -377,13 +394,23 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { output->write(member.name); output->write(" = "); - print_any(output, .{ ~~(cast(^u8) v.data + member.offset), member.type }); + print_any(output, formatting, .{ ~~(cast(^u8) v.data + member.offset), member.type }); } output->write(" }"); } - if info.kind == .Function do output->write(""); + if info.kind == .Function { + output->write("func["); + + value := *(cast(^i32) v.data); + + ibuf : [128] u8; + istr := i64_to_str(~~value, 10, ~~ibuf); + output->write(istr); + + output->write("]"); + } if info.kind == .Pointer { value := *(cast(^rawptr) v.data); @@ -405,7 +432,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { for i: count { if i != 0 do output->write(", "); - print_any(output, .{ ~~(cast(^u8) data + get_type_info(a.of).size * i), a.of }); + print_any(output, formatting, .{ ~~(cast(^u8) data + get_type_info(a.of).size * i), a.of }); } output->write(" ]"); @@ -420,7 +447,7 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { for i: a.count { if i != 0 do output->write(", "); - print_any(output, .{ ~~(cast(^u8) data + get_type_info(a.of).size * i), a.of }); + print_any(output, formatting, .{ ~~(cast(^u8) data + get_type_info(a.of).size * i), a.of }); } output->write(" ]"); diff --git a/core/io/reader.onyx b/core/io/reader.onyx index 943d360b..4367566e 100644 --- a/core/io/reader.onyx +++ b/core/io/reader.onyx @@ -24,10 +24,17 @@ read_byte :: (use reader: ^Reader) -> u8 { return byte; } -read_bytes :: (use reader: ^Reader, bytes := 1, allocator := context.allocator) -> str { - buffer := memory.make_slice(u8, bytes, allocator); - stream_read(stream, buffer); - return buffer; +read_bytes :: #match { + (use reader: ^Reader, bytes := 1, allocator := context.allocator) -> str { + buffer := memory.make_slice(u8, bytes, allocator); + stream_read(stream, buffer); + return buffer; + }, + + (use reader: ^Reader, bytes: [] u8) -> str { + err, bytes_read := stream_read(stream, bytes); + return bytes; + } } read_u32 :: (use reader: ^Reader) -> u32 { @@ -192,4 +199,4 @@ skip_whitespace :: (use reader: ^Reader) { skip_bytes :: (use reader: ^Reader, bytes: u32) { for _: bytes do stream_read_byte(stream); -} \ No newline at end of file +} diff --git a/modules/js_events/js_events.onyx b/modules/js_events/js_events.onyx index ec441cb8..ae73ff9b 100644 --- a/modules/js_events/js_events.onyx +++ b/modules/js_events/js_events.onyx @@ -95,20 +95,20 @@ init :: () { event_setup(^event_storage, sizeof Event); } -consume :: () -> Iterator(Event) { - next :: (_: rawptr) -> (Event, bool) { - use package core.intrinsics.onyx { __zero_value } - if event_storage.event_count == 0 do return __zero_value(Event), false; +#private_file processing_event: Event +consume :: () -> Iterator(^Event) { + next :: (_: rawptr) -> (^Event, bool) { + if event_storage.event_count == 0 do return null, false; @CodeGeneration // This instruction (and all instructions involving Event) generate a TON of instructions because Event is a union. - event := event_storage.event_buffer[0]; + processing_event := event_storage.event_buffer[0]; for i: 0 .. Num_Buffered_Events - 2 { event_storage.event_buffer[i] = event_storage.event_buffer[i + 1]; } event_storage.event_count -= 1; - return event, true; + return ^processing_event, true; } return .{ null, next }; diff --git a/modules/wasm_utils/module.onyx b/modules/wasm_utils/module.onyx new file mode 100644 index 00000000..7d8a471c --- /dev/null +++ b/modules/wasm_utils/module.onyx @@ -0,0 +1,14 @@ +/* + +WebAssembly 32-bit disassembly and decompiler utils + +*/ + +package wasm_utils + +#load "./types" +#load "./utils" + +#private map :: package core.map +#private io :: package core.io +#private hash :: package core.hash diff --git a/modules/wasm_utils/types.onyx b/modules/wasm_utils/types.onyx new file mode 100644 index 00000000..e4b5f748 --- /dev/null +++ b/modules/wasm_utils/types.onyx @@ -0,0 +1,91 @@ +package wasm_utils + +WasmSection :: enum { + Custom :: 0x00; + Type :: 0x01; + Import :: 0x02; + Function :: 0x03; + Table :: 0x04; + Memory :: 0x05; + Global :: 0x06; + Export :: 0x07; + Start :: 0x08; + Element :: 0x09; + Code :: 0x0a; + Data :: 0x0b; + DataCount :: 0x0c; +} + +#add_match hash.to_u32, (w: WasmSection) -> u32 { + return hash.to_u32(cast(u32) w); +} + +WasmBinary :: struct { + data: [] u8; + + // Section number -> Offset into data + // This does not work for custom sections, as they all have the same section number + section_locations : map.Map(WasmSection, i32); + + // So there is a custom section location that maps the name of the custom section + // to the offset into the file. The backing-store for the keys is just the data + // itself, as the names are in the data for the binary. + custom_section_locations : map.Map(str, i32); +} + +load :: (data: [] u8, allocator := context.allocator) -> WasmBinary { + binary: WasmBinary; + binary.data = data; + + #context_scope { + context.allocator = allocator; + map.init(^binary.section_locations, -1); + map.init(^binary.custom_section_locations, -1); + } + + assert(parse_section_locations(^binary), "Failed to parse WASM binary"); + + return binary; +} + + +#private_file +parse_section_locations :: (use bin: ^WasmBinary) -> bool { + stream := io.string_stream_make(data); + reader := io.reader_make(^stream); + + { + // Checking the magic string + magic_buffer: [4] u8; + + if !(io.read_bytes(^reader, cast([] u8) magic_buffer) == ~~u8.[ 0, #char "a", #char "s", #char "m" ]) do return false; + if !(io.read_bytes(^reader, cast([] u8) magic_buffer) == ~~u8.[ 1, 0, 0, 0 ]) do return false; // This may not be necessary + } + + while !io.stream_end_of_file(^stream) { + section_number := cast(WasmSection) io.read_byte(^reader); + section_size := read_uleb128(^reader); + _, pos := io.stream_tell(^stream); + + switch section_number { + @Incomplete + case .Custom --- + + case .Type, .Import, .Function, .Table, .Memory, .Global, + .Export, .Start, .Element, .Code, .Data, .DataCount { + map.put(^section_locations, section_number, pos); + } + + case #default { + buffer: [128] u8; + conv :: package core.conv + assert(false, conv.str_format("Bad section number {}", ~~buffer, cast(i32) section_number)); + } + } + + err := io.stream_seek(^stream, pos + ~~section_size, .Start); + if err == .OutOfBounds do break; + } + + return true; +} diff --git a/modules/wasm_utils/utils.onyx b/modules/wasm_utils/utils.onyx new file mode 100644 index 00000000..326da066 --- /dev/null +++ b/modules/wasm_utils/utils.onyx @@ -0,0 +1,39 @@ +package wasm_utils + +#private_file io :: package core.io + +#private +read_uleb128 :: (use reader: ^io.Reader) -> u64 { + result: u64 = 0; + shift := 0; + byte: u8; + + while true { + byte = io.read_byte(reader); + result |= ~~((byte & 127) << ~~shift); + if (byte & 128) == 0 do break; + + shift += 7; + } + + return result; +} + +#private +read_sleb128 :: (use reader: ^io.Reader, size := 4) -> i64 { + result: i64 = 0; + shift := 0; + byte: u8 = 128; + + while (byte & 128) != 0 { + byte = io.read_byte(reader); + result |= ~~((byte & 127) << ~~shift); + shift += 7; + } + + if (shift < size) && (byte & 64) > 0 { + result |= 0xFFFFFFFFFFFFFFFF << ~~shift; + } + + return result; +} diff --git a/src/onyxtypes.c b/src/onyxtypes.c index 36fc57bf..58734c65 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -484,6 +484,9 @@ Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) { AstPolyCallType* pc_type = (AstPolyCallType *) type_node; if (!(pc_type->callee && pc_type->callee->kind == Ast_Kind_Poly_Struct_Type)) { + // If it is an unresolved field access, just return because an error will be printed elsewhere. + if (pc_type->callee->kind == Ast_Kind_Field_Access) return NULL; + onyx_report_error(pc_type->token->pos, "Cannot instantiate a concrete type off of a non-polymorphic type."); return NULL; } diff --git a/tests/new_printf b/tests/new_printf index 3442358f..08594c78 100644 --- a/tests/new_printf +++ b/tests/new_printf @@ -1 +1 @@ -123 Test { } false 0x4E8 +123 Test {} false 12.3 12.34567 diff --git a/tests/new_printf.onyx b/tests/new_printf.onyx index c53077ad..cf188d54 100644 --- a/tests/new_printf.onyx +++ b/tests/new_printf.onyx @@ -3,5 +3,5 @@ use package core main :: (args: [] cstr) { - printf("{} {} {{ }} {} {}\n", 123, "Test", false, ^stdio.print_writer); + printf("{} {} {{}} {} {.1} {.5}\n", 123, "Test", false, 12.34, 12.3456789); } -- 2.25.1