From: Brendan Hansen Date: Wed, 23 Jun 2021 03:19:27 +0000 (-0500) Subject: fixing bugs with first class types; and basic type printing X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=6fe0ca11381952f33bf388124755eae4a8cf9ae4;p=onyx.git fixing bugs with first class types; and basic type printing --- diff --git a/bin/onyx b/bin/onyx index 2bcf731c..b0b63777 100755 Binary files a/bin/onyx and b/bin/onyx differ diff --git a/core/std.onyx b/core/std.onyx index 3c0b5527..e36f2391 100644 --- a/core/std.onyx +++ b/core/std.onyx @@ -40,6 +40,8 @@ package core #load "./wasi/env" #load "./wasi/clock" #load "./io/file" + + #load "./type_info_helper" } #if runtime.Runtime == runtime.Runtime_Js { diff --git a/core/type_info.onyx b/core/type_info.onyx index c62ab36b..3e323e89 100644 --- a/core/type_info.onyx +++ b/core/type_info.onyx @@ -150,4 +150,4 @@ get_type_info :: (t: type_expr) -> ^Type_Info { if t < ~~0 || t >= ~~type_table.count do return null; return type_table[cast(i32) t]; -} \ No newline at end of file +} diff --git a/core/type_info_helper.onyx b/core/type_info_helper.onyx new file mode 100644 index 00000000..1674e620 --- /dev/null +++ b/core/type_info_helper.onyx @@ -0,0 +1,112 @@ +package core.type_info + +#private_file io :: package core.io + +write_type_name :: (writer: ^io.Writer, t: type_expr) { + info := get_type_info(t); + if info == null do return; + + switch info.kind { + case .Basic { + basic := cast(^Type_Info_Basic) info; + + switch basic.basic_kind { + case .Void do io.write_str(writer, "void"); + case .Bool do io.write_str(writer, "bool"); + case .U8 do io.write_str(writer, "u8"); + case .I8 do io.write_str(writer, "i8"); + case .U16 do io.write_str(writer, "u16"); + case .I16 do io.write_str(writer, "i16"); + case .U32 do io.write_str(writer, "u32"); + case .I32 do io.write_str(writer, "i32"); + case .U64 do io.write_str(writer, "u64"); + case .I64 do io.write_str(writer, "i64"); + + case .F32 do io.write_str(writer, "f32"); + case .F64 do io.write_str(writer, "f64"); + + case .Rawptr do return io.write_str(writer, "rawptr"); + + case .I8X16 do return io.write_str(writer, "i8x16"); + case .I16X8 do return io.write_str(writer, "i16x8"); + case .I32X4 do return io.write_str(writer, "i32x4"); + case .I64X2 do return io.write_str(writer, "i64x2"); + case .F32X4 do return io.write_str(writer, "f32x4"); + case .F64X2 do return io.write_str(writer, "f64x2"); + case .V128 do return io.write_str(writer, "v128"); + + case .Type_Index do return io.write_str(writer, "type_expr"); + } + } + + case .Pointer { + pointer := cast(^Type_Info_Pointer) info; + io.write_str(writer, "^"); + write_type_name(writer, pointer.to); + } + + case .Array { + arr := cast(^Type_Info_Array) info; + io.write_format(writer, "[%i] ", arr.count); + write_type_name(writer, arr.of); + } + + case .Slice { + slice := cast(^Type_Info_Slice) info; + io.write_str(writer, "[] "); + write_type_name(writer, slice.of); + } + + case .Dynamic_Array { + dyn := cast(^Type_Info_Dynamic_Array) info; + io.write_str(writer, "[..] "); + write_type_name(writer, dyn.of); + } + + case .Variadic_Argument { + va := cast(^Type_Info_Variadic_Argument) info; + io.write_str(writer, ".."); + write_type_name(writer, va.of); + } + + case .Enum { + e := cast(^Type_Info_Enum) info; + io.write_str(writer, e.name); + } + + case .Struct { + s := cast(^Type_Info_Struct) info; + io.write_str(writer, s.name); + } + + case .Compound { + comp := cast(^Type_Info_Compound) info; + io.write_str(writer, "("); + + i := 0; + for type: comp.components { + if i != 0 do io.write_str(writer, ", "); + + write_type_name(writer, type); + i += 1; + } + io.write_str(writer, ")"); + } + + case .Function { + f := cast(^Type_Info_Function) info; + io.write_str(writer, "("); + + i := 0; + for type: f.parameter_types { + if i != 0 do io.write_str(writer, ", "); + + write_type_name(writer, type); + i += 1; + } + io.write_str(writer, ") -> "); + + write_type_name(writer, f.return_type); + } + } +} \ No newline at end of file diff --git a/src/onyxwasm_type_table.c b/src/onyxwasm_type_table.c index 059a3018..e14f9906 100644 --- a/src/onyxwasm_type_table.c +++ b/src/onyxwasm_type_table.c @@ -85,10 +85,12 @@ u64 build_type_table(OnyxWasmModule* module) { bh_buffer_write_u32(&table_buffer, type_idx); } + bh_buffer_align(&table_buffer, 8); table_info[type_idx] = table_buffer.length; bh_buffer_write_u32(&table_buffer, type->kind); bh_buffer_write_u32(&table_buffer, type_size_of(type)); bh_buffer_write_u32(&table_buffer, type_alignment_of(type)); + bh_buffer_align(&table_buffer, 8); PATCH; bh_buffer_write_u64(&table_buffer, components_base); bh_buffer_write_u64(&table_buffer, components_count);