Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1619)

Unified Diff: src/wasm/wasm-interpreter.cc

Issue 2341653002: [wasm] Implement GrowMemory in the wasm interpreter (Closed)
Patch Set: Add comment Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | test/cctest/wasm/test-run-wasm-interpreter.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-interpreter.cc
diff --git a/src/wasm/wasm-interpreter.cc b/src/wasm/wasm-interpreter.cc
index 17ca6111e3a5e947570491f32a4102a5d7383440..94b385033d5110f94692c7fde2978eb63ed93f43 100644
--- a/src/wasm/wasm-interpreter.cc
+++ b/src/wasm/wasm-interpreter.cc
@@ -654,6 +654,45 @@ static inline int64_t ExecuteI64ReinterpretF64(double a, TrapReason* trap) {
return bit_cast<int64_t>(a);
}
+static inline int32_t ExecuteGrowMemory(uint32_t delta_pages,
+ WasmModuleInstance* instance) {
+ // TODO(ahaas): Move memory allocation to wasm-module.cc for better
+ // encapsulation.
+ uint32_t old_size = instance->mem_size;
+ uint32_t new_size;
+ byte* new_mem_start;
+ if (instance->mem_size == 0) {
+ if (delta_pages > wasm::WasmModule::kMaxMemPages) {
+ return -1;
+ }
+ // TODO(gdeepti): Fix bounds check to take into account size of memtype.
+ new_size = delta_pages * wasm::WasmModule::kPageSize;
+ new_mem_start = static_cast<byte*>(calloc(new_size, sizeof(byte)));
+ if (!new_mem_start) {
+ return -1;
+ }
+ } else {
+ DCHECK_NOT_NULL(instance->mem_start);
+ new_size = old_size + delta_pages * wasm::WasmModule::kPageSize;
+ if (new_size >
+ wasm::WasmModule::kMaxMemPages * wasm::WasmModule::kPageSize) {
+ return -1;
+ }
+ new_mem_start = static_cast<byte*>(realloc(instance->mem_start, new_size));
+ if (!new_mem_start) {
+ return -1;
+ }
+ // Zero initializing uninitialized memory from realloc
+ memset(new_mem_start + old_size, 0, new_size - old_size);
+ }
+ instance->mem_start = new_mem_start;
+ instance->mem_size = new_size;
+ // realloc
+ // update mem_start
+ // update mem_size
+ return static_cast<int32_t>(old_size / WasmModule::kPageSize);
+}
+
enum InternalOpcode {
#define DECL_INTERNAL_ENUM(name, value) kInternal##name = value,
FOREACH_INTERNAL_OPCODE(DECL_INTERNAL_ENUM)
@@ -1546,7 +1585,11 @@ class ThreadImpl : public WasmInterpreter::Thread {
ASMJS_STORE_CASE(F32AsmjsStoreMem, float, float);
ASMJS_STORE_CASE(F64AsmjsStoreMem, double, double);
#undef ASMJS_STORE_CASE
-
+ case kExprGrowMemory: {
+ uint32_t delta_pages = Pop().to<uint32_t>();
+ Push(pc, WasmVal(ExecuteGrowMemory(delta_pages, instance())));
+ break;
+ }
case kExprMemorySize: {
Push(pc, WasmVal(static_cast<uint32_t>(instance()->mem_size)));
break;
« no previous file with comments | « no previous file | test/cctest/wasm/test-run-wasm-interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698