Skip to content

Commit 1336355

Browse files
[embind] Fix custom registered types used with field bindings. (#21949)
* fix friend declaration in val.h The code as it was trying to declare a template instantiation as a friend, and then specialize it later, which caused a build break. This fix just declares the whole template as a friend. * [embind] Add test for custom registered types used with field bindings. --------- Co-authored-by: walkingeyerobot <[email protected]>
1 parent 2e3d7f1 commit 1336355

File tree

6 files changed

+32
-24
lines changed

6 files changed

+32
-24
lines changed

system/include/emscripten/val.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,8 @@ class val {
676676
pthread_t thread;
677677
EM_VAL handle;
678678

679-
friend struct internal::BindingType<val>;
679+
template <typename T, typename>
680+
friend struct ::emscripten::internal::BindingType;
680681
};
681682

682683
struct val::iterator {

test/other/embind_tsgen.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,13 @@ struct ValArr {
5252
int x, y, z;
5353
};
5454

55+
EMSCRIPTEN_DECLARE_VAL_TYPE(CallbackType);
56+
5557
struct ValObj {
5658
Foo foo;
5759
Bar bar;
60+
CallbackType callback;
61+
ValObj() : callback(val::undefined()) {}
5862
};
5963

6064
class ClassWithConstructor {
@@ -81,8 +85,6 @@ int smart_ptr_function(std::shared_ptr<ClassWithSmartPtrConstructor>) {
8185
return 0;
8286
}
8387

84-
EMSCRIPTEN_DECLARE_VAL_TYPE(CallbackType);
85-
8688
int function_with_callback_param(CallbackType ct) {
8789
ct(val("hello"));
8890
return 0;
@@ -165,7 +167,8 @@ EMSCRIPTEN_BINDINGS(Test) {
165167

166168
value_object<ValObj>("ValObj")
167169
.field("foo", &ValObj::foo)
168-
.field("bar", &ValObj::bar);
170+
.field("bar", &ValObj::bar)
171+
.field("callback", &ValObj::callback);
169172

170173
register_vector<int>("IntVec");
171174

test/other/embind_tsgen.d.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ export interface Foo {
6565
delete(): void;
6666
}
6767

68-
export type ValObj = {
69-
foo: Foo,
70-
bar: Bar
71-
};
72-
7368
export interface ClassWithConstructor {
7469
fn(_0: number): number;
7570
delete(): void;
@@ -84,6 +79,12 @@ export interface ClassWithSmartPtrConstructor {
8479
delete(): void;
8580
}
8681

82+
export type ValObj = {
83+
foo: Foo,
84+
bar: Bar,
85+
callback: (message: string) => void
86+
};
87+
8788
export interface BaseClass {
8889
fn(_0: number): number;
8990
delete(): void;

test/other/embind_tsgen_ignore_1.d.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,6 @@ export interface Foo {
7474
delete(): void;
7575
}
7676

77-
export type ValObj = {
78-
foo: Foo,
79-
bar: Bar
80-
};
81-
8277
export interface ClassWithConstructor {
8378
fn(_0: number): number;
8479
delete(): void;
@@ -93,6 +88,12 @@ export interface ClassWithSmartPtrConstructor {
9388
delete(): void;
9489
}
9590

91+
export type ValObj = {
92+
foo: Foo,
93+
bar: Bar,
94+
callback: (message: string) => void
95+
};
96+
9697
export interface BaseClass {
9798
fn(_0: number): number;
9899
delete(): void;

test/other/embind_tsgen_ignore_2.d.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,6 @@ export interface Foo {
5151
delete(): void;
5252
}
5353

54-
export type ValObj = {
55-
foo: Foo,
56-
bar: Bar
57-
};
58-
5954
export interface ClassWithConstructor {
6055
fn(_0: number): number;
6156
delete(): void;
@@ -70,6 +65,12 @@ export interface ClassWithSmartPtrConstructor {
7065
delete(): void;
7166
}
7267

68+
export type ValObj = {
69+
foo: Foo,
70+
bar: Bar,
71+
callback: (message: string) => void
72+
};
73+
7374
export interface BaseClass {
7475
fn(_0: number): number;
7576
delete(): void;

test/other/embind_tsgen_ignore_3.d.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ export interface Foo {
6565
delete(): void;
6666
}
6767

68-
export type ValObj = {
69-
foo: Foo,
70-
bar: Bar
71-
};
72-
7368
export interface ClassWithConstructor {
7469
fn(_0: number): number;
7570
delete(): void;
@@ -84,6 +79,12 @@ export interface ClassWithSmartPtrConstructor {
8479
delete(): void;
8580
}
8681

82+
export type ValObj = {
83+
foo: Foo,
84+
bar: Bar,
85+
callback: (message: string) => void
86+
};
87+
8788
export interface BaseClass {
8889
fn(_0: number): number;
8990
delete(): void;

0 commit comments

Comments
 (0)