test-feedback-vector.h 1.97 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2015 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_TEST_FEEDBACK_VECTOR_H_
#define V8_TEST_FEEDBACK_VECTOR_H_

8
#include "src/feedback-vector.h"
9
#include "src/objects.h"
10
#include "src/objects/shared-function-info.h"
11 12 13 14 15 16 17 18

namespace v8 {
namespace internal {

// Helper class that allows to write tests in a slot size independent manner.
// Use helper.slot(X) to get X'th slot identifier.
class FeedbackVectorHelper {
 public:
19
  explicit FeedbackVectorHelper(Handle<FeedbackVector> vector)
20
      : vector_(vector) {
21
    int slot_count = vector->length();
22
    slots_.reserve(slot_count);
23
    FeedbackMetadataIterator iter(vector->metadata());
24
    while (iter.HasNext()) {
25
      FeedbackSlot slot = iter.Next();
26 27 28 29
      slots_.push_back(slot);
    }
  }

30
  Handle<FeedbackVector> vector() { return vector_; }
31 32

  // Returns slot identifier by numerical index.
33
  FeedbackSlot slot(int index) const { return slots_[index]; }
34 35 36 37 38

  // Returns the number of slots in the feedback vector.
  int slot_count() const { return static_cast<int>(slots_.size()); }

 private:
39
  Handle<FeedbackVector> vector_;
40
  std::vector<FeedbackSlot> slots_;
41 42
};

43
template <typename Spec>
44 45
Handle<FeedbackVector> NewFeedbackVector(Isolate* isolate, Spec* spec) {
  Handle<FeedbackMetadata> metadata = FeedbackMetadata::New(isolate, spec);
46 47
  Handle<SharedFunctionInfo> shared =
      isolate->factory()->NewSharedFunctionInfoForBuiltin(
48
          isolate->factory()->empty_string(), Builtins::kIllegal);
49 50 51
  // Set the raw feedback metadata to circumvent checks that we are not
  // overwriting existing metadata.
  shared->set_raw_outer_scope_info_or_feedback_metadata(*metadata);
52
  return FeedbackVector::New(isolate, shared);
53 54
}

55
template <typename Spec>
56 57
Handle<FeedbackMetadata> NewFeedbackMetadata(Isolate* isolate, Spec* spec) {
  return FeedbackMetadata::New(isolate, spec);
58
}
59

60 61 62 63
}  // namespace internal
}  // namespace v8

#endif