1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include <emscripten/bind.h>
#include <emscripten.h>
using namespace emscripten;
struct ValueObject {
ValueObject(): value(43) {};
int value;
};
struct ValueArray {
ValueArray(): x(44) {};
int x;
};
struct Foo {
Foo(): value(45) {};
int value;
};
enum Enum { ONE, TWO };
EMSCRIPTEN_BINDINGS(xxx) {
value_object<ValueObject>("ValueObject")
.field("value", &ValueObject::value);
value_array<ValueArray>("ValueArray")
.element(&ValueArray::x);
class_<Foo>("Foo")
.property("value", &Foo::value);
enum_<Enum>("Enum")
.value("ONE", ONE)
.value("TWO", TWO);
}
int main() {
EM_ASM(
globalThis["passthrough"] = (arg) => {
return arg;
};
globalThis["passthroughValueObject"] = (arg) => {
return arg.value;
};
globalThis["passthroughValueArray"] = (arg) => {
return arg[0];
};
globalThis["passthroughClass"] = (arg) => {
const value = arg.value;
arg.delete();
return value;
};
globalThis["passthroughMemoryView"] = (arg) => {
return arg[2];
};
);
// These tests execute all the various readValueFromPointer functions for each
// of the different binding types.
assert(val::global().call<bool>("passthrough", true));
assert(val::global().call<int>("passthrough", 42) == 42);
assert(val::global().call<double>("passthrough", 42.2) == 42.2);
ValueObject vo;
assert(val::global().call<int>("passthroughValueObject", vo) == 43);
ValueArray va;
assert(val::global().call<int>("passthroughValueArray", va) == 44);
Foo foo;
assert(val::global().call<int>("passthroughClass", foo) == 45);
assert(val::global().call<std::string>("passthrough", val("abc")) == "abc");
std::string str = "hello";
assert(val::global().call<std::string>("passthrough", str) == "hello");
std::wstring wstr = L"abc";
assert(val::global().call<std::wstring>("passthrough", wstr) == L"abc");
static const int data[] = {0, 1, 2};
assert(val::global().call<int>("passthroughMemoryView", typed_memory_view(3, data)) == 2);
assert(val::global().call<Enum>("passthrough", ONE) == ONE);
return 0;
}
|