fixing bugs with first class types; and basic type printing
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 23 Jun 2021 03:19:27 +0000 (22:19 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 23 Jun 2021 03:19:27 +0000 (22:19 -0500)
bin/onyx
core/std.onyx
core/type_info.onyx
core/type_info_helper.onyx [new file with mode: 0644]
src/onyxwasm_type_table.c

index 2bcf731c7ba9e5cae9112a2324d8730a6de236de..b0b63777c1a4d183aa47f60091fbaddb147b0c1c 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 3c0b55277fda38f6e39eb2d1acefe741eeb651e8..e36f23913a78e9847304d5819967fe371e508a4a 100644 (file)
@@ -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 {
index c62ab36bc206a6ec2d1d888d792b8ebabb220204..3e323e89443b7f773f8885e2d807d914f47b6ef0 100644 (file)
@@ -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 (file)
index 0000000..1674e62
--- /dev/null
@@ -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
index 059a3018571e3ceaec786da654f7dab1835e5c87..e14f9906197f8f5489f3accd0b56f1d6cd17c6d4 100644 (file)
@@ -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);