Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1191 } | 1191 } |
| 1192 | 1192 |
| 1193 | 1193 |
| 1194 void HGraphBuilder::AddIncrementCounter(StatsCounter* counter) { | 1194 void HGraphBuilder::AddIncrementCounter(StatsCounter* counter) { |
| 1195 if (FLAG_native_code_counters && counter->Enabled()) { | 1195 if (FLAG_native_code_counters && counter->Enabled()) { |
| 1196 HValue* reference = Add<HConstant>(ExternalReference(counter)); | 1196 HValue* reference = Add<HConstant>(ExternalReference(counter)); |
| 1197 HValue* old_value = Add<HLoadNamedField>( | 1197 HValue* old_value = Add<HLoadNamedField>( |
| 1198 reference, static_cast<HValue*>(NULL), HObjectAccess::ForCounter()); | 1198 reference, static_cast<HValue*>(NULL), HObjectAccess::ForCounter()); |
| 1199 HValue* new_value = AddUncasted<HAdd>(old_value, graph()->GetConstant1()); | 1199 HValue* new_value = AddUncasted<HAdd>(old_value, graph()->GetConstant1()); |
| 1200 new_value->ClearFlag(HValue::kCanOverflow); // Ignore counter overflow | 1200 new_value->ClearFlag(HValue::kCanOverflow); // Ignore counter overflow |
| 1201 Add<HStoreNamedField>(reference, HObjectAccess::ForCounter(), | 1201 Add<HStoreNamedField>(reference, HObjectAccess::ForCounter(), |
|
Toon Verwaest
2014/02/03 18:08:28
join lines
Igor Sheludko
2014/02/03 19:17:58
Done.
| |
| 1202 new_value, STORE_TO_INITIALIZED_ENTRY); | 1202 new_value); |
| 1203 } | 1203 } |
| 1204 } | 1204 } |
| 1205 | 1205 |
| 1206 | 1206 |
| 1207 void HGraphBuilder::AddSimulate(BailoutId id, | 1207 void HGraphBuilder::AddSimulate(BailoutId id, |
| 1208 RemovableSimulate removable) { | 1208 RemovableSimulate removable) { |
| 1209 ASSERT(current_block() != NULL); | 1209 ASSERT(current_block() != NULL); |
| 1210 ASSERT(!graph()->IsInsideNoSideEffectsScope()); | 1210 ASSERT(!graph()->IsInsideNoSideEffectsScope()); |
| 1211 current_block()->AddNewSimulate(id, position_, removable); | 1211 current_block()->AddNewSimulate(id, position_, removable); |
| 1212 } | 1212 } |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1329 environment()->Push(new_elements); | 1329 environment()->Push(new_elements); |
| 1330 capacity_checker.Else(); | 1330 capacity_checker.Else(); |
| 1331 | 1331 |
| 1332 environment()->Push(elements); | 1332 environment()->Push(elements); |
| 1333 capacity_checker.End(); | 1333 capacity_checker.End(); |
| 1334 | 1334 |
| 1335 if (is_js_array) { | 1335 if (is_js_array) { |
| 1336 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1()); | 1336 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1()); |
| 1337 new_length->ClearFlag(HValue::kCanOverflow); | 1337 new_length->ClearFlag(HValue::kCanOverflow); |
| 1338 | 1338 |
| 1339 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind), | 1339 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind), |
|
Toon Verwaest
2014/02/03 18:08:28
join lines
Igor Sheludko
2014/02/03 19:17:58
It will be too long line.
| |
| 1340 new_length, INITIALIZING_STORE); | 1340 new_length); |
| 1341 } | 1341 } |
| 1342 | 1342 |
| 1343 if (is_store && kind == FAST_SMI_ELEMENTS) { | 1343 if (is_store && kind == FAST_SMI_ELEMENTS) { |
| 1344 HValue* checked_elements = environment()->Top(); | 1344 HValue* checked_elements = environment()->Top(); |
| 1345 | 1345 |
| 1346 // Write zero to ensure that the new element is initialized with some smi. | 1346 // Write zero to ensure that the new element is initialized with some smi. |
| 1347 Add<HStoreKeyed>(checked_elements, key, graph()->GetConstant0(), kind, | 1347 Add<HStoreKeyed>(checked_elements, key, graph()->GetConstant0(), kind); |
| 1348 INITIALIZING_STORE); | |
| 1349 } | 1348 } |
| 1350 | 1349 |
| 1351 length_checker.Else(); | 1350 length_checker.Else(); |
| 1352 Add<HBoundsCheck>(key, length); | 1351 Add<HBoundsCheck>(key, length); |
| 1353 | 1352 |
| 1354 environment()->Push(elements); | 1353 environment()->Push(elements); |
| 1355 length_checker.End(); | 1354 length_checker.End(); |
| 1356 | 1355 |
| 1357 return environment()->Pop(); | 1356 return environment()->Pop(); |
| 1358 } | 1357 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1416 ? Add<HLoadNamedField>(object, static_cast<HValue*>(NULL), | 1415 ? Add<HLoadNamedField>(object, static_cast<HValue*>(NULL), |
| 1417 HObjectAccess::ForArrayLength(from_kind)) | 1416 HObjectAccess::ForArrayLength(from_kind)) |
| 1418 : elements_length; | 1417 : elements_length; |
| 1419 | 1418 |
| 1420 BuildGrowElementsCapacity(object, elements, from_kind, to_kind, | 1419 BuildGrowElementsCapacity(object, elements, from_kind, to_kind, |
| 1421 array_length, elements_length); | 1420 array_length, elements_length); |
| 1422 | 1421 |
| 1423 if_builder.End(); | 1422 if_builder.End(); |
| 1424 } | 1423 } |
| 1425 | 1424 |
| 1426 Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map, | 1425 Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map); |
| 1427 INITIALIZING_STORE); | |
| 1428 } | 1426 } |
| 1429 | 1427 |
| 1430 | 1428 |
| 1431 HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoadHelper( | 1429 HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoadHelper( |
| 1432 HValue* elements, | 1430 HValue* elements, |
| 1433 HValue* key, | 1431 HValue* key, |
| 1434 HValue* hash, | 1432 HValue* hash, |
| 1435 HValue* mask, | 1433 HValue* mask, |
| 1436 int current_probe) { | 1434 int current_probe) { |
| 1437 if (current_probe == kNumberDictionaryProbes) { | 1435 if (current_probe == kNumberDictionaryProbes) { |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1878 if_onebyte.Else(); | 1876 if_onebyte.Else(); |
| 1879 { | 1877 { |
| 1880 // We can safely skip the write barrier for storing the map here. | 1878 // We can safely skip the write barrier for storing the map here. |
| 1881 Handle<Map> map = isolate()->factory()->cons_string_map(); | 1879 Handle<Map> map = isolate()->factory()->cons_string_map(); |
| 1882 AddStoreMapConstantNoWriteBarrier(result, map); | 1880 AddStoreMapConstantNoWriteBarrier(result, map); |
| 1883 } | 1881 } |
| 1884 if_onebyte.End(); | 1882 if_onebyte.End(); |
| 1885 | 1883 |
| 1886 // Initialize the cons string fields. | 1884 // Initialize the cons string fields. |
| 1887 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), | 1885 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), |
| 1888 Add<HConstant>(String::kEmptyHashField), | 1886 Add<HConstant>(String::kEmptyHashField)); |
| 1889 INITIALIZING_STORE); | 1887 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); |
| 1890 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length, | 1888 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringFirst(), left); |
| 1891 INITIALIZING_STORE); | 1889 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringSecond(), right); |
| 1892 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringFirst(), left, | |
| 1893 INITIALIZING_STORE); | |
| 1894 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringSecond(), right, | |
| 1895 INITIALIZING_STORE); | |
| 1896 | 1890 |
| 1897 // Count the native string addition. | 1891 // Count the native string addition. |
| 1898 AddIncrementCounter(isolate()->counters()->string_add_native()); | 1892 AddIncrementCounter(isolate()->counters()->string_add_native()); |
| 1899 | 1893 |
| 1900 return result; | 1894 return result; |
| 1901 } | 1895 } |
| 1902 | 1896 |
| 1903 | 1897 |
| 1904 void HGraphBuilder::BuildCopySeqStringChars(HValue* src, | 1898 void HGraphBuilder::BuildCopySeqStringChars(HValue* src, |
| 1905 HValue* src_offset, | 1899 HValue* src_offset, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2034 // Allocate the string object. HAllocate does not care whether we pass | 2028 // Allocate the string object. HAllocate does not care whether we pass |
| 2035 // STRING_TYPE or ASCII_STRING_TYPE here, so we just use STRING_TYPE here. | 2029 // STRING_TYPE or ASCII_STRING_TYPE here, so we just use STRING_TYPE here. |
| 2036 HAllocate* result = BuildAllocate( | 2030 HAllocate* result = BuildAllocate( |
| 2037 size, HType::String(), STRING_TYPE, allocation_mode); | 2031 size, HType::String(), STRING_TYPE, allocation_mode); |
| 2038 | 2032 |
| 2039 // We can safely skip the write barrier for storing map here. | 2033 // We can safely skip the write barrier for storing map here. |
| 2040 AddStoreMapNoWriteBarrier(result, map); | 2034 AddStoreMapNoWriteBarrier(result, map); |
| 2041 | 2035 |
| 2042 // Initialize the string fields. | 2036 // Initialize the string fields. |
| 2043 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), | 2037 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), |
| 2044 Add<HConstant>(String::kEmptyHashField), | 2038 Add<HConstant>(String::kEmptyHashField)); |
| 2045 INITIALIZING_STORE); | 2039 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); |
| 2046 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length, | |
| 2047 INITIALIZING_STORE); | |
| 2048 | 2040 |
| 2049 // Copy characters to the result string. | 2041 // Copy characters to the result string. |
| 2050 IfBuilder if_twobyte(this); | 2042 IfBuilder if_twobyte(this); |
| 2051 if_twobyte.If<HCompareObjectEqAndBranch>(map, string_map); | 2043 if_twobyte.If<HCompareObjectEqAndBranch>(map, string_map); |
| 2052 if_twobyte.Then(); | 2044 if_twobyte.Then(); |
| 2053 { | 2045 { |
| 2054 // Copy characters from the left string. | 2046 // Copy characters from the left string. |
| 2055 BuildCopySeqStringChars( | 2047 BuildCopySeqStringChars( |
| 2056 left, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, | 2048 left, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, |
| 2057 result, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, | 2049 result, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2338 | 2330 |
| 2339 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, | 2331 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, |
| 2340 ElementsKind kind, | 2332 ElementsKind kind, |
| 2341 HValue* capacity) { | 2333 HValue* capacity) { |
| 2342 Factory* factory = isolate()->factory(); | 2334 Factory* factory = isolate()->factory(); |
| 2343 Handle<Map> map = IsFastDoubleElementsKind(kind) | 2335 Handle<Map> map = IsFastDoubleElementsKind(kind) |
| 2344 ? factory->fixed_double_array_map() | 2336 ? factory->fixed_double_array_map() |
| 2345 : factory->fixed_array_map(); | 2337 : factory->fixed_array_map(); |
| 2346 | 2338 |
| 2347 AddStoreMapConstant(elements, map); | 2339 AddStoreMapConstant(elements, map); |
| 2348 Add<HStoreNamedField>(elements, HObjectAccess::ForFixedArrayLength(), | 2340 Add<HStoreNamedField>(elements, HObjectAccess::ForFixedArrayLength(), |
|
Toon Verwaest
2014/02/03 18:08:28
join lines
Igor Sheludko
2014/02/03 19:17:58
Too long line.
| |
| 2349 capacity, INITIALIZING_STORE); | 2341 capacity); |
| 2350 } | 2342 } |
| 2351 | 2343 |
| 2352 | 2344 |
| 2353 HValue* HGraphBuilder::BuildAllocateElementsAndInitializeElementsHeader( | 2345 HValue* HGraphBuilder::BuildAllocateElementsAndInitializeElementsHeader( |
| 2354 ElementsKind kind, | 2346 ElementsKind kind, |
| 2355 HValue* capacity) { | 2347 HValue* capacity) { |
| 2356 // The HForceRepresentation is to prevent possible deopt on int-smi | 2348 // The HForceRepresentation is to prevent possible deopt on int-smi |
| 2357 // conversion after allocation but before the new object fields are set. | 2349 // conversion after allocation but before the new object fields are set. |
| 2358 capacity = AddUncasted<HForceRepresentation>(capacity, Representation::Smi()); | 2350 capacity = AddUncasted<HForceRepresentation>(capacity, Representation::Smi()); |
| 2359 HValue* new_elements = BuildAllocateElements(kind, capacity); | 2351 HValue* new_elements = BuildAllocateElements(kind, capacity); |
| 2360 BuildInitializeElementsHeader(new_elements, kind, capacity); | 2352 BuildInitializeElementsHeader(new_elements, kind, capacity); |
| 2361 return new_elements; | 2353 return new_elements; |
| 2362 } | 2354 } |
| 2363 | 2355 |
| 2364 | 2356 |
| 2365 HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, | 2357 HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, |
| 2366 HValue* array_map, | 2358 HValue* array_map, |
| 2367 AllocationSiteMode mode, | 2359 AllocationSiteMode mode, |
| 2368 ElementsKind elements_kind, | 2360 ElementsKind elements_kind, |
| 2369 HValue* allocation_site_payload, | 2361 HValue* allocation_site_payload, |
| 2370 HValue* length_field) { | 2362 HValue* length_field) { |
| 2371 | 2363 |
| 2372 Add<HStoreNamedField>(array, HObjectAccess::ForMap(), array_map, | 2364 Add<HStoreNamedField>(array, HObjectAccess::ForMap(), array_map); |
| 2373 INITIALIZING_STORE); | |
| 2374 | 2365 |
| 2375 HConstant* empty_fixed_array = | 2366 HConstant* empty_fixed_array = |
| 2376 Add<HConstant>(isolate()->factory()->empty_fixed_array()); | 2367 Add<HConstant>(isolate()->factory()->empty_fixed_array()); |
| 2377 | 2368 |
| 2378 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); | 2369 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); |
| 2379 Add<HStoreNamedField>(array, access, empty_fixed_array, INITIALIZING_STORE); | 2370 Add<HStoreNamedField>(array, access, empty_fixed_array); |
| 2380 Add<HStoreNamedField>(array, HObjectAccess::ForArrayLength(elements_kind), | 2371 Add<HStoreNamedField>(array, HObjectAccess::ForArrayLength(elements_kind), |
| 2381 length_field, INITIALIZING_STORE); | 2372 length_field); |
| 2382 | 2373 |
| 2383 if (mode == TRACK_ALLOCATION_SITE) { | 2374 if (mode == TRACK_ALLOCATION_SITE) { |
| 2384 BuildCreateAllocationMemento( | 2375 BuildCreateAllocationMemento( |
| 2385 array, Add<HConstant>(JSArray::kSize), allocation_site_payload); | 2376 array, Add<HConstant>(JSArray::kSize), allocation_site_payload); |
| 2386 } | 2377 } |
| 2387 | 2378 |
| 2388 int elements_location = JSArray::kSize; | 2379 int elements_location = JSArray::kSize; |
| 2389 if (mode == TRACK_ALLOCATION_SITE) { | 2380 if (mode == TRACK_ALLOCATION_SITE) { |
| 2390 elements_location += AllocationMemento::kSize; | 2381 elements_location += AllocationMemento::kSize; |
| 2391 } | 2382 } |
| 2392 | 2383 |
| 2393 HInnerAllocatedObject* elements = Add<HInnerAllocatedObject>( | 2384 HInnerAllocatedObject* elements = Add<HInnerAllocatedObject>( |
| 2394 array, Add<HConstant>(elements_location)); | 2385 array, Add<HConstant>(elements_location)); |
| 2395 Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements, | 2386 Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements); |
| 2396 INITIALIZING_STORE); | |
| 2397 return elements; | 2387 return elements; |
| 2398 } | 2388 } |
| 2399 | 2389 |
| 2400 | 2390 |
| 2401 HInstruction* HGraphBuilder::AddElementAccess( | 2391 HInstruction* HGraphBuilder::AddElementAccess( |
| 2402 HValue* elements, | 2392 HValue* elements, |
| 2403 HValue* checked_key, | 2393 HValue* checked_key, |
| 2404 HValue* val, | 2394 HValue* val, |
| 2405 HValue* dependency, | 2395 HValue* dependency, |
| 2406 ElementsKind elements_kind, | 2396 ElementsKind elements_kind, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2477 HValue* new_capacity) { | 2467 HValue* new_capacity) { |
| 2478 BuildNewSpaceArrayCheck(new_capacity, new_kind); | 2468 BuildNewSpaceArrayCheck(new_capacity, new_kind); |
| 2479 | 2469 |
| 2480 HValue* new_elements = BuildAllocateElementsAndInitializeElementsHeader( | 2470 HValue* new_elements = BuildAllocateElementsAndInitializeElementsHeader( |
| 2481 new_kind, new_capacity); | 2471 new_kind, new_capacity); |
| 2482 | 2472 |
| 2483 BuildCopyElements(elements, kind, | 2473 BuildCopyElements(elements, kind, |
| 2484 new_elements, new_kind, | 2474 new_elements, new_kind, |
| 2485 length, new_capacity); | 2475 length, new_capacity); |
| 2486 | 2476 |
| 2487 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), | 2477 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
|
Toon Verwaest
2014/02/03 18:08:28
join lines
Igor Sheludko
2014/02/03 19:17:58
Too long line.
| |
| 2488 new_elements, INITIALIZING_STORE); | 2478 new_elements); |
| 2489 | 2479 |
| 2490 return new_elements; | 2480 return new_elements; |
| 2491 } | 2481 } |
| 2492 | 2482 |
| 2493 | 2483 |
| 2494 void HGraphBuilder::BuildFillElementsWithHole(HValue* elements, | 2484 void HGraphBuilder::BuildFillElementsWithHole(HValue* elements, |
| 2495 ElementsKind elements_kind, | 2485 ElementsKind elements_kind, |
| 2496 HValue* from, | 2486 HValue* from, |
| 2497 HValue* to) { | 2487 HValue* to) { |
| 2498 // Fast elements kinds need to be initialized in case statements below cause | 2488 // Fast elements kinds need to be initialized in case statements below cause |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 2519 | 2509 |
| 2520 // Since we're about to store a hole value, the store instruction below must | 2510 // Since we're about to store a hole value, the store instruction below must |
| 2521 // assume an elements kind that supports heap object values. | 2511 // assume an elements kind that supports heap object values. |
| 2522 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | 2512 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| 2523 elements_kind = FAST_HOLEY_ELEMENTS; | 2513 elements_kind = FAST_HOLEY_ELEMENTS; |
| 2524 } | 2514 } |
| 2525 | 2515 |
| 2526 if (initial_capacity >= 0) { | 2516 if (initial_capacity >= 0) { |
| 2527 for (int i = 0; i < initial_capacity; i++) { | 2517 for (int i = 0; i < initial_capacity; i++) { |
| 2528 HInstruction* key = Add<HConstant>(i); | 2518 HInstruction* key = Add<HConstant>(i); |
| 2529 Add<HStoreKeyed>(elements, key, hole, elements_kind, | 2519 Add<HStoreKeyed>(elements, key, hole, elements_kind); |
| 2530 PREINITIALIZING_STORE); | |
| 2531 } | 2520 } |
| 2532 } else { | 2521 } else { |
| 2533 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); | 2522 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); |
| 2534 | 2523 |
| 2535 HValue* key = builder.BeginBody(from, to, Token::LT); | 2524 HValue* key = builder.BeginBody(from, to, Token::LT); |
| 2536 | 2525 |
| 2537 Add<HStoreKeyed>(elements, key, hole, elements_kind, PREINITIALIZING_STORE); | 2526 Add<HStoreKeyed>(elements, key, hole, elements_kind); |
| 2538 | 2527 |
| 2539 builder.EndBody(); | 2528 builder.EndBody(); |
| 2540 } | 2529 } |
| 2541 } | 2530 } |
| 2542 | 2531 |
| 2543 | 2532 |
| 2544 void HGraphBuilder::BuildCopyElements(HValue* from_elements, | 2533 void HGraphBuilder::BuildCopyElements(HValue* from_elements, |
| 2545 ElementsKind from_elements_kind, | 2534 ElementsKind from_elements_kind, |
| 2546 HValue* to_elements, | 2535 HValue* to_elements, |
| 2547 ElementsKind to_elements_kind, | 2536 ElementsKind to_elements_kind, |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 2573 ? FAST_HOLEY_ELEMENTS : to_elements_kind; | 2562 ? FAST_HOLEY_ELEMENTS : to_elements_kind; |
| 2574 | 2563 |
| 2575 if (IsHoleyElementsKind(from_elements_kind) && | 2564 if (IsHoleyElementsKind(from_elements_kind) && |
| 2576 from_elements_kind != to_elements_kind) { | 2565 from_elements_kind != to_elements_kind) { |
| 2577 IfBuilder if_hole(this); | 2566 IfBuilder if_hole(this); |
| 2578 if_hole.If<HCompareHoleAndBranch>(element); | 2567 if_hole.If<HCompareHoleAndBranch>(element); |
| 2579 if_hole.Then(); | 2568 if_hole.Then(); |
| 2580 HConstant* hole_constant = IsFastDoubleElementsKind(to_elements_kind) | 2569 HConstant* hole_constant = IsFastDoubleElementsKind(to_elements_kind) |
| 2581 ? Add<HConstant>(FixedDoubleArray::hole_nan_as_double()) | 2570 ? Add<HConstant>(FixedDoubleArray::hole_nan_as_double()) |
| 2582 : graph()->GetConstantHole(); | 2571 : graph()->GetConstantHole(); |
| 2583 Add<HStoreKeyed>(to_elements, key, hole_constant, kind, | 2572 Add<HStoreKeyed>(to_elements, key, hole_constant, kind); |
| 2584 PREINITIALIZING_STORE); | |
| 2585 if_hole.Else(); | 2573 if_hole.Else(); |
| 2586 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind, | 2574 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); |
| 2587 INITIALIZING_STORE); | |
| 2588 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 2575 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
| 2589 if_hole.End(); | 2576 if_hole.End(); |
| 2590 } else { | 2577 } else { |
| 2591 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind, | 2578 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); |
| 2592 INITIALIZING_STORE); | |
| 2593 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 2579 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
| 2594 } | 2580 } |
| 2595 | 2581 |
| 2596 builder.EndBody(); | 2582 builder.EndBody(); |
| 2597 | 2583 |
| 2598 if (!pre_fill_with_holes && length != capacity) { | 2584 if (!pre_fill_with_holes && length != capacity) { |
| 2599 // Fill unused capacity with the hole. | 2585 // Fill unused capacity with the hole. |
| 2600 BuildFillElementsWithHole(to_elements, to_elements_kind, | 2586 BuildFillElementsWithHole(to_elements, to_elements_kind, |
| 2601 key, capacity); | 2587 key, capacity); |
| 2602 } | 2588 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 2621 HType::JSObject(), | 2607 HType::JSObject(), |
| 2622 NOT_TENURED, | 2608 NOT_TENURED, |
| 2623 JS_OBJECT_TYPE); | 2609 JS_OBJECT_TYPE); |
| 2624 | 2610 |
| 2625 // Copy the JS array part. | 2611 // Copy the JS array part. |
| 2626 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { | 2612 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { |
| 2627 if ((i != JSArray::kElementsOffset) || (length == 0)) { | 2613 if ((i != JSArray::kElementsOffset) || (length == 0)) { |
| 2628 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); | 2614 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); |
| 2629 Add<HStoreNamedField>( | 2615 Add<HStoreNamedField>( |
| 2630 object, access, Add<HLoadNamedField>( | 2616 object, access, Add<HLoadNamedField>( |
| 2631 boilerplate, static_cast<HValue*>(NULL), access), | 2617 boilerplate, static_cast<HValue*>(NULL), access)); |
| 2632 INITIALIZING_STORE); | |
| 2633 } | 2618 } |
| 2634 } | 2619 } |
| 2635 | 2620 |
| 2636 // Create an allocation site info if requested. | 2621 // Create an allocation site info if requested. |
| 2637 if (mode == TRACK_ALLOCATION_SITE) { | 2622 if (mode == TRACK_ALLOCATION_SITE) { |
| 2638 BuildCreateAllocationMemento( | 2623 BuildCreateAllocationMemento( |
| 2639 object, Add<HConstant>(JSArray::kSize), allocation_site); | 2624 object, Add<HConstant>(JSArray::kSize), allocation_site); |
| 2640 } | 2625 } |
| 2641 | 2626 |
| 2642 if (length > 0) { | 2627 if (length > 0) { |
| 2643 HValue* boilerplate_elements = AddLoadElements(boilerplate); | 2628 HValue* boilerplate_elements = AddLoadElements(boilerplate); |
| 2644 HValue* object_elements; | 2629 HValue* object_elements; |
| 2645 if (IsFastDoubleElementsKind(kind)) { | 2630 if (IsFastDoubleElementsKind(kind)) { |
| 2646 HValue* elems_size = Add<HConstant>(FixedDoubleArray::SizeFor(length)); | 2631 HValue* elems_size = Add<HConstant>(FixedDoubleArray::SizeFor(length)); |
| 2647 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), | 2632 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), |
| 2648 NOT_TENURED, FIXED_DOUBLE_ARRAY_TYPE); | 2633 NOT_TENURED, FIXED_DOUBLE_ARRAY_TYPE); |
| 2649 } else { | 2634 } else { |
| 2650 HValue* elems_size = Add<HConstant>(FixedArray::SizeFor(length)); | 2635 HValue* elems_size = Add<HConstant>(FixedArray::SizeFor(length)); |
| 2651 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), | 2636 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), |
| 2652 NOT_TENURED, FIXED_ARRAY_TYPE); | 2637 NOT_TENURED, FIXED_ARRAY_TYPE); |
| 2653 } | 2638 } |
| 2654 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), | 2639 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| 2655 object_elements, INITIALIZING_STORE); | 2640 object_elements); |
| 2656 | 2641 |
| 2657 // Copy the elements array header. | 2642 // Copy the elements array header. |
| 2658 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { | 2643 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { |
| 2659 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i); | 2644 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i); |
| 2660 Add<HStoreNamedField>( | 2645 Add<HStoreNamedField>( |
| 2661 object_elements, access, Add<HLoadNamedField>( | 2646 object_elements, access, Add<HLoadNamedField>( |
| 2662 boilerplate_elements, static_cast<HValue*>(NULL), access), | 2647 boilerplate_elements, static_cast<HValue*>(NULL), access)); |
| 2663 INITIALIZING_STORE); | |
| 2664 } | 2648 } |
| 2665 | 2649 |
| 2666 // Copy the elements array contents. | 2650 // Copy the elements array contents. |
| 2667 // TODO(mstarzinger): Teach HGraphBuilder::BuildCopyElements to unfold | 2651 // TODO(mstarzinger): Teach HGraphBuilder::BuildCopyElements to unfold |
| 2668 // copying loops with constant length up to a given boundary and use this | 2652 // copying loops with constant length up to a given boundary and use this |
| 2669 // helper here instead. | 2653 // helper here instead. |
| 2670 for (int i = 0; i < length; i++) { | 2654 for (int i = 0; i < length; i++) { |
| 2671 HValue* key_constant = Add<HConstant>(i); | 2655 HValue* key_constant = Add<HConstant>(i); |
| 2672 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant, | 2656 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant, |
| 2673 static_cast<HValue*>(NULL), kind); | 2657 static_cast<HValue*>(NULL), kind); |
| 2674 Add<HStoreKeyed>(object_elements, key_constant, value, kind, | 2658 Add<HStoreKeyed>(object_elements, key_constant, value, kind); |
| 2675 INITIALIZING_STORE); | |
| 2676 } | 2659 } |
| 2677 } | 2660 } |
| 2678 | 2661 |
| 2679 return object; | 2662 return object; |
| 2680 } | 2663 } |
| 2681 | 2664 |
| 2682 | 2665 |
| 2683 void HGraphBuilder::BuildCompareNil( | 2666 void HGraphBuilder::BuildCompareNil( |
| 2684 HValue* value, | 2667 HValue* value, |
| 2685 Type* type, | 2668 Type* type, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2735 void HGraphBuilder::BuildCreateAllocationMemento( | 2718 void HGraphBuilder::BuildCreateAllocationMemento( |
| 2736 HValue* previous_object, | 2719 HValue* previous_object, |
| 2737 HValue* previous_object_size, | 2720 HValue* previous_object_size, |
| 2738 HValue* allocation_site) { | 2721 HValue* allocation_site) { |
| 2739 ASSERT(allocation_site != NULL); | 2722 ASSERT(allocation_site != NULL); |
| 2740 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>( | 2723 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>( |
| 2741 previous_object, previous_object_size); | 2724 previous_object, previous_object_size); |
| 2742 AddStoreMapConstant( | 2725 AddStoreMapConstant( |
| 2743 allocation_memento, isolate()->factory()->allocation_memento_map()); | 2726 allocation_memento, isolate()->factory()->allocation_memento_map()); |
| 2744 Add<HStoreNamedField>( | 2727 Add<HStoreNamedField>( |
| 2745 allocation_memento, HObjectAccess::ForAllocationMementoSite(), | 2728 allocation_memento, |
| 2746 allocation_site, INITIALIZING_STORE); | 2729 HObjectAccess::ForAllocationMementoSite(), |
| 2730 allocation_site); | |
| 2747 if (FLAG_allocation_site_pretenuring) { | 2731 if (FLAG_allocation_site_pretenuring) { |
| 2748 HValue* memento_create_count = Add<HLoadNamedField>( | 2732 HValue* memento_create_count = Add<HLoadNamedField>( |
| 2749 allocation_site, static_cast<HValue*>(NULL), | 2733 allocation_site, static_cast<HValue*>(NULL), |
| 2750 HObjectAccess::ForAllocationSiteOffset( | 2734 HObjectAccess::ForAllocationSiteOffset( |
| 2751 AllocationSite::kPretenureCreateCountOffset)); | 2735 AllocationSite::kPretenureCreateCountOffset)); |
| 2752 memento_create_count = AddUncasted<HAdd>( | 2736 memento_create_count = AddUncasted<HAdd>( |
| 2753 memento_create_count, graph()->GetConstant1()); | 2737 memento_create_count, graph()->GetConstant1()); |
| 2754 // This smi value is reset to zero after every gc, overflow isn't a problem | 2738 // This smi value is reset to zero after every gc, overflow isn't a problem |
| 2755 // since the counter is bounded by the new space size. | 2739 // since the counter is bounded by the new space size. |
| 2756 memento_create_count->ClearFlag(HValue::kCanOverflow); | 2740 memento_create_count->ClearFlag(HValue::kCanOverflow); |
| 2757 HStoreNamedField* store = Add<HStoreNamedField>( | 2741 HStoreNamedField* store = Add<HStoreNamedField>( |
| 2758 allocation_site, HObjectAccess::ForAllocationSiteOffset( | 2742 allocation_site, HObjectAccess::ForAllocationSiteOffset( |
| 2759 AllocationSite::kPretenureCreateCountOffset), memento_create_count, | 2743 AllocationSite::kPretenureCreateCountOffset), memento_create_count); |
| 2760 INITIALIZING_STORE); | |
| 2761 // No write barrier needed to store a smi. | 2744 // No write barrier needed to store a smi. |
| 2762 store->SkipWriteBarrier(); | 2745 store->SkipWriteBarrier(); |
| 2763 } | 2746 } |
| 2764 } | 2747 } |
| 2765 | 2748 |
| 2766 | 2749 |
| 2767 HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* closure) { | 2750 HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* closure) { |
| 2768 // Get the global context, then the native context | 2751 // Get the global context, then the native context |
| 2769 HInstruction* context = | 2752 HInstruction* context = |
| 2770 Add<HLoadNamedField>(closure, static_cast<HValue*>(NULL), | 2753 Add<HLoadNamedField>(closure, static_cast<HValue*>(NULL), |
| 2771 HObjectAccess::ForFunctionContextPointer()); | 2754 HObjectAccess::ForFunctionContextPointer()); |
| 2772 HInstruction* global_object = Add<HLoadNamedField>( | 2755 HInstruction* global_object = Add<HLoadNamedField>( |
| 2773 context, static_cast<HValue*>(NULL), | 2756 context, static_cast<HValue*>(NULL), |
| 2774 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); | 2757 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); |
| 2775 HObjectAccess access = HObjectAccess::ForJSObjectOffset( | 2758 HObjectAccess access = HObjectAccess::ForObservableJSObjectPropertyAt( |
| 2776 GlobalObject::kNativeContextOffset); | 2759 GlobalObject::kNativeContextOffset); |
| 2777 return Add<HLoadNamedField>( | 2760 return Add<HLoadNamedField>( |
| 2778 global_object, static_cast<HValue*>(NULL), access); | 2761 global_object, static_cast<HValue*>(NULL), access); |
| 2779 } | 2762 } |
| 2780 | 2763 |
| 2781 | 2764 |
| 2782 HInstruction* HGraphBuilder::BuildGetNativeContext() { | 2765 HInstruction* HGraphBuilder::BuildGetNativeContext() { |
| 2783 // Get the global context, then the native context | 2766 // Get the global context, then the native context |
| 2784 HValue* global_object = Add<HLoadNamedField>( | 2767 HValue* global_object = Add<HLoadNamedField>( |
| 2785 context(), static_cast<HValue*>(NULL), | 2768 context(), static_cast<HValue*>(NULL), |
| 2786 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); | 2769 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); |
| 2787 return Add<HLoadNamedField>( | 2770 return Add<HLoadNamedField>( |
| 2788 global_object, static_cast<HValue*>(NULL), | 2771 global_object, static_cast<HValue*>(NULL), |
| 2789 HObjectAccess::ForJSObjectOffset(GlobalObject::kNativeContextOffset)); | 2772 HObjectAccess::ForObservableJSObjectPropertyAt( |
| 2773 GlobalObject::kNativeContextOffset)); | |
| 2790 } | 2774 } |
| 2791 | 2775 |
| 2792 | 2776 |
| 2793 HInstruction* HGraphBuilder::BuildGetArrayFunction() { | 2777 HInstruction* HGraphBuilder::BuildGetArrayFunction() { |
| 2794 HInstruction* native_context = BuildGetNativeContext(); | 2778 HInstruction* native_context = BuildGetNativeContext(); |
| 2795 HInstruction* index = | 2779 HInstruction* index = |
| 2796 Add<HConstant>(static_cast<int32_t>(Context::ARRAY_FUNCTION_INDEX)); | 2780 Add<HConstant>(static_cast<int32_t>(Context::ARRAY_FUNCTION_INDEX)); |
| 2797 return Add<HLoadKeyed>( | 2781 return Add<HLoadKeyed>( |
| 2798 native_context, index, static_cast<HValue*>(NULL), FAST_ELEMENTS); | 2782 native_context, index, static_cast<HValue*>(NULL), FAST_ELEMENTS); |
| 2799 } | 2783 } |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2970 graph()->GetConstant0(), capacity); | 2954 graph()->GetConstant0(), capacity); |
| 2971 } | 2955 } |
| 2972 | 2956 |
| 2973 return new_object; | 2957 return new_object; |
| 2974 } | 2958 } |
| 2975 | 2959 |
| 2976 | 2960 |
| 2977 HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object, | 2961 HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object, |
| 2978 Handle<Map> map) { | 2962 Handle<Map> map) { |
| 2979 return Add<HStoreNamedField>(object, HObjectAccess::ForMap(), | 2963 return Add<HStoreNamedField>(object, HObjectAccess::ForMap(), |
| 2980 Add<HConstant>(map), INITIALIZING_STORE); | 2964 Add<HConstant>(map)); |
| 2981 } | 2965 } |
| 2982 | 2966 |
| 2983 | 2967 |
| 2984 HValue* HGraphBuilder::AddLoadJSBuiltin(Builtins::JavaScript builtin) { | 2968 HValue* HGraphBuilder::AddLoadJSBuiltin(Builtins::JavaScript builtin) { |
| 2985 HValue* global_object = Add<HLoadNamedField>( | 2969 HValue* global_object = Add<HLoadNamedField>( |
| 2986 context(), static_cast<HValue*>(NULL), | 2970 context(), static_cast<HValue*>(NULL), |
| 2987 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); | 2971 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); |
| 2988 HObjectAccess access = HObjectAccess::ForJSObjectOffset( | 2972 HObjectAccess access = HObjectAccess::ForObservableJSObjectPropertyAt( |
| 2989 GlobalObject::kBuiltinsOffset); | 2973 GlobalObject::kBuiltinsOffset); |
| 2990 HValue* builtins = Add<HLoadNamedField>( | 2974 HValue* builtins = Add<HLoadNamedField>( |
| 2991 global_object, static_cast<HValue*>(NULL), access); | 2975 global_object, static_cast<HValue*>(NULL), access); |
| 2992 HObjectAccess function_access = HObjectAccess::ForJSObjectOffset( | 2976 HObjectAccess function_access = |
| 2993 JSBuiltinsObject::OffsetOfFunctionWithId(builtin)); | 2977 HObjectAccess::ForObservableJSObjectPropertyAt( |
| 2978 JSBuiltinsObject::OffsetOfFunctionWithId(builtin)); | |
| 2994 return Add<HLoadNamedField>( | 2979 return Add<HLoadNamedField>( |
| 2995 builtins, static_cast<HValue*>(NULL), function_access); | 2980 builtins, static_cast<HValue*>(NULL), function_access); |
| 2996 } | 2981 } |
| 2997 | 2982 |
| 2998 | 2983 |
| 2999 HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info) | 2984 HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info) |
| 3000 : HGraphBuilder(info), | 2985 : HGraphBuilder(info), |
| 3001 function_state_(NULL), | 2986 function_state_(NULL), |
| 3002 initial_function_state_(this, info, NORMAL_RETURN), | 2987 initial_function_state_(this, info, NORMAL_RETURN), |
| 3003 ast_context_(NULL), | 2988 ast_context_(NULL), |
| (...skipping 2298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5302 HValue* key = Add<HConstant>(i); | 5287 HValue* key = Add<HConstant>(i); |
| 5303 | 5288 |
| 5304 switch (boilerplate_elements_kind) { | 5289 switch (boilerplate_elements_kind) { |
| 5305 case FAST_SMI_ELEMENTS: | 5290 case FAST_SMI_ELEMENTS: |
| 5306 case FAST_HOLEY_SMI_ELEMENTS: | 5291 case FAST_HOLEY_SMI_ELEMENTS: |
| 5307 case FAST_ELEMENTS: | 5292 case FAST_ELEMENTS: |
| 5308 case FAST_HOLEY_ELEMENTS: | 5293 case FAST_HOLEY_ELEMENTS: |
| 5309 case FAST_DOUBLE_ELEMENTS: | 5294 case FAST_DOUBLE_ELEMENTS: |
| 5310 case FAST_HOLEY_DOUBLE_ELEMENTS: { | 5295 case FAST_HOLEY_DOUBLE_ELEMENTS: { |
| 5311 HStoreKeyed* instr = Add<HStoreKeyed>(elements, key, value, | 5296 HStoreKeyed* instr = Add<HStoreKeyed>(elements, key, value, |
| 5312 boilerplate_elements_kind, | 5297 boilerplate_elements_kind); |
| 5313 INITIALIZING_STORE); | |
| 5314 instr->SetUninitialized(uninitialized); | 5298 instr->SetUninitialized(uninitialized); |
| 5315 break; | 5299 break; |
| 5316 } | 5300 } |
| 5317 default: | 5301 default: |
| 5318 UNREACHABLE(); | 5302 UNREACHABLE(); |
| 5319 break; | 5303 break; |
| 5320 } | 5304 } |
| 5321 | 5305 |
| 5322 Add<HSimulate>(expr->GetIdForElement(i)); | 5306 Add<HSimulate>(expr->GetIdForElement(i)); |
| 5323 } | 5307 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5384 | 5368 |
| 5385 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ? | 5369 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ? |
| 5386 isolate()->heap()->GetPretenureMode() : NOT_TENURED; | 5370 isolate()->heap()->GetPretenureMode() : NOT_TENURED; |
| 5387 | 5371 |
| 5388 HInstruction* heap_number = Add<HAllocate>(heap_number_size, | 5372 HInstruction* heap_number = Add<HAllocate>(heap_number_size, |
| 5389 HType::HeapNumber(), | 5373 HType::HeapNumber(), |
| 5390 pretenure_flag, | 5374 pretenure_flag, |
| 5391 HEAP_NUMBER_TYPE); | 5375 HEAP_NUMBER_TYPE); |
| 5392 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map()); | 5376 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map()); |
| 5393 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(), | 5377 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(), |
| 5394 value, INITIALIZING_STORE); | 5378 value); |
| 5395 instr = New<HStoreNamedField>(checked_object->ActualValue(), | 5379 instr = New<HStoreNamedField>(checked_object->ActualValue(), |
| 5396 heap_number_access, | 5380 heap_number_access, |
| 5397 heap_number, INITIALIZING_STORE); | 5381 heap_number); |
| 5398 } else { | 5382 } else { |
| 5399 // Already holds a HeapNumber; load the box and write its value field. | 5383 // Already holds a HeapNumber; load the box and write its value field. |
| 5400 HInstruction* heap_number = Add<HLoadNamedField>( | 5384 HInstruction* heap_number = Add<HLoadNamedField>( |
| 5401 checked_object, static_cast<HValue*>(NULL), heap_number_access); | 5385 checked_object, static_cast<HValue*>(NULL), heap_number_access); |
| 5402 heap_number->set_type(HType::HeapNumber()); | 5386 heap_number->set_type(HType::HeapNumber()); |
| 5403 instr = New<HStoreNamedField>(heap_number, | 5387 instr = New<HStoreNamedField>(heap_number, |
| 5404 HObjectAccess::ForHeapNumberValue(), | 5388 HObjectAccess::ForHeapNumberValue(), |
| 5405 value, STORE_TO_INITIALIZED_ENTRY); | 5389 value); |
| 5406 } | 5390 } |
| 5407 } else { | 5391 } else { |
| 5408 // This is a normal store. | 5392 // This is a normal store. |
| 5409 instr = New<HStoreNamedField>( | 5393 instr = New<HStoreNamedField>( |
| 5410 checked_object->ActualValue(), field_access, value, | 5394 checked_object->ActualValue(), field_access, value, |
| 5411 transition_to_field ? INITIALIZING_STORE : STORE_TO_INITIALIZED_ENTRY); | 5395 transition_to_field ? INITIALIZING_STORE : STORE_TO_INITIALIZED_ENTRY); |
| 5412 } | 5396 } |
| 5413 | 5397 |
| 5414 if (transition_to_field) { | 5398 if (transition_to_field) { |
| 5415 Handle<Map> transition(lookup->GetTransitionMapFromMap(*map)); | 5399 Handle<Map> transition(lookup->GetTransitionMapFromMap(*map)); |
| (...skipping 2612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8028 } | 8012 } |
| 8029 } | 8013 } |
| 8030 | 8014 |
| 8031 | 8015 |
| 8032 HValue* HOptimizedGraphBuilder::ImplicitReceiverFor(HValue* function, | 8016 HValue* HOptimizedGraphBuilder::ImplicitReceiverFor(HValue* function, |
| 8033 Handle<JSFunction> target) { | 8017 Handle<JSFunction> target) { |
| 8034 SharedFunctionInfo* shared = target->shared(); | 8018 SharedFunctionInfo* shared = target->shared(); |
| 8035 if (shared->is_classic_mode() && !shared->native()) { | 8019 if (shared->is_classic_mode() && !shared->native()) { |
| 8036 HValue* context = Add<HLoadNamedField>( | 8020 HValue* context = Add<HLoadNamedField>( |
| 8037 function, static_cast<HValue*>(NULL), | 8021 function, static_cast<HValue*>(NULL), |
| 8038 HObjectAccess::ForJSObjectOffset(JSFunction::kContextOffset)); | 8022 HObjectAccess::ForMapAndOffset(handle(target->map()), |
| 8023 JSFunction::kContextOffset)); | |
| 8039 HValue* global_object = Add<HLoadNamedField>( | 8024 HValue* global_object = Add<HLoadNamedField>( |
| 8040 context, static_cast<HValue*>(NULL), | 8025 context, static_cast<HValue*>(NULL), |
| 8041 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); | 8026 HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX)); |
| 8042 return Add<HLoadNamedField>( | 8027 return Add<HLoadNamedField>( |
| 8043 global_object, static_cast<HValue*>(NULL), | 8028 global_object, static_cast<HValue*>(NULL), |
| 8044 HObjectAccess::ForJSObjectOffset( | 8029 HObjectAccess::ForMapAndOffset( |
| 8030 handle(target->context()->global_object()->map()), | |
| 8045 GlobalObject::kGlobalReceiverOffset)); | 8031 GlobalObject::kGlobalReceiverOffset)); |
| 8046 } | 8032 } |
| 8047 return graph()->GetConstantUndefined(); | 8033 return graph()->GetConstantUndefined(); |
| 8048 } | 8034 } |
| 8049 | 8035 |
| 8050 | 8036 |
| 8051 void HOptimizedGraphBuilder::VisitCall(Call* expr) { | 8037 void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| 8052 ASSERT(!HasStackOverflow()); | 8038 ASSERT(!HasStackOverflow()); |
| 8053 ASSERT(current_block() != NULL); | 8039 ASSERT(current_block() != NULL); |
| 8054 ASSERT(current_block()->HasPredecessor()); | 8040 ASSERT(current_block()->HasPredecessor()); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8315 // TODO(mvstanton): If all the arguments are constants in smi range, then | 8301 // TODO(mvstanton): If all the arguments are constants in smi range, then |
| 8316 // we could set fill_with_hole to false and save a few instructions. | 8302 // we could set fill_with_hole to false and save a few instructions. |
| 8317 JSArrayBuilder::FillMode fill_mode = IsFastSmiElementsKind(kind) | 8303 JSArrayBuilder::FillMode fill_mode = IsFastSmiElementsKind(kind) |
| 8318 ? JSArrayBuilder::FILL_WITH_HOLE | 8304 ? JSArrayBuilder::FILL_WITH_HOLE |
| 8319 : JSArrayBuilder::DONT_FILL_WITH_HOLE; | 8305 : JSArrayBuilder::DONT_FILL_WITH_HOLE; |
| 8320 new_object = array_builder.AllocateArray(length, length, fill_mode); | 8306 new_object = array_builder.AllocateArray(length, length, fill_mode); |
| 8321 HValue* elements = array_builder.GetElementsLocation(); | 8307 HValue* elements = array_builder.GetElementsLocation(); |
| 8322 for (int i = 0; i < argument_count; i++) { | 8308 for (int i = 0; i < argument_count; i++) { |
| 8323 HValue* value = environment()->ExpressionStackAt(argument_count - i - 1); | 8309 HValue* value = environment()->ExpressionStackAt(argument_count - i - 1); |
| 8324 HValue* constant_i = Add<HConstant>(i); | 8310 HValue* constant_i = Add<HConstant>(i); |
| 8325 Add<HStoreKeyed>(elements, constant_i, value, kind, INITIALIZING_STORE); | 8311 Add<HStoreKeyed>(elements, constant_i, value, kind); |
| 8326 } | 8312 } |
| 8327 } | 8313 } |
| 8328 | 8314 |
| 8329 Drop(argument_count + 1); // drop constructor and args. | 8315 Drop(argument_count + 1); // drop constructor and args. |
| 8330 ast_context()->ReturnValue(new_object); | 8316 ast_context()->ReturnValue(new_object); |
| 8331 } | 8317 } |
| 8332 | 8318 |
| 8333 | 8319 |
| 8334 // Checks whether allocation using the given constructor can be inlined. | 8320 // Checks whether allocation using the given constructor can be inlined. |
| 8335 static bool IsAllocationInlineable(Handle<JSFunction> constructor) { | 8321 static bool IsAllocationInlineable(Handle<JSFunction> constructor) { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8424 isolate()->heap()->GetPretenureMode() : NOT_TENURED; | 8410 isolate()->heap()->GetPretenureMode() : NOT_TENURED; |
| 8425 HAllocate* receiver = | 8411 HAllocate* receiver = |
| 8426 Add<HAllocate>(size_in_bytes, HType::JSObject(), pretenure_flag, | 8412 Add<HAllocate>(size_in_bytes, HType::JSObject(), pretenure_flag, |
| 8427 JS_OBJECT_TYPE); | 8413 JS_OBJECT_TYPE); |
| 8428 receiver->set_known_initial_map(initial_map); | 8414 receiver->set_known_initial_map(initial_map); |
| 8429 | 8415 |
| 8430 // Load the initial map from the constructor. | 8416 // Load the initial map from the constructor. |
| 8431 HValue* constructor_value = Add<HConstant>(constructor); | 8417 HValue* constructor_value = Add<HConstant>(constructor); |
| 8432 HValue* initial_map_value = | 8418 HValue* initial_map_value = |
| 8433 Add<HLoadNamedField>(constructor_value, static_cast<HValue*>(NULL), | 8419 Add<HLoadNamedField>(constructor_value, static_cast<HValue*>(NULL), |
| 8434 HObjectAccess::ForJSObjectOffset( | 8420 HObjectAccess::ForMapAndOffset( |
| 8421 handle(constructor->map()), | |
| 8435 JSFunction::kPrototypeOrInitialMapOffset)); | 8422 JSFunction::kPrototypeOrInitialMapOffset)); |
| 8436 | 8423 |
| 8437 // Initialize map and fields of the newly allocated object. | 8424 // Initialize map and fields of the newly allocated object. |
| 8438 { NoObservableSideEffectsScope no_effects(this); | 8425 { NoObservableSideEffectsScope no_effects(this); |
| 8439 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE); | 8426 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE); |
| 8440 Add<HStoreNamedField>(receiver, | 8427 Add<HStoreNamedField>(receiver, |
| 8441 HObjectAccess::ForJSObjectOffset(JSObject::kMapOffset), | 8428 HObjectAccess::ForMapAndOffset(initial_map, JSObject::kMapOffset), |
| 8442 initial_map_value, INITIALIZING_STORE); | 8429 initial_map_value); |
| 8443 HValue* empty_fixed_array = Add<HConstant>(factory->empty_fixed_array()); | 8430 HValue* empty_fixed_array = Add<HConstant>(factory->empty_fixed_array()); |
| 8444 Add<HStoreNamedField>(receiver, | 8431 Add<HStoreNamedField>(receiver, |
| 8445 HObjectAccess::ForJSObjectOffset(JSObject::kPropertiesOffset), | 8432 HObjectAccess::ForMapAndOffset(initial_map, |
| 8446 empty_fixed_array, INITIALIZING_STORE); | 8433 JSObject::kPropertiesOffset), |
| 8434 empty_fixed_array); | |
| 8447 Add<HStoreNamedField>(receiver, | 8435 Add<HStoreNamedField>(receiver, |
| 8448 HObjectAccess::ForJSObjectOffset(JSObject::kElementsOffset), | 8436 HObjectAccess::ForMapAndOffset(initial_map, |
| 8449 empty_fixed_array, INITIALIZING_STORE); | 8437 JSObject::kElementsOffset), |
| 8438 empty_fixed_array); | |
| 8450 if (initial_map->inobject_properties() != 0) { | 8439 if (initial_map->inobject_properties() != 0) { |
| 8451 HConstant* undefined = graph()->GetConstantUndefined(); | 8440 HConstant* undefined = graph()->GetConstantUndefined(); |
| 8452 for (int i = 0; i < initial_map->inobject_properties(); i++) { | 8441 for (int i = 0; i < initial_map->inobject_properties(); i++) { |
| 8453 int property_offset = JSObject::kHeaderSize + i * kPointerSize; | 8442 int property_offset = initial_map->GetInObjectPropertyOffset(i); |
| 8454 Add<HStoreNamedField>(receiver, | 8443 Add<HStoreNamedField>(receiver, |
| 8455 HObjectAccess::ForJSObjectOffset(property_offset), | 8444 HObjectAccess::ForMapAndOffset(initial_map, property_offset), |
| 8456 undefined, PREINITIALIZING_STORE); | 8445 undefined); |
| 8457 } | 8446 } |
| 8458 } | 8447 } |
| 8459 } | 8448 } |
| 8460 | 8449 |
| 8461 // Replace the constructor function with a newly allocated receiver using | 8450 // Replace the constructor function with a newly allocated receiver using |
| 8462 // the index of the receiver from the top of the expression stack. | 8451 // the index of the receiver from the top of the expression stack. |
| 8463 const int receiver_index = argument_count - 1; | 8452 const int receiver_index = argument_count - 1; |
| 8464 ASSERT(environment()->ExpressionStackAt(receiver_index) == function); | 8453 ASSERT(environment()->ExpressionStackAt(receiver_index) == function); |
| 8465 environment()->SetExpressionStackAt(receiver_index, receiver); | 8454 environment()->SetExpressionStackAt(receiver_index, receiver); |
| 8466 | 8455 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8530 void HGraphBuilder::BuildArrayBufferViewInitialization( | 8519 void HGraphBuilder::BuildArrayBufferViewInitialization( |
| 8531 HValue* obj, | 8520 HValue* obj, |
| 8532 HValue* buffer, | 8521 HValue* buffer, |
| 8533 HValue* byte_offset, | 8522 HValue* byte_offset, |
| 8534 HValue* byte_length) { | 8523 HValue* byte_length) { |
| 8535 | 8524 |
| 8536 for (int offset = ViewClass::kSize; | 8525 for (int offset = ViewClass::kSize; |
| 8537 offset < ViewClass::kSizeWithInternalFields; | 8526 offset < ViewClass::kSizeWithInternalFields; |
| 8538 offset += kPointerSize) { | 8527 offset += kPointerSize) { |
| 8539 Add<HStoreNamedField>(obj, | 8528 Add<HStoreNamedField>(obj, |
| 8540 HObjectAccess::ForJSObjectOffset(offset), | 8529 HObjectAccess::ForObservableJSObjectPropertyAt(offset), |
| 8541 graph()->GetConstant0(), INITIALIZING_STORE); | 8530 graph()->GetConstant0()); |
| 8542 } | 8531 } |
| 8543 | 8532 |
| 8544 Add<HStoreNamedField>( | 8533 Add<HStoreNamedField>( |
| 8545 obj, | 8534 obj, |
| 8546 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer, INITIALIZING_STORE); | 8535 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer); |
| 8547 Add<HStoreNamedField>( | 8536 Add<HStoreNamedField>( |
| 8548 obj, | 8537 obj, |
| 8549 HObjectAccess::ForJSArrayBufferViewByteOffset(), | 8538 HObjectAccess::ForJSArrayBufferViewByteOffset(), |
| 8550 byte_offset, INITIALIZING_STORE); | 8539 byte_offset); |
| 8551 Add<HStoreNamedField>( | 8540 Add<HStoreNamedField>( |
| 8552 obj, | 8541 obj, |
| 8553 HObjectAccess::ForJSArrayBufferViewByteLength(), | 8542 HObjectAccess::ForJSArrayBufferViewByteLength(), |
| 8554 byte_length, INITIALIZING_STORE); | 8543 byte_length); |
| 8555 | 8544 |
| 8556 HObjectAccess weak_first_view_access = | 8545 HObjectAccess weak_first_view_access = |
| 8557 HObjectAccess::ForJSArrayBufferWeakFirstView(); | 8546 HObjectAccess::ForJSArrayBufferWeakFirstView(); |
| 8558 Add<HStoreNamedField>(obj, | 8547 Add<HStoreNamedField>(obj, |
| 8559 HObjectAccess::ForJSArrayBufferViewWeakNext(), | 8548 HObjectAccess::ForJSArrayBufferViewWeakNext(), |
| 8560 Add<HLoadNamedField>(buffer, static_cast<HValue*>(NULL), | 8549 Add<HLoadNamedField>(buffer, static_cast<HValue*>(NULL), |
| 8561 weak_first_view_access), | 8550 weak_first_view_access)); |
| 8562 INITIALIZING_STORE); | |
| 8563 Add<HStoreNamedField>( | 8551 Add<HStoreNamedField>( |
| 8564 buffer, weak_first_view_access, obj, INITIALIZING_STORE); | 8552 buffer, weak_first_view_access, obj); |
| 8565 } | 8553 } |
| 8566 | 8554 |
| 8567 | 8555 |
| 8568 void HOptimizedGraphBuilder::VisitDataViewInitialize( | 8556 void HOptimizedGraphBuilder::VisitDataViewInitialize( |
| 8569 CallRuntime* expr) { | 8557 CallRuntime* expr) { |
| 8570 ZoneList<Expression*>* arguments = expr->arguments(); | 8558 ZoneList<Expression*>* arguments = expr->arguments(); |
| 8571 | 8559 |
| 8572 NoObservableSideEffectsScope scope(this); | 8560 NoObservableSideEffectsScope scope(this); |
| 8573 ASSERT(arguments->length()== 4); | 8561 ASSERT(arguments->length()== 4); |
| 8574 CHECK_ALIVE(VisitForValue(arguments->at(0))); | 8562 CHECK_ALIVE(VisitForValue(arguments->at(0))); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8644 | 8632 |
| 8645 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. | 8633 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. |
| 8646 size_t element_size = 1; // Bogus initialization. | 8634 size_t element_size = 1; // Bogus initialization. |
| 8647 Runtime::ArrayIdToTypeAndSize(array_id, &array_type, &element_size); | 8635 Runtime::ArrayIdToTypeAndSize(array_id, &array_type, &element_size); |
| 8648 | 8636 |
| 8649 HInstruction* length = AddUncasted<HDiv>(byte_length, | 8637 HInstruction* length = AddUncasted<HDiv>(byte_length, |
| 8650 Add<HConstant>(static_cast<int32_t>(element_size))); | 8638 Add<HConstant>(static_cast<int32_t>(element_size))); |
| 8651 | 8639 |
| 8652 Add<HStoreNamedField>(obj, | 8640 Add<HStoreNamedField>(obj, |
| 8653 HObjectAccess::ForJSTypedArrayLength(), | 8641 HObjectAccess::ForJSTypedArrayLength(), |
| 8654 length, INITIALIZING_STORE); | 8642 length); |
| 8655 | 8643 |
| 8656 HValue* elements = | 8644 HValue* elements = |
| 8657 Add<HAllocate>( | 8645 Add<HAllocate>( |
| 8658 Add<HConstant>(ExternalArray::kAlignedSize), | 8646 Add<HConstant>(ExternalArray::kAlignedSize), |
| 8659 HType::JSArray(), | 8647 HType::JSArray(), |
| 8660 NOT_TENURED, | 8648 NOT_TENURED, |
| 8661 static_cast<InstanceType>(FIRST_EXTERNAL_ARRAY_TYPE + array_type)); | 8649 static_cast<InstanceType>(FIRST_EXTERNAL_ARRAY_TYPE + array_type)); |
| 8662 | 8650 |
| 8663 Handle<Map> external_array_map( | 8651 Handle<Map> external_array_map( |
| 8664 isolate()->heap()->MapForExternalArrayType(array_type)); | 8652 isolate()->heap()->MapForExternalArrayType(array_type)); |
| 8665 AddStoreMapConstant(elements, external_array_map); | 8653 Add<HStoreNamedField>(elements, |
| 8654 HObjectAccess::ForMap(), | |
| 8655 Add<HConstant>(external_array_map)); | |
| 8666 | 8656 |
| 8667 HValue* backing_store = Add<HLoadNamedField>( | 8657 HValue* backing_store = Add<HLoadNamedField>( |
| 8668 buffer, static_cast<HValue*>(NULL), | 8658 buffer, static_cast<HValue*>(NULL), |
| 8669 HObjectAccess::ForJSArrayBufferBackingStore()); | 8659 HObjectAccess::ForJSArrayBufferBackingStore()); |
| 8670 | 8660 |
| 8671 HValue* typed_array_start; | 8661 HValue* typed_array_start; |
| 8672 if (is_zero_byte_offset) { | 8662 if (is_zero_byte_offset) { |
| 8673 typed_array_start = backing_store; | 8663 typed_array_start = backing_store; |
| 8674 } else { | 8664 } else { |
| 8675 HInstruction* external_pointer = | 8665 HInstruction* external_pointer = |
| 8676 AddUncasted<HAdd>(backing_store, byte_offset); | 8666 AddUncasted<HAdd>(backing_store, byte_offset); |
| 8677 // Arguments are checked prior to call to TypedArrayInitialize, | 8667 // Arguments are checked prior to call to TypedArrayInitialize, |
| 8678 // including byte_offset. | 8668 // including byte_offset. |
| 8679 external_pointer->ClearFlag(HValue::kCanOverflow); | 8669 external_pointer->ClearFlag(HValue::kCanOverflow); |
| 8680 typed_array_start = external_pointer; | 8670 typed_array_start = external_pointer; |
| 8681 } | 8671 } |
| 8682 | 8672 |
| 8673 Add<HStoreNamedField>(elements, | |
| 8674 HObjectAccess::ForExternalArrayExternalPointer(), | |
| 8675 typed_array_start); | |
| 8676 Add<HStoreNamedField>(elements, | |
| 8677 HObjectAccess::ForFixedArrayLength(), | |
| 8678 length); | |
| 8683 Add<HStoreNamedField>( | 8679 Add<HStoreNamedField>( |
| 8684 elements, HObjectAccess::ForExternalArrayExternalPointer(), | 8680 obj, HObjectAccess::ForElementsPointer(), elements); |
| 8685 typed_array_start, INITIALIZING_STORE); | |
| 8686 Add<HStoreNamedField>( | |
| 8687 elements, HObjectAccess::ForFixedArrayLength(), length, | |
| 8688 INITIALIZING_STORE); | |
| 8689 Add<HStoreNamedField>( | |
| 8690 obj, HObjectAccess::ForElementsPointer(), elements, INITIALIZING_STORE); | |
| 8691 } | 8681 } |
| 8692 | 8682 |
| 8693 if (!is_zero_byte_offset) { | 8683 if (!is_zero_byte_offset) { |
| 8694 byte_offset_smi.Else(); | 8684 byte_offset_smi.Else(); |
| 8695 { // byte_offset is not Smi. | 8685 { // byte_offset is not Smi. |
| 8696 Push(Add<HPushArgument>(obj)); | 8686 Push(Add<HPushArgument>(obj)); |
| 8697 VisitArgument(arguments->at(kArrayIdArg)); | 8687 VisitArgument(arguments->at(kArrayIdArg)); |
| 8698 Push(Add<HPushArgument>(buffer)); | 8688 Push(Add<HPushArgument>(buffer)); |
| 8699 Push(Add<HPushArgument>(byte_offset)); | 8689 Push(Add<HPushArgument>(byte_offset)); |
| 8700 Push(Add<HPushArgument>(byte_length)); | 8690 Push(Add<HPushArgument>(byte_length)); |
| (...skipping 1219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9920 ASSERT(boilerplate_object->properties()->length() == 0); | 9910 ASSERT(boilerplate_object->properties()->length() == 0); |
| 9921 | 9911 |
| 9922 Handle<Map> boilerplate_object_map(boilerplate_object->map()); | 9912 Handle<Map> boilerplate_object_map(boilerplate_object->map()); |
| 9923 AddStoreMapConstant(object, boilerplate_object_map); | 9913 AddStoreMapConstant(object, boilerplate_object_map); |
| 9924 | 9914 |
| 9925 Handle<Object> properties_field = | 9915 Handle<Object> properties_field = |
| 9926 Handle<Object>(boilerplate_object->properties(), isolate()); | 9916 Handle<Object>(boilerplate_object->properties(), isolate()); |
| 9927 ASSERT(*properties_field == isolate()->heap()->empty_fixed_array()); | 9917 ASSERT(*properties_field == isolate()->heap()->empty_fixed_array()); |
| 9928 HInstruction* properties = Add<HConstant>(properties_field); | 9918 HInstruction* properties = Add<HConstant>(properties_field); |
| 9929 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); | 9919 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); |
| 9930 Add<HStoreNamedField>(object, access, properties, INITIALIZING_STORE); | 9920 Add<HStoreNamedField>(object, access, properties); |
| 9931 | 9921 |
| 9932 if (boilerplate_object->IsJSArray()) { | 9922 if (boilerplate_object->IsJSArray()) { |
| 9933 Handle<JSArray> boilerplate_array = | 9923 Handle<JSArray> boilerplate_array = |
| 9934 Handle<JSArray>::cast(boilerplate_object); | 9924 Handle<JSArray>::cast(boilerplate_object); |
| 9935 Handle<Object> length_field = | 9925 Handle<Object> length_field = |
| 9936 Handle<Object>(boilerplate_array->length(), isolate()); | 9926 Handle<Object>(boilerplate_array->length(), isolate()); |
| 9937 HInstruction* length = Add<HConstant>(length_field); | 9927 HInstruction* length = Add<HConstant>(length_field); |
| 9938 | 9928 |
| 9939 ASSERT(boilerplate_array->length()->IsSmi()); | 9929 ASSERT(boilerplate_array->length()->IsSmi()); |
| 9940 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength( | 9930 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength( |
| 9941 boilerplate_array->GetElementsKind()), length, INITIALIZING_STORE); | 9931 boilerplate_array->GetElementsKind()), length); |
| 9942 } | 9932 } |
| 9943 } | 9933 } |
| 9944 | 9934 |
| 9945 | 9935 |
| 9946 void HOptimizedGraphBuilder::BuildInitElementsInObjectHeader( | 9936 void HOptimizedGraphBuilder::BuildInitElementsInObjectHeader( |
| 9947 Handle<JSObject> boilerplate_object, | 9937 Handle<JSObject> boilerplate_object, |
| 9948 HInstruction* object, | 9938 HInstruction* object, |
| 9949 HInstruction* object_elements) { | 9939 HInstruction* object_elements) { |
| 9950 ASSERT(boilerplate_object->properties()->length() == 0); | 9940 ASSERT(boilerplate_object->properties()->length() == 0); |
| 9951 if (object_elements == NULL) { | 9941 if (object_elements == NULL) { |
| 9952 Handle<Object> elements_field = | 9942 Handle<Object> elements_field = |
| 9953 Handle<Object>(boilerplate_object->elements(), isolate()); | 9943 Handle<Object>(boilerplate_object->elements(), isolate()); |
| 9954 object_elements = Add<HConstant>(elements_field); | 9944 object_elements = Add<HConstant>(elements_field); |
| 9955 } | 9945 } |
| 9956 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), | 9946 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| 9957 object_elements, INITIALIZING_STORE); | 9947 object_elements); |
| 9958 } | 9948 } |
| 9959 | 9949 |
| 9960 | 9950 |
| 9961 void HOptimizedGraphBuilder::BuildEmitInObjectProperties( | 9951 void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
| 9962 Handle<JSObject> boilerplate_object, | 9952 Handle<JSObject> boilerplate_object, |
| 9963 HInstruction* object, | 9953 HInstruction* object, |
| 9964 AllocationSiteUsageContext* site_context, | 9954 AllocationSiteUsageContext* site_context, |
| 9965 PretenureFlag pretenure_flag) { | 9955 PretenureFlag pretenure_flag) { |
| 9966 Handle<DescriptorArray> descriptors( | 9956 Handle<Map> boilerplate_map(boilerplate_object->map()); |
| 9967 boilerplate_object->map()->instance_descriptors()); | 9957 Handle<DescriptorArray> descriptors(boilerplate_map->instance_descriptors()); |
| 9968 int limit = boilerplate_object->map()->NumberOfOwnDescriptors(); | 9958 int limit = boilerplate_map->NumberOfOwnDescriptors(); |
| 9969 | 9959 |
| 9970 int copied_fields = 0; | 9960 int copied_fields = 0; |
| 9971 for (int i = 0; i < limit; i++) { | 9961 for (int i = 0; i < limit; i++) { |
| 9972 PropertyDetails details = descriptors->GetDetails(i); | 9962 PropertyDetails details = descriptors->GetDetails(i); |
| 9973 if (details.type() != FIELD) continue; | 9963 if (details.type() != FIELD) continue; |
| 9974 copied_fields++; | 9964 copied_fields++; |
| 9975 int index = descriptors->GetFieldIndex(i); | 9965 int index = descriptors->GetFieldIndex(i); |
| 9976 int property_offset = boilerplate_object->GetInObjectPropertyOffset(index); | 9966 int property_offset = boilerplate_object->GetInObjectPropertyOffset(index); |
| 9977 Handle<Name> name(descriptors->GetKey(i)); | 9967 Handle<Name> name(descriptors->GetKey(i)); |
| 9978 Handle<Object> value = | 9968 Handle<Object> value = |
| 9979 Handle<Object>(boilerplate_object->InObjectPropertyAt(index), | 9969 Handle<Object>(boilerplate_object->InObjectPropertyAt(index), |
| 9980 isolate()); | 9970 isolate()); |
| 9981 | 9971 |
| 9982 // The access for the store depends on the type of the boilerplate. | 9972 // The access for the store depends on the type of the boilerplate. |
| 9983 HObjectAccess access = boilerplate_object->IsJSArray() ? | 9973 HObjectAccess access = boilerplate_object->IsJSArray() ? |
| 9984 HObjectAccess::ForJSArrayOffset(property_offset) : | 9974 HObjectAccess::ForJSArrayOffset(property_offset) : |
| 9985 HObjectAccess::ForJSObjectOffset(property_offset); | 9975 HObjectAccess::ForMapAndOffset(boilerplate_map, property_offset); |
| 9986 | 9976 |
| 9987 if (value->IsJSObject()) { | 9977 if (value->IsJSObject()) { |
| 9988 Handle<JSObject> value_object = Handle<JSObject>::cast(value); | 9978 Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
| 9989 Handle<AllocationSite> current_site = site_context->EnterNewScope(); | 9979 Handle<AllocationSite> current_site = site_context->EnterNewScope(); |
| 9990 HInstruction* result = | 9980 HInstruction* result = |
| 9991 BuildFastLiteral(value_object, site_context); | 9981 BuildFastLiteral(value_object, site_context); |
| 9992 site_context->ExitScope(current_site, value_object); | 9982 site_context->ExitScope(current_site, value_object); |
| 9993 Add<HStoreNamedField>(object, access, result, INITIALIZING_STORE); | 9983 Add<HStoreNamedField>(object, access, result); |
| 9994 } else { | 9984 } else { |
| 9995 Representation representation = details.representation(); | 9985 Representation representation = details.representation(); |
| 9996 HInstruction* value_instruction; | 9986 HInstruction* value_instruction; |
| 9997 | 9987 |
| 9998 if (representation.IsDouble()) { | 9988 if (representation.IsDouble()) { |
| 9999 // Allocate a HeapNumber box and store the value into it. | 9989 // Allocate a HeapNumber box and store the value into it. |
| 10000 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize); | 9990 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize); |
| 10001 // This heap number alloc does not have a corresponding | 9991 // This heap number alloc does not have a corresponding |
| 10002 // AllocationSite. That is okay because | 9992 // AllocationSite. That is okay because |
| 10003 // 1) it's a child object of another object with a valid allocation site | 9993 // 1) it's a child object of another object with a valid allocation site |
| 10004 // 2) we can just use the mode of the parent object for pretenuring | 9994 // 2) we can just use the mode of the parent object for pretenuring |
| 10005 HInstruction* double_box = | 9995 HInstruction* double_box = |
| 10006 Add<HAllocate>(heap_number_constant, HType::HeapNumber(), | 9996 Add<HAllocate>(heap_number_constant, HType::HeapNumber(), |
| 10007 pretenure_flag, HEAP_NUMBER_TYPE); | 9997 pretenure_flag, HEAP_NUMBER_TYPE); |
| 10008 AddStoreMapConstant(double_box, | 9998 AddStoreMapConstant(double_box, |
| 10009 isolate()->factory()->heap_number_map()); | 9999 isolate()->factory()->heap_number_map()); |
| 10010 Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(), | 10000 Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(), |
| 10011 Add<HConstant>(value), INITIALIZING_STORE); | 10001 Add<HConstant>(value)); |
| 10012 value_instruction = double_box; | 10002 value_instruction = double_box; |
| 10013 } else if (representation.IsSmi() && value->IsUninitialized()) { | 10003 } else if (representation.IsSmi() && value->IsUninitialized()) { |
| 10014 value_instruction = graph()->GetConstant0(); | 10004 value_instruction = graph()->GetConstant0(); |
| 10015 } else { | 10005 } else { |
| 10016 value_instruction = Add<HConstant>(value); | 10006 value_instruction = Add<HConstant>(value); |
| 10017 } | 10007 } |
| 10018 | 10008 |
| 10019 Add<HStoreNamedField>(object, access, value_instruction, | 10009 Add<HStoreNamedField>(object, access, value_instruction); |
| 10020 INITIALIZING_STORE); | |
| 10021 } | 10010 } |
| 10022 } | 10011 } |
| 10023 | 10012 |
| 10024 int inobject_properties = boilerplate_object->map()->inobject_properties(); | 10013 int inobject_properties = boilerplate_object->map()->inobject_properties(); |
| 10025 HInstruction* value_instruction = | 10014 HInstruction* value_instruction = |
| 10026 Add<HConstant>(isolate()->factory()->one_pointer_filler_map()); | 10015 Add<HConstant>(isolate()->factory()->one_pointer_filler_map()); |
| 10027 for (int i = copied_fields; i < inobject_properties; i++) { | 10016 for (int i = copied_fields; i < inobject_properties; i++) { |
| 10028 ASSERT(boilerplate_object->IsJSObject()); | 10017 ASSERT(boilerplate_object->IsJSObject()); |
| 10029 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i); | 10018 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i); |
| 10030 HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset); | 10019 HObjectAccess access = |
| 10031 Add<HStoreNamedField>(object, access, value_instruction, | 10020 HObjectAccess::ForMapAndOffset(boilerplate_map, property_offset); |
| 10032 PREINITIALIZING_STORE); | 10021 Add<HStoreNamedField>(object, access, value_instruction); |
| 10033 } | 10022 } |
| 10034 } | 10023 } |
| 10035 | 10024 |
| 10036 | 10025 |
| 10037 void HOptimizedGraphBuilder::BuildEmitElements( | 10026 void HOptimizedGraphBuilder::BuildEmitElements( |
| 10038 Handle<JSObject> boilerplate_object, | 10027 Handle<JSObject> boilerplate_object, |
| 10039 Handle<FixedArrayBase> elements, | 10028 Handle<FixedArrayBase> elements, |
| 10040 HValue* object_elements, | 10029 HValue* object_elements, |
| 10041 AllocationSiteUsageContext* site_context) { | 10030 AllocationSiteUsageContext* site_context) { |
| 10042 ElementsKind kind = boilerplate_object->map()->elements_kind(); | 10031 ElementsKind kind = boilerplate_object->map()->elements_kind(); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 10062 HValue* object_elements) { | 10051 HValue* object_elements) { |
| 10063 HInstruction* boilerplate_elements = Add<HConstant>(elements); | 10052 HInstruction* boilerplate_elements = Add<HConstant>(elements); |
| 10064 int elements_length = elements->length(); | 10053 int elements_length = elements->length(); |
| 10065 for (int i = 0; i < elements_length; i++) { | 10054 for (int i = 0; i < elements_length; i++) { |
| 10066 HValue* key_constant = Add<HConstant>(i); | 10055 HValue* key_constant = Add<HConstant>(i); |
| 10067 HInstruction* value_instruction = | 10056 HInstruction* value_instruction = |
| 10068 Add<HLoadKeyed>(boilerplate_elements, key_constant, | 10057 Add<HLoadKeyed>(boilerplate_elements, key_constant, |
| 10069 static_cast<HValue*>(NULL), kind, | 10058 static_cast<HValue*>(NULL), kind, |
| 10070 ALLOW_RETURN_HOLE); | 10059 ALLOW_RETURN_HOLE); |
| 10071 HInstruction* store = Add<HStoreKeyed>(object_elements, key_constant, | 10060 HInstruction* store = Add<HStoreKeyed>(object_elements, key_constant, |
| 10072 value_instruction, kind, | 10061 value_instruction, kind); |
| 10073 INITIALIZING_STORE); | |
| 10074 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 10062 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
| 10075 } | 10063 } |
| 10076 } | 10064 } |
| 10077 | 10065 |
| 10078 | 10066 |
| 10079 void HOptimizedGraphBuilder::BuildEmitFixedArray( | 10067 void HOptimizedGraphBuilder::BuildEmitFixedArray( |
| 10080 Handle<FixedArrayBase> elements, | 10068 Handle<FixedArrayBase> elements, |
| 10081 ElementsKind kind, | 10069 ElementsKind kind, |
| 10082 HValue* object_elements, | 10070 HValue* object_elements, |
| 10083 AllocationSiteUsageContext* site_context) { | 10071 AllocationSiteUsageContext* site_context) { |
| 10084 HInstruction* boilerplate_elements = Add<HConstant>(elements); | 10072 HInstruction* boilerplate_elements = Add<HConstant>(elements); |
| 10085 int elements_length = elements->length(); | 10073 int elements_length = elements->length(); |
| 10086 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); | 10074 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); |
| 10087 for (int i = 0; i < elements_length; i++) { | 10075 for (int i = 0; i < elements_length; i++) { |
| 10088 Handle<Object> value(fast_elements->get(i), isolate()); | 10076 Handle<Object> value(fast_elements->get(i), isolate()); |
| 10089 HValue* key_constant = Add<HConstant>(i); | 10077 HValue* key_constant = Add<HConstant>(i); |
| 10090 if (value->IsJSObject()) { | 10078 if (value->IsJSObject()) { |
| 10091 Handle<JSObject> value_object = Handle<JSObject>::cast(value); | 10079 Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
| 10092 Handle<AllocationSite> current_site = site_context->EnterNewScope(); | 10080 Handle<AllocationSite> current_site = site_context->EnterNewScope(); |
| 10093 HInstruction* result = | 10081 HInstruction* result = |
| 10094 BuildFastLiteral(value_object, site_context); | 10082 BuildFastLiteral(value_object, site_context); |
| 10095 site_context->ExitScope(current_site, value_object); | 10083 site_context->ExitScope(current_site, value_object); |
| 10096 Add<HStoreKeyed>(object_elements, key_constant, result, kind, | 10084 Add<HStoreKeyed>(object_elements, key_constant, result, kind); |
| 10097 INITIALIZING_STORE); | |
| 10098 } else { | 10085 } else { |
| 10099 HInstruction* value_instruction = | 10086 HInstruction* value_instruction = |
| 10100 Add<HLoadKeyed>(boilerplate_elements, key_constant, | 10087 Add<HLoadKeyed>(boilerplate_elements, key_constant, |
| 10101 static_cast<HValue*>(NULL), kind, | 10088 static_cast<HValue*>(NULL), kind, |
| 10102 ALLOW_RETURN_HOLE); | 10089 ALLOW_RETURN_HOLE); |
| 10103 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind, | 10090 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); |
| 10104 INITIALIZING_STORE); | |
| 10105 } | 10091 } |
| 10106 } | 10092 } |
| 10107 } | 10093 } |
| 10108 | 10094 |
| 10109 | 10095 |
| 10110 void HOptimizedGraphBuilder::VisitThisFunction(ThisFunction* expr) { | 10096 void HOptimizedGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
| 10111 ASSERT(!HasStackOverflow()); | 10097 ASSERT(!HasStackOverflow()); |
| 10112 ASSERT(current_block() != NULL); | 10098 ASSERT(current_block() != NULL); |
| 10113 ASSERT(current_block()->HasPredecessor()); | 10099 ASSERT(current_block()->HasPredecessor()); |
| 10114 HInstruction* instr = BuildThisFunction(); | 10100 HInstruction* instr = BuildThisFunction(); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10412 HValue* object = Pop(); | 10398 HValue* object = Pop(); |
| 10413 | 10399 |
| 10414 IfBuilder if_objectisvalue(this); | 10400 IfBuilder if_objectisvalue(this); |
| 10415 HValue* objectisvalue = if_objectisvalue.If<HHasInstanceTypeAndBranch>( | 10401 HValue* objectisvalue = if_objectisvalue.If<HHasInstanceTypeAndBranch>( |
| 10416 object, JS_VALUE_TYPE); | 10402 object, JS_VALUE_TYPE); |
| 10417 if_objectisvalue.Then(); | 10403 if_objectisvalue.Then(); |
| 10418 { | 10404 { |
| 10419 // Return the actual value. | 10405 // Return the actual value. |
| 10420 Push(Add<HLoadNamedField>( | 10406 Push(Add<HLoadNamedField>( |
| 10421 object, objectisvalue, | 10407 object, objectisvalue, |
| 10422 HObjectAccess::ForJSObjectOffset(JSValue::kValueOffset))); | 10408 HObjectAccess::ForObservableJSObjectPropertyAt( |
| 10409 JSValue::kValueOffset))); | |
| 10423 Add<HSimulate>(call->id(), FIXED_SIMULATE); | 10410 Add<HSimulate>(call->id(), FIXED_SIMULATE); |
| 10424 } | 10411 } |
| 10425 if_objectisvalue.Else(); | 10412 if_objectisvalue.Else(); |
| 10426 { | 10413 { |
| 10427 // If the object is not a value return the object. | 10414 // If the object is not a value return the object. |
| 10428 Push(object); | 10415 Push(object); |
| 10429 Add<HSimulate>(call->id(), FIXED_SIMULATE); | 10416 Add<HSimulate>(call->id(), FIXED_SIMULATE); |
| 10430 } | 10417 } |
| 10431 if_objectisvalue.End(); | 10418 if_objectisvalue.End(); |
| 10432 return ast_context()->ReturnValue(Pop()); | 10419 return ast_context()->ReturnValue(Pop()); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10482 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); | 10469 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| 10483 HValue* value = Pop(); | 10470 HValue* value = Pop(); |
| 10484 HValue* object = Pop(); | 10471 HValue* object = Pop(); |
| 10485 | 10472 |
| 10486 // Check if object is a JSValue. | 10473 // Check if object is a JSValue. |
| 10487 IfBuilder if_objectisvalue(this); | 10474 IfBuilder if_objectisvalue(this); |
| 10488 if_objectisvalue.If<HHasInstanceTypeAndBranch>(object, JS_VALUE_TYPE); | 10475 if_objectisvalue.If<HHasInstanceTypeAndBranch>(object, JS_VALUE_TYPE); |
| 10489 if_objectisvalue.Then(); | 10476 if_objectisvalue.Then(); |
| 10490 { | 10477 { |
| 10491 // Create in-object property store to kValueOffset. | 10478 // Create in-object property store to kValueOffset. |
| 10492 Add<HStoreNamedField>( | 10479 Add<HStoreNamedField>(object, |
| 10493 object, HObjectAccess::ForJSObjectOffset(JSValue::kValueOffset), | 10480 HObjectAccess::ForObservableJSObjectPropertyAt(JSValue::kValueOffset), |
| 10494 value, INITIALIZING_STORE); | 10481 value); |
| 10495 Add<HSimulate>(call->id(), FIXED_SIMULATE); | 10482 Add<HSimulate>(call->id(), FIXED_SIMULATE); |
| 10496 } | 10483 } |
| 10497 if_objectisvalue.Else(); | 10484 if_objectisvalue.Else(); |
| 10498 { | 10485 { |
| 10499 // Nothing to do in this case. | 10486 // Nothing to do in this case. |
| 10500 Add<HSimulate>(call->id(), FIXED_SIMULATE); | 10487 Add<HSimulate>(call->id(), FIXED_SIMULATE); |
| 10501 } | 10488 } |
| 10502 if_objectisvalue.End(); | 10489 if_objectisvalue.End(); |
| 10503 return ast_context()->ReturnValue(value); | 10490 return ast_context()->ReturnValue(value); |
| 10504 } | 10491 } |
| (...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11355 if (ShouldProduceTraceOutput()) { | 11342 if (ShouldProduceTraceOutput()) { |
| 11356 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11343 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 11357 } | 11344 } |
| 11358 | 11345 |
| 11359 #ifdef DEBUG | 11346 #ifdef DEBUG |
| 11360 graph_->Verify(false); // No full verify. | 11347 graph_->Verify(false); // No full verify. |
| 11361 #endif | 11348 #endif |
| 11362 } | 11349 } |
| 11363 | 11350 |
| 11364 } } // namespace v8::internal | 11351 } } // namespace v8::internal |
| OLD | NEW |