// 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_ #include "src/objects/feedback-vector.h" #include "src/objects/objects.h" #include "src/objects/shared-function-info.h" 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: explicit FeedbackVectorHelper(Handle vector) : vector_(vector) { int slot_count = vector->length(); slots_.reserve(slot_count); FeedbackMetadataIterator iter(vector->metadata()); while (iter.HasNext()) { FeedbackSlot slot = iter.Next(); slots_.push_back(slot); } } Handle vector() { return vector_; } // Returns slot identifier by numerical index. FeedbackSlot slot(int index) const { return slots_[index]; } // Returns the number of slots in the feedback vector. int slot_count() const { return static_cast(slots_.size()); } private: Handle vector_; std::vector slots_; }; template Handle NewFeedbackVector(Isolate* isolate, Spec* spec) { Handle metadata = FeedbackMetadata::New(isolate, spec); Handle shared = isolate->factory()->NewSharedFunctionInfoForBuiltin( isolate->factory()->empty_string(), Builtins::kIllegal); // 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); Handle closure_feedback_cell_array = ClosureFeedbackCellArray::New(isolate, shared); IsCompiledScope is_compiled_scope(shared->is_compiled_scope()); return FeedbackVector::New(isolate, shared, closure_feedback_cell_array, &is_compiled_scope); } template Handle NewFeedbackMetadata(Isolate* isolate, Spec* spec) { return FeedbackMetadata::New(isolate, spec); } } // namespace internal } // namespace v8 #endif