// Copyright 2022 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_COMMON_NODEOBSERVER_TESTER_H_ #define V8_COMMON_NODEOBSERVER_TESTER_H_ #include "src/compiler/node-observer.h" #include "src/compiler/simplified-operator.h" #include "src/objects/type-hints.h" namespace v8 { namespace internal { namespace compiler { // Helpers to test TurboFan compilation using the %ObserveNode intrinsic. struct ObserveNodeScope { public: ObserveNodeScope(Isolate* isolate, NodeObserver* node_observer) : isolate_(isolate) { DCHECK_NOT_NULL(isolate_); DCHECK_NULL(isolate_->node_observer()); isolate_->set_node_observer(node_observer); } ~ObserveNodeScope() { DCHECK_NOT_NULL(isolate_->node_observer()); // Checks that the code wrapped by %ObserveNode() was actually compiled in // the test. CHECK(isolate_->node_observer()->has_observed_changes()); isolate_->set_node_observer(nullptr); } private: Isolate* isolate_; }; class CreationObserver : public NodeObserver { public: explicit CreationObserver(std::function handler) : handler_(handler) { DCHECK(handler_); } Observation OnNodeCreated(const Node* node) override { handler_(node); return Observation::kStop; } private: std::function handler_; }; class ModificationObserver : public NodeObserver { public: explicit ModificationObserver( std::function on_created_handler, std::function on_changed_handler) : on_created_handler_(on_created_handler), on_changed_handler_(on_changed_handler) { DCHECK(on_created_handler_); DCHECK(on_changed_handler_); } Observation OnNodeCreated(const Node* node) override { on_created_handler_(node); return Observation::kContinue; } Observation OnNodeChanged(const char* reducer_name, const Node* node, const ObservableNodeState& old_state) override { return on_changed_handler_(node, old_state); } private: std::function on_created_handler_; std::function on_changed_handler_; }; } // namespace compiler } // namespace internal } // namespace v8 #endif // V8_COMMON_NODEOBSERVER_TESTER_H_