Files
sx/examples/1333-ffi-objc-call-07-fp-hfa-return.sx
agra 12bf61a9fc std: restructure step 3 — ffi/ moves, build.sx, math dir spelling, fixtures
- objc.sx, objc_block.sx (from std/) + sdl3/opengl/raylib/stb/stb_truetype/
  wasm vendor bindings (from modules/ root) -> modules/ffi/
- std/uikit.sx deleted: platform/uikit.sx already declares UIApplicationMain
  and imports objc; '#framework "UIKit"' cannot live in a file imported on
  macOS targets (unconditional link directive, UIKit is iOS-only), so the
  three iOS-only examples carry the 3-line glue inline. 1607/1608/1616 also
  un-rotted (dead ns_string -> 'xx "..."' Into conversions, callconv(.c)
  msgSend fn-ptrs) — all three build for ios-sim/ios again.
- math/math.sx -> math/scalar.sx; one spelling '#import "modules/math"'
  everywhere (4 pinned IR snapshots regenerated: dir import adds Vec2/Mat4
  to the type tables).
- compiler.sx -> build.sx (imports, CLAUDE.md bundling table, specs.md).
- testpkg/ + test_c.sx -> tests/fixtures/ (resolve CWD-relative from repo
  root, same as vendors/).
- library-internal imports use full modules/... paths (std.sx tail,
  platform/bundle.sx, fixtures).
2026-06-11 08:37:22 +03:00

47 lines
1.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Phase 1 step 1.9 (PLAN-FFI.md): all-double HFA returns through
// `#objc_call`. 4×f64 = 32 B, stays in v0..v3 on AAPCS64 and
// xmm0..xmm3 on SysV AMD64 — same shape as UIEdgeInsets / NSRect /
// CGRect, the f32-vs-f64 landmine that bit us when we first wrote
// `safeAreaInsets` in uikit.sx.
//
// Nominally covered by ffi-objc-call-05's nil-recv NSRect case,
// but that only checks that zeros come back. Here we install a
// real IMP that returns specific non-zero values and verify each
// field comes through the float-register file intact.
#import "modules/std.sx";
#import "modules/build.sx";
#import "modules/ffi/objc.sx";
UIEdgeInsets :: struct {
top: f64;
left: f64;
bottom: f64;
right: f64;
}
insets_imp :: (self: *void, _cmd: *void) -> UIEdgeInsets callconv(.c) {
UIEdgeInsets.{ top = 1.5, left = 2.5, bottom = 3.5, right = 4.5 }
}
main :: () -> s32 {
inline if OS == .macos {
ns_object := objc_getClass("NSObject".ptr);
my_cls := objc_allocateClassPair(ns_object, "SxInsetsProbe".ptr, 0);
sel := sel_registerName("safeAreaInsets".ptr);
// Method type encoding: {UIEdgeInsets=dddd}@: → returns 4×f64,
// implicit (self: id, _cmd: SEL). `d` = double.
ok := class_addMethod(my_cls, sel, xx insets_imp, "{UIEdgeInsets=dddd}@:".ptr);
print("addMethod = {}\n", ok);
objc_registerClassPair(my_cls);
instance := class_createInstance(my_cls, 0);
ins := #objc_call(UIEdgeInsets)(instance, "safeAreaInsets");
print("insets = ({}, {}, {}, {})\n", ins.top, ins.left, ins.bottom, ins.right);
}
inline if OS != .macos {
print("skipped (not macos)\n");
}
0
}