| 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 8337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8348 Drop(2); // Receiver and function. | 8348 Drop(2); // Receiver and function. |
| 8349 HInstruction* result = HMul::NewImul(zone(), context(), left, right); | 8349 HInstruction* result = HMul::NewImul(zone(), context(), left, right); |
| 8350 ast_context()->ReturnInstruction(result, expr->id()); | 8350 ast_context()->ReturnInstruction(result, expr->id()); |
| 8351 return true; | 8351 return true; |
| 8352 } | 8352 } |
| 8353 break; | 8353 break; |
| 8354 case kArrayPop: { | 8354 case kArrayPop: { |
| 8355 if (receiver_map.is_null()) return false; | 8355 if (receiver_map.is_null()) return false; |
| 8356 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; | 8356 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; |
| 8357 ElementsKind elements_kind = receiver_map->elements_kind(); | 8357 ElementsKind elements_kind = receiver_map->elements_kind(); |
| 8358 if (JSArray::IsReadOnlyLengthDescriptor(receiver_map)) return false; |
| 8358 if (!IsFastElementsKind(elements_kind)) return false; | 8359 if (!IsFastElementsKind(elements_kind)) return false; |
| 8359 if (receiver_map->is_observed()) return false; | 8360 if (receiver_map->is_observed()) return false; |
| 8360 if (!receiver_map->is_extensible()) return false; | 8361 if (!receiver_map->is_extensible()) return false; |
| 8361 | 8362 |
| 8362 Drop(args_count_no_receiver); | 8363 Drop(args_count_no_receiver); |
| 8363 HValue* result; | 8364 HValue* result; |
| 8364 HValue* reduced_length; | 8365 HValue* reduced_length; |
| 8365 HValue* receiver = Pop(); | 8366 HValue* receiver = Pop(); |
| 8366 | 8367 |
| 8367 HValue* checked_object = AddCheckMap(receiver, receiver_map); | 8368 HValue* checked_object = AddCheckMap(receiver, receiver_map); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8465 if (!ast_context()->IsEffect()) Drop(1); | 8466 if (!ast_context()->IsEffect()) Drop(1); |
| 8466 } | 8467 } |
| 8467 | 8468 |
| 8468 ast_context()->ReturnValue(new_size); | 8469 ast_context()->ReturnValue(new_size); |
| 8469 return true; | 8470 return true; |
| 8470 } | 8471 } |
| 8471 case kArrayShift: { | 8472 case kArrayShift: { |
| 8472 if (receiver_map.is_null()) return false; | 8473 if (receiver_map.is_null()) return false; |
| 8473 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; | 8474 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; |
| 8474 ElementsKind kind = receiver_map->elements_kind(); | 8475 ElementsKind kind = receiver_map->elements_kind(); |
| 8476 if (JSArray::IsReadOnlyLengthDescriptor(receiver_map)) return false; |
| 8475 if (!IsFastElementsKind(kind)) return false; | 8477 if (!IsFastElementsKind(kind)) return false; |
| 8476 if (receiver_map->is_observed()) return false; | 8478 if (receiver_map->is_observed()) return false; |
| 8477 if (!receiver_map->is_extensible()) return false; | 8479 if (!receiver_map->is_extensible()) return false; |
| 8478 | 8480 |
| 8479 // If there may be elements accessors in the prototype chain, the fast | 8481 // If there may be elements accessors in the prototype chain, the fast |
| 8480 // inlined version can't be used. | 8482 // inlined version can't be used. |
| 8481 if (receiver_map->DictionaryElementsInPrototypeChainOnly()) return false; | 8483 if (receiver_map->DictionaryElementsInPrototypeChainOnly()) return false; |
| 8482 | 8484 |
| 8483 // If there currently can be no elements accessors on the prototype chain, | 8485 // If there currently can be no elements accessors on the prototype chain, |
| 8484 // it doesn't mean that there won't be any later. Install a full prototype | 8486 // it doesn't mean that there won't be any later. Install a full prototype |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8537 length, graph()->GetConstant1()); | 8539 length, graph()->GetConstant1()); |
| 8538 new_length->ClearFlag(HValue::kCanOverflow); | 8540 new_length->ClearFlag(HValue::kCanOverflow); |
| 8539 | 8541 |
| 8540 // Copy the remaining elements. | 8542 // Copy the remaining elements. |
| 8541 LoopBuilder loop(this, context(), LoopBuilder::kPostIncrement); | 8543 LoopBuilder loop(this, context(), LoopBuilder::kPostIncrement); |
| 8542 { | 8544 { |
| 8543 HValue* new_key = loop.BeginBody( | 8545 HValue* new_key = loop.BeginBody( |
| 8544 graph()->GetConstant0(), new_length, Token::LT); | 8546 graph()->GetConstant0(), new_length, Token::LT); |
| 8545 HValue* key = AddUncasted<HAdd>(new_key, graph()->GetConstant1()); | 8547 HValue* key = AddUncasted<HAdd>(new_key, graph()->GetConstant1()); |
| 8546 key->ClearFlag(HValue::kCanOverflow); | 8548 key->ClearFlag(HValue::kCanOverflow); |
| 8549 ElementsKind copy_kind = |
| 8550 kind == FAST_HOLEY_SMI_ELEMENTS ? FAST_HOLEY_ELEMENTS : kind; |
| 8547 HValue* element = AddUncasted<HLoadKeyed>( | 8551 HValue* element = AddUncasted<HLoadKeyed>( |
| 8548 elements, key, lengthiszero, kind, ALLOW_RETURN_HOLE); | 8552 elements, key, lengthiszero, copy_kind, ALLOW_RETURN_HOLE); |
| 8549 HStoreKeyed* store = Add<HStoreKeyed>( | 8553 HStoreKeyed* store = |
| 8550 elements, new_key, element, kind); | 8554 Add<HStoreKeyed>(elements, new_key, element, copy_kind); |
| 8551 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 8555 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
| 8552 } | 8556 } |
| 8553 loop.EndBody(); | 8557 loop.EndBody(); |
| 8554 | 8558 |
| 8555 // Put a hole at the end. | 8559 // Put a hole at the end. |
| 8556 HValue* hole = IsFastSmiOrObjectElementsKind(kind) | 8560 HValue* hole = IsFastSmiOrObjectElementsKind(kind) |
| 8557 ? Add<HConstant>(isolate()->factory()->the_hole_value()) | 8561 ? Add<HConstant>(isolate()->factory()->the_hole_value()) |
| 8558 : Add<HConstant>(FixedDoubleArray::hole_nan_as_double()); | 8562 : Add<HConstant>(FixedDoubleArray::hole_nan_as_double()); |
| 8559 if (IsFastSmiOrObjectElementsKind(kind)) kind = FAST_HOLEY_ELEMENTS; | 8563 if (IsFastSmiOrObjectElementsKind(kind)) kind = FAST_HOLEY_ELEMENTS; |
| 8560 Add<HStoreKeyed>( | 8564 Add<HStoreKeyed>( |
| (...skipping 2807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11368 Handle<Object> value(fast_elements->get(i), isolate()); | 11372 Handle<Object> value(fast_elements->get(i), isolate()); |
| 11369 HValue* key_constant = Add<HConstant>(i); | 11373 HValue* key_constant = Add<HConstant>(i); |
| 11370 if (value->IsJSObject()) { | 11374 if (value->IsJSObject()) { |
| 11371 Handle<JSObject> value_object = Handle<JSObject>::cast(value); | 11375 Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
| 11372 Handle<AllocationSite> current_site = site_context->EnterNewScope(); | 11376 Handle<AllocationSite> current_site = site_context->EnterNewScope(); |
| 11373 HInstruction* result = | 11377 HInstruction* result = |
| 11374 BuildFastLiteral(value_object, site_context); | 11378 BuildFastLiteral(value_object, site_context); |
| 11375 site_context->ExitScope(current_site, value_object); | 11379 site_context->ExitScope(current_site, value_object); |
| 11376 Add<HStoreKeyed>(object_elements, key_constant, result, kind); | 11380 Add<HStoreKeyed>(object_elements, key_constant, result, kind); |
| 11377 } else { | 11381 } else { |
| 11378 HInstruction* value_instruction = | 11382 ElementsKind copy_kind = |
| 11379 Add<HLoadKeyed>(boilerplate_elements, key_constant, | 11383 kind == FAST_HOLEY_SMI_ELEMENTS ? FAST_HOLEY_ELEMENTS : kind; |
| 11380 static_cast<HValue*>(NULL), kind, | 11384 HInstruction* value_instruction = Add<HLoadKeyed>( |
| 11381 ALLOW_RETURN_HOLE); | 11385 boilerplate_elements, key_constant, static_cast<HValue*>(NULL), |
| 11382 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); | 11386 copy_kind, ALLOW_RETURN_HOLE); |
| 11387 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, |
| 11388 copy_kind); |
| 11383 } | 11389 } |
| 11384 } | 11390 } |
| 11385 } | 11391 } |
| 11386 | 11392 |
| 11387 | 11393 |
| 11388 void HOptimizedGraphBuilder::VisitThisFunction(ThisFunction* expr) { | 11394 void HOptimizedGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
| 11389 DCHECK(!HasStackOverflow()); | 11395 DCHECK(!HasStackOverflow()); |
| 11390 DCHECK(current_block() != NULL); | 11396 DCHECK(current_block() != NULL); |
| 11391 DCHECK(current_block()->HasPredecessor()); | 11397 DCHECK(current_block()->HasPredecessor()); |
| 11392 HInstruction* instr = BuildThisFunction(); | 11398 HInstruction* instr = BuildThisFunction(); |
| (...skipping 1340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12733 if (ShouldProduceTraceOutput()) { | 12739 if (ShouldProduceTraceOutput()) { |
| 12734 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 12740 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 12735 } | 12741 } |
| 12736 | 12742 |
| 12737 #ifdef DEBUG | 12743 #ifdef DEBUG |
| 12738 graph_->Verify(false); // No full verify. | 12744 graph_->Verify(false); // No full verify. |
| 12739 #endif | 12745 #endif |
| 12740 } | 12746 } |
| 12741 | 12747 |
| 12742 } } // namespace v8::internal | 12748 } } // namespace v8::internal |
| OLD | NEW |