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