Files
sx/examples/1338-ffi-objc-call-12-rect-u64-returns.sx
agra d8076b9333 lang: rename signed integer types sN -> iN
Surface rename of the signed integer family: s1..s64 become i1..i64
(u1..u64, usize, isize unchanged). 'string' keeps the s-prefix arm in
name classification; width parsing moves to the i-prefix arm next to
isize.

Internal TypeId tags follow the surface (.s8/.s16/.s32/.s64 ->
.i8/.i16/.i32/.i64), as do mono-key mangle fragments (ptr_i64,
tu_i64_bool) and all display/diagnostic formatting (i{d}).

Migrated in the same sweep: stdlib + examples + issue repros + FFI C
companions (shared symbol names like ffi_id_i64), expected
stdout/stderr/ir snapshots, specs.md, readme.md, CLAUDE.md/AGENTS.md,
implementation_plan.md, docs/, issue writeups. Vendored stb_image and
historical flow state left untouched.

zig build test: 426/426; examples suite: 595/595.
2026-06-12 09:31:53 +03:00

62 lines
2.3 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.
// Backfill for Phase 1D cluster 1.32 (PLAN-FFI.md): `#objc_call(CGRect)`
// and `#objc_call(u64)` against `class_addMethod`-registered IMPs.
// Both shapes were already exercised transitively in earlier work —
// CGRect is structurally a 4×f64 HFA (same as UIEdgeInsets from
// ffi-objc-call-07), and u64 is i64 at the LLVM level (same as the
// i64 return from ffi-objc-call-04's `hash`). The cluster-1.32
// migration of `uikit_keyboard_will_change_frame` was the first
// place we used both shapes through `#objc_call` directly, but the
// keyboard-change-frame callback isn't reached by the chess launch
// path, so this test gives the two shapes their own runtime lockdown.
#import "modules/std.sx";
#import "modules/build.sx";
#import "modules/ffi/objc.sx";
CGRect :: struct {
x: f64;
y: f64;
width: f64;
height: f64;
}
rect_imp :: (self: *void, _cmd: *void) -> CGRect callconv(.c) {
CGRect.{ x = 10.5, y = 20.5, width = 30.5, height = 40.5 }
}
u64_imp :: (self: *void, _cmd: *void) -> u64 callconv(.c) {
// sx integer-literal parser rejects values ≥ 2^63 even when the
// receiving type is u64, so the leading bit stays clear.
0x7FEDCBA987654321
}
main :: () -> i32 {
inline if OS == .macos {
ns_object := objc_getClass("NSObject".ptr);
my_cls := objc_allocateClassPair(ns_object, "SxRectU64Probe".ptr, 0);
// CGRect type encoding: {CGRect={CGPoint=dd}{CGSize=dd}}@: for a
// strict structural encoding, but the runtime accepts the
// flattened `{CGRect=dddd}@:` form for IMP registration since
// arm64 BOOL/struct returns route on the ABI shape, not on the
// type-encoding's nested-struct structure.
sel_rect := sel_registerName("rect".ptr);
sel_uval := sel_registerName("uval".ptr);
class_addMethod(my_cls, sel_rect, xx rect_imp, "{CGRect=dddd}@:".ptr);
class_addMethod(my_cls, sel_uval, xx u64_imp, "Q@:".ptr);
objc_registerClassPair(my_cls);
instance := class_createInstance(my_cls, 0);
r := #objc_call(CGRect)(instance, "rect");
print("rect = ({}, {}, {}, {})\n", r.x, r.y, r.width, r.height);
u := #objc_call(u64)(instance, "uval");
print("uval = {}\n", u);
}
inline if OS != .macos {
print("skipped (not macos)\n");
}
0
}