|
30 | 30 | #include <ctype.h>
|
31 | 31 |
|
32 | 32 | #include <memory>
|
| 33 | +#include <vector> |
33 | 34 |
|
34 | 35 | #include "include/v8-function.h"
|
35 | 36 | #include "include/v8-json.h"
|
@@ -4064,6 +4065,67 @@ TEST(SamplingHeapProfilerSampleDuringDeopt) {
|
4064 | 4065 | heap_profiler->StopSamplingHeapProfiler();
|
4065 | 4066 | }
|
4066 | 4067 |
|
| 4068 | +namespace { |
| 4069 | +class TestQueryObjectPredicate : public v8::QueryObjectPredicate { |
| 4070 | + public: |
| 4071 | + TestQueryObjectPredicate(v8::Local<v8::Context> context, |
| 4072 | + v8::Local<v8::Symbol> symbol) |
| 4073 | + : context_(context), symbol_(symbol) {} |
| 4074 | + |
| 4075 | + bool Filter(v8::Local<v8::Object> object) override { |
| 4076 | + return object->HasOwnProperty(context_, symbol_).FromMaybe(false); |
| 4077 | + } |
| 4078 | + |
| 4079 | + private: |
| 4080 | + v8::Local<v8::Context> context_; |
| 4081 | + v8::Local<v8::Symbol> symbol_; |
| 4082 | +}; |
| 4083 | + |
| 4084 | +class IncludeAllQueryObjectPredicate : public v8::QueryObjectPredicate { |
| 4085 | + public: |
| 4086 | + IncludeAllQueryObjectPredicate() {} |
| 4087 | + bool Filter(v8::Local<v8::Object> object) override { return true; } |
| 4088 | +}; |
| 4089 | +} // anonymous namespace |
| 4090 | + |
| 4091 | +TEST(QueryObjects) { |
| 4092 | + LocalContext env; |
| 4093 | + v8::Isolate* isolate = env->GetIsolate(); |
| 4094 | + v8::HandleScope scope(isolate); |
| 4095 | + v8::Local<v8::Context> context = env.local(); |
| 4096 | + |
| 4097 | + v8::Local<v8::Symbol> sym = |
| 4098 | + v8::Symbol::New(isolate, v8_str("query_object_test")); |
| 4099 | + context->Global()->Set(context, v8_str("test_symbol"), sym).Check(); |
| 4100 | + v8::Local<v8::Value> arr = CompileRun(R"( |
| 4101 | + const arr = []; |
| 4102 | + for (let i = 0; i < 10; ++i) { |
| 4103 | + arr.push({[test_symbol]: true}); |
| 4104 | + } |
| 4105 | + arr; |
| 4106 | + )"); |
| 4107 | + context->Global()->Set(context, v8_str("arr"), arr).Check(); |
| 4108 | + v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); |
| 4109 | + |
| 4110 | + { |
| 4111 | + TestQueryObjectPredicate predicate(context, sym); |
| 4112 | + std::vector<v8::Global<v8::Object>> out; |
| 4113 | + heap_profiler->QueryObjects(context, &predicate, &out); |
| 4114 | + |
| 4115 | + CHECK_EQ(out.size(), 10); |
| 4116 | + for (size_t i = 0; i < out.size(); ++i) { |
| 4117 | + CHECK(out[i].Get(isolate)->HasOwnProperty(context, sym).FromMaybe(false)); |
| 4118 | + } |
| 4119 | + } |
| 4120 | + |
| 4121 | + { |
| 4122 | + IncludeAllQueryObjectPredicate predicate; |
| 4123 | + std::vector<v8::Global<v8::Object>> out; |
| 4124 | + heap_profiler->QueryObjects(context, &predicate, &out); |
| 4125 | + CHECK_GE(out.size(), 10); |
| 4126 | + } |
| 4127 | +} |
| 4128 | + |
4067 | 4129 | TEST(WeakReference) {
|
4068 | 4130 | v8::Isolate* isolate = CcTest::isolate();
|
4069 | 4131 | i::Isolate* i_isolate = CcTest::i_isolate();
|
|
0 commit comments