1b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compiler.h" 8eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bootstrapper.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/codegen.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compilation-cache.h" 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/pipeline.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/cpu-profiler.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h" 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/deoptimizer.h" 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/full-codegen.h" 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/gdb-jit.h" 18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen.h" 19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate-inl.h" 20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium.h" 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/liveedit.h" 22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/parser.h" 23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/rewriter.h" 24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime-profiler.h" 25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scanner-character-streams.h" 26196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopeinfo.h" 27196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopes.h" 284b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/typing.h" 29196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/vm-state-inl.h" 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 3570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.orgScriptData::ScriptData(const byte* data, int length) 3670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org : owns_data_(false), data_(data), length_(length) { 3770d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org if (!IsAligned(reinterpret_cast<intptr_t>(data), kPointerAlignment)) { 3870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org byte* copy = NewArray<byte>(length); 39e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsAligned(reinterpret_cast<intptr_t>(copy), kPointerAlignment)); 4070d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org CopyBytes(copy, data, length); 4170d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org data_ = copy; 4270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org AcquireDataOwnership(); 4370d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org } 4470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org} 4570d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 4670d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org 47a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCompilationInfo::CompilationInfo(Handle<Script> script, Zone* zone) 48fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org : flags_(kThisHasUses), 49b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org script_(script), 50b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source_stream_(NULL), 513d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org osr_ast_id_(BailoutId::None()), 52e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org parameter_count_(0), 5308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org optimization_id_(-1), 5408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ast_value_factory_(NULL), 55d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org ast_value_factory_owned_(false), 56d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org aborted_due_to_dependency_change_(false) { 57a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Initialize(script->GetIsolate(), BASE, zone); 58b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 59b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 60b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgCompilationInfo::CompilationInfo(Isolate* isolate, Zone* zone) 62fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org : flags_(kThisHasUses), 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org script_(Handle<Script>::null()), 64b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source_stream_(NULL), 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org osr_ast_id_(BailoutId::None()), 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org parameter_count_(0), 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org optimization_id_(-1), 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ast_value_factory_(NULL), 69d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org ast_value_factory_owned_(false), 70d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org aborted_due_to_dependency_change_(false) { 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Initialize(isolate, STUB, zone); 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 755a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgCompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info, 765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Zone* zone) 77fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org : flags_(kLazy | kThisHasUses), 78b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org shared_info_(shared_info), 79b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org script_(Handle<Script>(Script::cast(shared_info->script()))), 80b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source_stream_(NULL), 813d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org osr_ast_id_(BailoutId::None()), 82e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org parameter_count_(0), 8308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org optimization_id_(-1), 8408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ast_value_factory_(NULL), 85d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org ast_value_factory_owned_(false), 86d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org aborted_due_to_dependency_change_(false) { 87a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Initialize(script_->GetIsolate(), BASE, zone); 88b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 89b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 90b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 91a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCompilationInfo::CompilationInfo(Handle<JSFunction> closure, Zone* zone) 92fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org : flags_(kLazy | kThisHasUses), 93b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org closure_(closure), 94b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org shared_info_(Handle<SharedFunctionInfo>(closure->shared())), 95b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org script_(Handle<Script>(Script::cast(shared_info_->script()))), 96b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source_stream_(NULL), 97355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org context_(closure->context()), 983d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org osr_ast_id_(BailoutId::None()), 99e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org parameter_count_(0), 10008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org optimization_id_(-1), 10108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ast_value_factory_(NULL), 102d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org ast_value_factory_owned_(false), 103d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org aborted_due_to_dependency_change_(false) { 104a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Initialize(script_->GetIsolate(), BASE, zone); 10583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org} 10683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 10783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 108a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCompilationInfo::CompilationInfo(HydrogenCodeStub* stub, Isolate* isolate, 1091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Zone* zone) 110fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org : flags_(kLazy | kThisHasUses), 111b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source_stream_(NULL), 1123d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org osr_ast_id_(BailoutId::None()), 113e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org parameter_count_(0), 11408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org optimization_id_(-1), 11508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ast_value_factory_(NULL), 116d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org ast_value_factory_owned_(false), 117d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org aborted_due_to_dependency_change_(false) { 118a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Initialize(isolate, STUB, zone); 119a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org code_stub_ = stub; 120a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 121a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 122a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 123b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgCompilationInfo::CompilationInfo( 124b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org ScriptCompiler::ExternalSourceStream* stream, 125b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org ScriptCompiler::StreamedSource::Encoding encoding, Isolate* isolate, 126b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org Zone* zone) 127b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org : flags_(kThisHasUses), 128b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source_stream_(stream), 129b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org source_stream_encoding_(encoding), 130b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org osr_ast_id_(BailoutId::None()), 131b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org parameter_count_(0), 132b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org optimization_id_(-1), 133b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org ast_value_factory_(NULL), 134d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org ast_value_factory_owned_(false), 135d3524f33e43612426645e5cf0c04c491d34afa71yangguo@chromium.org aborted_due_to_dependency_change_(false) { 136b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org Initialize(isolate, BASE, zone); 137b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org} 138b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 139b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid CompilationInfo::Initialize(Isolate* isolate, 1411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Mode mode, 1421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Zone* zone) { 143a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org isolate_ = isolate; 14483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org function_ = NULL; 14583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org scope_ = NULL; 14683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org global_scope_ = NULL; 14783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org extension_ = NULL; 14869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org cached_data_ = NULL; 1494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options_ = ScriptCompiler::kNoCompileOptions; 15083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org zone_ = zone; 15183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org deferred_handles_ = NULL; 152a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org code_stub_ = NULL; 153c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org prologue_offset_ = Code::kPrologueOffsetNotSet; 154003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org opt_count_ = shared_info().is_null() ? 0 : shared_info()->opt_count(); 1554e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org no_frame_ranges_ = isolate->cpu_profiler()->is_profiling() 1564e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org ? new List<OffsetRange>(2) : NULL; 15741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org for (int i = 0; i < DependentCode::kGroupCount; i++) { 1581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org dependencies_[i] = NULL; 15941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 160a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (mode == STUB) { 161a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org mode_ = STUB; 162a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return; 163a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 164c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org mode_ = mode; 165b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!script_.is_null() && script_->type()->value() == Script::TYPE_NATIVE) { 166b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org MarkAsNative(); 167b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 168d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org if (isolate_->debug()->is_active()) MarkAsDebug(); 169fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org if (FLAG_context_specialization) MarkAsContextSpecializing(); 1706313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org if (FLAG_turbo_inlining) MarkAsInliningEnabled(); 171c6509d2e0fb825426296fbc357cf89f2c77ff434machenbach@chromium.org if (FLAG_turbo_types) MarkAsTypingEnabled(); 172a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 17383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (!shared_info_.is_null()) { 174e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(strict_mode() == SLOPPY); 175486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org SetStrictMode(shared_info_->strict_mode()); 17683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org } 177b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org bailout_reason_ = kUnknown; 178a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 179a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org if (!shared_info().is_null() && shared_info()->is_compiled()) { 180a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // We should initialize the CompilationInfo feedback vector from the 181a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // passed in shared info, rather than creating a new one. 182a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org feedback_vector_ = 183a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<TypeFeedbackVector>(shared_info()->feedback_vector(), isolate); 184a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } 185b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 186b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 187b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 18899aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgCompilationInfo::~CompilationInfo() { 189b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (GetFlag(kDisableFutureOptimization)) { 190b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org shared_info()->DisableOptimization(bailout_reason()); 191b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 19299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org delete deferred_handles_; 1934e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org delete no_frame_ranges_; 19408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (ast_value_factory_owned_) delete ast_value_factory_; 19541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#ifdef DEBUG 19641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Check that no dependent maps have been added or added dependent maps have 19741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // been rolled back or committed. 19841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org for (int i = 0; i < DependentCode::kGroupCount; i++) { 199e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(NULL, dependencies_[i]); 20041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 20141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#endif // DEBUG 20241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org} 20341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 20441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 2051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid CompilationInfo::CommitDependencies(Handle<Code> code) { 20641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org for (int i = 0; i < DependentCode::kGroupCount; i++) { 2071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; 2081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (group_objects == NULL) continue; 209e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!object_wrapper_.is_null()); 2101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org for (int j = 0; j < group_objects->length(); j++) { 2111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependentCode::DependencyGroup group = 2121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static_cast<DependentCode::DependencyGroup>(i); 2131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependentCode* dependent_code = 2141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependentCode::ForObject(group_objects->at(j), group); 2151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org dependent_code->UpdateToFinishedCode(group, this, *code); 21641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 2171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org dependencies_[i] = NULL; // Zone-allocated, no need to delete. 21841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 21941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org} 22041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 22141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 2221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid CompilationInfo::RollbackDependencies() { 22341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Unregister from all dependent maps if not yet committed. 22441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org for (int i = 0; i < DependentCode::kGroupCount; i++) { 2251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ZoneList<Handle<HeapObject> >* group_objects = dependencies_[i]; 2261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (group_objects == NULL) continue; 2271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org for (int j = 0; j < group_objects->length(); j++) { 2281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependentCode::DependencyGroup group = 2291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static_cast<DependentCode::DependencyGroup>(i); 2301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependentCode* dependent_code = 2311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DependentCode::ForObject(group_objects->at(j), group); 2321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org dependent_code->RemoveCompilationInfo(group, this); 23341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 2341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org dependencies_[i] = NULL; // Zone-allocated, no need to delete. 23541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 23699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org} 23799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 23899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 239a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgint CompilationInfo::num_parameters() const { 240ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org if (IsStub()) { 241e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(parameter_count_ > 0); 242ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org return parameter_count_; 243ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } else { 244ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org return scope()->num_parameters(); 245ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } 246a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 247a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 248a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 249a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgint CompilationInfo::num_heap_slots() const { 250a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (IsStub()) { 251a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return 0; 252a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } else { 253a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return scope()->num_heap_slots(); 254a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 255a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 256a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 257a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 258a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgCode::Flags CompilationInfo::flags() const { 259a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (IsStub()) { 260b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org return Code::ComputeFlags(code_stub()->GetCodeKind(), 261b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org code_stub()->GetICState(), 262b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org code_stub()->GetExtraICState(), 263f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org code_stub()->GetStubType()); 264a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } else { 265a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return Code::ComputeFlags(Code::OPTIMIZED_FUNCTION); 266a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 267a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 268a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 269a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 27078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org// Primitive functions are unlikely to be picked up by the stack-walking 27178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org// profiler, so they trigger their own optimization when they're called 27278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org// for the SharedFunctionInfo::kCallsUntilPrimitiveOptimization-th time. 27378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgbool CompilationInfo::ShouldSelfOptimize() { 274afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org return FLAG_crankshaft && 27578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org !function()->flags()->Contains(kDontSelfOptimize) && 2762c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org !function()->dont_optimize() && 2775a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org function()->scope()->AllowsLazyCompilation() && 27878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org (shared_info().is_null() || !shared_info()->optimization_disabled()); 27978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org} 28078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 28178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 282f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid CompilationInfo::PrepareForCompilation(Scope* scope) { 283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(scope_ == NULL); 284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org scope_ = scope; 285a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 286a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org int length = function()->slot_count(); 287a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org if (feedback_vector_.is_null()) { 288a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org // Allocate the feedback vector too. 289a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org feedback_vector_ = isolate()->factory()->NewTypeFeedbackVector(length); 290a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } 291e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(feedback_vector_->length() == length); 292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 295cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.orgclass HOptimizedGraphBuilderWithPositions: public HOptimizedGraphBuilder { 29671f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org public: 297cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org explicit HOptimizedGraphBuilderWithPositions(CompilationInfo* info) 29871f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org : HOptimizedGraphBuilder(info) { 29971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org } 30071f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 30171f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org#define DEF_VISIT(type) \ 302ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void Visit##type(type* node) OVERRIDE { \ 30371f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org if (node->position() != RelocInfo::kNoPosition) { \ 30471f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org SetSourcePosition(node->position()); \ 30571f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org } \ 30671f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org HOptimizedGraphBuilder::Visit##type(node); \ 30771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org } 30871f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org EXPRESSION_NODE_LIST(DEF_VISIT) 30971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org#undef DEF_VISIT 31071f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 31171f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org#define DEF_VISIT(type) \ 312ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void Visit##type(type* node) OVERRIDE { \ 31371f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org if (node->position() != RelocInfo::kNoPosition) { \ 31471f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org SetSourcePosition(node->position()); \ 31571f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org } \ 31671f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org HOptimizedGraphBuilder::Visit##type(node); \ 31771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org } 31871f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org STATEMENT_NODE_LIST(DEF_VISIT) 31971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org#undef DEF_VISIT 32071f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 32171f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org#define DEF_VISIT(type) \ 322ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void Visit##type(type* node) OVERRIDE { \ 32371f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org HOptimizedGraphBuilder::Visit##type(node); \ 32471f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org } 32571f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org MODULE_NODE_LIST(DEF_VISIT) 32671f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org DECLARATION_NODE_LIST(DEF_VISIT) 32771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org#undef DEF_VISIT 32871f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org}; 32971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 33071f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 3314954674151afa960af66efb4831df06bde727333yangguo@chromium.orgOptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { 332e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(isolate()->use_crankshaft()); 333e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info()->IsOptimizing()); 334e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!info()->IsCompilingForDebugging()); 335a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3367979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org // We should never arrive here if optimization has been disabled on the 3377979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org // shared function info. 338e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!info()->shared_info()->optimization_disabled()); 3397979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 34047390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org // Do not use crankshaft if we need to be able to set break points. 34147390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org if (isolate()->DebuggerHasBreakPoints()) { 342b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return RetryOptimization(kDebuggerHasBreakPoints); 34347390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org } 344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 345a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Limit the number of times we re-compile a functions with 346a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // the optimizing compiler. 3470511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com const int kMaxOptCount = 348de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000; 349003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (info()->opt_count() > kMaxOptCount) { 350b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return AbortOptimization(kOptimizedTooManyTimes); 351a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 352a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Due to an encoding limit on LUnallocated operands in the Lithium 354a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // language, we cannot optimize functions with too many formal parameters 355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // or perform on-stack replacement for function with too many 356a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // stack-allocated local variables. 357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // 3589ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org // The encoding is as a signed value, with parameters and receiver using 3599ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org // the negative indices and locals the non-negative ones. 36057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org const int parameter_limit = -LUnallocated::kMinFixedSlotIndex; 361178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org Scope* scope = info()->scope(); 36246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if ((scope->num_parameters() + 1) > parameter_limit) { 363b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return AbortOptimization(kTooManyParameters); 36446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 36546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 36657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org const int locals_limit = LUnallocated::kMaxFixedSlotIndex; 367c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (info()->is_osr() && 36846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org scope->num_parameters() + 1 + scope->num_stack_slots() > locals_limit) { 369b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return AbortOptimization(kTooManyParametersLocals); 370a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 37263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org if (scope->HasIllegalRedeclaration()) { 373b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return AbortOptimization(kFunctionWithIllegalRedeclaration); 37463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org } 37563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org 3767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check the whitelist for Crankshaft. 3771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (!info()->closure()->PassesFilter(FLAG_hydrogen_filter)) { 3784954674151afa960af66efb4831df06bde727333yangguo@chromium.org return AbortOptimization(kHydrogenFilter); 379a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 380a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Crankshaft requires a version of fullcode with deoptimization support. 382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Recompile the unoptimized version of the code if the current version 3837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // doesn't have deoptimization support already. 3847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Otherwise, if we are gathering compilation time and space statistics 3857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // for hydrogen, gather baseline statistics for a fullcode compilation. 386178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org bool should_recompile = !info()->shared_info()->has_deoptimization_support(); 387b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org if (should_recompile || FLAG_hydrogen_stats) { 3885de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::ElapsedTimer timer; 3891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (FLAG_hydrogen_stats) { 390dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org timer.Start(); 3911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 392a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (!Compiler::EnsureDeoptimizationSupport(info())) { 393a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return SetLastStatus(FAILED); 394a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 3951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (FLAG_hydrogen_stats) { 396dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org isolate()->GetHStatistics()->IncrementFullCodeGen(timer.Elapsed()); 3971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 400e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info()->shared_info()->has_deoptimization_support()); 401a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 4027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Check the whitelist for TurboFan. 40306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if ((FLAG_turbo_asm && info()->shared_info()->asm_function()) || 40406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org info()->closure()->PassesFilter(FLAG_turbo_filter)) { 4057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org compiler::Pipeline pipeline(info()); 4067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org pipeline.GenerateCode(); 407aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org if (!info()->code().is_null()) { 4086474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (FLAG_turbo_deoptimization) { 4096474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org info()->context()->native_context()->AddOptimizedCode(*info()->code()); 4106474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 411aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org return SetLastStatus(SUCCEEDED); 412aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org } 4137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 415a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (FLAG_trace_hydrogen) { 416906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Handle<String> name = info()->function()->debug_name(); 417a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org PrintF("-----------------------------------------------------------\n"); 418afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org PrintF("Compiling method %s using hydrogen\n", name->ToCString().get()); 419750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org isolate()->GetHTracer()->TraceCompilation(info()); 420a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 421c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 422c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // Type-check the function. 42341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org AstTyper::Run(info()); 424c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 42547390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org graph_builder_ = (FLAG_hydrogen_track_positions || FLAG_trace_ic) 426cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org ? new(info()->zone()) HOptimizedGraphBuilderWithPositions(info()) 42771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org : new(info()->zone()) HOptimizedGraphBuilder(info()); 4288e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 4298e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Timer t(this, &time_taken_to_create_graph_); 430e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org info()->set_this_has_uses(false); 431178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org graph_ = graph_builder_->CreateGraph(); 432178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 433750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (isolate()->has_pending_exception()) { 434178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org return SetLastStatus(FAILED); 435496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org } 436496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 437b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (graph_ == NULL) return SetLastStatus(BAILED_OUT); 438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 439594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (info()->HasAbortedDueToDependencyChange()) { 440b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Dependency has changed during graph creation. Let's try again later. 441b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return RetryOptimization(kBailedOutDueToDependencyChange); 442594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 443594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 444178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org return SetLastStatus(SUCCEEDED); 445178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org} 446178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 447e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 4484954674151afa960af66efb4831df06bde727333yangguo@chromium.orgOptimizedCompileJob::Status OptimizedCompileJob::OptimizeGraph() { 44979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_allocation; 45079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHandleAllocation no_handles; 45179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHandleDereference no_deref; 452594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org DisallowCodeDependencyChange no_dependency_change; 453304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 454e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_status() == SUCCEEDED); 4557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(turbofan): Currently everything is done in the first phase. 4567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!info()->code().is_null()) { 4577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return last_status(); 4587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 460178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org Timer t(this, &time_taken_to_optimize_); 461e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(graph_ != NULL); 462594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org BailoutReason bailout_reason = kNoReason; 4634954674151afa960af66efb4831df06bde727333yangguo@chromium.org 4644954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (graph_->Optimize(&bailout_reason)) { 465178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org chunk_ = LChunk::NewChunk(graph_); 4664954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (chunk_ != NULL) return SetLastStatus(SUCCEEDED); 4674954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else if (bailout_reason != kNoReason) { 4684954674151afa960af66efb4831df06bde727333yangguo@chromium.org graph_builder_->Bailout(bailout_reason); 469ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org } 4704954674151afa960af66efb4831df06bde727333yangguo@chromium.org 471b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return SetLastStatus(BAILED_OUT); 472178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org} 473178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 474178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org 4754954674151afa960af66efb4831df06bde727333yangguo@chromium.orgOptimizedCompileJob::Status OptimizedCompileJob::GenerateCode() { 476e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_status() == SUCCEEDED); 4777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(turbofan): Currently everything is done in the first phase. 4787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!info()->code().is_null()) { 4797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RecordOptimizationStats(); 4807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return last_status(); 4817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 483e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!info()->HasAbortedDueToDependencyChange()); 484594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org DisallowCodeDependencyChange no_dependency_change; 485248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org DisallowJavascriptExecution no_js(isolate()); 4868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org { // Scope for timer. 4878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Timer timer(this, &time_taken_to_codegen_); 488e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(chunk_ != NULL); 489e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(graph_ != NULL); 49032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // Deferred handles reference objects that were accessible during 49132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // graph creation. To make sure that we don't encounter inconsistencies 49232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // between graph creation and code generation, we disallow accessing 49332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // objects through deferred handles during the latter, with exceptions. 49420301245150643e00fb3da074c01823cc7978a99yangguo@chromium.org DisallowDeferredHandleDereference no_deferred_handle_deref; 495b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org Handle<Code> optimized_code = chunk_->Codegen(); 4968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (optimized_code.is_null()) { 497594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (info()->bailout_reason() == kNoReason) { 498b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return AbortOptimization(kCodeGenerationFailed); 499594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 500b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return SetLastStatus(BAILED_OUT); 5018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 5028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org info()->SetCode(optimized_code); 50346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 504178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org RecordOptimizationStats(); 5053d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Add to the weak list of optimized code objects. 5063d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org info()->context()->native_context()->AddOptimizedCode(*info()->code()); 507178fb15415fbc935540c9780a526d104437fdf17verwaest@chromium.org return SetLastStatus(SUCCEEDED); 508a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 510a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5114954674151afa960af66efb4831df06bde727333yangguo@chromium.orgvoid OptimizedCompileJob::RecordOptimizationStats() { 5124954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<JSFunction> function = info()->closure(); 5134954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!function->IsOptimized()) { 5144954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Concurrent recompilation and OSR may race. Increment only once. 5154954674151afa960af66efb4831df06bde727333yangguo@chromium.org int opt_count = function->shared()->opt_count(); 5164954674151afa960af66efb4831df06bde727333yangguo@chromium.org function->shared()->set_opt_count(opt_count + 1); 51799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org } 5184954674151afa960af66efb4831df06bde727333yangguo@chromium.org double ms_creategraph = time_taken_to_create_graph_.InMillisecondsF(); 5194954674151afa960af66efb4831df06bde727333yangguo@chromium.org double ms_optimize = time_taken_to_optimize_.InMillisecondsF(); 5204954674151afa960af66efb4831df06bde727333yangguo@chromium.org double ms_codegen = time_taken_to_codegen_.InMillisecondsF(); 5214954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (FLAG_trace_opt) { 5224954674151afa960af66efb4831df06bde727333yangguo@chromium.org PrintF("[optimizing "); 5234954674151afa960af66efb4831df06bde727333yangguo@chromium.org function->ShortPrint(); 5244954674151afa960af66efb4831df06bde727333yangguo@chromium.org PrintF(" - took %0.3f, %0.3f, %0.3f ms]\n", ms_creategraph, ms_optimize, 5254954674151afa960af66efb4831df06bde727333yangguo@chromium.org ms_codegen); 5266a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 5274954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (FLAG_trace_opt_stats) { 5284954674151afa960af66efb4831df06bde727333yangguo@chromium.org static double compilation_time = 0.0; 5294954674151afa960af66efb4831df06bde727333yangguo@chromium.org static int compiled_functions = 0; 5304954674151afa960af66efb4831df06bde727333yangguo@chromium.org static int code_size = 0; 531ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 5324954674151afa960af66efb4831df06bde727333yangguo@chromium.org compilation_time += (ms_creategraph + ms_optimize + ms_codegen); 5334954674151afa960af66efb4831df06bde727333yangguo@chromium.org compiled_functions++; 5344954674151afa960af66efb4831df06bde727333yangguo@chromium.org code_size += function->shared()->SourceSize(); 5354954674151afa960af66efb4831df06bde727333yangguo@chromium.org PrintF("Compiled: %d functions with %d byte source size in %fms.\n", 5364954674151afa960af66efb4831df06bde727333yangguo@chromium.org compiled_functions, 5374954674151afa960af66efb4831df06bde727333yangguo@chromium.org code_size, 5384954674151afa960af66efb4831df06bde727333yangguo@chromium.org compilation_time); 5394954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 5404954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (FLAG_hydrogen_stats) { 5414954674151afa960af66efb4831df06bde727333yangguo@chromium.org isolate()->GetHStatistics()->IncrementSubtotals(time_taken_to_create_graph_, 5424954674151afa960af66efb4831df06bde727333yangguo@chromium.org time_taken_to_optimize_, 5434954674151afa960af66efb4831df06bde727333yangguo@chromium.org time_taken_to_codegen_); 5444954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 54546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 54646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 54746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 5482ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org// Sets the expected number of properties based on estimate from compiler. 5492ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.orgvoid SetExpectedNofPropertiesFromEstimate(Handle<SharedFunctionInfo> shared, 5502ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org int estimate) { 5512ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // If no properties are added in the constructor, they are more likely 5522ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // to be added later. 5532ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org if (estimate == 0) estimate = 2; 5542ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org 5552ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // TODO(yangguo): check whether those heuristics are still up-to-date. 5562ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // We do not shrink objects that go into a snapshot (yet), so we adjust 5572ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // the estimate conservatively. 558fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org if (shared->GetIsolate()->serializer_enabled()) { 5592ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org estimate += 2; 5602ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org } else if (FLAG_clever_optimizations) { 5612ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // Inobject slack tracking will reclaim redundant inobject space later, 5622ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org // so we can afford to adjust the estimate generously. 5632ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org estimate += 8; 5642ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org } else { 5652ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org estimate += 3; 5662ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org } 5672ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org 5682ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org shared->set_expected_nof_properties(estimate); 5692ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org} 5702ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org 5712ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org 5724954674151afa960af66efb4831df06bde727333yangguo@chromium.org// Sets the function info on a function. 5734954674151afa960af66efb4831df06bde727333yangguo@chromium.org// The start_position points to the first '(' character after the function name 5744954674151afa960af66efb4831df06bde727333yangguo@chromium.org// in the full script source. When counting characters in the script source the 5754954674151afa960af66efb4831df06bde727333yangguo@chromium.org// the first character is number 0 (not 1). 5764954674151afa960af66efb4831df06bde727333yangguo@chromium.orgstatic void SetFunctionInfo(Handle<SharedFunctionInfo> function_info, 5774954674151afa960af66efb4831df06bde727333yangguo@chromium.org FunctionLiteral* lit, 5784954674151afa960af66efb4831df06bde727333yangguo@chromium.org bool is_toplevel, 5794954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<Script> script) { 5804954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_length(lit->parameter_count()); 5814954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_formal_parameter_count(lit->parameter_count()); 5824954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_script(*script); 5834954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_function_token_position(lit->function_token_position()); 5844954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_start_position(lit->start_position()); 5854954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_end_position(lit->end_position()); 5864954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_is_expression(lit->is_expression()); 5874954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_is_anonymous(lit->is_anonymous()); 5884954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_is_toplevel(is_toplevel); 5894954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_inferred_name(*lit->inferred_name()); 5904954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation()); 5914954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_allows_lazy_compilation_without_context( 5924954674151afa960af66efb4831df06bde727333yangguo@chromium.org lit->AllowsLazyCompilationWithoutContext()); 593486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org function_info->set_strict_mode(lit->strict_mode()); 5944954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_uses_arguments(lit->scope()->arguments() != NULL); 5954954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_has_duplicate_parameters(lit->has_duplicate_parameters()); 5964954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_ast_node_count(lit->ast_node_count()); 5974954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_is_function(lit->is_function()); 5986fbe38f254bead420fb1c779e97dbeb71e92d23cyangguo@chromium.org function_info->set_bailout_reason(lit->dont_optimize_reason()); 5994954674151afa960af66efb4831df06bde727333yangguo@chromium.org function_info->set_dont_cache(lit->flags()->Contains(kDontCache)); 6002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org function_info->set_kind(lit->kind()); 601a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org function_info->set_asm_function(lit->scope()->asm_function()); 602a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org} 603a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 604a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 605a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgstatic void RecordFunctionCompilation(Logger::LogEventsAndTags tag, 606a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CompilationInfo* info, 607a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<SharedFunctionInfo> shared) { 608a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // SharedFunctionInfo is passed separately, because if CompilationInfo 609a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // was created using Script object, it will not have it. 610a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 611a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Log the code generation. If source information is available include 612a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // script name and line number. Check explicitly whether logging is 613a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // enabled as finding the line number is not free. 614a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (info->isolate()->logger()->is_logging_code_events() || 615a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org info->isolate()->cpu_profiler()->is_profiling()) { 616a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<Script> script = info->script(); 617a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<Code> code = info->code(); 618a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (code.is_identical_to(info->isolate()->builtins()->CompileLazy())) { 619a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return; 620a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 621a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int line_num = Script::GetLineNumber(script, shared->start_position()) + 1; 622a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int column_num = 623a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Script::GetColumnNumber(script, shared->start_position()) + 1; 624a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org String* script_name = script->name()->IsString() 625a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ? String::cast(script->name()) 626a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org : info->isolate()->heap()->empty_string(); 627a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Logger::LogEventsAndTags log_tag = Logger::ToNativeByScript(tag, *script); 628a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org PROFILE(info->isolate(), 629a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CodeCreateEvent(log_tag, *code, *shared, info, script_name, 630a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org line_num, column_num)); 631a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 632a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 633a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org GDBJIT(AddCode(Handle<String>(shared->DebugName()), 634a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<Script>(info->script()), Handle<Code>(info->code()), 635a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org info)); 63622cf3f9d4c636215aa2e2a8169573d795142c328machenbach@chromium.org} 63722cf3f9d4c636215aa2e2a8169573d795142c328machenbach@chromium.org 63822cf3f9d4c636215aa2e2a8169573d795142c328machenbach@chromium.org 6394954674151afa960af66efb4831df06bde727333yangguo@chromium.orgstatic bool CompileUnoptimizedCode(CompilationInfo* info) { 640e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(AllowCompilation::IsAllowed(info->isolate())); 641e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info->function() != NULL); 6424954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!Rewriter::Rewrite(info)) return false; 6434954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!Scope::Analyze(info)) return false; 644e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info->scope() != NULL); 6454954674151afa960af66efb4831df06bde727333yangguo@chromium.org 6464954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!FullCodeGenerator::MakeCode(info)) { 6474954674151afa960af66efb4831df06bde727333yangguo@chromium.org Isolate* isolate = info->isolate(); 6484954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!isolate->has_pending_exception()) isolate->StackOverflow(); 6494954674151afa960af66efb4831df06bde727333yangguo@chromium.org return false; 6501b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org } 6514954674151afa960af66efb4831df06bde727333yangguo@chromium.org return true; 6524954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 653212ac23f8231d169b4aa6737d762099993020826kasper.lund 654ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 655a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgMUST_USE_RESULT static MaybeHandle<Code> GetUnoptimizedCodeCommon( 656a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org CompilationInfo* info) { 6574954674151afa960af66efb4831df06bde727333yangguo@chromium.org VMState<COMPILER> state(info->isolate()); 6584954674151afa960af66efb4831df06bde727333yangguo@chromium.org PostponeInterruptsScope postpone(info->isolate()); 659a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 660a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Parse and update CompilationInfo with the results. 661a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!Parser::Parse(info)) return MaybeHandle<Code>(); 662a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<SharedFunctionInfo> shared = info->shared_info(); 663a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org FunctionLiteral* lit = info->function(); 664a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->set_strict_mode(lit->strict_mode()); 665a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count()); 666a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->set_bailout_reason(lit->dont_optimize_reason()); 667a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->set_ast_node_count(lit->ast_node_count()); 668ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 669a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Compile unoptimized code. 670a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!CompileUnoptimizedCode(info)) return MaybeHandle<Code>(); 671a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 672a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CHECK_EQ(Code::FUNCTION, info->code()->kind()); 673a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared); 674a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 675a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Update the shared function info with the scope info. Allocating the 676a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // ScopeInfo object may cause a GC. 677a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<ScopeInfo> scope_info = ScopeInfo::Create(info->scope(), info->zone()); 678a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->set_scope_info(*scope_info); 679a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 680a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Update the code and feedback vector for the shared function info. 681a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->ReplaceCode(*info->code()); 682a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (shared->optimization_disabled()) info->code()->set_optimizable(false); 683a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->set_feedback_vector(*info->feedback_vector()); 684a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 6854954674151afa960af66efb4831df06bde727333yangguo@chromium.org return info->code(); 6864954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 687ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 688ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 68906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgMUST_USE_RESULT static MaybeHandle<Code> GetCodeFromOptimizedCodeMap( 69006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Handle<JSFunction> function, BailoutId osr_ast_id) { 69106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (FLAG_cache_optimized_code) { 69206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Handle<SharedFunctionInfo> shared(function->shared()); 69306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Bound functions are not cached. 69406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (shared->bound()) return MaybeHandle<Code>(); 69506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org DisallowHeapAllocation no_gc; 69606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org int index = shared->SearchOptimizedCodeMap( 69706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org function->context()->native_context(), osr_ast_id); 69806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (index > 0) { 69906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (FLAG_trace_opt) { 70006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF("[found optimized code for "); 70106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org function->ShortPrint(); 70206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!osr_ast_id.IsNone()) { 70306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF(" at OSR AST id %d", osr_ast_id.ToInt()); 70406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 70506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF("]\n"); 70606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 70706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org FixedArray* literals = shared->GetLiteralsFromOptimizedCodeMap(index); 70806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (literals != NULL) function->set_literals(literals); 70906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org return Handle<Code>(shared->GetCodeFromOptimizedCodeMap(index)); 71006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 71106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 71206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org return MaybeHandle<Code>(); 71306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 71406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 71506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 71606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgstatic void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { 71706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Handle<Code> code = info->code(); 71806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. 71906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 72006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Context specialization folds-in the context, so no sharing can occur. 72106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (code->is_turbofanned() && info->is_context_specializing()) return; 72206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 72306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Cache optimized code. 72406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (FLAG_cache_optimized_code) { 72506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Handle<JSFunction> function = info->closure(); 72606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Handle<SharedFunctionInfo> shared(function->shared()); 72706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Do not cache bound functions. 72806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (shared->bound()) return; 72906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Handle<FixedArray> literals(function->literals()); 73006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Handle<Context> native_context(function->context()->native_context()); 73106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, 73206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org literals, info->osr_ast_id()); 73306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 73406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 73506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 73606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 73706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgstatic bool CompileOptimizedPrologue(CompilationInfo* info) { 73806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!Parser::Parse(info)) return false; 73906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!Rewriter::Rewrite(info)) return false; 74006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!Scope::Analyze(info)) return false; 74106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org DCHECK(info->scope() != NULL); 74206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org return true; 74306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 74406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 74506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 74606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgstatic bool GetOptimizedCodeNow(CompilationInfo* info) { 74706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!CompileOptimizedPrologue(info)) return false; 74806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 74906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); 75006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 75106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org OptimizedCompileJob job(info); 752b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (job.CreateGraph() != OptimizedCompileJob::SUCCEEDED || 753b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org job.OptimizeGraph() != OptimizedCompileJob::SUCCEEDED || 754b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org job.GenerateCode() != OptimizedCompileJob::SUCCEEDED) { 755b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (FLAG_trace_opt) { 756b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF("[aborted optimizing "); 757b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org info->closure()->ShortPrint(); 758b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF(" because: %s]\n", GetBailoutReason(info->bailout_reason())); 759b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 760b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return false; 761b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 76206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 76306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Success! 76406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org DCHECK(!info->isolate()->has_pending_exception()); 76506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org InsertCodeIntoOptimizedCodeMap(info); 76606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, 76706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org info->shared_info()); 768b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (FLAG_trace_opt) { 769b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF("[completed optimizing "); 770b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org info->closure()->ShortPrint(); 771b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF("]\n"); 772b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 77306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org return true; 77406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 77506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 77606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 77706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgstatic bool GetOptimizedCodeLater(CompilationInfo* info) { 77806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Isolate* isolate = info->isolate(); 77906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!isolate->optimizing_compiler_thread()->IsQueueAvailable()) { 78006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (FLAG_trace_concurrent_recompilation) { 78106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF(" ** Compilation queue full, will retry optimizing "); 782b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org info->closure()->ShortPrint(); 78306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF(" later.\n"); 78406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 78506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org return false; 78606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 78706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 78806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org CompilationHandleScope handle_scope(info); 78906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!CompileOptimizedPrologue(info)) return false; 79006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org info->SaveHandles(); // Copy handles to the compilation handle scope. 79106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 79206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); 79306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 79406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org OptimizedCompileJob* job = new (info->zone()) OptimizedCompileJob(info); 79506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org OptimizedCompileJob::Status status = job->CreateGraph(); 79606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (status != OptimizedCompileJob::SUCCEEDED) return false; 79706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org isolate->optimizing_compiler_thread()->QueueForOptimization(job); 79806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 79906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (FLAG_trace_concurrent_recompilation) { 80006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF(" ** Queued "); 801b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org info->closure()->ShortPrint(); 80206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (info->is_osr()) { 80306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF(" for concurrent OSR at %d.\n", info->osr_ast_id().ToInt()); 80406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } else { 80506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org PrintF(" for concurrent optimization.\n"); 80606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 80706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 80806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org return true; 80906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 81006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 81106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 812a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgMaybeHandle<Code> Compiler::GetUnoptimizedCode(Handle<JSFunction> function) { 813e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!function->GetIsolate()->has_pending_exception()); 814e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!function->is_compiled()); 8154954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (function->shared()->is_compiled()) { 8164954674151afa960af66efb4831df06bde727333yangguo@chromium.org return Handle<Code>(function->shared()->code()); 8174954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 818ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 8194954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationInfoWithZone info(function); 820a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Code> result; 821a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ASSIGN_RETURN_ON_EXCEPTION(info.isolate(), result, 822a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org GetUnoptimizedCodeCommon(&info), 823a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Code); 824a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return result; 825a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org} 826a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 827a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 828a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgMaybeHandle<Code> Compiler::GetLazyCode(Handle<JSFunction> function) { 829a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org DCHECK(!function->GetIsolate()->has_pending_exception()); 830a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org DCHECK(!function->is_compiled()); 831a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 832a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (FLAG_turbo_asm && function->shared()->asm_function()) { 833a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CompilationInfoWithZone info(function); 834a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 835a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org VMState<COMPILER> state(info.isolate()); 836a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org PostponeInterruptsScope postpone(info.isolate()); 837a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 838a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org info.SetOptimizing(BailoutId::None(), 839a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<Code>(function->shared()->code())); 840a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 841a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org info.MarkAsContextSpecializing(); 842a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org info.MarkAsTypingEnabled(); 843a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org info.MarkAsInliningDisabled(); 84406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 84506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (GetOptimizedCodeNow(&info)) return info.code(); 846a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 847a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 848a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (function->shared()->is_compiled()) { 849a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return Handle<Code>(function->shared()->code()); 850a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 851a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 852a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CompilationInfoWithZone info(function); 853a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<Code> result; 854a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ASSIGN_RETURN_ON_EXCEPTION(info.isolate(), result, 855a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org GetUnoptimizedCodeCommon(&info), Code); 8564954674151afa960af66efb4831df06bde727333yangguo@chromium.org 8574954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (FLAG_always_opt && 8584954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.isolate()->use_crankshaft() && 8594954674151afa960af66efb4831df06bde727333yangguo@chromium.org !info.shared_info()->optimization_disabled() && 8604954674151afa960af66efb4831df06bde727333yangguo@chromium.org !info.isolate()->DebuggerHasBreakPoints()) { 861a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Code> opt_code; 862a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (Compiler::GetOptimizedCode( 863a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org function, result, 864a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Compiler::NOT_CONCURRENT).ToHandle(&opt_code)) { 865a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org result = opt_code; 866a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 867ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org } 8682c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 8694954674151afa960af66efb4831df06bde727333yangguo@chromium.org return result; 8704954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8724111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 873a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgMaybeHandle<Code> Compiler::GetUnoptimizedCode( 874a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<SharedFunctionInfo> shared) { 875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!shared->GetIsolate()->has_pending_exception()); 876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!shared->is_compiled()); 8774954674151afa960af66efb4831df06bde727333yangguo@chromium.org 8784954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationInfoWithZone info(shared); 879a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return GetUnoptimizedCodeCommon(&info); 88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8834954674151afa960af66efb4831df06bde727333yangguo@chromium.orgbool Compiler::EnsureCompiled(Handle<JSFunction> function, 8844954674151afa960af66efb4831df06bde727333yangguo@chromium.org ClearExceptionFlag flag) { 8854954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (function->is_compiled()) return true; 886a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org MaybeHandle<Code> maybe_code = Compiler::GetLazyCode(function); 887a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Code> code; 888a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!maybe_code.ToHandle(&code)) { 8894954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (flag == CLEAR_EXCEPTION) { 8904954674151afa960af66efb4831df06bde727333yangguo@chromium.org function->GetIsolate()->clear_pending_exception(); 8914954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 8924954674151afa960af66efb4831df06bde727333yangguo@chromium.org return false; 8934954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 8944954674151afa960af66efb4831df06bde727333yangguo@chromium.org function->ReplaceCode(*code); 895e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(function->is_compiled()); 8964954674151afa960af66efb4831df06bde727333yangguo@chromium.org return true; 8974954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8994954674151afa960af66efb4831df06bde727333yangguo@chromium.org 900a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// TODO(turbofan): In the future, unoptimized code with deopt support could 901a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// be generated lazily once deopt is triggered. 902a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgbool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { 903a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (!info->shared_info()->has_deoptimization_support()) { 904a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CompilationInfoWithZone unoptimized(info->shared_info()); 905a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // Note that we use the same AST that we will use for generating the 906a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // optimized code. 907a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org unoptimized.SetFunction(info->function()); 908a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org unoptimized.PrepareForCompilation(info->scope()); 909a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org unoptimized.SetContext(info->context()); 910a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org unoptimized.EnableDeoptimizationSupport(); 911a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (!FullCodeGenerator::MakeCode(&unoptimized)) return false; 912a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 913a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<SharedFunctionInfo> shared = info->shared_info(); 914a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->EnableDeoptimizationSupport(*unoptimized.code()); 915a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->set_feedback_vector(*unoptimized.feedback_vector()); 916a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 917a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // The scope info might not have been set if a lazily compiled 918a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // function is inlined before being called for the first time. 919a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (shared->scope_info() == ScopeInfo::Empty(info->isolate())) { 920a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<ScopeInfo> target_scope_info = 921a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ScopeInfo::Create(info->scope(), info->zone()); 922a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org shared->set_scope_info(*target_scope_info); 923a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 924a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 925a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // The existing unoptimized code was replaced with the new one. 926a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, &unoptimized, shared); 927a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 928a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return true; 929a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org} 930a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 931a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 9324954674151afa960af66efb4831df06bde727333yangguo@chromium.org// Compile full code for debugging. This code will have debug break slots 9334954674151afa960af66efb4831df06bde727333yangguo@chromium.org// and deoptimization information. Deoptimization information is required 9344954674151afa960af66efb4831df06bde727333yangguo@chromium.org// in case that an optimized version of this function is still activated on 9354954674151afa960af66efb4831df06bde727333yangguo@chromium.org// the stack. It will also make sure that the full code is compiled with 9364954674151afa960af66efb4831df06bde727333yangguo@chromium.org// the same flags as the previous version, that is flags which can change 9374954674151afa960af66efb4831df06bde727333yangguo@chromium.org// the code generated. The current method of mapping from already compiled 9384954674151afa960af66efb4831df06bde727333yangguo@chromium.org// full code without debug break slots to full code with debug break slots 9394954674151afa960af66efb4831df06bde727333yangguo@chromium.org// depends on the generated code is otherwise exactly the same. 9404954674151afa960af66efb4831df06bde727333yangguo@chromium.org// If compilation fails, just keep the existing code. 941a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgMaybeHandle<Code> Compiler::GetDebugCode(Handle<JSFunction> function) { 9424954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationInfoWithZone info(function); 9434954674151afa960af66efb4831df06bde727333yangguo@chromium.org Isolate* isolate = info.isolate(); 944ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org VMState<COMPILER> state(isolate); 945ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 946a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org info.MarkAsDebug(); 947a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org 948e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!isolate->has_pending_exception()); 9494954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<Code> old_code(function->shared()->code()); 950e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(old_code->kind() == Code::FUNCTION); 951e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!old_code->has_debug_break_slots()); 95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9534954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.MarkCompilingForDebugging(); 9544954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (old_code->is_compiled_optimizable()) { 9554954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.EnableDeoptimizationSupport(); 9564954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else { 9574954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.MarkNonOptimizable(); 9584954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 959a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org MaybeHandle<Code> maybe_new_code = GetUnoptimizedCodeCommon(&info); 960a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Code> new_code; 961a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!maybe_new_code.ToHandle(&new_code)) { 9624954674151afa960af66efb4831df06bde727333yangguo@chromium.org isolate->clear_pending_exception(); 9634954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else { 964e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(old_code->is_compiled_optimizable(), 9654954674151afa960af66efb4831df06bde727333yangguo@chromium.org new_code->is_compiled_optimizable()); 9664954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 967a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return maybe_new_code; 9684954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 9694954674151afa960af66efb4831df06bde727333yangguo@chromium.org 9704954674151afa960af66efb4831df06bde727333yangguo@chromium.org 9714954674151afa960af66efb4831df06bde727333yangguo@chromium.orgvoid Compiler::CompileForLiveEdit(Handle<Script> script) { 9724954674151afa960af66efb4831df06bde727333yangguo@chromium.org // TODO(635): support extensions. 9734954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationInfoWithZone info(script); 9744954674151afa960af66efb4831df06bde727333yangguo@chromium.org PostponeInterruptsScope postpone(info.isolate()); 9754954674151afa960af66efb4831df06bde727333yangguo@chromium.org VMState<COMPILER> state(info.isolate()); 9764954674151afa960af66efb4831df06bde727333yangguo@chromium.org 9774954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.MarkAsGlobal(); 9784954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!Parser::Parse(&info)) return; 9794954674151afa960af66efb4831df06bde727333yangguo@chromium.org 9804954674151afa960af66efb4831df06bde727333yangguo@chromium.org LiveEditFunctionTracker tracker(info.isolate(), info.function()); 9814954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!CompileUnoptimizedCode(&info)) return; 9824954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!info.shared_info().is_null()) { 9834954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<ScopeInfo> scope_info = ScopeInfo::Create(info.scope(), 9844954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.zone()); 9854954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.shared_info()->set_scope_info(*scope_info); 9864954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 9874954674151afa960af66efb4831df06bde727333yangguo@chromium.org tracker.RecordRootFunctionInfo(info.code()); 9884954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 9894954674151afa960af66efb4831df06bde727333yangguo@chromium.org 9904954674151afa960af66efb4831df06bde727333yangguo@chromium.org 9914954674151afa960af66efb4831df06bde727333yangguo@chromium.orgstatic Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { 9924954674151afa960af66efb4831df06bde727333yangguo@chromium.org Isolate* isolate = info->isolate(); 9934954674151afa960af66efb4831df06bde727333yangguo@chromium.org PostponeInterruptsScope postpone(isolate); 994e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!isolate->native_context().is_null()); 9954954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<Script> script = info->script(); 9964954674151afa960af66efb4831df06bde727333yangguo@chromium.org 9974954674151afa960af66efb4831df06bde727333yangguo@chromium.org // TODO(svenpanne) Obscure place for this, perhaps move to OnBeforeCompile? 9984954674151afa960af66efb4831df06bde727333yangguo@chromium.org FixedArray* array = isolate->native_context()->embedder_data(); 9994954674151afa960af66efb4831df06bde727333yangguo@chromium.org script->set_context_data(array->get(0)); 10004954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1001d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org isolate->debug()->OnBeforeCompile(script); 10024954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1003e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info->is_eval() || info->is_global()); 10044954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10054954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<SharedFunctionInfo> result; 10064954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10074954674151afa960af66efb4831df06bde727333yangguo@chromium.org { VMState<COMPILER> state(info->isolate()); 1008b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (info->function() == NULL) { 1009b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // Parse the script if needed (if it's already parsed, function() is 1010b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // non-NULL). 1011b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org bool parse_allow_lazy = 1012b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org (info->compile_options() == ScriptCompiler::kConsumeParserCache || 1013b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org String::cast(script->source())->length() > 1014b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org FLAG_min_preparse_length) && 1015b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org !Compiler::DebuggerWantsEagerCompilation(info); 1016b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1017b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!parse_allow_lazy && 1018b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org (info->compile_options() == ScriptCompiler::kProduceParserCache || 1019b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org info->compile_options() == ScriptCompiler::kConsumeParserCache)) { 1020b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // We are going to parse eagerly, but we either 1) have cached data 1021b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // produced by lazy parsing or 2) are asked to generate cached data. 1022b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // Eager parsing cannot benefit from cached data, and producing cached 1023b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // data while parsing eagerly is not implemented. 1024b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org info->SetCachedData(NULL, ScriptCompiler::kNoCompileOptions); 1025b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 1026b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!Parser::Parse(info, parse_allow_lazy)) { 1027b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return Handle<SharedFunctionInfo>::null(); 1028b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org } 10294954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 10304954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10314954674151afa960af66efb4831df06bde727333yangguo@chromium.org FunctionLiteral* lit = info->function(); 10324954674151afa960af66efb4831df06bde727333yangguo@chromium.org LiveEditFunctionTracker live_edit_tracker(isolate, lit); 10334954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10344954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Measure how long it takes to do the compilation; only take the 10354954674151afa960af66efb4831df06bde727333yangguo@chromium.org // rest of the function into account to avoid overlap with the 10364954674151afa960af66efb4831df06bde727333yangguo@chromium.org // parsing statistics. 10374954674151afa960af66efb4831df06bde727333yangguo@chromium.org HistogramTimer* rate = info->is_eval() 10384954674151afa960af66efb4831df06bde727333yangguo@chromium.org ? info->isolate()->counters()->compile_eval() 10394954674151afa960af66efb4831df06bde727333yangguo@chromium.org : info->isolate()->counters()->compile(); 10404954674151afa960af66efb4831df06bde727333yangguo@chromium.org HistogramTimerScope timer(rate); 10414954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10424954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Compile the code. 10434954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!CompileUnoptimizedCode(info)) { 10444954674151afa960af66efb4831df06bde727333yangguo@chromium.org return Handle<SharedFunctionInfo>::null(); 10454954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 10464954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10474954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Allocate function. 1048e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!info->code().is_null()); 10494954674151afa960af66efb4831df06bde727333yangguo@chromium.org result = isolate->factory()->NewSharedFunctionInfo( 10502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org lit->name(), lit->materialized_literal_count(), lit->kind(), 10512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org info->code(), ScopeInfo::Create(info->scope(), info->zone()), 1052a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org info->feedback_vector()); 10534954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1054e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(RelocInfo::kNoPosition, lit->function_token_position()); 10554954674151afa960af66efb4831df06bde727333yangguo@chromium.org SetFunctionInfo(result, lit, true, script); 10564954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10574954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<String> script_name = script->name()->IsString() 10584954674151afa960af66efb4831df06bde727333yangguo@chromium.org ? Handle<String>(String::cast(script->name())) 10594954674151afa960af66efb4831df06bde727333yangguo@chromium.org : isolate->factory()->empty_string(); 10604954674151afa960af66efb4831df06bde727333yangguo@chromium.org Logger::LogEventsAndTags log_tag = info->is_eval() 10614954674151afa960af66efb4831df06bde727333yangguo@chromium.org ? Logger::EVAL_TAG 10624954674151afa960af66efb4831df06bde727333yangguo@chromium.org : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script); 10634954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10644954674151afa960af66efb4831df06bde727333yangguo@chromium.org PROFILE(isolate, CodeCreateEvent( 10654954674151afa960af66efb4831df06bde727333yangguo@chromium.org log_tag, *info->code(), *result, info, *script_name)); 10664954674151afa960af66efb4831df06bde727333yangguo@chromium.org GDBJIT(AddCode(script_name, script, info->code(), info)); 10674954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10684954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Hint to the runtime system used when allocating space for initial 10694954674151afa960af66efb4831df06bde727333yangguo@chromium.org // property space by setting the expected number of properties for 10704954674151afa960af66efb4831df06bde727333yangguo@chromium.org // the instances of the function. 10714954674151afa960af66efb4831df06bde727333yangguo@chromium.org SetExpectedNofPropertiesFromEstimate(result, 10724954674151afa960af66efb4831df06bde727333yangguo@chromium.org lit->expected_property_count()); 10734954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1074b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (!script.is_null()) 1075b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); 10764954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10774954674151afa960af66efb4831df06bde727333yangguo@chromium.org live_edit_tracker.RecordFunctionInfo(result, lit, info->zone()); 10784954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 10794954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1080248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org isolate->debug()->OnAfterCompile(script); 10814954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10824954674151afa960af66efb4831df06bde727333yangguo@chromium.org return result; 10834954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 10844954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10854954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10868496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.orgMaybeHandle<JSFunction> Compiler::GetFunctionFromEval( 1087040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org Handle<String> source, Handle<SharedFunctionInfo> outer_info, 1088040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org Handle<Context> context, StrictMode strict_mode, 1089040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org ParseRestriction restriction, int scope_position) { 10904954674151afa960af66efb4831df06bde727333yangguo@chromium.org Isolate* isolate = source->GetIsolate(); 10914954674151afa960af66efb4831df06bde727333yangguo@chromium.org int source_length = source->length(); 10924954674151afa960af66efb4831df06bde727333yangguo@chromium.org isolate->counters()->total_eval_size()->Increment(source_length); 10934954674151afa960af66efb4831df06bde727333yangguo@chromium.org isolate->counters()->total_compile_size()->Increment(source_length); 10944954674151afa960af66efb4831df06bde727333yangguo@chromium.org 10954954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationCache* compilation_cache = isolate->compilation_cache(); 10969e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MaybeHandle<SharedFunctionInfo> maybe_shared_info = 1097040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org compilation_cache->LookupEval(source, outer_info, context, strict_mode, 10989e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org scope_position); 10999e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Handle<SharedFunctionInfo> shared_info; 11004954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11019e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org if (!maybe_shared_info.ToHandle(&shared_info)) { 11024954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<Script> script = isolate->factory()->NewScript(source); 11034954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationInfoWithZone info(script); 11044954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.MarkAsEval(); 11054954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (context->IsNativeContext()) info.MarkAsGlobal(); 1106486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org info.SetStrictMode(strict_mode); 11074954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.SetParseRestriction(restriction); 11084954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.SetContext(context); 11094954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11104954674151afa960af66efb4831df06bde727333yangguo@chromium.org Debug::RecordEvalCaller(script); 11114954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11124954674151afa960af66efb4831df06bde727333yangguo@chromium.org shared_info = CompileToplevel(&info); 11134954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11144954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (shared_info.is_null()) { 11158496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org return MaybeHandle<JSFunction>(); 11164954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else { 11174954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Explicitly disable optimization for eval code. We're not yet prepared 11184954674151afa960af66efb4831df06bde727333yangguo@chromium.org // to handle eval-code in the optimizing compiler. 11194954674151afa960af66efb4831df06bde727333yangguo@chromium.org shared_info->DisableOptimization(kEval); 11204954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1121486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // If caller is strict mode, the result must be in strict mode as well. 1122e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(strict_mode == SLOPPY || shared_info->strict_mode() == STRICT); 11234954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (!shared_info->dont_cache()) { 1124040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org compilation_cache->PutEval(source, outer_info, context, shared_info, 1125040b51669fc15f81ef4aab890e004c957a896560yangguo@chromium.org scope_position); 11264954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 11274954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 11284954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else if (shared_info->ic_age() != isolate->heap()->global_ic_age()) { 11294954674151afa960af66efb4831df06bde727333yangguo@chromium.org shared_info->ResetForNewContext(isolate->heap()->global_ic_age()); 11304954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 11314954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11324954674151afa960af66efb4831df06bde727333yangguo@chromium.org return isolate->factory()->NewFunctionFromSharedFunctionInfo( 11334954674151afa960af66efb4831df06bde727333yangguo@chromium.org shared_info, context, NOT_TENURED); 11344954674151afa960af66efb4831df06bde727333yangguo@chromium.org} 11354954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11364954674151afa960af66efb4831df06bde727333yangguo@chromium.org 113769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.orgHandle<SharedFunctionInfo> Compiler::CompileScript( 11384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org Handle<String> source, Handle<Object> script_name, int line_offset, 11394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org int column_offset, bool is_shared_cross_origin, Handle<Context> context, 11404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org v8::Extension* extension, ScriptData** cached_data, 11414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org ScriptCompiler::CompileOptions compile_options, NativesFlag natives) { 11424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (compile_options == ScriptCompiler::kNoCompileOptions) { 114369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org cached_data = NULL; 11444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } else if (compile_options == ScriptCompiler::kProduceParserCache || 11454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options == ScriptCompiler::kProduceCodeCache) { 1146e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cached_data && !*cached_data); 1147e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(extension == NULL); 114869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org } else { 1149e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(compile_options == ScriptCompiler::kConsumeParserCache || 11504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options == ScriptCompiler::kConsumeCodeCache); 1151e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cached_data && *cached_data); 1152e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(extension == NULL); 115369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org } 11544954674151afa960af66efb4831df06bde727333yangguo@chromium.org Isolate* isolate = source->GetIsolate(); 11554954674151afa960af66efb4831df06bde727333yangguo@chromium.org int source_length = source->length(); 11564954674151afa960af66efb4831df06bde727333yangguo@chromium.org isolate->counters()->total_load_size()->Increment(source_length); 11574954674151afa960af66efb4831df06bde727333yangguo@chromium.org isolate->counters()->total_compile_size()->Increment(source_length); 11584954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11594954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationCache* compilation_cache = isolate->compilation_cache(); 11604954674151afa960af66efb4831df06bde727333yangguo@chromium.org 11614954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Do a lookup in the compilation cache but not for extensions. 11629e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org MaybeHandle<SharedFunctionInfo> maybe_result; 11635d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Handle<SharedFunctionInfo> result; 1164b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (extension == NULL) { 116551e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org if (FLAG_serialize_toplevel && 11667c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org compile_options == ScriptCompiler::kConsumeCodeCache && 11677c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org !isolate->debug()->is_loaded()) { 116806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org HistogramTimerScope timer(isolate->counters()->compile_deserialize()); 1169d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return CodeSerializer::Deserialize(isolate, *cached_data, source); 117051e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org } else { 117151e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org maybe_result = compilation_cache->LookupScript( 117251e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org source, script_name, line_offset, column_offset, 117351e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org is_shared_cross_origin, context); 1174f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org } 117543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 117643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 117751e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org base::ElapsedTimer timer; 117851e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org if (FLAG_profile_deserialization && FLAG_serialize_toplevel && 117951e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org compile_options == ScriptCompiler::kProduceCodeCache) { 118051e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org timer.Start(); 118151e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org } 118251e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org 11839e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org if (!maybe_result.ToHandle(&result)) { 118449ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org // No cache entry found. Compile the script. 1185b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 1186b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Create a script object describing the script to be compiled. 1187d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org Handle<Script> script = isolate->factory()->NewScript(source); 1188086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org if (natives == NATIVES_CODE) { 1189086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); 1190086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org } 1191b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (!script_name.is_null()) { 1192b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org script->set_name(*script_name); 1193b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org script->set_line_offset(Smi::FromInt(line_offset)); 1194b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org script->set_column_offset(Smi::FromInt(column_offset)); 1195b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 1196d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org script->set_is_shared_cross_origin(is_shared_cross_origin); 1197b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 1198b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Compile the function and add it to the cache. 11995a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org CompilationInfoWithZone info(script); 1200b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org info.MarkAsGlobal(); 12014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org info.SetCachedData(cached_data, compile_options); 1202f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org info.SetExtension(extension); 1203355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org info.SetContext(context); 12044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (FLAG_serialize_toplevel && 12054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options == ScriptCompiler::kProduceCodeCache) { 12065366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org info.PrepareForSerializing(); 12075366bfdf41c98cd70820c1633b031dc290ec1cd6machenbach@chromium.org } 1208486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (FLAG_use_strict) info.SetStrictMode(STRICT); 1209f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org 12104954674151afa960af66efb4831df06bde727333yangguo@chromium.org result = CompileToplevel(&info); 121181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org if (extension == NULL && !result.is_null() && !result->dont_cache()) { 1212355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org compilation_cache->PutScript(source, context, result); 12134c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (FLAG_serialize_toplevel && 12144c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org compile_options == ScriptCompiler::kProduceCodeCache) { 121506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org HistogramTimerScope histogram_timer( 121606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org isolate->counters()->compile_serialize()); 1217d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org *cached_data = CodeSerializer::Serialize(isolate, result, source); 121851e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org if (FLAG_profile_deserialization) { 121951e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org PrintF("[Compiling and serializing %d bytes took %0.3f ms]\n", 122051e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org (*cached_data)->length(), timer.Elapsed().InMillisecondsF()); 122151e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org } 1222f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org } 1223b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 12244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org 12259e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org if (result.is_null()) isolate->ReportPendingMessages(); 12264954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else if (result->ic_age() != isolate->heap()->global_ic_age()) { 1227f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org result->ResetForNewContext(isolate->heap()->global_ic_age()); 122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1233b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgHandle<SharedFunctionInfo> Compiler::CompileStreamedScript( 1234b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org CompilationInfo* info, int source_length) { 1235b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org Isolate* isolate = info->isolate(); 1236b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org isolate->counters()->total_load_size()->Increment(source_length); 1237b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org isolate->counters()->total_compile_size()->Increment(source_length); 1238b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1239b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (FLAG_use_strict) info->SetStrictMode(STRICT); 1240b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // TODO(marja): FLAG_serialize_toplevel is not honoured and won't be; when the 1241b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // real code caching lands, streaming needs to be adapted to use it. 1242b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return CompileToplevel(info); 1243b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org} 1244b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1245b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 12467c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgHandle<SharedFunctionInfo> Compiler::BuildFunctionInfo( 12477c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org FunctionLiteral* literal, Handle<Script> script, 12487c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org CompilationInfo* outer_info) { 12494954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Precondition: code has been parsed and scopes have been analyzed. 12504954674151afa960af66efb4831df06bde727333yangguo@chromium.org CompilationInfoWithZone info(script); 12514954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.SetFunction(literal); 1252f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org info.PrepareForCompilation(literal->scope()); 1253486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org info.SetStrictMode(literal->scope()->strict_mode()); 12547c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org if (outer_info->will_serialize()) info.PrepareForSerializing(); 1255add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org 12564954674151afa960af66efb4831df06bde727333yangguo@chromium.org Isolate* isolate = info.isolate(); 12574954674151afa960af66efb4831df06bde727333yangguo@chromium.org Factory* factory = isolate->factory(); 12584954674151afa960af66efb4831df06bde727333yangguo@chromium.org LiveEditFunctionTracker live_edit_tracker(isolate, literal); 12594954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Determine if the function can be lazily compiled. This is necessary to 12604954674151afa960af66efb4831df06bde727333yangguo@chromium.org // allow some of our builtin JS files to be lazily compiled. These 12614954674151afa960af66efb4831df06bde727333yangguo@chromium.org // builtins cannot be handled lazily by the parser, since we have to know 12624954674151afa960af66efb4831df06bde727333yangguo@chromium.org // if a function uses the special natives syntax, which is something the 12634954674151afa960af66efb4831df06bde727333yangguo@chromium.org // parser records. 12644954674151afa960af66efb4831df06bde727333yangguo@chromium.org // If the debugger requests compilation for break points, we cannot be 12654954674151afa960af66efb4831df06bde727333yangguo@chromium.org // aggressive about lazy compilation, because it might trigger compilation 12664954674151afa960af66efb4831df06bde727333yangguo@chromium.org // of functions without an outer context when setting a breakpoint through 12674954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Debug::FindSharedFunctionInfoInScript. 12684954674151afa960af66efb4831df06bde727333yangguo@chromium.org bool allow_lazy_without_ctx = literal->AllowsLazyCompilationWithoutContext(); 12694954674151afa960af66efb4831df06bde727333yangguo@chromium.org bool allow_lazy = literal->AllowsLazyCompilation() && 12704954674151afa960af66efb4831df06bde727333yangguo@chromium.org !DebuggerWantsEagerCompilation(&info, allow_lazy_without_ctx); 127156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 12724954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Generate code 12734954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<ScopeInfo> scope_info; 12744954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (FLAG_lazy && allow_lazy && !literal->is_parenthesized()) { 1275a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<Code> code = isolate->builtins()->CompileLazy(); 12764954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.SetCode(code); 12774954674151afa960af66efb4831df06bde727333yangguo@chromium.org scope_info = Handle<ScopeInfo>(ScopeInfo::Empty(isolate)); 12784954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else if (FullCodeGenerator::MakeCode(&info)) { 1279e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!info.code().is_null()); 12804954674151afa960af66efb4831df06bde727333yangguo@chromium.org scope_info = ScopeInfo::Create(info.scope(), info.zone()); 12811456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } else { 12824954674151afa960af66efb4831df06bde727333yangguo@chromium.org return Handle<SharedFunctionInfo>::null(); 1283b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 12848bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 12854954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Create a shared function info object. 12869d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org Handle<SharedFunctionInfo> result = factory->NewSharedFunctionInfo( 12872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org literal->name(), literal->materialized_literal_count(), literal->kind(), 12882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org info.code(), scope_info, info.feedback_vector()); 12894954674151afa960af66efb4831df06bde727333yangguo@chromium.org SetFunctionInfo(result, literal, false, script); 12904954674151afa960af66efb4831df06bde727333yangguo@chromium.org RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result); 12914954674151afa960af66efb4831df06bde727333yangguo@chromium.org result->set_allows_lazy_compilation(allow_lazy); 12924954674151afa960af66efb4831df06bde727333yangguo@chromium.org result->set_allows_lazy_compilation_without_context(allow_lazy_without_ctx); 12934954674151afa960af66efb4831df06bde727333yangguo@chromium.org 12944954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Set the expected number of properties for instances and return 12954954674151afa960af66efb4831df06bde727333yangguo@chromium.org // the resulting function. 12964954674151afa960af66efb4831df06bde727333yangguo@chromium.org SetExpectedNofPropertiesFromEstimate(result, 12974954674151afa960af66efb4831df06bde727333yangguo@chromium.org literal->expected_property_count()); 12984954674151afa960af66efb4831df06bde727333yangguo@chromium.org live_edit_tracker.RecordFunctionInfo(result, literal, info.zone()); 1299b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return result; 130043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 130143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1303a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgMaybeHandle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function, 1304a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Code> current_code, 1305a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ConcurrencyMode mode, 1306a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org BailoutId osr_ast_id) { 1307a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org Handle<Code> cached_code; 1308a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (GetCodeFromOptimizedCodeMap( 1309a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org function, osr_ast_id).ToHandle(&cached_code)) { 1310a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return cached_code; 1311a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 13124954674151afa960af66efb4831df06bde727333yangguo@chromium.org 13134954674151afa960af66efb4831df06bde727333yangguo@chromium.org SmartPointer<CompilationInfo> info(new CompilationInfoWithZone(function)); 13144954674151afa960af66efb4831df06bde727333yangguo@chromium.org Isolate* isolate = info->isolate(); 1315e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(AllowCompilation::IsAllowed(isolate)); 1316ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org VMState<COMPILER> state(isolate); 1317e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!isolate->has_pending_exception()); 1318304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org PostponeInterruptsScope postpone(isolate); 1319304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 13204954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<SharedFunctionInfo> shared = info->shared_info(); 13211af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org if (shared->code()->kind() != Code::FUNCTION || 13221af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org ScopeInfo::Empty(isolate) == shared->scope_info()) { 13231af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org // The function was never compiled. Compile it unoptimized first. 1324a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org // TODO(titzer): reuse the AST and scope info from this compile. 13251af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org CompilationInfoWithZone nested(function); 13261af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org nested.EnableDeoptimizationSupport(); 13271af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org if (!GetUnoptimizedCodeCommon(&nested).ToHandle(¤t_code)) { 13281af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org return MaybeHandle<Code>(); 13291af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org } 133042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org shared->ReplaceCode(*current_code); 13311af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org } 13324954674151afa960af66efb4831df06bde727333yangguo@chromium.org current_code->set_profiler_ticks(0); 1333304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 13344954674151afa960af66efb4831df06bde727333yangguo@chromium.org info->SetOptimizing(osr_ast_id, current_code); 1335304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 13364954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (mode == CONCURRENT) { 13374954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (GetOptimizedCodeLater(info.get())) { 13384954674151afa960af66efb4831df06bde727333yangguo@chromium.org info.Detach(); // The background recompile job owns this now. 13394954674151afa960af66efb4831df06bde727333yangguo@chromium.org return isolate->builtins()->InOptimizationQueue(); 1340fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } 13414954674151afa960af66efb4831df06bde727333yangguo@chromium.org } else { 13424954674151afa960af66efb4831df06bde727333yangguo@chromium.org if (GetOptimizedCodeNow(info.get())) return info->code(); 13434954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 1344304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 13456e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org if (isolate->has_pending_exception()) isolate->clear_pending_exception(); 1346a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return MaybeHandle<Code>(); 1347304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 1348304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 1349304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 13504954674151afa960af66efb4831df06bde727333yangguo@chromium.orgHandle<Code> Compiler::GetConcurrentlyOptimizedCode(OptimizedCompileJob* job) { 13514954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Take ownership of compilation info. Deleting compilation info 13524954674151afa960af66efb4831df06bde727333yangguo@chromium.org // also tears down the zone and the recompile job. 13538e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org SmartPointer<CompilationInfo> info(job->info()); 13548e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Isolate* isolate = info->isolate(); 13554954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1356ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org VMState<COMPILER> state(isolate); 13574c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); 1358304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 13594954674151afa960af66efb4831df06bde727333yangguo@chromium.org Handle<SharedFunctionInfo> shared = info->shared_info(); 13604954674151afa960af66efb4831df06bde727333yangguo@chromium.org shared->code()->set_profiler_ticks(0); 13614954674151afa960af66efb4831df06bde727333yangguo@chromium.org 1362b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // 1) Optimization on the concurrent thread may have failed. 13634954674151afa960af66efb4831df06bde727333yangguo@chromium.org // 2) The function may have already been optimized by OSR. Simply continue. 13644954674151afa960af66efb4831df06bde727333yangguo@chromium.org // Except when OSR already disabled optimization for some reason. 13654954674151afa960af66efb4831df06bde727333yangguo@chromium.org // 3) The code may have already been invalidated due to dependency change. 13664954674151afa960af66efb4831df06bde727333yangguo@chromium.org // 4) Debugger may have been activated. 1367b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // 5) Code generation may have failed. 1368b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (job->last_status() == OptimizedCompileJob::SUCCEEDED) { 1369b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (shared->optimization_disabled()) { 1370b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org job->RetryOptimization(kOptimizationDisabled); 1371b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } else if (info->HasAbortedDueToDependencyChange()) { 1372b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org job->RetryOptimization(kBailedOutDueToDependencyChange); 1373b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } else if (isolate->DebuggerHasBreakPoints()) { 1374b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org job->RetryOptimization(kDebuggerHasBreakPoints); 1375b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } else if (job->GenerateCode() == OptimizedCompileJob::SUCCEEDED) { 1376b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info.get(), shared); 1377b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (info->shared_info()->SearchOptimizedCodeMap( 1378b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org info->context()->native_context(), info->osr_ast_id()) == -1) { 1379b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org InsertCodeIntoOptimizedCodeMap(info.get()); 1380b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 1381b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (FLAG_trace_opt) { 1382b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF("[completed optimizing "); 1383b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org info->closure()->ShortPrint(); 1384b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF("]\n"); 1385b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 1386b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return Handle<Code>(*info->code()); 1387b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 13884954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 1389c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1390b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org DCHECK(job->last_status() != OptimizedCompileJob::SUCCEEDED); 1391b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (FLAG_trace_opt) { 1392b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF("[aborted optimizing "); 1393b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org info->closure()->ShortPrint(); 1394b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PrintF(" because: %s]\n", GetBailoutReason(info->bailout_reason())); 13954954674151afa960af66efb4831df06bde727333yangguo@chromium.org } 1396b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return Handle<Code>::null(); 13979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 13989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 13999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 1400b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgbool Compiler::DebuggerWantsEagerCompilation(CompilationInfo* info, 1401b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org bool allow_lazy_without_ctx) { 1402b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org return LiveEditFunctionTracker::IsActive(info->isolate()) || 1403b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org (info->isolate()->DebuggerHasBreakPoints() && !allow_lazy_without_ctx); 1404b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org} 1405b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 1406b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org 14071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgCompilationPhase::CompilationPhase(const char* name, CompilationInfo* info) 14081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : name_(name), info_(info), zone_(info->isolate()) { 14091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (FLAG_hydrogen_stats) { 14101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info_zone_start_allocation_size_ = info->zone()->allocation_size(); 1411dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org timer_.Start(); 14121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 14141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgCompilationPhase::~CompilationPhase() { 14171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (FLAG_hydrogen_stats) { 14181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org unsigned size = zone()->allocation_size(); 14191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org size += info_->zone()->allocation_size() - info_zone_start_allocation_size_; 1420dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org isolate()->GetHStatistics()->SaveTiming(name_, timer_.Elapsed(), size); 14211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 14231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgbool CompilationPhase::ShouldProduceTraceOutput() const { 1426fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org // Trace if the appropriate trace flag is set and the phase name's first 1427fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org // character is in the FLAG_trace_phase command line parameter. 1428662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org AllowHandleDereference allow_deref; 14291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool tracing_on = info()->IsStub() 14301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ? FLAG_trace_hydrogen_stubs 14311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org : (FLAG_trace_hydrogen && 14321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); 1433fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org return (tracing_on && 14345de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); 14351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 14361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 1438