OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 | 344 |
345 | 345 |
346 void IC::Clear(Address address) { | 346 void IC::Clear(Address address) { |
347 Code* target = GetTargetAtAddress(address); | 347 Code* target = GetTargetAtAddress(address); |
348 | 348 |
349 // Don't clear debug break inline cache as it will remove the break point. | 349 // Don't clear debug break inline cache as it will remove the break point. |
350 if (target->is_debug_break()) return; | 350 if (target->is_debug_break()) return; |
351 | 351 |
352 switch (target->kind()) { | 352 switch (target->kind()) { |
353 case Code::LOAD_IC: return LoadIC::Clear(address, target); | 353 case Code::LOAD_IC: return LoadIC::Clear(address, target); |
354 case Code::KEYED_LOAD_IC: | 354 case Code::KEYED_LOAD_IC: return KeyedLoadIC::Clear(address, target); |
355 return KeyedLoadIC::Clear(address, target); | |
356 case Code::STORE_IC: return StoreIC::Clear(address, target); | 355 case Code::STORE_IC: return StoreIC::Clear(address, target); |
357 case Code::KEYED_STORE_IC: | 356 case Code::KEYED_STORE_IC: return KeyedStoreIC::Clear(address, target); |
358 return KeyedStoreIC::Clear(address, target); | |
359 case Code::CALL_IC: return CallIC::Clear(address, target); | 357 case Code::CALL_IC: return CallIC::Clear(address, target); |
360 case Code::KEYED_CALL_IC: return KeyedCallIC::Clear(address, target); | 358 case Code::KEYED_CALL_IC: return KeyedCallIC::Clear(address, target); |
361 case Code::COMPARE_IC: return CompareIC::Clear(address, target); | 359 case Code::COMPARE_IC: return CompareIC::Clear(address, target); |
362 case Code::UNARY_OP_IC: | 360 case Code::UNARY_OP_IC: |
363 case Code::BINARY_OP_IC: | 361 case Code::BINARY_OP_IC: |
364 case Code::TO_BOOLEAN_IC: | 362 case Code::TO_BOOLEAN_IC: |
365 // Clearing these is tricky and does not | 363 // Clearing these is tricky and does not |
366 // make any performance difference. | 364 // make any performance difference. |
367 return; | 365 return; |
368 default: UNREACHABLE(); | 366 default: UNREACHABLE(); |
(...skipping 11 matching lines...) Expand all Loading... |
380 target->kind()); | 378 target->kind()); |
381 SetTargetAtAddress(address, code); | 379 SetTargetAtAddress(address, code); |
382 } | 380 } |
383 | 381 |
384 | 382 |
385 void KeyedLoadIC::Clear(Address address, Code* target) { | 383 void KeyedLoadIC::Clear(Address address, Code* target) { |
386 if (target->ic_state() == UNINITIALIZED) return; | 384 if (target->ic_state() == UNINITIALIZED) return; |
387 // Make sure to also clear the map used in inline fast cases. If we | 385 // Make sure to also clear the map used in inline fast cases. If we |
388 // do not clear these maps, cached code can keep objects alive | 386 // do not clear these maps, cached code can keep objects alive |
389 // through the embedded maps. | 387 // through the embedded maps. |
390 SetTargetAtAddress(address, initialize_stub()); | 388 SetTargetAtAddress(address, *initialize_stub()); |
391 } | 389 } |
392 | 390 |
393 | 391 |
394 void LoadIC::Clear(Address address, Code* target) { | 392 void LoadIC::Clear(Address address, Code* target) { |
395 if (target->ic_state() == UNINITIALIZED) return; | 393 if (target->ic_state() == UNINITIALIZED) return; |
396 SetTargetAtAddress(address, initialize_stub()); | 394 SetTargetAtAddress(address, *initialize_stub()); |
397 } | 395 } |
398 | 396 |
399 | 397 |
400 void StoreIC::Clear(Address address, Code* target) { | 398 void StoreIC::Clear(Address address, Code* target) { |
401 if (target->ic_state() == UNINITIALIZED) return; | 399 if (target->ic_state() == UNINITIALIZED) return; |
402 SetTargetAtAddress(address, | 400 SetTargetAtAddress(address, |
403 (Code::GetStrictMode(target->extra_ic_state()) == kStrictMode) | 401 (Code::GetStrictMode(target->extra_ic_state()) == kStrictMode) |
404 ? initialize_stub_strict() | 402 ? *initialize_stub_strict() |
405 : initialize_stub()); | 403 : *initialize_stub()); |
406 } | 404 } |
407 | 405 |
408 | 406 |
409 void KeyedStoreIC::Clear(Address address, Code* target) { | 407 void KeyedStoreIC::Clear(Address address, Code* target) { |
410 if (target->ic_state() == UNINITIALIZED) return; | 408 if (target->ic_state() == UNINITIALIZED) return; |
411 SetTargetAtAddress(address, | 409 SetTargetAtAddress(address, |
412 (Code::GetStrictMode(target->extra_ic_state()) == kStrictMode) | 410 (Code::GetStrictMode(target->extra_ic_state()) == kStrictMode) |
413 ? initialize_stub_strict() | 411 ? *initialize_stub_strict() |
414 : initialize_stub()); | 412 : *initialize_stub()); |
415 } | 413 } |
416 | 414 |
417 | 415 |
418 void CompareIC::Clear(Address address, Code* target) { | 416 void CompareIC::Clear(Address address, Code* target) { |
419 ASSERT(target->major_key() == CodeStub::CompareIC); | 417 ASSERT(target->major_key() == CodeStub::CompareIC); |
420 CompareIC::State handler_state; | 418 CompareIC::State handler_state; |
421 Token::Value op; | 419 Token::Value op; |
422 ICCompareStub::DecodeMinorKey(target->stub_info(), NULL, NULL, | 420 ICCompareStub::DecodeMinorKey(target->stub_info(), NULL, NULL, |
423 &handler_state, &op); | 421 &handler_state, &op); |
424 // Only clear CompareICs that can retain objects. | 422 // Only clear CompareICs that can retain objects. |
(...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 if (lookup->IsInterceptor() && | 1304 if (lookup->IsInterceptor() && |
1307 receiver->GetNamedInterceptor()->setter()->IsUndefined()) { | 1305 receiver->GetNamedInterceptor()->setter()->IsUndefined()) { |
1308 receiver->LocalLookupRealNamedProperty(*name, lookup); | 1306 receiver->LocalLookupRealNamedProperty(*name, lookup); |
1309 return StoreICableLookup(lookup); | 1307 return StoreICableLookup(lookup); |
1310 } | 1308 } |
1311 | 1309 |
1312 return true; | 1310 return true; |
1313 } | 1311 } |
1314 | 1312 |
1315 | 1313 |
1316 MaybeObject* StoreIC::Store(State state, | 1314 MaybeObject* IC::Store(State state, |
1317 StrictModeFlag strict_mode, | 1315 StrictModeFlag strict_mode, |
1318 Handle<Object> object, | 1316 Handle<Object> object, |
1319 Handle<String> name, | 1317 Handle<String> name, |
1320 Handle<Object> value) { | 1318 Handle<Object> value, |
1321 if (!object->IsJSObject()) { | 1319 JSReceiver::StoreFromKeyed store_mode) { |
1322 // Handle proxies. | 1320 // Handle proxies. |
1323 if (object->IsJSProxy()) { | 1321 if (object->IsJSProxy()) { |
1324 return JSProxy::cast(*object)-> | 1322 return JSProxy::cast(*object)-> |
1325 SetProperty(*name, *value, NONE, strict_mode); | 1323 SetProperty(*name, *value, NONE, strict_mode); |
1326 } | 1324 } |
1327 | 1325 |
1328 // If the object is undefined or null it's illegal to try to set any | 1326 // If the object is undefined or null it's illegal to try to set any |
1329 // properties on it; throw a TypeError in that case. | 1327 // properties on it; throw a TypeError in that case. |
1330 if (object->IsUndefined() || object->IsNull()) { | 1328 if (object->IsUndefined() || object->IsNull()) { |
1331 return TypeError("non_object_property_store", object, name); | 1329 return TypeError("non_object_property_store", object, name); |
1332 } | 1330 } |
1333 | 1331 |
1334 // The length property of string values is read-only. Throw in strict mode. | 1332 // The length property of string values is read-only. Throw in strict mode. |
1335 if (strict_mode == kStrictMode && object->IsString() && | 1333 if (strict_mode == kStrictMode && object->IsString() && |
1336 name->Equals(isolate()->heap()->length_symbol())) { | 1334 name->Equals(isolate()->heap()->length_symbol())) { |
1337 return TypeError("strict_read_only_property", object, name); | 1335 return TypeError("strict_read_only_property", object, name); |
1338 } | |
1339 // Ignore other stores where the receiver is not a JSObject. | |
1340 // TODO(1475): Must check prototype chains of object wrappers. | |
1341 return *value; | |
1342 } | 1336 } |
1343 | 1337 |
| 1338 // Ignore other stores where the receiver is not a JSObject. |
| 1339 // TODO(1475): Must check prototype chains of object wrappers. |
| 1340 if (!object->IsJSObject()) return *value; |
| 1341 |
1344 Handle<JSObject> receiver = Handle<JSObject>::cast(object); | 1342 Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
1345 | 1343 |
1346 // Check if the given name is an array index. | 1344 // Check if the given name is an array index. |
1347 uint32_t index; | 1345 uint32_t index; |
1348 if (name->AsArrayIndex(&index)) { | 1346 if (name->AsArrayIndex(&index)) { |
1349 Handle<Object> result = | 1347 Handle<Object> result = |
1350 JSObject::SetElement(receiver, index, value, NONE, strict_mode); | 1348 JSObject::SetElement(receiver, index, value, NONE, strict_mode); |
1351 RETURN_IF_EMPTY_HANDLE(isolate(), result); | 1349 RETURN_IF_EMPTY_HANDLE(isolate(), result); |
1352 return *value; | 1350 return *value; |
1353 } | 1351 } |
1354 | 1352 |
1355 // Observed objects are always modified through the runtime. | 1353 // Observed objects are always modified through the runtime. |
1356 if (FLAG_harmony_observation && receiver->map()->is_observed()) { | 1354 if (FLAG_harmony_observation && receiver->map()->is_observed()) { |
1357 return receiver->SetProperty(*name, *value, NONE, strict_mode); | 1355 return receiver->SetProperty(*name, *value, NONE, strict_mode, store_mode); |
1358 } | 1356 } |
1359 | 1357 |
1360 // Use specialized code for setting the length of arrays with fast | 1358 // Use specialized code for setting the length of arrays with fast |
1361 // properties. Slow properties might indicate redefinition of the | 1359 // properties. Slow properties might indicate redefinition of the length |
1362 // length property. | 1360 // property. |
1363 if (receiver->IsJSArray() && | 1361 if (FLAG_use_ic && |
| 1362 receiver->IsJSArray() && |
1364 name->Equals(isolate()->heap()->length_symbol()) && | 1363 name->Equals(isolate()->heap()->length_symbol()) && |
1365 Handle<JSArray>::cast(receiver)->AllowsSetElementsLength() && | 1364 Handle<JSArray>::cast(receiver)->AllowsSetElementsLength() && |
1366 receiver->HasFastProperties()) { | 1365 receiver->HasFastProperties() && |
1367 #ifdef DEBUG | 1366 kind() != Code::KEYED_STORE_IC) { |
1368 if (FLAG_trace_ic) PrintF("[StoreIC : +#length /array]\n"); | |
1369 #endif | |
1370 Handle<Code> stub = (strict_mode == kStrictMode) | 1367 Handle<Code> stub = (strict_mode == kStrictMode) |
1371 ? isolate()->builtins()->StoreIC_ArrayLength_Strict() | 1368 ? isolate()->builtins()->StoreIC_ArrayLength_Strict() |
1372 : isolate()->builtins()->StoreIC_ArrayLength(); | 1369 : isolate()->builtins()->StoreIC_ArrayLength(); |
1373 set_target(*stub); | 1370 set_target(*stub); |
1374 return receiver->SetProperty(*name, *value, NONE, strict_mode); | 1371 TRACE_IC("StoreIC", name, state, *stub); |
1375 } | 1372 return receiver->SetProperty(*name, *value, NONE, strict_mode, store_mode); |
1376 | |
1377 // Lookup the property locally in the receiver. | |
1378 if (!receiver->IsJSGlobalProxy()) { | |
1379 LookupResult lookup(isolate()); | |
1380 | |
1381 if (LookupForWrite(receiver, name, &lookup)) { | |
1382 if (FLAG_use_ic) { // Generate a stub for this store. | |
1383 UpdateCaches(&lookup, state, strict_mode, receiver, name, value); | |
1384 } | |
1385 } else { | |
1386 // Strict mode doesn't allow setting non-existent global property | |
1387 // or an assignment to a read only property. | |
1388 if (strict_mode == kStrictMode) { | |
1389 if (lookup.IsProperty() && lookup.IsReadOnly()) { | |
1390 return TypeError("strict_read_only_property", object, name); | |
1391 } else if (IsContextual(object)) { | |
1392 return ReferenceError("not_defined", name); | |
1393 } | |
1394 } | |
1395 } | |
1396 } | 1373 } |
1397 | 1374 |
1398 if (receiver->IsJSGlobalProxy()) { | 1375 if (receiver->IsJSGlobalProxy()) { |
1399 // TODO(ulan): find out why we patch this site even with --no-use-ic | 1376 if (FLAG_use_ic && kind() != Code::KEYED_STORE_IC) { |
1400 // Generate a generic stub that goes to the runtime when we see a global | 1377 // Generate a generic stub that goes to the runtime when we see a global |
1401 // proxy as receiver. | 1378 // proxy as receiver. |
1402 Handle<Code> stub = (strict_mode == kStrictMode) | 1379 Handle<Code> stub = (strict_mode == kStrictMode) |
1403 ? global_proxy_stub_strict() | 1380 ? global_proxy_stub_strict() |
1404 : global_proxy_stub(); | 1381 : global_proxy_stub(); |
1405 if (target() != *stub) { | |
1406 set_target(*stub); | 1382 set_target(*stub); |
1407 TRACE_IC("StoreIC", name, state, target()); | 1383 TRACE_IC("StoreIC", name, state, *stub); |
1408 } | 1384 } |
| 1385 return receiver->SetProperty(*name, *value, NONE, strict_mode, store_mode); |
| 1386 } |
| 1387 |
| 1388 LookupResult lookup(isolate()); |
| 1389 if (LookupForWrite(receiver, name, &lookup)) { |
| 1390 if (FLAG_use_ic) { |
| 1391 UpdateStoreCaches(&lookup, state, strict_mode, receiver, name, value); |
| 1392 } |
| 1393 } else if (strict_mode == kStrictMode && |
| 1394 !lookup.IsFound() && |
| 1395 IsContextual(object)) { |
| 1396 // Strict mode doesn't allow setting non-existent global property |
| 1397 // or an assignment to a read only property. |
| 1398 return ReferenceError("not_defined", name); |
1409 } | 1399 } |
1410 | 1400 |
1411 // Set the property. | 1401 // Set the property. |
1412 return receiver->SetProperty(*name, | 1402 return receiver->SetProperty(*name, *value, NONE, strict_mode, store_mode); |
1413 *value, | |
1414 NONE, | |
1415 strict_mode, | |
1416 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); | |
1417 } | 1403 } |
1418 | 1404 |
1419 | 1405 |
1420 void StoreIC::UpdateCaches(LookupResult* lookup, | 1406 void StoreIC::UpdateStoreCaches(LookupResult* lookup, |
1421 State state, | 1407 State state, |
1422 StrictModeFlag strict_mode, | 1408 StrictModeFlag strict_mode, |
1423 Handle<JSObject> receiver, | 1409 Handle<JSObject> receiver, |
1424 Handle<String> name, | 1410 Handle<String> name, |
1425 Handle<Object> value) { | 1411 Handle<Object> value) { |
1426 ASSERT(!receiver->IsJSGlobalProxy()); | 1412 ASSERT(!receiver->IsJSGlobalProxy()); |
1427 ASSERT(StoreICableLookup(lookup)); | 1413 ASSERT(StoreICableLookup(lookup)); |
1428 ASSERT(lookup->IsFound()); | 1414 ASSERT(lookup->IsFound()); |
1429 | 1415 |
1430 // These are not cacheable, so we never see such LookupResults here. | 1416 // These are not cacheable, so we never see such LookupResults here. |
1431 ASSERT(!lookup->IsHandler()); | 1417 ASSERT(!lookup->IsHandler()); |
1432 | 1418 |
1433 // If the property has a non-field type allowing map transitions | 1419 // If the property has a non-field type allowing map transitions |
1434 // where there is extra room in the object, we leave the IC in its | 1420 // where there is extra room in the object, we leave the IC in its |
1435 // current state. | 1421 // current state. |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1524 if (target() != *code) { | 1510 if (target() != *code) { |
1525 // We are transitioning from monomorphic to megamorphic case. | 1511 // We are transitioning from monomorphic to megamorphic case. |
1526 // Place the current monomorphic stub and stub compiled for | 1512 // Place the current monomorphic stub and stub compiled for |
1527 // the receiver into stub cache. | 1513 // the receiver into stub cache. |
1528 Map* map = target()->FindFirstMap(); | 1514 Map* map = target()->FindFirstMap(); |
1529 if (map != NULL) { | 1515 if (map != NULL) { |
1530 isolate()->stub_cache()->Set(*name, map, target()); | 1516 isolate()->stub_cache()->Set(*name, map, target()); |
1531 } | 1517 } |
1532 isolate()->stub_cache()->Set(*name, receiver->map(), *code); | 1518 isolate()->stub_cache()->Set(*name, receiver->map(), *code); |
1533 set_target((strict_mode == kStrictMode) | 1519 set_target((strict_mode == kStrictMode) |
1534 ? megamorphic_stub_strict() | 1520 ? *megamorphic_stub_strict() |
1535 : *megamorphic_stub()); | 1521 : *megamorphic_stub()); |
1536 } | 1522 } |
1537 break; | 1523 break; |
1538 case MEGAMORPHIC: | 1524 case MEGAMORPHIC: |
1539 // Update the stub cache. | 1525 // Update the stub cache. |
1540 isolate()->stub_cache()->Set(*name, receiver->map(), *code); | 1526 isolate()->stub_cache()->Set(*name, receiver->map(), *code); |
1541 break; | 1527 break; |
1542 case DEBUG_STUB: | 1528 case DEBUG_STUB: |
1543 break; | 1529 break; |
1544 case POLYMORPHIC: | 1530 case POLYMORPHIC: |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1884 Handle<Object> object, | 1870 Handle<Object> object, |
1885 Handle<Object> key, | 1871 Handle<Object> key, |
1886 Handle<Object> value, | 1872 Handle<Object> value, |
1887 ICMissMode miss_mode) { | 1873 ICMissMode miss_mode) { |
1888 // Check for values that can be converted into a symbol directly or | 1874 // Check for values that can be converted into a symbol directly or |
1889 // is representable as a smi. | 1875 // is representable as a smi. |
1890 key = TryConvertKey(key, isolate()); | 1876 key = TryConvertKey(key, isolate()); |
1891 | 1877 |
1892 if (key->IsSymbol()) { | 1878 if (key->IsSymbol()) { |
1893 Handle<String> name = Handle<String>::cast(key); | 1879 Handle<String> name = Handle<String>::cast(key); |
1894 | 1880 return IC::Store(state, |
1895 // Handle proxies. | 1881 strict_mode, |
1896 if (object->IsJSProxy()) { | 1882 object, |
1897 return JSProxy::cast(*object)->SetProperty( | 1883 name, |
1898 *name, *value, NONE, strict_mode); | 1884 value, |
1899 } | 1885 JSReceiver::MAY_BE_STORE_FROM_KEYED); |
1900 | |
1901 // If the object is undefined or null it's illegal to try to set any | |
1902 // properties on it; throw a TypeError in that case. | |
1903 if (object->IsUndefined() || object->IsNull()) { | |
1904 return TypeError("non_object_property_store", object, name); | |
1905 } | |
1906 | |
1907 // Ignore stores where the receiver is not a JSObject. | |
1908 if (!object->IsJSObject()) return *value; | |
1909 Handle<JSObject> receiver = Handle<JSObject>::cast(object); | |
1910 | |
1911 // Check if the given name is an array index. | |
1912 uint32_t index; | |
1913 if (name->AsArrayIndex(&index)) { | |
1914 Handle<Object> result = | |
1915 JSObject::SetElement(receiver, index, value, NONE, strict_mode); | |
1916 RETURN_IF_EMPTY_HANDLE(isolate(), result); | |
1917 return *value; | |
1918 } | |
1919 | |
1920 // Update inline cache and stub cache. | |
1921 if (FLAG_use_ic && !receiver->IsJSGlobalProxy() && | |
1922 !(FLAG_harmony_observation && receiver->map()->is_observed())) { | |
1923 LookupResult lookup(isolate()); | |
1924 if (LookupForWrite(receiver, name, &lookup)) { | |
1925 UpdateCaches(&lookup, state, strict_mode, receiver, name, value); | |
1926 } | |
1927 } | |
1928 | |
1929 // Set the property. | |
1930 return receiver->SetProperty(*name, *value, NONE, strict_mode); | |
1931 } | 1886 } |
1932 | 1887 |
1933 // Do not use ICs for objects that require access checks (including | 1888 // Do not use ICs for objects that require access checks (including |
1934 // the global object), or are observed. | 1889 // the global object), or are observed. |
1935 bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded() && | 1890 bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded() && |
1936 !(FLAG_harmony_observation && object->IsJSObject() && | 1891 !(FLAG_harmony_observation && object->IsJSObject() && |
1937 JSObject::cast(*object)->map()->is_observed()); | 1892 JSObject::cast(*object)->map()->is_observed()); |
1938 ASSERT(!(use_ic && object->IsJSGlobalProxy())); | 1893 ASSERT(!(use_ic && object->IsJSGlobalProxy())); |
1939 | 1894 |
1940 if (use_ic) { | 1895 if (use_ic) { |
(...skipping 18 matching lines...) Expand all Loading... |
1959 } | 1914 } |
1960 | 1915 |
1961 TRACE_IC("KeyedStoreIC", key, state, target()); | 1916 TRACE_IC("KeyedStoreIC", key, state, target()); |
1962 | 1917 |
1963 // Set the property. | 1918 // Set the property. |
1964 return Runtime::SetObjectProperty( | 1919 return Runtime::SetObjectProperty( |
1965 isolate(), object , key, value, NONE, strict_mode); | 1920 isolate(), object , key, value, NONE, strict_mode); |
1966 } | 1921 } |
1967 | 1922 |
1968 | 1923 |
1969 void KeyedStoreIC::UpdateCaches(LookupResult* lookup, | 1924 void KeyedStoreIC::UpdateStoreCaches(LookupResult* lookup, |
1970 State state, | 1925 State state, |
1971 StrictModeFlag strict_mode, | 1926 StrictModeFlag strict_mode, |
1972 Handle<JSObject> receiver, | 1927 Handle<JSObject> receiver, |
1973 Handle<String> name, | 1928 Handle<String> name, |
1974 Handle<Object> value) { | 1929 Handle<Object> value) { |
1975 ASSERT(!receiver->IsJSGlobalProxy()); | 1930 ASSERT(!receiver->IsJSGlobalProxy()); |
1976 ASSERT(StoreICableLookup(lookup)); | 1931 ASSERT(StoreICableLookup(lookup)); |
1977 ASSERT(lookup->IsFound()); | 1932 ASSERT(lookup->IsFound()); |
1978 | 1933 |
1979 // These are not cacheable, so we never see such LookupResults here. | 1934 // These are not cacheable, so we never see such LookupResults here. |
1980 ASSERT(!lookup->IsHandler()); | 1935 ASSERT(!lookup->IsHandler()); |
1981 | 1936 |
1982 // If the property has a non-field type allowing map transitions | 1937 // If the property has a non-field type allowing map transitions |
1983 // where there is extra room in the object, we leave the IC in its | 1938 // where there is extra room in the object, we leave the IC in its |
1984 // current state. | 1939 // current state. |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2797 #undef ADDR | 2752 #undef ADDR |
2798 }; | 2753 }; |
2799 | 2754 |
2800 | 2755 |
2801 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2756 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
2802 return IC_utilities[id]; | 2757 return IC_utilities[id]; |
2803 } | 2758 } |
2804 | 2759 |
2805 | 2760 |
2806 } } // namespace v8::internal | 2761 } } // namespace v8::internal |
OLD | NEW |