summaryrefslogtreecommitdiff
path: root/deps/v8/test/cctest/test-api.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/cctest/test-api.cc')
-rw-r--r--deps/v8/test/cctest/test-api.cc578
1 files changed, 192 insertions, 386 deletions
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc
index 345ee0bfc9..1daa19402e 100644
--- a/deps/v8/test/cctest/test-api.cc
+++ b/deps/v8/test/cctest/test-api.cc
@@ -46,6 +46,7 @@
#include "src/execution/arguments.h"
#include "src/execution/execution.h"
#include "src/execution/futex-emulation.h"
+#include "src/execution/protectors-inl.h"
#include "src/execution/vm-state.h"
#include "src/handles/global-handles.h"
#include "src/heap/heap-inl.h"
@@ -2955,11 +2956,8 @@ THREADED_TEST(SetAlignedPointerInInternalFields) {
obj->SetAlignedPointerInInternalFields(2, indices, values);
CcTest::CollectAllGarbage();
- {
- v8::SealHandleScope no_handle_leak(isolate);
- CHECK_EQ(heap_allocated_1, obj->GetAlignedPointerFromInternalField(0));
- CHECK_EQ(heap_allocated_2, obj->GetAlignedPointerFromInternalField(1));
- }
+ CHECK_EQ(heap_allocated_1, obj->GetAlignedPointerFromInternalField(0));
+ CHECK_EQ(heap_allocated_2, obj->GetAlignedPointerFromInternalField(1));
indices[0] = 1;
indices[1] = 0;
@@ -3012,7 +3010,6 @@ THREADED_TEST(EmbedderDataAlignedPointers) {
}
CcTest::CollectAllGarbage();
for (int i = 0; i < 100; i++) {
- v8::SealHandleScope no_handle_leak(env->GetIsolate());
CHECK_EQ(AlignedTestPointer(i), env->GetAlignedPointerFromEmbedderData(i));
}
}
@@ -7064,7 +7061,7 @@ static const char* kSimpleExtensionSource =
TEST(SimpleExtensions) {
v8::HandleScope handle_scope(CcTest::isolate());
v8::RegisterExtension(
- v8::base::make_unique<Extension>("simpletest", kSimpleExtensionSource));
+ std::make_unique<Extension>("simpletest", kSimpleExtensionSource));
const char* extension_names[] = {"simpletest"};
v8::ExtensionConfiguration extensions(1, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7086,7 +7083,7 @@ static const char* kStackTraceFromExtensionSource =
TEST(StackTraceInExtension) {
v8::HandleScope handle_scope(CcTest::isolate());
- v8::RegisterExtension(v8::base::make_unique<Extension>(
+ v8::RegisterExtension(std::make_unique<Extension>(
"stacktracetest", kStackTraceFromExtensionSource));
const char* extension_names[] = {"stacktracetest"};
v8::ExtensionConfiguration extensions(1, extension_names);
@@ -7104,7 +7101,7 @@ TEST(StackTraceInExtension) {
TEST(NullExtensions) {
v8::HandleScope handle_scope(CcTest::isolate());
- v8::RegisterExtension(v8::base::make_unique<Extension>("nulltest", nullptr));
+ v8::RegisterExtension(std::make_unique<Extension>("nulltest", nullptr));
const char* extension_names[] = {"nulltest"};
v8::ExtensionConfiguration extensions(1, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7122,8 +7119,8 @@ static const int kEmbeddedExtensionSourceValidLen = 34;
TEST(ExtensionMissingSourceLength) {
v8::HandleScope handle_scope(CcTest::isolate());
- v8::RegisterExtension(v8::base::make_unique<Extension>(
- "srclentest_fail", kEmbeddedExtensionSource));
+ v8::RegisterExtension(
+ std::make_unique<Extension>("srclentest_fail", kEmbeddedExtensionSource));
const char* extension_names[] = {"srclentest_fail"};
v8::ExtensionConfiguration extensions(1, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7137,9 +7134,9 @@ TEST(ExtensionWithSourceLength) {
v8::HandleScope handle_scope(CcTest::isolate());
i::ScopedVector<char> extension_name(32);
i::SNPrintF(extension_name, "ext #%d", source_len);
- v8::RegisterExtension(v8::base::make_unique<Extension>(
- extension_name.begin(), kEmbeddedExtensionSource, 0, nullptr,
- source_len));
+ v8::RegisterExtension(std::make_unique<Extension>(extension_name.begin(),
+ kEmbeddedExtensionSource,
+ 0, nullptr, source_len));
const char* extension_names[1] = {extension_name.begin()};
v8::ExtensionConfiguration extensions(1, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7177,9 +7174,9 @@ static const char* kEvalExtensionSource2 =
TEST(UseEvalFromExtension) {
v8::HandleScope handle_scope(CcTest::isolate());
v8::RegisterExtension(
- v8::base::make_unique<Extension>("evaltest1", kEvalExtensionSource1));
+ std::make_unique<Extension>("evaltest1", kEvalExtensionSource1));
v8::RegisterExtension(
- v8::base::make_unique<Extension>("evaltest2", kEvalExtensionSource2));
+ std::make_unique<Extension>("evaltest2", kEvalExtensionSource2));
const char* extension_names[] = {"evaltest1", "evaltest2"};
v8::ExtensionConfiguration extensions(2, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7213,9 +7210,9 @@ static const char* kWithExtensionSource2 =
TEST(UseWithFromExtension) {
v8::HandleScope handle_scope(CcTest::isolate());
v8::RegisterExtension(
- v8::base::make_unique<Extension>("withtest1", kWithExtensionSource1));
+ std::make_unique<Extension>("withtest1", kWithExtensionSource1));
v8::RegisterExtension(
- v8::base::make_unique<Extension>("withtest2", kWithExtensionSource2));
+ std::make_unique<Extension>("withtest2", kWithExtensionSource2));
const char* extension_names[] = {"withtest1", "withtest2"};
v8::ExtensionConfiguration extensions(2, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7232,7 +7229,7 @@ TEST(UseWithFromExtension) {
TEST(AutoExtensions) {
v8::HandleScope handle_scope(CcTest::isolate());
auto extension =
- v8::base::make_unique<Extension>("autotest", kSimpleExtensionSource);
+ std::make_unique<Extension>("autotest", kSimpleExtensionSource);
extension->set_auto_enable(true);
v8::RegisterExtension(std::move(extension));
v8::Local<Context> context = Context::New(CcTest::isolate());
@@ -7250,7 +7247,7 @@ static const char* kSyntaxErrorInExtensionSource = "[";
// error but results in an empty context.
TEST(SyntaxErrorExtensions) {
v8::HandleScope handle_scope(CcTest::isolate());
- v8::RegisterExtension(v8::base::make_unique<Extension>(
+ v8::RegisterExtension(std::make_unique<Extension>(
"syntaxerror", kSyntaxErrorInExtensionSource));
const char* extension_names[] = {"syntaxerror"};
v8::ExtensionConfiguration extensions(1, extension_names);
@@ -7266,8 +7263,8 @@ static const char* kExceptionInExtensionSource = "throw 42";
// a fatal error but results in an empty context.
TEST(ExceptionExtensions) {
v8::HandleScope handle_scope(CcTest::isolate());
- v8::RegisterExtension(v8::base::make_unique<Extension>(
- "exception", kExceptionInExtensionSource));
+ v8::RegisterExtension(
+ std::make_unique<Extension>("exception", kExceptionInExtensionSource));
const char* extension_names[] = {"exception"};
v8::ExtensionConfiguration extensions(1, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7285,8 +7282,8 @@ static const char* kNativeCallTest =
// Test that a native runtime calls are supported in extensions.
TEST(NativeCallInExtensions) {
v8::HandleScope handle_scope(CcTest::isolate());
- v8::RegisterExtension(v8::base::make_unique<Extension>(
- "nativecall", kNativeCallInExtensionSource));
+ v8::RegisterExtension(
+ std::make_unique<Extension>("nativecall", kNativeCallInExtensionSource));
const char* extension_names[] = {"nativecall"};
v8::ExtensionConfiguration extensions(1, extension_names);
v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
@@ -7320,7 +7317,7 @@ class NativeFunctionExtension : public Extension {
TEST(NativeFunctionDeclaration) {
v8::HandleScope handle_scope(CcTest::isolate());
const char* name = "nativedecl";
- v8::RegisterExtension(v8::base::make_unique<NativeFunctionExtension>(
+ v8::RegisterExtension(std::make_unique<NativeFunctionExtension>(
name, "native function foo();"));
const char* extension_names[] = {name};
v8::ExtensionConfiguration extensions(1, extension_names);
@@ -7336,7 +7333,7 @@ TEST(NativeFunctionDeclarationError) {
v8::HandleScope handle_scope(CcTest::isolate());
const char* name = "nativedeclerr";
// Syntax error in extension code.
- v8::RegisterExtension(v8::base::make_unique<NativeFunctionExtension>(
+ v8::RegisterExtension(std::make_unique<NativeFunctionExtension>(
name, "native\nfunction foo();"));
const char* extension_names[] = {name};
v8::ExtensionConfiguration extensions(1, extension_names);
@@ -7350,7 +7347,7 @@ TEST(NativeFunctionDeclarationErrorEscape) {
const char* name = "nativedeclerresc";
// Syntax error in extension code - escape code in "native" means that
// it's not treated as a keyword.
- v8::RegisterExtension(v8::base::make_unique<NativeFunctionExtension>(
+ v8::RegisterExtension(std::make_unique<NativeFunctionExtension>(
name, "nativ\\u0065 function foo();"));
const char* extension_names[] = {name};
v8::ExtensionConfiguration extensions(1, extension_names);
@@ -7382,17 +7379,17 @@ static void CheckDependencies(const char* name, const char* expected) {
THREADED_TEST(ExtensionDependency) {
static const char* kEDeps[] = {"D"};
v8::RegisterExtension(
- v8::base::make_unique<Extension>("E", "this.loaded += 'E';", 1, kEDeps));
+ std::make_unique<Extension>("E", "this.loaded += 'E';", 1, kEDeps));
static const char* kDDeps[] = {"B", "C"};
v8::RegisterExtension(
- v8::base::make_unique<Extension>("D", "this.loaded += 'D';", 2, kDDeps));
+ std::make_unique<Extension>("D", "this.loaded += 'D';", 2, kDDeps));
static const char* kBCDeps[] = {"A"};
v8::RegisterExtension(
- v8::base::make_unique<Extension>("B", "this.loaded += 'B';", 1, kBCDeps));
+ std::make_unique<Extension>("B", "this.loaded += 'B';", 1, kBCDeps));
v8::RegisterExtension(
- v8::base::make_unique<Extension>("C", "this.loaded += 'C';", 1, kBCDeps));
+ std::make_unique<Extension>("C", "this.loaded += 'C';", 1, kBCDeps));
v8::RegisterExtension(
- v8::base::make_unique<Extension>("A", "this.loaded += 'A';"));
+ std::make_unique<Extension>("A", "this.loaded += 'A';"));
CheckDependencies("A", "undefinedA");
CheckDependencies("B", "undefinedAB");
CheckDependencies("C", "undefinedAC");
@@ -7464,7 +7461,7 @@ v8::Local<v8::FunctionTemplate> FunctionExtension::GetNativeFunctionTemplate(
THREADED_TEST(FunctionLookup) {
- v8::RegisterExtension(v8::base::make_unique<FunctionExtension>());
+ v8::RegisterExtension(std::make_unique<FunctionExtension>());
v8::HandleScope handle_scope(CcTest::isolate());
static const char* exts[1] = {"functiontest"};
v8::ExtensionConfiguration config(1, exts);
@@ -7483,7 +7480,7 @@ THREADED_TEST(FunctionLookup) {
THREADED_TEST(NativeFunctionConstructCall) {
- v8::RegisterExtension(v8::base::make_unique<FunctionExtension>());
+ v8::RegisterExtension(std::make_unique<FunctionExtension>());
v8::HandleScope handle_scope(CcTest::isolate());
static const char* exts[1] = {"functiontest"};
v8::ExtensionConfiguration config(1, exts);
@@ -7520,9 +7517,9 @@ void StoringErrorCallback(const char* location, const char* message) {
TEST(ErrorReporting) {
CcTest::isolate()->SetFatalErrorHandler(StoringErrorCallback);
static const char* aDeps[] = {"B"};
- v8::RegisterExtension(v8::base::make_unique<Extension>("A", "", 1, aDeps));
+ v8::RegisterExtension(std::make_unique<Extension>("A", "", 1, aDeps));
static const char* bDeps[] = {"A"};
- v8::RegisterExtension(v8::base::make_unique<Extension>("B", "", 1, bDeps));
+ v8::RegisterExtension(std::make_unique<Extension>("B", "", 1, bDeps));
last_location = nullptr;
v8::ExtensionConfiguration config(1, bDeps);
v8::Local<Context> context = Context::New(CcTest::isolate(), &config);
@@ -10625,7 +10622,6 @@ THREADED_TEST(ShadowObjectAndDataProperty) {
i::FeedbackSlot slot = i::FeedbackVector::ToSlot(0);
i::FeedbackNexus nexus(foo->feedback_vector(), slot);
CHECK_EQ(i::FeedbackSlotKind::kStoreGlobalSloppy, nexus.kind());
- CHECK_EQ(i::PREMONOMORPHIC, nexus.ic_state());
CompileRun("foo(1)");
CHECK_EQ(i::MONOMORPHIC, nexus.ic_state());
// We go a bit further, checking that the form of monomorphism is
@@ -10676,7 +10672,6 @@ THREADED_TEST(ShadowObjectAndDataPropertyTurbo) {
i::FeedbackSlot slot = i::FeedbackVector::ToSlot(0);
i::FeedbackNexus nexus(foo->feedback_vector(), slot);
CHECK_EQ(i::FeedbackSlotKind::kStoreGlobalSloppy, nexus.kind());
- CHECK_EQ(i::PREMONOMORPHIC, nexus.ic_state());
CompileRun("%OptimizeFunctionOnNextCall(foo); foo(1)");
CHECK_EQ(i::MONOMORPHIC, nexus.ic_state());
i::HeapObject heap_object;
@@ -12310,8 +12305,14 @@ TEST(CallHandlerHasNoSideEffect) {
->Set(context.local(), v8_str("f"),
templ->GetFunction(context.local()).ToLocalChecked())
.FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("f()"), true).IsEmpty());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("new f()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// Side-effect-free version.
Local<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(isolate);
@@ -12321,8 +12322,14 @@ TEST(CallHandlerHasNoSideEffect) {
->Set(context.local(), v8_str("f2"),
templ2->GetFunction(context.local()).ToLocalChecked())
.FromJust());
- v8::debug::EvaluateGlobal(isolate, v8_str("f2()"), true).ToLocalChecked();
- v8::debug::EvaluateGlobal(isolate, v8_str("new f2()"), true).ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
}
TEST(FunctionTemplateNewHasNoSideEffect) {
@@ -12337,8 +12344,14 @@ TEST(FunctionTemplateNewHasNoSideEffect) {
->Set(context.local(), v8_str("f"),
templ->GetFunction(context.local()).ToLocalChecked())
.FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("f()"), true).IsEmpty());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("new f()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// Side-effect-free version.
Local<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(
@@ -12348,8 +12361,14 @@ TEST(FunctionTemplateNewHasNoSideEffect) {
->Set(context.local(), v8_str("f2"),
templ2->GetFunction(context.local()).ToLocalChecked())
.FromJust());
- v8::debug::EvaluateGlobal(isolate, v8_str("f2()"), true).ToLocalChecked();
- v8::debug::EvaluateGlobal(isolate, v8_str("new f2()"), true).ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
}
TEST(FunctionTemplateNewWithCacheHasNoSideEffect) {
@@ -12366,8 +12385,14 @@ TEST(FunctionTemplateNewWithCacheHasNoSideEffect) {
->Set(context.local(), v8_str("f"),
templ->GetFunction(context.local()).ToLocalChecked())
.FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("f()"), true).IsEmpty());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("new f()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// Side-effect-free version.
Local<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::NewWithCache(
@@ -12377,8 +12402,14 @@ TEST(FunctionTemplateNewWithCacheHasNoSideEffect) {
->Set(context.local(), v8_str("f2"),
templ2->GetFunction(context.local()).ToLocalChecked())
.FromJust());
- v8::debug::EvaluateGlobal(isolate, v8_str("f2()"), true).ToLocalChecked();
- v8::debug::EvaluateGlobal(isolate, v8_str("new f2()"), true).ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
}
TEST(FunctionNewHasNoSideEffect) {
@@ -12390,8 +12421,14 @@ TEST(FunctionNewHasNoSideEffect) {
Local<Function> func =
Function::New(context.local(), EmptyHandler).ToLocalChecked();
CHECK(context->Global()->Set(context.local(), v8_str("f"), func).FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("f()"), true).IsEmpty());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("new f()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// Side-effect-free version.
Local<Function> func2 =
@@ -12401,8 +12438,14 @@ TEST(FunctionNewHasNoSideEffect) {
.ToLocalChecked();
CHECK(
context->Global()->Set(context.local(), v8_str("f2"), func2).FromJust());
- v8::debug::EvaluateGlobal(isolate, v8_str("f2()"), true).ToLocalChecked();
- v8::debug::EvaluateGlobal(isolate, v8_str("new f2()"), true).ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("new f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
}
// These handlers instantiate a function the embedder considers safe in some
@@ -12461,7 +12504,10 @@ TEST(FunctionNewInstanceHasNoSideEffect) {
v8::SideEffectType::kHasNoSideEffect)
.ToLocalChecked();
CHECK(context->Global()->Set(context.local(), v8_str("f"), func0).FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("f()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// A whitelisted function that creates a new object. Should throw.
Local<Function> func =
@@ -12470,7 +12516,10 @@ TEST(FunctionNewInstanceHasNoSideEffect) {
v8::SideEffectType::kHasNoSideEffect)
.ToLocalChecked();
CHECK(context->Global()->Set(context.local(), v8_str("f"), func).FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("f()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("f()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// A whitelisted function that creates a new object with explicit intent to
// have no side-effects (e.g. building an "object wrapper"). Should not throw.
@@ -12481,18 +12530,26 @@ TEST(FunctionNewInstanceHasNoSideEffect) {
.ToLocalChecked();
CHECK(
context->Global()->Set(context.local(), v8_str("f2"), func2).FromJust());
- v8::debug::EvaluateGlobal(isolate, v8_str("f2()"), true).ToLocalChecked();
+ v8::debug::EvaluateGlobal(
+ isolate, v8_str("f2()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .ToLocalChecked();
// Check that side effect skipping did not leak outside to future evaluations.
Local<Function> func3 =
Function::New(context.local(), EmptyHandler).ToLocalChecked();
CHECK(
context->Global()->Set(context.local(), v8_str("f3"), func3).FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("f3()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("f3()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// Check that using side effect free NewInstance works in normal evaluation
// (without throwOnSideEffect).
- v8::debug::EvaluateGlobal(isolate, v8_str("f2()"), false).ToLocalChecked();
+ v8::debug::EvaluateGlobal(isolate, v8_str("f2()"),
+ v8::debug::EvaluateGlobalMode::kDefault)
+ .ToLocalChecked();
}
TEST(CallHandlerAsFunctionHasNoSideEffectNotSupported) {
@@ -12505,7 +12562,10 @@ TEST(CallHandlerAsFunctionHasNoSideEffectNotSupported) {
templ->SetCallAsFunctionHandler(EmptyHandler);
Local<v8::Object> obj = templ->NewInstance(context.local()).ToLocalChecked();
CHECK(context->Global()->Set(context.local(), v8_str("obj"), obj).FromJust());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("obj()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("obj()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
// Side-effect-free version is not supported.
i::FunctionTemplateInfo cons = i::FunctionTemplateInfo::cast(
@@ -12516,7 +12576,10 @@ TEST(CallHandlerAsFunctionHasNoSideEffectNotSupported) {
CHECK(!handler_info.IsSideEffectFreeCallHandlerInfo());
handler_info.set_map(
i::ReadOnlyRoots(heap).side_effect_free_call_handler_info_map());
- CHECK(v8::debug::EvaluateGlobal(isolate, v8_str("obj()"), true).IsEmpty());
+ CHECK(v8::debug::EvaluateGlobal(
+ isolate, v8_str("obj()"),
+ v8::debug::EvaluateGlobalMode::kDisableBreaksAndThrowOnSideEffect)
+ .IsEmpty());
}
static void IsConstructHandler(
@@ -18192,10 +18255,10 @@ static void BreakArrayGuarantees(const char* script) {
v8::Context::Scope context_scope(context);
v8::internal::Isolate* i_isolate =
reinterpret_cast<v8::internal::Isolate*>(isolate1);
- CHECK(i_isolate->IsNoElementsProtectorIntact());
+ CHECK(v8::internal::Protectors::IsNoElementsIntact(i_isolate));
// Run something in new isolate.
CompileRun(script);
- CHECK(!i_isolate->IsNoElementsProtectorIntact());
+ CHECK(!v8::internal::Protectors::IsNoElementsIntact(i_isolate));
}
isolate1->Exit();
isolate1->Dispose();
@@ -23170,7 +23233,7 @@ void RunStreamingTest(const char** chunks,
v8::TryCatch try_catch(isolate);
v8::ScriptCompiler::StreamedSource source(
- v8::base::make_unique<TestSourceStream>(chunks), encoding);
+ std::make_unique<TestSourceStream>(chunks), encoding);
v8::ScriptCompiler::ScriptStreamingTask* task =
v8::ScriptCompiler::StartStreamingScript(isolate, &source);
@@ -23441,7 +23504,7 @@ TEST(StreamingWithDebuggingEnabledLate) {
v8::TryCatch try_catch(isolate);
v8::ScriptCompiler::StreamedSource source(
- v8::base::make_unique<TestSourceStream>(chunks),
+ std::make_unique<TestSourceStream>(chunks),
v8::ScriptCompiler::StreamedSource::ONE_BYTE);
v8::ScriptCompiler::ScriptStreamingTask* task =
v8::ScriptCompiler::StartStreamingScript(isolate, &source);
@@ -23549,7 +23612,7 @@ TEST(StreamingWithHarmonyScopes) {
v8::TryCatch try_catch(isolate);
v8::ScriptCompiler::StreamedSource source(
- v8::base::make_unique<TestSourceStream>(chunks),
+ std::make_unique<TestSourceStream>(chunks),
v8::ScriptCompiler::StreamedSource::ONE_BYTE);
v8::ScriptCompiler::ScriptStreamingTask* task =
v8::ScriptCompiler::StartStreamingScript(isolate, &source);
@@ -23658,9 +23721,7 @@ v8::MaybeLocal<Value> SyntheticModuleEvaluationStepsCallbackFail(
v8::MaybeLocal<Value> SyntheticModuleEvaluationStepsCallbackSetExport(
Local<Context> context, Local<Module> module) {
- Maybe<bool> set_export_result = module->SetSyntheticModuleExport(
- context->GetIsolate(), v8_str("test_export"), v8_num(42));
- CHECK(set_export_result.FromJust());
+ module->SetSyntheticModuleExport(v8_str("test_export"), v8_num(42));
return v8::Undefined(reinterpret_cast<v8::Isolate*>(context->GetIsolate()));
}
@@ -23771,7 +23832,13 @@ TEST(ModuleCodeCache) {
// Evaluate for possible lazy compilation.
Local<Value> completion_value =
module->Evaluate(context).ToLocalChecked();
- CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(Local<v8::Promise>::Cast(completion_value));
+ CHECK_EQ(promise->State(), v8::Promise::kFulfilled);
+ CHECK(promise->Result()->IsUndefined());
+ } else {
+ CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ }
// Now create the cache. Note that it is freed, obscurely, when
// ScriptCompiler::Source goes out of scope below.
@@ -23802,7 +23869,13 @@ TEST(ModuleCodeCache) {
Local<Value> completion_value =
module->Evaluate(context).ToLocalChecked();
- CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(Local<v8::Promise>::Cast(completion_value));
+ CHECK_EQ(promise->State(), v8::Promise::kFulfilled);
+ CHECK(promise->Result()->IsUndefined());
+ } else {
+ CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ }
}
isolate->Dispose();
}
@@ -23867,9 +23940,7 @@ TEST(SyntheticModuleSetExports) {
// undefined.
CHECK(foo_cell->value().IsUndefined());
- Maybe<bool> set_export_result =
- module->SetSyntheticModuleExport(isolate, foo_string, bar_string);
- CHECK(set_export_result.FromJust());
+ module->SetSyntheticModuleExport(foo_string, bar_string);
// After setting the export the Cell should still have the same idenitity.
CHECK_EQ(exports->Lookup(v8::Utils::OpenHandle(*foo_string)), *foo_cell);
@@ -23880,34 +23951,6 @@ TEST(SyntheticModuleSetExports) {
->Equals(*v8::Utils::OpenHandle(*bar_string)));
}
-TEST(SyntheticModuleSetMissingExport) {
- LocalContext env;
- v8::Isolate* isolate = env->GetIsolate();
- auto i_isolate = reinterpret_cast<i::Isolate*>(isolate);
- v8::Isolate::Scope iscope(isolate);
- v8::HandleScope scope(isolate);
- v8::Local<v8::Context> context = v8::Context::New(isolate);
- v8::Context::Scope cscope(context);
-
- Local<String> foo_string = v8_str("foo");
- Local<String> bar_string = v8_str("bar");
-
- Local<Module> module = CreateAndInstantiateSyntheticModule(
- isolate, v8_str("SyntheticModuleSetExports-TestSyntheticModule"), context,
- std::vector<v8::Local<v8::String>>(),
- UnexpectedSyntheticModuleEvaluationStepsCallback);
-
- i::Handle<i::SyntheticModule> i_module =
- i::Handle<i::SyntheticModule>::cast(v8::Utils::OpenHandle(*module));
- i::Handle<i::ObjectHashTable> exports(i_module->exports(), i_isolate);
-
- TryCatch try_catch(isolate);
- Maybe<bool> set_export_result =
- module->SetSyntheticModuleExport(isolate, foo_string, bar_string);
- CHECK(set_export_result.IsNothing());
- CHECK(try_catch.HasCaught());
-}
-
TEST(SyntheticModuleEvaluationStepsNoThrow) {
synthetic_module_callback_count = 0;
LocalContext env;
@@ -24011,7 +24054,13 @@ TEST(ImportFromSyntheticModule) {
.ToChecked();
Local<Value> completion_value = module->Evaluate(context).ToLocalChecked();
- CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(Local<v8::Promise>::Cast(completion_value));
+ CHECK_EQ(promise->State(), v8::Promise::kFulfilled);
+ CHECK(promise->Result()->IsUndefined());
+ } else {
+ CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ }
}
TEST(ImportFromSyntheticModuleThrow) {
@@ -24041,7 +24090,15 @@ TEST(ImportFromSyntheticModuleThrow) {
CHECK_EQ(module->GetStatus(), Module::kInstantiated);
TryCatch try_catch(isolate);
v8::MaybeLocal<Value> completion_value = module->Evaluate(context);
- CHECK(completion_value.IsEmpty());
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(
+ Local<v8::Promise>::Cast(completion_value.ToLocalChecked()));
+ CHECK_EQ(promise->State(), v8::Promise::kRejected);
+ CHECK_EQ(promise->Result(), try_catch.Exception());
+ } else {
+ CHECK(completion_value.IsEmpty());
+ }
+
CHECK_EQ(module->GetStatus(), Module::kErrored);
CHECK(try_catch.HasCaught());
}
@@ -24074,7 +24131,13 @@ TEST(CodeCacheModuleScriptMismatch) {
// Evaluate for possible lazy compilation.
Local<Value> completion_value =
module->Evaluate(context).ToLocalChecked();
- CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(Local<v8::Promise>::Cast(completion_value));
+ CHECK_EQ(promise->State(), v8::Promise::kFulfilled);
+ CHECK(promise->Result()->IsUndefined());
+ } else {
+ CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ }
// Now create the cache. Note that it is freed, obscurely, when
// ScriptCompiler::Source goes out of scope below.
@@ -24170,7 +24233,13 @@ TEST(CodeCacheScriptModuleMismatch) {
Local<Value> completion_value =
module->Evaluate(context).ToLocalChecked();
- CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(Local<v8::Promise>::Cast(completion_value));
+ CHECK_EQ(promise->State(), v8::Promise::kFulfilled);
+ CHECK(promise->Result()->IsUndefined());
+ } else {
+ CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ }
}
isolate->Dispose();
}
@@ -24206,10 +24275,14 @@ TEST(InvalidCodeCacheDataInCompileModule) {
.ToChecked();
CHECK(cached_data->rejected);
- CHECK_EQ(42, module->Evaluate(context)
- .ToLocalChecked()
- ->Int32Value(context)
- .FromJust());
+ Local<Value> completion_value = module->Evaluate(context).ToLocalChecked();
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(Local<v8::Promise>::Cast(completion_value));
+ CHECK_EQ(promise->State(), v8::Promise::kFulfilled);
+ CHECK(promise->Result()->IsUndefined());
+ } else {
+ CHECK_EQ(42, completion_value->Int32Value(context).FromJust());
+ }
}
void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) {
@@ -24403,280 +24476,6 @@ TEST(SealHandleScopeNested) {
}
}
-
-static void ExtrasBindingTestRuntimeFunction(
- const v8::FunctionCallbackInfo<v8::Value>& args) {
- CHECK_EQ(
- 3,
- args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust());
- args.GetReturnValue().Set(v8_num(7));
-}
-
-TEST(ExtrasFunctionSource) {
- v8::Isolate* isolate = CcTest::isolate();
- v8::HandleScope handle_scope(isolate);
- LocalContext env;
-
- v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
-
- // Functions defined in extras do not expose source code.
- auto func = binding->Get(env.local(), v8_str("testFunctionToString"))
- .ToLocalChecked()
- .As<v8::Function>();
- auto undefined = v8::Undefined(isolate);
- auto result = func->Call(env.local(), undefined, 0, {})
- .ToLocalChecked()
- .As<v8::String>();
- CHECK(result->StrictEquals(v8_str("function foo() { [native code] }")));
-
- // Functions defined in extras do not show up in the stack trace.
- auto wrapper = binding->Get(env.local(), v8_str("testStackTrace"))
- .ToLocalChecked()
- .As<v8::Function>();
- CHECK(env->Global()->Set(env.local(), v8_str("wrapper"), wrapper).FromJust());
- ExpectString(
- "function f(x) { return wrapper(x) }"
- "function g() { return new Error().stack; }"
- "f(g)",
- "Error\n"
- " at g (<anonymous>:1:58)\n"
- " at f (<anonymous>:1:24)\n"
- " at <anonymous>:1:78");
-}
-
-TEST(ExtrasBindingObject) {
- v8::Isolate* isolate = CcTest::isolate();
- v8::HandleScope handle_scope(isolate);
- LocalContext env;
-
- // standalone.gypi ensures we include the test-extra.js file, which should
- // export the tested functions.
- v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
-
- auto func = binding->Get(env.local(), v8_str("testExtraShouldReturnFive"))
- .ToLocalChecked()
- .As<v8::Function>();
- auto undefined = v8::Undefined(isolate);
- auto result = func->Call(env.local(), undefined, 0, {})
- .ToLocalChecked()
- .As<v8::Number>();
- CHECK_EQ(5, result->Int32Value(env.local()).FromJust());
-
- v8::Local<v8::FunctionTemplate> runtimeFunction =
- v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction);
- binding->Set(env.local(), v8_str("runtime"),
- runtimeFunction->GetFunction(env.local()).ToLocalChecked())
- .FromJust();
- func = binding->Get(env.local(), v8_str("testExtraShouldCallToRuntime"))
- .ToLocalChecked()
- .As<v8::Function>();
- result = func->Call(env.local(), undefined, 0, {})
- .ToLocalChecked()
- .As<v8::Number>();
- CHECK_EQ(7, result->Int32Value(env.local()).FromJust());
-}
-
-
-TEST(ExtrasCreatePromise) {
- i::FLAG_allow_natives_syntax = true;
- LocalContext context;
- v8::Isolate* isolate = context->GetIsolate();
- v8::HandleScope handle_scope(isolate);
-
- LocalContext env;
- v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
-
- auto func = binding->Get(env.local(), v8_str("testCreatePromise"))
- .ToLocalChecked()
- .As<v8::Function>();
- CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust());
-
- auto promise = CompileRun(
- "%PrepareFunctionForOptimization(func);\n"
- "func();\n"
- "func();\n"
- "%OptimizeFunctionOnNextCall(func);\n"
- "func()\n")
- .As<v8::Promise>();
- CHECK_EQ(v8::Promise::kPending, promise->State());
-}
-
-TEST(ExtrasCreatePromiseWithParent) {
- i::FLAG_allow_natives_syntax = true;
- LocalContext context;
- v8::Isolate* isolate = context->GetIsolate();
- v8::HandleScope handle_scope(isolate);
-
- LocalContext env;
- v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
-
- auto func = binding->Get(env.local(), v8_str("testCreatePromiseWithParent"))
- .ToLocalChecked()
- .As<v8::Function>();
- CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust());
-
- auto promise = CompileRun(
- "var parent = new Promise((a, b) => {});\n"
- "%PrepareFunctionForOptimization(func);\n"
- "func(parent);\n"
- "func(parent);\n"
- "%OptimizeFunctionOnNextCall(func);\n"
- "func(parent)\n")
- .As<v8::Promise>();
- CHECK_EQ(v8::Promise::kPending, promise->State());
-}
-
-TEST(ExtrasRejectPromise) {
- i::FLAG_allow_natives_syntax = true;
- LocalContext context;
- v8::Isolate* isolate = context->GetIsolate();
- v8::HandleScope handle_scope(isolate);
-
- LocalContext env;
- v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
-
- auto func = binding->Get(env.local(), v8_str("testRejectPromise"))
- .ToLocalChecked()
- .As<v8::Function>();
- CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust());
-
- auto rejected_promise = CompileRun(
- "function newPromise() {\n"
- " return new Promise((a, b) => {});\n"
- "}\n"
- "%PrepareFunctionForOptimization(func);\n"
- "func(newPromise(), 1);\n"
- "func(newPromise(), 1);\n"
- "%OptimizeFunctionOnNextCall(func);\n"
- "var promise = newPromise();\n"
- "func(promise, 1);\n"
- "promise;\n")
- .As<v8::Promise>();
- CHECK_EQ(v8::Promise::kRejected, rejected_promise->State());
- CHECK_EQ(1, rejected_promise->Result()->Int32Value(env.local()).FromJust());
-}
-
-TEST(ExtrasResolvePromise) {
- i::FLAG_allow_natives_syntax = true;
- LocalContext context;
- v8::Isolate* isolate = context->GetIsolate();
- v8::HandleScope handle_scope(isolate);
-
- LocalContext env;
- v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
-
- auto func = binding->Get(env.local(), v8_str("testResolvePromise"))
- .ToLocalChecked()
- .As<v8::Function>();
- CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust());
-
- auto pending_promise = CompileRun(
- "function newPromise() {\n"
- " return new Promise((a, b) => {});\n"
- "}\n"
- "%PrepareFunctionForOptimization(func);\n"
- "func(newPromise(), newPromise());\n"
- "func(newPromise(), newPromise());\n"
- "%OptimizeFunctionOnNextCall(func);\n"
- "var promise = newPromise();\n"
- "func(promise, newPromise());\n"
- "promise;\n")
- .As<v8::Promise>();
- CHECK_EQ(v8::Promise::kPending, pending_promise->State());
-
- auto fulfilled_promise = CompileRun(
- "function newPromise() {\n"
- " return new Promise((a, b) => {});\n"
- "}\n"
- "%PrepareFunctionForOptimization(func);\n"
- "func(newPromise(), 1);\n"
- "func(newPromise(), 1);\n"
- "%OptimizeFunctionOnNextCall(func);\n"
- "var promise = newPromise();\n"
- "func(promise, 1);\n"
- "promise;\n")
- .As<v8::Promise>();
- CHECK_EQ(v8::Promise::kFulfilled, fulfilled_promise->State());
- CHECK_EQ(1, fulfilled_promise->Result()->Int32Value(env.local()).FromJust());
-}
-
-TEST(ExtrasUtilsObject) {
- LocalContext context;
- v8::Isolate* isolate = context->GetIsolate();
- v8::HandleScope handle_scope(isolate);
-
- LocalContext env;
- v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
-
- auto func = binding->Get(env.local(), v8_str("testExtraCanUseUtils"))
- .ToLocalChecked()
- .As<v8::Function>();
- auto undefined = v8::Undefined(isolate);
- auto result = func->Call(env.local(), undefined, 0, {})
- .ToLocalChecked()
- .As<v8::Object>();
-
- auto private_symbol = result->Get(env.local(), v8_str("privateSymbol"))
- .ToLocalChecked()
- .As<v8::Symbol>();
- i::Handle<i::Symbol> ips = v8::Utils::OpenHandle(*private_symbol);
- CHECK(ips->IsPrivate());
-
- CompileRun("var result = 0; function store(x) { result = x; }");
- auto store = CompileRun("store").As<v8::Function>();
-
- auto fulfilled_promise = result->Get(env.local(), v8_str("fulfilledPromise"))
- .ToLocalChecked()
- .As<v8::Promise>();
- fulfilled_promise->Then(env.local(), store).ToLocalChecked();
- isolate->RunMicrotasks();
- CHECK_EQ(1, CompileRun("result")->Int32Value(env.local()).FromJust());
-
- auto fulfilled_promise_2 =
- result->Get(env.local(), v8_str("fulfilledPromise2"))
- .ToLocalChecked()
- .As<v8::Promise>();
- fulfilled_promise_2->Then(env.local(), store).ToLocalChecked();
- isolate->RunMicrotasks();
- CHECK_EQ(2, CompileRun("result")->Int32Value(env.local()).FromJust());
-
- auto rejected_promise = result->Get(env.local(), v8_str("rejectedPromise"))
- .ToLocalChecked()
- .As<v8::Promise>();
- rejected_promise->Catch(env.local(), store).ToLocalChecked();
- isolate->RunMicrotasks();
- CHECK_EQ(3, CompileRun("result")->Int32Value(env.local()).FromJust());
-
- auto rejected_but_handled_promise =
- result->Get(env.local(), v8_str("rejectedButHandledPromise"))
- .ToLocalChecked()
- .As<v8::Promise>();
- CHECK(rejected_but_handled_promise->HasHandler());
-
- auto promise_states = result->Get(env.local(), v8_str("promiseStates"))
- .ToLocalChecked()
- .As<v8::String>();
- String::Utf8Value promise_states_string(isolate, promise_states);
- CHECK_EQ(0, strcmp(*promise_states_string, "pending fulfilled rejected"));
-
- auto promise_is_promise = result->Get(env.local(), v8_str("promiseIsPromise"))
- .ToLocalChecked()
- .As<v8::Boolean>();
- CHECK_EQ(true, promise_is_promise->Value());
-
- auto thenable_is_promise =
- result->Get(env.local(), v8_str("thenableIsPromise"))
- .ToLocalChecked()
- .As<v8::Boolean>();
- CHECK_EQ(false, thenable_is_promise->Value());
-
- auto uncurry_this = result->Get(env.local(), v8_str("uncurryThis"))
- .ToLocalChecked()
- .As<v8::Boolean>();
- CHECK_EQ(true, uncurry_this->Value());
-}
-
-
TEST(Map) {
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope handle_scope(isolate);
@@ -25854,7 +25653,14 @@ TEST(ImportMeta) {
module->InstantiateModule(context.local(), UnexpectedModuleResolveCallback)
.ToChecked();
Local<Value> result = module->Evaluate(context.local()).ToLocalChecked();
- CHECK(result->StrictEquals(Local<v8::Value>::Cast(v8::Utils::ToLocal(meta))));
+ if (i::FLAG_harmony_top_level_await) {
+ Local<v8::Promise> promise(Local<v8::Promise>::Cast(result));
+ CHECK_EQ(promise->State(), v8::Promise::kFulfilled);
+ CHECK(promise->Result()->IsUndefined());
+ } else {
+ CHECK(
+ result->StrictEquals(Local<v8::Value>::Cast(v8::Utils::ToLocal(meta))));
+ }
}
TEST(GetModuleNamespace) {
@@ -26180,7 +25986,7 @@ void AtomicsWaitCallbackForTesting(
wake_handle->Wake();
break;
case AtomicsWaitCallbackAction::StopFromThreadAndThrow:
- info->stop_thread = v8::base::make_unique<StopAtomicsWaitThread>(info);
+ info->stop_thread = std::make_unique<StopAtomicsWaitThread>(info);
CHECK(info->stop_thread->Start());
break;
case AtomicsWaitCallbackAction::KeepWaiting: