[FeedbackVector] Remove FeedbackVectorSpecBase
The case that required it is no longer in the tree. Change-Id: Ie4c82f2799c381a5a5f2f57e7e3255ebb69f02b6 Reviewed-on: https://chromium-review.googlesource.com/893262 Reviewed-by: Igor Sheludko <ishell@chromium.org> Commit-Queue: Michael Stanton <mvstanton@chromium.org> Cr-Commit-Position: refs/heads/master@{#51018}
This commit is contained in:
parent
b5835ced4e
commit
9f1c497344
@ -2552,9 +2552,7 @@ Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(
|
|||||||
share->set_script(*undefined_value(), SKIP_WRITE_BARRIER);
|
share->set_script(*undefined_value(), SKIP_WRITE_BARRIER);
|
||||||
share->set_debug_info(Smi::kZero, SKIP_WRITE_BARRIER);
|
share->set_debug_info(Smi::kZero, SKIP_WRITE_BARRIER);
|
||||||
share->set_function_identifier(*undefined_value(), SKIP_WRITE_BARRIER);
|
share->set_function_identifier(*undefined_value(), SKIP_WRITE_BARRIER);
|
||||||
StaticFeedbackVectorSpec empty_spec;
|
Handle<FeedbackMetadata> feedback_metadata = FeedbackMetadata::New(isolate());
|
||||||
Handle<FeedbackMetadata> feedback_metadata =
|
|
||||||
FeedbackMetadata::New(isolate(), &empty_spec);
|
|
||||||
share->set_feedback_metadata(*feedback_metadata, SKIP_WRITE_BARRIER);
|
share->set_feedback_metadata(*feedback_metadata, SKIP_WRITE_BARRIER);
|
||||||
share->set_function_literal_id(FunctionLiteral::kIdTypeInvalid);
|
share->set_function_literal_id(FunctionLiteral::kIdTypeInvalid);
|
||||||
#if V8_SFI_HAS_UNIQUE_ID
|
#if V8_SFI_HAS_UNIQUE_ID
|
||||||
|
@ -12,35 +12,23 @@
|
|||||||
namespace v8 {
|
namespace v8 {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
template <typename Derived>
|
FeedbackSlot FeedbackVectorSpec::AddSlot(FeedbackSlotKind kind) {
|
||||||
FeedbackSlot FeedbackVectorSpecBase<Derived>::AddSlot(FeedbackSlotKind kind) {
|
int slot = slots();
|
||||||
int slot = This()->slots();
|
|
||||||
int entries_per_slot = FeedbackMetadata::GetSlotSize(kind);
|
int entries_per_slot = FeedbackMetadata::GetSlotSize(kind);
|
||||||
This()->append(kind);
|
append(kind);
|
||||||
for (int i = 1; i < entries_per_slot; i++) {
|
for (int i = 1; i < entries_per_slot; i++) {
|
||||||
This()->append(FeedbackSlotKind::kInvalid);
|
append(FeedbackSlotKind::kInvalid);
|
||||||
}
|
}
|
||||||
return FeedbackSlot(slot);
|
return FeedbackSlot(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
template FeedbackSlot FeedbackVectorSpecBase<FeedbackVectorSpec>::AddSlot(
|
FeedbackSlot FeedbackVectorSpec::AddTypeProfileSlot() {
|
||||||
FeedbackSlotKind kind);
|
|
||||||
template FeedbackSlot FeedbackVectorSpecBase<StaticFeedbackVectorSpec>::AddSlot(
|
|
||||||
FeedbackSlotKind kind);
|
|
||||||
|
|
||||||
template <typename Derived>
|
|
||||||
FeedbackSlot FeedbackVectorSpecBase<Derived>::AddTypeProfileSlot() {
|
|
||||||
FeedbackSlot slot = AddSlot(FeedbackSlotKind::kTypeProfile);
|
FeedbackSlot slot = AddSlot(FeedbackSlotKind::kTypeProfile);
|
||||||
CHECK_EQ(FeedbackVectorSpec::kTypeProfileSlotIndex,
|
CHECK_EQ(FeedbackVectorSpec::kTypeProfileSlotIndex,
|
||||||
FeedbackVector::GetIndex(slot));
|
FeedbackVector::GetIndex(slot));
|
||||||
return slot;
|
return slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
template FeedbackSlot
|
|
||||||
FeedbackVectorSpecBase<FeedbackVectorSpec>::AddTypeProfileSlot();
|
|
||||||
template FeedbackSlot
|
|
||||||
FeedbackVectorSpecBase<StaticFeedbackVectorSpec>::AddTypeProfileSlot();
|
|
||||||
|
|
||||||
bool FeedbackVectorSpec::HasTypeProfileSlot() const {
|
bool FeedbackVectorSpec::HasTypeProfileSlot() const {
|
||||||
FeedbackSlot slot =
|
FeedbackSlot slot =
|
||||||
FeedbackVector::ToSlot(FeedbackVectorSpec::kTypeProfileSlotIndex);
|
FeedbackVector::ToSlot(FeedbackVectorSpec::kTypeProfileSlotIndex);
|
||||||
@ -77,18 +65,12 @@ void FeedbackMetadata::SetKind(FeedbackSlot slot, FeedbackSlotKind kind) {
|
|||||||
set(index, Smi::FromInt(new_data));
|
set(index, Smi::FromInt(new_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
template Handle<FeedbackMetadata> FeedbackMetadata::New(
|
|
||||||
Isolate* isolate, const StaticFeedbackVectorSpec* spec);
|
|
||||||
template Handle<FeedbackMetadata> FeedbackMetadata::New(
|
|
||||||
Isolate* isolate, const FeedbackVectorSpec* spec);
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
template <typename Spec>
|
|
||||||
Handle<FeedbackMetadata> FeedbackMetadata::New(Isolate* isolate,
|
Handle<FeedbackMetadata> FeedbackMetadata::New(Isolate* isolate,
|
||||||
const Spec* spec) {
|
const FeedbackVectorSpec* spec) {
|
||||||
Factory* factory = isolate->factory();
|
Factory* factory = isolate->factory();
|
||||||
|
|
||||||
const int slot_count = spec->slots();
|
const int slot_count = spec == nullptr ? 0 : spec->slots();
|
||||||
const int slot_kinds_length = VectorICComputer::word_count(slot_count);
|
const int slot_kinds_length = VectorICComputer::word_count(slot_count);
|
||||||
const int length = slot_kinds_length + kReservedIndexCount;
|
const int length = slot_kinds_length + kReservedIndexCount;
|
||||||
if (length == kReservedIndexCount) {
|
if (length == kReservedIndexCount) {
|
||||||
@ -96,6 +78,7 @@ Handle<FeedbackMetadata> FeedbackMetadata::New(Isolate* isolate,
|
|||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
for (int i = 0; i < slot_count;) {
|
for (int i = 0; i < slot_count;) {
|
||||||
|
DCHECK(spec);
|
||||||
FeedbackSlotKind kind = spec->GetKind(FeedbackSlot(i));
|
FeedbackSlotKind kind = spec->GetKind(FeedbackSlot(i));
|
||||||
int entry_size = FeedbackMetadata::GetSlotSize(kind);
|
int entry_size = FeedbackMetadata::GetSlotSize(kind);
|
||||||
for (int j = 1; j < entry_size; j++) {
|
for (int j = 1; j < entry_size; j++) {
|
||||||
@ -116,6 +99,7 @@ Handle<FeedbackMetadata> FeedbackMetadata::New(Isolate* isolate,
|
|||||||
Handle<FeedbackMetadata> metadata = Handle<FeedbackMetadata>::cast(array);
|
Handle<FeedbackMetadata> metadata = Handle<FeedbackMetadata>::cast(array);
|
||||||
|
|
||||||
for (int i = 0; i < slot_count; i++) {
|
for (int i = 0; i < slot_count; i++) {
|
||||||
|
DCHECK(spec);
|
||||||
FeedbackSlot slot(i);
|
FeedbackSlot slot(i);
|
||||||
FeedbackSlotKind kind = spec->GetKind(slot);
|
FeedbackSlotKind kind = spec->GetKind(slot);
|
||||||
metadata->SetKind(slot, kind);
|
metadata->SetKind(slot, kind);
|
||||||
|
@ -300,9 +300,25 @@ class FeedbackVector : public HeapObject {
|
|||||||
DISALLOW_IMPLICIT_CONSTRUCTORS(FeedbackVector);
|
DISALLOW_IMPLICIT_CONSTRUCTORS(FeedbackVector);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Derived>
|
class V8_EXPORT_PRIVATE FeedbackVectorSpec {
|
||||||
class V8_EXPORT_PRIVATE FeedbackVectorSpecBase {
|
|
||||||
public:
|
public:
|
||||||
|
explicit FeedbackVectorSpec(Zone* zone) : slot_kinds_(zone) {
|
||||||
|
slot_kinds_.reserve(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
int slots() const { return static_cast<int>(slot_kinds_.size()); }
|
||||||
|
|
||||||
|
FeedbackSlotKind GetKind(FeedbackSlot slot) const {
|
||||||
|
return static_cast<FeedbackSlotKind>(slot_kinds_.at(slot.ToInt()));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasTypeProfileSlot() const;
|
||||||
|
|
||||||
|
// If used, the TypeProfileSlot is always added as the first slot and its
|
||||||
|
// index is constant. If other slots are added before the TypeProfileSlot,
|
||||||
|
// this number changes.
|
||||||
|
static const int kTypeProfileSlotIndex = 0;
|
||||||
|
|
||||||
FeedbackSlot AddCallICSlot() { return AddSlot(FeedbackSlotKind::kCall); }
|
FeedbackSlot AddCallICSlot() { return AddSlot(FeedbackSlotKind::kCall); }
|
||||||
|
|
||||||
FeedbackSlot AddLoadICSlot() {
|
FeedbackSlot AddLoadICSlot() {
|
||||||
@ -380,58 +396,6 @@ class V8_EXPORT_PRIVATE FeedbackVectorSpecBase {
|
|||||||
private:
|
private:
|
||||||
FeedbackSlot AddSlot(FeedbackSlotKind kind);
|
FeedbackSlot AddSlot(FeedbackSlotKind kind);
|
||||||
|
|
||||||
Derived* This() { return static_cast<Derived*>(this); }
|
|
||||||
};
|
|
||||||
|
|
||||||
class StaticFeedbackVectorSpec
|
|
||||||
: public FeedbackVectorSpecBase<StaticFeedbackVectorSpec> {
|
|
||||||
public:
|
|
||||||
StaticFeedbackVectorSpec() : slot_count_(0) {}
|
|
||||||
|
|
||||||
int slots() const { return slot_count_; }
|
|
||||||
|
|
||||||
FeedbackSlotKind GetKind(FeedbackSlot slot) const {
|
|
||||||
DCHECK(slot.ToInt() >= 0 && slot.ToInt() < slot_count_);
|
|
||||||
return kinds_[slot.ToInt()];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class FeedbackVectorSpecBase<StaticFeedbackVectorSpec>;
|
|
||||||
|
|
||||||
void append(FeedbackSlotKind kind) {
|
|
||||||
DCHECK_LT(slot_count_, kMaxLength);
|
|
||||||
kinds_[slot_count_++] = kind;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const int kMaxLength = 12;
|
|
||||||
|
|
||||||
int slot_count_;
|
|
||||||
FeedbackSlotKind kinds_[kMaxLength];
|
|
||||||
};
|
|
||||||
|
|
||||||
class V8_EXPORT_PRIVATE FeedbackVectorSpec
|
|
||||||
: public FeedbackVectorSpecBase<FeedbackVectorSpec> {
|
|
||||||
public:
|
|
||||||
explicit FeedbackVectorSpec(Zone* zone) : slot_kinds_(zone) {
|
|
||||||
slot_kinds_.reserve(16);
|
|
||||||
}
|
|
||||||
|
|
||||||
int slots() const { return static_cast<int>(slot_kinds_.size()); }
|
|
||||||
|
|
||||||
FeedbackSlotKind GetKind(FeedbackSlot slot) const {
|
|
||||||
return static_cast<FeedbackSlotKind>(slot_kinds_.at(slot.ToInt()));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HasTypeProfileSlot() const;
|
|
||||||
|
|
||||||
// If used, the TypeProfileSlot is always added as the first slot and its
|
|
||||||
// index is constant. If other slots are added before the TypeProfileSlot,
|
|
||||||
// this number changes.
|
|
||||||
static const int kTypeProfileSlotIndex = 0;
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class FeedbackVectorSpecBase<FeedbackVectorSpec>;
|
|
||||||
|
|
||||||
void append(FeedbackSlotKind kind) {
|
void append(FeedbackSlotKind kind) {
|
||||||
slot_kinds_.push_back(static_cast<unsigned char>(kind));
|
slot_kinds_.push_back(static_cast<unsigned char>(kind));
|
||||||
}
|
}
|
||||||
@ -466,8 +430,9 @@ class FeedbackMetadata : public FixedArray {
|
|||||||
// Returns slot kind for given slot.
|
// Returns slot kind for given slot.
|
||||||
FeedbackSlotKind GetKind(FeedbackSlot slot) const;
|
FeedbackSlotKind GetKind(FeedbackSlot slot) const;
|
||||||
|
|
||||||
template <typename Spec>
|
// If {spec} is null, then it is considered empty.
|
||||||
static Handle<FeedbackMetadata> New(Isolate* isolate, const Spec* spec);
|
static Handle<FeedbackMetadata> New(Isolate* isolate,
|
||||||
|
const FeedbackVectorSpec* spec = nullptr);
|
||||||
|
|
||||||
#ifdef OBJECT_PRINT
|
#ifdef OBJECT_PRINT
|
||||||
// For gdb debugging.
|
// For gdb debugging.
|
||||||
|
@ -688,20 +688,16 @@ void TransitionArray::TransitionArrayPrint(std::ostream& os) { // NOLINT
|
|||||||
os << "\n";
|
os << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
template void FeedbackVectorSpecBase<StaticFeedbackVectorSpec>::Print();
|
void FeedbackVectorSpec::Print() {
|
||||||
template void FeedbackVectorSpecBase<FeedbackVectorSpec>::Print();
|
|
||||||
|
|
||||||
template <typename Derived>
|
|
||||||
void FeedbackVectorSpecBase<Derived>::Print() {
|
|
||||||
OFStream os(stdout);
|
OFStream os(stdout);
|
||||||
|
|
||||||
FeedbackVectorSpecPrint(os);
|
FeedbackVectorSpecPrint(os);
|
||||||
|
|
||||||
os << std::flush;
|
os << std::flush;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Derived>
|
void FeedbackVectorSpec::FeedbackVectorSpecPrint(std::ostream& os) { // NOLINT
|
||||||
void FeedbackVectorSpecBase<Derived>::FeedbackVectorSpecPrint(
|
int slot_count = slots();
|
||||||
std::ostream& os) { // NOLINT
|
|
||||||
int slot_count = This()->slots();
|
|
||||||
os << " - slot_count: " << slot_count;
|
os << " - slot_count: " << slot_count;
|
||||||
if (slot_count == 0) {
|
if (slot_count == 0) {
|
||||||
os << " (empty)\n";
|
os << " (empty)\n";
|
||||||
@ -709,7 +705,7 @@ void FeedbackVectorSpecBase<Derived>::FeedbackVectorSpecPrint(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int slot = 0; slot < slot_count;) {
|
for (int slot = 0; slot < slot_count;) {
|
||||||
FeedbackSlotKind kind = This()->GetKind(FeedbackSlot(slot));
|
FeedbackSlotKind kind = GetKind(FeedbackSlot(slot));
|
||||||
int entry_size = FeedbackMetadata::GetSlotSize(kind);
|
int entry_size = FeedbackMetadata::GetSlotSize(kind);
|
||||||
DCHECK_LT(0, entry_size);
|
DCHECK_LT(0, entry_size);
|
||||||
os << "\n Slot #" << slot << " " << kind;
|
os << "\n Slot #" << slot << " " << kind;
|
||||||
|
Loading…
Reference in New Issue
Block a user