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 14 namespace v8 { 15 16 namespace internal { 17 class EmbedderState; 18 } // namespace internal 19 20 // A StateTag represents a possible state of the embedder. 21 enum 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. 31 class 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