UNPKG

12.4 kBtext/x-cView Raw
1/*********************************************************************
2 * NAN - Native Abstractions for Node.js
3 *
4 * Copyright (c) 2018 NAN contributors
5 *
6 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
7 ********************************************************************/
8
9#ifndef NAN_MAYBE_43_INL_H_
10#define NAN_MAYBE_43_INL_H_
11
12template<typename T>
13using MaybeLocal = v8::MaybeLocal<T>;
14
15inline
16MaybeLocal<v8::String> ToDetailString(v8::Local<v8::Value> val) {
17 v8::Isolate *isolate = v8::Isolate::GetCurrent();
18 v8::EscapableHandleScope scope(isolate);
19 return scope.Escape(val->ToDetailString(isolate->GetCurrentContext())
20 .FromMaybe(v8::Local<v8::String>()));
21}
22
23inline
24MaybeLocal<v8::Uint32> ToArrayIndex(v8::Local<v8::Value> val) {
25 v8::Isolate *isolate = v8::Isolate::GetCurrent();
26 v8::EscapableHandleScope scope(isolate);
27 return scope.Escape(val->ToArrayIndex(isolate->GetCurrentContext())
28 .FromMaybe(v8::Local<v8::Uint32>()));
29}
30
31inline
32Maybe<bool> Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b)) {
33 v8::Isolate *isolate = v8::Isolate::GetCurrent();
34 v8::HandleScope scope(isolate);
35 return a->Equals(isolate->GetCurrentContext(), b);
36}
37
38inline
39MaybeLocal<v8::Object> NewInstance(v8::Local<v8::Function> h) {
40 v8::Isolate *isolate = v8::Isolate::GetCurrent();
41 v8::EscapableHandleScope scope(isolate);
42 return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
43 .FromMaybe(v8::Local<v8::Object>()));
44}
45
46inline
47MaybeLocal<v8::Object> NewInstance(
48 v8::Local<v8::Function> h
49 , int argc
50 , v8::Local<v8::Value> argv[]) {
51 v8::Isolate *isolate = v8::Isolate::GetCurrent();
52 v8::EscapableHandleScope scope(isolate);
53 return scope.Escape(h->NewInstance(isolate->GetCurrentContext(), argc, argv)
54 .FromMaybe(v8::Local<v8::Object>()));
55}
56
57inline
58MaybeLocal<v8::Object> NewInstance(v8::Local<v8::ObjectTemplate> h) {
59 v8::Isolate *isolate = v8::Isolate::GetCurrent();
60 v8::EscapableHandleScope scope(isolate);
61 return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
62 .FromMaybe(v8::Local<v8::Object>()));
63}
64
65
66inline MaybeLocal<v8::Function> GetFunction(
67 v8::Local<v8::FunctionTemplate> t) {
68 v8::Isolate *isolate = v8::Isolate::GetCurrent();
69 v8::EscapableHandleScope scope(isolate);
70 return scope.Escape(t->GetFunction(isolate->GetCurrentContext())
71 .FromMaybe(v8::Local<v8::Function>()));
72}
73
74inline Maybe<bool> Set(
75 v8::Local<v8::Object> obj
76 , v8::Local<v8::Value> key
77 , v8::Local<v8::Value> value) {
78 v8::Isolate *isolate = v8::Isolate::GetCurrent();
79 v8::HandleScope scope(isolate);
80 return obj->Set(isolate->GetCurrentContext(), key, value);
81}
82
83inline Maybe<bool> Set(
84 v8::Local<v8::Object> obj
85 , uint32_t index
86 , v8::Local<v8::Value> value) {
87 v8::Isolate *isolate = v8::Isolate::GetCurrent();
88 v8::HandleScope scope(isolate);
89 return obj->Set(isolate->GetCurrentContext(), index, value);
90}
91
92#if NODE_MODULE_VERSION < NODE_4_0_MODULE_VERSION
93#include "nan_define_own_property_helper.h" // NOLINT(build/include)
94#endif
95
96inline Maybe<bool> DefineOwnProperty(
97 v8::Local<v8::Object> obj
98 , v8::Local<v8::String> key
99 , v8::Local<v8::Value> value
100 , v8::PropertyAttribute attribs = v8::None) {
101 v8::Isolate *isolate = v8::Isolate::GetCurrent();
102 v8::HandleScope scope(isolate);
103#if NODE_MODULE_VERSION >= NODE_4_0_MODULE_VERSION
104 return obj->DefineOwnProperty(isolate->GetCurrentContext(), key, value,
105 attribs);
106#else
107 Maybe<v8::PropertyAttribute> maybeCurrent =
108 obj->GetPropertyAttributes(isolate->GetCurrentContext(), key);
109 if (maybeCurrent.IsNothing()) {
110 return Nothing<bool>();
111 }
112 v8::PropertyAttribute current = maybeCurrent.FromJust();
113 return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs);
114#endif
115}
116
117NAN_DEPRECATED inline Maybe<bool> ForceSet(
118 v8::Local<v8::Object> obj
119 , v8::Local<v8::Value> key
120 , v8::Local<v8::Value> value
121 , v8::PropertyAttribute attribs = v8::None) {
122 v8::Isolate *isolate = v8::Isolate::GetCurrent();
123 v8::HandleScope scope(isolate);
124#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
125 return key->IsName()
126 ? obj->DefineOwnProperty(isolate->GetCurrentContext(),
127 key.As<v8::Name>(), value, attribs)
128 : Nothing<bool>();
129#else
130 return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs);
131#endif
132}
133
134inline MaybeLocal<v8::Value> Get(
135 v8::Local<v8::Object> obj
136 , v8::Local<v8::Value> key) {
137 v8::Isolate *isolate = v8::Isolate::GetCurrent();
138 v8::EscapableHandleScope scope(isolate);
139 return scope.Escape(obj->Get(isolate->GetCurrentContext(), key)
140 .FromMaybe(v8::Local<v8::Value>()));
141}
142
143inline
144MaybeLocal<v8::Value> Get(v8::Local<v8::Object> obj, uint32_t index) {
145 v8::Isolate *isolate = v8::Isolate::GetCurrent();
146 v8::EscapableHandleScope scope(isolate);
147 return scope.Escape(obj->Get(isolate->GetCurrentContext(), index)
148 .FromMaybe(v8::Local<v8::Value>()));
149}
150
151inline v8::PropertyAttribute GetPropertyAttributes(
152 v8::Local<v8::Object> obj
153 , v8::Local<v8::Value> key) {
154 v8::Isolate *isolate = v8::Isolate::GetCurrent();
155 v8::HandleScope scope(isolate);
156 return obj->GetPropertyAttributes(isolate->GetCurrentContext(), key)
157 .FromJust();
158}
159
160inline Maybe<bool> Has(
161 v8::Local<v8::Object> obj
162 , v8::Local<v8::String> key) {
163 v8::Isolate *isolate = v8::Isolate::GetCurrent();
164 v8::HandleScope scope(isolate);
165 return obj->Has(isolate->GetCurrentContext(), key);
166}
167
168inline Maybe<bool> Has(v8::Local<v8::Object> obj, uint32_t index) {
169 v8::Isolate *isolate = v8::Isolate::GetCurrent();
170 v8::HandleScope scope(isolate);
171 return obj->Has(isolate->GetCurrentContext(), index);
172}
173
174inline Maybe<bool> Delete(
175 v8::Local<v8::Object> obj
176 , v8::Local<v8::String> key) {
177 v8::Isolate *isolate = v8::Isolate::GetCurrent();
178 v8::HandleScope scope(isolate);
179 return obj->Delete(isolate->GetCurrentContext(), key);
180}
181
182inline
183Maybe<bool> Delete(v8::Local<v8::Object> obj, uint32_t index) {
184 v8::Isolate *isolate = v8::Isolate::GetCurrent();
185 v8::HandleScope scope(isolate);
186 return obj->Delete(isolate->GetCurrentContext(), index);
187}
188
189inline
190MaybeLocal<v8::Array> GetPropertyNames(v8::Local<v8::Object> obj) {
191 v8::Isolate *isolate = v8::Isolate::GetCurrent();
192 v8::EscapableHandleScope scope(isolate);
193 return scope.Escape(obj->GetPropertyNames(isolate->GetCurrentContext())
194 .FromMaybe(v8::Local<v8::Array>()));
195}
196
197inline
198MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Local<v8::Object> obj) {
199 v8::Isolate *isolate = v8::Isolate::GetCurrent();
200 v8::EscapableHandleScope scope(isolate);
201 return scope.Escape(obj->GetOwnPropertyNames(isolate->GetCurrentContext())
202 .FromMaybe(v8::Local<v8::Array>()));
203}
204
205inline Maybe<bool> SetPrototype(
206 v8::Local<v8::Object> obj
207 , v8::Local<v8::Value> prototype) {
208 v8::Isolate *isolate = v8::Isolate::GetCurrent();
209 v8::HandleScope scope(isolate);
210 return obj->SetPrototype(isolate->GetCurrentContext(), prototype);
211}
212
213inline MaybeLocal<v8::String> ObjectProtoToString(
214 v8::Local<v8::Object> obj) {
215 v8::Isolate *isolate = v8::Isolate::GetCurrent();
216 v8::EscapableHandleScope scope(isolate);
217 return scope.Escape(obj->ObjectProtoToString(isolate->GetCurrentContext())
218 .FromMaybe(v8::Local<v8::String>()));
219}
220
221inline Maybe<bool> HasOwnProperty(
222 v8::Local<v8::Object> obj
223 , v8::Local<v8::String> key) {
224 v8::Isolate *isolate = v8::Isolate::GetCurrent();
225 v8::HandleScope scope(isolate);
226 return obj->HasOwnProperty(isolate->GetCurrentContext(), key);
227}
228
229inline Maybe<bool> HasRealNamedProperty(
230 v8::Local<v8::Object> obj
231 , v8::Local<v8::String> key) {
232 v8::Isolate *isolate = v8::Isolate::GetCurrent();
233 v8::HandleScope scope(isolate);
234 return obj->HasRealNamedProperty(isolate->GetCurrentContext(), key);
235}
236
237inline Maybe<bool> HasRealIndexedProperty(
238 v8::Local<v8::Object> obj
239 , uint32_t index) {
240 v8::Isolate *isolate = v8::Isolate::GetCurrent();
241 v8::HandleScope scope(isolate);
242 return obj->HasRealIndexedProperty(isolate->GetCurrentContext(), index);
243}
244
245inline Maybe<bool> HasRealNamedCallbackProperty(
246 v8::Local<v8::Object> obj
247 , v8::Local<v8::String> key) {
248 v8::Isolate *isolate = v8::Isolate::GetCurrent();
249 v8::HandleScope scope(isolate);
250 return obj->HasRealNamedCallbackProperty(isolate->GetCurrentContext(), key);
251}
252
253inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
254 v8::Local<v8::Object> obj
255 , v8::Local<v8::String> key) {
256 v8::Isolate *isolate = v8::Isolate::GetCurrent();
257 v8::EscapableHandleScope scope(isolate);
258 return scope.Escape(obj->GetRealNamedPropertyInPrototypeChain(
259 isolate->GetCurrentContext(), key)
260 .FromMaybe(v8::Local<v8::Value>()));
261}
262
263inline MaybeLocal<v8::Value> GetRealNamedProperty(
264 v8::Local<v8::Object> obj
265 , v8::Local<v8::String> key) {
266 v8::Isolate *isolate = v8::Isolate::GetCurrent();
267 v8::EscapableHandleScope scope(isolate);
268 return scope.Escape(
269 obj->GetRealNamedProperty(isolate->GetCurrentContext(), key)
270 .FromMaybe(v8::Local<v8::Value>()));
271}
272
273inline MaybeLocal<v8::Value> CallAsFunction(
274 v8::Local<v8::Object> obj
275 , v8::Local<v8::Object> recv
276 , int argc
277 , v8::Local<v8::Value> argv[]) {
278 v8::Isolate *isolate = v8::Isolate::GetCurrent();
279 v8::EscapableHandleScope scope(isolate);
280 return scope.Escape(
281 obj->CallAsFunction(isolate->GetCurrentContext(), recv, argc, argv)
282 .FromMaybe(v8::Local<v8::Value>()));
283}
284
285inline MaybeLocal<v8::Value> CallAsConstructor(
286 v8::Local<v8::Object> obj
287 , int argc, v8::Local<v8::Value> argv[]) {
288 v8::Isolate *isolate = v8::Isolate::GetCurrent();
289 v8::EscapableHandleScope scope(isolate);
290 return scope.Escape(
291 obj->CallAsConstructor(isolate->GetCurrentContext(), argc, argv)
292 .FromMaybe(v8::Local<v8::Value>()));
293}
294
295inline
296MaybeLocal<v8::String> GetSourceLine(v8::Local<v8::Message> msg) {
297 v8::Isolate *isolate = v8::Isolate::GetCurrent();
298 v8::EscapableHandleScope scope(isolate);
299 return scope.Escape(msg->GetSourceLine(isolate->GetCurrentContext())
300 .FromMaybe(v8::Local<v8::String>()));
301}
302
303inline Maybe<int> GetLineNumber(v8::Local<v8::Message> msg) {
304 v8::Isolate *isolate = v8::Isolate::GetCurrent();
305 v8::HandleScope scope(isolate);
306 return msg->GetLineNumber(isolate->GetCurrentContext());
307}
308
309inline Maybe<int> GetStartColumn(v8::Local<v8::Message> msg) {
310 v8::Isolate *isolate = v8::Isolate::GetCurrent();
311 v8::HandleScope scope(isolate);
312 return msg->GetStartColumn(isolate->GetCurrentContext());
313}
314
315inline Maybe<int> GetEndColumn(v8::Local<v8::Message> msg) {
316 v8::Isolate *isolate = v8::Isolate::GetCurrent();
317 v8::HandleScope scope(isolate);
318 return msg->GetEndColumn(isolate->GetCurrentContext());
319}
320
321inline MaybeLocal<v8::Object> CloneElementAt(
322 v8::Local<v8::Array> array
323 , uint32_t index) {
324#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
325 v8::Isolate *isolate = v8::Isolate::GetCurrent();
326 v8::EscapableHandleScope scope(isolate);
327 v8::Local<v8::Context> context = isolate->GetCurrentContext();
328 v8::Local<v8::Value> elem;
329 v8::Local<v8::Object> obj;
330 if (!array->Get(context, index).ToLocal(&elem)) {
331 return scope.Escape(obj);
332 }
333 if (!elem->ToObject(context).ToLocal(&obj)) {
334 return scope.Escape(v8::Local<v8::Object>());
335 }
336 return scope.Escape(obj->Clone());
337#else
338 v8::Isolate *isolate = v8::Isolate::GetCurrent();
339 v8::EscapableHandleScope scope(isolate);
340 return scope.Escape(array->CloneElementAt(isolate->GetCurrentContext(), index)
341 .FromMaybe(v8::Local<v8::Object>()));
342#endif
343}
344
345inline MaybeLocal<v8::Value> Call(
346 v8::Local<v8::Function> fun
347 , v8::Local<v8::Object> recv
348 , int argc
349 , v8::Local<v8::Value> argv[]) {
350 v8::Isolate *isolate = v8::Isolate::GetCurrent();
351 v8::EscapableHandleScope scope(isolate);
352 return scope.Escape(fun->Call(isolate->GetCurrentContext(), recv, argc, argv)
353 .FromMaybe(v8::Local<v8::Value>()));
354}
355
356#endif // NAN_MAYBE_43_INL_H_