Chromium Code Reviews| Index: src/wasm/wasm-module.cc |
| diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc |
| index fbe9a91c1a130ead3b125dd1b5f1e5b21fe31510..35e4a2e7b615b0fc0e2d9dc77e4a495250f42622 100644 |
| --- a/src/wasm/wasm-module.cc |
| +++ b/src/wasm/wasm-module.cc |
| @@ -2349,7 +2349,8 @@ Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, |
| Handle<JSArrayBuffer> old_buffer; |
| Address old_mem_start = nullptr; |
| uint32_t old_size = 0; |
| - if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { |
| + if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr && |
| + old_buffer->byte_length()->IsNumber()) { |
|
bradnelson
2017/03/24 03:49:46
Why is it ok to keep going below if length has bee
ahaas
2017/03/24 08:26:00
Could you add a comment why this IsNumber check is
gdeepti
2017/03/24 16:13:19
GrowWebAssemblyMemory can be called through JS, i.
|
| old_mem_start = static_cast<Address>(old_buffer->backing_store()); |
| DCHECK_NOT_NULL(old_mem_start); |
| old_size = old_buffer->byte_length()->Number(); |
| @@ -2392,28 +2393,30 @@ void UncheckedUpdateInstanceMemory(Isolate* isolate, |
| code_specialization.ApplyToWholeInstance(*instance); |
| } |
| -void DetachArrayBuffer(Isolate* isolate, Handle<JSArrayBuffer> buffer) { |
| - const bool has_guard_regions = |
| - (!buffer.is_null() && buffer->has_guard_region()); |
| +void wasm::DetachWebAssemblyMemoryBuffer(Isolate* isolate, |
| + Handle<JSArrayBuffer> buffer) { |
| + int64_t byte_length = |
| + buffer->byte_length()->IsNumber() |
| + ? static_cast<uint32_t>(buffer->byte_length()->Number()) |
| + : 0; |
| + if (buffer.is_null() || byte_length == 0) return; |
| + const bool has_guard_regions = buffer->has_guard_region(); |
| const bool is_external = buffer->is_external(); |
| void* backing_store = buffer->backing_store(); |
| - if (backing_store != nullptr) { |
| - DCHECK(!buffer->is_neuterable()); |
| - int64_t byte_length = NumberToSize(buffer->byte_length()); |
| - buffer->set_is_neuterable(true); |
| - if (!has_guard_regions && !is_external) { |
| - buffer->set_is_external(true); |
| - isolate->heap()->UnregisterArrayBuffer(*buffer); |
| - } |
| - buffer->Neuter(); |
| - if (has_guard_regions) { |
| - base::OS::Free(backing_store, RoundUp(i::wasm::kWasmMaxHeapOffset, |
| - base::OS::CommitPageSize())); |
| - reinterpret_cast<v8::Isolate*>(isolate) |
| - ->AdjustAmountOfExternalAllocatedMemory(-byte_length); |
| - } else if (!has_guard_regions && !is_external) { |
| - isolate->array_buffer_allocator()->Free(backing_store, byte_length); |
| - } |
| + DCHECK(!buffer->is_neuterable()); |
| + if (!has_guard_regions && !is_external) { |
| + buffer->set_is_external(true); |
| + isolate->heap()->UnregisterArrayBuffer(*buffer); |
| + } |
| + buffer->set_is_neuterable(true); |
| + buffer->Neuter(); |
| + if (has_guard_regions) { |
| + base::OS::Free(backing_store, RoundUp(i::wasm::kWasmMaxHeapOffset, |
| + base::OS::CommitPageSize())); |
| + reinterpret_cast<v8::Isolate*>(isolate) |
| + ->AdjustAmountOfExternalAllocatedMemory(-byte_length); |
| + } else if (!has_guard_regions && !is_external) { |
| + isolate->array_buffer_allocator()->Free(backing_store, byte_length); |
| } |
| } |
| @@ -2428,7 +2431,8 @@ int32_t wasm::GrowWebAssemblyMemory(Isolate* isolate, |
| uint32_t old_size = 0; |
| Address old_mem_start = nullptr; |
| if (memory_buffer.ToHandle(&old_buffer) && |
| - old_buffer->backing_store() != nullptr) { |
| + old_buffer->backing_store() != nullptr && |
| + old_buffer->byte_length()->IsNumber()) { |
|
bradnelson
2017/03/24 03:49:46
Same?
|
| old_size = old_buffer->byte_length()->Number(); |
| old_mem_start = static_cast<Address>(old_buffer->backing_store()); |
| } |
| @@ -2488,7 +2492,6 @@ int32_t wasm::GrowWebAssemblyMemory(Isolate* isolate, |
| } |
| } |
| memory_object->set_buffer(*new_buffer); |
| - DetachArrayBuffer(isolate, old_buffer); |
| DCHECK(old_size % WasmModule::kPageSize == 0); |
| return (old_size / WasmModule::kPageSize); |
| } |