1 // Copyright 2013 The Chromium 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.
5 #include "gin/public/isolate_holder.h"
10 #include "base/logging.h"
11 #include "base/message_loop/message_loop.h"
12 #include "base/rand_util.h"
13 #include "base/sys_info.h"
14 #include "gin/array_buffer.h"
15 #include "gin/debug_impl.h"
16 #include "gin/function_template.h"
17 #include "gin/per_isolate_data.h"
18 #include "gin/public/v8_platform.h"
19 #include "gin/run_microtasks_observer.h"
25 v8::ArrayBuffer::Allocator
* g_array_buffer_allocator
= NULL
;
27 bool GenerateEntropy(unsigned char* buffer
, size_t amount
) {
28 base::RandBytes(buffer
, amount
);
34 IsolateHolder::IsolateHolder() {
35 CHECK(g_array_buffer_allocator
)
36 << "You need to invoke gin::IsolateHolder::Initialize first";
37 v8::Isolate::CreateParams params
;
38 params
.entry_hook
= DebugImpl::GetFunctionEntryHook();
39 params
.code_event_handler
= DebugImpl::GetJitCodeEventHandler();
40 params
.constraints
.ConfigureDefaults(base::SysInfo::AmountOfPhysicalMemory(),
41 base::SysInfo::AmountOfVirtualMemory(),
42 base::SysInfo::NumberOfProcessors());
43 isolate_
= v8::Isolate::New(params
);
44 isolate_data_
.reset(new PerIsolateData(isolate_
, g_array_buffer_allocator
));
49 isolate_
->GetCodeRange(&code_range
, &size
);
50 Debug::CodeRangeCreatedCallback callback
=
51 DebugImpl::GetCodeRangeCreatedCallback();
52 if (code_range
&& size
&& callback
)
53 callback(code_range
, size
);
58 IsolateHolder::~IsolateHolder() {
59 if (task_observer_
.get())
60 base::MessageLoop::current()->RemoveTaskObserver(task_observer_
.get());
65 isolate_
->GetCodeRange(&code_range
, &size
);
66 Debug::CodeRangeDeletedCallback callback
=
67 DebugImpl::GetCodeRangeDeletedCallback();
68 if (code_range
&& callback
)
72 isolate_data_
.reset();
77 void IsolateHolder::Initialize(ScriptMode mode
,
78 v8::ArrayBuffer::Allocator
* allocator
) {
80 static bool v8_is_initialized
= false;
81 if (v8_is_initialized
)
83 v8::V8::InitializePlatform(V8Platform::Get());
84 v8::V8::SetArrayBufferAllocator(allocator
);
85 g_array_buffer_allocator
= allocator
;
86 if (mode
== gin::IsolateHolder::kStrictMode
) {
87 static const char v8_flags
[] = "--use_strict";
88 v8::V8::SetFlagsFromString(v8_flags
, sizeof(v8_flags
) - 1);
90 v8::V8::SetEntropySource(&GenerateEntropy
);
92 v8_is_initialized
= true;
95 void IsolateHolder::AddRunMicrotasksObserver() {
96 DCHECK(!task_observer_
.get());
97 task_observer_
.reset(new RunMicrotasksObserver(isolate_
));;
98 base::MessageLoop::current()->AddTaskObserver(task_observer_
.get());
101 void IsolateHolder::RemoveRunMicrotasksObserver() {
102 DCHECK(task_observer_
.get());
103 base::MessageLoop::current()->RemoveTaskObserver(task_observer_
.get());
104 task_observer_
.reset();