summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binaryen-c.cpp24
-rw-r--r--src/binaryen-c.h6
-rw-r--r--src/js/binaryen.js-post.js9
-rw-r--r--src/wasm-builder.h24
-rw-r--r--test/example/c-api-kitchen-sink.c4
5 files changed, 46 insertions, 21 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 3d58debc8..7d11689b0 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -1162,18 +1162,28 @@ BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module,
auto* ret = Builder(*(Module*)module).makeReturn((Expression*)value);
return static_cast<Expression*>(ret);
}
+
+static Builder::MemoryInfo getMemoryInfo(bool memoryIs64) {
+ return memoryIs64 ? Builder::MemoryInfo::Memory64
+ : Builder::MemoryInfo::Memory32;
+}
+
BinaryenExpressionRef BinaryenMemorySize(BinaryenModuleRef module,
- const char* memoryName) {
- auto* ret =
- Builder(*(Module*)module).makeMemorySize(getMemoryName(module, memoryName));
+ const char* memoryName,
+ bool memoryIs64) {
+ auto* ret = Builder(*(Module*)module)
+ .makeMemorySize(getMemoryName(module, memoryName),
+ getMemoryInfo(memoryIs64));
return static_cast<Expression*>(ret);
}
BinaryenExpressionRef BinaryenMemoryGrow(BinaryenModuleRef module,
BinaryenExpressionRef delta,
- const char* memoryName) {
- auto* ret =
- Builder(*(Module*)module)
- .makeMemoryGrow((Expression*)delta, getMemoryName(module, memoryName));
+ const char* memoryName,
+ bool memoryIs64) {
+ auto* ret = Builder(*(Module*)module)
+ .makeMemoryGrow((Expression*)delta,
+ getMemoryName(module, memoryName),
+ getMemoryInfo(memoryIs64));
return static_cast<Expression*>(ret);
}
BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module) {
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index 0a79e7d3d..a21c0966a 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -780,11 +780,13 @@ BINARYEN_API BinaryenExpressionRef BinaryenDrop(BinaryenModuleRef module,
BINARYEN_API BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module,
BinaryenExpressionRef value);
BINARYEN_API BinaryenExpressionRef BinaryenMemorySize(BinaryenModuleRef module,
- const char* memoryName);
+ const char* memoryName,
+ bool memoryIs64);
BINARYEN_API BinaryenExpressionRef
BinaryenMemoryGrow(BinaryenModuleRef module,
BinaryenExpressionRef delta,
- const char* memoryName);
+ const char* memoryName,
+ bool memoryIs64);
BINARYEN_API BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module);
BINARYEN_API BinaryenExpressionRef
BinaryenUnreachable(BinaryenModuleRef module);
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index 53930e16c..c684553a5 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -687,11 +687,12 @@ function wrapModule(module, self = {}) {
}
self['memory'] = {
- 'size'(name) {
- return Module['_BinaryenMemorySize'](module, strToStack(name));
+ // memory64 defaults to undefined/false.
+ 'size'(name, memory64) {
+ return Module['_BinaryenMemorySize'](module, strToStack(name), memory64);
},
- 'grow'(value, name) {
- return Module['_BinaryenMemoryGrow'](module, value, strToStack(name));
+ 'grow'(value, name, memory64) {
+ return Module['_BinaryenMemoryGrow'](module, value, strToStack(name), memory64);
},
'init'(segment, dest, offset, size, name) {
return Module['_BinaryenMemoryInit'](module, segment, dest, offset, size, strToStack(name));
diff --git a/src/wasm-builder.h b/src/wasm-builder.h
index 69e7a7c6a..cc3b99138 100644
--- a/src/wasm-builder.h
+++ b/src/wasm-builder.h
@@ -664,20 +664,32 @@ public:
ret->value = value;
return ret;
}
- MemorySize* makeMemorySize(Name memoryName) {
- auto memory = wasm.getMemory(memoryName);
+
+ // Some APIs can be told if the memory is 32 or 64-bit. If they are not
+ // informed of that, then the memory they refer to is looked up and that
+ // information fetched from there.
+ enum MemoryInfo { Memory32, Memory64, Unspecified };
+
+ bool isMemory64(Name memoryName, MemoryInfo info) {
+ return info == MemoryInfo::Memory64 || (info == MemoryInfo::Unspecified &&
+ wasm.getMemory(memoryName)->is64());
+ }
+
+ MemorySize* makeMemorySize(Name memoryName,
+ MemoryInfo info = MemoryInfo::Unspecified) {
auto* ret = wasm.allocator.alloc<MemorySize>();
- if (memory->is64()) {
+ if (isMemory64(memoryName, info)) {
ret->make64();
}
ret->memory = memoryName;
ret->finalize();
return ret;
}
- MemoryGrow* makeMemoryGrow(Expression* delta, Name memoryName) {
- auto memory = wasm.getMemory(memoryName);
+ MemoryGrow* makeMemoryGrow(Expression* delta,
+ Name memoryName,
+ MemoryInfo info = MemoryInfo::Unspecified) {
auto* ret = wasm.allocator.alloc<MemoryGrow>();
- if (memory->is64()) {
+ if (isMemory64(memoryName, info)) {
ret->make64();
}
ret->delta = delta;
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c
index f6cee93fa..22f2d5f29 100644
--- a/test/example/c-api-kitchen-sink.c
+++ b/test/example/c-api-kitchen-sink.c
@@ -1034,8 +1034,8 @@ void test_core() {
BinaryenPop(module, BinaryenTypeExternref()),
BinaryenPop(module, iIfF),
// Memory
- BinaryenMemorySize(module, "0"),
- BinaryenMemoryGrow(module, makeInt32(module, 0), "0"),
+ BinaryenMemorySize(module, "0", false),
+ BinaryenMemoryGrow(module, makeInt32(module, 0), "0", false),
// GC
BinaryenI31New(module, makeInt32(module, 0)),
BinaryenI31Get(module, i31refExpr, 1),