@@ -31,6 +31,11 @@ namespace internal {
3131template <typename WrapperType>
3232val wrapped_extend (const std::string&, const val&);
3333
34+ enum class EM_METHOD_CALLER_KIND {
35+ FUNCTION = 0 ,
36+ CONSTRUCTOR = 1 ,
37+ };
38+
3439// Implemented in JavaScript. Don't call these directly.
3540extern " C" {
3641
@@ -87,7 +92,7 @@ EM_GENERIC_WIRE_TYPE _emval_call(
8792EM_METHOD_CALLER _emval_get_method_caller (
8893 unsigned argCount, // including return value
8994 const TYPEID argTypes[],
90- bool asCtor);
95+ EM_METHOD_CALLER_KIND asCtor);
9196EM_GENERIC_WIRE_TYPE _emval_call_method (
9297 EM_METHOD_CALLER caller,
9398 EM_VAL handle,
@@ -114,7 +119,7 @@ struct symbol_registrar {
114119 }
115120};
116121
117- template <bool AsCtor , typename ReturnType, typename ... Args>
122+ template <EM_METHOD_CALLER_KIND Kind , typename ReturnType, typename ... Args>
118123struct Signature {
119124 /*
120125 typedef typename BindingType<ReturnType>::WireType (*MethodCaller)(
@@ -125,7 +130,7 @@ struct Signature {
125130 */
126131 static EM_METHOD_CALLER get_method_caller () {
127132 static constexpr WithPolicies<>::ArgTypeList<ReturnType, Args...> args;
128- thread_local EM_METHOD_CALLER mc = _emval_get_method_caller (args.getCount (), args.getTypes (), AsCtor );
133+ thread_local EM_METHOD_CALLER mc = _emval_get_method_caller (args.getCount (), args.getTypes (), Kind );
129134 return mc;
130135 }
131136};
@@ -484,19 +489,23 @@ class val {
484489
485490 template <typename ... Args>
486491 val new_ (Args&&... args) const {
487- return internalCall<true , val>(internal::_emval_call, std::forward<Args>(args)...);
492+ using namespace internal ;
493+
494+ return internalCall<EM_METHOD_CALLER_KIND::CONSTRUCTOR, val>(_emval_call, std::forward<Args>(args)...);
488495 }
489496
490497 template <typename ... Args>
491498 val operator ()(Args&&... args) const {
492- return internalCall<false , val>(internal::_emval_call, std::forward<Args>(args)...);
499+ using namespace internal ;
500+
501+ return internalCall<EM_METHOD_CALLER_KIND::FUNCTION, val>(_emval_call, std::forward<Args>(args)...);
493502 }
494503
495504 template <typename ReturnValue, typename ... Args>
496505 ReturnValue call (const char * name, Args&&... args) const {
497506 using namespace internal ;
498507
499- return internalCall<false , ReturnValue>(
508+ return internalCall<EM_METHOD_CALLER_KIND::FUNCTION , ReturnValue>(
500509 [name](EM_METHOD_CALLER caller,
501510 EM_VAL handle,
502511 EM_DESTRUCTORS* destructorsRef,
@@ -586,14 +595,14 @@ class val {
586595 template <typename WrapperType>
587596 friend val internal::wrapped_extend (const std::string& , const val& );
588597
589- template <bool AsCtor , typename Ret, typename Implementation, typename ... Args>
598+ template <internal::EM_METHOD_CALLER_KIND Kind , typename Ret, typename Implementation, typename ... Args>
590599 Ret internalCall (Implementation impl, Args&&... args) const {
591600 using namespace internal ;
592601
593602 WireTypePack<Args...> argv (std::forward<Args>(args)...);
594603 EM_DESTRUCTORS destructors = nullptr ;
595604 EM_GENERIC_WIRE_TYPE result = impl (
596- Signature<AsCtor , Ret, Args...>::get_method_caller (),
605+ Signature<Kind , Ret, Args...>::get_method_caller (),
597606 as_handle (),
598607 &destructors,
599608 argv);
0 commit comments