mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-06-12 20:41:24 +00:00
Remove the need for a ConstructorToken
This commit removes the need for an injected `ConstructorToken` type and also cleans up the story we have for generating constructors a bit. After this commit a `constructor()` is omitted entirely if we're in non-debug mode and there's no actual listed constructor. Additionally we don't deal with splat arguments and rerouting constructors, Nick was kind enough to enlighten me about `Object.create` which is creating an instance without running the constructor! Instances of an exported type are now created through one of two methods: * If `#[wasm_bindgen(constructor)]` is present, then a `constructor` is generated with the appropriate signature. If a constructor is not present and we're in debug mode, a throwing constructor is generated. If we're in release mode and there's no constructor, no constructor is generated. * Otherwise if a binding returns an instance of a type (or otherwise needs to manfuacture an instance, then it will cause an internal `__wrap` function to be generated. This function will use `Object.create` to create an instance without running the constructor. This should ideally clean up our generated JS for classes quite a bit, making it much more lean-and-mean!
This commit is contained in:
@ -2,7 +2,7 @@ const wasm = require('wasm-bindgen-test.js');
|
||||
const assert = require('assert');
|
||||
|
||||
exports.js_simple = () => {
|
||||
const r = wasm.ClassesSimple.new();
|
||||
const r = new wasm.ClassesSimple();
|
||||
assert.strictEqual(r.add(0), 0);
|
||||
assert.strictEqual(r.add(1), 1);
|
||||
assert.strictEqual(r.add(1), 2);
|
||||
@ -70,7 +70,8 @@ exports.js_constructors = () => {
|
||||
assert.strictEqual(foo.get_number(), 1);
|
||||
foo.free();
|
||||
|
||||
const foo2 = wasm.ConstructorsFoo.new(2);
|
||||
assert.strictEqual(wasm.ConstructorsBar.new, undefined);
|
||||
const foo2 = new wasm.ConstructorsFoo(2);
|
||||
assert.strictEqual(foo2.get_number(), 2);
|
||||
foo2.free();
|
||||
|
||||
@ -78,7 +79,8 @@ exports.js_constructors = () => {
|
||||
assert.strictEqual(bar.get_sum(), 7);
|
||||
bar.free();
|
||||
|
||||
const bar2 = wasm.ConstructorsBar.other_name(5, 6);
|
||||
assert.strictEqual(wasm.ConstructorsBar.other_name, undefined);
|
||||
const bar2 = new wasm.ConstructorsBar(5, 6);
|
||||
assert.strictEqual(bar2.get_sum(), 11);
|
||||
bar2.free();
|
||||
|
||||
@ -121,12 +123,12 @@ exports.js_readonly_fields = () => {
|
||||
};
|
||||
|
||||
exports.js_double_consume = () => {
|
||||
const r = wasm.DoubleConsume.new();
|
||||
const r = new wasm.DoubleConsume();
|
||||
assert.throws(() => r.consume(r), /Attempt to use a moved value/);
|
||||
};
|
||||
|
||||
|
||||
exports.js_js_rename = () => {
|
||||
wasm.JsRename.new().bar();
|
||||
(new wasm.JsRename()).bar();
|
||||
wasm.classes_foo();
|
||||
};
|
||||
|
Reference in New Issue
Block a user