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/assembler.h"
8 #include "src/base/once.h"
9 #include "src/base/platform/platform.h"
10 #include "src/bootstrapper.h"
11 #include "src/crankshaft/lithium-allocator.h"
12 #include "src/debug/debug.h"
13 #include "src/deoptimizer.h"
14 #include "src/elements.h"
15 #include "src/frames.h"
16 #include "src/isolate.h"
17 #include "src/objects.h"
18 #include "src/profiler/heap-profiler.h"
19 #include "src/profiler/sampler.h"
20 #include "src/runtime-profiler.h"
21 #include "src/snapshot/natives.h"
22 #include "src/snapshot/serialize.h"
23 #include "src/snapshot/snapshot.h"
24 
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()39 bool V8::Initialize() {
40   InitializeOncePerProcess();
41   return true;
42 }
43 
44 
TearDown()45 void V8::TearDown() {
46   Bootstrapper::TearDownExtensions();
47   ElementsAccessor::TearDown();
48   LOperand::TearDownCaches();
49   ExternalReference::TearDownMathExpData();
50   RegisteredExtension::UnregisterAll();
51   Isolate::GlobalTearDown();
52   Sampler::TearDown();
53   FlagList::ResetAllFlags();  // Frees memory held by string arguments.
54 }
55 
56 
InitializeOncePerProcessImpl()57 void V8::InitializeOncePerProcessImpl() {
58   FlagList::EnforceFlagImplications();
59 
60   if (FLAG_predictable && FLAG_random_seed == 0) {
61     // Avoid random seeds in predictable mode.
62     FLAG_random_seed = 12347;
63   }
64 
65   if (FLAG_stress_compaction) {
66     FLAG_force_marking_deque_overflows = true;
67     FLAG_gc_global = true;
68     FLAG_max_semi_space_size = 1;
69   }
70 
71   if (FLAG_turbo && strcmp(FLAG_turbo_filter, "~~") == 0) {
72     const char* filter_flag = "--turbo-filter=*";
73     FlagList::SetFlagsFromString(filter_flag, StrLength(filter_flag));
74   }
75 
76   base::OS::Initialize(FLAG_random_seed, FLAG_hard_abort, FLAG_gc_fake_mmap);
77 
78   Isolate::InitializeOncePerProcess();
79 
80   Sampler::SetUp();
81   CpuFeatures::Probe(false);
82   ElementsAccessor::InitializeOncePerProcess();
83   LOperand::SetUpCaches();
84   SetUpJSCallerSavedCodeData();
85   ExternalReference::SetUp();
86   Bootstrapper::InitializeOncePerProcess();
87 }
88 
89 
InitializeOncePerProcess()90 void V8::InitializeOncePerProcess() {
91   base::CallOnce(&init_once, &InitializeOncePerProcessImpl);
92 }
93 
94 
InitializePlatform(v8::Platform * platform)95 void V8::InitializePlatform(v8::Platform* platform) {
96   CHECK(!platform_);
97   CHECK(platform);
98   platform_ = platform;
99 }
100 
101 
ShutdownPlatform()102 void V8::ShutdownPlatform() {
103   CHECK(platform_);
104   platform_ = NULL;
105 }
106 
107 
GetCurrentPlatform()108 v8::Platform* V8::GetCurrentPlatform() {
109   DCHECK(platform_);
110   return platform_;
111 }
112 
113 
SetPlatformForTesting(v8::Platform * platform)114 void V8::SetPlatformForTesting(v8::Platform* platform) { platform_ = platform; }
115 
116 
SetNativesBlob(StartupData * natives_blob)117 void V8::SetNativesBlob(StartupData* natives_blob) {
118 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
119   base::CallOnce(&init_natives_once, &SetNativesFromFile, natives_blob);
120 #else
121   CHECK(false);
122 #endif
123 }
124 
125 
SetSnapshotBlob(StartupData * snapshot_blob)126 void V8::SetSnapshotBlob(StartupData* snapshot_blob) {
127 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
128   base::CallOnce(&init_snapshot_once, &SetSnapshotFromFile, snapshot_blob);
129 #else
130   CHECK(false);
131 #endif
132 }
133 }  // namespace internal
134 }  // namespace v8
135