13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_COMPILER_H_
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_COMPILER_H_
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
32402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu#include "ast.h"
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "zone.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochclass ScriptDataImpl;
39f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// CompilationInfo encapsulates some information known at compile time.  It
413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// is constructed based on the resources available at compile-time.
424515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkeclass CompilationInfo BASE_EMBEDDED {
434515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke public:
44f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  explicit CompilationInfo(Handle<Script> script);
45f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  explicit CompilationInfo(Handle<SharedFunctionInfo> shared_info);
46f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  explicit CompilationInfo(Handle<JSFunction> closure);
47f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
4844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate() {
4944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(Isolate::Current() == isolate_);
5044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return isolate_;
5144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
52589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  bool is_lazy() const { return IsLazy::decode(flags_); }
53589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  bool is_eval() const { return IsEval::decode(flags_); }
54589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  bool is_global() const { return IsGlobal::decode(flags_); }
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool is_classic_mode() const { return language_mode() == CLASSIC_MODE; }
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool is_extended_mode() const { return language_mode() == EXTENDED_MODE; }
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LanguageMode language_mode() const {
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return LanguageModeField::decode(flags_);
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
60589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  bool is_in_loop() const { return IsInLoop::decode(flags_); }
61f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  FunctionLiteral* function() const { return function_; }
62f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Scope* scope() const { return scope_; }
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Scope* global_scope() const { return global_scope_; }
64f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Handle<Code> code() const { return code_; }
65f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Handle<JSFunction> closure() const { return closure_; }
66f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
67f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Handle<Script> script() const { return script_; }
68f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  v8::Extension* extension() const { return extension_; }
69f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  ScriptDataImpl* pre_parse_data() const { return pre_parse_data_; }
70f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Handle<Context> calling_context() const { return calling_context_; }
71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int osr_ast_id() const { return osr_ast_id_; }
72f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
73f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void MarkAsEval() {
74f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(!is_lazy());
75f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    flags_ |= IsEval::encode(true);
764515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  }
77f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void MarkAsGlobal() {
78f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(!is_lazy());
79f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    flags_ |= IsGlobal::encode(true);
803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void SetLanguageMode(LanguageMode language_mode) {
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(this->language_mode() == CLASSIC_MODE ||
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           this->language_mode() == language_mode ||
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           language_mode == EXTENDED_MODE);
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    flags_ = LanguageModeField::update(flags_, language_mode);
861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
87f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void MarkAsInLoop() {
88f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(is_lazy());
89f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    flags_ |= IsInLoop::encode(true);
903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
91203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch  void MarkAsNative() {
92203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch    flags_ |= IsNative::encode(true);
9344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
94203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch  bool is_native() const {
95203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch    return IsNative::decode(flags_);
9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
97f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void SetFunction(FunctionLiteral* literal) {
98f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(function_ == NULL);
99f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    function_ = literal;
1003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
101f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void SetScope(Scope* scope) {
102f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(scope_ == NULL);
103f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    scope_ = scope;
1043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void SetGlobalScope(Scope* global_scope) {
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(global_scope_ == NULL);
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    global_scope_ = global_scope;
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
109f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void SetCode(Handle<Code> code) { code_ = code; }
110f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void SetExtension(v8::Extension* extension) {
111f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(!is_lazy());
112f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    extension_ = extension;
113f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  }
114f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void SetPreParseData(ScriptDataImpl* pre_parse_data) {
115f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(!is_lazy());
116f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    pre_parse_data_ = pre_parse_data;
117f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  }
118f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  void SetCallingContext(Handle<Context> context) {
119f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    ASSERT(is_eval());
120f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch    calling_context_ = context;
1213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetOsrAstId(int osr_ast_id) {
123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(IsOptimizing());
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    osr_ast_id_ = osr_ast_id;
125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void MarkCompilingForDebugging(Handle<Code> current_code) {
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(mode_ != OPTIMIZE);
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(current_code->kind() == Code::FUNCTION);
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    flags_ |= IsCompilingForDebugging::encode(true);
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (current_code->is_compiled_optimizable()) {
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      EnableDeoptimizationSupport();
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      mode_ = CompilationInfo::NONOPT;
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsCompilingForDebugging() {
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return IsCompilingForDebugging::decode(flags_);
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool has_global_object() const {
141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !closure().is_null() && (closure()->context()->global() != NULL);
142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GlobalObject* global_object() const {
145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return has_global_object() ? closure()->context()->global() : NULL;
146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Accessors for the different compilation modes.
149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsOptimizing() const { return mode_ == OPTIMIZE; }
150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsOptimizable() const { return mode_ == BASE; }
151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetOptimizing(int osr_ast_id) {
152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetMode(OPTIMIZE);
153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    osr_ast_id_ = osr_ast_id;
154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void DisableOptimization();
156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Deoptimization support.
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasDeoptimizationSupport() const {
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return SupportsDeoptimization::decode(flags_);
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void EnableDeoptimizationSupport() {
162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(IsOptimizable());
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    flags_ |= SupportsDeoptimization::encode(true);
164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Determines whether or not to insert a self-optimization header.
1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool ShouldSelfOptimize();
1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Disable all optimization attempts of this info for the rest of the
170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // current compilation pipeline.
171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void AbortOptimization();
172257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1734515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke private:
17444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Compilation mode.
177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // BASE is generated by the full codegen, optionally prepared for bailouts.
178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // OPTIMIZE is optimized code generated by the Hydrogen-based backend.
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // NONOPT is generated by the full codegen and is not prepared for
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //   recompilation/bailouts.  These functions are never recompiled.
181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Mode {
182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    BASE,
183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    OPTIMIZE,
184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    NONOPT
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CompilationInfo() : function_(NULL) {}
188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void Initialize(Mode mode) {
190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    mode_ = V8::UseCrankshaft() ? mode : NONOPT;
1913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(!script_.is_null());
192203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch    if (script_->type()->value() == Script::TYPE_NATIVE) {
193203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch      MarkAsNative();
194203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch    }
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!shared_info_.is_null()) {
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT(language_mode() == CLASSIC_MODE);
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      SetLanguageMode(shared_info_->language_mode());
1981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetMode(Mode mode) {
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(V8::UseCrankshaft());
203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    mode_ = mode;
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
206f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Flags using template class BitField<type, start, length>.  All are
207f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // false by default.
208f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  //
209f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Compilation is either eager or lazy.
210f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  class IsLazy:   public BitField<bool, 0, 1> {};
211f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Flags that can be set for eager compilation.
212f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  class IsEval:   public BitField<bool, 1, 1> {};
213f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  class IsGlobal: public BitField<bool, 2, 1> {};
214f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Flags that can be set for lazy compilation.
2153e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu  class IsInLoop: public BitField<bool, 3, 1> {};
2161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Strict mode - used in eager compilation.
2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  class LanguageModeField: public BitField<LanguageMode, 4, 2> {};
218203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch  // Is this a function from our natives.
219203a29f4f37141ddcebc5015e4d3ab2100f2ee45Ben Murdoch  class IsNative: public BitField<bool, 6, 1> {};
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Is this code being compiled with support for deoptimization..
2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  class SupportsDeoptimization: public BitField<bool, 7, 1> {};
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // If compiling for debugging produce just full code matching the
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // initial mode setting.
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  class IsCompilingForDebugging: public BitField<bool, 8, 1> {};
225f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
2263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
227f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  unsigned flags_;
228f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
229f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Fields filled in by the compilation pipeline.
230f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // AST filled in by the parser.
231f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  FunctionLiteral* function_;
2323e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu  // The scope of the function literal as a convenience.  Set to indicate
233f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // that scopes have been analyzed.
234f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Scope* scope_;
2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The global scope provided as a convenience.
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Scope* global_scope_;
237f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // The compiled code.
238f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Handle<Code> code_;
2393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
240f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Possible initial inputs to the compilation process.
2413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  Handle<JSFunction> closure_;
2424515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  Handle<SharedFunctionInfo> shared_info_;
2433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  Handle<Script> script_;
2443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
245f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Fields possibly needed for eager compilation, NULL by default.
246f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  v8::Extension* extension_;
247f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  ScriptDataImpl* pre_parse_data_;
2483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
249f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // The context of the caller is needed for eval code, and will be a null
250f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // handle otherwise.
251f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  Handle<Context> calling_context_;
2523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Compilation mode flag and whether deoptimization is allowed.
254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Mode mode_;
255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int osr_ast_id_;
256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  DISALLOW_COPY_AND_ASSIGN(CompilationInfo);
2584515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke};
2594515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
2604515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The V8 compiler
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// General strategy: Source code is translated into an anonymous function w/o
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// parameters which then can be executed. If the source code contains other
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// functions, they will be compiled and allocated as part of the compilation
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// of the source code.
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
268f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch// Please note this interface returns shared function infos.  This means you
269f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch// need to call Factory::NewFunctionFromSharedFunctionInfo before you have a
270f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch// real function with a context.
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Compiler : public AllStatic {
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
274b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Default maximum number of function optimization attempts before we
275b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // give up.
276b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  static const int kDefaultMaxOptCount = 10;
277b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kMaxInliningLevels = 3;
2798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Call count before primitive functions trigger their own optimization.
2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kCallsUntilPrimitiveOpt = 200;
2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // All routines return a SharedFunctionInfo.
284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // If an error occurs an exception is raised and the return handle
285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // contains NULL.
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Compile a String source within a context.
2886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static Handle<SharedFunctionInfo> Compile(Handle<String> source,
2896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                            Handle<Object> script_name,
2906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                            int line_offset,
2916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                            int column_offset,
2926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                            v8::Extension* extension,
2936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                            ScriptDataImpl* pre_data,
2946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                            Handle<Object> script_data,
2956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                            NativesFlag is_natives_code);
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Compile a String source within a context for Eval.
2986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static Handle<SharedFunctionInfo> CompileEval(Handle<String> source,
2996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                                Handle<Context> context,
3001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                                bool is_global,
3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                LanguageMode language_mode,
3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                int scope_position);
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
304f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Compile from function info (used for lazy compilation). Returns true on
305f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // success and false if the compilation resulted in a stack overflow.
3064515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  static bool CompileLazy(CompilationInfo* info);
307d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
308f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // Compile a shared function info object (the function is possibly lazily
309f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  // compiled).
3106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static Handle<SharedFunctionInfo> BuildFunctionInfo(FunctionLiteral* node,
311f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch                                                      Handle<Script> script);
312d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
313d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  // Set the function info for a newly compiled function.
3146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void SetFunctionInfo(Handle<SharedFunctionInfo> function_info,
315d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                              FunctionLiteral* lit,
316d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                              bool is_toplevel,
317d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                              Handle<Script> script);
3183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
319f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#ifdef ENABLE_DEBUGGER_SUPPORT
320f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  static bool MakeCodeForLiveEdit(CompilationInfo* info);
321f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#endif
322f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
3236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void RecordFunctionCompilation(Logger::LogEventsAndTags tag,
324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                        CompilationInfo* info,
325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                        Handle<SharedFunctionInfo> shared);
3266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
3276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_COMPILER_H_
332