| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/field-index.h" | 9 #include "src/field-index.h" |
| 10 #include "src/hydrogen.h" | 10 #include "src/hydrogen.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 LChunk* chunk = LChunk::NewChunk(graph); | 28 LChunk* chunk = LChunk::NewChunk(graph); |
| 29 if (chunk == NULL) { | 29 if (chunk == NULL) { |
| 30 FATAL(GetBailoutReason(graph->info()->bailout_reason())); | 30 FATAL(GetBailoutReason(graph->info()->bailout_reason())); |
| 31 } | 31 } |
| 32 return chunk; | 32 return chunk; |
| 33 } | 33 } |
| 34 | 34 |
| 35 | 35 |
| 36 class CodeStubGraphBuilderBase : public HGraphBuilder { | 36 class CodeStubGraphBuilderBase : public HGraphBuilder { |
| 37 public: | 37 public: |
| 38 explicit CodeStubGraphBuilderBase(CompilationInfoWithZone* info) | 38 explicit CodeStubGraphBuilderBase(CompilationInfo* info) |
| 39 : HGraphBuilder(info), | 39 : HGraphBuilder(info), |
| 40 arguments_length_(NULL), | 40 arguments_length_(NULL), |
| 41 info_(info), | 41 info_(info), |
| 42 descriptor_(info->code_stub()), | 42 descriptor_(info->code_stub()), |
| 43 context_(NULL) { | 43 context_(NULL) { |
| 44 int parameter_count = descriptor_.GetEnvironmentParameterCount(); | 44 int parameter_count = descriptor_.GetEnvironmentParameterCount(); |
| 45 parameters_.Reset(new HParameter*[parameter_count]); | 45 parameters_.Reset(new HParameter*[parameter_count]); |
| 46 } | 46 } |
| 47 virtual bool BuildGraph(); | 47 virtual bool BuildGraph(); |
| 48 | 48 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 HValue* shared_info, | 100 HValue* shared_info, |
| 101 HValue* native_context); | 101 HValue* native_context); |
| 102 | 102 |
| 103 private: | 103 private: |
| 104 HValue* BuildArraySingleArgumentConstructor(JSArrayBuilder* builder); | 104 HValue* BuildArraySingleArgumentConstructor(JSArrayBuilder* builder); |
| 105 HValue* BuildArrayNArgumentsConstructor(JSArrayBuilder* builder, | 105 HValue* BuildArrayNArgumentsConstructor(JSArrayBuilder* builder, |
| 106 ElementsKind kind); | 106 ElementsKind kind); |
| 107 | 107 |
| 108 SmartArrayPointer<HParameter*> parameters_; | 108 SmartArrayPointer<HParameter*> parameters_; |
| 109 HValue* arguments_length_; | 109 HValue* arguments_length_; |
| 110 CompilationInfoWithZone* info_; | 110 CompilationInfo* info_; |
| 111 CodeStubDescriptor descriptor_; | 111 CodeStubDescriptor descriptor_; |
| 112 HContext* context_; | 112 HContext* context_; |
| 113 }; | 113 }; |
| 114 | 114 |
| 115 | 115 |
| 116 bool CodeStubGraphBuilderBase::BuildGraph() { | 116 bool CodeStubGraphBuilderBase::BuildGraph() { |
| 117 // Update the static counter each time a new code stub is generated. | 117 // Update the static counter each time a new code stub is generated. |
| 118 isolate()->counters()->code_stubs()->Increment(); | 118 isolate()->counters()->code_stubs()->Increment(); |
| 119 | 119 |
| 120 if (FLAG_trace_hydrogen_stubs) { | 120 if (FLAG_trace_hydrogen_stubs) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 stack_pop_count); | 183 stack_pop_count); |
| 184 FinishCurrentBlock(hreturn_instruction); | 184 FinishCurrentBlock(hreturn_instruction); |
| 185 } | 185 } |
| 186 return true; | 186 return true; |
| 187 } | 187 } |
| 188 | 188 |
| 189 | 189 |
| 190 template <class Stub> | 190 template <class Stub> |
| 191 class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { | 191 class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { |
| 192 public: | 192 public: |
| 193 explicit CodeStubGraphBuilder(CompilationInfoWithZone* info) | 193 explicit CodeStubGraphBuilder(CompilationInfo* info) |
| 194 : CodeStubGraphBuilderBase(info) {} | 194 : CodeStubGraphBuilderBase(info) {} |
| 195 | 195 |
| 196 protected: | 196 protected: |
| 197 virtual HValue* BuildCodeStub() { | 197 virtual HValue* BuildCodeStub() { |
| 198 if (casted_stub()->IsUninitialized()) { | 198 if (casted_stub()->IsUninitialized()) { |
| 199 return BuildCodeUninitializedStub(); | 199 return BuildCodeUninitializedStub(); |
| 200 } else { | 200 } else { |
| 201 return BuildCodeInitializedStub(); | 201 return BuildCodeInitializedStub(); |
| 202 } | 202 } |
| 203 } | 203 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 // the runtime that is significantly faster than using the standard | 265 // the runtime that is significantly faster than using the standard |
| 266 // stub-failure deopt mechanism. | 266 // stub-failure deopt mechanism. |
| 267 if (stub->IsUninitialized() && descriptor.has_miss_handler()) { | 267 if (stub->IsUninitialized() && descriptor.has_miss_handler()) { |
| 268 DCHECK(!descriptor.stack_parameter_count().is_valid()); | 268 DCHECK(!descriptor.stack_parameter_count().is_valid()); |
| 269 return stub->GenerateLightweightMissCode(descriptor.miss_handler()); | 269 return stub->GenerateLightweightMissCode(descriptor.miss_handler()); |
| 270 } | 270 } |
| 271 base::ElapsedTimer timer; | 271 base::ElapsedTimer timer; |
| 272 if (FLAG_profile_hydrogen_code_stub_compilation) { | 272 if (FLAG_profile_hydrogen_code_stub_compilation) { |
| 273 timer.Start(); | 273 timer.Start(); |
| 274 } | 274 } |
| 275 CompilationInfoWithZone info(stub, isolate); | 275 Zone zone; |
| 276 CompilationInfo info(stub, isolate, &zone); |
| 276 CodeStubGraphBuilder<Stub> builder(&info); | 277 CodeStubGraphBuilder<Stub> builder(&info); |
| 277 LChunk* chunk = OptimizeGraph(builder.CreateGraph()); | 278 LChunk* chunk = OptimizeGraph(builder.CreateGraph()); |
| 278 Handle<Code> code = chunk->Codegen(); | 279 Handle<Code> code = chunk->Codegen(); |
| 279 if (FLAG_profile_hydrogen_code_stub_compilation) { | 280 if (FLAG_profile_hydrogen_code_stub_compilation) { |
| 280 OFStream os(stdout); | 281 OFStream os(stdout); |
| 281 os << "[Lazy compilation of " << stub << " took " | 282 os << "[Lazy compilation of " << stub << " took " |
| 282 << timer.Elapsed().InMillisecondsF() << " ms]" << std::endl; | 283 << timer.Elapsed().InMillisecondsF() << " ms]" << std::endl; |
| 283 } | 284 } |
| 284 return code; | 285 return code; |
| 285 } | 286 } |
| (...skipping 1418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1704 | 1705 |
| 1705 Handle<Code> RegExpConstructResultStub::GenerateCode() { | 1706 Handle<Code> RegExpConstructResultStub::GenerateCode() { |
| 1706 return DoGenerateCode(this); | 1707 return DoGenerateCode(this); |
| 1707 } | 1708 } |
| 1708 | 1709 |
| 1709 | 1710 |
| 1710 template <> | 1711 template <> |
| 1711 class CodeStubGraphBuilder<KeyedLoadGenericStub> | 1712 class CodeStubGraphBuilder<KeyedLoadGenericStub> |
| 1712 : public CodeStubGraphBuilderBase { | 1713 : public CodeStubGraphBuilderBase { |
| 1713 public: | 1714 public: |
| 1714 explicit CodeStubGraphBuilder(CompilationInfoWithZone* info) | 1715 explicit CodeStubGraphBuilder(CompilationInfo* info) |
| 1715 : CodeStubGraphBuilderBase(info) {} | 1716 : CodeStubGraphBuilderBase(info) {} |
| 1716 | 1717 |
| 1717 protected: | 1718 protected: |
| 1718 virtual HValue* BuildCodeStub(); | 1719 virtual HValue* BuildCodeStub(); |
| 1719 | 1720 |
| 1720 void BuildElementsKindLimitCheck(HGraphBuilder::IfBuilder* if_builder, | 1721 void BuildElementsKindLimitCheck(HGraphBuilder::IfBuilder* if_builder, |
| 1721 HValue* bit_field2, | 1722 HValue* bit_field2, |
| 1722 ElementsKind kind); | 1723 ElementsKind kind); |
| 1723 | 1724 |
| 1724 void BuildFastElementLoad(HGraphBuilder::IfBuilder* if_builder, | 1725 void BuildFastElementLoad(HGraphBuilder::IfBuilder* if_builder, |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2028 // megamorphic case is handled as part of the default stub. | 2029 // megamorphic case is handled as part of the default stub. |
| 2029 DCHECK(!FLAG_vector_ics); | 2030 DCHECK(!FLAG_vector_ics); |
| 2030 | 2031 |
| 2031 // Probe the stub cache. | 2032 // Probe the stub cache. |
| 2032 Add<HTailCallThroughMegamorphicCache>(receiver, name); | 2033 Add<HTailCallThroughMegamorphicCache>(receiver, name); |
| 2033 | 2034 |
| 2034 // We never continue. | 2035 // We never continue. |
| 2035 return graph()->GetConstant0(); | 2036 return graph()->GetConstant0(); |
| 2036 } | 2037 } |
| 2037 } } // namespace v8::internal | 2038 } } // namespace v8::internal |
| OLD | NEW |