OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
(...skipping 2731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2742 | 2742 |
2743 | 2743 |
2744 VectorSlotPair AstGraphBuilder::CreateVectorSlotPair( | 2744 VectorSlotPair AstGraphBuilder::CreateVectorSlotPair( |
2745 FeedbackVectorICSlot slot) const { | 2745 FeedbackVectorICSlot slot) const { |
2746 return VectorSlotPair(handle(info()->shared_info()->feedback_vector()), slot); | 2746 return VectorSlotPair(handle(info()->shared_info()->feedback_vector()), slot); |
2747 } | 2747 } |
2748 | 2748 |
2749 | 2749 |
2750 uint32_t AstGraphBuilder::ComputeBitsetForDynamicGlobal(Variable* variable) { | 2750 uint32_t AstGraphBuilder::ComputeBitsetForDynamicGlobal(Variable* variable) { |
2751 DCHECK_EQ(DYNAMIC_GLOBAL, variable->mode()); | 2751 DCHECK_EQ(DYNAMIC_GLOBAL, variable->mode()); |
| 2752 bool found_eval_scope = false; |
2752 EnumSet<int, uint32_t> check_depths; | 2753 EnumSet<int, uint32_t> check_depths; |
2753 for (Scope* s = current_scope(); s != nullptr; s = s->outer_scope()) { | 2754 for (Scope* s = current_scope(); s != nullptr; s = s->outer_scope()) { |
2754 if (s->num_heap_slots() <= 0) continue; | 2755 if (s->num_heap_slots() <= 0) continue; |
2755 // TODO(mstarzinger): Be smarter about which checks to require! | 2756 // TODO(mstarzinger): If we have reached an eval scope, we check all |
| 2757 // extensions from this point. Replicated from full-codegen, figure out |
| 2758 // whether this is still needed. If not, drop {found_eval_scope} below. |
| 2759 if (s->is_eval_scope()) found_eval_scope = true; |
| 2760 if (!s->calls_sloppy_eval() && !found_eval_scope) continue; |
2756 int depth = current_scope()->ContextChainLength(s); | 2761 int depth = current_scope()->ContextChainLength(s); |
2757 if (depth > DynamicGlobalAccess::kMaxCheckDepth) { | 2762 if (depth > DynamicGlobalAccess::kMaxCheckDepth) { |
2758 return DynamicGlobalAccess::kFullCheckRequired; | 2763 return DynamicGlobalAccess::kFullCheckRequired; |
2759 } | 2764 } |
2760 check_depths.Add(depth); | 2765 check_depths.Add(depth); |
2761 } | 2766 } |
2762 return check_depths.ToIntegral(); | 2767 return check_depths.ToIntegral(); |
2763 } | 2768 } |
2764 | 2769 |
2765 | 2770 |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3015 value = BuildHoleCheckThrow(value, variable, value, bailout_id); | 3020 value = BuildHoleCheckThrow(value, variable, value, bailout_id); |
3016 } | 3021 } |
3017 return value; | 3022 return value; |
3018 } | 3023 } |
3019 case Variable::LOOKUP: { | 3024 case Variable::LOOKUP: { |
3020 // Dynamic lookup of context variable (anywhere in the chain). | 3025 // Dynamic lookup of context variable (anywhere in the chain). |
3021 Node* value = jsgraph()->TheHoleConstant(); | 3026 Node* value = jsgraph()->TheHoleConstant(); |
3022 Handle<String> name = variable->name(); | 3027 Handle<String> name = variable->name(); |
3023 if (mode == DYNAMIC_GLOBAL) { | 3028 if (mode == DYNAMIC_GLOBAL) { |
3024 uint32_t check_bitset = ComputeBitsetForDynamicGlobal(variable); | 3029 uint32_t check_bitset = ComputeBitsetForDynamicGlobal(variable); |
3025 const Operator* op = javascript()->LoadDynamicGlobal(name, check_bitset, | 3030 const Operator* op = javascript()->LoadDynamicGlobal( |
3026 contextual_mode); | 3031 name, check_bitset, feedback, contextual_mode); |
3027 value = NewNode(op, current_context()); | 3032 value = NewNode(op, current_context()); |
| 3033 states.AddToNode(value, bailout_id, combine); |
3028 } else if (mode == DYNAMIC_LOCAL) { | 3034 } else if (mode == DYNAMIC_LOCAL) { |
3029 Variable* local = variable->local_if_not_shadowed(); | 3035 Variable* local = variable->local_if_not_shadowed(); |
3030 DCHECK(local->location() == Variable::CONTEXT); // Must be context. | 3036 DCHECK(local->location() == Variable::CONTEXT); // Must be context. |
3031 int depth = current_scope()->ContextChainLength(local->scope()); | 3037 int depth = current_scope()->ContextChainLength(local->scope()); |
3032 uint32_t check_bitset = ComputeBitsetForDynamicContext(variable); | 3038 uint32_t check_bitset = ComputeBitsetForDynamicContext(variable); |
3033 const Operator* op = javascript()->LoadDynamicContext( | 3039 const Operator* op = javascript()->LoadDynamicContext( |
3034 name, check_bitset, depth, local->index()); | 3040 name, check_bitset, depth, local->index()); |
3035 value = NewNode(op, current_context()); | 3041 value = NewNode(op, current_context()); |
| 3042 PrepareFrameState(value, bailout_id, combine); |
3036 // TODO(mstarzinger): Hole checks are missing here when optimized. | 3043 // TODO(mstarzinger): Hole checks are missing here when optimized. |
3037 } else if (mode == DYNAMIC) { | 3044 } else if (mode == DYNAMIC) { |
3038 uint32_t check_bitset = DynamicGlobalAccess::kFullCheckRequired; | 3045 uint32_t check_bitset = DynamicGlobalAccess::kFullCheckRequired; |
3039 const Operator* op = javascript()->LoadDynamicGlobal(name, check_bitset, | 3046 const Operator* op = javascript()->LoadDynamicGlobal( |
3040 contextual_mode); | 3047 name, check_bitset, feedback, contextual_mode); |
3041 value = NewNode(op, current_context()); | 3048 value = NewNode(op, current_context()); |
| 3049 states.AddToNode(value, bailout_id, combine); |
3042 } | 3050 } |
3043 PrepareFrameState(value, bailout_id, combine); | |
3044 return value; | 3051 return value; |
3045 } | 3052 } |
3046 } | 3053 } |
3047 UNREACHABLE(); | 3054 UNREACHABLE(); |
3048 return NULL; | 3055 return NULL; |
3049 } | 3056 } |
3050 | 3057 |
3051 | 3058 |
3052 Node* AstGraphBuilder::BuildVariableDelete(Variable* variable, | 3059 Node* AstGraphBuilder::BuildVariableDelete(Variable* variable, |
3053 BailoutId bailout_id, | 3060 BailoutId bailout_id, |
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3772 // Phi does not exist yet, introduce one. | 3779 // Phi does not exist yet, introduce one. |
3773 value = NewPhi(inputs, value, control); | 3780 value = NewPhi(inputs, value, control); |
3774 value->ReplaceInput(inputs - 1, other); | 3781 value->ReplaceInput(inputs - 1, other); |
3775 } | 3782 } |
3776 return value; | 3783 return value; |
3777 } | 3784 } |
3778 | 3785 |
3779 } // namespace compiler | 3786 } // namespace compiler |
3780 } // namespace internal | 3787 } // namespace internal |
3781 } // namespace v8 | 3788 } // namespace v8 |
OLD | NEW |