nan_maybe_43_inl.h 12 KB

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