Chromium Code Reviews| Index: test/cctest/test-api.cc |
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
| index 65e6135f8a074c5b3a661b94f12805c62aa22bd3..c3d45cc4b1c0b78c165ecbd1b0e69db1fa0ac577 100644 |
| --- a/test/cctest/test-api.cc |
| +++ b/test/cctest/test-api.cc |
| @@ -456,7 +456,7 @@ THREADED_TEST(ScriptUsingStringResource) { |
| CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), |
| source->GetExternalStringResourceBase(&encoding)); |
| CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
|
Franzi
2017/05/10 09:17:53
Is this a rebase problem?
|
| CHECK_EQ(0, dispose_count); |
| } |
| CcTest::i_isolate()->compilation_cache()->Clear(); |
| @@ -487,7 +487,7 @@ THREADED_TEST(ScriptUsingOneByteStringResource) { |
| Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
| CHECK(value->IsNumber()); |
| CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(0, dispose_count); |
| } |
| CcTest::i_isolate()->compilation_cache()->Clear(); |
| @@ -521,11 +521,11 @@ THREADED_TEST(ScriptMakingExternalString) { |
| Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
| CHECK(value->IsNumber()); |
| CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(0, dispose_count); |
| } |
| CcTest::i_isolate()->compilation_cache()->Clear(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(1, dispose_count); |
| } |
| @@ -547,11 +547,11 @@ THREADED_TEST(ScriptMakingExternalOneByteString) { |
| Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
| CHECK(value->IsNumber()); |
| CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(0, dispose_count); |
| } |
| CcTest::i_isolate()->compilation_cache()->Clear(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(1, dispose_count); |
| } |
| @@ -629,7 +629,7 @@ TEST(MakingExternalUnalignedOneByteString) { |
| CHECK(success); |
| // Trigger GCs and force evacuation. |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CcTest::CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask); |
| } |
| @@ -651,8 +651,8 @@ THREADED_TEST(UsingExternalString) { |
| factory->InternalizeString(istring); |
| CHECK(isymbol->IsInternalizedString()); |
| } |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| + CcTest::CollectAllGarbage(); |
| } |
| @@ -674,8 +674,8 @@ THREADED_TEST(UsingExternalOneByteString) { |
| factory->InternalizeString(istring); |
| CHECK(isymbol->IsInternalizedString()); |
| } |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| + CcTest::CollectAllGarbage(); |
| } |
| @@ -900,8 +900,8 @@ THREADED_TEST(StringConcat) { |
| CHECK_EQ(68, value->Int32Value(env.local()).FromJust()); |
| } |
| CcTest::i_isolate()->compilation_cache()->Clear(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| + CcTest::CollectAllGarbage(); |
| } |
| @@ -2670,7 +2670,7 @@ static void CheckAlignedPointerInInternalField(Local<v8::Object> obj, |
| void* value) { |
| CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); |
| obj->SetAlignedPointerInInternalField(0, value); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0)); |
| } |
| @@ -2725,14 +2725,14 @@ THREADED_TEST(SetAlignedPointerInInternalFields) { |
| void* values[] = {heap_allocated_1, heap_allocated_2}; |
| obj->SetAlignedPointerInInternalFields(2, indices, values); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(heap_allocated_1, obj->GetAlignedPointerFromInternalField(0)); |
| CHECK_EQ(heap_allocated_2, obj->GetAlignedPointerFromInternalField(1)); |
| indices[0] = 1; |
| indices[1] = 0; |
| obj->SetAlignedPointerInInternalFields(2, indices, values); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(heap_allocated_2, obj->GetAlignedPointerFromInternalField(0)); |
| CHECK_EQ(heap_allocated_1, obj->GetAlignedPointerFromInternalField(1)); |
| @@ -2744,7 +2744,7 @@ static void CheckAlignedPointerInEmbedderData(LocalContext* env, int index, |
| void* value) { |
| CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); |
| (*env)->SetAlignedPointerInEmbedderData(index, value); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(value, (*env)->GetAlignedPointerFromEmbedderData(index)); |
| } |
| @@ -2774,7 +2774,7 @@ THREADED_TEST(EmbedderDataAlignedPointers) { |
| for (int i = 0; i < 100; i++) { |
| env->SetAlignedPointerInEmbedderData(i, AlignedTestPointer(i)); |
| } |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| for (int i = 0; i < 100; i++) { |
| CHECK_EQ(AlignedTestPointer(i), env->GetAlignedPointerFromEmbedderData(i)); |
| } |
| @@ -2806,7 +2806,7 @@ THREADED_TEST(IdentityHash) { |
| // Ensure that the test starts with an fresh heap to test whether the hash |
| // code is based on the address. |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| Local<v8::Object> obj = v8::Object::New(isolate); |
| int hash = obj->GetIdentityHash(); |
| int hash1 = obj->GetIdentityHash(); |
| @@ -2816,7 +2816,7 @@ THREADED_TEST(IdentityHash) { |
| // objects should not be assigned the same hash code. If the test below fails |
| // the random number generator should be evaluated. |
| CHECK_NE(hash, hash2); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| int hash3 = v8::Object::New(isolate)->GetIdentityHash(); |
| // Make sure that the identity hash is not based on the initial address of |
| // the object alone. If the test below fails the random number generator |
| @@ -2892,7 +2892,7 @@ TEST(SymbolIdentityHash) { |
| int hash = symbol->GetIdentityHash(); |
| int hash1 = symbol->GetIdentityHash(); |
| CHECK_EQ(hash, hash1); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| int hash3 = symbol->GetIdentityHash(); |
| CHECK_EQ(hash, hash3); |
| } |
| @@ -2903,7 +2903,7 @@ TEST(SymbolIdentityHash) { |
| int hash = js_symbol->GetIdentityHash(); |
| int hash1 = js_symbol->GetIdentityHash(); |
| CHECK_EQ(hash, hash1); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| int hash3 = js_symbol->GetIdentityHash(); |
| CHECK_EQ(hash, hash3); |
| } |
| @@ -2919,7 +2919,7 @@ TEST(StringIdentityHash) { |
| int hash = str->GetIdentityHash(); |
| int hash1 = str->GetIdentityHash(); |
| CHECK_EQ(hash, hash1); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| int hash3 = str->GetIdentityHash(); |
| CHECK_EQ(hash, hash3); |
| @@ -2938,8 +2938,9 @@ THREADED_TEST(SymbolProperties) { |
| v8::Local<v8::Symbol> sym1 = v8::Symbol::New(isolate); |
| v8::Local<v8::Symbol> sym2 = v8::Symbol::New(isolate, v8_str("my-symbol")); |
| v8::Local<v8::Symbol> sym3 = v8::Symbol::New(isolate, v8_str("sym3")); |
| + v8::Local<v8::Symbol> sym4 = v8::Symbol::New(isolate, v8_str("native")); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| // Check basic symbol functionality. |
| CHECK(sym1->IsSymbol()); |
| @@ -3008,7 +3009,7 @@ THREADED_TEST(SymbolProperties) { |
| CHECK_EQ(num_props + 1, |
| obj->GetPropertyNames(env.local()).ToLocalChecked()->Length()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK(obj->SetAccessor(env.local(), sym3, SymbolAccessorGetter, |
| SymbolAccessorSetter) |
| @@ -3024,6 +3025,23 @@ THREADED_TEST(SymbolProperties) { |
| ->Equals(env.local(), v8::Integer::New(isolate, 42)) |
| .FromJust()); |
| + CHECK(obj->SetNativeDataProperty(env.local(), sym4, SymbolAccessorGetter) |
| + .FromJust()); |
| + CHECK(obj->Get(env.local(), sym4).ToLocalChecked()->IsUndefined()); |
| + CHECK(obj->Set(env.local(), v8_str("accessor_native"), |
| + v8::Integer::New(isolate, 123)) |
| + .FromJust()); |
| + CHECK_EQ(123, obj->Get(env.local(), sym4) |
| + .ToLocalChecked() |
| + ->Int32Value(env.local()) |
| + .FromJust()); |
| + CHECK(obj->Set(env.local(), sym4, v8::Integer::New(isolate, 314)).FromJust()); |
| + CHECK(obj->Get(env.local(), sym4) |
| + .ToLocalChecked() |
| + ->Equals(env.local(), v8::Integer::New(isolate, 314)) |
| + .FromJust()); |
| + CHECK(obj->Delete(env.local(), v8_str("accessor_native")).FromJust()); |
| + |
| // Add another property and delete it afterwards to force the object in |
| // slow case. |
| CHECK( |
| @@ -3118,7 +3136,7 @@ THREADED_TEST(PrivatePropertiesOnProxies) { |
| v8::Local<v8::Private> priv2 = |
| v8::Private::New(isolate, v8_str("my-private")); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK(priv2->Name() |
| ->Equals(env.local(), |
| @@ -3160,7 +3178,7 @@ THREADED_TEST(PrivatePropertiesOnProxies) { |
| CHECK_EQ(num_props + 1, |
| proxy->GetPropertyNames(env.local()).ToLocalChecked()->Length()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| // Add another property and delete it afterwards to force the object in |
| // slow case. |
| @@ -3212,7 +3230,7 @@ THREADED_TEST(PrivateProperties) { |
| v8::Local<v8::Private> priv2 = |
| v8::Private::New(isolate, v8_str("my-private")); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK(priv2->Name() |
| ->Equals(env.local(), |
| @@ -3254,7 +3272,7 @@ THREADED_TEST(PrivateProperties) { |
| CHECK_EQ(num_props + 1, |
| obj->GetPropertyNames(env.local()).ToLocalChecked()->Length()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| // Add another property and delete it afterwards to force the object in |
| // slow case. |
| @@ -3357,6 +3375,15 @@ static void CheckWellKnownSymbol(v8::Local<v8::Symbol>(*getter)(v8::Isolate*), |
| THREADED_TEST(WellKnownSymbols) { |
| CheckWellKnownSymbol(v8::Symbol::GetIterator, "Symbol.iterator"); |
| CheckWellKnownSymbol(v8::Symbol::GetUnscopables, "Symbol.unscopables"); |
| + CheckWellKnownSymbol(v8::Symbol::GetHasInstance, "Symbol.hasInstance"); |
| + CheckWellKnownSymbol(v8::Symbol::GetIsConcatSpreadable, |
| + "Symbol.isConcatSpreadable"); |
| + CheckWellKnownSymbol(v8::Symbol::GetMatch, "Symbol.match"); |
| + CheckWellKnownSymbol(v8::Symbol::GetReplace, "Symbol.replace"); |
| + CheckWellKnownSymbol(v8::Symbol::GetSearch, "Symbol.search"); |
| + CheckWellKnownSymbol(v8::Symbol::GetSplit, "Symbol.split"); |
| + CheckWellKnownSymbol(v8::Symbol::GetToPrimitive, "Symbol.toPrimitive"); |
| + CheckWellKnownSymbol(v8::Symbol::GetToStringTag, "Symbol.toStringTag"); |
| } |
| @@ -3417,7 +3444,7 @@ THREADED_TEST(ArrayBuffer_ApiInternalToExternal) { |
| CheckInternalFieldsAreZero(ab); |
| CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); |
| CHECK(!ab->IsExternal()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| ScopedArrayBufferContents ab_contents(ab->Externalize()); |
| CHECK(ab->IsExternal()); |
| @@ -3693,7 +3720,7 @@ THREADED_TEST(SharedArrayBuffer_ApiInternalToExternal) { |
| CheckInternalFieldsAreZero(ab); |
| CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); |
| CHECK(!ab->IsExternal()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| ScopedSharedArrayBufferContents ab_contents(ab->Externalize()); |
| CHECK(ab->IsExternal()); |
| @@ -3810,7 +3837,7 @@ THREADED_TEST(HiddenProperties) { |
| v8::Local<v8::String> empty = v8_str(""); |
| v8::Local<v8::String> prop_name = v8_str("prop_name"); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| // Make sure delete of a non-existent hidden value works |
| obj->DeletePrivate(env.local(), key).FromJust(); |
| @@ -3828,7 +3855,7 @@ THREADED_TEST(HiddenProperties) { |
| ->Int32Value(env.local()) |
| .FromJust()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| // Make sure we do not find the hidden property. |
| CHECK(!obj->Has(env.local(), empty).FromJust()); |
| @@ -3852,7 +3879,7 @@ THREADED_TEST(HiddenProperties) { |
| ->Int32Value(env.local()) |
| .FromJust()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| // Add another property and delete it afterwards to force the object in |
| // slow case. |
| @@ -3876,7 +3903,7 @@ THREADED_TEST(HiddenProperties) { |
| ->Int32Value(env.local()) |
| .FromJust()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) |
| .FromJust()); |
| @@ -4167,7 +4194,7 @@ void SecondPassCallback(const v8::WeakCallbackInfo<TwoPassCallbackData>& data) { |
| if (!trigger_gc) return; |
| auto data_2 = new TwoPassCallbackData(data.GetIsolate(), instance_counter); |
| data_2->SetWeak(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } |
| @@ -4188,7 +4215,7 @@ TEST(TwoPassPhantomCallbacks) { |
| data->SetWeak(); |
| } |
| CHECK_EQ(static_cast<int>(kLength), instance_counter); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| EmptyMessageQueues(isolate); |
| CHECK_EQ(0, instance_counter); |
| } |
| @@ -4207,7 +4234,7 @@ TEST(TwoPassPhantomCallbacksNestedGc) { |
| array[10]->MarkTriggerGc(); |
| array[15]->MarkTriggerGc(); |
| CHECK_EQ(static_cast<int>(kLength), instance_counter); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| EmptyMessageQueues(isolate); |
| CHECK_EQ(0, instance_counter); |
| } |
| @@ -4772,7 +4799,7 @@ TEST(NativeWeakMap) { |
| CHECK(value->Equals(env.local(), weak_map->Get(obj2)).FromJust()); |
| CHECK(value->Equals(env.local(), weak_map->Get(sym1)).FromJust()); |
| } |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| { |
| HandleScope scope(isolate); |
| CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust()); |
| @@ -4794,7 +4821,7 @@ TEST(NativeWeakMap) { |
| s1.handle.SetWeak(&s1, &WeakPointerCallback, |
| v8::WeakCallbackType::kParameter); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(3, counter.NumberOfWeakCalls()); |
| CHECK(o1.handle.IsEmpty()); |
| @@ -6224,6 +6251,63 @@ THREADED_TEST(TypeOf) { |
| .FromJust()); |
| } |
| +THREADED_TEST(InstanceOf) { |
| + LocalContext env; |
| + v8::HandleScope scope(env->GetIsolate()); |
| + CompileRun( |
| + "var A = {};" |
| + "var B = {};" |
| + "var C = {};" |
| + "B.__proto__ = A;" |
| + "C.__proto__ = B;" |
| + "function F() {}" |
| + "F.prototype = A;" |
| + "var G = { [Symbol.hasInstance] : null};" |
| + "var H = { [Symbol.hasInstance] : () => { throw new Error(); } };" |
| + "var J = { [Symbol.hasInstance] : () => true };" |
| + "class K {}" |
| + "var D = new K;" |
| + "class L extends K {}" |
| + "var E = new L"); |
| + |
| + v8::Local<v8::Object> f = v8::Local<v8::Object>::Cast(CompileRun("F")); |
| + v8::Local<v8::Object> g = v8::Local<v8::Object>::Cast(CompileRun("G")); |
| + v8::Local<v8::Object> h = v8::Local<v8::Object>::Cast(CompileRun("H")); |
| + v8::Local<v8::Object> j = v8::Local<v8::Object>::Cast(CompileRun("J")); |
| + v8::Local<v8::Object> k = v8::Local<v8::Object>::Cast(CompileRun("K")); |
| + v8::Local<v8::Object> l = v8::Local<v8::Object>::Cast(CompileRun("L")); |
| + v8::Local<v8::Value> a = v8::Local<v8::Value>::Cast(CompileRun("A")); |
| + v8::Local<v8::Value> b = v8::Local<v8::Value>::Cast(CompileRun("B")); |
| + v8::Local<v8::Value> c = v8::Local<v8::Value>::Cast(CompileRun("C")); |
| + v8::Local<v8::Value> d = v8::Local<v8::Value>::Cast(CompileRun("D")); |
| + v8::Local<v8::Value> e = v8::Local<v8::Value>::Cast(CompileRun("E")); |
| + |
| + v8::TryCatch try_catch(env->GetIsolate()); |
| + CHECK(!a->InstanceOf(env.local(), f).ToChecked()); |
| + CHECK(b->InstanceOf(env.local(), f).ToChecked()); |
| + CHECK(c->InstanceOf(env.local(), f).ToChecked()); |
| + CHECK(!d->InstanceOf(env.local(), f).ToChecked()); |
| + CHECK(!e->InstanceOf(env.local(), f).ToChecked()); |
| + CHECK(!try_catch.HasCaught()); |
| + |
| + CHECK(a->InstanceOf(env.local(), g).IsNothing()); |
| + CHECK(try_catch.HasCaught()); |
| + try_catch.Reset(); |
| + |
| + CHECK(b->InstanceOf(env.local(), h).IsNothing()); |
| + CHECK(try_catch.HasCaught()); |
| + try_catch.Reset(); |
| + |
| + CHECK(v8_num(1)->InstanceOf(env.local(), j).ToChecked()); |
| + CHECK(!try_catch.HasCaught()); |
| + |
| + CHECK(d->InstanceOf(env.local(), k).ToChecked()); |
| + CHECK(e->InstanceOf(env.local(), k).ToChecked()); |
| + CHECK(!d->InstanceOf(env.local(), l).ToChecked()); |
| + CHECK(e->InstanceOf(env.local(), l).ToChecked()); |
| + CHECK(!try_catch.HasCaught()); |
| +} |
| + |
| THREADED_TEST(MultiRun) { |
| LocalContext context; |
| v8::HandleScope scope(context->GetIsolate()); |
| @@ -7470,7 +7554,7 @@ static void IndependentWeakHandle(bool global_gc, bool interlinked) { |
| b->Set(context, v8_str("x"), a).FromJust(); |
| } |
| if (global_gc) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } else { |
| CcTest::CollectGarbage(i::NEW_SPACE); |
| } |
| @@ -7496,7 +7580,7 @@ static void IndependentWeakHandle(bool global_gc, bool interlinked) { |
| object_b.handle.MarkIndependent(); |
| CHECK(object_b.handle.IsIndependent()); |
| if (global_gc) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } else { |
| CcTest::CollectGarbage(i::NEW_SPACE); |
| } |
| @@ -7594,7 +7678,7 @@ void InternalFieldCallback(bool global_gc) { |
| } |
| } |
| if (global_gc) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } else { |
| CcTest::CollectGarbage(i::NEW_SPACE); |
| } |
| @@ -7674,9 +7758,7 @@ THREADED_HEAP_TEST(ResetWeakHandle) { |
| static void InvokeScavenge() { CcTest::CollectGarbage(i::NEW_SPACE); } |
| -static void InvokeMarkSweep() { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| -} |
| +static void InvokeMarkSweep() { CcTest::CollectAllGarbage(); } |
| static void ForceScavenge2( |
| const v8::WeakCallbackInfo<FlagAndPersistent>& data) { |
| @@ -7752,7 +7834,7 @@ static void ArgumentsTestCallback( |
| CHECK(v8::Integer::New(isolate, 3)->Equals(context, args[2]).FromJust()); |
| CHECK(v8::Undefined(isolate)->Equals(context, args[3]).FromJust()); |
| v8::HandleScope scope(args.GetIsolate()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } |
| @@ -9082,7 +9164,7 @@ static bool security_check_with_gc_called; |
| static bool SecurityTestCallbackWithGC(Local<v8::Context> accessing_context, |
| Local<v8::Object> accessed_object, |
| Local<v8::Value> data) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| security_check_with_gc_called = true; |
| return true; |
| } |
| @@ -11179,47 +11261,78 @@ THREADED_TEST(ConstructorForObject) { |
| Local<Function> function = |
| function_template->GetFunction(context.local()).ToLocalChecked(); |
| Local<Object> instance1 = function; |
| + CHECK(instance1->IsObject()); |
| + CHECK(instance1->IsFunction()); |
| CHECK(context->Global() |
| ->Set(context.local(), v8_str("obj4"), instance1) |
| .FromJust()); |
| v8::TryCatch try_catch(isolate); |
| - Local<Value> value; |
| CHECK(!try_catch.HasCaught()); |
| - CHECK(instance1->IsObject()); |
| - CHECK(instance1->IsFunction()); |
| + { |
| + Local<Value> value = CompileRun("new obj4(28)"); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(value->IsObject()); |
| + |
| + Local<Value> args[] = {v8_num(28)}; |
| + value = instance1->CallAsConstructor(context.local(), 1, args) |
| + .ToLocalChecked(); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(value->IsObject()); |
| + } |
| - value = CompileRun("new obj4(28)"); |
| + Local<Value> proxy = CompileRun("proxy = new Proxy({},{})"); |
| CHECK(!try_catch.HasCaught()); |
| - CHECK(value->IsObject()); |
| + CHECK(proxy->IsProxy()); |
| - Local<Value> args1[] = {v8_num(28)}; |
| - value = instance1->CallAsConstructor(context.local(), 1, args1) |
| - .ToLocalChecked(); |
| - CHECK(!try_catch.HasCaught()); |
| - CHECK(value->IsObject()); |
| + { |
| + Local<Value> value = CompileRun("new obj4(proxy)"); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(value->IsProxy()); |
| + CHECK(value->SameValue(proxy)); |
| + |
| + Local<Value> args[] = {proxy}; |
| + value = instance1->CallAsConstructor(context.local(), 1, args) |
| + .ToLocalChecked(); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(value->SameValue(proxy)); |
| + } |
| Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); |
| instance_template->SetCallAsFunctionHandler(FakeConstructorCallback); |
| Local<Object> instance2 = |
| instance_template->NewInstance(context.local()).ToLocalChecked(); |
| + CHECK(instance2->IsObject()); |
| + CHECK(instance2->IsFunction()); |
| CHECK(context->Global() |
| ->Set(context.local(), v8_str("obj5"), instance2) |
| .FromJust()); |
| CHECK(!try_catch.HasCaught()); |
| - CHECK(instance2->IsObject()); |
| - CHECK(instance2->IsFunction()); |
| - |
| - value = CompileRun("new obj5(28)"); |
| - CHECK(!try_catch.HasCaught()); |
| - CHECK(!value->IsObject()); |
| + { |
| + Local<Value> value = CompileRun("new obj5(28)"); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(!value->IsObject()); |
| + |
| + Local<Value> args[] = {v8_num(28)}; |
| + value = instance2->CallAsConstructor(context.local(), 1, args) |
| + .ToLocalChecked(); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(!value->IsObject()); |
| + } |
| - Local<Value> args2[] = {v8_num(28)}; |
| - value = instance2->CallAsConstructor(context.local(), 1, args2) |
| - .ToLocalChecked(); |
| - CHECK(!try_catch.HasCaught()); |
| - CHECK(!value->IsObject()); |
| + { |
| + Local<Value> value = CompileRun("new obj5(proxy)"); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(value->IsProxy()); |
| + CHECK(value->SameValue(proxy)); |
| + |
| + Local<Value> args[] = {proxy}; |
| + value = instance2->CallAsConstructor(context.local(), 1, args) |
| + .ToLocalChecked(); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(value->SameValue(proxy)); |
| + } |
| } |
| } |
| @@ -11856,7 +11969,7 @@ static void InterceptorCallICFastApi( |
| reinterpret_cast<int*>(v8::External::Cast(*info.Data())->Value()); |
| ++(*call_count); |
| if ((*call_count) % 20 == 0) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } |
| } |
| @@ -11913,7 +12026,7 @@ static void GenerateSomeGarbage() { |
| void DirectApiCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| static int count = 0; |
| if (count++ % 3 == 0) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| // This should move the stub |
| GenerateSomeGarbage(); // This should ensure the old stub memory is flushed |
| } |
| @@ -11983,7 +12096,7 @@ static int p_getter_count_3; |
| static Local<Value> DoDirectGetter() { |
| if (++p_getter_count_3 % 3 == 0) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| GenerateSomeGarbage(); |
| } |
| return v8_str("Direct Getter Result"); |
| @@ -13692,7 +13805,7 @@ static void CheckSurvivingGlobalObjectsCount(int expected) { |
| // the first garbage collection but some of the maps have already |
| // been marked at that point. Therefore some of the maps are not |
| // collected until the second garbage collection. |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CcTest::CollectAllGarbage(i::Heap::kMakeHeapIterableMask); |
| int count = GetGlobalObjectsCount(); |
| CHECK_EQ(expected, count); |
| @@ -13834,7 +13947,7 @@ THREADED_TEST(NewPersistentHandleFromWeakCallback) { |
| handle1.SetWeak(&handle1, NewPersistentHandleCallback1, |
| v8::WeakCallbackType::kParameter); |
| handle2.Reset(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } |
| @@ -13844,7 +13957,7 @@ v8::Persistent<v8::Object> to_be_disposed; |
| void DisposeAndForceGcCallback2( |
| const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) { |
| to_be_disposed.Reset(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } |
| @@ -13868,7 +13981,7 @@ THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { |
| handle1.SetWeak(&handle1, DisposeAndForceGcCallback1, |
| v8::WeakCallbackType::kParameter); |
| to_be_disposed.Reset(isolate, handle2); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| } |
| void DisposingCallback( |
| @@ -13906,7 +14019,7 @@ THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { |
| v8::WeakCallbackType::kParameter); |
| handle3.SetWeak(&handle3, HandleCreatingCallback1, |
| v8::WeakCallbackType::kParameter); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| EmptyMessageQueues(isolate); |
| } |
| @@ -14246,7 +14359,7 @@ void SetFunctionEntryHookTest::RunTest() { |
| CHECK_EQ(2, CountInvocations(NULL, "bar")); |
| CHECK_EQ(200, CountInvocations("bar", "foo")); |
| CHECK_EQ(200, CountInvocations(NULL, "foo")); |
| - } else if (i::FLAG_crankshaft) { |
| + } else if (i::FLAG_opt) { |
| // For ignition we don't see the actual functions being called, instead |
| // we see the InterpreterEntryTrampoline at least 102 times |
| // (100 unoptimized calls to foo, and 2 calls to bar). |
| @@ -16137,7 +16250,7 @@ static void ObjectWithExternalArrayTestHelper(Local<Context> context, |
| "}" |
| "sum;"); |
| // Force GC to trigger verification. |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(28, result->Int32Value(context).FromJust()); |
| // Make sure out-of-range loads do not throw. |
| @@ -16353,12 +16466,12 @@ static void FixedTypedArrayTestHelper(i::ExternalArrayType array_type, |
| CHECK_EQ(FixedTypedArrayClass::kInstanceType, |
| fixed_array->map()->instance_type()); |
| CHECK_EQ(kElementCount, fixed_array->length()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| for (int i = 0; i < kElementCount; i++) { |
| fixed_array->set(i, static_cast<ElementType>(i)); |
| } |
| // Force GC to trigger verification. |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| for (int i = 0; i < kElementCount; i++) { |
| CHECK_EQ(static_cast<int64_t>(static_cast<ElementType>(i)), |
| static_cast<int64_t>(fixed_array->get_scalar(i))); |
| @@ -16550,8 +16663,8 @@ THREADED_TEST(SkipArrayBufferBackingStoreDuringGC) { |
| // Should not crash |
| CcTest::CollectGarbage(i::NEW_SPACE); // in survivor space now |
| CcTest::CollectGarbage(i::NEW_SPACE); // in old gen now |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| + CcTest::CollectAllGarbage(); |
| // Should not move the pointer |
| CHECK_EQ(ab->GetContents().Data(), store_ptr); |
| @@ -16814,14 +16927,11 @@ void AnalyzeStackInNativeCode(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| CHECK_EQ(4, stackTrace->GetFrameCount()); |
| checkStackFrame(origin, "bar", 2, 10, false, false, |
| stackTrace->GetFrame(0)); |
| - checkStackFrame(origin, "foo", 6, 3, false, false, |
| - stackTrace->GetFrame(1)); |
| + checkStackFrame(origin, "foo", 6, 3, false, true, stackTrace->GetFrame(1)); |
| // This is the source string inside the eval which has the call to foo. |
| - checkStackFrame(NULL, "", 1, 1, false, false, stackTrace->GetFrame(2)); |
| + checkStackFrame(NULL, "", 1, 1, true, false, stackTrace->GetFrame(2)); |
| // The last frame is an anonymous function which has the initial eval call. |
| checkStackFrame(origin, "", 8, 7, false, false, stackTrace->GetFrame(3)); |
| - |
| - CHECK(stackTrace->AsArray()->IsArray()); |
| } else if (testGroup == kDetailedTest) { |
| v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
| args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
| @@ -16835,8 +16945,6 @@ void AnalyzeStackInNativeCode(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2)); |
| // The last frame is an anonymous function which has the initial eval call. |
| checkStackFrame(origin, "", 10, 1, false, false, stackTrace->GetFrame(3)); |
| - |
| - CHECK(stackTrace->AsArray()->IsArray()); |
| } else if (testGroup == kFunctionName) { |
| v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
| args.GetIsolate(), 5, v8::StackTrace::kOverview); |
| @@ -17085,7 +17193,7 @@ TEST(ErrorLevelWarning) { |
| i::Handle<i::JSMessageObject> message = |
| i::MessageHandler::MakeMessageObject( |
| i_isolate, i::MessageTemplate::kAsmJsInvalid, &location, msg, |
| - i::Handle<i::JSArray>::null()); |
| + i::Handle<i::FixedArray>::null()); |
| message->set_error_level(levels[i]); |
| expected_error_level = levels[i]; |
| i::MessageHandler::ReportMessage(i_isolate, &location, message); |
| @@ -18807,7 +18915,7 @@ TEST(Regress528) { |
| other_context->Enter(); |
| CompileRun(source_simple); |
| other_context->Exit(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| if (GetGlobalObjectsCount() == 1) break; |
| } |
| CHECK_GE(2, gc_count); |
| @@ -18829,7 +18937,7 @@ TEST(Regress528) { |
| other_context->Enter(); |
| CompileRun(source_eval); |
| other_context->Exit(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| if (GetGlobalObjectsCount() == 1) break; |
| } |
| CHECK_GE(2, gc_count); |
| @@ -18856,7 +18964,7 @@ TEST(Regress528) { |
| other_context->Enter(); |
| CompileRun(source_exception); |
| other_context->Exit(); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| if (GetGlobalObjectsCount() == 1) break; |
| } |
| CHECK_GE(2, gc_count); |
| @@ -19485,26 +19593,26 @@ TEST(GCCallbacksOld) { |
| context->GetIsolate()->AddGCEpilogueCallback(EpilogueCallback); |
| CHECK_EQ(0, prologue_call_count); |
| CHECK_EQ(0, epilogue_call_count); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(1, prologue_call_count); |
| CHECK_EQ(1, epilogue_call_count); |
| context->GetIsolate()->AddGCPrologueCallback(PrologueCallbackSecond); |
| context->GetIsolate()->AddGCEpilogueCallback(EpilogueCallbackSecond); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(2, prologue_call_count); |
| CHECK_EQ(2, epilogue_call_count); |
| CHECK_EQ(1, prologue_call_count_second); |
| CHECK_EQ(1, epilogue_call_count_second); |
| context->GetIsolate()->RemoveGCPrologueCallback(PrologueCallback); |
| context->GetIsolate()->RemoveGCEpilogueCallback(EpilogueCallback); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(2, prologue_call_count); |
| CHECK_EQ(2, epilogue_call_count); |
| CHECK_EQ(2, prologue_call_count_second); |
| CHECK_EQ(2, epilogue_call_count_second); |
| context->GetIsolate()->RemoveGCPrologueCallback(PrologueCallbackSecond); |
| context->GetIsolate()->RemoveGCEpilogueCallback(EpilogueCallbackSecond); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(2, prologue_call_count); |
| CHECK_EQ(2, epilogue_call_count); |
| CHECK_EQ(2, prologue_call_count_second); |
| @@ -19520,26 +19628,26 @@ TEST(GCCallbacks) { |
| isolate->AddGCEpilogueCallback(EpilogueCallback); |
| CHECK_EQ(0, prologue_call_count); |
| CHECK_EQ(0, epilogue_call_count); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(1, prologue_call_count); |
| CHECK_EQ(1, epilogue_call_count); |
| isolate->AddGCPrologueCallback(PrologueCallbackSecond); |
| isolate->AddGCEpilogueCallback(EpilogueCallbackSecond); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(2, prologue_call_count); |
| CHECK_EQ(2, epilogue_call_count); |
| CHECK_EQ(1, prologue_call_count_second); |
| CHECK_EQ(1, epilogue_call_count_second); |
| isolate->RemoveGCPrologueCallback(PrologueCallback); |
| isolate->RemoveGCEpilogueCallback(EpilogueCallback); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(2, prologue_call_count); |
| CHECK_EQ(2, epilogue_call_count); |
| CHECK_EQ(2, prologue_call_count_second); |
| CHECK_EQ(2, epilogue_call_count_second); |
| isolate->RemoveGCPrologueCallback(PrologueCallbackSecond); |
| isolate->RemoveGCEpilogueCallback(EpilogueCallbackSecond); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CHECK_EQ(2, prologue_call_count); |
| CHECK_EQ(2, epilogue_call_count); |
| CHECK_EQ(2, prologue_call_count_second); |
| @@ -19727,7 +19835,7 @@ TEST(ContainsOnlyOneByte) { |
| void FailedAccessCheckCallbackGC(Local<v8::Object> target, |
| v8::AccessType type, |
| Local<v8::Value> data) { |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| CcTest::isolate()->ThrowException( |
| v8::Exception::Error(v8_str("cross context"))); |
| } |
| @@ -20350,7 +20458,7 @@ TEST(DontDeleteCellLoadIC) { |
| "})()", |
| "ReferenceError: cell is not defined"); |
| CompileRun("cell = \"new_second\";"); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| ExpectString("readCell()", "new_second"); |
| ExpectString("readCell()", "new_second"); |
| } |
| @@ -20420,8 +20528,8 @@ TEST(PersistentHandleInNewSpaceVisitor) { |
| object1.SetWrapperClassId(42); |
| CHECK_EQ(42, object1.WrapperClassId()); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
| + CcTest::CollectAllGarbage(); |
| + CcTest::CollectAllGarbage(); |
| v8::Persistent<v8::Object> object2(isolate, v8::Object::New(isolate)); |
| CHECK_EQ(0, object2.WrapperClassId()); |
| @@ -21893,7 +22001,7 @@ void TestStubCache(bool primary) { |
| } else { |
| FLAG_test_secondary_stub_cache = true; |
| } |
| - FLAG_crankshaft = false; |
| + FLAG_opt = false; |
| v8::Isolate::CreateParams create_params; |
| create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| @@ -22785,10 +22893,12 @@ TEST(AccessCheckThrows) { |
| CheckCorrectThrow("%GetProperty(other, 'x')"); |
| CheckCorrectThrow("%SetProperty(other, 'x', 'foo', 0)"); |
| CheckCorrectThrow("%AddNamedProperty(other, 'x', 'foo', 1)"); |
| - CheckCorrectThrow("%DeleteProperty_Sloppy(other, 'x')"); |
| - CheckCorrectThrow("%DeleteProperty_Strict(other, 'x')"); |
| - CheckCorrectThrow("%DeleteProperty_Sloppy(other, '1')"); |
| - CheckCorrectThrow("%DeleteProperty_Strict(other, '1')"); |
| + STATIC_ASSERT(i::SLOPPY == 0); |
| + STATIC_ASSERT(i::STRICT == 1); |
| + CheckCorrectThrow("%DeleteProperty(other, 'x', 0)"); // 0 == SLOPPY |
| + CheckCorrectThrow("%DeleteProperty(other, 'x', 1)"); // 1 == STRICT |
| + CheckCorrectThrow("%DeleteProperty(other, '1', 0)"); |
| + CheckCorrectThrow("%DeleteProperty(other, '1', 1)"); |
| CheckCorrectThrow("Object.prototype.hasOwnProperty.call(other, 'x')"); |
| CheckCorrectThrow("%HasProperty(other, 'x')"); |
| CheckCorrectThrow("Object.prototype.propertyIsEnumerable(other, 'x')"); |
| @@ -22810,7 +22920,7 @@ TEST(AccessCheckInIC) { |
| if (FLAG_ignition || FLAG_turbo) return; |
| FLAG_native_code_counters = true; |
| - FLAG_crankshaft = false; |
| + FLAG_opt = false; |
| v8::Isolate::CreateParams create_params; |
| create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| @@ -25492,6 +25602,17 @@ TEST(ExtrasUtilsObject) { |
| .As<v8::String>(); |
| String::Utf8Value promise_states_string(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()); |
| } |
| @@ -25890,6 +26011,78 @@ TEST(AccessCheckedToStringTag) { |
| CHECK_EQ(0, strcmp(*result_denied, "[object Object]")); |
| } |
| +TEST(TemplateIteratorPrototypeIntrinsics) { |
| + v8::Isolate* isolate = CcTest::isolate(); |
| + v8::HandleScope scope(isolate); |
| + LocalContext env; |
| + |
| + // Object templates. |
| + { |
| + Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate); |
| + object_template->SetIntrinsicDataProperty(v8_str("iter_proto"), |
| + v8::kIteratorPrototype); |
| + Local<Object> object = |
| + object_template->NewInstance(env.local()).ToLocalChecked(); |
| + CHECK(env->Global()->Set(env.local(), v8_str("obj"), object).FromJust()); |
| + ExpectTrue("obj.iter_proto === [][Symbol.iterator]().__proto__.__proto__"); |
| + } |
| + // Setting %IteratorProto% on the function object's prototype template. |
| + { |
| + Local<FunctionTemplate> func_template = v8::FunctionTemplate::New(isolate); |
| + func_template->PrototypeTemplate()->SetIntrinsicDataProperty( |
| + v8_str("iter_proto"), v8::kIteratorPrototype); |
| + Local<Function> func1 = |
| + func_template->GetFunction(env.local()).ToLocalChecked(); |
| + CHECK(env->Global()->Set(env.local(), v8_str("func1"), func1).FromJust()); |
| + Local<Function> func2 = |
| + func_template->GetFunction(env.local()).ToLocalChecked(); |
| + CHECK(env->Global()->Set(env.local(), v8_str("func2"), func2).FromJust()); |
| + ExpectTrue( |
| + "func1.prototype.iter_proto === " |
| + "[][Symbol.iterator]().__proto__.__proto__"); |
| + ExpectTrue( |
| + "func2.prototype.iter_proto === " |
| + "[][Symbol.iterator]().__proto__.__proto__"); |
| + ExpectTrue("func1.prototype.iter_proto === func2.prototype.iter_proto"); |
| + |
| + Local<Object> instance1 = func1->NewInstance(env.local()).ToLocalChecked(); |
| + CHECK(env->Global() |
| + ->Set(env.local(), v8_str("instance1"), instance1) |
| + .FromJust()); |
| + ExpectFalse("instance1.hasOwnProperty('iter_proto')"); |
| + ExpectTrue("'iter_proto' in instance1.__proto__"); |
| + ExpectTrue( |
| + "instance1.iter_proto === [][Symbol.iterator]().__proto__.__proto__"); |
| + } |
| + // Put %IteratorProto% in a function object's inheritance chain. |
| + { |
| + Local<FunctionTemplate> parent_template = |
| + v8::FunctionTemplate::New(isolate); |
| + parent_template->RemovePrototype(); // Remove so there is no name clash. |
| + parent_template->SetIntrinsicDataProperty(v8_str("prototype"), |
| + v8::kIteratorPrototype); |
| + Local<FunctionTemplate> func_template = v8::FunctionTemplate::New(isolate); |
| + func_template->Inherit(parent_template); |
| + |
| + Local<Function> func = |
| + func_template->GetFunction(env.local()).ToLocalChecked(); |
| + CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust()); |
| + ExpectTrue( |
| + "func.prototype.__proto__ === " |
| + "[][Symbol.iterator]().__proto__.__proto__"); |
| + |
| + Local<Object> func_instance = |
| + func->NewInstance(env.local()).ToLocalChecked(); |
| + CHECK(env->Global() |
| + ->Set(env.local(), v8_str("instance"), func_instance) |
| + .FromJust()); |
| + ExpectTrue( |
| + "instance.__proto__.__proto__ === " |
| + "[][Symbol.iterator]().__proto__.__proto__"); |
| + ExpectTrue("instance.__proto__.__proto__.__proto__ === Object.prototype"); |
| + } |
| +} |
| + |
| TEST(ObjectTemplateArrayProtoIntrinsics) { |
| v8::Isolate* isolate = CcTest::isolate(); |
| v8::HandleScope scope(isolate); |
| @@ -26393,3 +26586,84 @@ TEST(DeterministicRandomNumberGeneration) { |
| v8::internal::FLAG_random_seed = previous_seed; |
| } |
| + |
| +UNINITIALIZED_TEST(AllowAtomicsWait) { |
| + using namespace i; |
| + v8::Isolate::CreateParams create_params; |
| + create_params.allow_atomics_wait = false; |
| + create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| + v8::Isolate* isolate = v8::Isolate::New(create_params); |
| + Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate); |
| + { |
| + CHECK_EQ(false, i_isolate->allow_atomics_wait()); |
| + isolate->SetAllowAtomicsWait(true); |
| + CHECK_EQ(true, i_isolate->allow_atomics_wait()); |
| + } |
| + isolate->Dispose(); |
| +} |
| + |
| +enum ContextId { EnteredContext, CurrentContext }; |
| + |
| +void CheckContexts(v8::Isolate* isolate) { |
| + CHECK_EQ(CurrentContext, isolate->GetCurrentContext() |
| + ->GetEmbedderData(1) |
| + .As<v8::Integer>() |
| + ->Value()); |
| + CHECK_EQ(EnteredContext, isolate->GetEnteredContext() |
| + ->GetEmbedderData(1) |
| + .As<v8::Integer>() |
| + ->Value()); |
| +} |
| + |
| +void ContextCheckGetter(Local<String> name, |
| + const v8::PropertyCallbackInfo<v8::Value>& info) { |
| + CheckContexts(info.GetIsolate()); |
| + info.GetReturnValue().Set(true); |
| +} |
| + |
| +void ContextCheckSetter(Local<String> name, Local<Value>, |
| + const v8::PropertyCallbackInfo<void>& info) { |
| + CheckContexts(info.GetIsolate()); |
| +} |
| + |
| +void ContextCheckToString(const v8::FunctionCallbackInfo<v8::Value>& info) { |
| + CheckContexts(info.GetIsolate()); |
| + info.GetReturnValue().Set(v8_str("foo")); |
| +} |
| + |
| +TEST(CorrectEnteredContext) { |
| + v8::HandleScope scope(CcTest::isolate()); |
| + |
| + LocalContext currentContext; |
| + currentContext->SetEmbedderData( |
| + 1, v8::Integer::New(currentContext->GetIsolate(), CurrentContext)); |
| + LocalContext enteredContext; |
| + enteredContext->SetEmbedderData( |
| + 1, v8::Integer::New(enteredContext->GetIsolate(), EnteredContext)); |
| + |
| + v8::Context::Scope contextScope(enteredContext.local()); |
| + |
| + v8::Local<v8::ObjectTemplate> object_template = |
| + ObjectTemplate::New(currentContext->GetIsolate()); |
| + object_template->SetAccessor(v8_str("p"), &ContextCheckGetter, |
| + &ContextCheckSetter); |
| + |
| + v8::Local<v8::Object> object = |
| + object_template->NewInstance(currentContext.local()).ToLocalChecked(); |
| + |
| + object->Get(currentContext.local(), v8_str("p")).ToLocalChecked(); |
| + object->Set(currentContext.local(), v8_str("p"), v8_int(0)).FromJust(); |
| + |
| + v8::Local<v8::Function> to_string = |
| + v8::Function::New(currentContext.local(), ContextCheckToString) |
| + .ToLocalChecked(); |
| + |
| + to_string->Call(currentContext.local(), object, 0, nullptr).ToLocalChecked(); |
| + |
| + object |
| + ->CreateDataProperty(currentContext.local(), v8_str("toString"), |
| + to_string) |
| + .FromJust(); |
| + |
| + object->ToString(currentContext.local()).ToLocalChecked(); |
| +} |