| Index: src/runtime/runtime-test.cc
|
| diff --git a/src/runtime/runtime-test.cc b/src/runtime/runtime-test.cc
|
| index 3185ee07d17f109d9a49094c0d5fcb6be0dbc63c..3bfc2dab9c84db2a661abe14bf3522b6552f0b6b 100644
|
| --- a/src/runtime/runtime-test.cc
|
| +++ b/src/runtime/runtime-test.cc
|
| @@ -19,6 +19,45 @@
|
| #include "src/wasm/wasm-module.h"
|
| #include "src/wasm/wasm-objects.h"
|
|
|
| +namespace {
|
| +struct WasmCompileControls {
|
| + uint32_t MaxWasmBufferSize = std::numeric_limits<uint32_t>::max();
|
| + bool AllowAnySizeForAsync = true;
|
| +};
|
| +
|
| +// We need per-isolate controls, because we sometimes run tests in multiple
|
| +// isolates
|
| +// concurrently.
|
| +// To avoid upsetting the static initializer count, we lazy initialize this.
|
| +v8::base::LazyInstance<std::map<v8::Isolate*, WasmCompileControls>>::type
|
| + g_PerIsolateWasmControls = LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +bool IsWasmCompileAllowed(v8::Isolate* isolate, v8::Local<v8::Value> value,
|
| + bool is_async) {
|
| + DCHECK_GT(g_PerIsolateWasmControls.Get().count(isolate), 0);
|
| + const WasmCompileControls& ctrls = g_PerIsolateWasmControls.Get().at(isolate);
|
| + return (is_async && ctrls.AllowAnySizeForAsync) ||
|
| + (v8::Local<v8::ArrayBuffer>::Cast(value)->ByteLength() <=
|
| + ctrls.MaxWasmBufferSize);
|
| +}
|
| +
|
| +// Use the compile controls for instantiation, too
|
| +bool IsWasmInstantiateAllowed(v8::Isolate* isolate,
|
| + v8::Local<v8::Value> module_or_bytes,
|
| + v8::MaybeLocal<v8::Value> ffi, bool is_async) {
|
| + DCHECK_GT(g_PerIsolateWasmControls.Get().count(isolate), 0);
|
| + const WasmCompileControls& ctrls = g_PerIsolateWasmControls.Get().at(isolate);
|
| + if (is_async && ctrls.AllowAnySizeForAsync) return true;
|
| + if (!module_or_bytes->IsWebAssemblyCompiledModule()) {
|
| + return IsWasmCompileAllowed(isolate, module_or_bytes, is_async);
|
| + }
|
| + v8::Local<v8::WasmCompiledModule> module =
|
| + v8::Local<v8::WasmCompiledModule>::Cast(module_or_bytes);
|
| + return static_cast<uint32_t>(module->GetWasmWireBytes()->Length()) <=
|
| + ctrls.MaxWasmBufferSize;
|
| +}
|
| +} // namespace
|
| +
|
| namespace v8 {
|
| namespace internal {
|
|
|
| @@ -429,6 +468,26 @@ RUNTIME_FUNCTION(Runtime_CheckWasmWrapperElision) {
|
| return isolate->heap()->ToBoolean(count == 1);
|
| }
|
|
|
| +RUNTIME_FUNCTION(Runtime_SetWasmCompileControls) {
|
| + HandleScope scope(isolate);
|
| + v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
|
| + CHECK(args.length() == 2);
|
| + CONVERT_ARG_HANDLE_CHECKED(Smi, block_size, 0);
|
| + CONVERT_BOOLEAN_ARG_CHECKED(allow_async, 1);
|
| + WasmCompileControls& ctrl = (*g_PerIsolateWasmControls.Pointer())[v8_isolate];
|
| + ctrl.AllowAnySizeForAsync = allow_async;
|
| + ctrl.MaxWasmBufferSize = static_cast<uint32_t>(block_size->value());
|
| + isolate->set_allow_wasm_compile_callback(IsWasmCompileAllowed);
|
| + return isolate->heap()->undefined_value();
|
| +}
|
| +
|
| +RUNTIME_FUNCTION(Runtime_SetWasmInstantiateControls) {
|
| + HandleScope scope(isolate);
|
| + CHECK(args.length() == 0);
|
| + isolate->set_allow_wasm_instantiate_callback(IsWasmInstantiateAllowed);
|
| + return isolate->heap()->undefined_value();
|
| +}
|
| +
|
| RUNTIME_FUNCTION(Runtime_NotifyContextDisposed) {
|
| HandleScope scope(isolate);
|
| DCHECK_EQ(0, args.length());
|
|
|