Skip to content

Commit 7ba7779

Browse files
committed
Change AsCtor bool to enum
1 parent b2ab1a5 commit 7ba7779

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

src/embind/emval.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ var LibraryEmVal = {
331331
'$newFunc',
332332
#endif
333333
],
334-
_emval_get_method_caller: (argCount, argTypes, asCtor) => {
334+
_emval_get_method_caller: (argCount, argTypes, kind) => {
335335
var types = emval_lookupTypes(argCount, argTypes);
336336
var retType = types.shift();
337337
argCount--; // remove the shifted off return type
@@ -344,7 +344,7 @@ var LibraryEmVal = {
344344
argN[i] = types[i]['readValueFromPointer'](args + offset);
345345
offset += types[i]['argPackAdvance'];
346346
}
347-
var rv = asCtor ? reflectConstruct(func, argN) : func.apply(obj, argN);
347+
var rv = kind === /* CONSTRUCTOR */ 1 ? reflectConstruct(func, argN) : func.apply(obj, argN);
348348
for (var i = 0; i < argCount; ++i) {
349349
if (types[i].deleteObject) {
350350
types[i].deleteObject(argN[i]);
@@ -360,7 +360,9 @@ var LibraryEmVal = {
360360

361361
var offset = 0;
362362
var argsList = []; // 'obj?, arg0, arg1, arg2, ... , argN'
363-
if (!asCtor) argsList.push("obj");
363+
if (kind === /* FUNCTION */ 0) {
364+
argsList.push("obj");
365+
}
364366
var params = ["retType"];
365367
var args = [retType];
366368
for (var i = 0; i < argCount; ++i) {
@@ -371,8 +373,9 @@ var LibraryEmVal = {
371373
` var arg${i} = argType${i}.readValueFromPointer(args${offset ? "+" + offset : ""});\n`;
372374
offset += types[i]['argPackAdvance'];
373375
}
376+
var invoker = kind === /* CONSTRUCTOR */ 1 ? 'new func' : 'func.call';
374377
functionBody +=
375-
` var rv = ${asCtor ? 'new func' : 'func.call'}(${argsList.join(", ")});\n`;
378+
` var rv = ${invoker}(${argsList.join(", ")});\n`;
376379
for (var i = 0; i < argCount; ++i) {
377380
if (types[i]['deleteObject']) {
378381
functionBody +=

system/include/emscripten/val.h

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ namespace internal {
3131
template<typename WrapperType>
3232
val 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.
3540
extern "C" {
3641

@@ -87,7 +92,7 @@ EM_GENERIC_WIRE_TYPE _emval_call(
8792
EM_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);
9196
EM_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>
116121
struct 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

Comments
 (0)