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

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: rebase :( 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..be5930044d90203229ae099b49c8e5ff5be2c85e 100644
--- a/test/unittests/compiler/js-operator-unittest.cc
+++ b/test/unittests/compiler/js-operator-unittest.cc
@@ -12,14 +12,10 @@ namespace v8 {
namespace internal {
namespace compiler {
-// -----------------------------------------------------------------------------
-// Shared operators.
-
namespace {
-struct SharedOperator {
- const Operator* (JSOperatorBuilder::*constructor)();
+struct OperatorParams {
IrOpcode::Value opcode;
Operator::Properties properties;
int value_input_count;
@@ -32,9 +28,21 @@ struct SharedOperator {
};
-std::ostream& operator<<(std::ostream& os, const SharedOperator& sop) {
- return os << IrOpcode::Mnemonic(sop.opcode);
-}
+struct SharedOperator : OperatorParams {
+ const Operator* (JSOperatorBuilder::*constructor)();
+ SharedOperator(const Operator* (JSOperatorBuilder::*cached)(),
rossberg 2015/04/23 13:29:37 Are you ever using this constructor?
conradw 2015/04/23 14:51:55 Yes, my C++ is rusty about what exactly is going o
rossberg 2015/04/23 15:36:58 I think it would be much simpler to just parameter
conradw 2015/04/23 16:08:02 Done. It's beautiful.
+ IrOpcode::Value opcode, Operator::Properties properties,
+ int value_input_count, int frame_state_input_count,
+ int effect_input_count, int control_input_count,
+ int value_output_count, int effect_output_count,
+ int control_output_count) : OperatorParams({opcode, properties,
+ value_input_count,
+ frame_state_input_count,
+ effect_input_count, control_input_count,
rossberg 2015/04/23 13:29:37 Nit: weird indentation
conradw 2015/04/23 14:51:55 Made a stab at it.
+ value_output_count, effect_output_count,
+ control_output_count}),
+ constructor(cached) {}
+};
const SharedOperator kSharedOperators[] = {
@@ -51,6 +59,53 @@ 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(ToBoolean, Operator::kPure, 1, 0, 0, 0, 1, 0, 0),
+ SHARED(ToNumber, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2),
+ SHARED(ToString, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2),
+ SHARED(ToName, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2),
+ SHARED(ToObject, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2),
+ SHARED(Yield, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2),
+ SHARED(Create, Operator::kEliminatable, 0, 0, 1, 0, 1, 1, 0),
+ SHARED(HasProperty, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
+ SHARED(TypeOf, Operator::kPure, 1, 0, 0, 0, 1, 0, 0),
+ SHARED(InstanceOf, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
+ SHARED(CreateFunctionContext, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2),
+ SHARED(CreateWithContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
+ SHARED(CreateBlockContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
+ SHARED(CreateModuleContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
+ SHARED(CreateScriptContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2)
+#undef SHARED
+};
+
+
+struct SharedOperatorWithLanguageMode : OperatorParams {
+ const Operator* (JSOperatorBuilder::*constructor)(LanguageMode language_mode);
+ SharedOperatorWithLanguageMode(const Operator* (JSOperatorBuilder::*cached)
rossberg 2015/04/23 13:29:37 Or this one?
conradw 2015/04/23 14:51:55 Ditto for kSharedOperatorsWithlanguageMode[].
+ (LanguageMode language_mode),
+ IrOpcode::Value opcode, Operator::Properties properties,
+ int value_input_count, int frame_state_input_count,
+ int effect_input_count, int control_input_count,
+ int value_output_count, int effect_output_count,
+ int control_output_count) : OperatorParams({opcode, properties,
+ value_input_count,
+ frame_state_input_count,
+ effect_input_count, control_input_count,
+ value_output_count, effect_output_count,
+ control_output_count}),
+ constructor(cached) {}
+};
+
+
+const SharedOperatorWithLanguageMode kSharedOperatorsWithlanguageMode[] = {
+#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),
@@ -67,27 +122,46 @@ const SharedOperator kSharedOperators[] = {
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),
- SHARED(ToString, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2),
- SHARED(ToName, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2),
- SHARED(ToObject, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2),
- SHARED(Yield, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2),
- SHARED(Create, Operator::kEliminatable, 0, 0, 1, 0, 1, 1, 0),
- SHARED(HasProperty, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
- SHARED(TypeOf, Operator::kPure, 1, 0, 0, 0, 1, 0, 0),
- SHARED(InstanceOf, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
- SHARED(CreateFunctionContext, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2),
- SHARED(CreateWithContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
- SHARED(CreateBlockContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
- SHARED(CreateModuleContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
- SHARED(CreateScriptContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2)
#undef SHARED
};
+
+void testNumberOfInputsAndOutputs(const OperatorParams& 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));
+ EXPECT_EQ(sop.frame_state_input_count,
+ OperatorProperties::GetFrameStateInputCount(op));
+ EXPECT_EQ(sop.effect_input_count, op->EffectInputCount());
+ EXPECT_EQ(sop.control_input_count, op->ControlInputCount());
+ EXPECT_EQ(sop.value_input_count + context_input_count +
+ sop.frame_state_input_count + sop.effect_input_count +
+ sop.control_input_count,
+ OperatorProperties::GetTotalInputCount(op));
+
+ EXPECT_EQ(sop.value_output_count, op->ValueOutputCount());
+ EXPECT_EQ(sop.effect_output_count, op->EffectOutputCount());
+ EXPECT_EQ(sop.control_output_count, op->ControlOutputCount());
+}
+
+
+std::ostream& operator<<(std::ostream& os, const SharedOperator& sop) {
+ return os << IrOpcode::Mnemonic(sop.opcode);
+}
+
+std::ostream& operator<<(std::ostream& os,
+ const SharedOperatorWithLanguageMode& sop) {
+ return os << IrOpcode::Mnemonic(sop.opcode);
+}
+
} // namespace
+// -----------------------------------------------------------------------------
+// Shared operators.
+
+
class JSSharedOperatorTest
: public TestWithZone,
public ::testing::WithParamInterface<SharedOperator> {};
@@ -105,22 +179,7 @@ TEST_P(JSSharedOperatorTest, NumberOfInputsAndOutputs) {
JSOperatorBuilder javascript(zone());
const SharedOperator& sop = GetParam();
const Operator* op = (javascript.*sop.constructor)();
-
- const int context_input_count = 1;
- EXPECT_EQ(sop.value_input_count, op->ValueInputCount());
- EXPECT_EQ(context_input_count, OperatorProperties::GetContextInputCount(op));
- EXPECT_EQ(sop.frame_state_input_count,
- OperatorProperties::GetFrameStateInputCount(op));
- EXPECT_EQ(sop.effect_input_count, op->EffectInputCount());
- EXPECT_EQ(sop.control_input_count, op->ControlInputCount());
- EXPECT_EQ(sop.value_input_count + context_input_count +
- sop.frame_state_input_count + sop.effect_input_count +
- sop.control_input_count,
- OperatorProperties::GetTotalInputCount(op));
-
- EXPECT_EQ(sop.value_output_count, op->ValueOutputCount());
- EXPECT_EQ(sop.effect_output_count, op->EffectOutputCount());
- EXPECT_EQ(sop.control_output_count, op->ControlOutputCount());
+ testNumberOfInputsAndOutputs(sop, op);
}
@@ -143,6 +202,64 @@ 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<SharedOperatorWithLanguageMode> {};
+
+
+TEST_P(JSSharedOperatorWithStrongTest, InstancesAreGloballyShared) {
+ const SharedOperatorWithLanguageMode& 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 SharedOperatorWithLanguageMode& 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 SharedOperatorWithLanguageMode& 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 SharedOperatorWithLanguageMode& 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