| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/hydrogen.h" | 5 #include "src/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 1313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 PropertyAccessType access_type) { | 1324 PropertyAccessType access_type) { |
| 1325 IfBuilder length_checker(this); | 1325 IfBuilder length_checker(this); |
| 1326 | 1326 |
| 1327 Token::Value token = IsHoleyElementsKind(kind) ? Token::GTE : Token::EQ; | 1327 Token::Value token = IsHoleyElementsKind(kind) ? Token::GTE : Token::EQ; |
| 1328 length_checker.If<HCompareNumericAndBranch>(key, length, token); | 1328 length_checker.If<HCompareNumericAndBranch>(key, length, token); |
| 1329 | 1329 |
| 1330 length_checker.Then(); | 1330 length_checker.Then(); |
| 1331 | 1331 |
| 1332 HValue* current_capacity = AddLoadFixedArrayLength(elements); | 1332 HValue* current_capacity = AddLoadFixedArrayLength(elements); |
| 1333 | 1333 |
| 1334 IfBuilder capacity_checker(this); | |
| 1335 | |
| 1336 capacity_checker.If<HCompareNumericAndBranch>(key, current_capacity, | |
| 1337 Token::GTE); | |
| 1338 capacity_checker.Then(); | |
| 1339 | |
| 1340 // BuildCheckAndGrowElementsCapacity could de-opt without profitable feedback | |
| 1341 // therefore we defer calling it to a stub in optimized functions. It is | |
| 1342 // okay to call directly in a code stub though, because a bailout to the | |
| 1343 // runtime is tolerable in the corner cases. | |
| 1344 if (top_info()->IsStub()) { | 1334 if (top_info()->IsStub()) { |
| 1335 IfBuilder capacity_checker(this); |
| 1336 capacity_checker.If<HCompareNumericAndBranch>(key, current_capacity, |
| 1337 Token::GTE); |
| 1338 capacity_checker.Then(); |
| 1345 HValue* new_elements = BuildCheckAndGrowElementsCapacity( | 1339 HValue* new_elements = BuildCheckAndGrowElementsCapacity( |
| 1346 object, elements, kind, length, current_capacity, key); | 1340 object, elements, kind, length, current_capacity, key); |
| 1347 environment()->Push(new_elements); | 1341 environment()->Push(new_elements); |
| 1342 capacity_checker.Else(); |
| 1343 environment()->Push(elements); |
| 1344 capacity_checker.End(); |
| 1348 } else { | 1345 } else { |
| 1349 GrowArrayElementsStub stub(isolate(), is_js_array, kind); | 1346 HValue* result = Add<HMaybeGrowElements>( |
| 1350 GrowArrayElementsDescriptor descriptor(isolate()); | 1347 object, elements, key, current_capacity, is_js_array, kind); |
| 1351 HConstant* target = Add<HConstant>(stub.GetCode()); | 1348 environment()->Push(result); |
| 1352 HValue* op_vals[] = {context(), object, key, current_capacity}; | |
| 1353 HValue* new_elements = Add<HCallWithDescriptor>( | |
| 1354 target, 0, descriptor, Vector<HValue*>(op_vals, 4)); | |
| 1355 // If the object changed to a dictionary, GrowArrayElements will return a | |
| 1356 // smi to signal that deopt is required. | |
| 1357 Add<HCheckHeapObject>(new_elements); | |
| 1358 environment()->Push(new_elements); | |
| 1359 } | 1349 } |
| 1360 | 1350 |
| 1361 capacity_checker.Else(); | |
| 1362 | |
| 1363 environment()->Push(elements); | |
| 1364 capacity_checker.End(); | |
| 1365 | |
| 1366 if (is_js_array) { | 1351 if (is_js_array) { |
| 1367 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1()); | 1352 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1()); |
| 1368 new_length->ClearFlag(HValue::kCanOverflow); | 1353 new_length->ClearFlag(HValue::kCanOverflow); |
| 1369 | 1354 |
| 1370 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind), | 1355 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind), |
| 1371 new_length); | 1356 new_length); |
| 1372 } | 1357 } |
| 1373 | 1358 |
| 1374 if (access_type == STORE && kind == FAST_SMI_ELEMENTS) { | 1359 if (access_type == STORE && kind == FAST_SMI_ELEMENTS) { |
| 1375 HValue* checked_elements = environment()->Top(); | 1360 HValue* checked_elements = environment()->Top(); |
| (...skipping 11771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13147 if (ShouldProduceTraceOutput()) { | 13132 if (ShouldProduceTraceOutput()) { |
| 13148 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13133 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13149 } | 13134 } |
| 13150 | 13135 |
| 13151 #ifdef DEBUG | 13136 #ifdef DEBUG |
| 13152 graph_->Verify(false); // No full verify. | 13137 graph_->Verify(false); // No full verify. |
| 13153 #endif | 13138 #endif |
| 13154 } | 13139 } |
| 13155 | 13140 |
| 13156 } } // namespace v8::internal | 13141 } } // namespace v8::internal |
| OLD | NEW |