1 // Copyright 2013 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/v8.h" 6 7 #include "src/compiler/operator.h" 8 #include "test/cctest/cctest.h" 9 10 using namespace v8::internal; 11 using namespace v8::internal::compiler; 12 13 #define NaN (v8::base::OS::nan_value()) 14 #define Infinity (std::numeric_limits<double>::infinity()) 15 16 TEST(TestOperatorMnemonic) { 17 SimpleOperator op1(10, Operator::kNoProperties, 0, 0, "ThisOne"); 18 CHECK_EQ(0, strcmp(op1.mnemonic(), "ThisOne")); 19 20 SimpleOperator op2(11, Operator::kNoProperties, 0, 0, "ThatOne"); 21 CHECK_EQ(0, strcmp(op2.mnemonic(), "ThatOne")); 22 23 Operator1<int> op3(12, Operator::kNoProperties, 0, 1, "Mnemonic1", 12333); 24 CHECK_EQ(0, strcmp(op3.mnemonic(), "Mnemonic1")); 25 26 Operator1<double> op4(13, Operator::kNoProperties, 0, 1, "TheOther", 99.9); 27 CHECK_EQ(0, strcmp(op4.mnemonic(), "TheOther")); 28 } 29 30 31 TEST(TestSimpleOperatorHash) { 32 SimpleOperator op1(17, Operator::kNoProperties, 0, 0, "Another"); 33 CHECK_EQ(17, op1.HashCode()); 34 35 SimpleOperator op2(18, Operator::kNoProperties, 0, 0, "Falsch"); 36 CHECK_EQ(18, op2.HashCode()); 37 } 38 39 40 TEST(TestSimpleOperatorEquals) { 41 SimpleOperator op1a(19, Operator::kNoProperties, 0, 0, "Another1"); 42 SimpleOperator op1b(19, Operator::kFoldable, 2, 2, "Another2"); 43 44 CHECK(op1a.Equals(&op1a)); 45 CHECK(op1a.Equals(&op1b)); 46 CHECK(op1b.Equals(&op1a)); 47 CHECK(op1b.Equals(&op1b)); 48 49 SimpleOperator op2a(20, Operator::kNoProperties, 0, 0, "Falsch1"); 50 SimpleOperator op2b(20, Operator::kFoldable, 1, 1, "Falsch2"); 51 52 CHECK(op2a.Equals(&op2a)); 53 CHECK(op2a.Equals(&op2b)); 54 CHECK(op2b.Equals(&op2a)); 55 CHECK(op2b.Equals(&op2b)); 56 57 CHECK(!op1a.Equals(&op2a)); 58 CHECK(!op1a.Equals(&op2b)); 59 CHECK(!op1b.Equals(&op2a)); 60 CHECK(!op1b.Equals(&op2b)); 61 62 CHECK(!op2a.Equals(&op1a)); 63 CHECK(!op2a.Equals(&op1b)); 64 CHECK(!op2b.Equals(&op1a)); 65 CHECK(!op2b.Equals(&op1b)); 66 } 67 68 69 static SmartArrayPointer<const char> OperatorToString(Operator* op) { 70 OStringStream os; 71 os << *op; 72 return SmartArrayPointer<const char>(StrDup(os.c_str())); 73 } 74 75 76 TEST(TestSimpleOperatorPrint) { 77 SimpleOperator op1a(19, Operator::kNoProperties, 0, 0, "Another1"); 78 SimpleOperator op1b(19, Operator::kFoldable, 2, 2, "Another2"); 79 80 CHECK_EQ("Another1", OperatorToString(&op1a).get()); 81 CHECK_EQ("Another2", OperatorToString(&op1b).get()); 82 83 SimpleOperator op2a(20, Operator::kNoProperties, 0, 0, "Flog1"); 84 SimpleOperator op2b(20, Operator::kFoldable, 1, 1, "Flog2"); 85 86 CHECK_EQ("Flog1", OperatorToString(&op2a).get()); 87 CHECK_EQ("Flog2", OperatorToString(&op2b).get()); 88 } 89 90 91 TEST(TestOperator1intHash) { 92 Operator1<int> op1a(23, Operator::kNoProperties, 0, 0, "Wolfie", 11); 93 Operator1<int> op1b(23, Operator::kFoldable, 2, 2, "Doggie", 11); 94 95 CHECK_EQ(op1a.HashCode(), op1b.HashCode()); 96 97 Operator1<int> op2a(24, Operator::kNoProperties, 0, 0, "Arfie", 3); 98 Operator1<int> op2b(24, Operator::kNoProperties, 0, 0, "Arfie", 4); 99 100 CHECK_NE(op1a.HashCode(), op2a.HashCode()); 101 CHECK_NE(op2a.HashCode(), op2b.HashCode()); 102 } 103 104 105 TEST(TestOperator1intEquals) { 106 Operator1<int> op1a(23, Operator::kNoProperties, 0, 0, "Scratchy", 11); 107 Operator1<int> op1b(23, Operator::kFoldable, 2, 2, "Scratchy", 11); 108 109 CHECK(op1a.Equals(&op1a)); 110 CHECK(op1a.Equals(&op1b)); 111 CHECK(op1b.Equals(&op1a)); 112 CHECK(op1b.Equals(&op1b)); 113 114 Operator1<int> op2a(24, Operator::kNoProperties, 0, 0, "Im", 3); 115 Operator1<int> op2b(24, Operator::kNoProperties, 0, 0, "Im", 4); 116 117 CHECK(op2a.Equals(&op2a)); 118 CHECK(!op2a.Equals(&op2b)); 119 CHECK(!op2b.Equals(&op2a)); 120 CHECK(op2b.Equals(&op2b)); 121 122 CHECK(!op1a.Equals(&op2a)); 123 CHECK(!op1a.Equals(&op2b)); 124 CHECK(!op1b.Equals(&op2a)); 125 CHECK(!op1b.Equals(&op2b)); 126 127 CHECK(!op2a.Equals(&op1a)); 128 CHECK(!op2a.Equals(&op1b)); 129 CHECK(!op2b.Equals(&op1a)); 130 CHECK(!op2b.Equals(&op1b)); 131 132 SimpleOperator op3(25, Operator::kNoProperties, 0, 0, "Weepy"); 133 134 CHECK(!op1a.Equals(&op3)); 135 CHECK(!op1b.Equals(&op3)); 136 CHECK(!op2a.Equals(&op3)); 137 CHECK(!op2b.Equals(&op3)); 138 139 CHECK(!op3.Equals(&op1a)); 140 CHECK(!op3.Equals(&op1b)); 141 CHECK(!op3.Equals(&op2a)); 142 CHECK(!op3.Equals(&op2b)); 143 } 144 145 146 TEST(TestOperator1intPrint) { 147 Operator1<int> op1(12, Operator::kNoProperties, 0, 1, "Op1Test", 0); 148 CHECK_EQ("Op1Test[0]", OperatorToString(&op1).get()); 149 150 Operator1<int> op2(12, Operator::kNoProperties, 0, 1, "Op1Test", 66666666); 151 CHECK_EQ("Op1Test[66666666]", OperatorToString(&op2).get()); 152 153 Operator1<int> op3(12, Operator::kNoProperties, 0, 1, "FooBar", 2347); 154 CHECK_EQ("FooBar[2347]", OperatorToString(&op3).get()); 155 156 Operator1<int> op4(12, Operator::kNoProperties, 0, 1, "BarFoo", -879); 157 CHECK_EQ("BarFoo[-879]", OperatorToString(&op4).get()); 158 } 159 160 161 TEST(TestOperator1doubleHash) { 162 Operator1<double> op1a(23, Operator::kNoProperties, 0, 0, "Wolfie", 11.77); 163 Operator1<double> op1b(23, Operator::kFoldable, 2, 2, "Doggie", 11.77); 164 165 CHECK_EQ(op1a.HashCode(), op1b.HashCode()); 166 167 Operator1<double> op2a(24, Operator::kNoProperties, 0, 0, "Arfie", -6.7); 168 Operator1<double> op2b(24, Operator::kNoProperties, 0, 0, "Arfie", -6.8); 169 170 CHECK_NE(op1a.HashCode(), op2a.HashCode()); 171 CHECK_NE(op2a.HashCode(), op2b.HashCode()); 172 } 173 174 175 TEST(TestOperator1doubleEquals) { 176 Operator1<double> op1a(23, Operator::kNoProperties, 0, 0, "Scratchy", 11.77); 177 Operator1<double> op1b(23, Operator::kFoldable, 2, 2, "Scratchy", 11.77); 178 179 CHECK(op1a.Equals(&op1a)); 180 CHECK(op1a.Equals(&op1b)); 181 CHECK(op1b.Equals(&op1a)); 182 CHECK(op1b.Equals(&op1b)); 183 184 Operator1<double> op2a(24, Operator::kNoProperties, 0, 0, "Im", 3.1); 185 Operator1<double> op2b(24, Operator::kNoProperties, 0, 0, "Im", 3.2); 186 187 CHECK(op2a.Equals(&op2a)); 188 CHECK(!op2a.Equals(&op2b)); 189 CHECK(!op2b.Equals(&op2a)); 190 CHECK(op2b.Equals(&op2b)); 191 192 CHECK(!op1a.Equals(&op2a)); 193 CHECK(!op1a.Equals(&op2b)); 194 CHECK(!op1b.Equals(&op2a)); 195 CHECK(!op1b.Equals(&op2b)); 196 197 CHECK(!op2a.Equals(&op1a)); 198 CHECK(!op2a.Equals(&op1b)); 199 CHECK(!op2b.Equals(&op1a)); 200 CHECK(!op2b.Equals(&op1b)); 201 202 SimpleOperator op3(25, Operator::kNoProperties, 0, 0, "Weepy"); 203 204 CHECK(!op1a.Equals(&op3)); 205 CHECK(!op1b.Equals(&op3)); 206 CHECK(!op2a.Equals(&op3)); 207 CHECK(!op2b.Equals(&op3)); 208 209 CHECK(!op3.Equals(&op1a)); 210 CHECK(!op3.Equals(&op1b)); 211 CHECK(!op3.Equals(&op2a)); 212 CHECK(!op3.Equals(&op2b)); 213 214 Operator1<double> op4a(24, Operator::kNoProperties, 0, 0, "Bashful", NaN); 215 Operator1<double> op4b(24, Operator::kNoProperties, 0, 0, "Bashful", NaN); 216 217 CHECK(op4a.Equals(&op4a)); 218 CHECK(op4a.Equals(&op4b)); 219 CHECK(op4b.Equals(&op4a)); 220 CHECK(op4b.Equals(&op4b)); 221 222 CHECK(!op3.Equals(&op4a)); 223 CHECK(!op3.Equals(&op4b)); 224 CHECK(!op3.Equals(&op4a)); 225 CHECK(!op3.Equals(&op4b)); 226 } 227 228 229 TEST(TestOperator1doublePrint) { 230 Operator1<double> op1(12, Operator::kNoProperties, 0, 1, "Op1Test", 0); 231 CHECK_EQ("Op1Test[0]", OperatorToString(&op1).get()); 232 233 Operator1<double> op2(12, Operator::kNoProperties, 0, 1, "Op1Test", 7.3); 234 CHECK_EQ("Op1Test[7.3]", OperatorToString(&op2).get()); 235 236 Operator1<double> op3(12, Operator::kNoProperties, 0, 1, "FooBar", 2e+123); 237 CHECK_EQ("FooBar[2e+123]", OperatorToString(&op3).get()); 238 239 Operator1<double> op4(12, Operator::kNoProperties, 0, 1, "BarFoo", Infinity); 240 CHECK_EQ("BarFoo[inf]", OperatorToString(&op4).get()); 241 242 Operator1<double> op5(12, Operator::kNoProperties, 0, 1, "BarFoo", NaN); 243 CHECK_EQ("BarFoo[nan]", OperatorToString(&op5).get()); 244 } 245