Skip to content

Commit c5926e3

Browse files
committed
(embind) fix misindexed template parameters
1 parent 5cdadd6 commit c5926e3

File tree

3 files changed

+33
-15
lines changed

3 files changed

+33
-15
lines changed

system/include/emscripten/bind.h

+15-15
Original file line numberDiff line numberDiff line change
@@ -820,8 +820,8 @@ inline T* getContext(const T& t) {
820820
return ret;
821821
}
822822

823-
template<typename Accessor, typename ValueType>
824-
struct PropertyTag {};
823+
template<typename Func, typename ValueTypeOrSignature>
824+
struct FunctionTag {};
825825

826826
template<typename T>
827827
struct GetterPolicy;
@@ -887,7 +887,7 @@ struct GetterPolicy<std::function<GetterReturnType(const GetterThisType&)>> {
887887
};
888888

889889
template<typename Getter, typename GetterReturnType>
890-
struct GetterPolicy<PropertyTag<Getter, GetterReturnType>> {
890+
struct GetterPolicy<FunctionTag<Getter, GetterReturnType>> {
891891
typedef GetterReturnType ReturnType;
892892
typedef Getter Context;
893893

@@ -968,7 +968,7 @@ struct SetterPolicy<std::function<SetterReturnType(SetterThisType&, SetterArgume
968968
};
969969

970970
template<typename Setter, typename SetterArgumentType>
971-
struct SetterPolicy<PropertyTag<Setter, SetterArgumentType>> {
971+
struct SetterPolicy<FunctionTag<Setter, SetterArgumentType>> {
972972
typedef SetterArgumentType ArgumentType;
973973
typedef Setter Context;
974974

@@ -1497,9 +1497,9 @@ struct RegisterClassConstructor<std::function<ReturnType (Args...)>> {
14971497
}
14981498
};
14991499

1500-
template<typename ReturnType, typename... Args>
1501-
struct RegisterClassConstructor<ReturnType (Args...)> {
1502-
template <typename ClassType, typename Callable, typename... Policies>
1500+
template<typename Callable, typename ReturnType, typename... Args>
1501+
struct RegisterClassConstructor<FunctionTag<Callable, ReturnType (Args...)>> {
1502+
template <typename ClassType, typename... Policies>
15031503
static void invoke(Callable& factory) {
15041504
typename WithPolicies<Policies...>::template ArgTypeList<ReturnType, Args...> args;
15051505
using ReturnPolicy = rvp::take_ownership;
@@ -1633,10 +1633,10 @@ struct RegisterClassMethod<std::function<ReturnType (ThisType, Args...)>> {
16331633
}
16341634
};
16351635

1636-
template<typename ReturnType, typename ThisType, typename... Args>
1637-
struct RegisterClassMethod<ReturnType (ThisType, Args...)> {
1636+
template<typename Callable, typename ReturnType, typename ThisType, typename... Args>
1637+
struct RegisterClassMethod<FunctionTag<Callable, ReturnType (ThisType, Args...)>> {
16381638

1639-
template <typename ClassType, typename Callable, typename... Policies>
1639+
template <typename ClassType, typename... Policies>
16401640
static void invoke(const char* methodName,
16411641
Callable& callable) {
16421642
typename WithPolicies<Policies...>::template ArgTypeList<ReturnType, ThisType, Args...> args;
@@ -1739,7 +1739,7 @@ class class_ {
17391739
using invoker = internal::RegisterClassConstructor<
17401740
typename std::conditional<std::is_same<Signature, internal::DeduceArgumentsTag>::value,
17411741
Callable,
1742-
Signature>::type>;
1742+
internal::FunctionTag<Callable, Signature>>::type>;
17431743

17441744
invoker::template invoke<ClassType, Policies...>(callable);
17451745
return *this;
@@ -1819,7 +1819,7 @@ class class_ {
18191819
using invoker = internal::RegisterClassMethod<
18201820
typename std::conditional<std::is_same<Signature, internal::DeduceArgumentsTag>::value,
18211821
Callable,
1822-
Signature>::type>;
1822+
internal::FunctionTag<Callable, Signature>>::type>;
18231823

18241824
invoker::template invoke<ClassType, Policies...>(methodName, callable);
18251825
return *this;
@@ -1896,7 +1896,7 @@ class class_ {
18961896
typedef GetterPolicy<
18971897
typename std::conditional<std::is_same<PropertyType, internal::DeduceArgumentsTag>::value,
18981898
Getter,
1899-
PropertyTag<Getter, PropertyType>>::type> GP;
1899+
FunctionTag<Getter, PropertyType>>::type> GP;
19001900
using ReturnPolicy = GetReturnValuePolicy<typename GP::ReturnType, Policies...>::tag;
19011901
auto gter = &GP::template get<ClassType, ReturnPolicy>;
19021902
typename WithPolicies<Policies...>::template ArgTypeList<typename GP::ReturnType> returnType;
@@ -1930,11 +1930,11 @@ class class_ {
19301930
typedef GetterPolicy<
19311931
typename std::conditional<std::is_same<PropertyType, internal::DeduceArgumentsTag>::value,
19321932
Getter,
1933-
PropertyTag<Getter, PropertyType>>::type> GP;
1933+
FunctionTag<Getter, PropertyType>>::type> GP;
19341934
typedef SetterPolicy<
19351935
typename std::conditional<std::is_same<PropertyType, internal::DeduceArgumentsTag>::value,
19361936
Setter,
1937-
PropertyTag<Setter, PropertyType>>::type> SP;
1937+
FunctionTag<Setter, PropertyType>>::type> SP;
19381938

19391939

19401940
auto gter = &GP::template get<ClassType, ReturnPolicy>;

test/embind/embind.test.js

+8
Original file line numberDiff line numberDiff line change
@@ -1461,6 +1461,9 @@ module({
14611461
assert.equal("foo", b.getValFunction());
14621462
b.setValFunction("bar");
14631463

1464+
// get & set with templated signature
1465+
assert.equal("bar", b.getThisPointer().getVal());
1466+
14641467
// get & set via 'callable'
14651468
assert.equal("bar", b.getValFunctor());
14661469
b.setValFunctor("baz");
@@ -1834,6 +1837,11 @@ module({
18341837
assert.equal("AbstractClass has no accessible constructor", e.message);
18351838
});
18361839

1840+
test("can construct class with external constructor with custom signature", function() {
1841+
const valHolder = new cm.ValHolder(1,2);
1842+
assert.equal(valHolder.getVal(), 3);
1843+
});
1844+
18371845
test("can construct class with external constructor", function() {
18381846
var e = new cm.HasExternalConstructor("foo");
18391847
assert.instanceof(e, cm.HasExternalConstructor);

test/embind/embind_test.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -327,10 +327,18 @@ ValHolder emval_test_return_ValHolder() {
327327
return val::object();
328328
}
329329

330+
ValHolder valholder_from_sum(int x, int y) {
331+
return val(x+y);
332+
}
333+
330334
val valholder_get_value_mixin(const ValHolder& target) {
331335
return target.getVal();
332336
}
333337

338+
ValHolder* valholder_get_this_ptr(ValHolder& target) {
339+
return &target;
340+
}
341+
334342
void valholder_set_value_mixin(ValHolder& target, const val& value) {
335343
target.setVal(value);
336344
}
@@ -2005,13 +2013,15 @@ EMSCRIPTEN_BINDINGS(tests) {
20052013
class_<ValHolder>("ValHolder")
20062014
.smart_ptr<std::shared_ptr<ValHolder>>("std::shared_ptr<ValHolder>")
20072015
.constructor<val>()
2016+
.constructor<ValHolder(int, int)>(&valholder_from_sum, allow_raw_pointers()) // custom signature with policy
20082017
.function("getVal", &ValHolder::getVal)
20092018
.function("getValNonConst", &ValHolder::getValNonConst)
20102019
.function("getConstVal", &ValHolder::getConstVal)
20112020
.function("getValConstRef", &ValHolder::getValConstRef)
20122021
.function("setVal", &ValHolder::setVal)
20132022
.function("getValFunction", std::function<val(const ValHolder&)>(&valholder_get_value_mixin))
20142023
.function("setValFunction", std::function<void(ValHolder&, const val&)>(&valholder_set_value_mixin))
2024+
.function<ValHolder*(ValHolder&)>("getThisPointer", std::function<ValHolder*(ValHolder&)>(&valholder_get_this_ptr), allow_raw_pointer<ret_val>())
20152025
.function<val(const ValHolder&)>("getValFunctor", std::bind(&valholder_get_value_mixin, _1))
20162026
.function<void(ValHolder&, const val&)>("setValFunctor", std::bind(&valholder_set_value_mixin, _1, _2))
20172027
.property("val", &ValHolder::getVal, &ValHolder::setVal)

0 commit comments

Comments
 (0)