@@ -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,
@@ -112,7 +117,7 @@ struct symbol_registrar {
112117 }
113118};
114119
115- template <bool AsCtor , typename ReturnType, typename ... Args>
120+ template <EM_METHOD_CALLER_KIND Kind , typename ReturnType, typename ... Args>
116121struct Signature {
117122 /*
118123 typedef typename BindingType<ReturnType>::WireType (*MethodCaller)(
@@ -123,7 +128,7 @@ struct Signature {
123128 */
124129 static EM_METHOD_CALLER get_method_caller () {
125130 static constexpr WithPolicies<>::ArgTypeList<ReturnType, Args...> args;
126- thread_local EM_METHOD_CALLER mc = _emval_get_method_caller (args.getCount (), args.getTypes (), AsCtor );
131+ thread_local EM_METHOD_CALLER mc = _emval_get_method_caller (args.getCount (), args.getTypes (), Kind );
127132 return mc;
128133 }
129134};
@@ -482,19 +487,23 @@ class val {
482487
483488 template <typename ... Args>
484489 val new_ (Args&&... args) const {
485- return internalCall<true , val>(internal::_emval_call, std::forward<Args>(args)...);
490+ using namespace internal ;
491+
492+ return internalCall<EM_METHOD_CALLER_KIND::CONSTRUCTOR, val>(_emval_call, std::forward<Args>(args)...);
486493 }
487494
488495 template <typename ... Args>
489496 val operator ()(Args&&... args) const {
490- return internalCall<false , val>(internal::_emval_call, std::forward<Args>(args)...);
497+ using namespace internal ;
498+
499+ return internalCall<EM_METHOD_CALLER_KIND::FUNCTION, val>(_emval_call, std::forward<Args>(args)...);
491500 }
492501
493502 template <typename ReturnValue, typename ... Args>
494503 ReturnValue call (const char * name, Args&&... args) const {
495504 using namespace internal ;
496505
497- return internalCall<false , ReturnValue>(
506+ return internalCall<EM_METHOD_CALLER_KIND::FUNCTION , ReturnValue>(
498507 [name](EM_METHOD_CALLER caller,
499508 EM_VAL handle,
500509 EM_DESTRUCTORS* destructorsRef,
@@ -578,14 +587,14 @@ class val {
578587 template <typename WrapperType>
579588 friend val internal::wrapped_extend (const std::string& , const val& );
580589
581- template <bool AsCtor , typename Ret, typename Implementation, typename ... Args>
590+ template <internal::EM_METHOD_CALLER_KIND Kind , typename Ret, typename Implementation, typename ... Args>
582591 Ret internalCall (Implementation impl, Args&&... args) const {
583592 using namespace internal ;
584593
585594 WireTypePack<Args...> argv (std::forward<Args>(args)...);
586595 EM_DESTRUCTORS destructors = nullptr ;
587596 EM_GENERIC_WIRE_TYPE result = impl (
588- Signature<AsCtor , Ret, Args...>::get_method_caller (),
597+ Signature<Kind , Ret, Args...>::get_method_caller (),
589598 as_handle (),
590599 &destructors,
591600 argv);
0 commit comments