diff options
author | Jackson Gardner <eyebrowsoffire@gmail.com> | 2022-05-24 09:59:47 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-24 09:59:47 -0700 |
commit | 721e8ffb975a6e68a56287cd46ecc19e107211c6 (patch) | |
tree | 021219639b5c4b80c235cce42c79902c40fa4794 | |
parent | a78d0e44cbcc72682ab9c45dec76d4b1c52588c9 (diff) | |
download | binaryen-721e8ffb975a6e68a56287cd46ecc19e107211c6.tar.gz binaryen-721e8ffb975a6e68a56287cd46ecc19e107211c6.tar.bz2 binaryen-721e8ffb975a6e68a56287cd46ecc19e107211c6.zip |
Add C and JS API functions for accessing memory info (#4682)
Based on #3573 plus minor fixes
-rw-r--r-- | src/binaryen-c.cpp | 31 | ||||
-rw-r--r-- | src/binaryen-c.h | 9 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 19 | ||||
-rw-r--r-- | test/binaryen.js/memory-info.js | 35 | ||||
-rw-r--r-- | test/binaryen.js/memory-info.js.txt | 9 |
5 files changed, 101 insertions, 2 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 709672aa4..44f323339 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3812,6 +3812,37 @@ uint32_t BinaryenGetMemorySegmentByteOffset(BinaryenModuleRef module, Fatal() << "non-constant offsets aren't supported yet"; return 0; } +bool BinaryenHasMemory(BinaryenModuleRef module) { + return ((Module*)module)->memory.exists; +} +BinaryenIndex BinaryenMemoryGetInitial(BinaryenModuleRef module) { + return ((Module*)module)->memory.initial; +} +bool BinaryenMemoryHasMax(BinaryenModuleRef module) { + return ((Module*)module)->memory.hasMax(); +} +BinaryenIndex BinaryenMemoryGetMax(BinaryenModuleRef module) { + return ((Module*)module)->memory.max; +} +const char* BinaryenMemoryImportGetModule(BinaryenModuleRef module) { + auto& memory = ((Module*)module)->memory; + if (memory.imported()) { + return memory.module.c_str(); + } else { + return ""; + } +} +const char* BinaryenMemoryImportGetBase(BinaryenModuleRef module) { + auto& memory = ((Module*)module)->memory; + if (memory.imported()) { + return memory.base.c_str(); + } else { + return ""; + } +} +bool BinaryenMemoryIsShared(BinaryenModuleRef module) { + return ((Module*)module)->memory.shared; +} size_t BinaryenGetMemorySegmentByteLength(BinaryenModuleRef module, BinaryenIndex id) { const auto& segments = ((Module*)module)->memory.segments; diff --git a/src/binaryen-c.h b/src/binaryen-c.h index ed0f01f1c..715b08880 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -2285,6 +2285,15 @@ BINARYEN_API void BinaryenSetMemory(BinaryenModuleRef module, BinaryenIndex numSegments, bool shared); +BINARYEN_API bool BinaryenHasMemory(BinaryenModuleRef module); +BINARYEN_API BinaryenIndex BinaryenMemoryGetInitial(BinaryenModuleRef module); +BINARYEN_API bool BinaryenMemoryHasMax(BinaryenModuleRef module); +BINARYEN_API BinaryenIndex BinaryenMemoryGetMax(BinaryenModuleRef module); +BINARYEN_API const char* +BinaryenMemoryImportGetModule(BinaryenModuleRef module); +BINARYEN_API const char* BinaryenMemoryImportGetBase(BinaryenModuleRef module); +BINARYEN_API bool BinaryenMemoryIsShared(BinaryenModuleRef module); + // Memory segments. Query utilities. BINARYEN_API uint32_t BinaryenGetNumMemorySegments(BinaryenModuleRef module); diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 28f5b6258..b6ea7dee1 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2500,9 +2500,24 @@ function wrapModule(module, self = {}) { ); }); }; + self['hasMemory'] = function() { + return Boolean(Module['_BinaryenHasMemory'](module)); + }; + self['getMemoryInfo'] = function() { + var memoryInfo = { + 'module': UTF8ToString(Module['_BinaryenMemoryImportGetModule'](module)), + 'base': UTF8ToString(Module['_BinaryenMemoryImportGetBase'](module)), + 'initial': Module['_BinaryenMemoryGetInitial'](module), + 'shared': Boolean(Module['_BinaryenMemoryIsShared'](module)) + }; + if (Module['_BinaryenMemoryHasMax'](module)) { + memoryInfo['max'] = Module['_BinaryenMemoryGetMax'](module); + } + return memoryInfo; + }; self['getNumMemorySegments'] = function() { return Module['_BinaryenGetNumMemorySegments'](module); - } + }; self['getMemorySegmentInfoByIndex'] = function(id) { return { 'offset': Module['_BinaryenGetMemorySegmentByteOffset'](module, id), @@ -2517,7 +2532,7 @@ function wrapModule(module, self = {}) { })(), 'passive': Boolean(Module['_BinaryenGetMemorySegmentPassive'](module, id)) }; - } + }; self['setStart'] = function(start) { return Module['_BinaryenSetStart'](module, start); }; diff --git a/test/binaryen.js/memory-info.js b/test/binaryen.js/memory-info.js new file mode 100644 index 000000000..16ec86753 --- /dev/null +++ b/test/binaryen.js/memory-info.js @@ -0,0 +1,35 @@ +var module = new binaryen.Module(); +assert(module.validate()); +console.log(JSON.stringify(module.hasMemory())); + +var initial = 1, maximum = 64; + +// Not shared +module = new binaryen.Module(); +module.setMemory(initial, maximum, ''); +assert(module.validate()); +console.log(JSON.stringify(module.hasMemory())); +console.log(JSON.stringify(module.getMemoryInfo())); + +// Shared +module = new binaryen.Module(); +module.setFeatures(binaryen.Features.MVP | binaryen.Features.Atomics); +module.setMemory(initial, maximum, '', [], true); +assert(module.validate()); +console.log(JSON.stringify(module.hasMemory())); +console.log(JSON.stringify(module.getMemoryInfo())); + +// Imported, not shared +module = new binaryen.Module(); +module.addMemoryImport('my_mem', 'env', 'memory', false); +assert(module.validate()); +console.log(JSON.stringify(module.hasMemory())); +console.log(JSON.stringify(module.getMemoryInfo())); + +// Imported, shared +module = new binaryen.Module(); +module.setFeatures(binaryen.Features.MVP | binaryen.Features.Atomics); +module.addMemoryImport('my_mem', 'env', 'memory', true); +assert(module.validate()); +console.log(JSON.stringify(module.hasMemory())); +console.log(JSON.stringify(module.getMemoryInfo())); diff --git a/test/binaryen.js/memory-info.js.txt b/test/binaryen.js/memory-info.js.txt new file mode 100644 index 000000000..39d1290ae --- /dev/null +++ b/test/binaryen.js/memory-info.js.txt @@ -0,0 +1,9 @@ +false +true +{"module":"","base":"","initial":1,"shared":false,"max":64} +true +{"module":"","base":"","initial":1,"shared":true,"max":64} +false +{"module":"env","base":"memory","initial":0,"shared":false,"max":65536} +false +{"module":"env","base":"memory","initial":0,"shared":true,"max":65536} |