| 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 2407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2418 length = Add<HLoadNamedField>( | 2418 length = Add<HLoadNamedField>( |
| 2419 checked_object->ActualValue(), checked_object, | 2419 checked_object->ActualValue(), checked_object, |
| 2420 HObjectAccess::ForArrayLength(elements_kind)); | 2420 HObjectAccess::ForArrayLength(elements_kind)); |
| 2421 } else { | 2421 } else { |
| 2422 length = AddLoadFixedArrayLength(elements); | 2422 length = AddLoadFixedArrayLength(elements); |
| 2423 } | 2423 } |
| 2424 length->set_type(HType::Smi()); | 2424 length->set_type(HType::Smi()); |
| 2425 HValue* checked_key = NULL; | 2425 HValue* checked_key = NULL; |
| 2426 if (IsExternalArrayElementsKind(elements_kind) || | 2426 if (IsExternalArrayElementsKind(elements_kind) || |
| 2427 IsFixedTypedArrayElementsKind(elements_kind)) { | 2427 IsFixedTypedArrayElementsKind(elements_kind)) { |
| 2428 checked_object = Add<HCheckArrayBufferNotNeutered>(checked_object); |
| 2429 |
| 2428 HValue* backing_store; | 2430 HValue* backing_store; |
| 2429 if (IsExternalArrayElementsKind(elements_kind)) { | 2431 if (IsExternalArrayElementsKind(elements_kind)) { |
| 2430 backing_store = Add<HLoadNamedField>( | 2432 backing_store = Add<HLoadNamedField>( |
| 2431 elements, nullptr, HObjectAccess::ForExternalArrayExternalPointer()); | 2433 elements, nullptr, HObjectAccess::ForExternalArrayExternalPointer()); |
| 2432 } else { | 2434 } else { |
| 2433 backing_store = elements; | 2435 backing_store = elements; |
| 2434 } | 2436 } |
| 2435 if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { | 2437 if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { |
| 2436 NoObservableSideEffectsScope no_effects(this); | 2438 NoObservableSideEffectsScope no_effects(this); |
| 2437 if (IsExternalArrayElementsKind(elements_kind)) { | |
| 2438 HInstruction* buffer = | |
| 2439 Add<HLoadNamedField>(checked_object, nullptr, | |
| 2440 HObjectAccess::ForJSArrayBufferViewBuffer()); | |
| 2441 HInstruction* flags = Add<HLoadNamedField>( | |
| 2442 buffer, nullptr, HObjectAccess::ForJSArrayBufferBitField()); | |
| 2443 HValue* was_neutered_mask = | |
| 2444 Add<HConstant>(1 << JSArrayBuffer::WasNeutered::kShift); | |
| 2445 HValue* was_neutered_test = | |
| 2446 AddUncasted<HBitwise>(Token::BIT_AND, flags, was_neutered_mask); | |
| 2447 | |
| 2448 IfBuilder if_was_neutered(this); | |
| 2449 if_was_neutered.If<HCompareNumericAndBranch>( | |
| 2450 was_neutered_test, graph()->GetConstant0(), Token::NE); | |
| 2451 if_was_neutered.ThenDeopt(Deoptimizer::kOutOfBounds); | |
| 2452 if_was_neutered.End(); | |
| 2453 } | |
| 2454 IfBuilder length_checker(this); | 2439 IfBuilder length_checker(this); |
| 2455 length_checker.If<HCompareNumericAndBranch>(key, length, Token::LT); | 2440 length_checker.If<HCompareNumericAndBranch>(key, length, Token::LT); |
| 2456 length_checker.Then(); | 2441 length_checker.Then(); |
| 2457 IfBuilder negative_checker(this); | 2442 IfBuilder negative_checker(this); |
| 2458 HValue* bounds_check = negative_checker.If<HCompareNumericAndBranch>( | 2443 HValue* bounds_check = negative_checker.If<HCompareNumericAndBranch>( |
| 2459 key, graph()->GetConstant0(), Token::GTE); | 2444 key, graph()->GetConstant0(), Token::GTE); |
| 2460 negative_checker.Then(); | 2445 negative_checker.Then(); |
| 2461 HInstruction* result = AddElementAccess( | 2446 HInstruction* result = AddElementAccess( |
| 2462 backing_store, key, val, bounds_check, elements_kind, access_type); | 2447 backing_store, key, val, bounds_check, elements_kind, access_type); |
| 2463 negative_checker.ElseDeopt(Deoptimizer::kNegativeKeyEncountered); | 2448 negative_checker.ElseDeopt(Deoptimizer::kNegativeKeyEncountered); |
| 2464 negative_checker.End(); | 2449 negative_checker.End(); |
| 2465 length_checker.End(); | 2450 length_checker.End(); |
| 2466 return result; | 2451 return result; |
| 2467 } else { | 2452 } else { |
| 2468 if (IsExternalArrayElementsKind(elements_kind)) { | |
| 2469 HInstruction* buffer = | |
| 2470 Add<HLoadNamedField>(checked_object, nullptr, | |
| 2471 HObjectAccess::ForJSArrayBufferViewBuffer()); | |
| 2472 HInstruction* buffer_length = Add<HLoadNamedField>( | |
| 2473 buffer, nullptr, HObjectAccess::ForJSArrayBufferByteLength()); | |
| 2474 Add<HBoundsCheck>(graph()->GetConstant0(), buffer_length); | |
| 2475 } | |
| 2476 DCHECK(store_mode == STANDARD_STORE); | 2453 DCHECK(store_mode == STANDARD_STORE); |
| 2477 checked_key = Add<HBoundsCheck>(key, length); | 2454 checked_key = Add<HBoundsCheck>(key, length); |
| 2478 return AddElementAccess( | 2455 return AddElementAccess( |
| 2479 backing_store, checked_key, val, | 2456 backing_store, checked_key, val, |
| 2480 checked_object, elements_kind, access_type); | 2457 checked_object, elements_kind, access_type); |
| 2481 } | 2458 } |
| 2482 } | 2459 } |
| 2483 DCHECK(fast_smi_only_elements || | 2460 DCHECK(fast_smi_only_elements || |
| 2484 fast_elements || | 2461 fast_elements || |
| 2485 IsFastDoubleElementsKind(elements_kind)); | 2462 IsFastDoubleElementsKind(elements_kind)); |
| (...skipping 3847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6333 HValue* value, BailoutId ast_id, BailoutId return_id, | 6310 HValue* value, BailoutId ast_id, BailoutId return_id, |
| 6334 bool can_inline_accessor) { | 6311 bool can_inline_accessor) { |
| 6335 HObjectAccess access = HObjectAccess::ForMap(); // bogus default | 6312 HObjectAccess access = HObjectAccess::ForMap(); // bogus default |
| 6336 if (info->GetJSObjectFieldAccess(&access)) { | 6313 if (info->GetJSObjectFieldAccess(&access)) { |
| 6337 DCHECK(info->IsLoad()); | 6314 DCHECK(info->IsLoad()); |
| 6338 return New<HLoadNamedField>(object, checked_object, access); | 6315 return New<HLoadNamedField>(object, checked_object, access); |
| 6339 } | 6316 } |
| 6340 | 6317 |
| 6341 if (info->GetJSArrayBufferViewFieldAccess(&access)) { | 6318 if (info->GetJSArrayBufferViewFieldAccess(&access)) { |
| 6342 DCHECK(info->IsLoad()); | 6319 DCHECK(info->IsLoad()); |
| 6343 return BuildArrayBufferViewFieldAccessor( | 6320 checked_object = Add<HCheckArrayBufferNotNeutered>(checked_object); |
| 6344 object, checked_object, FieldIndex::ForInObjectOffset(access.offset())); | 6321 return New<HLoadNamedField>(object, checked_object, access); |
| 6345 } | 6322 } |
| 6346 | 6323 |
| 6347 if (info->name().is_identical_to(isolate()->factory()->prototype_string()) && | 6324 if (info->name().is_identical_to(isolate()->factory()->prototype_string()) && |
| 6348 info->map()->function_with_prototype()) { | 6325 info->map()->function_with_prototype()) { |
| 6349 DCHECK(!info->map()->has_non_instance_prototype()); | 6326 DCHECK(!info->map()->has_non_instance_prototype()); |
| 6350 return New<HLoadFunctionPrototype>(checked_object); | 6327 return New<HLoadFunctionPrototype>(checked_object); |
| 6351 } | 6328 } |
| 6352 | 6329 |
| 6353 HValue* checked_holder = checked_object; | 6330 HValue* checked_holder = checked_object; |
| 6354 if (info->has_holder()) { | 6331 if (info->has_holder()) { |
| (...skipping 6774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13129 if (ShouldProduceTraceOutput()) { | 13106 if (ShouldProduceTraceOutput()) { |
| 13130 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13107 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13131 } | 13108 } |
| 13132 | 13109 |
| 13133 #ifdef DEBUG | 13110 #ifdef DEBUG |
| 13134 graph_->Verify(false); // No full verify. | 13111 graph_->Verify(false); // No full verify. |
| 13135 #endif | 13112 #endif |
| 13136 } | 13113 } |
| 13137 | 13114 |
| 13138 } } // namespace v8::internal | 13115 } } // namespace v8::internal |
| OLD | NEW |