| Index: src/wasm/wasm-js.cc
|
| diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc
|
| index 470d858d2f25c9cdc841bfa11dd49159593cb37c..f0435e0cd23a7088411fa98dee042b0f061d26f7 100644
|
| --- a/src/wasm/wasm-js.cc
|
| +++ b/src/wasm/wasm-js.cc
|
| @@ -635,20 +635,36 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| "Receiver is not a WebAssembly.Memory")) {
|
| return;
|
| }
|
| - if (args.Length() < 1) {
|
| + int64_t delta_size = 0;
|
| + if (args.Length() < 1 || !args[0]->IntegerValue(context).To(&delta_size)) {
|
| v8::Local<v8::Value> e = v8::Exception::TypeError(
|
| v8_str(isolate, "Argument 0 required, must be numeric value of pages"));
|
| isolate->ThrowException(e);
|
| return;
|
| }
|
| -
|
| - uint32_t delta = args[0]->Uint32Value(context).FromJust();
|
| + i::Handle<i::WasmMemoryObject> receiver =
|
| + i::Handle<i::WasmMemoryObject>::cast(Utils::OpenHandle(*args.This()));
|
| + int64_t max_size64 = receiver->maximum_pages();
|
| + if (max_size64 < 0 ||
|
| + max_size64 > static_cast<int64_t>(i::wasm::kV8MaxWasmTableSize)) {
|
| + max_size64 = i::wasm::kV8MaxWasmMemoryPages;
|
| + }
|
| + i::Handle<i::JSArrayBuffer> old_buffer(receiver->buffer());
|
| + uint32_t old_size =
|
| + old_buffer->byte_length()->Number() / i::wasm::kSpecMaxWasmMemoryPages;
|
| + int64_t new_size64 = old_size + delta_size;
|
| + if (delta_size < 0 || max_size64 < new_size64 || new_size64 < old_size) {
|
| + v8::Local<v8::Value> e = v8::Exception::RangeError(v8_str(
|
| + isolate, new_size64 < old_size ? "trying to shrink memory"
|
| + : "maximum memory size exceeded"));
|
| + isolate->ThrowException(e);
|
| + return;
|
| + }
|
| i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| - i::Handle<i::Object> receiver =
|
| - i::Handle<i::Object>::cast(Utils::OpenHandle(*args.This()));
|
| - int32_t ret = i::wasm::GrowWebAssemblyMemory(i_isolate, receiver, delta);
|
| + int32_t ret = i::wasm::GrowWebAssemblyMemory(
|
| + i_isolate, receiver, static_cast<uint32_t>(delta_size));
|
| if (ret == -1) {
|
| - v8::Local<v8::Value> e = v8::Exception::Error(
|
| + v8::Local<v8::Value> e = v8::Exception::RangeError(
|
| v8_str(isolate, "Unable to grow instance memory."));
|
| isolate->ThrowException(e);
|
| return;
|
|
|