| 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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 #include "src/compiler/generic-node-inl.h" | 6 #include "src/compiler/generic-node-inl.h" |
| 7 #include "src/compiler/graph-inl.h" | 7 #include "src/compiler/graph-inl.h" |
| 8 #include "src/compiler/js-context-specialization.h" | 8 #include "src/compiler/js-context-specialization.h" |
| 9 #include "src/compiler/js-operator.h" | 9 #include "src/compiler/js-operator.h" |
| 10 #include "src/compiler/node-aux-data-inl.h" | 10 #include "src/compiler/node-aux-data-inl.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 return GenericGraphVisit::CONTINUE; | 62 return GenericGraphVisit::CONTINUE; |
| 63 } | 63 } |
| 64 | 64 |
| 65 private: | 65 private: |
| 66 JSContextSpecializer* spec_; | 66 JSContextSpecializer* spec_; |
| 67 }; | 67 }; |
| 68 | 68 |
| 69 | 69 |
| 70 void JSContextSpecializer::SpecializeToContext() { | 70 void JSContextSpecializer::SpecializeToContext() { |
| 71 ReplaceEffectfulWithValue(context_, jsgraph_->Constant(info_->context())); | 71 ReplaceEffectfulWithValue(context_, jsgraph_->Constant(info_->context())); |
| 72 specialized_ = true; |
| 72 | 73 |
| 73 ContextSpecializationVisitor visitor(this); | 74 ContextSpecializationVisitor visitor(this); |
| 74 jsgraph_->graph()->VisitNodeInputsFromEnd(&visitor); | 75 jsgraph_->graph()->VisitNodeInputsFromEnd(&visitor); |
| 75 } | 76 } |
| 76 | 77 |
| 77 | 78 |
| 78 Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) { | 79 Reduction JSContextSpecializer::ReduceJSLoadContext(Node* node) { |
| 79 DCHECK_EQ(IrOpcode::kJSLoadContext, node->opcode()); | 80 DCHECK_EQ(IrOpcode::kJSLoadContext, node->opcode()); |
| 80 | 81 |
| 81 ValueMatcher<Handle<Context> > match(NodeProperties::GetValueInput(node, 0)); | 82 ValueMatcher<Handle<Context> > match(NodeProperties::GetValueInput(node, 0)); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 context = context->previous(); | 146 context = context->previous(); |
| 146 } | 147 } |
| 147 | 148 |
| 148 Operator* op = jsgraph_->javascript()->StoreContext(0, access.index()); | 149 Operator* op = jsgraph_->javascript()->StoreContext(0, access.index()); |
| 149 node->set_op(op); | 150 node->set_op(op); |
| 150 Handle<Object> new_context_handle = Handle<Object>(context, info_->isolate()); | 151 Handle<Object> new_context_handle = Handle<Object>(context, info_->isolate()); |
| 151 node->ReplaceInput(0, jsgraph_->Constant(new_context_handle)); | 152 node->ReplaceInput(0, jsgraph_->Constant(new_context_handle)); |
| 152 | 153 |
| 153 return Reducer::Changed(node); | 154 return Reducer::Changed(node); |
| 154 } | 155 } |
| 156 |
| 157 |
| 158 Node* JSContextSpecializer::InsertBuiltinLoadBefore(Node* before, |
| 159 Builtins::JavaScript id) { |
| 160 if (specialized_) { |
| 161 Handle<JSFunction> function( |
| 162 JSFunction::cast(info_->context()->builtins()->javascript_builtin(id))); |
| 163 return jsgraph_->HeapConstant(function); |
| 164 } |
| 165 Node* context = NodeProperties::GetContextInput(before); |
| 166 Node* global = jsgraph_->LoadObjectField( |
| 167 context, |
| 168 Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX) + kHeapObjectTag, |
| 169 context, NodeProperties::GetEffectInput(before)); |
| 170 Node* builtins = jsgraph_->LoadObjectField( |
| 171 global, JSGlobalObject::kBuiltinsOffset, context, global); |
| 172 Node* function_node = jsgraph_->LoadObjectField( |
| 173 builtins, JSBuiltinsObject::OffsetOfFunctionWithId(id), context, |
| 174 builtins); |
| 175 NodeProperties::ReplaceEffectInput(before, function_node); |
| 176 return function_node; |
| 177 } |
| 155 } | 178 } |
| 156 } | 179 } |
| 157 } // namespace v8::internal::compiler | 180 } // namespace v8::internal::compiler |
| OLD | NEW |