[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:
Mike Stanton 2018-01-31 15:29:45 +01:00 committed by Commit Bot
parent b5835ced4e
commit 9f1c497344
4 changed files with 37 additions and 94 deletions

View File

@ -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

View File

@ -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);

View File

@ -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.

View File

@ -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;