ffi M5.A.next.5.1.A: build_block_convert — expected-failing lock-in
Step 5.1.A of the FFI plan (variadic heterogeneous type packs → generic `Into(Block)` impl). The eventual step-5.2 impl body will read `#insert build_block_convert($args, $R);` to emit a per-shape `__invoke` `callconv(.c)` trampoline + Block literal. 5.1.A pins the builder's expected output verbatim across three void-returning pack shapes (0, 1, 2 args) plus one non-void shape (`f64 -> s32`) that exercises the `return typed_fn(...)` branch. Today: 4× "unresolved 'build_block_convert'" diagnostics — the builder isn't in stdlib yet. The next commit adds it to `library/modules/std/objc_block.sx` and the test flips green. The per-position type names in the emitted source come from `type_name(args[i])`; the slice itself is `[]Type` flowing through the new-form variadic + bare-`$args` path that the recent issues-0048/0049/0050 fixes unblocked.
This commit is contained in:
1
tests/expected/176-build-block-convert.exit
Normal file
1
tests/expected/176-build-block-convert.exit
Normal file
@@ -0,0 +1 @@
|
||||
0
|
||||
10
tests/expected/176-build-block-convert.txt
Normal file
10
tests/expected/176-build-block-convert.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
--- void / 0 args ---
|
||||
__invoke :: (block_self: *Block) -> void callconv(.c) { typed_fn : (*void) -> void = xx block_self.sx_fn; typed_fn(block_self.sx_env); } return .{ isa = @_NSConcreteStackBlock, flags = 0, reserved = 0, invoke = xx @__invoke, descriptor = xx @__sx_block_descriptor, sx_env = self.env, sx_fn = self.fn_ptr, };
|
||||
--- void / bool ---
|
||||
__invoke :: (block_self: *Block, arg0: bool) -> void callconv(.c) { typed_fn : (*void, bool) -> void = xx block_self.sx_fn; typed_fn(block_self.sx_env, arg0); } return .{ isa = @_NSConcreteStackBlock, flags = 0, reserved = 0, invoke = xx @__invoke, descriptor = xx @__sx_block_descriptor, sx_env = self.env, sx_fn = self.fn_ptr, };
|
||||
--- void / s64, string ---
|
||||
__invoke :: (block_self: *Block, arg0: s64, arg1: string) -> void callconv(.c) { typed_fn : (*void, s64, string) -> void = xx block_self.sx_fn; typed_fn(block_self.sx_env, arg0, arg1); } return .{ isa = @_NSConcreteStackBlock, flags = 0, reserved = 0, invoke = xx @__invoke, descriptor = xx @__sx_block_descriptor, sx_env = self.env, sx_fn = self.fn_ptr, };
|
||||
--- s32 / f64 ---
|
||||
__invoke :: (block_self: *Block, arg0: f64) -> s32 callconv(.c) { typed_fn : (*void, f64) -> s32 = xx block_self.sx_fn; return typed_fn(block_self.sx_env, arg0); } return .{ isa = @_NSConcreteStackBlock, flags = 0, reserved = 0, invoke = xx @__invoke, descriptor = xx @__sx_block_descriptor, sx_env = self.env, sx_fn = self.fn_ptr, };
|
||||
--- build done ---
|
||||
rt
|
||||
Reference in New Issue
Block a user