1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | #ifndef NAN_MAYBE_43_INL_H_
|
10 | #define NAN_MAYBE_43_INL_H_
|
11 |
|
12 | template<typename T>
|
13 | using MaybeLocal = v8::MaybeLocal<T>;
|
14 |
|
15 | template<typename T>
|
16 | using Maybe = v8::Maybe<T>;
|
17 |
|
18 | template<typename T>
|
19 | inline Maybe<T> Nothing() {
|
20 | return v8::Nothing<T>();
|
21 | }
|
22 |
|
23 | template<typename T>
|
24 | inline Maybe<T> Just(const T& t) {
|
25 | return v8::Just<T>(t);
|
26 | }
|
27 |
|
28 | inline
|
29 | MaybeLocal<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 |
|
36 | inline
|
37 | MaybeLocal<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 |
|
44 | inline
|
45 | Maybe<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 |
|
51 | inline
|
52 | MaybeLocal<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 |
|
59 | inline
|
60 | MaybeLocal<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 |
|
70 | inline
|
71 | MaybeLocal<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 |
|
79 | inline 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 |
|
87 | inline 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 |
|
96 | inline 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"
|
107 | #endif
|
108 |
|
109 | inline 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 |
|
130 | NAN_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 |
|
147 | inline 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 |
|
156 | inline
|
157 | MaybeLocal<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 |
|
164 | inline 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 |
|
173 | inline 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 |
|
181 | inline 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 |
|
187 | inline 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 |
|
195 | inline
|
196 | Maybe<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 |
|
202 | inline
|
203 | MaybeLocal<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 |
|
210 | inline
|
211 | MaybeLocal<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 |
|
218 | inline 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 |
|
226 | inline 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 |
|
234 | inline 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 |
|
242 | inline 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 |
|
250 | inline 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 |
|
258 | inline 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 |
|
266 | inline 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 |
|
276 | inline 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 |
|
286 | inline 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 |
|
298 | inline 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 |
|
308 | inline
|
309 | MaybeLocal<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 |
|
316 | inline 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 |
|
322 | inline 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 |
|
328 | inline 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 |
|
334 | inline 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 |
|
358 | inline 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
|