summaryrefslogtreecommitdiff
path: root/src/js/binaryen.js-post.js
diff options
context:
space:
mode:
authorAbbas Mashayekh <martianboy2005@gmail.com>2021-03-06 03:08:51 +0330
committerGitHub <noreply@github.com>2021-03-05 15:38:51 -0800
commit89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4 (patch)
tree602bd8e24753b5e45c859a2c3672062ce07133fe /src/js/binaryen.js-post.js
parent57619b508d38677844cb482a4034dc985d2cecc6 (diff)
downloadbinaryen-89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4.tar.gz
binaryen-89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4.tar.bz2
binaryen-89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4.zip
[reference-types] Support passive elem segments (#3572)
Passive element segments do not belong to any table, so the link between Table and elem needs to be weaker; i.e. an elem may have a table in case of active segments, or simply be a collection of function references in case of passive/declarative segments. This PR takes Table::Segment out and turns it into a first class module element just like tables and functions. It also implements early support for parsing, printing, encoding and decoding passive/declarative elem segments.
Diffstat (limited to 'src/js/binaryen.js-post.js')
-rw-r--r--src/js/binaryen.js-post.js105
1 files changed, 64 insertions, 41 deletions
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 785c56106..bafbaa480 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -2214,23 +2214,55 @@ function wrapModule(module, self = {}) {
self['getGlobal'] = function(name) {
return preserveStack(() => Module['_BinaryenGetGlobal'](module, strToStack(name)));
};
- self['addTable'] = function(table, initial, maximum, funcNames, offset = self['i32']['const'](0)) {
- return preserveStack(() => Module['_BinaryenAddTable'](module,
- strToStack(table), initial, maximum,
- i32sToStack(funcNames.map(strToStack)),
- funcNames.length,
- offset)
- );
+ self['addTable'] = function(table, initial, maximum) {
+ return preserveStack(() => Module['_BinaryenAddTable'](module, strToStack(table), initial, maximum));
}
self['getTable'] = function(name) {
return preserveStack(() => Module['_BinaryenGetTable'](module, strToStack(name)));
};
+ self['addActiveElementSegment'] = function(table, name, funcNames, offset = self['i32']['const'](0)) {
+ return preserveStack(() => Module['_BinaryenAddActiveElementSegment'](
+ module,
+ strToStack(table),
+ strToStack(name),
+ i32sToStack(funcNames.map(strToStack)),
+ funcNames.length,
+ offset
+ ));
+ };
+ self['addPassiveElementSegment'] = function(name, funcNames) {
+ return preserveStack(() => Module['_BinaryenAddPassiveElementSegment'](
+ module,
+ strToStack(name),
+ i32sToStack(funcNames.map(strToStack)),
+ funcNames.length
+ ));
+ };
+ self['getElementSegment'] = function(name) {
+ return preserveStack(() => Module['_BinaryenGetElementSegment'](module, strToStack(name)));
+ };
+ self['getTableSegments'] = function(table) {
+ var numElementSegments = Module['_BinaryenGetNumElementSegments'](module);
+ var tableName = UTF8ToString(Module['_BinaryenTableGetName'](table));
+ var ret = [];
+ for (var i = 0; i < numElementSegments; i++) {
+ var segment = Module['_BinaryenGetElementSegmentByIndex'](module, i);
+ var elemTableName = UTF8ToString(Module['_BinaryenElementSegmentGetTable'](segment));
+ if (tableName === elemTableName) {
+ ret.push(segment);
+ }
+ }
+ return ret;
+ }
self['removeGlobal'] = function(name) {
return preserveStack(() => Module['_BinaryenRemoveGlobal'](module, strToStack(name)));
}
self['removeTable'] = function(name) {
return preserveStack(() => Module['_BinaryenRemoveTable'](module, strToStack(name)));
- }
+ };
+ self['removeElementSegment'] = function(name) {
+ return preserveStack(() => Module['_BinaryenRemoveElementSegment'](module, strToStack(name)));
+ };
self['addEvent'] = function(name, attribute, params, results) {
return preserveStack(() => Module['_BinaryenAddEvent'](module, strToStack(name), attribute, params, results));
};
@@ -2284,37 +2316,6 @@ function wrapModule(module, self = {}) {
self['removeExport'] = function(externalName) {
return preserveStack(() => Module['_BinaryenRemoveExport'](module, strToStack(externalName)));
};
- self['setFunctionTable'] = function(initial, maximum, funcNames, offset = self['i32']['const'](0)) {
- return preserveStack(() => {
- return Module['_BinaryenSetFunctionTable'](module, initial, maximum,
- i32sToStack(funcNames.map(strToStack)),
- funcNames.length,
- offset
- );
- });
- };
- self['getFunctionTable'] = function() {
- return {
- 'imported': Boolean(Module['_BinaryenIsFunctionTableImported'](module)),
- 'segments': (function() {
- const numSegments = Module['_BinaryenGetNumFunctionTableSegments'](module)
- const arr = new Array(numSegments);
- for (let i = 0; i !== numSegments; ++i) {
- const segmentLength = Module['_BinaryenGetFunctionTableSegmentLength'](module, i);
- const names = new Array(segmentLength);
- for (let j = 0; j !== segmentLength; ++j) {
- const ptr = Module['_BinaryenGetFunctionTableSegmentData'](module, i, j);
- names[j] = UTF8ToString(ptr);
- }
- arr[i] = {
- 'offset': Module['_BinaryenGetFunctionTableSegmentOffset'](module, i),
- 'names': names
- };
- }
- return arr;
- })()
- };
- };
self['setMemory'] = function(initial, maximum, exportName, segments = [], shared = false) {
// segments are assumed to be { passive: bool, offset: expression ref, data: array of 8-bit data }
return preserveStack(() => {
@@ -2394,12 +2395,18 @@ function wrapModule(module, self = {}) {
self['getNumTables'] = function() {
return Module['_BinaryenGetNumTables'](module);
};
+ self['getNumElementSegments'] = function() {
+ return Module['_BinaryenGetNumElementSegments'](module);
+ };
self['getGlobalByIndex'] = function(index) {
return Module['_BinaryenGetGlobalByIndex'](module, index);
};
self['getTableByIndex'] = function(index) {
return Module['_BinaryenGetTableByIndex'](module, index);
};
+ self['getElementSegmentByIndex'] = function(index) {
+ return Module['_BinaryenGetElementSegmentByIndex'](module, index);
+ };
self['emitText'] = function() {
const old = out;
let ret = '';
@@ -3029,8 +3036,8 @@ Module['getTableInfo'] = function(table) {
'name': UTF8ToString(Module['_BinaryenTableGetName'](table)),
'module': UTF8ToString(Module['_BinaryenTableImportGetModule'](table)),
'base': UTF8ToString(Module['_BinaryenTableImportGetBase'](table)),
- 'initial': Module['_BinaryenTableGetInitial'](table)
- };
+ 'initial': Module['_BinaryenTableGetInitial'](table),
+ }
if (hasMax) {
tableInfo.max = Module['_BinaryenTableGetMax'](table);
@@ -3039,6 +3046,22 @@ Module['getTableInfo'] = function(table) {
return tableInfo;
};
+Module['getElementSegmentInfo'] = function(segment) {
+ var segmentLength = Module['_BinaryenElementSegmentGetLength'](segment);
+ var names = new Array(segmentLength);
+ for (let j = 0; j !== segmentLength; ++j) {
+ var ptr = Module['_BinaryenElementSegmentGetData'](segment, j);
+ names[j] = UTF8ToString(ptr);
+ }
+
+ return {
+ 'name': UTF8ToString(Module['_BinaryenElementSegmentGetName'](segment)),
+ 'table': UTF8ToString(Module['_BinaryenElementSegmentGetTable'](segment)),
+ 'offset': Module['_BinaryenElementSegmentGetOffset'](segment),
+ 'data': names
+ }
+}
+
// Obtains information about a 'Event'
Module['getEventInfo'] = function(event_) {
return {