156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met: 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions of source code must retain the above copyright 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer. 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions in binary form must reproduce the above 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// copyright notice, this list of conditions and the following 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// disclaimer in the documentation and/or other materials provided 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with the distribution. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Neither the name of Google Inc. nor the names of its 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// contributors may be used to endorse or promote products derived 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from this software without specific prior written permission. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_COMPILER_H_ 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_COMPILER_H_ 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "allocation.h" 325c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include "ast.h" 33b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#include "zone.h" 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 38eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.orgclass ScriptDataImpl; 39a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgclass HydrogenCodeStub; 40eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org 419faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org// ParseRestriction is used to restrict the set of valid statements in a 429faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org// unit of compilation. Restriction violations cause a syntax error. 439faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.orgenum ParseRestriction { 449faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org NO_PARSE_RESTRICTION, // All expressions are allowed. 459faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org ONLY_SINGLE_FUNCTION_LITERAL // Only a single FunctionLiteral expression. 469faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org}; 479faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org 484e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgstruct OffsetRange { 494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org OffsetRange(int from, int to) : from(from), to(to) {} 504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org int from; 514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org int to; 524e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org}; 534e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 545c838251403b0be9a882540f1922577abba4c872ager@chromium.org// CompilationInfo encapsulates some information known at compile time. It 555c838251403b0be9a882540f1922577abba4c872ager@chromium.org// is constructed based on the resources available at compile-time. 56304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgclass CompilationInfo { 57b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org public: 585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org CompilationInfo(Handle<JSFunction> closure, Zone* zone); 5941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org virtual ~CompilationInfo(); 6099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org Isolate* isolate() const { 62ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return isolate_; 63ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 64c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org Zone* zone() { return zone_; } 65c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org bool is_osr() const { return !osr_ast_id_.IsNone(); } 6683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org bool is_lazy() const { return IsLazy::decode(flags_); } 6783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org bool is_eval() const { return IsEval::decode(flags_); } 6883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org bool is_global() const { return IsGlobal::decode(flags_); } 691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org bool is_classic_mode() const { return language_mode() == CLASSIC_MODE; } 701b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org bool is_extended_mode() const { return language_mode() == EXTENDED_MODE; } 711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org LanguageMode language_mode() const { 721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org return LanguageModeField::decode(flags_); 73394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 7483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org bool is_in_loop() const { return IsInLoop::decode(flags_); } 75b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org FunctionLiteral* function() const { return function_; } 76b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Scope* scope() const { return scope_; } 7727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Scope* global_scope() const { return global_scope_; } 78b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<Code> code() const { return code_; } 79b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<JSFunction> closure() const { return closure_; } 80b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } 81b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<Script> script() const { return script_; } 82b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org HydrogenCodeStub* code_stub() const {return code_stub_; } 83b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org v8::Extension* extension() const { return extension_; } 84b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ScriptDataImpl* pre_parse_data() const { return pre_parse_data_; } 85355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org Handle<Context> context() const { return context_; } 86471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId osr_ast_id() const { return osr_ast_id_; } 878e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org uint32_t osr_pc_offset() const { return osr_pc_offset_; } 88003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org int opt_count() const { return opt_count_; } 89a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int num_parameters() const; 90a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int num_heap_slots() const; 91a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Code::Flags flags() const; 92b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 93b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void MarkAsEval() { 94b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(!is_lazy()); 95b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org flags_ |= IsEval::encode(true); 965c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 97b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void MarkAsGlobal() { 98b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(!is_lazy()); 99b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org flags_ |= IsGlobal::encode(true); 1005c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 101ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org void set_parameter_count(int parameter_count) { 102ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org ASSERT(IsStub()); 103ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org parameter_count_ = parameter_count; 104ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } 1051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org void SetLanguageMode(LanguageMode language_mode) { 1061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org ASSERT(this->language_mode() == CLASSIC_MODE || 1071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org this->language_mode() == language_mode || 1081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org language_mode == EXTENDED_MODE); 1091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org flags_ = LanguageModeField::update(flags_, language_mode); 11083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 111b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void MarkAsInLoop() { 112b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(is_lazy()); 113b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org flags_ |= IsInLoop::encode(true); 1145c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 115d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org void MarkAsNative() { 116d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org flags_ |= IsNative::encode(true); 117d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org } 118a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 119d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org bool is_native() const { 120d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org return IsNative::decode(flags_); 121d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org } 122a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 123a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool is_calling() const { 124a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return is_deferred_calling() || is_non_deferred_calling(); 125a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 126a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 127a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org void MarkAsDeferredCalling() { 128a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org flags_ |= IsDeferredCalling::encode(true); 129a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 130a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 131a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool is_deferred_calling() const { 132a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return IsDeferredCalling::decode(flags_); 133a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 134a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 135a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org void MarkAsNonDeferredCalling() { 136a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org flags_ |= IsNonDeferredCalling::encode(true); 137a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 138a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 139a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool is_non_deferred_calling() const { 140a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return IsNonDeferredCalling::decode(flags_); 141a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 142a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 14394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org void MarkAsSavesCallerDoubles() { 14494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org flags_ |= SavesCallerDoubles::encode(true); 14594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org } 14694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 14794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org bool saves_caller_doubles() const { 14894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return SavesCallerDoubles::decode(flags_); 14994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org } 15094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 15177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org void MarkAsRequiresFrame() { 15277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org flags_ |= RequiresFrame::encode(true); 15377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 15477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org 15577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org bool requires_frame() const { 15677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org return RequiresFrame::decode(flags_); 15777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 15877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org 1599faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org void SetParseRestriction(ParseRestriction restriction) { 1609faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org flags_ = ParseRestricitonField::update(flags_, restriction); 1619faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org } 1629faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org 1639faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org ParseRestriction parse_restriction() const { 1649faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org return ParseRestricitonField::decode(flags_); 1659faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org } 1669faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org 167b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void SetFunction(FunctionLiteral* literal) { 168b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(function_ == NULL); 169b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org function_ = literal; 170f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org } 171b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void SetScope(Scope* scope) { 172b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(scope_ == NULL); 173b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org scope_ = scope; 174f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org } 17527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org void SetGlobalScope(Scope* global_scope) { 17627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org ASSERT(global_scope_ == NULL); 17727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org global_scope_ = global_scope; 17827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org } 179b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void SetCode(Handle<Code> code) { code_ = code; } 180b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void SetExtension(v8::Extension* extension) { 181b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(!is_lazy()); 182b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org extension_ = extension; 183f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org } 184b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org void SetPreParseData(ScriptDataImpl* pre_parse_data) { 185b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ASSERT(!is_lazy()); 186b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org pre_parse_data_ = pre_parse_data; 187f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org } 188355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org void SetContext(Handle<Context> context) { 189355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org context_ = context; 190f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org } 191394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com void MarkCompilingForDebugging(Handle<Code> current_code) { 192394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com ASSERT(mode_ != OPTIMIZE); 193394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com ASSERT(current_code->kind() == Code::FUNCTION); 194394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com flags_ |= IsCompilingForDebugging::encode(true); 195394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (current_code->is_compiled_optimizable()) { 196394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com EnableDeoptimizationSupport(); 197394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } else { 198394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com mode_ = CompilationInfo::NONOPT; 199394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 200394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 201394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com bool IsCompilingForDebugging() { 202394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return IsCompilingForDebugging::decode(flags_); 203394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 205594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool ShouldTrapOnDeopt() const { 206594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return (FLAG_trap_on_deopt && IsOptimizing()) || 207594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org (FLAG_trap_on_stub_deopt && IsStub()); 208594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 209594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool has_global_object() const { 21146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return !closure().is_null() && 21246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org (closure()->context()->global_object() != NULL); 213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 215a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org GlobalObject* global_object() const { 21646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return has_global_object() ? closure()->context()->global_object() : NULL; 217a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 218a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 219a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Accessors for the different compilation modes. 220a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool IsOptimizing() const { return mode_ == OPTIMIZE; } 221a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool IsOptimizable() const { return mode_ == BASE; } 222a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool IsStub() const { return mode_ == STUB; } 223471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org void SetOptimizing(BailoutId osr_ast_id) { 224a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org SetMode(OPTIMIZE); 225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org osr_ast_id_ = osr_ast_id; 226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 227c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void DisableOptimization(); 228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 229a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Deoptimization support. 230394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com bool HasDeoptimizationSupport() const { 231394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return SupportsDeoptimization::decode(flags_); 232394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 233a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void EnableDeoptimizationSupport() { 234a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(IsOptimizable()); 235394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com flags_ |= SupportsDeoptimization::encode(true); 236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 23878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org // Determines whether or not to insert a self-optimization header. 23978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org bool ShouldSelfOptimize(); 24078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 24132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org // Reset code to the unoptimized version when optimization is aborted. 24232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org void AbortOptimization() { 24332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org SetCode(handle(shared_info()->code())); 24432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 245ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org 24699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org void set_deferred_handles(DeferredHandles* deferred_handles) { 24799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org ASSERT(deferred_handles_ == NULL); 24899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org deferred_handles_ = deferred_handles; 24999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } 25099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 2511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ZoneList<Handle<HeapObject> >* dependencies( 2521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependentCode::DependencyGroup group) { 2531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (dependencies_[group] == NULL) { 2541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org dependencies_[group] = new(zone_) ZoneList<Handle<HeapObject> >(2, zone_); 25541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 2561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return dependencies_[group]; 25741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 25841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 2591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void CommitDependencies(Handle<Code> code); 26041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 2611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void RollbackDependencies(); 26241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 263304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org void SaveHandles() { 264304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org SaveHandle(&closure_); 265304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org SaveHandle(&shared_info_); 266355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org SaveHandle(&context_); 267304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org SaveHandle(&script_); 268304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 269304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 270594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org BailoutReason bailout_reason() const { return bailout_reason_; } 271594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void set_bailout_reason(BailoutReason reason) { bailout_reason_ = reason; } 27246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 27383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org int prologue_offset() const { 274c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org ASSERT_NE(Code::kPrologueOffsetNotSet, prologue_offset_); 27583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return prologue_offset_; 27683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org } 27783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 27883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org void set_prologue_offset(int prologue_offset) { 279c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org ASSERT_EQ(Code::kPrologueOffsetNotSet, prologue_offset_); 28083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org prologue_offset_ = prologue_offset; 28183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org } 28283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 2834e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // Adds offset range [from, to) where fp register does not point 2844e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // to the current frame base. Used in CPU profiler to detect stack 2854e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // samples where top frame is not set up. 2864e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org inline void AddNoFrameRange(int from, int to) { 2874e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (no_frame_ranges_) no_frame_ranges_->Add(OffsetRange(from, to)); 2884e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 2894e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 2904e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org List<OffsetRange>* ReleaseNoFrameRanges() { 2914e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org List<OffsetRange>* result = no_frame_ranges_; 2924e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org no_frame_ranges_ = NULL; 2934e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return result; 2944e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 2954e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 29641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Handle<Foreign> object_wrapper() { 29741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (object_wrapper_.is_null()) { 29841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org object_wrapper_ = 29941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org isolate()->factory()->NewForeign(reinterpret_cast<Address>(this)); 30041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 30141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return object_wrapper_; 30241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 30341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 3041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void AbortDueToDependencyChange() { 3059af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ASSERT(!OptimizingCompilerThread::IsOptimizerThread(isolate())); 306594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org abort_due_to_dependency_ = true; 30741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 30841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 3091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool HasAbortedDueToDependencyChange() { 3109af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ASSERT(!OptimizingCompilerThread::IsOptimizerThread(isolate())); 311594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return abort_due_to_dependency_; 31241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 31341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 3143d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org void set_osr_pc_offset(uint32_t pc_offset) { 3153d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org osr_pc_offset_ = pc_offset; 3163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 3173d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 3183d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org bool HasSameOsrEntry(Handle<JSFunction> function, uint32_t pc_offset) { 3193d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return osr_pc_offset_ == pc_offset && function.is_identical_to(closure_); 3203d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 3213d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 32241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org protected: 3231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompilationInfo(Handle<Script> script, 3241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Zone* zone); 3251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompilationInfo(Handle<SharedFunctionInfo> shared_info, 3261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Zone* zone); 3271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompilationInfo(HydrogenCodeStub* stub, 3281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate, 3291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Zone* zone); 3304e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 331f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org private: 332ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate_; 333ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 334a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Compilation mode. 335a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // BASE is generated by the full codegen, optionally prepared for bailouts. 336a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // OPTIMIZE is optimized code generated by the Hydrogen-based backend. 33756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org // NONOPT is generated by the full codegen and is not prepared for 33856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org // recompilation/bailouts. These functions are never recompiled. 339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org enum Mode { 340a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org BASE, 341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org OPTIMIZE, 342a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org NONOPT, 343594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org STUB 344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org }; 345a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 346a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org void Initialize(Isolate* isolate, Mode mode, Zone* zone); 347a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 348a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void SetMode(Mode mode) { 349e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org ASSERT(isolate()->use_crankshaft()); 350a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org mode_ = mode; 351a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 352a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 353b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Flags using template class BitField<type, start, length>. All are 354b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // false by default. 355b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // 356b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Compilation is either eager or lazy. 357b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org class IsLazy: public BitField<bool, 0, 1> {}; 358b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Flags that can be set for eager compilation. 359b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org class IsEval: public BitField<bool, 1, 1> {}; 360b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org class IsGlobal: public BitField<bool, 2, 1> {}; 361b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Flags that can be set for lazy compilation. 362e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org class IsInLoop: public BitField<bool, 3, 1> {}; 36383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // Strict mode - used in eager compilation. 3641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org class LanguageModeField: public BitField<LanguageMode, 4, 2> {}; 365d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org // Is this a function from our natives. 366d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org class IsNative: public BitField<bool, 6, 1> {}; 367394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Is this code being compiled with support for deoptimization.. 368394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com class SupportsDeoptimization: public BitField<bool, 7, 1> {}; 369394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // If compiling for debugging produce just full code matching the 370394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // initial mode setting. 371394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com class IsCompilingForDebugging: public BitField<bool, 8, 1> {}; 372a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // If the compiled code contains calls that require building a frame 373a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org class IsCalling: public BitField<bool, 9, 1> {}; 374a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // If the compiled code contains calls that require building a frame 375a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org class IsDeferredCalling: public BitField<bool, 10, 1> {}; 376a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // If the compiled code contains calls that require building a frame 377a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org class IsNonDeferredCalling: public BitField<bool, 11, 1> {}; 37894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org // If the compiled code saves double caller registers that it clobbers. 37994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org class SavesCallerDoubles: public BitField<bool, 12, 1> {}; 3809faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org // If the set of valid statements is restricted. 3819faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org class ParseRestricitonField: public BitField<ParseRestriction, 13, 1> {}; 38277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org // If the function requires a frame (for unspecified reasons) 38377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org class RequiresFrame: public BitField<bool, 14, 1> {}; 384b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 385b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org unsigned flags_; 386b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 387b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Fields filled in by the compilation pipeline. 388b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // AST filled in by the parser. 389b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org FunctionLiteral* function_; 390e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // The scope of the function literal as a convenience. Set to indicate 391b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // that scopes have been analyzed. 392b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Scope* scope_; 39327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org // The global scope provided as a convenience. 39427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Scope* global_scope_; 395a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // For compiled stubs, the stub object 396a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org HydrogenCodeStub* code_stub_; 397b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // The compiled code. 398b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<Code> code_; 399b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 400b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Possible initial inputs to the compilation process. 401f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org Handle<JSFunction> closure_; 402b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<SharedFunctionInfo> shared_info_; 403b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<Script> script_; 404b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 405b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Fields possibly needed for eager compilation, NULL by default. 406b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org v8::Extension* extension_; 407b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org ScriptDataImpl* pre_parse_data_; 408b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 409355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org // The context of the caller for eval code, and the global context for a 410355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org // global script. Will be a null handle otherwise. 411355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org Handle<Context> context_; 412b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 413a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Compilation mode flag and whether deoptimization is allowed. 414a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Mode mode_; 415471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId osr_ast_id_; 4163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // The pc_offset corresponding to osr_ast_id_ in unoptimized code. 4173d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // We can look this up in the back edge table, but cache it for quick access. 4183d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org uint32_t osr_pc_offset_; 419a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 420594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Flag whether compilation needs to be aborted due to dependency change. 421594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool abort_due_to_dependency_; 422594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 4235a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // The zone from which the compilation pipeline working on this 4245a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // CompilationInfo allocates. 4255a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Zone* zone_; 4265a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 42799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org DeferredHandles* deferred_handles_; 42899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 4291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ZoneList<Handle<HeapObject> >* dependencies_[DependentCode::kGroupCount]; 43041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 431304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org template<typename T> 432304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org void SaveHandle(Handle<T> *object) { 433304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (!object->is_null()) { 434304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org Handle<T> handle(*(*object)); 435304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org *object = handle; 436304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 437304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 438304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 439594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org BailoutReason bailout_reason_; 44046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 44183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org int prologue_offset_; 44283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 4434e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org List<OffsetRange>* no_frame_ranges_; 4444e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 445003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // A copy of shared_info()->opt_count() to avoid handle deref 446003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // during graph optimization. 447003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org int opt_count_; 448003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 449ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Number of parameters used for compilation of stubs that require arguments. 450ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org int parameter_count_; 451ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 45241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Handle<Foreign> object_wrapper_; 45341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 454b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org DISALLOW_COPY_AND_ASSIGN(CompilationInfo); 455b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}; 456b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 457b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 4585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// Exactly like a CompilationInfo, except also creates and enters a 4595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org// Zone on construction and deallocates it on exit. 4605a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgclass CompilationInfoWithZone: public CompilationInfo { 4615a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org public: 4625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org explicit CompilationInfoWithZone(Handle<Script> script) 4635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org : CompilationInfo(script, &zone_), 4641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org zone_(script->GetIsolate()) {} 4655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org explicit CompilationInfoWithZone(Handle<SharedFunctionInfo> shared_info) 4665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org : CompilationInfo(shared_info, &zone_), 4671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org zone_(shared_info->GetIsolate()) {} 4685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org explicit CompilationInfoWithZone(Handle<JSFunction> closure) 4695a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org : CompilationInfo(closure, &zone_), 4701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org zone_(closure->GetIsolate()) {} 47141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org CompilationInfoWithZone(HydrogenCodeStub* stub, Isolate* isolate) 472a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org : CompilationInfo(stub, isolate, &zone_), 4731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org zone_(isolate) {} 4745a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 47541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Virtual destructor because a CompilationInfoWithZone has to exit the 47641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // zone scope and get rid of dependent maps even when the destructor is 47741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // called when cast as a CompilationInfo. 47841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org virtual ~CompilationInfoWithZone() { 4791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RollbackDependencies(); 48041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 48141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 4825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org private: 4835a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Zone zone_; 4845a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org}; 4855a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 4865a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 48799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// A wrapper around a CompilationInfo that detaches the Handles from 48899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// the underlying DeferredHandleScope and stores them in info_ on 48999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// destruction. 49099aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgclass CompilationHandleScope BASE_EMBEDDED { 49199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org public: 49299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org explicit CompilationHandleScope(CompilationInfo* info) 49399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org : deferred_(info->isolate()), info_(info) {} 49499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org ~CompilationHandleScope() { 49599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org info_->set_deferred_handles(deferred_.Detach()); 49699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } 49799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 49899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org private: 49999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org DeferredHandleScope deferred_; 50099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org CompilationInfo* info_; 50199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}; 50299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 50399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 504178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.orgclass HGraph; 505a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgclass HOptimizedGraphBuilder; 506178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.orgclass LChunk; 507178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 508178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org// A helper class that calls the three compilation phases in 509178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org// Crankshaft and keeps track of its state. The three phases 510178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org// CreateGraph, OptimizeGraph and GenerateAndInstallCode can either 511178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org// fail, bail-out to the full code generator or succeed. Apart from 512178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org// their return value, the status of the phase last run can be checked 513178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org// using last_status(). 5148e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.orgclass RecompileJob: public ZoneObject { 515178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org public: 5168e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org explicit RecompileJob(CompilationInfo* info) 517178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org : info_(info), 518178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org graph_builder_(NULL), 519178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org graph_(NULL), 520178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org chunk_(NULL), 521fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org last_status_(FAILED), 522fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org awaiting_install_(false) { } 523178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 524178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org enum Status { 525178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org FAILED, BAILED_OUT, SUCCEEDED 526178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org }; 527178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 528178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org MUST_USE_RESULT Status CreateGraph(); 529178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org MUST_USE_RESULT Status OptimizeGraph(); 530178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org MUST_USE_RESULT Status GenerateAndInstallCode(); 531178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 532178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org Status last_status() const { return last_status_; } 533178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org CompilationInfo* info() const { return info_; } 53409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Isolate* isolate() const { return info()->isolate(); } 535178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 536304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org MUST_USE_RESULT Status AbortOptimization() { 537304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org info_->AbortOptimization(); 53846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org info_->shared_info()->DisableOptimization(info_->bailout_reason()); 539304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org return SetLastStatus(BAILED_OUT); 540304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 541304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 5428e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org void WaitForInstall() { 543c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org ASSERT(info_->is_osr()); 5448e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org awaiting_install_ = true; 5458e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org } 5468e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 5478e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org bool IsWaitingForInstall() { return awaiting_install_; } 5488e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 549178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org private: 550178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org CompilationInfo* info_; 551a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org HOptimizedGraphBuilder* graph_builder_; 552178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org HGraph* graph_; 553178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org LChunk* chunk_; 554dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org TimeDelta time_taken_to_create_graph_; 555dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org TimeDelta time_taken_to_optimize_; 556dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org TimeDelta time_taken_to_codegen_; 557178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org Status last_status_; 5588e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org bool awaiting_install_; 559178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 560178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org MUST_USE_RESULT Status SetLastStatus(Status status) { 561178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org last_status_ = status; 562178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org return last_status_; 563178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org } 564178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org void RecordOptimizationStats(); 565178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 566178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org struct Timer { 5678e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org Timer(RecompileJob* job, TimeDelta* location) 5688e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org : job_(job), location_(location) { 569dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org ASSERT(location_ != NULL); 570dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org timer_.Start(); 571dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org } 572178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 573178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org ~Timer() { 574dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org *location_ += timer_.Elapsed(); 575178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org } 576178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 5778e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org RecompileJob* job_; 578dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org ElapsedTimer timer_; 579dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org TimeDelta* location_; 580178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org }; 581178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org}; 582178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 583178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The V8 compiler 58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// General strategy: Source code is translated into an anonymous function w/o 58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// parameters which then can be executed. If the source code contains other 58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// functions, they will be compiled and allocated as part of the compilation 58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// of the source code. 59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 591b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org// Please note this interface returns shared function infos. This means you 592b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org// need to call Factory::NewFunctionFromSharedFunctionInfo before you have a 593b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org// real function with a context. 59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Compiler : public AllStatic { 59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 59778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org // Call count before primitive functions trigger their own optimization. 59878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org static const int kCallsUntilPrimitiveOpt = 200; 59978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 6000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com // All routines return a SharedFunctionInfo. 6010511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com // If an error occurs an exception is raised and the return handle 6020511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com // contains NULL. 60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Compile a String source within a context. 6055d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static Handle<SharedFunctionInfo> Compile(Handle<String> source, 6065d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<Object> script_name, 6075d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org int line_offset, 6085d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org int column_offset, 609d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org bool is_shared_cross_origin, 610355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org Handle<Context> context, 6115d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::Extension* extension, 6125d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ScriptDataImpl* pre_data, 6135d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<Object> script_data, 6145d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org NativesFlag is_natives_code); 61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Compile a String source within a context for Eval. 6175d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static Handle<SharedFunctionInfo> CompileEval(Handle<String> source, 6185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<Context> context, 61983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org bool is_global, 6201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org LanguageMode language_mode, 6219faefa4670e0c454c6e56bb87b4410d73828e84fsvenpanne@chromium.org ParseRestriction restriction, 62204e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org int scope_position); 62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 624b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Compile from function info (used for lazy compilation). Returns true on 625b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // success and false if the compilation resulted in a stack overflow. 626b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org static bool CompileLazy(CompilationInfo* info); 627c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6283d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static bool RecompileConcurrent(Handle<JSFunction> function, 6293d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org uint32_t osr_pc_offset = 0); 630304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 631b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // Compile a shared function info object (the function is possibly lazily 632b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org // compiled). 6335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static Handle<SharedFunctionInfo> BuildFunctionInfo(FunctionLiteral* node, 634b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<Script> script); 635c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 636c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Set the function info for a newly compiled function. 6375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org static void SetFunctionInfo(Handle<SharedFunctionInfo> function_info, 638c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org FunctionLiteral* lit, 639c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org bool is_toplevel, 640c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org Handle<Script> script); 6415c838251403b0be9a882540f1922577abba4c872ager@chromium.org 6428e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org static Handle<Code> InstallOptimizedCode(RecompileJob* job); 6433d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 644b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT 645b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org static bool MakeCodeForLiveEdit(CompilationInfo* info); 646b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#endif 647b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 648b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, 6493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org CompilationInfo* info, 6503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org Handle<SharedFunctionInfo> shared); 65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 653b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 6541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CompilationPhase BASE_EMBEDDED { 6551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 6561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompilationPhase(const char* name, CompilationInfo* info); 6571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ~CompilationPhase(); 6581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 6601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool ShouldProduceTraceOutput() const; 6611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const char* name() const { return name_; } 6631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompilationInfo* info() const { return info_; } 6641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate() const { return info()->isolate(); } 6651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Zone* zone() { return &zone_; } 6661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 6681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const char* name_; 6691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompilationInfo* info_; 6701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Zone zone_; 6711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org unsigned info_zone_start_allocation_size_; 672dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org ElapsedTimer timer_; 6731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(CompilationPhase); 6751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 6761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_COMPILER_H_ 681