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()); |