Line data Source code
1 : // Copyright 2015 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_TEST_FEEDBACK_VECTOR_H_
6 : #define V8_TEST_FEEDBACK_VECTOR_H_
7 :
8 : #include "src/feedback-vector.h"
9 : #include "src/objects.h"
10 : #include "src/objects/shared-function-info.h"
11 :
12 : namespace v8 {
13 : namespace internal {
14 :
15 : // Helper class that allows to write tests in a slot size independent manner.
16 : // Use helper.slot(X) to get X'th slot identifier.
17 89 : class FeedbackVectorHelper {
18 : public:
19 89 : explicit FeedbackVectorHelper(Handle<FeedbackVector> vector)
20 89 : : vector_(vector) {
21 : int slot_count = vector->length();
22 89 : slots_.reserve(slot_count);
23 : FeedbackMetadataIterator iter(vector->metadata());
24 897 : while (iter.HasNext()) {
25 404 : FeedbackSlot slot = iter.Next();
26 404 : slots_.push_back(slot);
27 : }
28 89 : }
29 :
30 : Handle<FeedbackVector> vector() { return vector_; }
31 :
32 : // Returns slot identifier by numerical index.
33 585 : FeedbackSlot slot(int index) const { return slots_[index]; }
34 :
35 : // Returns the number of slots in the feedback vector.
36 60 : int slot_count() const { return static_cast<int>(slots_.size()); }
37 :
38 : private:
39 : Handle<FeedbackVector> vector_;
40 : std::vector<FeedbackSlot> slots_;
41 : };
42 :
43 : template <typename Spec>
44 25 : Handle<FeedbackVector> NewFeedbackVector(Isolate* isolate, Spec* spec) {
45 25 : Handle<FeedbackMetadata> metadata = FeedbackMetadata::New(isolate, spec);
46 : Handle<SharedFunctionInfo> shared =
47 25 : isolate->factory()->NewSharedFunctionInfoForBuiltin(
48 25 : isolate->factory()->empty_string(), Builtins::kIllegal);
49 : // Set the raw feedback metadata to circumvent checks that we are not
50 : // overwriting existing metadata.
51 50 : shared->set_raw_outer_scope_info_or_feedback_metadata(*metadata);
52 : Handle<ClosureFeedbackCellArray> closure_feedback_cell_array =
53 25 : ClosureFeedbackCellArray::New(isolate, shared);
54 25 : return FeedbackVector::New(isolate, shared, closure_feedback_cell_array);
55 : }
56 :
57 : template <typename Spec>
58 : Handle<FeedbackMetadata> NewFeedbackMetadata(Isolate* isolate, Spec* spec) {
59 17790 : return FeedbackMetadata::New(isolate, spec);
60 : }
61 :
62 : } // namespace internal
63 : } // namespace v8
64 :
65 : #endif
|