diff options
author | Ujjwal Sharma <usharma1998@gmail.com> | 2019-03-15 18:35:06 +0530 |
---|---|---|
committer | Refael Ackermann <refack@gmail.com> | 2019-03-28 16:36:18 -0400 |
commit | f579e1194046c50f2e6bb54348d48c8e7d1a53cf (patch) | |
tree | 9125787c758358365f74f9fd9673c14f57e67870 /deps/v8/test/cctest/test-api-interceptors.cc | |
parent | 2c73868b0471fbd4038f500d076df056cbf697fe (diff) | |
download | android-node-v8-f579e1194046c50f2e6bb54348d48c8e7d1a53cf.tar.gz android-node-v8-f579e1194046c50f2e6bb54348d48c8e7d1a53cf.tar.bz2 android-node-v8-f579e1194046c50f2e6bb54348d48c8e7d1a53cf.zip |
deps: update V8 to 7.4.288.13
PR-URL: https://github.com/nodejs/node/pull/26685
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Reviewed-By: Refael Ackermann <refack@gmail.com>
Diffstat (limited to 'deps/v8/test/cctest/test-api-interceptors.cc')
-rw-r--r-- | deps/v8/test/cctest/test-api-interceptors.cc | 198 |
1 files changed, 193 insertions, 5 deletions
diff --git a/deps/v8/test/cctest/test-api-interceptors.cc b/deps/v8/test/cctest/test-api-interceptors.cc index 2ca473dea7..41678032af 100644 --- a/deps/v8/test/cctest/test-api-interceptors.cc +++ b/deps/v8/test/cctest/test-api-interceptors.cc @@ -470,6 +470,9 @@ THREADED_TEST(QueryInterceptor) { v8_compile("Object.isFrozen('obj.x');")->Run(env.local()).ToLocalChecked(); CHECK_EQ(8, query_counter_int); + + v8_compile("'x' in obj;")->Run(env.local()).ToLocalChecked(); + CHECK_EQ(9, query_counter_int); } namespace { @@ -874,15 +877,14 @@ THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { CHECK(!value->BooleanValue(isolate)); } - -static void CheckInterceptorLoadIC( - v8::GenericNamedPropertyGetterCallback getter, const char* source, - int expected) { +static void CheckInterceptorIC(v8::GenericNamedPropertyGetterCallback getter, + v8::GenericNamedPropertyQueryCallback query, + const char* source, int expected) { v8::Isolate* isolate = CcTest::isolate(); v8::HandleScope scope(isolate); v8::Local<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); templ->SetHandler(v8::NamedPropertyHandlerConfiguration( - getter, nullptr, nullptr, nullptr, nullptr, v8_str("data"))); + getter, nullptr, query, nullptr, nullptr, v8_str("data"))); LocalContext context; context->Global() ->Set(context.local(), v8_str("o"), @@ -892,6 +894,11 @@ static void CheckInterceptorLoadIC( CHECK_EQ(expected, value->Int32Value(context.local()).FromJust()); } +static void CheckInterceptorLoadIC( + v8::GenericNamedPropertyGetterCallback getter, const char* source, + int expected) { + CheckInterceptorIC(getter, nullptr, source, expected); +} static void InterceptorLoadICGetter( Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { @@ -1432,6 +1439,92 @@ THREADED_TEST(InterceptorReturningZero) { 0); } +namespace { + +template <typename TKey, v8::internal::PropertyAttributes attribute> +void HasICQuery(TKey name, const v8::PropertyCallbackInfo<v8::Integer>& info) { + ApiTestFuzzer::Fuzz(); + v8::Isolate* isolate = CcTest::isolate(); + CHECK_EQ(isolate, info.GetIsolate()); + info.GetReturnValue().Set(v8::Integer::New(isolate, attribute)); +} + +template <typename TKey> +void HasICQueryToggle(TKey name, + const v8::PropertyCallbackInfo<v8::Integer>& info) { + ApiTestFuzzer::Fuzz(); + static bool toggle = false; + toggle = !toggle; + v8::Isolate* isolate = CcTest::isolate(); + CHECK_EQ(isolate, info.GetIsolate()); + info.GetReturnValue().Set(v8::Integer::New( + isolate, toggle ? v8::internal::ABSENT : v8::internal::NONE)); +} + +int named_query_counter = 0; +void NamedQueryCallback(Local<Name> name, + const v8::PropertyCallbackInfo<v8::Integer>& info) { + named_query_counter++; +} + +} // namespace + +THREADED_TEST(InterceptorHasIC) { + named_query_counter = 0; + CheckInterceptorIC(nullptr, NamedQueryCallback, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " 'x' in o;" + "}", + 0); + CHECK_EQ(1000, named_query_counter); +} + +THREADED_TEST(InterceptorHasICQueryAbsent) { + CheckInterceptorIC(nullptr, HasICQuery<Local<Name>, v8::internal::ABSENT>, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if ('x' in o) ++result;" + "}", + 0); +} + +THREADED_TEST(InterceptorHasICQueryNone) { + CheckInterceptorIC(nullptr, HasICQuery<Local<Name>, v8::internal::NONE>, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if ('x' in o) ++result;" + "}", + 1000); +} + +THREADED_TEST(InterceptorHasICGetter) { + CheckInterceptorIC(InterceptorLoadICGetter, nullptr, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if ('x' in o) ++result;" + "}", + 1000); +} + +THREADED_TEST(InterceptorHasICQueryGetter) { + CheckInterceptorIC(InterceptorLoadICGetter, + HasICQuery<Local<Name>, v8::internal::ABSENT>, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if ('x' in o) ++result;" + "}", + 0); +} + +THREADED_TEST(InterceptorHasICQueryToggle) { + CheckInterceptorIC(InterceptorLoadICGetter, HasICQueryToggle<Local<Name>>, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if ('x' in o) ++result;" + "}", + 500); +} static void InterceptorStoreICSetter( Local<Name> key, Local<Value> value, @@ -3273,6 +3366,101 @@ THREADED_TEST(IndexedInterceptorOnProto) { ExpectString(code, "PASSED"); } +namespace { + +void CheckIndexedInterceptorHasIC(v8::IndexedPropertyGetterCallback getter, + v8::IndexedPropertyQueryCallback query, + const char* source, int expected) { + v8::Isolate* isolate = CcTest::isolate(); + v8::HandleScope scope(isolate); + v8::Local<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); + templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( + getter, nullptr, query, nullptr, nullptr, v8_str("data"))); + LocalContext context; + context->Global() + ->Set(context.local(), v8_str("o"), + templ->NewInstance(context.local()).ToLocalChecked()) + .FromJust(); + v8::Local<Value> value = CompileRun(source); + CHECK_EQ(expected, value->Int32Value(context.local()).FromJust()); +} + +int indexed_query_counter = 0; +void IndexedQueryCallback(uint32_t index, + const v8::PropertyCallbackInfo<v8::Integer>& info) { + indexed_query_counter++; +} + +void IndexHasICQueryAbsent(uint32_t index, + const v8::PropertyCallbackInfo<v8::Integer>& info) { + ApiTestFuzzer::Fuzz(); + v8::Isolate* isolate = CcTest::isolate(); + CHECK_EQ(isolate, info.GetIsolate()); + info.GetReturnValue().Set(v8::Integer::New(isolate, v8::internal::ABSENT)); +} + +} // namespace + +THREADED_TEST(IndexedInterceptorHasIC) { + indexed_query_counter = 0; + CheckIndexedInterceptorHasIC(nullptr, IndexedQueryCallback, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " i in o;" + "}", + 0); + CHECK_EQ(1000, indexed_query_counter); +} + +THREADED_TEST(IndexedInterceptorHasICQueryAbsent) { + CheckIndexedInterceptorHasIC(nullptr, + // HasICQuery<uint32_t, v8::internal::ABSENT>, + IndexHasICQueryAbsent, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if (i in o) ++result;" + "}", + 0); +} + +THREADED_TEST(IndexedInterceptorHasICQueryNone) { + CheckIndexedInterceptorHasIC(nullptr, + HasICQuery<uint32_t, v8::internal::NONE>, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if (i in o) ++result;" + "}", + 1000); +} + +THREADED_TEST(IndexedInterceptorHasICGetter) { + CheckIndexedInterceptorHasIC(IdentityIndexedPropertyGetter, nullptr, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if (i in o) ++result;" + "}", + 1000); +} + +THREADED_TEST(IndexedInterceptorHasICQueryGetter) { + CheckIndexedInterceptorHasIC(IdentityIndexedPropertyGetter, + HasICQuery<uint32_t, v8::internal::ABSENT>, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if (i in o) ++result;" + "}", + 0); +} + +THREADED_TEST(IndexedInterceptorHasICQueryToggle) { + CheckIndexedInterceptorHasIC(IdentityIndexedPropertyGetter, + HasICQueryToggle<uint32_t>, + "var result = 0;" + "for (var i = 0; i < 1000; i++) {" + " if (i in o) ++result;" + "}", + 500); +} static void NoBlockGetterX(Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>&) {} |