bugfix: `cbindgen` and captures by pointer
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 12 Oct 2023 01:46:30 +0000 (20:46 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 12 Oct 2023 01:46:30 +0000 (20:46 -0500)
compiler/src/checker.c
core/onyx/cbindgen.onyx
tests/lazy_iterators.onyx

index 01f4fc28c1f030412193f34d45f5b58087a7d30b..496bff563006e1734bc25811fa913db89f644490 100644 (file)
@@ -2442,6 +2442,10 @@ CheckStatus check_expression(AstTyped** pexpr) {
                     ERROR_(cl->token->pos, "Cannot pass '%b' by pointer because it is not an l-value.", cl->token->text, cl->token->length);
                 }
 
+                if (cl->captured_value->kind == Ast_Kind_Local) {
+                    cl->captured_value->flags |= Ast_Flag_Address_Taken;
+                }
+
                 expr->type = type_make_pointer(context.ast_alloc, cl->captured_value->type);
 
             } else {
index b351145ae4954501eb4b0c300770ce4faef39c94..b2678a88d8dd804c3d3d92abc63685af1cb5e2bb 100644 (file)
@@ -293,26 +293,26 @@ compile_c_file :: (
 
         param_info := get_type_info(t);
         switch param_info.kind {
-            case .Basic do return switch t {
-                case bool => "i32";
-                case i8   => "i32";
-                case u8   => "i32";
-                case i16  => "i32";
-                case u16  => "i32";
-                case i32  => "i32";
-                case u32  => "i32";
-                case i64  => "i64";
-                case u64  => "i64";
-
-                case f32  => "f32";
-                case f64  => "f64";
-
-                case rawptr => "ptr"; 
+            case .Basic do switch t {
+                case bool do return "i32";
+                case i8   do return "i32";
+                case u8   do return "i32";
+                case i16  do return "i32";
+                case u16  do return "i32";
+                case i32  do return "i32";
+                case u32  do return "i32";
+                case i64  do return "i64";
+                case u64  do return "i64";
+
+                case f32  do return "f32";
+                case f64  do return "f64";
+
+                case rawptr do return "ptr"; 
                 
-                case i8x16, i16x8, i32x4, i64x2, f32x4, f64x2, v128 => "v128";
+                case i8x16, i16x8, i32x4, i64x2, f32x4, f64x2, v128 do return "v128";
 
-                case type_expr => "i32";
-            };
+                case type_expr do return "i32";
+            }
 
             case .Pointer do return "ptr"; 
             case .Multi_Pointer do return "ptr"; 
@@ -350,26 +350,26 @@ compile_c_file :: (
 
         param_info := get_type_info(t);
         switch param_info.kind {
-            case .Basic do return switch t {
-                case bool => "WASM_I32";
-                case i8   => "WASM_I32";
-                case u8   => "WASM_I32";
-                case i16  => "WASM_I32";
-                case u16  => "WASM_I32";
-                case i32  => "WASM_I32";
-                case u32  => "WASM_I32";
-                case i64  => "WASM_I64";
-                case u64  => "WASM_I64";
-
-                case f32  => "WASM_F32";
-                case f64  => "WASM_F64";
-
-                case rawptr => "WASM_I32"; // This will have to depend on the pointer size...
+            case .Basic do switch t {
+                case bool do return "WASM_I32";
+                case i8   do return "WASM_I32";
+                case u8   do return "WASM_I32";
+                case i16  do return "WASM_I32";
+                case u16  do return "WASM_I32";
+                case i32  do return "WASM_I32";
+                case u32  do return "WASM_I32";
+                case i64  do return "WASM_I64";
+                case u64  do return "WASM_I64";
+
+                case f32  do return "WASM_F32";
+                case f64  do return "WASM_F64";
+
+                case rawptr do return "WASM_I32"; // This will have to depend on the pointer size...
                 
-                case i8x16, i16x8, i32x4, i64x2, f32x4, f64x2, v128 => "WASM_V128";
+                case i8x16, i16x8, i32x4, i64x2, f32x4, f64x2, v128 do return "WASM_V128";
 
-                case type_expr => "WASM_I32";
-            };
+                case type_expr do return "WASM_I32";
+            }
 
             case .Pointer do return "WASM_I32"; // This will also have to depend on the pointer size...
             case .Multi_Pointer do return "WASM_I32"; // This will also have to depend on the pointer size...
index 3b7d4c5da72d4179ad6f72d05289a48ca7344b24..953f9737c00f4b14d8d5d02eba02e54c9bfbbad9 100644 (file)
@@ -32,7 +32,7 @@ main :: (args: [] cstr) {
                     count_iterator(1.0f, 20.0f)
                     |> iter.map(x => x * 2)
                     |> iter.filter(lower_bound, (x, l) => x > ~~l)
-                    |> iter.map(addition, (x, addition) => x + ~~addition)
+                    |> iter.map((x, [addition]) => x + ~~addition)
                     |> iter.take(5);
 
         for v: quick_iterator {