1// Copyright 2020 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/execution/local-isolate.h"
6
7#include "src/bigint/bigint.h"
8#include "src/execution/isolate.h"
9#include "src/execution/thread-id.h"
10#include "src/handles/handles-inl.h"
11#include "src/logging/local-logger.h"
12#include "src/logging/runtime-call-stats-scope.h"
13
14namespace v8 {
15namespace internal {
16
17LocalIsolate::LocalIsolate(Isolate* isolate, ThreadKind kind)
18    : HiddenLocalFactory(isolate),
19      heap_(isolate->heap(), kind),
20      isolate_(isolate),
21      logger_(new LocalLogger(isolate)),
22      thread_id_(ThreadId::Current()),
23      stack_limit_(kind == ThreadKind::kMain
24                       ? isolate->stack_guard()->real_climit()
25                       : GetCurrentStackPosition() - FLAG_stack_size * KB)
26#ifdef V8_INTL_SUPPORT
27      ,
28      default_locale_(isolate->DefaultLocale())
29#endif
30{
31#ifdef V8_RUNTIME_CALL_STATS
32  if (kind == ThreadKind::kMain) {
33    runtime_call_stats_ = isolate->counters()->runtime_call_stats();
34  } else {
35    rcs_scope_.emplace(isolate->counters()->worker_thread_runtime_call_stats());
36    runtime_call_stats_ = rcs_scope_->Get();
37  }
38#endif
39}
40
41LocalIsolate::~LocalIsolate() {
42  if (bigint_processor_) bigint_processor_->Destroy();
43}
44
45void LocalIsolate::RegisterDeserializerStarted() {
46  return isolate_->RegisterDeserializerStarted();
47}
48void LocalIsolate::RegisterDeserializerFinished() {
49  return isolate_->RegisterDeserializerFinished();
50}
51
52int LocalIsolate::GetNextScriptId() { return isolate_->GetNextScriptId(); }
53
54#if V8_SFI_HAS_UNIQUE_ID
55int LocalIsolate::GetNextUniqueSharedFunctionInfoId() {
56  return isolate_->GetNextUniqueSharedFunctionInfoId();
57}
58#endif  // V8_SFI_HAS_UNIQUE_ID
59
60bool LocalIsolate::is_collecting_type_profile() const {
61  // TODO(leszeks): Figure out if it makes sense to check this asynchronously.
62  return isolate_->is_collecting_type_profile();
63}
64
65// Used for lazy initialization, based on an assumption that most
66// LocalIsolates won't be used to parse any BigInt literals.
67void LocalIsolate::InitializeBigIntProcessor() {
68  bigint_processor_ = bigint::Processor::New(new bigint::Platform());
69}
70
71// static
72bool StackLimitCheck::HasOverflowed(LocalIsolate* local_isolate) {
73  return GetCurrentStackPosition() < local_isolate->stack_limit();
74}
75
76#ifdef V8_INTL_SUPPORT
77// WARNING: This might be out-of-sync with the main-thread.
78const std::string& LocalIsolate::DefaultLocale() {
79  const std::string& res =
80      is_main_thread() ? isolate_->DefaultLocale() : default_locale_;
81  DCHECK(!res.empty());
82  return res;
83}
84#endif
85
86}  // namespace internal
87}  // namespace v8
88