Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Unified Diff: test/unittests/compiler/js-operator-unittest.cc

Issue 1092353002: [strong] Disallow implicit conversions for binary arithmetic operations (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: cl feedback 5 Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/unittests/compiler/js-operator-unittest.cc
diff --git a/test/unittests/compiler/js-operator-unittest.cc b/test/unittests/compiler/js-operator-unittest.cc
index e69a99c6193c7639cbf983cfbabda16e8b8dd499..f2239e96eb814bf19731c74b542b883260a32b31 100644
--- a/test/unittests/compiler/js-operator-unittest.cc
+++ b/test/unittests/compiler/js-operator-unittest.cc
@@ -12,14 +12,18 @@ namespace v8 {
namespace internal {
namespace compiler {
-// -----------------------------------------------------------------------------
-// Shared operators.
-
namespace {
+typedef const Operator* (JSOperatorBuilder::*no_params_t) () ;
+
+typedef const Operator* (JSOperatorBuilder::*with_language_mode_t)
+ (LanguageMode language_mode) ;
+
+
+template <typename T>
struct SharedOperator {
- const Operator* (JSOperatorBuilder::*constructor)();
+ T constructor;
IrOpcode::Value opcode;
Operator::Properties properties;
int value_input_count;
@@ -32,12 +36,7 @@ struct SharedOperator {
};
-std::ostream& operator<<(std::ostream& os, const SharedOperator& sop) {
- return os << IrOpcode::Mnemonic(sop.opcode);
-}
-
-
-const SharedOperator kSharedOperators[] = {
+const SharedOperator<no_params_t> kSharedOperators[] = {
#define SHARED(Name, properties, value_input_count, frame_state_input_count, \
effect_input_count, control_input_count, value_output_count, \
effect_output_count, control_output_count) \
@@ -51,21 +50,6 @@ const SharedOperator kSharedOperators[] = {
SHARED(NotEqual, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
SHARED(StrictEqual, Operator::kPure, 2, 0, 0, 0, 1, 0, 0),
SHARED(StrictNotEqual, Operator::kPure, 2, 0, 0, 0, 1, 0, 0),
- SHARED(LessThan, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
- SHARED(GreaterThan, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
- SHARED(LessThanOrEqual, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
- SHARED(GreaterThanOrEqual, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
- SHARED(BitwiseOr, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(BitwiseXor, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(BitwiseAnd, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(ShiftLeft, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(ShiftRight, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(ShiftRightLogical, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(Add, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(Subtract, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(Multiply, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(Divide, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
- SHARED(Modulus, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
SHARED(UnaryNot, Operator::kPure, 1, 0, 0, 0, 1, 0, 0),
SHARED(ToBoolean, Operator::kPure, 1, 0, 0, 0, 1, 0, 0),
SHARED(ToNumber, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2),
@@ -85,27 +69,40 @@ const SharedOperator kSharedOperators[] = {
#undef SHARED
};
-} // namespace
-
-
-class JSSharedOperatorTest
- : public TestWithZone,
- public ::testing::WithParamInterface<SharedOperator> {};
-
-
-TEST_P(JSSharedOperatorTest, InstancesAreGloballyShared) {
- const SharedOperator& sop = GetParam();
- JSOperatorBuilder javascript1(zone());
- JSOperatorBuilder javascript2(zone());
- EXPECT_EQ((javascript1.*sop.constructor)(), (javascript2.*sop.constructor)());
-}
+const SharedOperator<with_language_mode_t>
+ kSharedOperatorsWithlanguageMode[] = {
arv (Not doing code reviews) 2015/04/24 14:14:23 strange indentation
conradw 2015/04/24 14:42:32 I guess I was slightly religious in sticking to th
+#define SHARED(Name, properties, value_input_count, frame_state_input_count, \
+ effect_input_count, control_input_count, value_output_count, \
+ effect_output_count, control_output_count) \
+ { \
+ &JSOperatorBuilder::Name, IrOpcode::kJS##Name, properties, \
+ value_input_count, frame_state_input_count, effect_input_count, \
+ control_input_count, value_output_count, effect_output_count, \
+ control_output_count \
+ }
+ SHARED(LessThan, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
+ SHARED(GreaterThan, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
+ SHARED(LessThanOrEqual, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
+ SHARED(GreaterThanOrEqual, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
+ SHARED(BitwiseOr, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(BitwiseXor, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(BitwiseAnd, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(ShiftLeft, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(ShiftRight, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(ShiftRightLogical, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(Add, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(Subtract, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(Multiply, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(Divide, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+ SHARED(Modulus, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2),
+#undef SHARED
+};
-TEST_P(JSSharedOperatorTest, NumberOfInputsAndOutputs) {
- JSOperatorBuilder javascript(zone());
- const SharedOperator& sop = GetParam();
- const Operator* op = (javascript.*sop.constructor)();
+template <typename T>
+void testNumberOfInputsAndOutputs(const SharedOperator<T>& sop,
+ const Operator* op) {
const int context_input_count = 1;
EXPECT_EQ(sop.value_input_count, op->ValueInputCount());
EXPECT_EQ(context_input_count, OperatorProperties::GetContextInputCount(op));
@@ -124,9 +121,48 @@ TEST_P(JSSharedOperatorTest, NumberOfInputsAndOutputs) {
}
+std::ostream& operator<<(std::ostream& os,
+ const SharedOperator<no_params_t>& sop) {
+ return os << IrOpcode::Mnemonic(sop.opcode);
+}
+
+
+std::ostream& operator<<(std::ostream& os,
+ const SharedOperator<with_language_mode_t>& sop) {
+ return os << IrOpcode::Mnemonic(sop.opcode);
+}
+
+} // namespace
+
+
+// -----------------------------------------------------------------------------
+// Shared operators.
+
+
+class JSSharedOperatorTest
+ : public TestWithZone,
+ public ::testing::WithParamInterface<SharedOperator<no_params_t>> {};
+
+
+TEST_P(JSSharedOperatorTest, InstancesAreGloballyShared) {
+ const SharedOperator<no_params_t>& sop = GetParam();
+ JSOperatorBuilder javascript1(zone());
+ JSOperatorBuilder javascript2(zone());
+ EXPECT_EQ((javascript1.*sop.constructor)(), (javascript2.*sop.constructor)());
+}
+
+
+TEST_P(JSSharedOperatorTest, NumberOfInputsAndOutputs) {
+ JSOperatorBuilder javascript(zone());
+ const SharedOperator<no_params_t>& sop = GetParam();
+ const Operator* op = (javascript.*sop.constructor)();
+ testNumberOfInputsAndOutputs(sop, op);
+}
+
+
TEST_P(JSSharedOperatorTest, OpcodeIsCorrect) {
JSOperatorBuilder javascript(zone());
- const SharedOperator& sop = GetParam();
+ const SharedOperator<no_params_t>& sop = GetParam();
const Operator* op = (javascript.*sop.constructor)();
EXPECT_EQ(sop.opcode, op->opcode());
}
@@ -134,7 +170,7 @@ TEST_P(JSSharedOperatorTest, OpcodeIsCorrect) {
TEST_P(JSSharedOperatorTest, Properties) {
JSOperatorBuilder javascript(zone());
- const SharedOperator& sop = GetParam();
+ const SharedOperator<no_params_t>& sop = GetParam();
const Operator* op = (javascript.*sop.constructor)();
EXPECT_EQ(sop.properties, op->properties());
}
@@ -143,6 +179,65 @@ TEST_P(JSSharedOperatorTest, Properties) {
INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSSharedOperatorTest,
::testing::ValuesIn(kSharedOperators));
+// -----------------------------------------------------------------------------
+// Shared operators which behave differently in strong mode
+
+
+class JSSharedOperatorWithStrongTest
+ : public TestWithZone,
+ public ::testing::WithParamInterface<
+ SharedOperator<with_language_mode_t>>{};
+
+
+TEST_P(JSSharedOperatorWithStrongTest, InstancesAreGloballyShared) {
+ const SharedOperator<with_language_mode_t>& sop = GetParam();
+ JSOperatorBuilder javascript1(zone());
+ JSOperatorBuilder javascript2(zone());
+ EXPECT_EQ((javascript1.*sop.constructor)(LanguageMode::SLOPPY),
+ (javascript2.*sop.constructor)(LanguageMode::SLOPPY));
+ EXPECT_EQ((javascript1.*sop.constructor)(LanguageMode::STRONG),
+ (javascript2.*sop.constructor)(LanguageMode::STRONG));
+}
+
+
+TEST_P(JSSharedOperatorWithStrongTest, NumberOfInputsAndOutputs) {
+ JSOperatorBuilder javascript(zone());
+ const SharedOperator<with_language_mode_t>& sop = GetParam();
+ const Operator* op_sloppy = (javascript.*sop.constructor)
+ (LanguageMode::SLOPPY);
+ testNumberOfInputsAndOutputs(sop, op_sloppy);
+ const Operator* op_strong = (javascript.*sop.constructor)
+ (LanguageMode::STRONG);
+ testNumberOfInputsAndOutputs(sop, op_strong);
+}
+
+
+TEST_P(JSSharedOperatorWithStrongTest, OpcodeIsCorrect) {
+ JSOperatorBuilder javascript(zone());
+ const SharedOperator<with_language_mode_t>& sop = GetParam();
+ const Operator* op_sloppy = (javascript.*sop.constructor)
+ (LanguageMode::SLOPPY);
+ EXPECT_EQ(sop.opcode, op_sloppy->opcode());
+ const Operator* op_strong = (javascript.*sop.constructor)
+ (LanguageMode::STRONG);
+ EXPECT_EQ(sop.opcode, op_strong->opcode());
+}
+
+
+TEST_P(JSSharedOperatorWithStrongTest, Properties) {
+ JSOperatorBuilder javascript(zone());
+ const SharedOperator<with_language_mode_t>& sop = GetParam();
+ const Operator* op_sloppy = (javascript.*sop.constructor)
+ (LanguageMode::SLOPPY);
+ EXPECT_EQ(sop.properties, op_sloppy->properties());
+ const Operator* op_strong = (javascript.*sop.constructor)
+ (LanguageMode::STRONG);
+ EXPECT_EQ(sop.properties, op_strong->properties());
+}
+
+
+INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSSharedOperatorWithStrongTest,
+ ::testing::ValuesIn(kSharedOperatorsWithlanguageMode));
// -----------------------------------------------------------------------------
// JSStoreProperty.

Powered by Google App Engine
This is Rietveld 408576698