Skip to content

Commit d2b6496

Browse files
committed
Allow unsafe fn in declare_class! macro
1 parent c833a86 commit d2b6496

File tree

3 files changed

+74
-23
lines changed

3 files changed

+74
-23
lines changed

objc2-foundation/examples/declaration.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,12 @@ declare_class! {
4949
//
5050
// TODO: Investigate this!
5151
unsafe impl {
52+
/// This is `unsafe` because it expects `sender` to be valid
5253
#[sel(applicationDidFinishLaunching:)]
53-
fn did_finish_launching(&self, _sender: *mut Object) {
54+
unsafe fn did_finish_launching(&self, sender: *mut Object) {
5455
println!("Did finish launching!");
56+
// Do something with `sender`
57+
dbg!(sender);
5558
}
5659

5760
/// Some comment before `sel`.

objc2-foundation/src/declare_macro.rs

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
macro_rules! __inner_declare_class {
44
{@rewrite_methods @($($output:tt)*)} => {};
55
{
6+
// Unsafe variant
67
@rewrite_methods
78
@($($output:tt)*)
89

910
$(#[$($m:tt)*])*
10-
fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block
11+
unsafe fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block
1112

1213
$($rest:tt)*
1314
} => {
@@ -21,6 +22,38 @@ macro_rules! __inner_declare_class {
2122
// be used later on
2223
@($($args)*)
2324
@($(#[$($m)*])*)
25+
@(unsafe extern "C")
26+
@($name)
27+
@($($ret)?)
28+
@($body)
29+
30+
#($($output)*)
31+
}
32+
33+
$crate::__inner_declare_class! {
34+
@rewrite_methods
35+
@($($output)*)
36+
37+
$($rest)*
38+
}
39+
};
40+
{
41+
// Safe variant
42+
@rewrite_methods
43+
@($($output:tt)*)
44+
45+
$(#[$($m:tt)*])*
46+
fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block
47+
48+
$($rest:tt)*
49+
} => {
50+
$crate::__inner_declare_class! {
51+
@rewrite_self_arg
52+
53+
@($($args)*)
54+
@($($args)*)
55+
@($(#[$($m)*])*)
56+
@(extern "C")
2457
@($name)
2558
@($($ret)?)
2659
@($body)
@@ -145,15 +178,15 @@ macro_rules! __inner_declare_class {
145178
@($($_kind:tt)*)
146179
@($($args:tt)*)
147180
@($(#[$($m:tt)*])*)
181+
@($($qualifiers:tt)*)
148182
@($name:ident)
149183
@($($ret:ty)?)
150184
@($($body:tt)*)
151-
$($x:tt)*
152185
} => {
153186
$crate::__attribute_helper! {
154187
@strip_sel
155188
$(@[$($m)*])*
156-
(extern "C" fn $name($($args)*) $(-> $ret)? $($body)*)
189+
($($qualifiers)* fn $name($($args)*) $(-> $ret)? $($body)*)
157190
}
158191
};
159192

@@ -162,6 +195,7 @@ macro_rules! __inner_declare_class {
162195
@(class_method)
163196
@($($args:tt)*)
164197
@($(#[$($m:tt)*])*)
198+
@($($qualifiers:tt)*)
165199
@($name:ident)
166200
@($($_ret:tt)*)
167201
@($($_body:tt)*)
@@ -171,8 +205,8 @@ macro_rules! __inner_declare_class {
171205
@extract_sel
172206
$(#[$($m)*])*
173207
},
174-
Self::$name as $crate::__extern_fn_ptr! {
175-
$($args)*
208+
Self::$name as $crate::__fn_ptr! {
209+
@($($qualifiers)*) $($args)*
176210
},
177211
);
178212
};
@@ -181,6 +215,7 @@ macro_rules! __inner_declare_class {
181215
@(instance_method)
182216
@($($args:tt)*)
183217
@($(#[$($m:tt)*])*)
218+
@($($qualifiers:tt)*)
184219
@($name:ident)
185220
@($($_ret:tt)*)
186221
@($($_body:tt)*)
@@ -190,8 +225,8 @@ macro_rules! __inner_declare_class {
190225
@extract_sel
191226
$(#[$($m)*])*
192227
},
193-
Self::$name as $crate::__extern_fn_ptr! {
194-
$($args)*
228+
Self::$name as $crate::__fn_ptr! {
229+
@($($qualifiers)*) $($args)*
195230
},
196231
);
197232
};

objc2-foundation/src/macros.rs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -392,53 +392,59 @@ macro_rules! __attribute_helper {
392392

393393
}
394394

395-
/// Create an `extern "C" fn(...) -> _` type.
395+
/// Create function pointer type with inferred arguments.
396396
///
397397
/// TODO: Investigate if there's a better way of doing this.
398398
#[doc(hidden)]
399399
#[macro_export]
400-
macro_rules! __extern_fn_ptr {
400+
macro_rules! __fn_ptr {
401401
{
402+
@($($qualifiers:tt)*)
402403
$($param1:ident)? $(_)?: $param1_ty:ty,
403404
$($param2:ident)? $(_)?: $param2_ty:ty $(,)?
404405
} => {
405-
extern "C" fn(_, _) -> _
406+
$($qualifiers)* fn(_, _) -> _
406407
};
407408
{
409+
@($($qualifiers:tt)*)
408410
$($param1:ident)? $(_)?: $param1_ty:ty,
409411
$($param2:ident)? $(_)?: $param2_ty:ty,
410412
$($param3:ident)? $(_)?: $param3_ty:ty $(,)?
411413
} => {
412-
extern "C" fn(_, _, _) -> _
414+
$($qualifiers)* fn(_, _, _) -> _
413415
};
414416
{
417+
@($($qualifiers:tt)*)
415418
$($param1:ident)? $(_)?: $param1_ty:ty,
416419
$($param2:ident)? $(_)?: $param2_ty:ty,
417420
$($param3:ident)? $(_)?: $param3_ty:ty,
418421
$($param4:ident)? $(_)?: $param4_ty:ty $(,)?
419422
} => {
420-
extern "C" fn(_, _, _, _) -> _
423+
$($qualifiers)* fn(_, _, _, _) -> _
421424
};
422425
{
426+
@($($qualifiers:tt)*)
423427
$($param1:ident)? $(_)?: $param1_ty:ty,
424428
$($param2:ident)? $(_)?: $param2_ty:ty,
425429
$($param3:ident)? $(_)?: $param3_ty:ty,
426430
$($param4:ident)? $(_)?: $param4_ty:ty,
427431
$($param5:ident)? $(_)?: $param5_ty:ty $(,)?
428432
} => {
429-
extern "C" fn(_, _, _, _, _) -> _
433+
$($qualifiers)* fn(_, _, _, _, _) -> _
430434
};
431435
{
436+
@($($qualifiers:tt)*)
432437
$($param1:ident)? $(_)?: $param1_ty:ty,
433438
$($param2:ident)? $(_)?: $param2_ty:ty,
434439
$($param3:ident)? $(_)?: $param3_ty:ty,
435440
$($param4:ident)? $(_)?: $param4_ty:ty,
436441
$($param5:ident)? $(_)?: $param5_ty:ty,
437442
$($param6:ident)? $(_)?: $param6_ty:ty $(,)?
438443
} => {
439-
extern "C" fn(_, _, _, _, _, _) -> _
444+
$($qualifiers)* fn(_, _, _, _, _, _) -> _
440445
};
441446
{
447+
@($($qualifiers:tt)*)
442448
$($param1:ident)? $(_)?: $param1_ty:ty,
443449
$($param2:ident)? $(_)?: $param2_ty:ty,
444450
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -447,9 +453,10 @@ macro_rules! __extern_fn_ptr {
447453
$($param6:ident)? $(_)?: $param6_ty:ty,
448454
$($param7:ident)? $(_)?: $param7_ty:ty $(,)?
449455
} => {
450-
extern "C" fn(_, _, _, _, _, _, _) -> _
456+
$($qualifiers)* fn(_, _, _, _, _, _, _) -> _
451457
};
452458
{
459+
@($($qualifiers:tt)*)
453460
$($param1:ident)? $(_)?: $param1_ty:ty,
454461
$($param2:ident)? $(_)?: $param2_ty:ty,
455462
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -459,9 +466,10 @@ macro_rules! __extern_fn_ptr {
459466
$($param7:ident)? $(_)?: $param7_ty:ty,
460467
$($param8:ident)? $(_)?: $param8_ty:ty $(,)?
461468
} => {
462-
extern "C" fn(_, _, _, _, _, _, _, _) -> _
469+
$($qualifiers)* fn(_, _, _, _, _, _, _, _) -> _
463470
};
464471
{
472+
@($($qualifiers:tt)*)
465473
$($param1:ident)? $(_)?: $param1_ty:ty,
466474
$($param2:ident)? $(_)?: $param2_ty:ty,
467475
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -472,9 +480,10 @@ macro_rules! __extern_fn_ptr {
472480
$($param8:ident)? $(_)?: $param8_ty:ty,
473481
$($param9:ident)? $(_)?: $param9_ty:ty $(,)?
474482
} => {
475-
extern "C" fn(_, _, _, _, _, _, _, _, _) -> _
483+
$($qualifiers)* fn(_, _, _, _, _, _, _, _, _) -> _
476484
};
477485
{
486+
@($($qualifiers:tt)*)
478487
$($param1:ident)? $(_)?: $param1_ty:ty,
479488
$($param2:ident)? $(_)?: $param2_ty:ty,
480489
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -486,9 +495,10 @@ macro_rules! __extern_fn_ptr {
486495
$($param9:ident)? $(_)?: $param9_ty:ty,
487496
$($param10:ident)? $(_)?: $param10_ty:ty $(,)?
488497
} => {
489-
extern "C" fn(_, _, _, _, _, _, _, _, _, _) -> _
498+
$($qualifiers)* fn(_, _, _, _, _, _, _, _, _, _) -> _
490499
};
491500
{
501+
@($($qualifiers:tt)*)
492502
$($param1:ident)? $(_)?: $param1_ty:ty,
493503
$($param2:ident)? $(_)?: $param2_ty:ty,
494504
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -501,9 +511,10 @@ macro_rules! __extern_fn_ptr {
501511
$($param10:ident)? $(_)?: $param10_ty:ty,
502512
$($param11:ident)? $(_)?: $param11_ty:ty $(,)?
503513
} => {
504-
extern "C" fn(_, _, _, _, _, _, _, _, _, _, _) -> _
514+
$($qualifiers)* fn(_, _, _, _, _, _, _, _, _, _, _) -> _
505515
};
506516
{
517+
@($($qualifiers:tt)*)
507518
$($param1:ident)? $(_)?: $param1_ty:ty,
508519
$($param2:ident)? $(_)?: $param2_ty:ty,
509520
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -517,9 +528,10 @@ macro_rules! __extern_fn_ptr {
517528
$($param11:ident)? $(_)?: $param11_ty:ty,
518529
$($param12:ident)? $(_)?: $param12_ty:ty $(,)?
519530
} => {
520-
extern "C" fn(_, _, _, _, _, _, _, _, _, _, _, _) -> _
531+
$($qualifiers)* fn(_, _, _, _, _, _, _, _, _, _, _, _) -> _
521532
};
522533
{
534+
@($($qualifiers:tt)*)
523535
$($param1:ident)? $(_)?: $param1_ty:ty,
524536
$($param2:ident)? $(_)?: $param2_ty:ty,
525537
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -534,9 +546,10 @@ macro_rules! __extern_fn_ptr {
534546
$($param12:ident)? $(_)?: $param12_ty:ty,
535547
$($param13:ident)? $(_)?: $param13_ty:ty $(,)?
536548
} => {
537-
extern "C" fn(_, _, _, _, _, _, _, _, _, _, _, _, _) -> _
549+
$($qualifiers)* fn(_, _, _, _, _, _, _, _, _, _, _, _, _) -> _
538550
};
539551
{
552+
@($($qualifiers:tt)*)
540553
$($param1:ident)? $(_)?: $param1_ty:ty,
541554
$($param2:ident)? $(_)?: $param2_ty:ty,
542555
$($param3:ident)? $(_)?: $param3_ty:ty,
@@ -552,6 +565,6 @@ macro_rules! __extern_fn_ptr {
552565
$($param13:ident)? $(_)?: $param13_ty:ty,
553566
$($param14:ident)? $(_)?: $param14_ty:ty $(,)?
554567
} => {
555-
extern "C" fn(_, _, _, _, _, _, _, _, _, _, _, _, _, _) -> _
568+
$($qualifiers)* fn(_, _, _, _, _, _, _, _, _, _, _, _, _, _) -> _
556569
};
557570
}

0 commit comments

Comments
 (0)