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

Side by Side Diff: src/ic.cc

Issue 12036017: Merge Store from Keyed and Named store. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 11 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ic.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/ic.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698