blob: 67d3cb85cb1d9837f1ea71e72095e46a754afa2d [file] [log] [blame]
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_DEBUG_DEBUG_PROPERTY_ITERATOR_H_
#define V8_DEBUG_DEBUG_PROPERTY_ITERATOR_H_
#include "src/debug/debug-interface.h"
#include "src/execution/isolate.h"
#include "src/handles/handles.h"
#include "src/objects/prototype.h"
#include "include/v8.h"
namespace v8 {
namespace internal {
class JSReceiver;
class DebugPropertyIterator final : public debug::PropertyIterator {
public:
DebugPropertyIterator(Isolate* isolate, Handle<JSReceiver> receiver);
~DebugPropertyIterator() override = default;
bool Done() const override;
void Advance() override;
v8::Local<v8::Name> name() const override;
bool is_native_accessor() override;
bool has_native_getter() override;
bool has_native_setter() override;
v8::Maybe<v8::PropertyAttribute> attributes() override;
v8::Maybe<v8::debug::PropertyDescriptor> descriptor() override;
bool is_own() override;
bool is_array_index() override;
private:
void FillKeysForCurrentPrototypeAndStage();
bool should_move_to_next_stage() const;
void CalculateNativeAccessorFlags();
Handle<Name> raw_name() const;
Isolate* isolate_;
PrototypeIterator prototype_iterator_;
enum Stage { kExoticIndices = 0, kEnumerableStrings = 1, kAllProperties = 2 };
Stage stage_ = kExoticIndices;
size_t current_key_index_ = 0;
Handle<FixedArray> keys_;
size_t exotic_length_ = 0;
bool calculated_native_accessor_flags_ = false;
int native_accessor_flags_ = 0;
bool is_own_ = true;
DISALLOW_COPY_AND_ASSIGN(DebugPropertyIterator);
};
} // namespace internal
} // namespace v8
#endif // V8_DEBUG_DEBUG_PROPERTY_ITERATOR_H_