| 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/code-factory.h" | 6 #include "src/code-factory.h" |
| 7 #include "src/code-stub-assembler.h" | 7 #include "src/code-stub-assembler.h" |
| 8 #include "src/compiler/node.h" | 8 #include "src/compiler/node.h" |
| 9 #include "src/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
| 10 #include "src/isolate.h" | 10 #include "src/isolate.h" |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 CodeStubAssemblerTester m(isolate, kNumParams); | 128 CodeStubAssemblerTester m(isolate, kNumParams); |
| 129 | 129 |
| 130 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; | 130 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; |
| 131 { | 131 { |
| 132 Node* key = m.Parameter(0); | 132 Node* key = m.Parameter(0); |
| 133 Node* expected_result = m.Parameter(1); | 133 Node* expected_result = m.Parameter(1); |
| 134 Node* expected_arg = m.Parameter(2); | 134 Node* expected_arg = m.Parameter(2); |
| 135 | 135 |
| 136 Label passed(&m), failed(&m); | 136 Label passed(&m), failed(&m); |
| 137 Label if_keyisindex(&m), if_keyisunique(&m), if_bailout(&m); | 137 Label if_keyisindex(&m), if_keyisunique(&m), if_bailout(&m); |
| 138 Variable var_index(&m, MachineRepresentation::kWord32); | 138 Variable var_index(&m, MachineType::PointerRepresentation()); |
| 139 | 139 |
| 140 m.TryToName(key, &if_keyisindex, &var_index, &if_keyisunique, &if_bailout); | 140 m.TryToName(key, &if_keyisindex, &var_index, &if_keyisunique, &if_bailout); |
| 141 | 141 |
| 142 m.Bind(&if_keyisindex); | 142 m.Bind(&if_keyisindex); |
| 143 m.GotoUnless( | 143 m.GotoUnless( |
| 144 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsIndex))), | 144 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsIndex))), |
| 145 &failed); | 145 &failed); |
| 146 m.Branch(m.Word32Equal(m.SmiToWord32(expected_arg), var_index.value()), | 146 m.Branch(m.WordEqual(m.SmiUntag(expected_arg), var_index.value()), &passed, |
| 147 &passed, &failed); | 147 &failed); |
| 148 | 148 |
| 149 m.Bind(&if_keyisunique); | 149 m.Bind(&if_keyisunique); |
| 150 m.GotoUnless( | 150 m.GotoUnless( |
| 151 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsUnique))), | 151 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kKeyIsUnique))), |
| 152 &failed); | 152 &failed); |
| 153 m.Branch(m.WordEqual(expected_arg, key), &passed, &failed); | 153 m.Branch(m.WordEqual(expected_arg, key), &passed, &failed); |
| 154 | 154 |
| 155 m.Bind(&if_bailout); | 155 m.Bind(&if_bailout); |
| 156 m.Branch( | 156 m.Branch( |
| 157 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), | 157 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 177 ft.CheckTrue(key, expect_index, key); | 177 ft.CheckTrue(key, expect_index, key); |
| 178 } | 178 } |
| 179 | 179 |
| 180 { | 180 { |
| 181 // TryToName(<positive smi>) => if_keyisindex: smi value. | 181 // TryToName(<positive smi>) => if_keyisindex: smi value. |
| 182 Handle<Object> key(Smi::FromInt(153), isolate); | 182 Handle<Object> key(Smi::FromInt(153), isolate); |
| 183 ft.CheckTrue(key, expect_index, key); | 183 ft.CheckTrue(key, expect_index, key); |
| 184 } | 184 } |
| 185 | 185 |
| 186 { | 186 { |
| 187 // TryToName(<negative smi>) => bailout. | 187 // TryToName(<negative smi>) => if_keyisindex: smi value. |
| 188 // A subsequent bounds check needs to take care of this case. |
| 188 Handle<Object> key(Smi::FromInt(-1), isolate); | 189 Handle<Object> key(Smi::FromInt(-1), isolate); |
| 189 ft.CheckTrue(key, expect_bailout); | 190 ft.CheckTrue(key, expect_index, key); |
| 190 } | 191 } |
| 191 | 192 |
| 192 { | 193 { |
| 194 // TryToName(<heap number with int value>) => if_keyisindex: number. |
| 195 Handle<Object> key(isolate->factory()->NewHeapNumber(153)); |
| 196 Handle<Object> index(Smi::FromInt(153), isolate); |
| 197 ft.CheckTrue(key, expect_index, index); |
| 198 } |
| 199 |
| 200 { |
| 193 // TryToName(<symbol>) => if_keyisunique: <symbol>. | 201 // TryToName(<symbol>) => if_keyisunique: <symbol>. |
| 194 Handle<Object> key = isolate->factory()->NewSymbol(); | 202 Handle<Object> key = isolate->factory()->NewSymbol(); |
| 195 ft.CheckTrue(key, expect_unique, key); | 203 ft.CheckTrue(key, expect_unique, key); |
| 196 } | 204 } |
| 197 | 205 |
| 198 { | 206 { |
| 199 // TryToName(<internalized string>) => if_keyisunique: <internalized string> | 207 // TryToName(<internalized string>) => if_keyisunique: <internalized string> |
| 200 Handle<Object> key = isolate->factory()->InternalizeUtf8String("test"); | 208 Handle<Object> key = isolate->factory()->InternalizeUtf8String("test"); |
| 201 ft.CheckTrue(key, expect_unique, key); | 209 ft.CheckTrue(key, expect_unique, key); |
| 202 } | 210 } |
| 203 | 211 |
| 204 { | 212 { |
| 205 // TryToName(<internalized number string>) => if_keyisindex: number. | 213 // TryToName(<internalized number string>) => if_keyisindex: number. |
| 206 Handle<Object> key = isolate->factory()->InternalizeUtf8String("153"); | 214 Handle<Object> key = isolate->factory()->InternalizeUtf8String("153"); |
| 207 Handle<Object> index(Smi::FromInt(153), isolate); | 215 Handle<Object> index(Smi::FromInt(153), isolate); |
| 208 ft.CheckTrue(key, expect_index, index); | 216 ft.CheckTrue(key, expect_index, index); |
| 209 } | 217 } |
| 210 | 218 |
| 211 { | 219 { |
| 220 // TryToName(<internalized uncacheable number string>) => bailout |
| 221 Handle<Object> key = |
| 222 isolate->factory()->InternalizeUtf8String("4294967294"); |
| 223 ft.CheckTrue(key, expect_bailout); |
| 224 } |
| 225 |
| 226 { |
| 227 // TryToName(<non-internalized number string>) => if_keyisindex: number. |
| 228 Handle<String> key = isolate->factory()->NewStringFromAsciiChecked("153"); |
| 229 uint32_t dummy; |
| 230 CHECK(key->AsArrayIndex(&dummy)); |
| 231 CHECK(key->HasHashCode()); |
| 232 CHECK(!key->IsInternalizedString()); |
| 233 Handle<Object> index(Smi::FromInt(153), isolate); |
| 234 ft.CheckTrue(key, expect_index, index); |
| 235 } |
| 236 |
| 237 { |
| 238 // TryToName(<number string without cached index>) => bailout. |
| 239 Handle<String> key = isolate->factory()->NewStringFromAsciiChecked("153"); |
| 240 CHECK(!key->HasHashCode()); |
| 241 ft.CheckTrue(key, expect_bailout); |
| 242 } |
| 243 |
| 244 { |
| 212 // TryToName(<non-internalized string>) => bailout. | 245 // TryToName(<non-internalized string>) => bailout. |
| 213 Handle<Object> key = isolate->factory()->NewStringFromAsciiChecked("test"); | 246 Handle<Object> key = isolate->factory()->NewStringFromAsciiChecked("test"); |
| 214 ft.CheckTrue(key, expect_bailout); | 247 ft.CheckTrue(key, expect_bailout); |
| 215 } | 248 } |
| 216 } | 249 } |
| 217 | 250 |
| 218 namespace { | 251 namespace { |
| 219 | 252 |
| 220 template <typename Dictionary> | 253 template <typename Dictionary> |
| 221 void TestNameDictionaryLookup() { | 254 void TestNameDictionaryLookup() { |
| (...skipping 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1471 | 1504 |
| 1472 Handle<Object> constructor = | 1505 Handle<Object> constructor = |
| 1473 Object::GetPropertyOrElement(result, | 1506 Object::GetPropertyOrElement(result, |
| 1474 isolate->factory()->constructor_string()) | 1507 isolate->factory()->constructor_string()) |
| 1475 .ToHandleChecked(); | 1508 .ToHandleChecked(); |
| 1476 CHECK(constructor->SameValue(*isolate->type_error_function())); | 1509 CHECK(constructor->SameValue(*isolate->type_error_function())); |
| 1477 } | 1510 } |
| 1478 | 1511 |
| 1479 } // namespace internal | 1512 } // namespace internal |
| 1480 } // namespace v8 | 1513 } // namespace v8 |
| OLD | NEW |