File tree Expand file tree Collapse file tree 3 files changed +33
-0
lines changed Expand file tree Collapse file tree 3 files changed +33
-0
lines changed Original file line number Diff line number Diff line change @@ -2047,6 +2047,15 @@ var LibraryEmbind = {
2047
2047
upcast ,
2048
2048
downcast ) ;
2049
2049
2050
+ if ( registeredClass . baseClass ) {
2051
+ // Keep track of class hierarchy. Used to allow sub-classes to inherit class functions.
2052
+ if ( registeredClass . baseClass . __derivedClasses === undefined ) {
2053
+ registeredClass . baseClass . __derivedClasses = [ ] ;
2054
+ }
2055
+
2056
+ registeredClass . baseClass . __derivedClasses . push ( registeredClass ) ;
2057
+ }
2058
+
2050
2059
var referenceConverter = new RegisteredPointer ( name ,
2051
2060
registeredClass ,
2052
2061
true ,
@@ -2353,6 +2362,16 @@ var LibraryEmbind = {
2353
2362
} else {
2354
2363
proto [ methodName ] . overloadTable [ argCount - 1 ] = func ;
2355
2364
}
2365
+
2366
+ if ( classType . registeredClass . __derivedClasses ) {
2367
+ for ( const derivedClass of classType . registeredClass . __derivedClasses ) {
2368
+ if ( ! derivedClass . constructor . hasOwnProperty ( methodName ) ) {
2369
+ // TODO: Add support for overloads
2370
+ derivedClass . constructor [ methodName ] = func ;
2371
+ }
2372
+ }
2373
+ }
2374
+
2356
2375
return [ ] ;
2357
2376
} ) ;
2358
2377
return [ ] ;
Original file line number Diff line number Diff line change @@ -111,6 +111,12 @@ module({
111
111
derived . delete ( ) ;
112
112
} ) ;
113
113
114
+ test ( "class functions are inherited in subclasses" , function ( ) {
115
+ assert . equal ( "Base" , cm . Base . classFunction ( ) ) ;
116
+ assert . equal ( "Derived" , cm . Derived . classFunction ( ) ) ;
117
+ assert . equal ( "Derived" , cm . DerivedTwice . classFunction ( ) ) ;
118
+ } ) ;
119
+
114
120
test ( "calling method on unrelated class throws error" , function ( ) {
115
121
var a = new cm . HasTwoBases ;
116
122
var e = assert . throws ( cm . BindingError , function ( ) {
Original file line number Diff line number Diff line change @@ -490,6 +490,9 @@ class Base {
490
490
int getBaseMember () {
491
491
return baseMember;
492
492
}
493
+ static std::string classFunction () {
494
+ return " Base" ;
495
+ };
493
496
std::string name;
494
497
int member;
495
498
int baseMember;
@@ -546,6 +549,9 @@ class Derived : public Base{
546
549
int getMember () {
547
550
return member;
548
551
}
552
+ static std::string classFunction () {
553
+ return " Derived" ;
554
+ }
549
555
int member;
550
556
private:
551
557
std::string name_;
@@ -2019,6 +2025,7 @@ EMSCRIPTEN_BINDINGS(tests) {
2019
2025
.function (" getMember" , &Derived::getMember)
2020
2026
.function (" setMember" , &Derived::setMember)
2021
2027
.property (" member" , &Derived::member)
2028
+ .class_function (" classFunction" , &Derived::classFunction)
2022
2029
;
2023
2030
2024
2031
class_<Base>(" Base" )
@@ -2033,6 +2040,7 @@ EMSCRIPTEN_BINDINGS(tests) {
2033
2040
.function (" setBaseMember" , &Base::setBaseMember)
2034
2041
.property (" member" , &Base::member)
2035
2042
.property (" baseMember" , &Base::baseMember)
2043
+ .class_function (" classFunction" , &Base::classFunction)
2036
2044
;
2037
2045
2038
2046
class_<SecondBase>(" SecondBase" )
You can’t perform that action at this time.
0 commit comments