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