• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 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/embedder-state.h"
6 
7 #include "src/api/api-inl.h"
8 #include "src/base/logging.h"
9 
10 namespace v8 {
11 
12 namespace internal {
13 
EmbedderState(v8::Isolate * isolate,Local<v8::Context> context,EmbedderStateTag tag)14 EmbedderState::EmbedderState(v8::Isolate* isolate, Local<v8::Context> context,
15                              EmbedderStateTag tag)
16     : isolate_(reinterpret_cast<i::Isolate*>(isolate)),
17       tag_(tag),
18       previous_embedder_state_(isolate_->current_embedder_state()) {
19   if (!context.IsEmpty()) {
20     native_context_address_ =
21         v8::Utils::OpenHandle(*context)->native_context().address();
22   }
23 
24   DCHECK_NE(this, isolate_->current_embedder_state());
25   isolate_->set_current_embedder_state(this);
26 }
27 
~EmbedderState()28 EmbedderState::~EmbedderState() {
29   DCHECK_EQ(this, isolate_->current_embedder_state());
30   isolate_->set_current_embedder_state(previous_embedder_state_);
31 }
32 
OnMoveEvent(Address from,Address to)33 void EmbedderState::OnMoveEvent(Address from, Address to) {
34   EmbedderState* state = this;
35   do {
36     if (state->native_context_address_ == from) {
37       native_context_address_ = to;
38     }
39     state = state->previous_embedder_state_;
40   } while (state != nullptr);
41 }
42 
43 }  // namespace internal
44 
45 }  // namespace v8
46