summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r--src/wasm-interpreter.h12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 0ca4d9674..5279e8a35 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -43,6 +43,7 @@ public:
virtual Literal callImport(Import* import, LiteralList& arguments) = 0;
virtual Literal load(Load* load, size_t addr) = 0;
virtual void store(Store* store, size_t addr, Literal value) = 0;
+ virtual void growMemory(size_t oldSize, size_t newSize) = 0;
virtual void trap() = 0;
};
@@ -634,11 +635,18 @@ public:
}
Flow visitHost(Host *curr) override {
NOTE_ENTER("Host");
-
switch (curr->op) {
case PageSize: return Literal(64*1024);
case MemorySize: return Literal(instance.memorySize);
- case GrowMemory: abort();
+ case GrowMemory: {
+ Flow flow = visit(curr->operands[0]);
+ if (flow.breaking()) return flow;
+ size_t newSize = flow.value.getInteger();
+ if (newSize > instance.wasm.memory.max) trap();
+ instance.externalInterface->growMemory(instance.memorySize, newSize);
+ instance.memorySize = newSize;
+ return Literal();
+ }
case HasFeature: {
IString id = curr->nameOperand;
if (id == WASM) return Literal(1);