OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 3625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3636 | 3636 |
3637 | 3637 |
3638 HInstruction* HGraphBuilder::BuildLoadKeyedFastElement(HValue* object, | 3638 HInstruction* HGraphBuilder::BuildLoadKeyedFastElement(HValue* object, |
3639 HValue* key, | 3639 HValue* key, |
3640 Property* expr) { | 3640 Property* expr) { |
3641 ASSERT(!expr->key()->IsPropertyName() && expr->IsMonomorphic()); | 3641 ASSERT(!expr->key()->IsPropertyName() && expr->IsMonomorphic()); |
3642 AddInstruction(new HCheckNonSmi(object)); | 3642 AddInstruction(new HCheckNonSmi(object)); |
3643 Handle<Map> map = expr->GetMonomorphicReceiverType(); | 3643 Handle<Map> map = expr->GetMonomorphicReceiverType(); |
3644 ASSERT(map->has_fast_elements()); | 3644 ASSERT(map->has_fast_elements()); |
3645 AddInstruction(new HCheckMap(object, map)); | 3645 AddInstruction(new HCheckMap(object, map)); |
3646 HInstruction* elements = AddInstruction(new HLoadElements(object)); | 3646 bool is_array = (map->instance_type() == JS_ARRAY_TYPE); |
3647 HInstruction* length = AddInstruction(new HArrayLength(elements)); | 3647 HLoadElements* elements = new HLoadElements(object); |
3648 AddInstruction(new HBoundsCheck(key, length)); | 3648 HInstruction* length = NULL; |
| 3649 if (is_array) { |
| 3650 length = AddInstruction(new HJSArrayLength(object)); |
| 3651 AddInstruction(new HBoundsCheck(key, length)); |
| 3652 AddInstruction(elements); |
| 3653 } else { |
| 3654 AddInstruction(elements); |
| 3655 length = AddInstruction(new HFixedArrayLength(elements)); |
| 3656 AddInstruction(new HBoundsCheck(key, length)); |
| 3657 } |
3649 return new HLoadKeyedFastElement(elements, key); | 3658 return new HLoadKeyedFastElement(elements, key); |
3650 } | 3659 } |
3651 | 3660 |
3652 | 3661 |
3653 HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object, | 3662 HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object, |
3654 HValue* key, | 3663 HValue* key, |
3655 HValue* value) { | 3664 HValue* value) { |
3656 return new HStoreKeyedGeneric(object, key, value); | 3665 return new HStoreKeyedGeneric(object, key, value); |
3657 } | 3666 } |
3658 | 3667 |
3659 | 3668 |
3660 HInstruction* HGraphBuilder::BuildStoreKeyedFastElement(HValue* object, | 3669 HInstruction* HGraphBuilder::BuildStoreKeyedFastElement(HValue* object, |
3661 HValue* key, | 3670 HValue* key, |
3662 HValue* val, | 3671 HValue* val, |
3663 Expression* expr) { | 3672 Expression* expr) { |
3664 ASSERT(expr->IsMonomorphic()); | 3673 ASSERT(expr->IsMonomorphic()); |
3665 AddInstruction(new HCheckNonSmi(object)); | 3674 AddInstruction(new HCheckNonSmi(object)); |
3666 Handle<Map> map = expr->GetMonomorphicReceiverType(); | 3675 Handle<Map> map = expr->GetMonomorphicReceiverType(); |
3667 ASSERT(map->has_fast_elements()); | 3676 ASSERT(map->has_fast_elements()); |
3668 AddInstruction(new HCheckMap(object, map)); | 3677 AddInstruction(new HCheckMap(object, map)); |
3669 HInstruction* elements = AddInstruction(new HLoadElements(object)); | 3678 HInstruction* elements = AddInstruction(new HLoadElements(object)); |
3670 AddInstruction(new HCheckMap(elements, Factory::fixed_array_map())); | 3679 AddInstruction(new HCheckMap(elements, Factory::fixed_array_map())); |
3671 bool is_array = (map->instance_type() == JS_ARRAY_TYPE); | 3680 bool is_array = (map->instance_type() == JS_ARRAY_TYPE); |
3672 HInstruction* length = NULL; | 3681 HInstruction* length = NULL; |
3673 if (is_array) { | 3682 if (is_array) { |
3674 length = AddInstruction(new HArrayLength(object)); | 3683 length = AddInstruction(new HJSArrayLength(object)); |
3675 } else { | 3684 } else { |
3676 length = AddInstruction(new HArrayLength(elements)); | 3685 length = AddInstruction(new HFixedArrayLength(elements)); |
3677 } | 3686 } |
3678 AddInstruction(new HBoundsCheck(key, length)); | 3687 AddInstruction(new HBoundsCheck(key, length)); |
3679 return new HStoreKeyedFastElement(elements, key, val); | 3688 return new HStoreKeyedFastElement(elements, key, val); |
3680 } | 3689 } |
3681 | 3690 |
3682 | 3691 |
3683 bool HGraphBuilder::TryArgumentsAccess(Property* expr) { | 3692 bool HGraphBuilder::TryArgumentsAccess(Property* expr) { |
3684 VariableProxy* proxy = expr->obj()->AsVariableProxy(); | 3693 VariableProxy* proxy = expr->obj()->AsVariableProxy(); |
3685 if (proxy == NULL) return false; | 3694 if (proxy == NULL) return false; |
3686 if (!proxy->var()->IsStackAllocated()) return false; | 3695 if (!proxy->var()->IsStackAllocated()) return false; |
(...skipping 26 matching lines...) Expand all Loading... |
3713 | 3722 |
3714 if (TryArgumentsAccess(expr)) return; | 3723 if (TryArgumentsAccess(expr)) return; |
3715 CHECK_BAILOUT; | 3724 CHECK_BAILOUT; |
3716 | 3725 |
3717 VISIT_FOR_VALUE(expr->obj()); | 3726 VISIT_FOR_VALUE(expr->obj()); |
3718 | 3727 |
3719 HInstruction* instr = NULL; | 3728 HInstruction* instr = NULL; |
3720 if (expr->IsArrayLength()) { | 3729 if (expr->IsArrayLength()) { |
3721 HValue* array = Pop(); | 3730 HValue* array = Pop(); |
3722 AddInstruction(new HCheckNonSmi(array)); | 3731 AddInstruction(new HCheckNonSmi(array)); |
3723 instr = new HArrayLength(array); | 3732 AddInstruction(new HCheckInstanceType(array, JS_ARRAY_TYPE, JS_ARRAY_TYPE)); |
| 3733 instr = new HJSArrayLength(array); |
3724 | 3734 |
3725 } else if (expr->IsFunctionPrototype()) { | 3735 } else if (expr->IsFunctionPrototype()) { |
3726 HValue* function = Pop(); | 3736 HValue* function = Pop(); |
3727 AddInstruction(new HCheckNonSmi(function)); | 3737 AddInstruction(new HCheckNonSmi(function)); |
3728 instr = new HLoadFunctionPrototype(function); | 3738 instr = new HLoadFunctionPrototype(function); |
3729 | 3739 |
3730 } else if (expr->key()->IsPropertyName()) { | 3740 } else if (expr->key()->IsPropertyName()) { |
3731 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); | 3741 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); |
3732 ZoneMapList* types = expr->GetReceiverTypes(); | 3742 ZoneMapList* types = expr->GetReceiverTypes(); |
3733 | 3743 |
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4852 TypeInfo info = oracle()->CompareType(expr, TypeFeedbackOracle::RESULT); | 4862 TypeInfo info = oracle()->CompareType(expr, TypeFeedbackOracle::RESULT); |
4853 HInstruction* instr = NULL; | 4863 HInstruction* instr = NULL; |
4854 if (op == Token::INSTANCEOF) { | 4864 if (op == Token::INSTANCEOF) { |
4855 instr = new HInstanceOf(left, right); | 4865 instr = new HInstanceOf(left, right); |
4856 } else if (op == Token::IN) { | 4866 } else if (op == Token::IN) { |
4857 BAILOUT("Unsupported comparison: in"); | 4867 BAILOUT("Unsupported comparison: in"); |
4858 } else if (info.IsNonPrimitive()) { | 4868 } else if (info.IsNonPrimitive()) { |
4859 switch (op) { | 4869 switch (op) { |
4860 case Token::EQ: | 4870 case Token::EQ: |
4861 case Token::EQ_STRICT: { | 4871 case Token::EQ_STRICT: { |
| 4872 AddInstruction(new HCheckNonSmi(left)); |
4862 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(left)); | 4873 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(left)); |
| 4874 AddInstruction(new HCheckNonSmi(right)); |
4863 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(right)); | 4875 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(right)); |
4864 instr = new HCompareJSObjectEq(left, right); | 4876 instr = new HCompareJSObjectEq(left, right); |
4865 break; | 4877 break; |
4866 } | 4878 } |
4867 default: | 4879 default: |
4868 BAILOUT("Unsupported non-primitive compare"); | 4880 BAILOUT("Unsupported non-primitive compare"); |
4869 break; | 4881 break; |
4870 } | 4882 } |
4871 } else { | 4883 } else { |
4872 HCompare* compare = new HCompare(left, right, op); | 4884 HCompare* compare = new HCompare(left, right, op); |
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5682 } | 5694 } |
5683 | 5695 |
5684 #ifdef DEBUG | 5696 #ifdef DEBUG |
5685 if (graph_ != NULL) graph_->Verify(); | 5697 if (graph_ != NULL) graph_->Verify(); |
5686 if (chunk_ != NULL) chunk_->Verify(); | 5698 if (chunk_ != NULL) chunk_->Verify(); |
5687 if (allocator_ != NULL) allocator_->Verify(); | 5699 if (allocator_ != NULL) allocator_->Verify(); |
5688 #endif | 5700 #endif |
5689 } | 5701 } |
5690 | 5702 |
5691 } } // namespace v8::internal | 5703 } } // namespace v8::internal |
OLD | NEW |