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 : 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 178 : FeedbackMetadataIterator iter(vector->metadata());
24 587 : while (iter.HasNext()) {
25 409 : FeedbackSlot slot = iter.Next();
26 409 : slots_.push_back(slot);
27 : }
28 89 : }
29 :
30 : Handle<FeedbackVector> vector() { return vector_; }
31 :
32 : // Returns slot identifier by numerical index.
33 619 : FeedbackSlot slot(int index) const { return slots_[index]; }
34 :
35 : // Returns the number of slots in the feedback vector.
36 120 : 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 : 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 25 : return FeedbackVector::New(isolate, shared);
53 : }
54 :
55 : template <typename Spec>
56 : Handle<FeedbackMetadata> NewFeedbackMetadata(Isolate* isolate, Spec* spec) {
57 17770 : return FeedbackMetadata::New(isolate, spec);
58 : }
59 :
60 : } // namespace internal
61 : } // namespace v8
62 :
63 : #endif
|