1 /*********************************************************************
2 * NAN - Native Abstractions for Node.js
4 * Copyright (c) 2017 NAN contributors
6 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
7 ********************************************************************/
9 #ifndef NAN_MAYBE_PRE_43_INL_H_
10 #define NAN_MAYBE_PRE_43_INL_H_
15 inline MaybeLocal() : val_(v8::Local<T>()) {}
18 # if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION
20 MaybeLocal(v8::Local<S> that) : val_(that) {} // NOLINT(runtime/explicit)
23 MaybeLocal(v8::Local<S> that) : // NOLINT(runtime/explicit)
24 val_(*reinterpret_cast<v8::Local<T>*>(&that)) {}
27 inline bool IsEmpty() const { return val_.IsEmpty(); }
30 inline bool ToLocal(v8::Local<S> *out) const {
35 inline v8::Local<T> ToLocalChecked() const {
36 #if defined(V8_ENABLE_CHECKS)
37 assert(!IsEmpty() && "ToLocalChecked is Empty");
38 #endif // V8_ENABLE_CHECKS
43 inline v8::Local<S> FromMaybe(v8::Local<S> default_value) const {
44 return IsEmpty() ? default_value : val_;
54 inline bool IsNothing() const { return !has_value_; }
55 inline bool IsJust() const { return has_value_; }
57 inline T FromJust() const {
58 #if defined(V8_ENABLE_CHECKS)
59 assert(IsJust() && "FromJust is Nothing");
60 #endif // V8_ENABLE_CHECKS
64 inline T FromMaybe(const T& default_value) const {
65 return has_value_ ? value_ : default_value;
68 inline bool operator==(const Maybe &other) const {
69 return (IsJust() == other.IsJust()) &&
70 (!IsJust() || FromJust() == other.FromJust());
73 inline bool operator!=(const Maybe &other) const {
74 return !operator==(other);
78 Maybe() : has_value_(false) {}
79 explicit Maybe(const T& t) : has_value_(true), value_(t) {}
84 friend Maybe<U> Nothing();
86 friend Maybe<U> Just(const U& u);
90 inline Maybe<T> Nothing() {
95 inline Maybe<T> Just(const T& t) {
100 MaybeLocal<v8::String> ToDetailString(v8::Handle<v8::Value> val) {
101 return MaybeLocal<v8::String>(val->ToDetailString());
105 MaybeLocal<v8::Uint32> ToArrayIndex(v8::Handle<v8::Value> val) {
106 return MaybeLocal<v8::Uint32>(val->ToArrayIndex());
110 Maybe<bool> Equals(v8::Handle<v8::Value> a, v8::Handle<v8::Value>(b)) {
111 return Just<bool>(a->Equals(b));
115 MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::Function> h) {
116 return MaybeLocal<v8::Object>(h->NewInstance());
120 MaybeLocal<v8::Object> NewInstance(
121 v8::Local<v8::Function> h
123 , v8::Local<v8::Value> argv[]) {
124 return MaybeLocal<v8::Object>(h->NewInstance(argc, argv));
128 MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::ObjectTemplate> h) {
129 return MaybeLocal<v8::Object>(h->NewInstance());
133 MaybeLocal<v8::Function> GetFunction(v8::Handle<v8::FunctionTemplate> t) {
134 return MaybeLocal<v8::Function>(t->GetFunction());
137 inline Maybe<bool> Set(
138 v8::Handle<v8::Object> obj
139 , v8::Handle<v8::Value> key
140 , v8::Handle<v8::Value> value) {
141 return Just<bool>(obj->Set(key, value));
144 inline Maybe<bool> Set(
145 v8::Handle<v8::Object> obj
147 , v8::Handle<v8::Value> value) {
148 return Just<bool>(obj->Set(index, value));
151 inline Maybe<bool> ForceSet(
152 v8::Handle<v8::Object> obj
153 , v8::Handle<v8::Value> key
154 , v8::Handle<v8::Value> value
155 , v8::PropertyAttribute attribs = v8::None) {
156 return Just<bool>(obj->ForceSet(key, value, attribs));
159 inline MaybeLocal<v8::Value> Get(
160 v8::Handle<v8::Object> obj
161 , v8::Handle<v8::Value> key) {
162 return MaybeLocal<v8::Value>(obj->Get(key));
165 inline MaybeLocal<v8::Value> Get(
166 v8::Handle<v8::Object> obj
168 return MaybeLocal<v8::Value>(obj->Get(index));
171 inline Maybe<v8::PropertyAttribute> GetPropertyAttributes(
172 v8::Handle<v8::Object> obj
173 , v8::Handle<v8::Value> key) {
174 return Just<v8::PropertyAttribute>(obj->GetPropertyAttributes(key));
177 inline Maybe<bool> Has(
178 v8::Handle<v8::Object> obj
179 , v8::Handle<v8::String> key) {
180 return Just<bool>(obj->Has(key));
183 inline Maybe<bool> Has(
184 v8::Handle<v8::Object> obj
186 return Just<bool>(obj->Has(index));
189 inline Maybe<bool> Delete(
190 v8::Handle<v8::Object> obj
191 , v8::Handle<v8::String> key) {
192 return Just<bool>(obj->Delete(key));
195 inline Maybe<bool> Delete(
196 v8::Handle<v8::Object> obj
198 return Just<bool>(obj->Delete(index));
202 MaybeLocal<v8::Array> GetPropertyNames(v8::Handle<v8::Object> obj) {
203 return MaybeLocal<v8::Array>(obj->GetPropertyNames());
207 MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Handle<v8::Object> obj) {
208 return MaybeLocal<v8::Array>(obj->GetOwnPropertyNames());
211 inline Maybe<bool> SetPrototype(
212 v8::Handle<v8::Object> obj
213 , v8::Handle<v8::Value> prototype) {
214 return Just<bool>(obj->SetPrototype(prototype));
217 inline MaybeLocal<v8::String> ObjectProtoToString(
218 v8::Handle<v8::Object> obj) {
219 return MaybeLocal<v8::String>(obj->ObjectProtoToString());
222 inline Maybe<bool> HasOwnProperty(
223 v8::Handle<v8::Object> obj
224 , v8::Handle<v8::String> key) {
225 return Just<bool>(obj->HasOwnProperty(key));
228 inline Maybe<bool> HasRealNamedProperty(
229 v8::Handle<v8::Object> obj
230 , v8::Handle<v8::String> key) {
231 return Just<bool>(obj->HasRealNamedProperty(key));
234 inline Maybe<bool> HasRealIndexedProperty(
235 v8::Handle<v8::Object> obj
237 return Just<bool>(obj->HasRealIndexedProperty(index));
240 inline Maybe<bool> HasRealNamedCallbackProperty(
241 v8::Handle<v8::Object> obj
242 , v8::Handle<v8::String> key) {
243 return Just<bool>(obj->HasRealNamedCallbackProperty(key));
246 inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
247 v8::Handle<v8::Object> obj
248 , v8::Handle<v8::String> key) {
249 return MaybeLocal<v8::Value>(
250 obj->GetRealNamedPropertyInPrototypeChain(key));
253 inline MaybeLocal<v8::Value> GetRealNamedProperty(
254 v8::Handle<v8::Object> obj
255 , v8::Handle<v8::String> key) {
256 return MaybeLocal<v8::Value>(obj->GetRealNamedProperty(key));
259 inline MaybeLocal<v8::Value> CallAsFunction(
260 v8::Handle<v8::Object> obj
261 , v8::Handle<v8::Object> recv
263 , v8::Handle<v8::Value> argv[]) {
264 return MaybeLocal<v8::Value>(obj->CallAsFunction(recv, argc, argv));
267 inline MaybeLocal<v8::Value> CallAsConstructor(
268 v8::Handle<v8::Object> obj
270 , v8::Local<v8::Value> argv[]) {
271 return MaybeLocal<v8::Value>(obj->CallAsConstructor(argc, argv));
275 MaybeLocal<v8::String> GetSourceLine(v8::Handle<v8::Message> msg) {
276 return MaybeLocal<v8::String>(msg->GetSourceLine());
279 inline Maybe<int> GetLineNumber(v8::Handle<v8::Message> msg) {
280 return Just<int>(msg->GetLineNumber());
283 inline Maybe<int> GetStartColumn(v8::Handle<v8::Message> msg) {
284 return Just<int>(msg->GetStartColumn());
287 inline Maybe<int> GetEndColumn(v8::Handle<v8::Message> msg) {
288 return Just<int>(msg->GetEndColumn());
291 inline MaybeLocal<v8::Object> CloneElementAt(
292 v8::Handle<v8::Array> array
294 return MaybeLocal<v8::Object>(array->CloneElementAt(index));
297 inline MaybeLocal<v8::Value> Call(
298 v8::Local<v8::Function> fun
299 , v8::Local<v8::Object> recv
301 , v8::Local<v8::Value> argv[]) {
302 return MaybeLocal<v8::Value>(fun->Call(recv, argc, argv));
305 #endif // NAN_MAYBE_PRE_43_INL_H_