summaryrefslogtreecommitdiff
path: root/deps/v8/test/cctest/test-api-interceptors.cc
diff options
context:
space:
mode:
authorUjjwal Sharma <usharma1998@gmail.com>2019-03-15 18:35:06 +0530
committerRefael Ackermann <refack@gmail.com>2019-03-28 16:36:18 -0400
commitf579e1194046c50f2e6bb54348d48c8e7d1a53cf (patch)
tree9125787c758358365f74f9fd9673c14f57e67870 /deps/v8/test/cctest/test-api-interceptors.cc
parent2c73868b0471fbd4038f500d076df056cbf697fe (diff)
downloadandroid-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.cc198
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>&) {}