Skip to content

Commit af6dc09

Browse files
emscripten/val: allow Policies in vecFromJSArray (#16114)
1 parent 752d858 commit af6dc09

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

system/include/emscripten/val.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -634,14 +634,14 @@ namespace emscripten {
634634
};
635635
}
636636

637-
template <typename T>
638-
std::vector<T> vecFromJSArray(const val& v) {
637+
template <typename T, typename... Policies>
638+
std::vector<T> vecFromJSArray(const val& v, Policies... policies) {
639639
const size_t l = v["length"].as<size_t>();
640640

641641
std::vector<T> rv;
642642
rv.reserve(l);
643643
for (size_t i = 0; i < l; ++i) {
644-
rv.push_back(v[i].as<T>());
644+
rv.push_back(v[i].as<T>(std::forward<Policies>(policies)...));
645645
}
646646

647647
return rv;

tests/embind/test_val.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,18 @@ void throw_js_error(val js_error)
5858
js_error.throw_();
5959
}
6060

61+
struct Dummy {};
62+
63+
Dummy * makeDummy()
64+
{
65+
return new Dummy();
66+
}
67+
6168
EMSCRIPTEN_BINDINGS(test_bindings)
6269
{
70+
emscripten::class_<Dummy>("Dummy");
6371
emscripten::function("throw_js_error", &throw_js_error);
72+
emscripten::function("makeDummy", &makeDummy, emscripten::allow_raw_pointers());
6473
}
6574

6675
int main()
@@ -574,7 +583,7 @@ int main()
574583
ensure_js("test_val_throw_('message')");
575584
ensure_js("test_val_throw_(new TypeError('message'))");
576585

577-
// this test should probably go elsewhere as it is not a member of val
586+
// these tests should probably go elsewhere as it is not a member of val
578587
test("template<typename T> std::vector<T> vecFromJSArray(const val& v)");
579588
EM_ASM(
580589
// can't declare like this because i get:
@@ -593,6 +602,18 @@ int main()
593602
ensure(aAsArray.at(2).as<string>() == "b");
594603
ensure(aAsArray.size() == 4);
595604

605+
test("template<typename T> std::vector<T *> vecFromJSArray(const val& v)");
606+
EM_ASM(
607+
b = [];
608+
b[0] = Module.makeDummy();
609+
b[1] = Module.makeDummy();
610+
);
611+
const std::vector<Dummy *>& bAsArray = vecFromJSArray<Dummy *>(val::global("b"), allow_raw_pointers());
612+
ensure(bAsArray.size() == 2);
613+
for (auto *dummy : bAsArray) {
614+
delete dummy;
615+
}
616+
596617
test("template<typename T> std::vector<T> convertJSArrayToNumberVector(const val& v)");
597618

598619
const std::vector<float>& aAsNumberVectorFloat = convertJSArrayToNumberVector<float>(val::global("a"));

tests/embind/test_val.out

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,9 @@ pass
251251
pass
252252
pass
253253
test:
254+
template<typename T> std::vector<T *> vecFromJSArray(const val& v)
255+
pass
256+
test:
254257
template<typename T> std::vector<T> convertJSArrayToNumberVector(const val& v)
255258
pass
256259
pass

0 commit comments

Comments
 (0)