summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/api/api-wasm-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/api/api-wasm-unittest.cc')
-rw-r--r--deps/v8/test/unittests/api/api-wasm-unittest.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/api/api-wasm-unittest.cc b/deps/v8/test/unittests/api/api-wasm-unittest.cc
index 85174ced7f..ab1f22b8e3 100644
--- a/deps/v8/test/unittests/api/api-wasm-unittest.cc
+++ b/deps/v8/test/unittests/api/api-wasm-unittest.cc
@@ -13,6 +13,8 @@
#include "include/v8-wasm.h"
#include "src/api/api-inl.h"
#include "src/handles/global-handles.h"
+#include "src/wasm/wasm-features.h"
+#include "test/common/flag-utils.h"
#include "test/unittests/test-utils.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -156,4 +158,52 @@ TEST_F(ApiWasmTest, WasmStreamingSetCallback) {
Promise::kPending);
}
+TEST_F(ApiWasmTest, WasmEnableDisableGC) {
+ Local<Context> context_local = Context::New(isolate());
+ Context::Scope context_scope(context_local);
+ i::Handle<i::Context> context = v8::Utils::OpenHandle(*context_local);
+ // When using the flags, stringref and GC are controlled independently.
+ {
+ i::FlagScope<bool> flag_gc(&i::v8_flags.experimental_wasm_gc, false);
+ i::FlagScope<bool> flag_stringref(&i::v8_flags.experimental_wasm_stringref,
+ true);
+ EXPECT_FALSE(i_isolate()->IsWasmGCEnabled(context));
+ EXPECT_TRUE(i_isolate()->IsWasmStringRefEnabled(context));
+ }
+ {
+ i::FlagScope<bool> flag_gc(&i::v8_flags.experimental_wasm_gc, true);
+ i::FlagScope<bool> flag_stringref(&i::v8_flags.experimental_wasm_stringref,
+ false);
+ EXPECT_TRUE(i_isolate()->IsWasmGCEnabled(context));
+ EXPECT_FALSE(i_isolate()->IsWasmStringRefEnabled(context));
+ }
+ // When providing a callback, the callback will control GC, stringref,
+ // and inlining.
+ isolate()->SetWasmGCEnabledCallback([](auto) { return true; });
+ EXPECT_TRUE(i_isolate()->IsWasmGCEnabled(context));
+ EXPECT_TRUE(i_isolate()->IsWasmStringRefEnabled(context));
+ EXPECT_TRUE(i_isolate()->IsWasmInliningEnabled(context));
+ {
+ auto enabled_features = i::wasm::WasmFeatures::FromIsolate(i_isolate());
+ EXPECT_TRUE(enabled_features.has_gc());
+ EXPECT_TRUE(enabled_features.has_stringref());
+ EXPECT_TRUE(enabled_features.has_typed_funcref());
+ EXPECT_TRUE(enabled_features.has_inlining());
+ }
+ isolate()->SetWasmGCEnabledCallback([](auto) { return false; });
+ EXPECT_FALSE(i_isolate()->IsWasmGCEnabled(context));
+ EXPECT_FALSE(i_isolate()->IsWasmStringRefEnabled(context));
+ // TODO(crbug.com/1424350): Change (or just drop) this expectation when
+ // we enable inlining by default.
+ EXPECT_FALSE(i_isolate()->IsWasmInliningEnabled(context));
+ {
+ auto enabled_features = i::wasm::WasmFeatures::FromIsolate(i_isolate());
+ EXPECT_FALSE(enabled_features.has_gc());
+ EXPECT_FALSE(enabled_features.has_stringref());
+ EXPECT_FALSE(enabled_features.has_typed_funcref());
+ EXPECT_FALSE(enabled_features.has_inlining());
+ }
+ isolate()->SetWasmGCEnabledCallback(nullptr);
+}
+
} // namespace v8