Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1691 kind)); | 1691 kind)); |
| 1692 } | 1692 } |
| 1693 } | 1693 } |
| 1694 | 1694 |
| 1695 return object; | 1695 return object; |
| 1696 } | 1696 } |
| 1697 | 1697 |
| 1698 | 1698 |
| 1699 void HGraphBuilder::BuildCompareNil( | 1699 void HGraphBuilder::BuildCompareNil( |
| 1700 HValue* value, | 1700 HValue* value, |
| 1701 CompareNilICStub::Types types, | 1701 Handle<Type> type, |
| 1702 Handle<Map> map, | |
| 1703 int position, | 1702 int position, |
| 1704 HIfContinuation* continuation) { | 1703 HIfContinuation* continuation) { |
| 1705 IfBuilder if_nil(this, position); | 1704 IfBuilder if_nil(this, position); |
| 1706 bool needs_or = false; | 1705 bool needs_or = false; |
| 1707 if (types.Contains(CompareNilICStub::NULL_TYPE)) { | 1706 if (type->Maybe(Type::Null())) { |
| 1708 if (needs_or) if_nil.Or(); | 1707 if (needs_or) if_nil.Or(); |
| 1709 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); | 1708 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); |
| 1710 needs_or = true; | 1709 needs_or = true; |
| 1711 } | 1710 } |
| 1712 if (types.Contains(CompareNilICStub::UNDEFINED)) { | 1711 if (type->Maybe(Type::Undefined())) { |
| 1713 if (needs_or) if_nil.Or(); | 1712 if (needs_or) if_nil.Or(); |
| 1714 if_nil.If<HCompareObjectEqAndBranch>(value, | 1713 if_nil.If<HCompareObjectEqAndBranch>(value, |
| 1715 graph()->GetConstantUndefined()); | 1714 graph()->GetConstantUndefined()); |
| 1716 needs_or = true; | 1715 needs_or = true; |
| 1717 } | 1716 } |
| 1718 // Handle either undetectable or monomorphic, not both. | 1717 if (type->Maybe(Type::Undetectable())) { |
| 1719 ASSERT(!types.Contains(CompareNilICStub::UNDETECTABLE) || | |
|
Jakob Kummerow
2013/06/11 17:58:07
I think you could preserve this ASSERT:
if (typ
rossberg
2013/06/12 17:21:32
No, as discussed offline, this would no longer be
| |
| 1720 !types.Contains(CompareNilICStub::MONOMORPHIC_MAP)); | |
| 1721 if (types.Contains(CompareNilICStub::UNDETECTABLE)) { | |
| 1722 if (needs_or) if_nil.Or(); | 1718 if (needs_or) if_nil.Or(); |
| 1723 if_nil.If<HIsUndetectableAndBranch>(value); | 1719 if_nil.If<HIsUndetectableAndBranch>(value); |
| 1724 } else { | 1720 } else { |
| 1725 if_nil.Then(); | 1721 if_nil.Then(); |
| 1726 if_nil.Else(); | 1722 if_nil.Else(); |
| 1727 if (!map.is_null() && types.Contains(CompareNilICStub::MONOMORPHIC_MAP)) { | 1723 if (type->NumClasses() == 1) { |
| 1728 BuildCheckNonSmi(value); | 1724 BuildCheckNonSmi(value); |
| 1729 // For ICs, the map checked below is a sentinel map that gets replaced by | 1725 // For ICs, the map checked below is a sentinel map that gets replaced by |
| 1730 // the monomorphic map when the code is used as a template to generate a | 1726 // the monomorphic map when the code is used as a template to generate a |
| 1731 // new IC. For optimized functions, there is no sentinel map, the map | 1727 // new IC. For optimized functions, there is no sentinel map, the map |
| 1732 // emitted below is the actual monomorphic map. | 1728 // emitted below is the actual monomorphic map. |
| 1733 BuildCheckMap(value, map); | 1729 BuildCheckMap(value, type->Classes().Get()); |
| 1734 } else { | 1730 } else { |
| 1735 if_nil.Deopt(); | 1731 if_nil.Deopt(); |
| 1736 } | 1732 } |
| 1737 } | 1733 } |
| 1738 | 1734 |
| 1739 if_nil.CaptureContinuation(continuation); | 1735 if_nil.CaptureContinuation(continuation); |
| 1740 } | 1736 } |
| 1741 | 1737 |
| 1742 | 1738 |
| 1743 HValue* HGraphBuilder::BuildCreateAllocationSiteInfo(HValue* previous_object, | 1739 HValue* HGraphBuilder::BuildCreateAllocationSiteInfo(HValue* previous_object, |
| (...skipping 3276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5020 // Generate a compare and branch. | 5016 // Generate a compare and branch. |
| 5021 CHECK_ALIVE(VisitForValue(clause->label())); | 5017 CHECK_ALIVE(VisitForValue(clause->label())); |
| 5022 HValue* label_value = Pop(); | 5018 HValue* label_value = Pop(); |
| 5023 | 5019 |
| 5024 HBasicBlock* next_test_block = graph()->CreateBasicBlock(); | 5020 HBasicBlock* next_test_block = graph()->CreateBasicBlock(); |
| 5025 HBasicBlock* body_block = graph()->CreateBasicBlock(); | 5021 HBasicBlock* body_block = graph()->CreateBasicBlock(); |
| 5026 | 5022 |
| 5027 HControlInstruction* compare; | 5023 HControlInstruction* compare; |
| 5028 | 5024 |
| 5029 if (stmt->switch_type() == SwitchStatement::SMI_SWITCH) { | 5025 if (stmt->switch_type() == SwitchStatement::SMI_SWITCH) { |
| 5030 if (!clause->IsSmiCompare()) { | 5026 if (!clause->compare_type()->Is(Type::Integer31())) { |
| 5031 AddSoftDeoptimize(); | 5027 AddSoftDeoptimize(); |
| 5032 } | 5028 } |
| 5033 | 5029 |
| 5034 HCompareIDAndBranch* compare_ = | 5030 HCompareIDAndBranch* compare_ = |
| 5035 new(zone()) HCompareIDAndBranch(tag_value, | 5031 new(zone()) HCompareIDAndBranch(tag_value, |
| 5036 label_value, | 5032 label_value, |
| 5037 Token::EQ_STRICT); | 5033 Token::EQ_STRICT); |
| 5038 compare_->set_observed_input_representation( | 5034 compare_->set_observed_input_representation( |
| 5039 Representation::Integer32(), Representation::Integer32()); | 5035 Representation::Integer32(), Representation::Integer32()); |
| 5040 compare = compare_; | 5036 compare = compare_; |
| (...skipping 2950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7991 &target_info, | 7987 &target_info, |
| 7992 target_shared); | 7988 target_shared); |
| 7993 } | 7989 } |
| 7994 | 7990 |
| 7995 // ---------------------------------------------------------------- | 7991 // ---------------------------------------------------------------- |
| 7996 // After this point, we've made a decision to inline this function (so | 7992 // After this point, we've made a decision to inline this function (so |
| 7997 // TryInline should always return true). | 7993 // TryInline should always return true). |
| 7998 | 7994 |
| 7999 // Type-check the inlined function. | 7995 // Type-check the inlined function. |
| 8000 ASSERT(target_shared->has_deoptimization_support()); | 7996 ASSERT(target_shared->has_deoptimization_support()); |
| 8001 AstTyper::Type(&target_info); | 7997 AstTyper::Run(&target_info); |
| 8002 | 7998 |
| 8003 // Save the pending call context. Set up new one for the inlined function. | 7999 // Save the pending call context. Set up new one for the inlined function. |
| 8004 // The function state is new-allocated because we need to delete it | 8000 // The function state is new-allocated because we need to delete it |
| 8005 // in two different places. | 8001 // in two different places. |
| 8006 FunctionState* target_state = new FunctionState( | 8002 FunctionState* target_state = new FunctionState( |
| 8007 this, &target_info, inlining_kind); | 8003 this, &target_info, inlining_kind); |
| 8008 | 8004 |
| 8009 HConstant* undefined = graph()->GetConstantUndefined(); | 8005 HConstant* undefined = graph()->GetConstantUndefined(); |
| 8010 bool undefined_receiver = HEnvironment::UseUndefinedReceiver( | 8006 bool undefined_receiver = HEnvironment::UseUndefinedReceiver( |
| 8011 target, function, call_kind, inlining_kind); | 8007 target, function, call_kind, inlining_kind); |
| (...skipping 1669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9681 CHECK_ALIVE(VisitForValue(expr->left())); | 9677 CHECK_ALIVE(VisitForValue(expr->left())); |
| 9682 CHECK_ALIVE(VisitForValue(expr->right())); | 9678 CHECK_ALIVE(VisitForValue(expr->right())); |
| 9683 HValue* right = Pop(); | 9679 HValue* right = Pop(); |
| 9684 HValue* left = Pop(); | 9680 HValue* left = Pop(); |
| 9685 HInstruction* instr = BuildBinaryOperation(expr, left, right); | 9681 HInstruction* instr = BuildBinaryOperation(expr, left, right); |
| 9686 instr->set_position(expr->position()); | 9682 instr->set_position(expr->position()); |
| 9687 return ast_context()->ReturnInstruction(instr, expr->id()); | 9683 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 9688 } | 9684 } |
| 9689 | 9685 |
| 9690 | 9686 |
| 9687 // TODO(rossberg): this should die eventually. | |
| 9691 Representation HOptimizedGraphBuilder::ToRepresentation(TypeInfo info) { | 9688 Representation HOptimizedGraphBuilder::ToRepresentation(TypeInfo info) { |
| 9692 if (info.IsUninitialized()) return Representation::None(); | 9689 if (info.IsUninitialized()) return Representation::None(); |
| 9693 if (info.IsSmi()) return Representation::Integer32(); | 9690 if (info.IsSmi()) return Representation::Integer32(); |
| 9694 if (info.IsInteger32()) return Representation::Integer32(); | 9691 if (info.IsInteger32()) return Representation::Integer32(); |
| 9695 if (info.IsDouble()) return Representation::Double(); | 9692 if (info.IsDouble()) return Representation::Double(); |
| 9696 if (info.IsNumber()) return Representation::Double(); | 9693 if (info.IsNumber()) return Representation::Double(); |
| 9697 return Representation::Tagged(); | 9694 return Representation::Tagged(); |
| 9698 } | 9695 } |
| 9699 | 9696 |
| 9700 | 9697 |
| 9698 Representation HOptimizedGraphBuilder::ToRepresentation(Handle<Type> type) { | |
| 9699 if (type->Is(Type::None())) return Representation::None(); | |
| 9700 if (type->Is(Type::Integer32())) return Representation::Integer32(); | |
| 9701 if (type->Is(Type::Number())) return Representation::Double(); | |
| 9702 return Representation::Tagged(); | |
| 9703 } | |
| 9704 | |
| 9705 | |
| 9701 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, | 9706 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
| 9702 HTypeof* typeof_expr, | 9707 HTypeof* typeof_expr, |
| 9703 Handle<String> check) { | 9708 Handle<String> check) { |
| 9704 // Note: The HTypeof itself is removed during canonicalization, if possible. | 9709 // Note: The HTypeof itself is removed during canonicalization, if possible. |
| 9705 HValue* value = typeof_expr->value(); | 9710 HValue* value = typeof_expr->value(); |
| 9706 HTypeofIsAndBranch* instr = new(zone()) HTypeofIsAndBranch(value, check); | 9711 HTypeofIsAndBranch* instr = new(zone()) HTypeofIsAndBranch(value, check); |
| 9707 instr->set_position(expr->position()); | 9712 instr->set_position(expr->position()); |
| 9708 return ast_context()->ReturnControl(instr, expr->id()); | 9713 return ast_context()->ReturnControl(instr, expr->id()); |
| 9709 } | 9714 } |
| 9710 | 9715 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9780 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9785 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9781 HValue* value = Pop(); | 9786 HValue* value = Pop(); |
| 9782 Literal* literal = expr->right()->AsLiteral(); | 9787 Literal* literal = expr->right()->AsLiteral(); |
| 9783 Handle<String> rhs = Handle<String>::cast(literal->handle()); | 9788 Handle<String> rhs = Handle<String>::cast(literal->handle()); |
| 9784 HClassOfTestAndBranch* instr = | 9789 HClassOfTestAndBranch* instr = |
| 9785 new(zone()) HClassOfTestAndBranch(value, rhs); | 9790 new(zone()) HClassOfTestAndBranch(value, rhs); |
| 9786 instr->set_position(expr->position()); | 9791 instr->set_position(expr->position()); |
| 9787 return ast_context()->ReturnControl(instr, expr->id()); | 9792 return ast_context()->ReturnControl(instr, expr->id()); |
| 9788 } | 9793 } |
| 9789 | 9794 |
| 9790 TypeInfo left_type = expr->left_type(); | 9795 Handle<Type> left_type = expr->left_type(); |
| 9791 TypeInfo right_type = expr->right_type(); | 9796 Handle<Type> right_type = expr->right_type(); |
| 9792 TypeInfo overall_type = expr->overall_type(); | 9797 Handle<Type> overall_type = expr->overall_type(); |
| 9793 Representation combined_rep = ToRepresentation(overall_type); | 9798 Representation combined_rep = ToRepresentation(overall_type); |
| 9794 Representation left_rep = ToRepresentation(left_type); | 9799 Representation left_rep = ToRepresentation(left_type); |
| 9795 Representation right_rep = ToRepresentation(right_type); | 9800 Representation right_rep = ToRepresentation(right_type); |
| 9796 // Check if this expression was ever executed according to type feedback. | 9801 // Check if this expression was ever executed according to type feedback. |
| 9797 // Note that for the special typeof/null/undefined cases we get unknown here. | 9802 // Note that for the special typeof/null/undefined cases we get unknown here. |
| 9798 if (overall_type.IsUninitialized()) { | 9803 if (overall_type->Is(Type::None())) { |
| 9799 AddSoftDeoptimize(); | 9804 AddSoftDeoptimize(); |
| 9800 overall_type = left_type = right_type = TypeInfo::Unknown(); | 9805 overall_type = left_type = right_type = handle(Type::Any(), isolate()); |
| 9801 } | 9806 } |
| 9802 | 9807 |
| 9803 CHECK_ALIVE(VisitForValue(expr->left())); | 9808 CHECK_ALIVE(VisitForValue(expr->left())); |
| 9804 CHECK_ALIVE(VisitForValue(expr->right())); | 9809 CHECK_ALIVE(VisitForValue(expr->right())); |
| 9805 | 9810 |
| 9806 HValue* context = environment()->LookupContext(); | 9811 HValue* context = environment()->LookupContext(); |
| 9807 HValue* right = Pop(); | 9812 HValue* right = Pop(); |
| 9808 HValue* left = Pop(); | 9813 HValue* left = Pop(); |
| 9809 Token::Value op = expr->op(); | 9814 Token::Value op = expr->op(); |
| 9810 | 9815 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9862 AddInstruction(new(zone()) HCheckFunction(right, target)); | 9867 AddInstruction(new(zone()) HCheckFunction(right, target)); |
| 9863 HInstanceOfKnownGlobal* result = | 9868 HInstanceOfKnownGlobal* result = |
| 9864 new(zone()) HInstanceOfKnownGlobal(context, left, target); | 9869 new(zone()) HInstanceOfKnownGlobal(context, left, target); |
| 9865 result->set_position(expr->position()); | 9870 result->set_position(expr->position()); |
| 9866 return ast_context()->ReturnInstruction(result, expr->id()); | 9871 return ast_context()->ReturnInstruction(result, expr->id()); |
| 9867 } | 9872 } |
| 9868 } else if (op == Token::IN) { | 9873 } else if (op == Token::IN) { |
| 9869 HIn* result = new(zone()) HIn(context, left, right); | 9874 HIn* result = new(zone()) HIn(context, left, right); |
| 9870 result->set_position(expr->position()); | 9875 result->set_position(expr->position()); |
| 9871 return ast_context()->ReturnInstruction(result, expr->id()); | 9876 return ast_context()->ReturnInstruction(result, expr->id()); |
| 9872 } else if (overall_type.IsNonPrimitive()) { | 9877 } else if (overall_type->Is(Type::Receiver())) { |
| 9873 switch (op) { | 9878 switch (op) { |
| 9874 case Token::EQ: | 9879 case Token::EQ: |
| 9875 case Token::EQ_STRICT: { | 9880 case Token::EQ_STRICT: { |
| 9876 // Can we get away with map check and not instance type check? | 9881 // Can we get away with map check and not instance type check? |
| 9877 Handle<Map> map = expr->map(); | 9882 if (overall_type->IsClass()) { |
| 9878 if (!map.is_null()) { | 9883 Handle<Map> map = overall_type->AsClass(); |
| 9879 AddCheckMapsWithTransitions(left, map); | 9884 AddCheckMapsWithTransitions(left, map); |
| 9880 AddCheckMapsWithTransitions(right, map); | 9885 AddCheckMapsWithTransitions(right, map); |
| 9881 HCompareObjectEqAndBranch* result = | 9886 HCompareObjectEqAndBranch* result = |
| 9882 new(zone()) HCompareObjectEqAndBranch(left, right); | 9887 new(zone()) HCompareObjectEqAndBranch(left, right); |
| 9883 result->set_position(expr->position()); | 9888 result->set_position(expr->position()); |
| 9884 return ast_context()->ReturnControl(result, expr->id()); | 9889 return ast_context()->ReturnControl(result, expr->id()); |
| 9885 } else { | 9890 } else { |
| 9886 BuildCheckNonSmi(left); | 9891 BuildCheckNonSmi(left); |
| 9887 AddInstruction(HCheckInstanceType::NewIsSpecObject(left, zone())); | 9892 AddInstruction(HCheckInstanceType::NewIsSpecObject(left, zone())); |
| 9888 BuildCheckNonSmi(right); | 9893 BuildCheckNonSmi(right); |
| 9889 AddInstruction(HCheckInstanceType::NewIsSpecObject(right, zone())); | 9894 AddInstruction(HCheckInstanceType::NewIsSpecObject(right, zone())); |
| 9890 HCompareObjectEqAndBranch* result = | 9895 HCompareObjectEqAndBranch* result = |
| 9891 new(zone()) HCompareObjectEqAndBranch(left, right); | 9896 new(zone()) HCompareObjectEqAndBranch(left, right); |
| 9892 result->set_position(expr->position()); | 9897 result->set_position(expr->position()); |
| 9893 return ast_context()->ReturnControl(result, expr->id()); | 9898 return ast_context()->ReturnControl(result, expr->id()); |
| 9894 } | 9899 } |
| 9895 } | 9900 } |
| 9896 default: | 9901 default: |
| 9897 return Bailout("Unsupported non-primitive compare"); | 9902 return Bailout("Unsupported non-primitive compare"); |
| 9898 } | 9903 } |
| 9899 } else if (overall_type.IsInternalizedString() && | 9904 } else if (overall_type->Is(Type::InternalizedString()) && |
| 9900 Token::IsEqualityOp(op)) { | 9905 Token::IsEqualityOp(op)) { |
| 9901 BuildCheckNonSmi(left); | 9906 BuildCheckNonSmi(left); |
| 9902 AddInstruction(HCheckInstanceType::NewIsInternalizedString(left, zone())); | 9907 AddInstruction(HCheckInstanceType::NewIsInternalizedString(left, zone())); |
| 9903 BuildCheckNonSmi(right); | 9908 BuildCheckNonSmi(right); |
| 9904 AddInstruction(HCheckInstanceType::NewIsInternalizedString(right, zone())); | 9909 AddInstruction(HCheckInstanceType::NewIsInternalizedString(right, zone())); |
| 9905 HCompareObjectEqAndBranch* result = | 9910 HCompareObjectEqAndBranch* result = |
| 9906 new(zone()) HCompareObjectEqAndBranch(left, right); | 9911 new(zone()) HCompareObjectEqAndBranch(left, right); |
| 9907 result->set_position(expr->position()); | 9912 result->set_position(expr->position()); |
| 9908 return ast_context()->ReturnControl(result, expr->id()); | 9913 return ast_context()->ReturnControl(result, expr->id()); |
| 9909 } else { | 9914 } else { |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 9924 } | 9929 } |
| 9925 } | 9930 } |
| 9926 | 9931 |
| 9927 | 9932 |
| 9928 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, | 9933 void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
| 9929 HValue* value, | 9934 HValue* value, |
| 9930 NilValue nil) { | 9935 NilValue nil) { |
| 9931 ASSERT(!HasStackOverflow()); | 9936 ASSERT(!HasStackOverflow()); |
| 9932 ASSERT(current_block() != NULL); | 9937 ASSERT(current_block() != NULL); |
| 9933 ASSERT(current_block()->HasPredecessor()); | 9938 ASSERT(current_block()->HasPredecessor()); |
| 9939 ASSERT(expr->op() == Token::EQ || expr->op() == Token::EQ_STRICT); | |
| 9934 HIfContinuation continuation; | 9940 HIfContinuation continuation; |
| 9935 CompareNilICStub::Types types; | |
| 9936 if (expr->op() == Token::EQ_STRICT) { | 9941 if (expr->op() == Token::EQ_STRICT) { |
| 9937 IfBuilder if_nil(this); | 9942 IfBuilder if_nil(this); |
| 9938 if_nil.If<HCompareObjectEqAndBranch>( | 9943 if_nil.If<HCompareObjectEqAndBranch>( |
| 9939 value, (nil == kNullValue) ? graph()->GetConstantNull() | 9944 value, (nil == kNullValue) ? graph()->GetConstantNull() |
| 9940 : graph()->GetConstantUndefined()); | 9945 : graph()->GetConstantUndefined()); |
| 9941 if_nil.Then(); | 9946 if_nil.Then(); |
| 9942 if_nil.Else(); | 9947 if_nil.Else(); |
| 9943 if_nil.CaptureContinuation(&continuation); | 9948 if_nil.CaptureContinuation(&continuation); |
| 9944 return ast_context()->ReturnContinuation(&continuation, expr->id()); | 9949 return ast_context()->ReturnContinuation(&continuation, expr->id()); |
| 9945 } | 9950 } |
| 9946 types = CompareNilICStub::Types(expr->compare_nil_types()); | 9951 Handle<Type> type = expr->compare_nil_type()->Is(Type::None()) |
| 9947 if (types.IsEmpty()) types = CompareNilICStub::Types::FullCompare(); | 9952 ? handle(Type::Any(), isolate_) : expr->compare_nil_type(); |
| 9948 Handle<Map> map_handle = expr->map(); | 9953 BuildCompareNil(value, type, expr->position(), &continuation); |
| 9949 BuildCompareNil(value, types, map_handle, | |
| 9950 expr->position(), &continuation); | |
| 9951 return ast_context()->ReturnContinuation(&continuation, expr->id()); | 9954 return ast_context()->ReturnContinuation(&continuation, expr->id()); |
| 9952 } | 9955 } |
| 9953 | 9956 |
| 9954 | 9957 |
| 9955 HInstruction* HOptimizedGraphBuilder::BuildThisFunction() { | 9958 HInstruction* HOptimizedGraphBuilder::BuildThisFunction() { |
| 9956 // If we share optimized code between different closures, the | 9959 // If we share optimized code between different closures, the |
| 9957 // this-function is not a constant, except inside an inlined body. | 9960 // this-function is not a constant, except inside an inlined body. |
| 9958 if (function_state()->outer() != NULL) { | 9961 if (function_state()->outer() != NULL) { |
| 9959 return new(zone()) HConstant( | 9962 return new(zone()) HConstant( |
| 9960 function_state()->compilation_info()->closure(), | 9963 function_state()->compilation_info()->closure(), |
| (...skipping 1652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11613 } | 11616 } |
| 11614 } | 11617 } |
| 11615 | 11618 |
| 11616 #ifdef DEBUG | 11619 #ifdef DEBUG |
| 11617 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 11620 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 11618 if (allocator_ != NULL) allocator_->Verify(); | 11621 if (allocator_ != NULL) allocator_->Verify(); |
| 11619 #endif | 11622 #endif |
| 11620 } | 11623 } |
| 11621 | 11624 |
| 11622 } } // namespace v8::internal | 11625 } } // namespace v8::internal |
| OLD | NEW |