@kungfu-tech/libnode-win32-x64 0.0.0-bootstrap.0 → 22.22.3-kf.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +3 -0
  3. package/dist/node/include/acorn_version.h +6 -0
  4. package/dist/node/include/aliased_buffer-inl.h +244 -0
  5. package/dist/node/include/aliased_buffer.h +206 -0
  6. package/dist/node/include/aliased_struct-inl.h +54 -0
  7. package/dist/node/include/aliased_struct.h +63 -0
  8. package/dist/node/include/amaro_version.h +6 -0
  9. package/dist/node/include/async_context_frame.h +33 -0
  10. package/dist/node/include/async_wrap-inl.h +96 -0
  11. package/dist/node/include/async_wrap.h +243 -0
  12. package/dist/node/include/base_object-inl.h +335 -0
  13. package/dist/node/include/base_object.h +342 -0
  14. package/dist/node/include/base_object_types.h +74 -0
  15. package/dist/node/include/blob_serializer_deserializer-inl.h +385 -0
  16. package/dist/node/include/blob_serializer_deserializer.h +132 -0
  17. package/dist/node/include/callback_queue-inl.h +97 -0
  18. package/dist/node/include/callback_queue.h +79 -0
  19. package/dist/node/include/cares_wrap.h +447 -0
  20. package/dist/node/include/cjs_module_lexer_version.h +6 -0
  21. package/dist/node/include/cleanup_queue-inl.h +36 -0
  22. package/dist/node/include/cleanup_queue.h +79 -0
  23. package/dist/node/include/compile_cache.h +104 -0
  24. package/dist/node/include/connect_wrap.h +26 -0
  25. package/dist/node/include/connection_wrap.h +30 -0
  26. package/dist/node/include/cppgc/allocation.h +310 -0
  27. package/dist/node/include/cppgc/common.h +28 -0
  28. package/dist/node/include/cppgc/cross-thread-persistent.h +466 -0
  29. package/dist/node/include/cppgc/custom-space.h +97 -0
  30. package/dist/node/include/cppgc/default-platform.h +67 -0
  31. package/dist/node/include/cppgc/ephemeron-pair.h +30 -0
  32. package/dist/node/include/cppgc/explicit-management.h +100 -0
  33. package/dist/node/include/cppgc/garbage-collected.h +106 -0
  34. package/dist/node/include/cppgc/heap-consistency.h +309 -0
  35. package/dist/node/include/cppgc/heap-handle.h +48 -0
  36. package/dist/node/include/cppgc/heap-state.h +82 -0
  37. package/dist/node/include/cppgc/heap-statistics.h +120 -0
  38. package/dist/node/include/cppgc/heap.h +202 -0
  39. package/dist/node/include/cppgc/internal/api-constants.h +87 -0
  40. package/dist/node/include/cppgc/internal/atomic-entry-flag.h +48 -0
  41. package/dist/node/include/cppgc/internal/base-page-handle.h +45 -0
  42. package/dist/node/include/cppgc/internal/caged-heap-local-data.h +121 -0
  43. package/dist/node/include/cppgc/internal/caged-heap.h +68 -0
  44. package/dist/node/include/cppgc/internal/compiler-specific.h +38 -0
  45. package/dist/node/include/cppgc/internal/finalizer-trait.h +93 -0
  46. package/dist/node/include/cppgc/internal/gc-info.h +148 -0
  47. package/dist/node/include/cppgc/internal/logging.h +50 -0
  48. package/dist/node/include/cppgc/internal/member-storage.h +256 -0
  49. package/dist/node/include/cppgc/internal/name-trait.h +137 -0
  50. package/dist/node/include/cppgc/internal/persistent-node.h +214 -0
  51. package/dist/node/include/cppgc/internal/pointer-policies.h +243 -0
  52. package/dist/node/include/cppgc/internal/write-barrier.h +487 -0
  53. package/dist/node/include/cppgc/liveness-broker.h +78 -0
  54. package/dist/node/include/cppgc/macros.h +35 -0
  55. package/dist/node/include/cppgc/member.h +629 -0
  56. package/dist/node/include/cppgc/name-provider.h +65 -0
  57. package/dist/node/include/cppgc/object-size-trait.h +58 -0
  58. package/dist/node/include/cppgc/persistent.h +377 -0
  59. package/dist/node/include/cppgc/platform.h +163 -0
  60. package/dist/node/include/cppgc/prefinalizer.h +75 -0
  61. package/dist/node/include/cppgc/process-heap-statistics.h +36 -0
  62. package/dist/node/include/cppgc/sentinel-pointer.h +39 -0
  63. package/dist/node/include/cppgc/source-location.h +16 -0
  64. package/dist/node/include/cppgc/testing.h +106 -0
  65. package/dist/node/include/cppgc/trace-trait.h +128 -0
  66. package/dist/node/include/cppgc/type-traits.h +271 -0
  67. package/dist/node/include/cppgc/visitor.h +504 -0
  68. package/dist/node/include/crypto/crypto_aes.h +88 -0
  69. package/dist/node/include/crypto/crypto_bio.h +193 -0
  70. package/dist/node/include/crypto/crypto_cipher.h +293 -0
  71. package/dist/node/include/crypto/crypto_clienthello-inl.h +90 -0
  72. package/dist/node/include/crypto/crypto_clienthello.h +131 -0
  73. package/dist/node/include/crypto/crypto_common.h +64 -0
  74. package/dist/node/include/crypto/crypto_context.h +171 -0
  75. package/dist/node/include/crypto/crypto_dh.h +126 -0
  76. package/dist/node/include/crypto/crypto_dsa.h +52 -0
  77. package/dist/node/include/crypto/crypto_ec.h +164 -0
  78. package/dist/node/include/crypto/crypto_hash.h +91 -0
  79. package/dist/node/include/crypto/crypto_hkdf.h +61 -0
  80. package/dist/node/include/crypto/crypto_hmac.h +92 -0
  81. package/dist/node/include/crypto/crypto_keygen.h +299 -0
  82. package/dist/node/include/crypto/crypto_keys.h +392 -0
  83. package/dist/node/include/crypto/crypto_pbkdf2.h +74 -0
  84. package/dist/node/include/crypto/crypto_random.h +124 -0
  85. package/dist/node/include/crypto/crypto_rsa.h +136 -0
  86. package/dist/node/include/crypto/crypto_scrypt.h +85 -0
  87. package/dist/node/include/crypto/crypto_sig.h +165 -0
  88. package/dist/node/include/crypto/crypto_spkac.h +21 -0
  89. package/dist/node/include/crypto/crypto_timing.h +20 -0
  90. package/dist/node/include/crypto/crypto_tls.h +305 -0
  91. package/dist/node/include/crypto/crypto_util.h +725 -0
  92. package/dist/node/include/crypto/crypto_x509.h +140 -0
  93. package/dist/node/include/dataqueue/queue.h +306 -0
  94. package/dist/node/include/debug_utils-inl.h +278 -0
  95. package/dist/node/include/debug_utils.h +196 -0
  96. package/dist/node/include/diagnosticfilename-inl.h +33 -0
  97. package/dist/node/include/embedded_data.h +17 -0
  98. package/dist/node/include/encoding_binding.h +61 -0
  99. package/dist/node/include/env-inl.h +984 -0
  100. package/dist/node/include/env.h +1287 -0
  101. package/dist/node/include/env_properties.h +540 -0
  102. package/dist/node/include/handle_wrap.h +123 -0
  103. package/dist/node/include/histogram-inl.h +107 -0
  104. package/dist/node/include/histogram.h +279 -0
  105. package/dist/node/include/inspector/io_agent.h +30 -0
  106. package/dist/node/include/inspector/main_thread_interface.h +116 -0
  107. package/dist/node/include/inspector/network_agent.h +94 -0
  108. package/dist/node/include/inspector/network_inspector.h +45 -0
  109. package/dist/node/include/inspector/network_requests_buffer.h +195 -0
  110. package/dist/node/include/inspector/network_resource_manager.h +29 -0
  111. package/dist/node/include/inspector/node_json.h +24 -0
  112. package/dist/node/include/inspector/node_string.h +101 -0
  113. package/dist/node/include/inspector/protocol_helper.h +27 -0
  114. package/dist/node/include/inspector/runtime_agent.h +41 -0
  115. package/dist/node/include/inspector/target_agent.h +75 -0
  116. package/dist/node/include/inspector/tracing_agent.h +43 -0
  117. package/dist/node/include/inspector/worker_agent.h +40 -0
  118. package/dist/node/include/inspector/worker_inspector.h +124 -0
  119. package/dist/node/include/inspector_agent.h +165 -0
  120. package/dist/node/include/inspector_io.h +78 -0
  121. package/dist/node/include/inspector_profiler.h +149 -0
  122. package/dist/node/include/inspector_socket.h +60 -0
  123. package/dist/node/include/inspector_socket_server.h +110 -0
  124. package/dist/node/include/js_native_api.h +607 -0
  125. package/dist/node/include/js_native_api_types.h +226 -0
  126. package/dist/node/include/js_native_api_v8.h +485 -0
  127. package/dist/node/include/js_native_api_v8_internals.h +45 -0
  128. package/dist/node/include/js_stream.h +52 -0
  129. package/dist/node/include/json_utils.h +172 -0
  130. package/dist/node/include/large_pages/node_large_page.h +34 -0
  131. package/dist/node/include/libplatform/libplatform-export.h +29 -0
  132. package/dist/node/include/libplatform/libplatform.h +112 -0
  133. package/dist/node/include/libplatform/v8-tracing.h +333 -0
  134. package/dist/node/include/memory_tracker-inl.h +359 -0
  135. package/dist/node/include/memory_tracker.h +289 -0
  136. package/dist/node/include/module_wrap.h +216 -0
  137. package/dist/node/include/node.h +1593 -0
  138. package/dist/node/include/node_api.h +265 -0
  139. package/dist/node/include/node_api_internals.h +48 -0
  140. package/dist/node/include/node_api_types.h +56 -0
  141. package/dist/node/include/node_binding.h +161 -0
  142. package/dist/node/include/node_blob.h +159 -0
  143. package/dist/node/include/node_bob-inl.h +36 -0
  144. package/dist/node/include/node_bob.h +107 -0
  145. package/dist/node/include/node_buffer.h +92 -0
  146. package/dist/node/include/node_builtins.h +220 -0
  147. package/dist/node/include/node_config_file.h +46 -0
  148. package/dist/node/include/node_constants.h +82 -0
  149. package/dist/node/include/node_context_data.h +168 -0
  150. package/dist/node/include/node_contextify.h +204 -0
  151. package/dist/node/include/node_crypto.h +56 -0
  152. package/dist/node/include/node_debug.h +30 -0
  153. package/dist/node/include/node_dir.h +52 -0
  154. package/dist/node/include/node_dotenv.h +45 -0
  155. package/dist/node/include/node_errors.h +380 -0
  156. package/dist/node/include/node_exit_code.h +54 -0
  157. package/dist/node/include/node_external_reference.h +165 -0
  158. package/dist/node/include/node_file-inl.h +406 -0
  159. package/dist/node/include/node_file.h +537 -0
  160. package/dist/node/include/node_http2.h +1177 -0
  161. package/dist/node/include/node_http2_state.h +159 -0
  162. package/dist/node/include/node_http_common-inl.h +202 -0
  163. package/dist/node/include/node_http_common.h +535 -0
  164. package/dist/node/include/node_i18n.h +132 -0
  165. package/dist/node/include/node_internals.h +483 -0
  166. package/dist/node/include/node_main_instance.h +67 -0
  167. package/dist/node/include/node_mem-inl.h +113 -0
  168. package/dist/node/include/node_mem.h +45 -0
  169. package/dist/node/include/node_messaging.h +389 -0
  170. package/dist/node/include/node_metadata.h +164 -0
  171. package/dist/node/include/node_modules.h +91 -0
  172. package/dist/node/include/node_mutex.h +323 -0
  173. package/dist/node/include/node_object_wrap.h +132 -0
  174. package/dist/node/include/node_options-inl.h +490 -0
  175. package/dist/node/include/node_options.h +615 -0
  176. package/dist/node/include/node_perf.h +166 -0
  177. package/dist/node/include/node_perf_common.h +102 -0
  178. package/dist/node/include/node_platform.h +238 -0
  179. package/dist/node/include/node_process-inl.h +26 -0
  180. package/dist/node/include/node_process.h +112 -0
  181. package/dist/node/include/node_realm-inl.h +151 -0
  182. package/dist/node/include/node_realm.h +183 -0
  183. package/dist/node/include/node_report.h +43 -0
  184. package/dist/node/include/node_revert.h +82 -0
  185. package/dist/node/include/node_root_certs.h +3520 -0
  186. package/dist/node/include/node_sea.h +74 -0
  187. package/dist/node/include/node_shadow_realm.h +46 -0
  188. package/dist/node/include/node_snapshot_builder.h +57 -0
  189. package/dist/node/include/node_snapshotable.h +174 -0
  190. package/dist/node/include/node_sockaddr-inl.h +257 -0
  191. package/dist/node/include/node_sockaddr.h +394 -0
  192. package/dist/node/include/node_sqlite.h +270 -0
  193. package/dist/node/include/node_stat_watcher.h +73 -0
  194. package/dist/node/include/node_task_runner.h +92 -0
  195. package/dist/node/include/node_threadsafe_cow-inl.h +54 -0
  196. package/dist/node/include/node_threadsafe_cow.h +105 -0
  197. package/dist/node/include/node_union_bytes.h +81 -0
  198. package/dist/node/include/node_url.h +96 -0
  199. package/dist/node/include/node_v8.h +77 -0
  200. package/dist/node/include/node_v8_platform-inl.h +185 -0
  201. package/dist/node/include/node_version.h +110 -0
  202. package/dist/node/include/node_wasi.h +184 -0
  203. package/dist/node/include/node_wasm_web_api.h +55 -0
  204. package/dist/node/include/node_watchdog.h +154 -0
  205. package/dist/node/include/node_webstorage.h +60 -0
  206. package/dist/node/include/node_worker.h +158 -0
  207. package/dist/node/include/path.h +33 -0
  208. package/dist/node/include/permission/addon_permission.h +31 -0
  209. package/dist/node/include/permission/child_process_permission.h +31 -0
  210. package/dist/node/include/permission/fs_permission.h +167 -0
  211. package/dist/node/include/permission/inspector_permission.h +31 -0
  212. package/dist/node/include/permission/permission.h +138 -0
  213. package/dist/node/include/permission/permission_base.h +65 -0
  214. package/dist/node/include/permission/wasi_permission.h +31 -0
  215. package/dist/node/include/permission/worker_permission.h +31 -0
  216. package/dist/node/include/pipe_wrap.h +80 -0
  217. package/dist/node/include/quic/application.h +159 -0
  218. package/dist/node/include/quic/bindingdata.h +272 -0
  219. package/dist/node/include/quic/cid.h +127 -0
  220. package/dist/node/include/quic/data.h +148 -0
  221. package/dist/node/include/quic/defs.h +245 -0
  222. package/dist/node/include/quic/endpoint.h +458 -0
  223. package/dist/node/include/quic/http3.h +15 -0
  224. package/dist/node/include/quic/logstream.h +81 -0
  225. package/dist/node/include/quic/packet.h +152 -0
  226. package/dist/node/include/quic/preferredaddress.h +72 -0
  227. package/dist/node/include/quic/session.h +443 -0
  228. package/dist/node/include/quic/sessionticket.h +108 -0
  229. package/dist/node/include/quic/streams.h +232 -0
  230. package/dist/node/include/quic/tlscontext.h +227 -0
  231. package/dist/node/include/quic/tokens.h +256 -0
  232. package/dist/node/include/quic/transportparams.h +165 -0
  233. package/dist/node/include/req_wrap-inl.h +171 -0
  234. package/dist/node/include/req_wrap.h +77 -0
  235. package/dist/node/include/spawn_sync.h +243 -0
  236. package/dist/node/include/stream_base-inl.h +173 -0
  237. package/dist/node/include/stream_base.h +478 -0
  238. package/dist/node/include/stream_pipe.h +76 -0
  239. package/dist/node/include/stream_wrap.h +132 -0
  240. package/dist/node/include/string_bytes.h +113 -0
  241. package/dist/node/include/string_decoder-inl.h +31 -0
  242. package/dist/node/include/string_decoder.h +49 -0
  243. package/dist/node/include/tcp_wrap.h +105 -0
  244. package/dist/node/include/threadpoolwork-inl.h +70 -0
  245. package/dist/node/include/timer_wrap-inl.h +32 -0
  246. package/dist/node/include/timer_wrap.h +85 -0
  247. package/dist/node/include/timers.h +70 -0
  248. package/dist/node/include/tracing/agent.h +195 -0
  249. package/dist/node/include/tracing/node_trace_buffer.h +83 -0
  250. package/dist/node/include/tracing/node_trace_writer.h +75 -0
  251. package/dist/node/include/tracing/trace_event.h +722 -0
  252. package/dist/node/include/tracing/trace_event_common.h +1109 -0
  253. package/dist/node/include/tracing/traced_value.h +129 -0
  254. package/dist/node/include/tty_wrap.h +65 -0
  255. package/dist/node/include/udp_wrap.h +230 -0
  256. package/dist/node/include/undici_version.h +6 -0
  257. package/dist/node/include/util-inl.h +700 -0
  258. package/dist/node/include/util.h +1021 -0
  259. package/dist/node/include/uv/aix.h +32 -0
  260. package/dist/node/include/uv/bsd.h +34 -0
  261. package/dist/node/include/uv/darwin.h +61 -0
  262. package/dist/node/include/uv/errno.h +483 -0
  263. package/dist/node/include/uv/linux.h +34 -0
  264. package/dist/node/include/uv/os390.h +33 -0
  265. package/dist/node/include/uv/posix.h +31 -0
  266. package/dist/node/include/uv/sunos.h +44 -0
  267. package/dist/node/include/uv/threadpool.h +37 -0
  268. package/dist/node/include/uv/tree.h +521 -0
  269. package/dist/node/include/uv/unix.h +512 -0
  270. package/dist/node/include/uv/version.h +43 -0
  271. package/dist/node/include/uv/win.h +698 -0
  272. package/dist/node/include/uv.h +1990 -0
  273. package/dist/node/include/v8-array-buffer.h +525 -0
  274. package/dist/node/include/v8-callbacks.h +462 -0
  275. package/dist/node/include/v8-container.h +183 -0
  276. package/dist/node/include/v8-context.h +485 -0
  277. package/dist/node/include/v8-cppgc.h +245 -0
  278. package/dist/node/include/v8-data.h +80 -0
  279. package/dist/node/include/v8-date.h +48 -0
  280. package/dist/node/include/v8-debug.h +168 -0
  281. package/dist/node/include/v8-embedder-heap.h +82 -0
  282. package/dist/node/include/v8-embedder-state-scope.h +52 -0
  283. package/dist/node/include/v8-exception.h +223 -0
  284. package/dist/node/include/v8-extension.h +62 -0
  285. package/dist/node/include/v8-external.h +37 -0
  286. package/dist/node/include/v8-fast-api-calls.h +984 -0
  287. package/dist/node/include/v8-forward.h +82 -0
  288. package/dist/node/include/v8-function-callback.h +607 -0
  289. package/dist/node/include/v8-function.h +140 -0
  290. package/dist/node/include/v8-handle-base.h +137 -0
  291. package/dist/node/include/v8-initialization.h +289 -0
  292. package/dist/node/include/v8-inspector-protocol.h +13 -0
  293. package/dist/node/include/v8-inspector.h +419 -0
  294. package/dist/node/include/v8-internal.h +1397 -0
  295. package/dist/node/include/v8-isolate.h +1767 -0
  296. package/dist/node/include/v8-json.h +47 -0
  297. package/dist/node/include/v8-local-handle.h +758 -0
  298. package/dist/node/include/v8-locker.h +138 -0
  299. package/dist/node/include/v8-maybe.h +160 -0
  300. package/dist/node/include/v8-memory-span.h +198 -0
  301. package/dist/node/include/v8-message.h +233 -0
  302. package/dist/node/include/v8-metrics.h +264 -0
  303. package/dist/node/include/v8-microtask-queue.h +157 -0
  304. package/dist/node/include/v8-microtask.h +28 -0
  305. package/dist/node/include/v8-object.h +824 -0
  306. package/dist/node/include/v8-persistent-handle.h +582 -0
  307. package/dist/node/include/v8-platform.h +1358 -0
  308. package/dist/node/include/v8-primitive-object.h +118 -0
  309. package/dist/node/include/v8-primitive.h +877 -0
  310. package/dist/node/include/v8-profiler.h +1302 -0
  311. package/dist/node/include/v8-promise.h +174 -0
  312. package/dist/node/include/v8-proxy.h +50 -0
  313. package/dist/node/include/v8-regexp.h +106 -0
  314. package/dist/node/include/v8-script.h +904 -0
  315. package/dist/node/include/v8-snapshot.h +266 -0
  316. package/dist/node/include/v8-source-location.h +92 -0
  317. package/dist/node/include/v8-statistics.h +238 -0
  318. package/dist/node/include/v8-template.h +1297 -0
  319. package/dist/node/include/v8-traced-handle.h +432 -0
  320. package/dist/node/include/v8-typed-array.h +390 -0
  321. package/dist/node/include/v8-unwinder-state.h +31 -0
  322. package/dist/node/include/v8-unwinder.h +132 -0
  323. package/dist/node/include/v8-util.h +665 -0
  324. package/dist/node/include/v8-value-serializer-version.h +24 -0
  325. package/dist/node/include/v8-value-serializer.h +316 -0
  326. package/dist/node/include/v8-value.h +655 -0
  327. package/dist/node/include/v8-version-string.h +38 -0
  328. package/dist/node/include/v8-version.h +20 -0
  329. package/dist/node/include/v8-wasm-trap-handler-posix.h +31 -0
  330. package/dist/node/include/v8-wasm-trap-handler-win.h +28 -0
  331. package/dist/node/include/v8-wasm.h +201 -0
  332. package/dist/node/include/v8-weak-callback-info.h +80 -0
  333. package/dist/node/include/v8.h +88 -0
  334. package/dist/node/include/v8config.h +981 -0
  335. package/dist/node/include/zlib_version.h +6 -0
  336. package/dist/node/libnode.dll +0 -0
  337. package/dist/node/libnode.lib +0 -0
  338. package/dist/node/libnodebuildinfo.json +10 -0
  339. package/dist/node/link_node.lib +0 -0
  340. package/dist/node/link_node.node +0 -0
  341. package/index.js +5 -0
  342. package/libnode.release.json +8 -0
  343. package/package.json +29 -1
@@ -0,0 +1,758 @@
1
+ // Copyright 2021 the V8 project authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ #ifndef INCLUDE_V8_LOCAL_HANDLE_H_
6
+ #define INCLUDE_V8_LOCAL_HANDLE_H_
7
+
8
+ #include <stddef.h>
9
+
10
+ #include <type_traits>
11
+ #include <vector>
12
+
13
+ #include "v8-handle-base.h" // NOLINT(build/include_directory)
14
+ #include "v8-internal.h" // NOLINT(build/include_directory)
15
+
16
+ namespace v8 {
17
+
18
+ template <class T>
19
+ class LocalBase;
20
+ template <class T>
21
+ class Local;
22
+ template <class T>
23
+ class LocalVector;
24
+ template <class F>
25
+ class MaybeLocal;
26
+
27
+ template <class T>
28
+ class Eternal;
29
+ template <class T>
30
+ class Global;
31
+
32
+ template <class T>
33
+ class NonCopyablePersistentTraits;
34
+ template <class T>
35
+ class PersistentBase;
36
+ template <class T, class M = NonCopyablePersistentTraits<T>>
37
+ class Persistent;
38
+
39
+ class TracedReferenceBase;
40
+ template <class T>
41
+ class BasicTracedReference;
42
+ template <class F>
43
+ class TracedReference;
44
+
45
+ class Boolean;
46
+ class Context;
47
+ class EscapableHandleScope;
48
+ template <class F>
49
+ class FunctionCallbackInfo;
50
+ class Isolate;
51
+ class Object;
52
+ template <class F1, class F2, class F3>
53
+ class PersistentValueMapBase;
54
+ template <class F1, class F2>
55
+ class PersistentValueVector;
56
+ class Primitive;
57
+ class Private;
58
+ template <class F>
59
+ class PropertyCallbackInfo;
60
+ template <class F>
61
+ class ReturnValue;
62
+ class String;
63
+ template <class F>
64
+ class Traced;
65
+ class TypecheckWitness;
66
+ class Utils;
67
+
68
+ namespace debug {
69
+ class ConsoleCallArguments;
70
+ }
71
+
72
+ namespace internal {
73
+ template <typename T>
74
+ class CustomArguments;
75
+ template <typename T>
76
+ class LocalUnchecked;
77
+ class SamplingHeapProfiler;
78
+ } // namespace internal
79
+
80
+ namespace api_internal {
81
+ // Called when ToLocalChecked is called on an empty Local.
82
+ V8_EXPORT void ToLocalEmpty();
83
+ } // namespace api_internal
84
+
85
+ /**
86
+ * A stack-allocated class that governs a number of local handles.
87
+ * After a handle scope has been created, all local handles will be
88
+ * allocated within that handle scope until either the handle scope is
89
+ * deleted or another handle scope is created. If there is already a
90
+ * handle scope and a new one is created, all allocations will take
91
+ * place in the new handle scope until it is deleted. After that,
92
+ * new handles will again be allocated in the original handle scope.
93
+ *
94
+ * After the handle scope of a local handle has been deleted the
95
+ * garbage collector will no longer track the object stored in the
96
+ * handle and may deallocate it. The behavior of accessing a handle
97
+ * for which the handle scope has been deleted is undefined.
98
+ */
99
+ class V8_EXPORT V8_NODISCARD HandleScope {
100
+ public:
101
+ explicit HandleScope(Isolate* isolate);
102
+
103
+ ~HandleScope();
104
+
105
+ /**
106
+ * Counts the number of allocated handles.
107
+ */
108
+ static int NumberOfHandles(Isolate* isolate);
109
+
110
+ V8_INLINE Isolate* GetIsolate() const {
111
+ return reinterpret_cast<Isolate*>(i_isolate_);
112
+ }
113
+
114
+ HandleScope(const HandleScope&) = delete;
115
+ void operator=(const HandleScope&) = delete;
116
+
117
+ static internal::Address* CreateHandleForCurrentIsolate(
118
+ internal::Address value);
119
+
120
+ protected:
121
+ V8_INLINE HandleScope() = default;
122
+
123
+ void Initialize(Isolate* isolate);
124
+
125
+ static internal::Address* CreateHandle(internal::Isolate* i_isolate,
126
+ internal::Address value);
127
+
128
+ private:
129
+ // Declaring operator new and delete as deleted is not spec compliant.
130
+ // Therefore declare them private instead to disable dynamic alloc
131
+ void* operator new(size_t size);
132
+ void* operator new[](size_t size);
133
+ void operator delete(void*, size_t);
134
+ void operator delete[](void*, size_t);
135
+
136
+ internal::Isolate* i_isolate_;
137
+ internal::Address* prev_next_;
138
+ internal::Address* prev_limit_;
139
+ #ifdef V8_ENABLE_CHECKS
140
+ int scope_level_ = 0;
141
+ #endif
142
+
143
+ // LocalBase<T>::New uses CreateHandle with an Isolate* parameter.
144
+ template <typename T>
145
+ friend class LocalBase;
146
+
147
+ // Object::GetInternalField and Context::GetEmbedderData use CreateHandle with
148
+ // a HeapObject in their shortcuts.
149
+ friend class Object;
150
+ friend class Context;
151
+ };
152
+
153
+ /**
154
+ * A base class for local handles.
155
+ * Its implementation depends on whether direct local support is enabled.
156
+ * When it is, a local handle contains a direct pointer to the referenced
157
+ * object, otherwise it contains an indirect pointer.
158
+ */
159
+ #ifdef V8_ENABLE_DIRECT_LOCAL
160
+
161
+ template <typename T>
162
+ class LocalBase : public api_internal::DirectHandleBase {
163
+ protected:
164
+ template <class F>
165
+ friend class Local;
166
+
167
+ V8_INLINE LocalBase() = default;
168
+
169
+ V8_INLINE explicit LocalBase(internal::Address ptr) : DirectHandleBase(ptr) {}
170
+
171
+ template <typename S>
172
+ V8_INLINE LocalBase(const LocalBase<S>& other) : DirectHandleBase(other) {}
173
+
174
+ V8_INLINE static LocalBase<T> New(Isolate* isolate, internal::Address value) {
175
+ return LocalBase<T>(value);
176
+ }
177
+
178
+ V8_INLINE static LocalBase<T> New(Isolate* isolate, T* that) {
179
+ return LocalBase<T>::New(isolate,
180
+ internal::ValueHelper::ValueAsAddress(that));
181
+ }
182
+
183
+ V8_INLINE static LocalBase<T> FromSlot(internal::Address* slot) {
184
+ return LocalBase<T>(*slot);
185
+ }
186
+ };
187
+
188
+ #else // !V8_ENABLE_DIRECT_LOCAL
189
+
190
+ template <typename T>
191
+ class LocalBase : public api_internal::IndirectHandleBase {
192
+ protected:
193
+ template <class F>
194
+ friend class Local;
195
+
196
+ V8_INLINE LocalBase() = default;
197
+
198
+ V8_INLINE explicit LocalBase(internal::Address* location)
199
+ : IndirectHandleBase(location) {}
200
+
201
+ template <typename S>
202
+ V8_INLINE LocalBase(const LocalBase<S>& other) : IndirectHandleBase(other) {}
203
+
204
+ V8_INLINE static LocalBase<T> New(Isolate* isolate, internal::Address value) {
205
+ return LocalBase(HandleScope::CreateHandle(
206
+ reinterpret_cast<internal::Isolate*>(isolate), value));
207
+ }
208
+
209
+ V8_INLINE static LocalBase<T> New(Isolate* isolate, T* that) {
210
+ if (internal::ValueHelper::IsEmpty(that)) return LocalBase<T>();
211
+ return LocalBase<T>::New(isolate,
212
+ internal::ValueHelper::ValueAsAddress(that));
213
+ }
214
+
215
+ V8_INLINE static LocalBase<T> FromSlot(internal::Address* slot) {
216
+ return LocalBase<T>(slot);
217
+ }
218
+ };
219
+
220
+ #endif // V8_ENABLE_DIRECT_LOCAL
221
+
222
+ /**
223
+ * An object reference managed by the v8 garbage collector.
224
+ *
225
+ * All objects returned from v8 have to be tracked by the garbage collector so
226
+ * that it knows that the objects are still alive. Also, because the garbage
227
+ * collector may move objects, it is unsafe to point directly to an object.
228
+ * Instead, all objects are stored in handles which are known by the garbage
229
+ * collector and updated whenever an object moves. Handles should always be
230
+ * passed by value (except in cases like out-parameters) and they should never
231
+ * be allocated on the heap.
232
+ *
233
+ * There are two types of handles: local and persistent handles.
234
+ *
235
+ * Local handles are light-weight and transient and typically used in local
236
+ * operations. They are managed by HandleScopes. That means that a HandleScope
237
+ * must exist on the stack when they are created and that they are only valid
238
+ * inside of the HandleScope active during their creation. For passing a local
239
+ * handle to an outer HandleScope, an EscapableHandleScope and its Escape()
240
+ * method must be used.
241
+ *
242
+ * Persistent handles can be used when storing objects across several
243
+ * independent operations and have to be explicitly deallocated when they're no
244
+ * longer used.
245
+ *
246
+ * It is safe to extract the object stored in the handle by dereferencing the
247
+ * handle (for instance, to extract the Object* from a Local<Object>); the value
248
+ * will still be governed by a handle behind the scenes and the same rules apply
249
+ * to these values as to their handles.
250
+ */
251
+ template <class T>
252
+ class V8_TRIVIAL_ABI Local : public LocalBase<T>,
253
+ #ifdef V8_ENABLE_LOCAL_OFF_STACK_CHECK
254
+ public api_internal::StackAllocated<true>
255
+ #else
256
+ public api_internal::StackAllocated<false>
257
+ #endif
258
+ {
259
+ public:
260
+ V8_INLINE Local() = default;
261
+
262
+ template <class S>
263
+ V8_INLINE Local(Local<S> that) : LocalBase<T>(that) {
264
+ /**
265
+ * This check fails when trying to convert between incompatible
266
+ * handles. For example, converting from a Local<String> to a
267
+ * Local<Number>.
268
+ */
269
+ static_assert(std::is_base_of<T, S>::value, "type check");
270
+ }
271
+
272
+ V8_INLINE T* operator->() const { return this->template value<T>(); }
273
+
274
+ V8_INLINE T* operator*() const { return this->operator->(); }
275
+
276
+ /**
277
+ * Checks whether two handles are equal or different.
278
+ * They are equal iff they are both empty or they are both non-empty and the
279
+ * objects to which they refer are physically equal.
280
+ *
281
+ * If both handles refer to JS objects, this is the same as strict
282
+ * non-equality. For primitives, such as numbers or strings, a `true` return
283
+ * value does not indicate that the values aren't equal in the JavaScript
284
+ * sense. Use `Value::StrictEquals()` to check primitives for equality.
285
+ */
286
+
287
+ template <class S>
288
+ V8_INLINE bool operator==(const Local<S>& that) const {
289
+ return internal::HandleHelper::EqualHandles(*this, that);
290
+ }
291
+
292
+ template <class S>
293
+ V8_INLINE bool operator==(const PersistentBase<S>& that) const {
294
+ return internal::HandleHelper::EqualHandles(*this, that);
295
+ }
296
+
297
+ template <class S>
298
+ V8_INLINE bool operator!=(const Local<S>& that) const {
299
+ return !operator==(that);
300
+ }
301
+
302
+ template <class S>
303
+ V8_INLINE bool operator!=(const Persistent<S>& that) const {
304
+ return !operator==(that);
305
+ }
306
+
307
+ /**
308
+ * Cast a handle to a subclass, e.g. Local<Value> to Local<Object>.
309
+ * This is only valid if the handle actually refers to a value of the
310
+ * target type.
311
+ */
312
+ template <class S>
313
+ V8_INLINE static Local<T> Cast(Local<S> that) {
314
+ #ifdef V8_ENABLE_CHECKS
315
+ // If we're going to perform the type check then we have to check
316
+ // that the handle isn't empty before doing the checked cast.
317
+ if (that.IsEmpty()) return Local<T>();
318
+ T::Cast(that.template value<S>());
319
+ #endif
320
+ return Local<T>(LocalBase<T>(that));
321
+ }
322
+
323
+ /**
324
+ * Calling this is equivalent to Local<S>::Cast().
325
+ * In particular, this is only valid if the handle actually refers to a value
326
+ * of the target type.
327
+ */
328
+ template <class S>
329
+ V8_INLINE Local<S> As() const {
330
+ return Local<S>::Cast(*this);
331
+ }
332
+
333
+ /**
334
+ * Create a local handle for the content of another handle.
335
+ * The referee is kept alive by the local handle even when
336
+ * the original handle is destroyed/disposed.
337
+ */
338
+ V8_INLINE static Local<T> New(Isolate* isolate, Local<T> that) {
339
+ return New(isolate, that.template value<T, true>());
340
+ }
341
+
342
+ V8_INLINE static Local<T> New(Isolate* isolate,
343
+ const PersistentBase<T>& that) {
344
+ return New(isolate, that.template value<T, true>());
345
+ }
346
+
347
+ V8_INLINE static Local<T> New(Isolate* isolate,
348
+ const BasicTracedReference<T>& that) {
349
+ return New(isolate, that.template value<T, true>());
350
+ }
351
+
352
+ private:
353
+ friend class TracedReferenceBase;
354
+ friend class Utils;
355
+ template <class F>
356
+ friend class Eternal;
357
+ template <class F>
358
+ friend class Global;
359
+ template <class F>
360
+ friend class Local;
361
+ template <class F>
362
+ friend class MaybeLocal;
363
+ template <class F, class M>
364
+ friend class Persistent;
365
+ template <class F>
366
+ friend class FunctionCallbackInfo;
367
+ template <class F>
368
+ friend class PropertyCallbackInfo;
369
+ friend class String;
370
+ friend class Object;
371
+ friend class Context;
372
+ friend class Isolate;
373
+ friend class Private;
374
+ template <class F>
375
+ friend class internal::CustomArguments;
376
+ friend Local<Primitive> Undefined(Isolate* isolate);
377
+ friend Local<Primitive> Null(Isolate* isolate);
378
+ friend Local<Boolean> True(Isolate* isolate);
379
+ friend Local<Boolean> False(Isolate* isolate);
380
+ friend class HandleScope;
381
+ friend class EscapableHandleScope;
382
+ friend class InternalEscapableScope;
383
+ template <class F1, class F2, class F3>
384
+ friend class PersistentValueMapBase;
385
+ template <class F1, class F2>
386
+ friend class PersistentValueVector;
387
+ template <class F>
388
+ friend class ReturnValue;
389
+ template <class F>
390
+ friend class Traced;
391
+ friend class internal::SamplingHeapProfiler;
392
+ friend class internal::HandleHelper;
393
+ friend class debug::ConsoleCallArguments;
394
+ friend class internal::LocalUnchecked<T>;
395
+
396
+ explicit Local(no_checking_tag do_not_check)
397
+ : LocalBase<T>(), StackAllocated(do_not_check) {}
398
+ explicit Local(const Local<T>& other, no_checking_tag do_not_check)
399
+ : LocalBase<T>(other), StackAllocated(do_not_check) {}
400
+
401
+ V8_INLINE explicit Local(const LocalBase<T>& other) : LocalBase<T>(other) {}
402
+
403
+ V8_INLINE static Local<T> FromSlot(internal::Address* slot) {
404
+ return Local<T>(LocalBase<T>::FromSlot(slot));
405
+ }
406
+
407
+ #ifdef V8_ENABLE_DIRECT_LOCAL
408
+ friend class TypecheckWitness;
409
+
410
+ V8_INLINE static Local<T> FromAddress(internal::Address ptr) {
411
+ return Local<T>(LocalBase<T>(ptr));
412
+ }
413
+ #endif // V8_ENABLE_DIRECT_LOCAL
414
+
415
+ V8_INLINE static Local<T> New(Isolate* isolate, internal::Address value) {
416
+ return Local<T>(LocalBase<T>::New(isolate, value));
417
+ }
418
+
419
+ V8_INLINE static Local<T> New(Isolate* isolate, T* that) {
420
+ return Local<T>(LocalBase<T>::New(isolate, that));
421
+ }
422
+
423
+ // Unsafe cast, should be avoided.
424
+ template <class S>
425
+ V8_INLINE Local<S> UnsafeAs() const {
426
+ return Local<S>(LocalBase<S>(*this));
427
+ }
428
+ };
429
+
430
+ namespace internal {
431
+ // A local variant that is suitable for off-stack allocation.
432
+ // Used internally by LocalVector<T>. Not to be used directly!
433
+ template <typename T>
434
+ class V8_TRIVIAL_ABI LocalUnchecked : public Local<T> {
435
+ public:
436
+ LocalUnchecked() : Local<T>(Local<T>::do_not_check) {}
437
+
438
+ #if defined(V8_ENABLE_LOCAL_OFF_STACK_CHECK) && V8_HAS_ATTRIBUTE_TRIVIAL_ABI
439
+ // In this case, the check is also enforced in the copy constructor and we
440
+ // need to suppress it.
441
+ LocalUnchecked(const LocalUnchecked& other)
442
+ : Local<T>(other, Local<T>::do_not_check) {}
443
+ LocalUnchecked& operator=(const LocalUnchecked&) = default;
444
+ #endif
445
+
446
+ // Implicit conversion from Local.
447
+ LocalUnchecked(const Local<T>& other) // NOLINT(runtime/explicit)
448
+ : Local<T>(other, Local<T>::do_not_check) {}
449
+ };
450
+
451
+ #ifdef V8_ENABLE_DIRECT_LOCAL
452
+ // Off-stack allocated direct locals must be registered as strong roots.
453
+ // For off-stack indirect locals, this is not necessary.
454
+
455
+ template <typename T>
456
+ class StrongRootAllocator<LocalUnchecked<T>> : public StrongRootAllocatorBase {
457
+ public:
458
+ using value_type = LocalUnchecked<T>;
459
+ static_assert(std::is_standard_layout_v<value_type>);
460
+ static_assert(sizeof(value_type) == sizeof(Address));
461
+
462
+ explicit StrongRootAllocator(Heap* heap) : StrongRootAllocatorBase(heap) {}
463
+ explicit StrongRootAllocator(v8::Isolate* isolate)
464
+ : StrongRootAllocatorBase(isolate) {}
465
+ template <typename U>
466
+ StrongRootAllocator(const StrongRootAllocator<U>& other) noexcept
467
+ : StrongRootAllocatorBase(other) {}
468
+
469
+ value_type* allocate(size_t n) {
470
+ return reinterpret_cast<value_type*>(allocate_impl(n));
471
+ }
472
+ void deallocate(value_type* p, size_t n) noexcept {
473
+ return deallocate_impl(reinterpret_cast<Address*>(p), n);
474
+ }
475
+ };
476
+ #endif // V8_ENABLE_DIRECT_LOCAL
477
+ } // namespace internal
478
+
479
+ template <typename T>
480
+ class LocalVector {
481
+ private:
482
+ using element_type = internal::LocalUnchecked<T>;
483
+
484
+ #ifdef V8_ENABLE_DIRECT_LOCAL
485
+ using allocator_type = internal::StrongRootAllocator<element_type>;
486
+
487
+ static allocator_type make_allocator(Isolate* isolate) noexcept {
488
+ return allocator_type(isolate);
489
+ }
490
+ #else
491
+ using allocator_type = std::allocator<element_type>;
492
+
493
+ static allocator_type make_allocator(Isolate* isolate) noexcept {
494
+ return allocator_type();
495
+ }
496
+ #endif // V8_ENABLE_DIRECT_LOCAL
497
+
498
+ using vector_type = std::vector<element_type, allocator_type>;
499
+
500
+ public:
501
+ using value_type = Local<T>;
502
+ using reference = value_type&;
503
+ using const_reference = const value_type&;
504
+ using size_type = size_t;
505
+ using difference_type = ptrdiff_t;
506
+ using iterator =
507
+ internal::WrappedIterator<typename vector_type::iterator, Local<T>>;
508
+ using const_iterator =
509
+ internal::WrappedIterator<typename vector_type::const_iterator,
510
+ const Local<T>>;
511
+
512
+ explicit LocalVector(Isolate* isolate) : backing_(make_allocator(isolate)) {}
513
+ LocalVector(Isolate* isolate, size_t n)
514
+ : backing_(n, make_allocator(isolate)) {}
515
+ explicit LocalVector(Isolate* isolate, std::initializer_list<Local<T>> init)
516
+ : backing_(make_allocator(isolate)) {
517
+ if (init.size() == 0) return;
518
+ backing_.reserve(init.size());
519
+ backing_.insert(backing_.end(), init.begin(), init.end());
520
+ }
521
+
522
+ iterator begin() noexcept { return iterator(backing_.begin()); }
523
+ const_iterator begin() const noexcept {
524
+ return const_iterator(backing_.begin());
525
+ }
526
+ iterator end() noexcept { return iterator(backing_.end()); }
527
+ const_iterator end() const noexcept { return const_iterator(backing_.end()); }
528
+
529
+ size_t size() const noexcept { return backing_.size(); }
530
+ bool empty() const noexcept { return backing_.empty(); }
531
+ void reserve(size_t n) { backing_.reserve(n); }
532
+ void shrink_to_fit() { backing_.shrink_to_fit(); }
533
+
534
+ Local<T>& operator[](size_t n) { return backing_[n]; }
535
+ const Local<T>& operator[](size_t n) const { return backing_[n]; }
536
+
537
+ Local<T>& at(size_t n) { return backing_.at(n); }
538
+ const Local<T>& at(size_t n) const { return backing_.at(n); }
539
+
540
+ Local<T>& front() { return backing_.front(); }
541
+ const Local<T>& front() const { return backing_.front(); }
542
+ Local<T>& back() { return backing_.back(); }
543
+ const Local<T>& back() const { return backing_.back(); }
544
+
545
+ Local<T>* data() noexcept { return backing_.data(); }
546
+ const Local<T>* data() const noexcept { return backing_.data(); }
547
+
548
+ iterator insert(const_iterator pos, const Local<T>& value) {
549
+ return iterator(backing_.insert(pos.base(), value));
550
+ }
551
+
552
+ template <typename InputIt>
553
+ iterator insert(const_iterator pos, InputIt first, InputIt last) {
554
+ return iterator(backing_.insert(pos.base(), first, last));
555
+ }
556
+
557
+ iterator insert(const_iterator pos, std::initializer_list<Local<T>> init) {
558
+ return iterator(backing_.insert(pos.base(), init.begin(), init.end()));
559
+ }
560
+
561
+ LocalVector<T>& operator=(std::initializer_list<Local<T>> init) {
562
+ backing_.clear();
563
+ backing_.insert(backing_.end(), init.begin(), init.end());
564
+ return *this;
565
+ }
566
+
567
+ void push_back(const Local<T>& x) { backing_.push_back(x); }
568
+ void pop_back() { backing_.pop_back(); }
569
+ void emplace_back(const Local<T>& x) { backing_.emplace_back(x); }
570
+
571
+ void clear() noexcept { backing_.clear(); }
572
+ void resize(size_t n) { backing_.resize(n); }
573
+ void swap(LocalVector<T>& other) { backing_.swap(other.backing_); }
574
+
575
+ friend bool operator==(const LocalVector<T>& x, const LocalVector<T>& y) {
576
+ return x.backing_ == y.backing_;
577
+ }
578
+ friend bool operator!=(const LocalVector<T>& x, const LocalVector<T>& y) {
579
+ return x.backing_ != y.backing_;
580
+ }
581
+ friend bool operator<(const LocalVector<T>& x, const LocalVector<T>& y) {
582
+ return x.backing_ < y.backing_;
583
+ }
584
+ friend bool operator>(const LocalVector<T>& x, const LocalVector<T>& y) {
585
+ return x.backing_ > y.backing_;
586
+ }
587
+ friend bool operator<=(const LocalVector<T>& x, const LocalVector<T>& y) {
588
+ return x.backing_ <= y.backing_;
589
+ }
590
+ friend bool operator>=(const LocalVector<T>& x, const LocalVector<T>& y) {
591
+ return x.backing_ >= y.backing_;
592
+ }
593
+
594
+ private:
595
+ vector_type backing_;
596
+ };
597
+
598
+ #if !defined(V8_IMMINENT_DEPRECATION_WARNINGS)
599
+ // Handle is an alias for Local for historical reasons.
600
+ template <class T>
601
+ using Handle = Local<T>;
602
+ #endif
603
+
604
+ /**
605
+ * A MaybeLocal<> is a wrapper around Local<> that enforces a check whether
606
+ * the Local<> is empty before it can be used.
607
+ *
608
+ * If an API method returns a MaybeLocal<>, the API method can potentially fail
609
+ * either because an exception is thrown, or because an exception is pending,
610
+ * e.g. because a previous API call threw an exception that hasn't been caught
611
+ * yet, or because a TerminateExecution exception was thrown. In that case, an
612
+ * empty MaybeLocal is returned.
613
+ */
614
+ template <class T>
615
+ class MaybeLocal {
616
+ public:
617
+ V8_INLINE MaybeLocal() : local_() {}
618
+ template <class S>
619
+ V8_INLINE MaybeLocal(Local<S> that) : local_(that) {}
620
+
621
+ V8_INLINE bool IsEmpty() const { return local_.IsEmpty(); }
622
+
623
+ /**
624
+ * Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
625
+ * |false| is returned and |out| is assigned with nullptr.
626
+ */
627
+ template <class S>
628
+ V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local<S>* out) const {
629
+ *out = local_;
630
+ return !IsEmpty();
631
+ }
632
+
633
+ /**
634
+ * Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
635
+ * V8 will crash the process.
636
+ */
637
+ V8_INLINE Local<T> ToLocalChecked() {
638
+ if (V8_UNLIKELY(IsEmpty())) api_internal::ToLocalEmpty();
639
+ return local_;
640
+ }
641
+
642
+ /**
643
+ * Converts this MaybeLocal<> to a Local<>, using a default value if this
644
+ * MaybeLocal<> is empty.
645
+ */
646
+ template <class S>
647
+ V8_INLINE Local<S> FromMaybe(Local<S> default_value) const {
648
+ return IsEmpty() ? default_value : Local<S>(local_);
649
+ }
650
+
651
+ /**
652
+ * Cast a handle to a subclass, e.g. MaybeLocal<Value> to MaybeLocal<Object>.
653
+ * This is only valid if the handle actually refers to a value of the target
654
+ * type.
655
+ */
656
+ template <class S>
657
+ V8_INLINE static MaybeLocal<T> Cast(MaybeLocal<S> that) {
658
+ #ifdef V8_ENABLE_CHECKS
659
+ // If we're going to perform the type check then we have to check
660
+ // that the handle isn't empty before doing the checked cast.
661
+ if (that.IsEmpty()) return MaybeLocal<T>();
662
+ T::Cast(that.local_.template value<S>());
663
+ #endif
664
+ return MaybeLocal<T>(that.local_);
665
+ }
666
+
667
+ /**
668
+ * Calling this is equivalent to MaybeLocal<S>::Cast().
669
+ * In particular, this is only valid if the handle actually refers to a value
670
+ * of the target type.
671
+ */
672
+ template <class S>
673
+ V8_INLINE MaybeLocal<S> As() const {
674
+ return MaybeLocal<S>::Cast(*this);
675
+ }
676
+
677
+ private:
678
+ Local<T> local_;
679
+
680
+ template <typename S>
681
+ friend class MaybeLocal;
682
+ };
683
+
684
+ /**
685
+ * A HandleScope which first allocates a handle in the current scope
686
+ * which will be later filled with the escape value.
687
+ */
688
+ class V8_EXPORT V8_NODISCARD EscapableHandleScopeBase : public HandleScope {
689
+ public:
690
+ explicit EscapableHandleScopeBase(Isolate* isolate);
691
+ V8_INLINE ~EscapableHandleScopeBase() = default;
692
+
693
+ EscapableHandleScopeBase(const EscapableHandleScopeBase&) = delete;
694
+ void operator=(const EscapableHandleScopeBase&) = delete;
695
+ void* operator new(size_t size) = delete;
696
+ void* operator new[](size_t size) = delete;
697
+ void operator delete(void*, size_t) = delete;
698
+ void operator delete[](void*, size_t) = delete;
699
+
700
+ protected:
701
+ /**
702
+ * Pushes the value into the previous scope and returns a handle to it.
703
+ * Cannot be called twice.
704
+ */
705
+ internal::Address* EscapeSlot(internal::Address* escape_value);
706
+
707
+ private:
708
+ internal::Address* escape_slot_;
709
+ };
710
+
711
+ class V8_EXPORT V8_NODISCARD EscapableHandleScope
712
+ : public EscapableHandleScopeBase {
713
+ public:
714
+ explicit EscapableHandleScope(Isolate* isolate)
715
+ : EscapableHandleScopeBase(isolate) {}
716
+ V8_INLINE ~EscapableHandleScope() = default;
717
+ template <class T>
718
+ V8_INLINE Local<T> Escape(Local<T> value) {
719
+ #ifdef V8_ENABLE_DIRECT_LOCAL
720
+ return value;
721
+ #else
722
+ if (value.IsEmpty()) return value;
723
+ return Local<T>::FromSlot(EscapeSlot(value.slot()));
724
+ #endif
725
+ }
726
+
727
+ template <class T>
728
+ V8_INLINE MaybeLocal<T> EscapeMaybe(MaybeLocal<T> value) {
729
+ return Escape(value.FromMaybe(Local<T>()));
730
+ }
731
+ };
732
+
733
+ /**
734
+ * A SealHandleScope acts like a handle scope in which no handle allocations
735
+ * are allowed. It can be useful for debugging handle leaks.
736
+ * Handles can be allocated within inner normal HandleScopes.
737
+ */
738
+ class V8_EXPORT V8_NODISCARD SealHandleScope {
739
+ public:
740
+ explicit SealHandleScope(Isolate* isolate);
741
+ ~SealHandleScope();
742
+
743
+ SealHandleScope(const SealHandleScope&) = delete;
744
+ void operator=(const SealHandleScope&) = delete;
745
+ void* operator new(size_t size) = delete;
746
+ void* operator new[](size_t size) = delete;
747
+ void operator delete(void*, size_t) = delete;
748
+ void operator delete[](void*, size_t) = delete;
749
+
750
+ private:
751
+ internal::Isolate* const i_isolate_;
752
+ internal::Address* prev_limit_;
753
+ int prev_sealed_level_;
754
+ };
755
+
756
+ } // namespace v8
757
+
758
+ #endif // INCLUDE_V8_LOCAL_HANDLE_H_