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