Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/base/utils/random-number-generator.h" | 5 #include "src/base/utils/random-number-generator.h" |
| 6 #include "src/ic/stub-cache.h" | 6 #include "src/ic/stub-cache.h" |
| 7 #include "src/isolate.h" | 7 #include "src/isolate.h" |
| 8 #include "test/cctest/compiler/code-assembler-tester.h" | 8 #include "test/cctest/compiler/code-assembler-tester.h" |
| 9 #include "test/cctest/compiler/function-tester.h" | 9 #include "test/cctest/compiler/function-tester.h" |
| 10 | 10 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 125 CodeStubAssemblerTester m(isolate, kNumParams); | 125 CodeStubAssemblerTester m(isolate, kNumParams); |
| 126 | 126 |
| 127 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; | 127 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; |
| 128 { | 128 { |
| 129 Node* key = m.Parameter(0); | 129 Node* key = m.Parameter(0); |
| 130 Node* expected_result = m.Parameter(1); | 130 Node* expected_result = m.Parameter(1); |
| 131 Node* expected_arg = m.Parameter(2); | 131 Node* expected_arg = m.Parameter(2); |
| 132 | 132 |
| 133 Label passed(&m), failed(&m); | 133 Label passed(&m), failed(&m); |
| 134 Label if_keyisindex(&m), if_keyisunique(&m), if_bailout(&m); | 134 Label if_keyisindex(&m), if_keyisunique(&m), if_bailout(&m); |
| 135 Variable var_index(&m, MachineRepresentation::kWord32); | 135 Variable var_index(&m, MachineType::PointerRepresentation()); |
| 136 | 136 |
| 137 m.TryToName(key, &if_keyisindex, &var_index, &if_keyisunique, &if_bailout); | 137 m.TryToName(key, &if_keyisindex, &var_index, &if_keyisunique, &if_bailout); |
| 138 | 138 |
| 139 m.Bind(&if_keyisindex); | 139 m.Bind(&if_keyisindex); |
| 140 m.GotoUnless( | 140 m.GotoUnless( |
| 141 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsIndex))), | 141 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsIndex))), |
| 142 &failed); | 142 &failed); |
| 143 m.Branch(m.Word32Equal(m.SmiToWord32(expected_arg), var_index.value()), | 143 m.Branch(m.WordEqual(m.SmiUntag(expected_arg), var_index.value()), &passed, |
| 144 &passed, &failed); | 144 &failed); |
| 145 | 145 |
| 146 m.Bind(&if_keyisunique); | 146 m.Bind(&if_keyisunique); |
| 147 m.GotoUnless( | 147 m.GotoUnless( |
| 148 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsUnique))), | 148 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsUnique))), |
| 149 &failed); | 149 &failed); |
| 150 m.Branch(m.WordEqual(expected_arg, key), &passed, &failed); | 150 m.Branch(m.WordEqual(expected_arg, key), &passed, &failed); |
| 151 | 151 |
| 152 m.Bind(&if_bailout); | 152 m.Bind(&if_bailout); |
| 153 m.Branch( | 153 m.Branch( |
| 154 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), | 154 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 174 ft.CheckTrue(key, expect_index, key); | 174 ft.CheckTrue(key, expect_index, key); |
| 175 } | 175 } |
| 176 | 176 |
| 177 { | 177 { |
| 178 // TryToName(<positive smi>) => if_keyisindex: smi value. | 178 // TryToName(<positive smi>) => if_keyisindex: smi value. |
| 179 Handle<Object> key(Smi::FromInt(153), isolate); | 179 Handle<Object> key(Smi::FromInt(153), isolate); |
| 180 ft.CheckTrue(key, expect_index, key); | 180 ft.CheckTrue(key, expect_index, key); |
| 181 } | 181 } |
| 182 | 182 |
| 183 { | 183 { |
| 184 // TryToName(<negative smi>) => bailout. | 184 // TryToName(<negative smi>) => if_keyisindex: smi value. |
| 185 // A subsequent bounds check needs to take care of this case. | |
| 185 Handle<Object> key(Smi::FromInt(-1), isolate); | 186 Handle<Object> key(Smi::FromInt(-1), isolate); |
| 186 ft.CheckTrue(key, expect_bailout); | 187 ft.CheckTrue(key, expect_index, key); |
| 187 } | 188 } |
| 188 | 189 |
| 189 { | 190 { |
| 191 // TryToName(<heap number with int value>) => if_keyisindex: number. | |
| 192 Handle<Object> key(isolate->factory()->NewHeapNumber(153)); | |
| 193 Handle<Object> index(Smi::FromInt(153), isolate); | |
| 194 ft.CheckTrue(key, expect_index, index); | |
| 195 } | |
| 196 | |
| 197 { | |
| 190 // TryToName(<symbol>) => if_keyisunique: <symbol>. | 198 // TryToName(<symbol>) => if_keyisunique: <symbol>. |
| 191 Handle<Object> key = isolate->factory()->NewSymbol(); | 199 Handle<Object> key = isolate->factory()->NewSymbol(); |
| 192 ft.CheckTrue(key, expect_unique, key); | 200 ft.CheckTrue(key, expect_unique, key); |
| 193 } | 201 } |
| 194 | 202 |
| 195 { | 203 { |
| 196 // TryToName(<internalized string>) => if_keyisunique: <internalized string> | 204 // TryToName(<internalized string>) => if_keyisunique: <internalized string> |
| 197 Handle<Object> key = isolate->factory()->InternalizeUtf8String("test"); | 205 Handle<Object> key = isolate->factory()->InternalizeUtf8String("test"); |
| 198 ft.CheckTrue(key, expect_unique, key); | 206 ft.CheckTrue(key, expect_unique, key); |
| 199 } | 207 } |
| 200 | 208 |
| 201 { | 209 { |
| 202 // TryToName(<internalized number string>) => if_keyisindex: number. | 210 // TryToName(<internalized number string>) => if_keyisindex: number. |
| 203 Handle<Object> key = isolate->factory()->InternalizeUtf8String("153"); | 211 Handle<Object> key = isolate->factory()->InternalizeUtf8String("153"); |
| 204 Handle<Object> index(Smi::FromInt(153), isolate); | 212 Handle<Object> index(Smi::FromInt(153), isolate); |
| 205 ft.CheckTrue(key, expect_index, index); | 213 ft.CheckTrue(key, expect_index, index); |
| 206 } | 214 } |
| 207 | 215 |
| 208 { | 216 { |
| 217 // TryToName(<non-internalized number string>) => if_keyisindex: number. | |
| 218 Handle<String> key = isolate->factory()->NewStringFromAsciiChecked("153"); | |
| 219 uint32_t dummy; | |
| 220 key->AsArrayIndex(&dummy); | |
|
Igor Sheludko
2016/09/01 14:31:31
CHECK(...)?
Jakob Kummerow
2016/09/05 13:15:54
Done.
| |
| 221 DCHECK(key->HasHashCode()); | |
|
Igor Sheludko
2016/09/01 14:31:31
DCHECK -> CHECK
Jakob Kummerow
2016/09/05 13:15:54
Done. (I don't see the necessity, as that's not th
| |
| 222 DCHECK(!key->IsInternalizedString()); | |
|
Igor Sheludko
2016/09/01 14:31:31
Same here.
Jakob Kummerow
2016/09/05 13:15:54
Done.
| |
| 223 Handle<Object> index(Smi::FromInt(153), isolate); | |
| 224 ft.CheckTrue(key, expect_index, index); | |
| 225 } | |
| 226 | |
| 227 { | |
| 209 // TryToName(<non-internalized string>) => bailout. | 228 // TryToName(<non-internalized string>) => bailout. |
| 210 Handle<Object> key = isolate->factory()->NewStringFromAsciiChecked("test"); | 229 Handle<Object> key = isolate->factory()->NewStringFromAsciiChecked("test"); |
| 211 ft.CheckTrue(key, expect_bailout); | 230 ft.CheckTrue(key, expect_bailout); |
| 212 } | 231 } |
| 213 } | 232 } |
| 214 | 233 |
| 215 namespace { | 234 namespace { |
| 216 | 235 |
| 217 template <typename Dictionary> | 236 template <typename Dictionary> |
| 218 void TestNameDictionaryLookup() { | 237 void TestNameDictionaryLookup() { |
| (...skipping 1116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1335 | 1354 |
| 1336 Handle<Code> expected_handler(handler, isolate); | 1355 Handle<Code> expected_handler(handler, isolate); |
| 1337 ft.CheckTrue(receiver, name, expected_handler); | 1356 ft.CheckTrue(receiver, name, expected_handler); |
| 1338 } | 1357 } |
| 1339 // Ensure we performed both kind of queries. | 1358 // Ensure we performed both kind of queries. |
| 1340 CHECK(queried_existing && queried_non_existing); | 1359 CHECK(queried_existing && queried_non_existing); |
| 1341 } | 1360 } |
| 1342 | 1361 |
| 1343 } // namespace internal | 1362 } // namespace internal |
| 1344 } // namespace v8 | 1363 } // namespace v8 |
| OLD | NEW |