1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/v8.h" 6 7 #include "src/api.h" 8 #include "src/assembler.h" 9 #include "src/base/once.h" 10 #include "src/base/platform/platform.h" 11 #include "src/bootstrapper.h" 12 #include "src/crankshaft/lithium-allocator.h" 13 #include "src/debug/debug.h" 14 #include "src/deoptimizer.h" 15 #include "src/elements.h" 16 #include "src/frames.h" 17 #include "src/isolate.h" 18 #include "src/libsampler/sampler.h" 19 #include "src/objects-inl.h" 20 #include "src/profiler/heap-profiler.h" 21 #include "src/runtime-profiler.h" 22 #include "src/snapshot/natives.h" 23 #include "src/snapshot/snapshot.h" 24 #include "src/tracing/tracing-category-observer.h" 25 26 namespace v8 { 27 namespace internal { 28 29 V8_DECLARE_ONCE(init_once); 30 31 #ifdef V8_USE_EXTERNAL_STARTUP_DATA 32 V8_DECLARE_ONCE(init_natives_once); 33 V8_DECLARE_ONCE(init_snapshot_once); 34 #endif 35 36 v8::Platform* V8::platform_ = NULL; 37 38 Initialize()39bool V8::Initialize() { 40 InitializeOncePerProcess(); 41 return true; 42 } 43 44 TearDown()45void V8::TearDown() { 46 Bootstrapper::TearDownExtensions(); 47 ElementsAccessor::TearDown(); 48 LOperand::TearDownCaches(); 49 RegisteredExtension::UnregisterAll(); 50 Isolate::GlobalTearDown(); 51 sampler::Sampler::TearDown(); 52 FlagList::ResetAllFlags(); // Frees memory held by string arguments. 53 } 54 55 InitializeOncePerProcessImpl()56void V8::InitializeOncePerProcessImpl() { 57 FlagList::EnforceFlagImplications(); 58 59 if (FLAG_predictable && FLAG_random_seed == 0) { 60 // Avoid random seeds in predictable mode. 61 FLAG_random_seed = 12347; 62 } 63 64 if (FLAG_stress_compaction) { 65 FLAG_force_marking_deque_overflows = true; 66 FLAG_gc_global = true; 67 FLAG_max_semi_space_size = 1; 68 } 69 70 if (FLAG_opt && FLAG_turbo && strcmp(FLAG_turbo_filter, "~~") == 0) { 71 const char* filter_flag = "--turbo-filter=*"; 72 FlagList::SetFlagsFromString(filter_flag, StrLength(filter_flag)); 73 } 74 75 base::OS::Initialize(FLAG_random_seed, FLAG_hard_abort, FLAG_gc_fake_mmap); 76 77 Isolate::InitializeOncePerProcess(); 78 79 sampler::Sampler::SetUp(); 80 CpuFeatures::Probe(false); 81 ElementsAccessor::InitializeOncePerProcess(); 82 LOperand::SetUpCaches(); 83 SetUpJSCallerSavedCodeData(); 84 ExternalReference::SetUp(); 85 Bootstrapper::InitializeOncePerProcess(); 86 } 87 88 InitializeOncePerProcess()89void V8::InitializeOncePerProcess() { 90 base::CallOnce(&init_once, &InitializeOncePerProcessImpl); 91 } 92 93 InitializePlatform(v8::Platform * platform)94void V8::InitializePlatform(v8::Platform* platform) { 95 CHECK(!platform_); 96 CHECK(platform); 97 platform_ = platform; 98 v8::tracing::TracingCategoryObserver::SetUp(); 99 } 100 101 ShutdownPlatform()102void V8::ShutdownPlatform() { 103 CHECK(platform_); 104 v8::tracing::TracingCategoryObserver::TearDown(); 105 platform_ = NULL; 106 } 107 108 GetCurrentPlatform()109v8::Platform* V8::GetCurrentPlatform() { 110 DCHECK(platform_); 111 return platform_; 112 } 113 114 SetPlatformForTesting(v8::Platform * platform)115void V8::SetPlatformForTesting(v8::Platform* platform) { platform_ = platform; } 116 117 SetNativesBlob(StartupData * natives_blob)118void V8::SetNativesBlob(StartupData* natives_blob) { 119 #ifdef V8_USE_EXTERNAL_STARTUP_DATA 120 base::CallOnce(&init_natives_once, &SetNativesFromFile, natives_blob); 121 #else 122 CHECK(false); 123 #endif 124 } 125 126 SetSnapshotBlob(StartupData * snapshot_blob)127void V8::SetSnapshotBlob(StartupData* snapshot_blob) { 128 #ifdef V8_USE_EXTERNAL_STARTUP_DATA 129 base::CallOnce(&init_snapshot_once, &SetSnapshotFromFile, snapshot_blob); 130 #else 131 CHECK(false); 132 #endif 133 } 134 } // namespace internal 135 } // namespace v8 136