Index: src/compiler/js-context-specialization.cc |
diff --git a/src/compiler/js-context-specialization.cc b/src/compiler/js-context-specialization.cc |
index bdf142763a8887ca3db22cdda719b94eae24f86a..70911915122d1274bc705c739d025b4e3c4cb286 100644 |
--- a/src/compiler/js-context-specialization.cc |
+++ b/src/compiler/js-context-specialization.cc |
@@ -69,6 +69,7 @@ class ContextSpecializationVisitor : public NullNodeVisitor { |
void JSContextSpecializer::SpecializeToContext() { |
ReplaceEffectfulWithValue(context_, jsgraph_->Constant(info_->context())); |
+ specialized_ = true; |
ContextSpecializationVisitor visitor(this); |
jsgraph_->graph()->VisitNodeInputsFromEnd(&visitor); |
@@ -152,6 +153,28 @@ Reduction JSContextSpecializer::ReduceJSStoreContext(Node* node) { |
return Reducer::Changed(node); |
} |
+ |
+ |
+Node* JSContextSpecializer::InsertBuiltinLoadBefore(Node* before, |
+ Builtins::JavaScript id) { |
+ if (specialized_) { |
+ Handle<JSFunction> function( |
+ JSFunction::cast(info_->context()->builtins()->javascript_builtin(id))); |
+ return jsgraph_->HeapConstant(function); |
+ } |
+ Node* context = NodeProperties::GetContextInput(before); |
+ Node* global = jsgraph_->LoadObjectField( |
+ context, |
+ Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX) + kHeapObjectTag, |
+ context, NodeProperties::GetEffectInput(before)); |
+ Node* builtins = jsgraph_->LoadObjectField( |
+ global, JSGlobalObject::kBuiltinsOffset, context, global); |
+ Node* function_node = jsgraph_->LoadObjectField( |
+ builtins, JSBuiltinsObject::OffsetOfFunctionWithId(id), context, |
+ builtins); |
+ NodeProperties::ReplaceEffectInput(before, function_node); |
+ return function_node; |
+} |
} |
} |
} // namespace v8::internal::compiler |