refactor(ffi-linkage): Phase 6.4 — migrate ffi/ #foreign→extern
Pure source rename across objc/objc_block/raylib/sdl3/wasm (~51 sites): fn-decl
markers (bare / 'objc' LIB ref) → 'extern …', and objc.sx's 2 import runtime
classes '#foreign #objc_class("X") {' → '#objc_class("X") extern {'. No bare
defined classes. Behavior-preserving. objc + objc_block validated directly by the
50 marked 13xx corpus examples (incl. import classes 1300/1301 + defined classes
1339/1349); raylib/ffi-sdl3/wasm (no marked importers on host) verified by
byte-identical 'sx ir' probes pre/post. Empty snapshot diff; suite green (647
corpus / 444 unit, 0 failed).
This commit is contained in:
@@ -35,16 +35,16 @@ BOOL :: i8;
|
||||
objc :: #library "objc";
|
||||
#framework "Foundation";
|
||||
|
||||
objc_getClass :: (name: [*]u8) -> *void #foreign objc;
|
||||
objc_lookUpClass :: (name: [*]u8) -> *void #foreign objc;
|
||||
sel_registerName :: (name: [*]u8) -> *void #foreign objc;
|
||||
class_createInstance :: (cls: *void, extra: usize) -> *void #foreign objc;
|
||||
object_getClass :: (obj: *void) -> *void #foreign objc;
|
||||
object_getIvar :: (obj: *void, ivar: *void) -> *void #foreign objc;
|
||||
object_setIvar :: (obj: *void, ivar: *void, val: *void) #foreign objc;
|
||||
objc_getClass :: (name: [*]u8) -> *void extern objc;
|
||||
objc_lookUpClass :: (name: [*]u8) -> *void extern objc;
|
||||
sel_registerName :: (name: [*]u8) -> *void extern objc;
|
||||
class_createInstance :: (cls: *void, extra: usize) -> *void extern objc;
|
||||
object_getClass :: (obj: *void) -> *void extern objc;
|
||||
object_getIvar :: (obj: *void, ivar: *void) -> *void extern objc;
|
||||
object_setIvar :: (obj: *void, ivar: *void, val: *void) extern objc;
|
||||
|
||||
// Declared with the simplest non-variadic shape. Cast per call site.
|
||||
objc_msgSend :: (recv: *void, sel: *void) -> *void #foreign objc;
|
||||
objc_msgSend :: (recv: *void, sel: *void) -> *void extern objc;
|
||||
|
||||
// ─── Dynamic class registration ─────────────────────────────────────────
|
||||
// Define a new Obj-C class at runtime: allocate the pair, attach methods +
|
||||
@@ -64,15 +64,15 @@ objc_msgSend :: (recv: *void, sel: *void) -> *void #foreign objc;
|
||||
// "c@:" -> BOOL method(id, SEL)
|
||||
// "@@:@" -> id method(id, SEL, id)
|
||||
// "B@:@@" -> BOOL method(id, SEL, id, id)
|
||||
objc_allocateClassPair :: (super: *void, name: [*]u8, extra: usize) -> *void #foreign objc;
|
||||
class_addMethod :: (cls: *void, sel: *void, imp: *void, types: [*]u8) -> bool #foreign objc;
|
||||
class_addProtocol :: (cls: *void, proto: *void) -> bool #foreign objc;
|
||||
objc_getProtocol :: (name: [*]u8) -> *void #foreign objc;
|
||||
objc_registerClassPair :: (cls: *void) -> void #foreign objc;
|
||||
objc_allocateClassPair :: (super: *void, name: [*]u8, extra: usize) -> *void extern objc;
|
||||
class_addMethod :: (cls: *void, sel: *void, imp: *void, types: [*]u8) -> bool extern objc;
|
||||
class_addProtocol :: (cls: *void, proto: *void) -> bool extern objc;
|
||||
objc_getProtocol :: (name: [*]u8) -> *void extern objc;
|
||||
objc_registerClassPair :: (cls: *void) -> void extern objc;
|
||||
|
||||
// Foundation C-API helpers (Foundation is already linked above via #framework).
|
||||
// NSLog takes an NSString format; the variadic tail is not exposed here.
|
||||
NSLog :: (fmt: *NSString) #foreign;
|
||||
NSLog :: (fmt: *NSString) extern;
|
||||
|
||||
// ─── NSObject (Phase 4 / M4.A) ───────────────────────────────────────────
|
||||
// Root of every Obj-C class hierarchy. Apple's runtime supplies the IMPs;
|
||||
@@ -88,7 +88,7 @@ NSLog :: (fmt: *NSString) #foreign;
|
||||
// sx isn't under clang ARC. Calling `view.release()` here is equivalent to
|
||||
// pre-ARC Obj-C source code: dispatches through the runtime, decrements the
|
||||
// refcount, fires `-dealloc` at zero.
|
||||
NSObject :: #foreign #objc_class("NSObject") {
|
||||
NSObject :: #objc_class("NSObject") extern {
|
||||
alloc :: () -> *NSObject;
|
||||
init :: (self: *Self) -> *NSObject;
|
||||
new :: () -> *NSObject; // shorthand for [[Cls alloc] init]
|
||||
@@ -108,7 +108,7 @@ NSObject :: #foreign #objc_class("NSObject") {
|
||||
// whose lifetime is tied to the NSString (don't free it). The `Into` impl
|
||||
// lets a string literal flow into any `*NSString` slot via `xx`, e.g.
|
||||
// `dict.objectForKey(xx "SomeKey")`.
|
||||
NSString :: #foreign #objc_class("NSString") {
|
||||
NSString :: #objc_class("NSString") extern {
|
||||
#extends NSObject;
|
||||
UTF8String :: (self: *Self) -> [*]u8;
|
||||
}
|
||||
@@ -134,8 +134,8 @@ impl Into(*NSString) for string {
|
||||
// Stdlib helper, not a language keyword. The closure call adds a frame —
|
||||
// for hot loops, inline the push/defer-pop pattern manually.
|
||||
|
||||
objc_autoreleasePoolPush :: () -> *void #foreign objc;
|
||||
objc_autoreleasePoolPop :: (pool: *void) #foreign objc;
|
||||
objc_autoreleasePoolPush :: () -> *void extern objc;
|
||||
objc_autoreleasePoolPop :: (pool: *void) extern objc;
|
||||
|
||||
autoreleasepool :: (body: Closure()) {
|
||||
pool := objc_autoreleasePoolPush();
|
||||
|
||||
Reference in New Issue
Block a user