• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()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   RegisteredExtension::UnregisterAll();
50   Isolate::GlobalTearDown();
51   sampler::Sampler::TearDown();
52   FlagList::ResetAllFlags();  // Frees memory held by string arguments.
53 }
54 
55 
InitializeOncePerProcessImpl()56 void 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()89 void V8::InitializeOncePerProcess() {
90   base::CallOnce(&init_once, &InitializeOncePerProcessImpl);
91 }
92 
93 
InitializePlatform(v8::Platform * platform)94 void V8::InitializePlatform(v8::Platform* platform) {
95   CHECK(!platform_);
96   CHECK(platform);
97   platform_ = platform;
98   v8::tracing::TracingCategoryObserver::SetUp();
99 }
100 
101 
ShutdownPlatform()102 void V8::ShutdownPlatform() {
103   CHECK(platform_);
104   v8::tracing::TracingCategoryObserver::TearDown();
105   platform_ = NULL;
106 }
107 
108 
GetCurrentPlatform()109 v8::Platform* V8::GetCurrentPlatform() {
110   DCHECK(platform_);
111   return platform_;
112 }
113 
114 
SetPlatformForTesting(v8::Platform * platform)115 void V8::SetPlatformForTesting(v8::Platform* platform) { platform_ = platform; }
116 
117 
SetNativesBlob(StartupData * natives_blob)118 void 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)127 void 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