3
3
4
4
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
5
6
+ #include " util.h"
7
+ #include " v8.h"
8
+
6
9
namespace node {
7
10
8
11
// Pick an index that's hopefully out of the way when we're embedded inside
@@ -21,26 +24,62 @@ namespace node {
21
24
#define NODE_CONTEXT_ALLOW_WASM_CODE_GENERATION_INDEX 34
22
25
#endif
23
26
24
- #ifndef NODE_CONTEXT_TAG
25
- #define NODE_CONTEXT_TAG 35
26
- #endif
27
-
28
27
#ifndef NODE_BINDING_LIST
29
- #define NODE_BINDING_LIST_INDEX 36
28
+ #define NODE_BINDING_LIST_INDEX 35
30
29
#endif
31
30
32
31
#ifndef NODE_CONTEXT_ALLOW_CODE_GENERATION_FROM_STRINGS_INDEX
33
- #define NODE_CONTEXT_ALLOW_CODE_GENERATION_FROM_STRINGS_INDEX 37
32
+ #define NODE_CONTEXT_ALLOW_CODE_GENERATION_FROM_STRINGS_INDEX 36
33
+ #endif
34
+
35
+ // NODE_CONTEXT_TAG must be greater than any embedder indexes so that a single
36
+ // check on the number of embedder data fields can assure the presence of all
37
+ // embedder indexes.
38
+ #ifndef NODE_CONTEXT_TAG
39
+ #define NODE_CONTEXT_TAG 37
34
40
#endif
35
41
36
42
enum ContextEmbedderIndex {
37
43
kEnvironment = NODE_CONTEXT_EMBEDDER_DATA_INDEX,
38
44
kSandboxObject = NODE_CONTEXT_SANDBOX_OBJECT_INDEX,
39
45
kAllowWasmCodeGeneration = NODE_CONTEXT_ALLOW_WASM_CODE_GENERATION_INDEX,
40
- kContextTag = NODE_CONTEXT_TAG,
41
46
kBindingListIndex = NODE_BINDING_LIST_INDEX,
42
47
kAllowCodeGenerationFromStrings =
43
- NODE_CONTEXT_ALLOW_CODE_GENERATION_FROM_STRINGS_INDEX
48
+ NODE_CONTEXT_ALLOW_CODE_GENERATION_FROM_STRINGS_INDEX,
49
+ kContextTag = NODE_CONTEXT_TAG,
50
+ };
51
+
52
+ class ContextEmbedderTag {
53
+ public:
54
+ static inline void TagNodeContext (v8::Local<v8::Context> context) {
55
+ // Used by ContextEmbedderTag::IsNodeContext to know that we are on a node
56
+ // context.
57
+ context->SetAlignedPointerInEmbedderData (
58
+ ContextEmbedderIndex::kContextTag ,
59
+ ContextEmbedderTag::kNodeContextTagPtr );
60
+ }
61
+
62
+ static inline bool IsNodeContext (v8::Local<v8::Context> context) {
63
+ if (UNLIKELY (context.IsEmpty ())) {
64
+ return false ;
65
+ }
66
+ if (UNLIKELY (context->GetNumberOfEmbedderDataFields () <=
67
+ ContextEmbedderIndex::kContextTag )) {
68
+ return false ;
69
+ }
70
+ if (UNLIKELY (context->GetAlignedPointerFromEmbedderData (
71
+ ContextEmbedderIndex::kContextTag ) !=
72
+ ContextEmbedderTag::kNodeContextTagPtr )) {
73
+ return false ;
74
+ }
75
+ return true ;
76
+ }
77
+
78
+ private:
79
+ static void * const kNodeContextTagPtr ;
80
+ static int const kNodeContextTag ;
81
+
82
+ ContextEmbedderTag () = delete ;
44
83
};
45
84
46
85
} // namespace node
0 commit comments