Chromium Code Reviews| Index: test/unittests/compiler/node-test-utils.cc |
| diff --git a/test/unittests/compiler/node-test-utils.cc b/test/unittests/compiler/node-test-utils.cc |
| index bfb9c06960c0424db611e33a32217dbd96882af4..8de2c0e8a1b79f1568d91b3d8fe85c0f6b0df423 100644 |
| --- a/test/unittests/compiler/node-test-utils.cc |
| +++ b/test/unittests/compiler/node-test-utils.cc |
| @@ -1404,6 +1404,7 @@ class IsUnopMatcher final : public NodeMatcher { |
| const Matcher<Node*> input_matcher_; |
| }; |
| + |
| class IsParameterMatcher final : public NodeMatcher { |
| public: |
| explicit IsParameterMatcher(const Matcher<int>& index_matcher) |
| @@ -1425,6 +1426,113 @@ class IsParameterMatcher final : public NodeMatcher { |
| const Matcher<int> index_matcher_; |
| }; |
| + |
| +// TODO(mythria): Check if we can use the same matcher for Load and Store |
| +class IsNamedLoadMatcher final : public NodeMatcher { |
| + public: |
| + IsNamedLoadMatcher(IrOpcode::Value opcode, |
|
rmcilroy
2015/11/09 15:23:01
don't pass the opcode to this constructor, just us
mythria
2015/11/10 09:55:35
Done.
|
| + const Matcher<NamedAccess>& named_access_matcher, |
| + const Matcher<Node*>& object_value_matcher, |
| + const Matcher<Node*>& feedback_vector_matcher, |
| + const Matcher<Node*>& effect_matcher, |
| + const Matcher<Node*>& control_matcher) |
| + : NodeMatcher(opcode), |
| + named_access_matcher_(named_access_matcher), |
| + object_value_matcher_(object_value_matcher), |
| + feedback_vector_matcher_(feedback_vector_matcher), |
| + effect_matcher_(effect_matcher), |
| + control_matcher_(control_matcher) {} |
| + |
| + void DescribeTo(std::ostream* os) const final { |
| + NodeMatcher::DescribeTo(os); |
| + *os << " whose object ("; |
| + object_value_matcher_.DescribeTo(os); |
| + *os << ") feedback vector ("; |
|
rmcilroy
2015/11/09 15:23:01
/s/)/),/
mythria
2015/11/10 09:55:35
Done.
|
| + feedback_vector_matcher_.DescribeTo(os); |
| + *os << "), effect ("; |
| + effect_matcher_.DescribeTo(os); |
| + *os << ") and control ("; |
| + control_matcher_.DescribeTo(os); |
| + *os << ")"; |
| + } |
| + |
| + bool MatchAndExplain(Node* node, MatchResultListener* listener) const final { |
| + if (!NodeMatcher::MatchAndExplain(node, listener) || |
| + !PrintMatchAndExplain(OpParameter<const NamedAccess>(node), |
| + "descriptor", named_access_matcher_, listener)) { |
| + return false; |
| + } |
| + std::ostringstream ost; |
| + ost << "Object "; |
| + if (!PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), ost.str(), |
| + object_value_matcher_, listener)) { |
| + return false; |
| + } |
| + ost.clear(); |
| + ost << "FeedbackVector "; |
| + if (!PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), ost.str(), |
| + feedback_vector_matcher_, listener)) { |
| + return false; |
| + } |
|
rmcilroy
2015/11/09 15:23:01
Please use the same pattern as the other matchers
mythria
2015/11/10 09:55:36
Done.
|
| + return (PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", |
| + effect_matcher_, listener) && |
| + PrintMatchAndExplain(NodeProperties::GetControlInput(node), |
| + "control", control_matcher_, listener)); |
| + } |
| + |
| + private: |
| + const Matcher<NamedAccess> named_access_matcher_; |
| + const Matcher<Node*> object_value_matcher_; |
| + const Matcher<Node*> feedback_vector_matcher_; |
| + const Matcher<Node*> effect_matcher_; |
| + const Matcher<Node*> control_matcher_; |
| +}; |
| + |
| + |
| +class IsNamedAccessMatcher final : public MatcherInterface<NamedAccess> { |
|
rmcilroy
2015/11/09 15:23:01
As discussed, remove this.
mythria
2015/11/10 09:55:35
Done.
|
| + public: |
| + IsNamedAccessMatcher(LanguageMode language_mode, const Handle<Name>& name, |
| + const int slot_id) |
| + : language_mode_(language_mode), name_(name), slot_id_(slot_id) {} |
| + |
| + void DescribeTo(std::ostream* os) const final { |
| + *os << " NamedAccess with language_mode ("; |
| + *os << language_mode_; |
| + *os << ") name ("; |
| + *os << name_; |
| + *os << ") slot ("; |
| + *os << slot_id_; |
| + *os << ")"; |
| + } |
| + |
| + bool MatchAndExplain(NamedAccess node, |
| + MatchResultListener* listener) const final { |
| + if (node.language_mode() != language_mode_) { |
| + *listener << "whose languagemode is " << node.language_mode() |
| + << " but should have been " << language_mode_; |
| + return false; |
| + } |
| + if (!name_->StrictEquals(*node.name())) { |
| + *listener << "whose name is " << node.name() << " but should have been " |
| + << name_; |
| + return false; |
| + } |
| + if (node.feedback().slot().ToInt() != slot_id_) { |
| + *listener << "whose slot is " << node.feedback().slot().ToInt() |
| + << " but should have been " << slot_id_; |
| + return false; |
| + } |
| + // TODO(mythria): Check if Handle<TypeFeedbackVector> |
| + // (node.feedback().vector()) is equal to expected value |
| + return true; |
| + } |
| + |
| + private: |
| + const LanguageMode language_mode_; |
| + const Handle<Name> name_; |
| + const int slot_id_; |
| +}; |
| + |
| } // namespace |
| @@ -1998,6 +2106,24 @@ Matcher<Node*> IsLoadFramePointer() { |
| } |
| +Matcher<Node*> IsNamedLoad(const Matcher<NamedAccess>& node_access_matcher, |
|
rmcilroy
2015/11/09 15:23:01
IsJSLoadNamed (Follow the name of the IrOpcode)
mythria
2015/11/10 09:55:35
Done.
|
| + const Matcher<Node*>& object_value_matcher, |
| + const Matcher<Node*>& feedback_vector_matcher, |
| + const Matcher<Node*>& effect_matcher, |
| + const Matcher<Node*>& control_matcher) { |
| + return MakeMatcher(new IsNamedLoadMatcher( |
| + IrOpcode::kJSLoadNamed, node_access_matcher, object_value_matcher, |
| + feedback_vector_matcher, effect_matcher, control_matcher)); |
| +} |
| + |
| + |
| +Matcher<NamedAccess> IsNamedAccess(LanguageMode language_mode, |
|
rmcilroy
2015/11/09 15:23:00
As discussed offline, let's not add a new NamedAcc
mythria
2015/11/10 09:55:36
As discussed, I pass Handle<Name> instead of match
|
| + const Handle<Name>& name, |
| + const int slot_id) { |
| + return MakeMatcher(new IsNamedAccessMatcher(language_mode, name, slot_id)); |
| +} |
| + |
| + |
| #define IS_BINOP_MATCHER(Name) \ |
| Matcher<Node*> Is##Name(const Matcher<Node*>& lhs_matcher, \ |
| const Matcher<Node*>& rhs_matcher) { \ |