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) { \ |