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#ifndef INCLUDE_V8_EMBEDDER_STATE_SCOPE_H_
6#define INCLUDE_V8_EMBEDDER_STATE_SCOPE_H_
7
8#include <memory>
9
10#include "v8-context.h"       // NOLINT(build/include_directory)
11#include "v8-internal.h"      // NOLINT(build/include_directory)
12#include "v8-local-handle.h"  // NOLINT(build/include_directory)
13
14namespace v8 {
15
16namespace internal {
17class EmbedderState;
18}  // namespace internal
19
20// A StateTag represents a possible state of the embedder.
21enum class EmbedderStateTag : uint8_t {
22  // reserved
23  EMPTY = 0,
24  OTHER = 1,
25  // embedder can define any state after
26};
27
28// A stack-allocated class that manages an embedder state on the isolate.
29// After an EmbedderState scope has been created, a new embedder state will be
30// pushed on the isolate stack.
31class V8_EXPORT EmbedderStateScope {
32 public:
33  EmbedderStateScope(Isolate* isolate, Local<v8::Context> context,
34                     EmbedderStateTag tag);
35
36  ~EmbedderStateScope();
37
38 private:
39  // Declaring operator new and delete as deleted is not spec compliant.
40  // Therefore declare them private instead to disable dynamic alloc
41  void* operator new(size_t size);
42  void* operator new[](size_t size);
43  void operator delete(void*, size_t);
44  void operator delete[](void*, size_t);
45
46  std::unique_ptr<internal::EmbedderState> embedder_state_;
47};
48
49}  // namespace v8
50
51#endif  // INCLUDE_V8_EMBEDDER_STATE_SCOPE_H_
52