UNPKG

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