nan_maybe_43_inl.h 12 KB

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