Skip to content

Commit 0911812

Browse files
Fix Foundation<->CoreFoundation bridges
1 parent 367184d commit 0911812

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

dub.sdl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ configuration "unittest" {
2323

2424
lflags "-framework" "Foundation" "-framework" "CoreFoundation" "-all_load"
2525
dependency "silly" version=">=1.1.1"
26+
dependency "numem:hookset-libc" version="*"
2627
}
2728

2829
# For platforms that don't support it.

source/objc/bridge.d

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct objd_bridge(Allowed...){
2727
*/
2828
pragma(inline)
2929
To __bridge(To, From)(From from) @nogc @trusted pure {
30-
static assert(objd_sym_bridgable!(To, From), From.stringof~" can't safely be bridged to "~To.stringof~"!");
30+
static assert(objd_can_bridge!(To, From), From.stringof~" can't safely be bridged to "~To.stringof~"!");
3131

3232
return *cast(To*)&from;
3333
}
@@ -44,7 +44,7 @@ To __bridge(To, From)(From from) @nogc @trusted pure {
4444
*/
4545
pragma(inline)
4646
To __bridge_retained(To, From)(From from) @nogc @trusted pure if (is(To : NSObjectProtocol)) {
47-
static assert(objd_sym_bridgable!(To, From), From.stringof~" can't safely be bridged to "~To.stringof~"!");
47+
static assert(objd_can_bridge!(To, From), From.stringof~" can't safely be bridged to "~To.stringof~"!");
4848

4949
return cast(To)CFBridgingRetain(*cast(From*)&from);
5050
}
@@ -61,7 +61,7 @@ To __bridge_retained(To, From)(From from) @nogc @trusted pure if (is(To : NSObje
6161
*/
6262
pragma(inline)
6363
To __bridge_transfer(To, From)(From from) @nogc @trusted pure if (is(To : CFTypeRef)) {
64-
static assert(objd_sym_bridgable!(To, From), From.stringof~" can't safely be bridged to "~To.stringof~"!");
64+
static assert(objd_can_bridge!(To, From), From.stringof~" can't safely be bridged to "~To.stringof~"!");
6565

6666
return cast(To)CFBridgingRelease(*cast(From*)&from);
6767
}
@@ -91,23 +91,23 @@ private:
9191
extern(C) extern void* CFBridgingRetain(void*); // To CF
9292
extern(C) extern void* CFBridgingRelease(void*); // From CF
9393

94-
template objd_sym_bridgable(To, From) {
94+
template objd_can_bridge(To, From) {
9595
alias toUda = getUDAs!(To, objd_bridge);
9696
alias fromUda = getUDAs!(From, objd_bridge);
97+
template __is_bridagable(ToCheck) {
98+
template __is_bridagable(T) {
99+
enum __is_bridagable = is(T == ToCheck);
100+
}
101+
}
97102

98-
static if (toUda.length > 0) {
99-
enum objd_sym_bridgable =
100-
anySatisfy!(objd_is_bridagable!To, toUda[0].allowed) ||
101-
anySatisfy!(objd_is_bridagable!From, toUda[0].allowed);
102-
} else static if (fromUda.length > 0) {
103-
enum objd_sym_bridgable =
104-
anySatisfy!(objd_is_bridagable!To, fromUda[0].allowed) ||
105-
anySatisfy!(objd_is_bridagable!From, fromUda[0].allowed);
106-
} else enum objd_sym_bridgable = false;
107-
}
108-
109-
template objd_is_bridagable(ToCheck) {
110-
template objd_is_bridagable(T) {
111-
enum objd_is_bridagable = is(T == ToCheck);
103+
static foreach(uda; AliasSeq!(fromUda, toUda)) {
104+
static if (
105+
!is(typeof(objd_can_bridge) == bool) &&
106+
(anySatisfy!(__is_bridagable!To, uda.allowed) ||
107+
anySatisfy!(__is_bridagable!From, uda.allowed))
108+
) enum objd_can_bridge = true;
112109
}
110+
111+
static if(!is(typeof(objd_can_bridge) == bool))
112+
enum objd_can_bridge = false;
113113
}

0 commit comments

Comments
 (0)