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