[wasm] Move memory-related methods to wasm-memory.(cc|h).
R=gdeepti@chromium.org Bug: Change-Id: Ic2e519d24354b3327a92daa0d4d6e06c9ca4605e Reviewed-on: https://chromium-review.googlesource.com/687056 Commit-Queue: Ben Titzer <titzer@chromium.org> Reviewed-by: Deepti Gandluri <gdeepti@chromium.org> Reviewed-by: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#48256}
This commit is contained in:
parent
bfaacb8afb
commit
9debe4411c
2
BUILD.gn
2
BUILD.gn
@ -2069,6 +2069,8 @@ v8_source_set("v8_base") {
|
|||||||
"src/wasm/wasm-js.cc",
|
"src/wasm/wasm-js.cc",
|
||||||
"src/wasm/wasm-js.h",
|
"src/wasm/wasm-js.h",
|
||||||
"src/wasm/wasm-limits.h",
|
"src/wasm/wasm-limits.h",
|
||||||
|
"src/wasm/wasm-memory.cc",
|
||||||
|
"src/wasm/wasm-memory.h",
|
||||||
"src/wasm/wasm-module-builder.cc",
|
"src/wasm/wasm-module-builder.cc",
|
||||||
"src/wasm/wasm-module-builder.h",
|
"src/wasm/wasm-module-builder.h",
|
||||||
"src/wasm/wasm-module.cc",
|
"src/wasm/wasm-module.cc",
|
||||||
|
@ -1456,6 +1456,8 @@
|
|||||||
'wasm/wasm-js.cc',
|
'wasm/wasm-js.cc',
|
||||||
'wasm/wasm-js.h',
|
'wasm/wasm-js.h',
|
||||||
'wasm/wasm-limits.h',
|
'wasm/wasm-limits.h',
|
||||||
|
'wasm/wasm-memory.cc',
|
||||||
|
'wasm/wasm-memory.h',
|
||||||
'wasm/wasm-module.cc',
|
'wasm/wasm-module.cc',
|
||||||
'wasm/wasm-module.h',
|
'wasm/wasm-module.h',
|
||||||
'wasm/wasm-module-builder.cc',
|
'wasm/wasm-module-builder.cc',
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "src/wasm/module-decoder.h"
|
#include "src/wasm/module-decoder.h"
|
||||||
#include "src/wasm/wasm-code-specialization.h"
|
#include "src/wasm/wasm-code-specialization.h"
|
||||||
#include "src/wasm/wasm-js.h"
|
#include "src/wasm/wasm-js.h"
|
||||||
|
#include "src/wasm/wasm-memory.h"
|
||||||
#include "src/wasm/wasm-objects-inl.h"
|
#include "src/wasm/wasm-objects-inl.h"
|
||||||
#include "src/wasm/wasm-result.h"
|
#include "src/wasm/wasm-result.h"
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "src/wasm/wasm-api.h"
|
#include "src/wasm/wasm-api.h"
|
||||||
#include "src/wasm/wasm-js.h"
|
#include "src/wasm/wasm-js.h"
|
||||||
#include "src/wasm/wasm-limits.h"
|
#include "src/wasm/wasm-limits.h"
|
||||||
|
#include "src/wasm/wasm-memory.h"
|
||||||
#include "src/wasm/wasm-module.h"
|
#include "src/wasm/wasm-module.h"
|
||||||
#include "src/wasm/wasm-objects-inl.h"
|
#include "src/wasm/wasm-objects-inl.h"
|
||||||
#include "src/wasm/wasm-result.h"
|
#include "src/wasm/wasm-result.h"
|
||||||
@ -780,7 +781,7 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|||||||
i::WasmMemoryObject::SetupNewBufferWithSameBackingStore(
|
i::WasmMemoryObject::SetupNewBufferWithSameBackingStore(
|
||||||
i_isolate, receiver, static_cast<uint32_t>(new_size64));
|
i_isolate, receiver, static_cast<uint32_t>(new_size64));
|
||||||
}
|
}
|
||||||
i::wasm::DetachWebAssemblyMemoryBuffer(i_isolate, old_buffer, free_memory);
|
i::wasm::DetachMemoryBuffer(i_isolate, old_buffer, free_memory);
|
||||||
}
|
}
|
||||||
v8::ReturnValue<v8::Value> return_value = args.GetReturnValue();
|
v8::ReturnValue<v8::Value> return_value = args.GetReturnValue();
|
||||||
return_value.Set(ret);
|
return_value.Set(ret);
|
||||||
|
136
src/wasm/wasm-memory.cc
Normal file
136
src/wasm/wasm-memory.cc
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "src/wasm/wasm-memory.h"
|
||||||
|
#include "src/objects-inl.h"
|
||||||
|
#include "src/wasm/wasm-limits.h"
|
||||||
|
#include "src/wasm/wasm-module.h"
|
||||||
|
|
||||||
|
namespace v8 {
|
||||||
|
namespace internal {
|
||||||
|
namespace wasm {
|
||||||
|
|
||||||
|
void* TryAllocateBackingStore(Isolate* isolate, size_t size,
|
||||||
|
bool enable_guard_regions, void*& allocation_base,
|
||||||
|
size_t& allocation_length) {
|
||||||
|
// TODO(eholk): Right now enable_guard_regions has no effect on 32-bit
|
||||||
|
// systems. It may be safer to fail instead, given that other code might do
|
||||||
|
// things that would be unsafe if they expected guard pages where there
|
||||||
|
// weren't any.
|
||||||
|
if (enable_guard_regions && kGuardRegionsSupported) {
|
||||||
|
// TODO(eholk): On Windows we want to make sure we don't commit the guard
|
||||||
|
// pages yet.
|
||||||
|
|
||||||
|
// We always allocate the largest possible offset into the heap, so the
|
||||||
|
// addressable memory after the guard page can be made inaccessible.
|
||||||
|
allocation_length = RoundUp(kWasmMaxHeapOffset, base::OS::CommitPageSize());
|
||||||
|
DCHECK_EQ(0, size % base::OS::CommitPageSize());
|
||||||
|
|
||||||
|
// AllocateGuarded makes the whole region inaccessible by default.
|
||||||
|
allocation_base =
|
||||||
|
isolate->array_buffer_allocator()->Reserve(allocation_length);
|
||||||
|
if (allocation_base == nullptr) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* memory = allocation_base;
|
||||||
|
|
||||||
|
// Make the part we care about accessible.
|
||||||
|
isolate->array_buffer_allocator()->SetProtection(
|
||||||
|
memory, size, v8::ArrayBuffer::Allocator::Protection::kReadWrite);
|
||||||
|
|
||||||
|
reinterpret_cast<v8::Isolate*>(isolate)
|
||||||
|
->AdjustAmountOfExternalAllocatedMemory(size);
|
||||||
|
|
||||||
|
return memory;
|
||||||
|
} else {
|
||||||
|
void* memory =
|
||||||
|
size == 0 ? nullptr : isolate->array_buffer_allocator()->Allocate(size);
|
||||||
|
allocation_base = memory;
|
||||||
|
allocation_length = size;
|
||||||
|
return memory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle<JSArrayBuffer> SetupArrayBuffer(Isolate* isolate, void* allocation_base,
|
||||||
|
size_t allocation_length,
|
||||||
|
void* backing_store, size_t size,
|
||||||
|
bool is_external,
|
||||||
|
bool enable_guard_regions,
|
||||||
|
SharedFlag shared) {
|
||||||
|
Handle<JSArrayBuffer> buffer =
|
||||||
|
isolate->factory()->NewJSArrayBuffer(shared, TENURED);
|
||||||
|
DCHECK_GE(kMaxInt, size);
|
||||||
|
if (shared == SharedFlag::kShared) DCHECK(FLAG_experimental_wasm_threads);
|
||||||
|
JSArrayBuffer::Setup(buffer, isolate, is_external, allocation_base,
|
||||||
|
allocation_length, backing_store, static_cast<int>(size),
|
||||||
|
shared);
|
||||||
|
buffer->set_is_neuterable(false);
|
||||||
|
buffer->set_is_wasm_buffer(true);
|
||||||
|
buffer->set_has_guard_region(enable_guard_regions);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size,
|
||||||
|
bool enable_guard_regions,
|
||||||
|
SharedFlag shared) {
|
||||||
|
// Check against kMaxInt, since the byte length is stored as int in the
|
||||||
|
// JSArrayBuffer. Note that wasm_max_mem_pages can be raised from the command
|
||||||
|
// line, and we don't want to fail a CHECK then.
|
||||||
|
if (size > FLAG_wasm_max_mem_pages * WasmModule::kPageSize ||
|
||||||
|
size > kMaxInt) {
|
||||||
|
// TODO(titzer): lift restriction on maximum memory allocated here.
|
||||||
|
return Handle<JSArrayBuffer>::null();
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_guard_regions = enable_guard_regions && kGuardRegionsSupported;
|
||||||
|
|
||||||
|
void* allocation_base = nullptr; // Set by TryAllocateBackingStore
|
||||||
|
size_t allocation_length = 0; // Set by TryAllocateBackingStore
|
||||||
|
// Do not reserve memory till non zero memory is encountered.
|
||||||
|
void* memory =
|
||||||
|
(size == 0) ? nullptr
|
||||||
|
: TryAllocateBackingStore(isolate, size, enable_guard_regions,
|
||||||
|
allocation_base, allocation_length);
|
||||||
|
|
||||||
|
if (size > 0 && memory == nullptr) {
|
||||||
|
return Handle<JSArrayBuffer>::null();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
// Double check the API allocator actually zero-initialized the memory.
|
||||||
|
const byte* bytes = reinterpret_cast<const byte*>(memory);
|
||||||
|
for (size_t i = 0; i < size; ++i) {
|
||||||
|
DCHECK_EQ(0, bytes[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
constexpr bool is_external = false;
|
||||||
|
return SetupArrayBuffer(isolate, allocation_base, allocation_length, memory,
|
||||||
|
size, is_external, enable_guard_regions, shared);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DetachMemoryBuffer(Isolate* isolate, Handle<JSArrayBuffer> buffer,
|
||||||
|
bool free_memory) {
|
||||||
|
const bool is_external = buffer->is_external();
|
||||||
|
DCHECK(!buffer->is_neuterable());
|
||||||
|
if (!is_external) {
|
||||||
|
buffer->set_is_external(true);
|
||||||
|
isolate->heap()->UnregisterArrayBuffer(*buffer);
|
||||||
|
if (free_memory) {
|
||||||
|
// We need to free the memory before neutering the buffer because
|
||||||
|
// FreeBackingStore reads buffer->allocation_base(), which is nulled out
|
||||||
|
// by Neuter. This means there is a dangling pointer until we neuter the
|
||||||
|
// buffer. Since there is no way for the user to directly call
|
||||||
|
// FreeBackingStore, we can ensure this is safe.
|
||||||
|
buffer->FreeBackingStore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buffer->set_is_neuterable(true);
|
||||||
|
buffer->Neuter();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace wasm
|
||||||
|
} // namespace internal
|
||||||
|
} // namespace v8
|
43
src/wasm/wasm-memory.h
Normal file
43
src/wasm/wasm-memory.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef V8_WASM_MEMORY_H_
|
||||||
|
#define V8_WASM_MEMORY_H_
|
||||||
|
|
||||||
|
#include "src/flags.h"
|
||||||
|
#include "src/handles.h"
|
||||||
|
#include "src/objects.h"
|
||||||
|
|
||||||
|
namespace v8 {
|
||||||
|
namespace internal {
|
||||||
|
namespace wasm {
|
||||||
|
|
||||||
|
#if V8_TARGET_ARCH_64_BIT
|
||||||
|
const bool kGuardRegionsSupported = true;
|
||||||
|
#else
|
||||||
|
const bool kGuardRegionsSupported = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline bool EnableGuardRegions() {
|
||||||
|
return FLAG_wasm_guard_pages && kGuardRegionsSupported &&
|
||||||
|
!FLAG_experimental_wasm_threads;
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle<JSArrayBuffer> NewArrayBuffer(
|
||||||
|
Isolate*, size_t size, bool enable_guard_regions,
|
||||||
|
SharedFlag shared = SharedFlag::kNotShared);
|
||||||
|
|
||||||
|
Handle<JSArrayBuffer> SetupArrayBuffer(
|
||||||
|
Isolate*, void* allocation_base, size_t allocation_length,
|
||||||
|
void* backing_store, size_t size, bool is_external,
|
||||||
|
bool enable_guard_regions, SharedFlag shared = SharedFlag::kNotShared);
|
||||||
|
|
||||||
|
void DetachMemoryBuffer(Isolate* isolate, Handle<JSArrayBuffer> buffer,
|
||||||
|
bool free_memory);
|
||||||
|
|
||||||
|
} // namespace wasm
|
||||||
|
} // namespace internal
|
||||||
|
} // namespace v8
|
||||||
|
|
||||||
|
#endif // V8_WASM_MODULE_H_
|
@ -22,7 +22,6 @@
|
|||||||
#include "src/wasm/module-decoder.h"
|
#include "src/wasm/module-decoder.h"
|
||||||
#include "src/wasm/wasm-code-specialization.h"
|
#include "src/wasm/wasm-code-specialization.h"
|
||||||
#include "src/wasm/wasm-js.h"
|
#include "src/wasm/wasm-js.h"
|
||||||
#include "src/wasm/wasm-limits.h"
|
|
||||||
#include "src/wasm/wasm-module.h"
|
#include "src/wasm/wasm-module.h"
|
||||||
#include "src/wasm/wasm-objects-inl.h"
|
#include "src/wasm/wasm-objects-inl.h"
|
||||||
#include "src/wasm/wasm-result.h"
|
#include "src/wasm/wasm-result.h"
|
||||||
@ -46,54 +45,6 @@ namespace wasm {
|
|||||||
if (FLAG_trace_wasm_compiler) PrintF(__VA_ARGS__); \
|
if (FLAG_trace_wasm_compiler) PrintF(__VA_ARGS__); \
|
||||||
} while (false)
|
} while (false)
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
|
|
||||||
void* TryAllocateBackingStore(Isolate* isolate, size_t size,
|
|
||||||
bool enable_guard_regions, void*& allocation_base,
|
|
||||||
size_t& allocation_length) {
|
|
||||||
// TODO(eholk): Right now enable_guard_regions has no effect on 32-bit
|
|
||||||
// systems. It may be safer to fail instead, given that other code might do
|
|
||||||
// things that would be unsafe if they expected guard pages where there
|
|
||||||
// weren't any.
|
|
||||||
if (enable_guard_regions && kGuardRegionsSupported) {
|
|
||||||
// TODO(eholk): On Windows we want to make sure we don't commit the guard
|
|
||||||
// pages yet.
|
|
||||||
|
|
||||||
// We always allocate the largest possible offset into the heap, so the
|
|
||||||
// addressable memory after the guard page can be made inaccessible.
|
|
||||||
allocation_length = RoundUp(kWasmMaxHeapOffset, base::OS::CommitPageSize());
|
|
||||||
DCHECK_EQ(0, size % base::OS::CommitPageSize());
|
|
||||||
|
|
||||||
// AllocateGuarded makes the whole region inaccessible by default.
|
|
||||||
allocation_base =
|
|
||||||
isolate->array_buffer_allocator()->Reserve(allocation_length);
|
|
||||||
if (allocation_base == nullptr) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* memory = allocation_base;
|
|
||||||
|
|
||||||
// Make the part we care about accessible.
|
|
||||||
isolate->array_buffer_allocator()->SetProtection(
|
|
||||||
memory, size, v8::ArrayBuffer::Allocator::Protection::kReadWrite);
|
|
||||||
|
|
||||||
reinterpret_cast<v8::Isolate*>(isolate)
|
|
||||||
->AdjustAmountOfExternalAllocatedMemory(size);
|
|
||||||
|
|
||||||
return memory;
|
|
||||||
} else {
|
|
||||||
void* memory =
|
|
||||||
size == 0 ? nullptr : isolate->array_buffer_allocator()->Allocate(size);
|
|
||||||
allocation_base = memory;
|
|
||||||
allocation_length = size;
|
|
||||||
return memory;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
const WasmExceptionSig WasmException::empty_sig_(0, 0, nullptr);
|
const WasmExceptionSig WasmException::empty_sig_(0, 0, nullptr);
|
||||||
|
|
||||||
@ -103,64 +54,6 @@ constexpr const char* WasmException::kRuntimeIdStr;
|
|||||||
// static
|
// static
|
||||||
constexpr const char* WasmException::kRuntimeValuesStr;
|
constexpr const char* WasmException::kRuntimeValuesStr;
|
||||||
|
|
||||||
Handle<JSArrayBuffer> SetupArrayBuffer(Isolate* isolate, void* allocation_base,
|
|
||||||
size_t allocation_length,
|
|
||||||
void* backing_store, size_t size,
|
|
||||||
bool is_external,
|
|
||||||
bool enable_guard_regions,
|
|
||||||
SharedFlag shared) {
|
|
||||||
Handle<JSArrayBuffer> buffer =
|
|
||||||
isolate->factory()->NewJSArrayBuffer(shared, TENURED);
|
|
||||||
DCHECK_GE(kMaxInt, size);
|
|
||||||
if (shared == SharedFlag::kShared) DCHECK(FLAG_experimental_wasm_threads);
|
|
||||||
JSArrayBuffer::Setup(buffer, isolate, is_external, allocation_base,
|
|
||||||
allocation_length, backing_store, static_cast<int>(size),
|
|
||||||
shared);
|
|
||||||
buffer->set_is_neuterable(false);
|
|
||||||
buffer->set_is_wasm_buffer(true);
|
|
||||||
buffer->set_has_guard_region(enable_guard_regions);
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size,
|
|
||||||
bool enable_guard_regions,
|
|
||||||
SharedFlag shared) {
|
|
||||||
// Check against kMaxInt, since the byte length is stored as int in the
|
|
||||||
// JSArrayBuffer. Note that wasm_max_mem_pages can be raised from the command
|
|
||||||
// line, and we don't want to fail a CHECK then.
|
|
||||||
if (size > FLAG_wasm_max_mem_pages * WasmModule::kPageSize ||
|
|
||||||
size > kMaxInt) {
|
|
||||||
// TODO(titzer): lift restriction on maximum memory allocated here.
|
|
||||||
return Handle<JSArrayBuffer>::null();
|
|
||||||
}
|
|
||||||
|
|
||||||
enable_guard_regions = enable_guard_regions && kGuardRegionsSupported;
|
|
||||||
|
|
||||||
void* allocation_base = nullptr; // Set by TryAllocateBackingStore
|
|
||||||
size_t allocation_length = 0; // Set by TryAllocateBackingStore
|
|
||||||
// Do not reserve memory till non zero memory is encountered.
|
|
||||||
void* memory =
|
|
||||||
(size == 0) ? nullptr
|
|
||||||
: TryAllocateBackingStore(isolate, size, enable_guard_regions,
|
|
||||||
allocation_base, allocation_length);
|
|
||||||
|
|
||||||
if (size > 0 && memory == nullptr) {
|
|
||||||
return Handle<JSArrayBuffer>::null();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
// Double check the API allocator actually zero-initialized the memory.
|
|
||||||
const byte* bytes = reinterpret_cast<const byte*>(memory);
|
|
||||||
for (size_t i = 0; i < size; ++i) {
|
|
||||||
DCHECK_EQ(0, bytes[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
constexpr bool is_external = false;
|
|
||||||
return SetupArrayBuffer(isolate, allocation_base, allocation_length, memory,
|
|
||||||
size, is_external, enable_guard_regions, shared);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UnpackAndRegisterProtectedInstructions(Isolate* isolate,
|
void UnpackAndRegisterProtectedInstructions(Isolate* isolate,
|
||||||
Handle<FixedArray> code_table) {
|
Handle<FixedArray> code_table) {
|
||||||
DisallowHeapAllocation no_gc;
|
DisallowHeapAllocation no_gc;
|
||||||
@ -298,27 +191,6 @@ bool IsWasmCodegenAllowed(Isolate* isolate, Handle<Context> context) {
|
|||||||
v8::Utils::ToLocal(isolate->factory()->empty_string()));
|
v8::Utils::ToLocal(isolate->factory()->empty_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DetachWebAssemblyMemoryBuffer(Isolate* isolate,
|
|
||||||
Handle<JSArrayBuffer> buffer,
|
|
||||||
bool free_memory) {
|
|
||||||
const bool is_external = buffer->is_external();
|
|
||||||
DCHECK(!buffer->is_neuterable());
|
|
||||||
if (!is_external) {
|
|
||||||
buffer->set_is_external(true);
|
|
||||||
isolate->heap()->UnregisterArrayBuffer(*buffer);
|
|
||||||
if (free_memory) {
|
|
||||||
// We need to free the memory before neutering the buffer because
|
|
||||||
// FreeBackingStore reads buffer->allocation_base(), which is nulled out
|
|
||||||
// by Neuter. This means there is a dangling pointer until we neuter the
|
|
||||||
// buffer. Since there is no way for the user to directly call
|
|
||||||
// FreeBackingStore, we can ensure this is safe.
|
|
||||||
buffer->FreeBackingStore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer->set_is_neuterable(true);
|
|
||||||
buffer->Neuter();
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace testing {
|
namespace testing {
|
||||||
void ValidateInstancesChain(Isolate* isolate,
|
void ValidateInstancesChain(Isolate* isolate,
|
||||||
Handle<WasmModuleObject> module_obj,
|
Handle<WasmModuleObject> module_obj,
|
||||||
|
@ -275,19 +275,6 @@ V8_EXPORT_PRIVATE Handle<JSArray> GetCustomSections(
|
|||||||
// function index, the inner one by the local index.
|
// function index, the inner one by the local index.
|
||||||
Handle<FixedArray> DecodeLocalNames(Isolate*, Handle<WasmCompiledModule>);
|
Handle<FixedArray> DecodeLocalNames(Isolate*, Handle<WasmCompiledModule>);
|
||||||
|
|
||||||
Handle<JSArrayBuffer> NewArrayBuffer(
|
|
||||||
Isolate*, size_t size, bool enable_guard_regions,
|
|
||||||
SharedFlag shared = SharedFlag::kNotShared);
|
|
||||||
|
|
||||||
Handle<JSArrayBuffer> SetupArrayBuffer(
|
|
||||||
Isolate*, void* allocation_base, size_t allocation_length,
|
|
||||||
void* backing_store, size_t size, bool is_external,
|
|
||||||
bool enable_guard_regions, SharedFlag shared = SharedFlag::kNotShared);
|
|
||||||
|
|
||||||
void DetachWebAssemblyMemoryBuffer(Isolate* isolate,
|
|
||||||
Handle<JSArrayBuffer> buffer,
|
|
||||||
bool free_memory);
|
|
||||||
|
|
||||||
// If the target is an export wrapper, return the {WasmFunction*} corresponding
|
// If the target is an export wrapper, return the {WasmFunction*} corresponding
|
||||||
// to the wrapped wasm function; in all other cases, return nullptr.
|
// to the wrapped wasm function; in all other cases, return nullptr.
|
||||||
// The returned pointer is owned by the wasm instance target belongs to. The
|
// The returned pointer is owned by the wasm instance target belongs to. The
|
||||||
@ -300,17 +287,6 @@ Handle<Code> UnwrapExportWrapper(Handle<JSFunction> export_wrapper);
|
|||||||
void UpdateDispatchTables(Isolate* isolate, Handle<FixedArray> dispatch_tables,
|
void UpdateDispatchTables(Isolate* isolate, Handle<FixedArray> dispatch_tables,
|
||||||
int index, WasmFunction* function, Handle<Code> code);
|
int index, WasmFunction* function, Handle<Code> code);
|
||||||
|
|
||||||
#if V8_TARGET_ARCH_64_BIT
|
|
||||||
const bool kGuardRegionsSupported = true;
|
|
||||||
#else
|
|
||||||
const bool kGuardRegionsSupported = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline bool EnableGuardRegions() {
|
|
||||||
return FLAG_wasm_guard_pages && kGuardRegionsSupported &&
|
|
||||||
!FLAG_experimental_wasm_threads;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UnpackAndRegisterProtectedInstructions(Isolate* isolate,
|
void UnpackAndRegisterProtectedInstructions(Isolate* isolate,
|
||||||
Handle<FixedArray> code_table);
|
Handle<FixedArray> code_table);
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "src/wasm/module-compiler.h"
|
#include "src/wasm/module-compiler.h"
|
||||||
#include "src/wasm/module-decoder.h"
|
#include "src/wasm/module-decoder.h"
|
||||||
#include "src/wasm/wasm-code-specialization.h"
|
#include "src/wasm/wasm-code-specialization.h"
|
||||||
|
#include "src/wasm/wasm-memory.h"
|
||||||
#include "src/wasm/wasm-module.h"
|
#include "src/wasm/wasm-module.h"
|
||||||
#include "src/wasm/wasm-objects-inl.h"
|
#include "src/wasm/wasm-objects-inl.h"
|
||||||
#include "src/wasm/wasm-text.h"
|
#include "src/wasm/wasm-text.h"
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "src/version.h"
|
#include "src/version.h"
|
||||||
#include "src/wasm/module-compiler.h"
|
#include "src/wasm/module-compiler.h"
|
||||||
#include "src/wasm/module-decoder.h"
|
#include "src/wasm/module-decoder.h"
|
||||||
|
#include "src/wasm/wasm-memory.h"
|
||||||
#include "src/wasm/wasm-module-builder.h"
|
#include "src/wasm/wasm-module-builder.h"
|
||||||
#include "src/wasm/wasm-module.h"
|
#include "src/wasm/wasm-module.h"
|
||||||
#include "src/wasm/wasm-objects-inl.h"
|
#include "src/wasm/wasm-objects-inl.h"
|
||||||
@ -1111,7 +1112,7 @@ TEST(Run_WasmModule_Buffer_Externalized_GrowMem) {
|
|||||||
i::WasmMemoryObject::SetupNewBufferWithSameBackingStore(isolate, mem_obj,
|
i::WasmMemoryObject::SetupNewBufferWithSameBackingStore(isolate, mem_obj,
|
||||||
current_pages);
|
current_pages);
|
||||||
}
|
}
|
||||||
wasm::DetachWebAssemblyMemoryBuffer(isolate, memory, free_memory);
|
wasm::DetachMemoryBuffer(isolate, memory, free_memory);
|
||||||
CHECK_EQ(16, result);
|
CHECK_EQ(16, result);
|
||||||
memory = handle(mem_obj->array_buffer());
|
memory = handle(mem_obj->array_buffer());
|
||||||
instance->set_memory_buffer(*memory);
|
instance->set_memory_buffer(*memory);
|
||||||
@ -1152,7 +1153,7 @@ TEST(Run_WasmModule_Buffer_Externalized_GrowMemMemSize) {
|
|||||||
WasmMemoryObject::New(isolate, buffer, 100);
|
WasmMemoryObject::New(isolate, buffer, 100);
|
||||||
v8::Utils::ToLocal(buffer)->Externalize();
|
v8::Utils::ToLocal(buffer)->Externalize();
|
||||||
int32_t result = WasmMemoryObject::Grow(isolate, mem_obj, 0);
|
int32_t result = WasmMemoryObject::Grow(isolate, mem_obj, 0);
|
||||||
wasm::DetachWebAssemblyMemoryBuffer(isolate, buffer, false);
|
wasm::DetachMemoryBuffer(isolate, buffer, false);
|
||||||
CHECK_EQ(16, result);
|
CHECK_EQ(16, result);
|
||||||
|
|
||||||
isolate->array_buffer_allocator()->Free(backing_store,
|
isolate->array_buffer_allocator()->Free(backing_store,
|
||||||
@ -1173,7 +1174,7 @@ TEST(Run_WasmModule_Buffer_Externalized_Detach) {
|
|||||||
isolate, backing_store, 16 * WasmModule::kPageSize, backing_store,
|
isolate, backing_store, 16 * WasmModule::kPageSize, backing_store,
|
||||||
16 * WasmModule::kPageSize, false, false);
|
16 * WasmModule::kPageSize, false, false);
|
||||||
v8::Utils::ToLocal(buffer)->Externalize();
|
v8::Utils::ToLocal(buffer)->Externalize();
|
||||||
wasm::DetachWebAssemblyMemoryBuffer(isolate, buffer, true);
|
wasm::DetachMemoryBuffer(isolate, buffer, true);
|
||||||
isolate->array_buffer_allocator()->Free(backing_store,
|
isolate->array_buffer_allocator()->Free(backing_store,
|
||||||
16 * WasmModule::kPageSize);
|
16 * WasmModule::kPageSize);
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "src/api.h"
|
#include "src/api.h"
|
||||||
#include "src/assembler-inl.h"
|
#include "src/assembler-inl.h"
|
||||||
|
#include "src/wasm/wasm-memory.h"
|
||||||
#include "src/wasm/wasm-objects-inl.h"
|
#include "src/wasm/wasm-objects-inl.h"
|
||||||
|
|
||||||
namespace v8 {
|
namespace v8 {
|
||||||
|
Loading…
Reference in New Issue
Block a user