Skip to content

Commit aefa094

Browse files
authored
Enable features in libwabt.js by default (#2109)
This applies the same defaults for features in the JavaScript-compiled version as the native tools. Without this change, enabling only the "reference_types" feature did not work, as it got turned off due to the dependency on "bulk_memory", which is counter-intuitive (see Features::UpdateDependencies()). Additionally, exposes all the features and their default setting in JavaScript.
1 parent d9338f7 commit aefa094

File tree

7 files changed

+87
-77
lines changed

7 files changed

+87
-77
lines changed

docs/demo/libwabt.js

Lines changed: 12 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/demo/wasm2wat/demo.js

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,15 @@ var features = getLocalStorageFeatures();
1919

2020
function getLocalStorageFeatures() {
2121
try {
22-
return JSON.parse(localStorage && localStorage.getItem("features")) || defaultFeatures;
22+
return JSON.parse(localStorage && localStorage.getItem("features")) || {};
2323
} catch (e) {
2424
console.log(e);
25-
return { mutable_globals: true };
25+
return {};
2626
}
2727
}
2828

2929
WabtModule().then(function(wabt) {
3030

31-
// TODO: Share feature selection and other code with wat2wasm/demo.js
32-
var FEATURES = [
33-
'exceptions',
34-
'mutable_globals',
35-
'sat_float_to_int',
36-
'sign_extension',
37-
'simd',
38-
'threads',
39-
'multi_value',
40-
'tail_call',
41-
'bulk_memory',
42-
'reference_types',
43-
];
44-
45-
var defaultFeatures = { mutable_globals: true };
4631
var editorEl = document.querySelector('.editor');
4732
var uploadEl = document.getElementById('upload');
4833
var selectEl = document.getElementById('select');
@@ -65,9 +50,9 @@ editorContainer.ondrop = function(e) {
6550
readAndCompileFile(file);
6651
}
6752
var fileBuffer = null;
68-
for (var feature of FEATURES) {
69-
var featureEl = document.getElementById(feature);
70-
featureEl.checked = !!features[feature];
53+
for (const [f, v] of Object.entries(wabt.FEATURES)) {
54+
var featureEl = document.getElementById(f);
55+
featureEl.checked = !!(features[f] !== undefined ? features[f] : v);
7156
featureEl.addEventListener('change', event => {
7257
var feature = event.target.id;
7358
features[feature] = event.target.checked;

docs/demo/wasm2wat/index.html

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,25 @@ <h1>wasm2wat demo</h1>
4242
<div>Enabled features:</div>
4343
<div>
4444
<input type="checkbox" id="exceptions"><label for="exceptions">exceptions</label>
45-
<input type="checkbox" id="mutable_globals" checked><label for="mutable_globals">mutable globals</label>
45+
<input type="checkbox" id="mutable_globals"><label for="mutable_globals">mutable globals</label>
4646
<input type="checkbox" id="sat_float_to_int"><label for="sat_float_to_int">saturating float to int</label>
4747
<input type="checkbox" id="sign_extension"><label for="sign_extension">sign extension</label>
48-
</div>
49-
<div>
5048
<input type="checkbox" id="simd"><label for="simd">simd</label>
5149
<input type="checkbox" id="threads"><label for="threads">threads</label>
50+
<input type="checkbox" id="function_references"><label for="function_references">function references</label>
5251
<input type="checkbox" id="multi_value"><label for="multi_value">multi value</label>
5352
<input type="checkbox" id="tail_call"><label for="tail_call">tail call</label>
53+
</div>
54+
<div>
5455
<input type="checkbox" id="bulk_memory"><label for="bulk_memory">bulk memory</label>
5556
<input type="checkbox" id="reference_types"><label for="reference_types">reference types</label>
57+
<input type="checkbox" id="annotations"><label for="annotations">annotations</label>
58+
<input type="checkbox" id="code_metadata"><label for="code_metadata">code metadata</label>
59+
<input type="checkbox" id="gc"><label for="gc">gc</label>
60+
<input type="checkbox" id="memory64"><label for="memory64">memory64</label>
61+
<input type="checkbox" id="multi_memory"><label for="gc">multi memory</label>
62+
<input type="checkbox" id="extended_const"><label for="extended_const">extended const</label>
63+
<input type="checkbox" id="relaxed_simd"><label for="relaxed_simd">relaxed simd</label>
5664
</div>
5765
</header>
5866
<main>

docs/demo/wat2wasm/demo.js

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,6 @@ var features = {};
2424

2525
WabtModule().then(function(wabt) {
2626

27-
var FEATURES = [
28-
'exceptions',
29-
'mutable_globals',
30-
'sat_float_to_int',
31-
'sign_extension',
32-
'simd',
33-
'threads',
34-
'multi_value',
35-
'tail_call',
36-
'bulk_memory',
37-
'reference_types',
38-
];
39-
4027
var kCompileMinMS = 100;
4128
var outputShowBase64 = false;
4229
var outputLog;
@@ -52,9 +39,9 @@ var base64El = document.getElementById('base64');
5239
var binaryBuffer = null;
5340
var binaryBlobUrl = null;
5441

55-
for (var feature of FEATURES) {
56-
var featureEl = document.getElementById(feature);
57-
features[feature] = featureEl.checked;
42+
for (const [f, v] of Object.entries(wabt.FEATURES)) {
43+
var featureEl = document.getElementById(f);
44+
featureEl.checked = v;
5845
featureEl.addEventListener('change', event => {
5946
var feature = event.target.id;
6047
features[feature] = event.target.checked;

docs/demo/wat2wasm/index.html

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,25 @@ <h1>wat2wasm demo</h1>
3939
<div>Enabled features:</div>
4040
<div>
4141
<input type="checkbox" id="exceptions"><label for="exceptions">exceptions</label>
42-
<input type="checkbox" id="mutable_globals" checked><label for="mutable_globals">mutable globals</label>
42+
<input type="checkbox" id="mutable_globals"><label for="mutable_globals">mutable globals</label>
4343
<input type="checkbox" id="sat_float_to_int"><label for="sat_float_to_int">saturating float to int</label>
4444
<input type="checkbox" id="sign_extension"><label for="sign_extension">sign extension</label>
45-
</div>
46-
<div>
4745
<input type="checkbox" id="simd"><label for="simd">simd</label>
4846
<input type="checkbox" id="threads"><label for="threads">threads</label>
49-
<input type="checkbox" id="multi_value" checked><label for="multi_value">multi value</label>
47+
<input type="checkbox" id="function_references"><label for="function_references">function references</label>
48+
<input type="checkbox" id="multi_value"><label for="multi_value">multi value</label>
5049
<input type="checkbox" id="tail_call"><label for="tail_call">tail call</label>
50+
</div>
51+
<div>
5152
<input type="checkbox" id="bulk_memory"><label for="bulk_memory">bulk memory</label>
5253
<input type="checkbox" id="reference_types"><label for="reference_types">reference types</label>
54+
<input type="checkbox" id="annotations"><label for="annotations">annotations</label>
55+
<input type="checkbox" id="code_metadata"><label for="code_metadata">code metadata</label>
56+
<input type="checkbox" id="gc"><label for="gc">gc</label>
57+
<input type="checkbox" id="memory64"><label for="memory64">memory64</label>
58+
<input type="checkbox" id="multi_memory"><label for="gc">multi memory</label>
59+
<input type="checkbox" id="extended_const"><label for="extended_const">extended const</label>
60+
<input type="checkbox" id="relaxed_simd"><label for="relaxed_simd">relaxed simd</label>
5361
</div>
5462
</header>
5563
<main>

src/emscripten-exports.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
_free
22
_malloc
3+
_wabt_annotations_enabled
34
_wabt_apply_names_module
45
_wabt_bulk_memory_enabled
6+
_wabt_code_metadata_enabled
57
_wabt_destroy_errors
68
_wabt_destroy_features
79
_wabt_destroy_module
@@ -11,9 +13,14 @@ _wabt_destroy_read_binary_result
1113
_wabt_destroy_wast_lexer
1214
_wabt_destroy_write_module_result
1315
_wabt_exceptions_enabled
16+
_wabt_extended_const_enabled
1417
_wabt_format_binary_errors
1518
_wabt_format_text_errors
19+
_wabt_function_references_enabled
20+
_wabt_gc_enabled
1621
_wabt_generate_names_module
22+
_wabt_memory64_enabled
23+
_wabt_multi_memory_enabled
1724
_wabt_multi_value_enabled
1825
_wabt_mutable_globals_enabled
1926
_wabt_new_errors
@@ -33,8 +40,15 @@ _wabt_read_binary_result_release_module
3340
_wabt_reference_types_enabled
3441
_wabt_relaxed_simd_enabled
3542
_wabt_sat_float_to_int_enabled
43+
_wabt_set_annotations_enabled
3644
_wabt_set_bulk_memory_enabled
45+
_wabt_set_code_metadata_enabled
3746
_wabt_set_exceptions_enabled
47+
_wabt_set_extended_const_enabled
48+
_wabt_set_function_references_enabled
49+
_wabt_set_gc_enabled
50+
_wabt_set_memory64_enabled
51+
_wabt_set_multi_memory_enabled
3852
_wabt_set_multi_value_enabled
3953
_wabt_set_mutable_globals_enabled
4054
_wabt_set_reference_types_enabled

src/wabt.post.js

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,28 @@
1616

1717
var WABT_OK = 0;
1818
var WABT_ERROR = 1;
19-
var FEATURES = [
20-
'exceptions',
21-
'mutable_globals',
22-
'sat_float_to_int',
23-
'sign_extension',
24-
'simd',
25-
'threads',
26-
'multi_value',
27-
'tail_call',
28-
'bulk_memory',
29-
'reference_types',
30-
'relaxed_simd',
31-
];
19+
20+
/// features and default enabled state
21+
const FEATURES = Object.freeze({
22+
'exceptions': false,
23+
'mutable_globals': true,
24+
'sat_float_to_int': true,
25+
'sign_extension': true,
26+
'simd': true,
27+
'threads': false,
28+
'function_references': false,
29+
'multi_value': true,
30+
'tail_call': false,
31+
'bulk_memory': true,
32+
'reference_types': true,
33+
'annotations': false,
34+
'code_metadata': false,
35+
'gc': false,
36+
'memory64': false,
37+
'multi_memory': false,
38+
'extended_const': false,
39+
'relaxed_simd': false,
40+
});
3241

3342
/// If value is not undefined, return it. Otherwise return default_.
3443
function maybeDefault(value, default_) {
@@ -86,9 +95,8 @@ function allocateCString(s) {
8695
/// Features
8796
function Features(obj) {
8897
this.addr = Module._wabt_new_features();
89-
for (var i = 0; i < FEATURES.length; ++i) {
90-
var feature = FEATURES[i];
91-
this[feature] = obj[feature] | 0;
98+
for ([f, v] of Object.entries(FEATURES)) {
99+
this[f] = booleanOrDefault(obj[f], v);
92100
}
93101
}
94102
Features.prototype = Object.create(Object.prototype);
@@ -97,7 +105,7 @@ Features.prototype.destroy = function() {
97105
Module._wabt_destroy_features(this.addr);
98106
};
99107

100-
FEATURES.forEach(function(feature) {
108+
Object.keys(FEATURES).forEach(function(feature) {
101109
Object.defineProperty(Features.prototype, feature, {
102110
enumerable: true,
103111
get: function() {
@@ -305,16 +313,16 @@ WasmModule.prototype.toText = function(options) {
305313
var writeModuleResult_addr =
306314
Module._wabt_write_text_module(this.module_addr, foldExprs, inlineExport);
307315

308-
var result = Module._wabt_write_module_result_get_result(
309-
writeModuleResult_addr);
316+
var result =
317+
Module._wabt_write_module_result_get_result(writeModuleResult_addr);
310318

311319
try {
312320
if (result !== WABT_OK) {
313321
throw new Error('toText failed.');
314322
}
315323

316-
var outputBuffer = new OutputBuffer(
317-
Module._wabt_write_module_result_release_output_buffer(
324+
var outputBuffer =
325+
new OutputBuffer(Module._wabt_write_module_result_release_output_buffer(
318326
writeModuleResult_addr));
319327

320328
return outputBuffer.toString();
@@ -376,3 +384,4 @@ WasmModule.prototype.destroy = function() {
376384

377385
Module['parseWat'] = parseWat;
378386
Module['readWasm'] = readWasm;
387+
Module['FEATURES'] = FEATURES;

0 commit comments

Comments
 (0)