Skip to content

Commit b4fef41

Browse files
committed
Change AsCtor bool to enum
1 parent d5b9eff commit b4fef41

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,
@@ -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>
118123
struct 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

Comments
 (0)