From 12c7930774ce2ca69ae423ef0512404aac506811 Mon Sep 17 00:00:00 2001 From: Sam Cao Date: Mon, 13 Sep 2021 09:46:25 +0800 Subject: [PATCH] Javet v0.9.12 (#88) * Added error code 503 * Enhanced `V8Property` to support built-in symbols * Added `V8ValueSharedArrayBuffer` * Added `registerCustomObject()` and `unregisterCustomObject()` to `JavetObjectConverter` * Added private property support to `IV8ValueObject` * Fixed potential core dump issue in V8 runtime close. * Added Javadoc. --- .github/workflows/linux_build.yml | 4 +- .idea/codeStyles/Project.xml | 298 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/copyright/Apache_License_2_0.xml | 6 + .idea/copyright/profiles_settings.xml | 7 + README.rst | 32 +- build.gradle.kts | 2 +- cpp/build-linux.sh | 2 +- cpp/build-macos.sh | 2 +- cpp/build-windows.cmd | 2 +- .../com_caoccao_javet_interop_V8Native.cpp | 64 +- cpp/jni/com_caoccao_javet_interop_V8Native.h | 32 + cpp/jni/javet_callbacks.cpp | 283 +- cpp/jni/javet_converter.cpp | 15 +- cpp/jni/javet_converter.h | 4 + cpp/jni/javet_enums.h | 23 +- cpp/jni/javet_resource_node.rc | 12 +- cpp/jni/javet_resource_v8.rc | 12 +- docs/.nojekyll | 0 .../_images/chome_developer_tools_console.png | Bin 0 -> 31552 bytes ...oper_tools_devices_remote_target_javet.png | Bin 0 -> 42240 bytes docs/_images/javet_architecture.png | Bin 0 -> 156650 bytes docs/_images/javet_cross_platform.png | Bin 0 -> 69645 bytes docs/_images/javet_engine_pool.png | Bin 0 -> 189318 bytes docs/_images/javet_interception.png | Bin 0 -> 51754 bytes .../javet_memory_management_passive_gc.png | Bin 0 -> 28083 bytes docs/_images/javet_modes.png | Bin 0 -> 95301 bytes docs/_images/javet_module_system.png | Bin 0 -> 49159 bytes docs/_images/lifecycle_of_v8_function.png | Bin 0 -> 63854 bytes docs/_images/memory_layout_of_v8_function.png | Bin 0 -> 75895 bytes docs/_images/v8_promise_and_resolver.png | Bin 0 -> 24662 bytes docs/_images/v8_promise_lifecycle.png | Bin 0 -> 40832 bytes docs/_sources/development/build.rst.txt | 18 + .../build_javet_from_scratch.rst.txt | 153 + .../build_javet_with_docker.rst.txt | 64 + ...uild_javet_with_pre_built_binaries.rst.txt | 83 + .../debug_with_chrome_developer_tools.rst.txt | 94 + docs/_sources/development/design.rst.txt | 150 + docs/_sources/development/index.rst.txt | 12 + docs/_sources/development/test.rst.txt | 7 + docs/_sources/development/tools.rst.txt | 38 + .../faq/background/history_with_j2v8.rst.txt | 65 + docs/_sources/faq/background/index.rst.txt | 9 + .../background/what_is_the_motivation.rst.txt | 11 + .../development/how_to_think_in_javet.rst.txt | 46 + docs/_sources/faq/development/index.rst.txt | 9 + .../where_are_es6_api_in_v8_mode.rst.txt | 7 + .../can_javet_support_legacy_linux.rst.txt | 37 + .../environment/can_javet_support_mac.rst.txt | 43 + docs/_sources/faq/environment/index.rst.txt | 9 + docs/_sources/faq/index.rst.txt | 11 + ..._dll_initialization_routine_failed.rst.txt | 5 + ..._i_debug_javet_in_chrome_dev_tools.rst.txt | 8 + .../faq/troubleshooting/index.rst.txt | 10 + ..._node_js_crashes_when_being_closed.rst.txt | 50 + docs/_sources/index.rst.txt | 10 + .../_sources/reference/best_practices.rst.txt | 46 + docs/_sources/reference/error_codes.rst.txt | 59 + docs/_sources/reference/index.rst.txt | 21 + docs/_sources/reference/javadoc/index.rst.txt | 3 + .../reference/load_and_unload.rst.txt | 45 + docs/_sources/reference/lock.rst.txt | 43 + docs/_sources/reference/logging.rst.txt | 77 + .../reference/memory_management.rst.txt | 157 + .../_sources/reference/modularization.rst.txt | 204 + docs/_sources/reference/performance.rst.txt | 39 + docs/_sources/reference/termination.rst.txt | 73 + docs/_sources/reference/todo_list.rst.txt | 7 + docs/_sources/reference/v8_collection.rst.txt | 80 + docs/_sources/reference/v8_function.rst.txt | 490 + docs/_sources/reference/v8_promise.rst.txt | 97 + docs/_sources/release_notes/index.rst.txt | 10 + .../release_notes/release_notes_0_7.rst.txt | 44 + .../release_notes/release_notes_0_8.rst.txt | 89 + .../release_notes/release_notes_0_9.rst.txt | 110 + docs/_sources/tutorial/advanced/index.rst.txt | 10 + .../advanced/interact_with_node_js.rst.txt | 138 + .../java_and_javascript_interop.rst.txt | 83 + .../advanced/object_converter.rst.txt | 568 + .../tutorial/basic/engine_pool.rst.txt | 46 + .../tutorial/basic/hello_javet.rst.txt | 29 + docs/_sources/tutorial/basic/index.rst.txt | 15 + .../tutorial/basic/installation.rst.txt | 58 + .../tutorial/basic/interception.rst.txt | 110 + .../tutorial/basic/javet_shell.rst.txt | 47 + .../basic/node_js_mode_and_v8_mode.rst.txt | 55 + docs/_sources/tutorial/basic/polyfill.rst.txt | 56 + .../tutorial/basic/spring_integration.rst.txt | 64 + docs/_sources/tutorial/index.rst.txt | 10 + .../tutorial/migration_guides/index.rst.txt | 8 + .../migrate_from_j2v8.rst.txt | 77 + docs/_static/basic.css | 904 ++ docs/_static/css/custom.css | 7 + docs/_static/doctools.js | 323 + docs/_static/documentation_options.js | 12 + docs/_static/file.png | Bin 0 -> 286 bytes .../images/chome_developer_tools_console.png | Bin 0 -> 31552 bytes ...oper_tools_devices_remote_target_javet.png | Bin 0 -> 42240 bytes docs/_static/images/javet_architecture.drawio | 1 + docs/_static/images/javet_architecture.png | Bin 0 -> 156650 bytes docs/_static/images/javet_cross_platform.png | Bin 0 -> 69645 bytes docs/_static/images/javet_engine_pool.png | Bin 0 -> 189318 bytes docs/_static/images/javet_interception.png | Bin 0 -> 51754 bytes .../javet_memory_management_passive_gc.png | Bin 0 -> 28083 bytes docs/_static/images/javet_modes.png | Bin 0 -> 95301 bytes .../_static/images/javet_module_system.drawio | 1 + docs/_static/images/javet_module_system.png | Bin 0 -> 49159 bytes .../images/lifecycle_of_v8_function.png | Bin 0 -> 63854 bytes docs/_static/images/logo.drawio | 1 + docs/_static/images/logo.ico | Bin 0 -> 1150 bytes docs/_static/images/logo.png | Bin 0 -> 1289 bytes .../images/memory_layout_of_v8_function.png | Bin 0 -> 75895 bytes .../images/v8_promise_and_resolver.png | Bin 0 -> 24662 bytes docs/_static/images/v8_promise_lifecycle.png | Bin 0 -> 40832 bytes docs/_static/jquery-3.5.1.js | 10872 ++++++++++++++++ docs/_static/jquery.js | 2 + docs/_static/language_data.js | 297 + docs/_static/logo.ico | Bin 0 -> 1150 bytes docs/_static/logo.png | Bin 0 -> 1289 bytes docs/_static/minus.png | Bin 0 -> 90 bytes docs/_static/plus.png | Bin 0 -> 90 bytes docs/_static/pygments.css | 243 + docs/_static/scripts/main.js | 3 + docs/_static/scripts/main.js.map | 1 + docs/_static/searchtools.js | 528 + docs/_static/styles/furo-extensions.css | 2 + docs/_static/styles/furo-extensions.css.map | 1 + docs/_static/styles/furo.css | 2 + docs/_static/styles/furo.css.map | 1 + docs/_static/tabs.css | 101 + docs/_static/tabs.js | 22 + docs/_static/underscore-1.13.1.js | 2042 +++ docs/_static/underscore.js | 6 + docs/conf.py | 89 + docs/development/build.html | 344 + docs/development/build.rst | 9 +- .../development/build_javet_from_scratch.html | 512 + docs/development/build_javet_from_scratch.rst | 4 +- docs/development/build_javet_with_docker.html | 420 + docs/development/build_javet_with_docker.rst | 2 - .../build_javet_with_pre_built_binaries.html | 473 + .../build_javet_with_pre_built_binaries.rst | 6 +- .../debug_with_chrome_developer_tools.html | 434 + .../debug_with_chrome_developer_tools.rst | 10 +- docs/development/design.html | 567 + docs/development/design.rst | 20 +- docs/development/index.html | 367 + docs/development/index.rst | 20 +- docs/development/test.html | 332 + docs/development/test.rst | 2 - docs/development/tools.html | 383 + docs/development/tools.rst | 4 +- docs/faq/background/history_with_j2v8.html | 431 + .../{ => background}/history_with_j2v8.rst | 2 - docs/faq/background/index.html | 336 + docs/faq/background/index.rst | 9 + .../background/what_is_the_motivation.html | 334 + .../what_is_the_motivation.rst | 4 +- .../can_i_debug_javet_in_chrome_dev_tools.rst | 10 - .../development/how_to_think_in_javet.html | 389 + .../how_to_think_in_javet.rst | 24 +- docs/faq/development/index.html | 336 + docs/faq/development/index.rst | 9 + .../where_are_es6_api_in_v8_mode.html | 332 + .../where_are_es6_api_in_v8_mode.rst | 2 - .../can_javet_support_legacy_linux.html | 379 + .../can_javet_support_legacy_linux.rst | 2 - .../environment/can_javet_support_mac.html | 388 + .../can_javet_support_mac.rst | 4 +- docs/faq/environment/index.html | 336 + docs/faq/environment/index.rst | 9 + docs/faq/index.html | 355 + docs/faq/index.rst | 30 +- ...ary_dll_initialization_routine_failed.html | 331 + ...rary_dll_initialization_routine_failed.rst | 4 +- ...can_i_debug_javet_in_chrome_dev_tools.html | 332 + .../can_i_debug_javet_in_chrome_dev_tools.rst | 8 + docs/faq/troubleshooting/index.html | 337 + docs/faq/troubleshooting/index.rst | 10 + ...why_node_js_crashes_when_being_closed.html | 395 + .../why_node_js_crashes_when_being_closed.rst | 50 + docs/genindex.html | 309 + docs/index.html | 546 +- docs/index.rst | 10 + docs/make.bat | 35 + docs/publish.cmd | 5 + docs/reference/best_practices.html | 405 + docs/reference/best_practices.rst | 2 - docs/reference/error_codes.html | 525 + docs/reference/error_codes.rst | 5 +- docs/reference/index.html | 348 + docs/reference/index.rst | 35 +- docs/reference/javadoc/allclasses-frame.html | 174 + .../reference/javadoc/allclasses-noframe.html | 174 + .../javet/annotations/CheckReturnValue.html | 169 + .../caoccao/javet/annotations/NodeModule.html | 229 + .../javet/annotations/V8BindEnabler.html | 168 + .../caoccao/javet/annotations/V8Function.html | 258 + .../caoccao/javet/annotations/V8Property.html | 287 + .../javet/annotations/V8RuntimeSetter.html | 168 + .../javet/annotations/package-frame.html | 24 + .../javet/annotations/package-summary.html | 184 + .../javet/annotations/package-tree.html | 135 + .../javet/entities/JavetEntityFunction.html | 449 + .../javet/entities/JavetEntityMap.html | 411 + .../javet/entities/JavetEntitySymbol.html | 335 + .../caoccao/javet/entities/package-frame.html | 21 + .../javet/entities/package-summary.html | 169 + .../caoccao/javet/entities/package-tree.html | 144 + .../caoccao/javet/enums/JSFunctionType.html | 440 + .../caoccao/javet/enums/JSRuntimeType.html | 390 + .../com/caoccao/javet/enums/JSScopeType.html | 565 + .../caoccao/javet/enums/JavetErrorType.html | 471 + .../javet/enums/JavetPromiseRejectEvent.html | 437 + .../javet/enums/V8ValueReferenceType.html | 737 ++ .../javet/enums/V8ValueSymbolType.html | 350 + .../caoccao/javet/enums/package-frame.html | 25 + .../caoccao/javet/enums/package-summary.html | 180 + .../com/caoccao/javet/enums/package-tree.html | 144 + .../BaseJavetScriptingException.html | 370 + .../exceptions/JavetCompilationException.html | 319 + .../exceptions/JavetConverterException.html | 362 + .../caoccao/javet/exceptions/JavetError.html | 1103 ++ .../javet/exceptions/JavetException.html | 403 + .../exceptions/JavetExecutionException.html | 319 + .../javet/exceptions/JavetScriptingError.html | 494 + .../exceptions/JavetTerminatedException.html | 348 + .../javet/exceptions/package-frame.html | 29 + .../javet/exceptions/package-summary.html | 193 + .../javet/exceptions/package-tree.html | 155 + .../interception/BaseJavetInterceptor.html | 369 + .../logging/BaseJavetConsoleInterceptor.html | 874 ++ .../JavetStandardConsoleInterceptor.html | 856 ++ .../interception/logging/package-frame.html | 20 + .../interception/logging/package-summary.html | 160 + .../interception/logging/package-tree.html | 142 + .../javet/interception/package-frame.html | 19 + .../javet/interception/package-summary.html | 152 + .../javet/interception/package-tree.html | 134 + .../javet/interfaces/IJavetBiConsumer.html | 249 + .../interfaces/IJavetBiIndexedConsumer.html | 252 + .../javet/interfaces/IJavetClosable.html | 265 + .../interfaces/IJavetEntityFunction.html | 302 + .../javet/interfaces/IJavetEntityMap.html | 214 + .../javet/interfaces/IJavetInterceptor.html | 268 + .../javet/interfaces/IJavetLogger.html | 455 + .../IJavetPromiseRejectCallback.html | 242 + .../javet/interfaces/IJavetResettable.html | 233 + .../javet/interfaces/IJavetSupplier.html | 230 + .../javet/interfaces/IJavetUniConsumer.html | 245 + .../interfaces/IJavetUniIndexedConsumer.html | 248 + .../javet/interfaces/IV8ModuleResolver.html | 243 + .../javet/interfaces/package-frame.html | 31 + .../javet/interfaces/package-summary.html | 224 + .../javet/interfaces/package-tree.html | 150 + .../caoccao/javet/interop/INodeNative.html | 190 + .../caoccao/javet/interop/IV8Cloneable.html | 232 + .../caoccao/javet/interop/IV8Convertible.html | 310 + .../caoccao/javet/interop/IV8Creatable.html | 631 + .../caoccao/javet/interop/IV8Executable.html | 490 + .../javet/interop/IV8InspectorListener.html | 270 + .../com/caoccao/javet/interop/IV8Native.html | 1663 +++ .../caoccao/javet/interop/JavetLibLoader.html | 319 + .../caoccao/javet/interop/NodeRuntime.html | 467 + .../com/caoccao/javet/interop/V8Flags.html | 377 + .../com/caoccao/javet/interop/V8Host.html | 891 ++ .../caoccao/javet/interop/V8Inspector.html | 356 + .../com/caoccao/javet/interop/V8Locker.html | 299 + .../com/caoccao/javet/interop/V8Notifier.html | 305 + .../com/caoccao/javet/interop/V8Runtime.html | 3330 +++++ .../caoccao/javet/interop/V8ScriptOrigin.html | 475 + .../javet/interop/binding/BindingContext.html | 544 + .../interop/binding/MethodDescriptor.html | 448 + .../javet/interop/binding/package-frame.html | 20 + .../interop/binding/package-summary.html | 160 + .../javet/interop/binding/package-tree.html | 135 + .../callback/JavetCallbackContext.html | 496 + .../interop/callback/V8FunctionCallback.html | 296 + .../javet/interop/callback/package-frame.html | 20 + .../interop/callback/package-summary.html | 160 + .../javet/interop/callback/package-tree.html | 135 + .../interop/converters/IJavetConverter.html | 332 + .../converters/JavetConverterConfig.html | 1174 ++ .../converters/JavetObjectConverter.html | 752 ++ .../converters/JavetPrimitiveConverter.html | 530 + .../converters/JavetProxyConverter.html | 398 + .../interop/converters/package-frame.html | 26 + .../interop/converters/package-summary.html | 189 + .../interop/converters/package-tree.html | 147 + .../javet/interop/engine/IJavetEngine.html | 342 + .../interop/engine/IJavetEngineGuard.html | 326 + .../interop/engine/IJavetEnginePool.html | 318 + .../javet/interop/engine/JavetEngine.html | 608 + .../interop/engine/JavetEngineConfig.html | 830 ++ .../interop/engine/JavetEngineGuard.html | 678 + .../javet/interop/engine/JavetEnginePool.html | 753 ++ .../interop/engine/JavetEngineUsage.html | 369 + .../javet/interop/engine/package-frame.html | 29 + .../javet/interop/engine/package-summary.html | 197 + .../javet/interop/engine/package-tree.html | 157 + .../interop/executors/BaseV8Executor.html | 461 + .../javet/interop/executors/IV8Executor.html | 509 + .../interop/executors/V8PathExecutor.html | 396 + .../interop/executors/V8StringExecutor.html | 454 + .../interop/executors/package-frame.html | 25 + .../interop/executors/package-summary.html | 175 + .../javet/interop/executors/package-tree.html | 154 + .../caoccao/javet/interop/package-frame.html | 37 + .../javet/interop/package-summary.html | 233 + .../caoccao/javet/interop/package-tree.html | 161 + .../interop/proxy/BaseJavetProxyHandler.html | 402 + ...ProxyV8ValueFunctionInvocationHandler.html | 339 + ...icProxyV8ValueObjectInvocationHandler.html | 339 + .../interop/proxy/IJavetProxyHandler.html | 545 + ...roxyHandler.JavetUniversalInterceptor.html | 397 + ...niversalProxyHandler.ScoredExecutable.html | 358 + .../proxy/JavetUniversalProxyHandler.html | 1237 ++ .../javet/interop/proxy/package-frame.html | 28 + .../javet/interop/proxy/package-summary.html | 201 + .../javet/interop/proxy/package-tree.html | 146 + .../javet/node/modules/BaseNodeModule.html | 394 + .../javet/node/modules/INodeModule.html | 247 + .../javet/node/modules/NodeModuleAny.html | 267 + .../javet/node/modules/NodeModuleModule.html | 356 + .../javet/node/modules/NodeModuleProcess.html | 446 + .../javet/node/modules/package-frame.html | 26 + .../javet/node/modules/package-summary.html | 179 + .../javet/node/modules/package-tree.html | 152 + .../javet/utils/JavetDateTimeUtils.html | 330 + .../javet/utils/JavetDefaultLogger.html | 460 + .../com/caoccao/javet/utils/JavetOSUtils.html | 361 + .../javet/utils/JavetPrimitiveUtils.html | 270 + .../utils/JavetPromiseRejectCallback.html | 325 + .../javet/utils/JavetReflectionUtils.html | 248 + .../javet/utils/JavetResourceUtils.html | 321 + .../javet/utils/JavetVirtualObject.html | 421 + .../javet/utils/SimpleFreeMarkerFormat.html | 310 + .../com/caoccao/javet/utils/SimpleMap.html | 504 + .../com/caoccao/javet/utils/V8ValueUtils.html | 312 + .../caoccao/javet/utils/package-frame.html | 29 + .../caoccao/javet/utils/package-summary.html | 204 + .../com/caoccao/javet/utils/package-tree.html | 144 + .../receivers/IJavetCallbackReceiver.html | 416 + .../receivers/JavetCallbackReceiver.html | 472 + .../javet/utils/receivers/package-frame.html | 23 + .../utils/receivers/package-summary.html | 171 + .../javet/utils/receivers/package-tree.html | 138 + .../com/caoccao/javet/values/IV8Value.html | 417 + .../com/caoccao/javet/values/V8Data.html | 238 + .../com/caoccao/javet/values/V8Value.html | 537 + .../caoccao/javet/values/package-frame.html | 24 + .../caoccao/javet/values/package-summary.html | 173 + .../caoccao/javet/values/package-tree.html | 155 + .../values/primitive/V8ValueBoolean.html | 364 + .../javet/values/primitive/V8ValueDouble.html | 403 + .../values/primitive/V8ValueInteger.html | 364 + .../javet/values/primitive/V8ValueLong.html | 376 + .../javet/values/primitive/V8ValueNull.html | 477 + .../values/primitive/V8ValuePrimitive.html | 511 + .../javet/values/primitive/V8ValueString.html | 364 + .../values/primitive/V8ValueUndefined.html | 480 + .../values/primitive/V8ValueUnknown.html | 351 + .../primitive/V8ValueZonedDateTime.html | 376 + .../javet/values/primitive/package-frame.html | 28 + .../values/primitive/package-summary.html | 188 + .../javet/values/primitive/package-tree.html | 154 + .../javet/values/reference/IV8Module.html | 624 + .../javet/values/reference/IV8Script.html | 350 + .../javet/values/reference/IV8ValueArray.html | 558 + .../values/reference/IV8ValueFunction.html | 840 ++ .../values/reference/IV8ValueIterator.html | 246 + .../reference/IV8ValueKeyContainer.html | 290 + .../javet/values/reference/IV8ValueMap.html | 294 + .../values/reference/IV8ValueObject.html | 2855 ++++ .../values/reference/IV8ValuePromise.html | 1036 ++ .../javet/values/reference/IV8ValueProxy.html | 354 + .../values/reference/IV8ValueReference.html | 378 + .../javet/values/reference/IV8ValueSet.html | 329 + .../values/reference/IV8ValueTypedArray.html | 348 + .../javet/values/reference/V8Module.html | 618 + .../javet/values/reference/V8Script.html | 487 + .../values/reference/V8ValueArguments.html | 375 + .../javet/values/reference/V8ValueArray.html | 652 + .../values/reference/V8ValueArrayBuffer.html | 675 + .../values/reference/V8ValueDataView.html | 1120 ++ .../javet/values/reference/V8ValueError.html | 434 + .../values/reference/V8ValueFunction.html | 699 + .../values/reference/V8ValueGlobalObject.html | 619 + .../values/reference/V8ValueIterator.html | 440 + .../javet/values/reference/V8ValueMap.html | 645 + .../javet/values/reference/V8ValueObject.html | 1592 +++ .../values/reference/V8ValuePromise.html | 617 + .../javet/values/reference/V8ValueProxy.html | 457 + .../values/reference/V8ValueReference.html | 729 ++ .../javet/values/reference/V8ValueRegExp.html | 349 + .../javet/values/reference/V8ValueSet.html | 560 + .../reference/V8ValueSharedArrayBuffer.html | 368 + .../javet/values/reference/V8ValueSymbol.html | 459 + .../values/reference/V8ValueSymbolObject.html | 437 + .../values/reference/V8ValueTypedArray.html | 1026 ++ .../values/reference/V8ValueWeakMap.html | 510 + .../values/reference/V8ValueWeakSet.html | 443 + .../reference/builtin/V8ValueBuiltInJson.html | 429 + .../builtin/V8ValueBuiltInObject.html | 511 + .../builtin/V8ValueBuiltInPromise.html | 744 ++ .../builtin/V8ValueBuiltInSymbol.html | 1009 ++ .../reference/builtin/package-frame.html | 22 + .../reference/builtin/package-summary.html | 166 + .../reference/builtin/package-tree.html | 157 + .../javet/values/reference/package-frame.html | 57 + .../values/reference/package-summary.html | 325 + .../javet/values/reference/package-tree.html | 255 + .../javet/values/virtual/V8VirtualValue.html | 414 + .../values/virtual/V8VirtualValueList.html | 410 + .../javet/values/virtual/package-frame.html | 20 + .../javet/values/virtual/package-summary.html | 160 + .../javet/values/virtual/package-tree.html | 135 + docs/reference/javadoc/constant-values.html | 1850 +++ docs/reference/javadoc/deprecated-list.html | 121 + docs/reference/javadoc/help-doc.html | 222 + docs/reference/javadoc/index-all.html | 5428 ++++++++ docs/reference/javadoc/index.html | 75 + docs/reference/javadoc/index.rst | 3 + docs/reference/javadoc/overview-frame.html | 41 + docs/reference/javadoc/overview-summary.html | 263 + docs/reference/javadoc/overview-tree.html | 704 + docs/reference/javadoc/package-list | 22 + docs/reference/javadoc/script.js | 30 + docs/reference/javadoc/serialized-form.html | 206 + docs/reference/javadoc/stylesheet.css | 574 + docs/reference/load_and_unload.html | 391 + docs/reference/load_and_unload.rst | 4 +- docs/reference/lock.html | 389 + docs/reference/lock.rst | 4 +- docs/reference/logging.html | 419 + docs/reference/logging.rst | 2 - docs/reference/memory_management.html | 580 + docs/reference/memory_management.rst | 22 +- docs/reference/modularization.html | 566 + docs/reference/modularization.rst | 8 +- docs/reference/performance.html | 429 + docs/reference/performance.rst | 2 - docs/reference/termination.html | 413 + docs/reference/termination.rst | 4 +- docs/reference/todo_list.html | 335 + docs/{ => reference}/todo_list.rst | 2 - docs/reference/v8_collection.html | 520 + docs/reference/v8_collection.rst | 2 - docs/reference/v8_function.html | 848 ++ docs/reference/v8_function.rst | 43 +- docs/reference/v8_promise.html | 432 + docs/reference/v8_promise.rst | 8 +- docs/release_notes.rst | 228 - docs/release_notes/index.html | 337 + docs/release_notes/index.rst | 10 + docs/release_notes/release_notes_0_7.html | 399 + docs/release_notes/release_notes_0_7.rst | 44 + docs/release_notes/release_notes_0_8.html | 456 + docs/release_notes/release_notes_0_8.rst | 89 + docs/release_notes/release_notes_0_9.html | 481 + docs/release_notes/release_notes_0_9.rst | 110 + docs/requirements.txt | 4 + docs/resources/css/custom.css | 7 + docs/resources/images/logo.drawio | 1 + docs/resources/images/logo.ico | Bin 0 -> 1150 bytes docs/resources/images/logo.png | Bin 0 -> 1289 bytes docs/search.html | 316 + docs/searchindex.js | 1 + docs/tutorial/advanced/index.html | 337 + docs/tutorial/advanced/index.rst | 10 + .../advanced/interact_with_node_js.html | 486 + .../{ => advanced}/interact_with_node_js.rst | 2 - .../advanced/java_and_javascript_interop.html | 426 + .../java_and_javascript_interop.rst | 4 +- docs/tutorial/advanced/object_converter.html | 903 ++ .../{ => advanced}/object_converter.rst | 113 +- docs/tutorial/basic/engine_pool.html | 394 + docs/tutorial/{ => basic}/engine_pool.rst | 22 +- docs/tutorial/basic/hello_javet.html | 373 + docs/tutorial/{ => basic}/hello_javet.rst | 4 +- docs/tutorial/basic/index.html | 342 + docs/tutorial/basic/index.rst | 15 + docs/tutorial/basic/installation.html | 433 + docs/tutorial/{ => basic}/installation.rst | 22 +- docs/tutorial/basic/interception.html | 454 + docs/tutorial/{ => basic}/interception.rst | 8 +- docs/tutorial/basic/javet_shell.html | 369 + docs/tutorial/{ => basic}/javet_shell.rst | 4 +- .../basic/node_js_mode_and_v8_mode.html | 402 + .../{ => basic}/node_js_mode_and_v8_mode.rst | 4 +- docs/tutorial/basic/polyfill.html | 402 + docs/tutorial/{ => basic}/polyfill.rst | 4 +- docs/tutorial/basic/spring_integration.html | 408 + .../{ => basic}/spring_integration.rst | 6 +- docs/tutorial/index.html | 355 + docs/tutorial/index.rst | 26 +- docs/tutorial/migration_guides/index.html | 335 + docs/tutorial/migration_guides/index.rst | 8 + .../migration_guides/migrate_from_j2v8.html | 435 + .../migration_guides/migrate_from_j2v8.rst | 77 + pom.xml | 6 +- scripts/node/javet-rebuild/rebuild.cmd | 2 +- scripts/node/javet-rebuild/rebuild.sh | 2 +- scripts/python/change_javet_version.py | 5 +- .../javet/annotations/CheckReturnValue.java | 18 +- .../caoccao/javet/annotations/V8Property.java | 8 +- .../javet/annotations/package-info.java | 23 + .../javet/entities/JavetEntityFunction.java | 3 +- .../javet/entities/JavetEntityMap.java | 3 +- .../javet/entities/JavetEntitySymbol.java | 3 +- .../caoccao/javet/entities/package-info.java | 23 + .../caoccao/javet/enums/JavetErrorType.java | 2 +- .../javet/enums/JavetPromiseRejectEvent.java | 37 +- .../javet/enums/V8ValueReferenceType.java | 31 +- .../javet/enums/V8ValueSymbolType.java | 7 + .../com/caoccao/javet/enums/package-info.java | 23 + .../caoccao/javet/exceptions/JavetError.java | 3 + .../javet/exceptions/package-info.java | 23 + .../logging/BaseJavetConsoleInterceptor.java | 8 +- .../interception/logging/package-info.java | 23 + .../javet/interception/package-info.java | 23 + .../javet/interfaces/IJavetInterceptor.java | 8 +- .../javet/interfaces/IJavetSupplier.java | 25 + .../javet/interfaces/package-info.java | 23 + .../com/caoccao/javet/interop/IV8Native.java | 8 + .../caoccao/javet/interop/JavetLibLoader.java | 2 +- .../com/caoccao/javet/interop/V8Native.java | 18 +- .../com/caoccao/javet/interop/V8Runtime.java | 298 +- .../interop/binding/MethodDescriptor.java | 22 +- .../javet/interop/binding/package-info.java | 23 + .../javet/interop/callback/package-info.java | 23 + .../converters/JavetObjectConverter.java | 210 +- .../converters/JavetProxyConverter.java | 2 +- .../interop/converters/package-info.java | 23 + .../javet/interop/engine/package-info.java | 23 + .../javet/interop/executors/package-info.java | 23 + .../caoccao/javet/interop/package-info.java | 23 + .../javet/interop/proxy/package-info.java | 23 + .../javet/node/modules/package-info.java | 23 + .../com/caoccao/javet/utils/package-info.java | 23 + .../javet/utils/receivers/package-info.java | 23 + .../caoccao/javet/values/package-info.java | 23 + .../javet/values/primitive/package-info.java | 23 + .../values/reference/IV8ValueObject.java | 249 +- .../javet/values/reference/V8ValueObject.java | 80 +- .../reference/V8ValueSharedArrayBuffer.java | 33 + .../builtin/V8ValueBuiltInSymbol.java | 33 + .../reference/builtin/package-info.java | 23 + .../javet/values/reference/package-info.java | 23 + .../javet/values/virtual/V8VirtualValue.java | 3 + .../values/virtual/V8VirtualValueList.java | 2 + .../javet/values/virtual/package-info.java | 23 + .../converters/TestJavetObjectConverter.java | 68 + .../MockAnnotationBasedCallbackReceiver.java | 11 +- .../values/reference/TestV8ValueFunction.java | 6 +- .../values/reference/TestV8ValueObject.java | 26 +- 556 files changed, 143904 insertions(+), 891 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/copyright/Apache_License_2_0.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 docs/.nojekyll create mode 100644 docs/_images/chome_developer_tools_console.png create mode 100644 docs/_images/chome_developer_tools_devices_remote_target_javet.png create mode 100644 docs/_images/javet_architecture.png create mode 100644 docs/_images/javet_cross_platform.png create mode 100644 docs/_images/javet_engine_pool.png create mode 100644 docs/_images/javet_interception.png create mode 100644 docs/_images/javet_memory_management_passive_gc.png create mode 100644 docs/_images/javet_modes.png create mode 100644 docs/_images/javet_module_system.png create mode 100644 docs/_images/lifecycle_of_v8_function.png create mode 100644 docs/_images/memory_layout_of_v8_function.png create mode 100644 docs/_images/v8_promise_and_resolver.png create mode 100644 docs/_images/v8_promise_lifecycle.png create mode 100644 docs/_sources/development/build.rst.txt create mode 100644 docs/_sources/development/build_javet_from_scratch.rst.txt create mode 100644 docs/_sources/development/build_javet_with_docker.rst.txt create mode 100644 docs/_sources/development/build_javet_with_pre_built_binaries.rst.txt create mode 100644 docs/_sources/development/debug_with_chrome_developer_tools.rst.txt create mode 100644 docs/_sources/development/design.rst.txt create mode 100644 docs/_sources/development/index.rst.txt create mode 100644 docs/_sources/development/test.rst.txt create mode 100644 docs/_sources/development/tools.rst.txt create mode 100644 docs/_sources/faq/background/history_with_j2v8.rst.txt create mode 100644 docs/_sources/faq/background/index.rst.txt create mode 100644 docs/_sources/faq/background/what_is_the_motivation.rst.txt create mode 100644 docs/_sources/faq/development/how_to_think_in_javet.rst.txt create mode 100644 docs/_sources/faq/development/index.rst.txt create mode 100644 docs/_sources/faq/development/where_are_es6_api_in_v8_mode.rst.txt create mode 100644 docs/_sources/faq/environment/can_javet_support_legacy_linux.rst.txt create mode 100644 docs/_sources/faq/environment/can_javet_support_mac.rst.txt create mode 100644 docs/_sources/faq/environment/index.rst.txt create mode 100644 docs/_sources/faq/index.rst.txt create mode 100644 docs/_sources/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.rst.txt create mode 100644 docs/_sources/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst.txt create mode 100644 docs/_sources/faq/troubleshooting/index.rst.txt create mode 100644 docs/_sources/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst.txt create mode 100644 docs/_sources/index.rst.txt create mode 100644 docs/_sources/reference/best_practices.rst.txt create mode 100644 docs/_sources/reference/error_codes.rst.txt create mode 100644 docs/_sources/reference/index.rst.txt create mode 100644 docs/_sources/reference/javadoc/index.rst.txt create mode 100644 docs/_sources/reference/load_and_unload.rst.txt create mode 100644 docs/_sources/reference/lock.rst.txt create mode 100644 docs/_sources/reference/logging.rst.txt create mode 100644 docs/_sources/reference/memory_management.rst.txt create mode 100644 docs/_sources/reference/modularization.rst.txt create mode 100644 docs/_sources/reference/performance.rst.txt create mode 100644 docs/_sources/reference/termination.rst.txt create mode 100644 docs/_sources/reference/todo_list.rst.txt create mode 100644 docs/_sources/reference/v8_collection.rst.txt create mode 100644 docs/_sources/reference/v8_function.rst.txt create mode 100644 docs/_sources/reference/v8_promise.rst.txt create mode 100644 docs/_sources/release_notes/index.rst.txt create mode 100644 docs/_sources/release_notes/release_notes_0_7.rst.txt create mode 100644 docs/_sources/release_notes/release_notes_0_8.rst.txt create mode 100644 docs/_sources/release_notes/release_notes_0_9.rst.txt create mode 100644 docs/_sources/tutorial/advanced/index.rst.txt create mode 100644 docs/_sources/tutorial/advanced/interact_with_node_js.rst.txt create mode 100644 docs/_sources/tutorial/advanced/java_and_javascript_interop.rst.txt create mode 100644 docs/_sources/tutorial/advanced/object_converter.rst.txt create mode 100644 docs/_sources/tutorial/basic/engine_pool.rst.txt create mode 100644 docs/_sources/tutorial/basic/hello_javet.rst.txt create mode 100644 docs/_sources/tutorial/basic/index.rst.txt create mode 100644 docs/_sources/tutorial/basic/installation.rst.txt create mode 100644 docs/_sources/tutorial/basic/interception.rst.txt create mode 100644 docs/_sources/tutorial/basic/javet_shell.rst.txt create mode 100644 docs/_sources/tutorial/basic/node_js_mode_and_v8_mode.rst.txt create mode 100644 docs/_sources/tutorial/basic/polyfill.rst.txt create mode 100644 docs/_sources/tutorial/basic/spring_integration.rst.txt create mode 100644 docs/_sources/tutorial/index.rst.txt create mode 100644 docs/_sources/tutorial/migration_guides/index.rst.txt create mode 100644 docs/_sources/tutorial/migration_guides/migrate_from_j2v8.rst.txt create mode 100644 docs/_static/basic.css create mode 100644 docs/_static/css/custom.css create mode 100644 docs/_static/doctools.js create mode 100644 docs/_static/documentation_options.js create mode 100644 docs/_static/file.png create mode 100644 docs/_static/images/chome_developer_tools_console.png create mode 100644 docs/_static/images/chome_developer_tools_devices_remote_target_javet.png create mode 100644 docs/_static/images/javet_architecture.drawio create mode 100644 docs/_static/images/javet_architecture.png create mode 100644 docs/_static/images/javet_cross_platform.png create mode 100644 docs/_static/images/javet_engine_pool.png create mode 100644 docs/_static/images/javet_interception.png create mode 100644 docs/_static/images/javet_memory_management_passive_gc.png create mode 100644 docs/_static/images/javet_modes.png create mode 100644 docs/_static/images/javet_module_system.drawio create mode 100644 docs/_static/images/javet_module_system.png create mode 100644 docs/_static/images/lifecycle_of_v8_function.png create mode 100644 docs/_static/images/logo.drawio create mode 100644 docs/_static/images/logo.ico create mode 100644 docs/_static/images/logo.png create mode 100644 docs/_static/images/memory_layout_of_v8_function.png create mode 100644 docs/_static/images/v8_promise_and_resolver.png create mode 100644 docs/_static/images/v8_promise_lifecycle.png create mode 100644 docs/_static/jquery-3.5.1.js create mode 100644 docs/_static/jquery.js create mode 100644 docs/_static/language_data.js create mode 100644 docs/_static/logo.ico create mode 100644 docs/_static/logo.png create mode 100644 docs/_static/minus.png create mode 100644 docs/_static/plus.png create mode 100644 docs/_static/pygments.css create mode 100644 docs/_static/scripts/main.js create mode 100644 docs/_static/scripts/main.js.map create mode 100644 docs/_static/searchtools.js create mode 100644 docs/_static/styles/furo-extensions.css create mode 100644 docs/_static/styles/furo-extensions.css.map create mode 100644 docs/_static/styles/furo.css create mode 100644 docs/_static/styles/furo.css.map create mode 100644 docs/_static/tabs.css create mode 100644 docs/_static/tabs.js create mode 100644 docs/_static/underscore-1.13.1.js create mode 100644 docs/_static/underscore.js create mode 100644 docs/conf.py create mode 100644 docs/development/build.html create mode 100644 docs/development/build_javet_from_scratch.html create mode 100644 docs/development/build_javet_with_docker.html create mode 100644 docs/development/build_javet_with_pre_built_binaries.html create mode 100644 docs/development/debug_with_chrome_developer_tools.html create mode 100644 docs/development/design.html create mode 100644 docs/development/index.html create mode 100644 docs/development/test.html create mode 100644 docs/development/tools.html create mode 100644 docs/faq/background/history_with_j2v8.html rename docs/faq/{ => background}/history_with_j2v8.rst (98%) create mode 100644 docs/faq/background/index.html create mode 100644 docs/faq/background/index.rst create mode 100644 docs/faq/background/what_is_the_motivation.html rename docs/faq/{ => background}/what_is_the_motivation.rst (83%) delete mode 100644 docs/faq/can_i_debug_javet_in_chrome_dev_tools.rst create mode 100644 docs/faq/development/how_to_think_in_javet.html rename docs/faq/{ => development}/how_to_think_in_javet.rst (66%) create mode 100644 docs/faq/development/index.html create mode 100644 docs/faq/development/index.rst create mode 100644 docs/faq/development/where_are_es6_api_in_v8_mode.html rename docs/faq/{ => development}/where_are_es6_api_in_v8_mode.rst (87%) create mode 100644 docs/faq/environment/can_javet_support_legacy_linux.html rename docs/faq/{ => environment}/can_javet_support_legacy_linux.rst (97%) create mode 100644 docs/faq/environment/can_javet_support_mac.html rename docs/faq/{ => environment}/can_javet_support_mac.rst (84%) create mode 100644 docs/faq/environment/index.html create mode 100644 docs/faq/environment/index.rst create mode 100644 docs/faq/index.html create mode 100644 docs/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.html rename docs/faq/{ => troubleshooting}/a_dynamic_link_library_dll_initialization_routine_failed.rst (66%) create mode 100644 docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.html create mode 100644 docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst create mode 100644 docs/faq/troubleshooting/index.html create mode 100644 docs/faq/troubleshooting/index.rst create mode 100644 docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.html create mode 100644 docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst create mode 100644 docs/genindex.html create mode 100644 docs/index.rst create mode 100644 docs/make.bat create mode 100644 docs/publish.cmd create mode 100644 docs/reference/best_practices.html create mode 100644 docs/reference/error_codes.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/javadoc/allclasses-frame.html create mode 100644 docs/reference/javadoc/allclasses-noframe.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/CheckReturnValue.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/NodeModule.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/V8BindEnabler.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/V8Function.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/V8Property.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/V8RuntimeSetter.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/annotations/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityFunction.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityMap.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/entities/JavetEntitySymbol.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/entities/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/entities/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/entities/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/JSFunctionType.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/JSRuntimeType.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/JSScopeType.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/JavetErrorType.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/JavetPromiseRejectEvent.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/V8ValueReferenceType.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/V8ValueSymbolType.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/enums/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/BaseJavetScriptingException.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/JavetCompilationException.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/JavetConverterException.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/JavetError.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/JavetException.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/JavetExecutionException.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/JavetScriptingError.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/JavetTerminatedException.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/exceptions/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/BaseJavetInterceptor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/logging/JavetStandardConsoleInterceptor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/logging/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/logging/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/logging/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interception/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiConsumer.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiIndexedConsumer.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetClosable.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityFunction.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityMap.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetInterceptor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetLogger.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetPromiseRejectCallback.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetResettable.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetSupplier.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniConsumer.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniIndexedConsumer.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/IV8ModuleResolver.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interfaces/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/INodeNative.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/IV8Cloneable.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/IV8Convertible.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/IV8Creatable.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/IV8Executable.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/IV8InspectorListener.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/IV8Native.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/JavetLibLoader.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/NodeRuntime.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/V8Flags.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/V8Host.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/V8Inspector.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/V8Locker.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/V8Notifier.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/V8Runtime.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/V8ScriptOrigin.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/binding/BindingContext.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/binding/MethodDescriptor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/binding/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/binding/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/binding/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/callback/JavetCallbackContext.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/callback/V8FunctionCallback.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/callback/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/callback/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/callback/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/IJavetConverter.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetConverterConfig.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetObjectConverter.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetPrimitiveConverter.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetProxyConverter.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/converters/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngine.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngineGuard.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEnginePool.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngine.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineConfig.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineGuard.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEnginePool.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineUsage.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/engine/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/executors/BaseV8Executor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/executors/IV8Executor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/executors/V8PathExecutor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/executors/V8StringExecutor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/executors/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/executors/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/executors/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/BaseJavetProxyHandler.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueFunctionInvocationHandler.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueObjectInvocationHandler.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/IJavetProxyHandler.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.JavetUniversalInterceptor.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.ScoredExecutable.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/BaseNodeModule.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/INodeModule.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleAny.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleModule.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleProcess.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/node/modules/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetDateTimeUtils.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetDefaultLogger.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetOSUtils.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetPrimitiveUtils.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetPromiseRejectCallback.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetReflectionUtils.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetResourceUtils.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/JavetVirtualObject.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/SimpleFreeMarkerFormat.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/SimpleMap.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/V8ValueUtils.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/receivers/IJavetCallbackReceiver.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/receivers/JavetCallbackReceiver.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/IV8Value.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/V8Data.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/V8Value.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueBoolean.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueDouble.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueInteger.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueLong.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueNull.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValuePrimitive.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueString.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUndefined.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUnknown.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueZonedDateTime.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/primitive/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Module.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Script.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueArray.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueFunction.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueIterator.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueKeyContainer.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueMap.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueObject.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValuePromise.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueProxy.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueReference.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueSet.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueTypedArray.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8Module.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8Script.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArguments.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArray.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArrayBuffer.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueDataView.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueError.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueFunction.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueGlobalObject.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueIterator.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueMap.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueObject.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValuePromise.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueProxy.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueReference.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueRegExp.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSet.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbol.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbolObject.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueTypedArray.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakMap.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakSet.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInJson.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInObject.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInPromise.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/reference/package-tree.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValue.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValueList.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/virtual/package-frame.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/virtual/package-summary.html create mode 100644 docs/reference/javadoc/com/caoccao/javet/values/virtual/package-tree.html create mode 100644 docs/reference/javadoc/constant-values.html create mode 100644 docs/reference/javadoc/deprecated-list.html create mode 100644 docs/reference/javadoc/help-doc.html create mode 100644 docs/reference/javadoc/index-all.html create mode 100644 docs/reference/javadoc/index.html create mode 100644 docs/reference/javadoc/index.rst create mode 100644 docs/reference/javadoc/overview-frame.html create mode 100644 docs/reference/javadoc/overview-summary.html create mode 100644 docs/reference/javadoc/overview-tree.html create mode 100644 docs/reference/javadoc/package-list create mode 100644 docs/reference/javadoc/script.js create mode 100644 docs/reference/javadoc/serialized-form.html create mode 100644 docs/reference/javadoc/stylesheet.css create mode 100644 docs/reference/load_and_unload.html create mode 100644 docs/reference/lock.html create mode 100644 docs/reference/logging.html create mode 100644 docs/reference/memory_management.html create mode 100644 docs/reference/modularization.html create mode 100644 docs/reference/performance.html create mode 100644 docs/reference/termination.html create mode 100644 docs/reference/todo_list.html rename docs/{ => reference}/todo_list.rst (85%) create mode 100644 docs/reference/v8_collection.html create mode 100644 docs/reference/v8_function.html create mode 100644 docs/reference/v8_promise.html delete mode 100644 docs/release_notes.rst create mode 100644 docs/release_notes/index.html create mode 100644 docs/release_notes/index.rst create mode 100644 docs/release_notes/release_notes_0_7.html create mode 100644 docs/release_notes/release_notes_0_7.rst create mode 100644 docs/release_notes/release_notes_0_8.html create mode 100644 docs/release_notes/release_notes_0_8.rst create mode 100644 docs/release_notes/release_notes_0_9.html create mode 100644 docs/release_notes/release_notes_0_9.rst create mode 100644 docs/requirements.txt create mode 100644 docs/resources/css/custom.css create mode 100644 docs/resources/images/logo.drawio create mode 100644 docs/resources/images/logo.ico create mode 100644 docs/resources/images/logo.png create mode 100644 docs/search.html create mode 100644 docs/searchindex.js create mode 100644 docs/tutorial/advanced/index.html create mode 100644 docs/tutorial/advanced/index.rst create mode 100644 docs/tutorial/advanced/interact_with_node_js.html rename docs/tutorial/{ => advanced}/interact_with_node_js.rst (98%) create mode 100644 docs/tutorial/advanced/java_and_javascript_interop.html rename docs/tutorial/{ => advanced}/java_and_javascript_interop.rst (93%) create mode 100644 docs/tutorial/advanced/object_converter.html rename docs/tutorial/{ => advanced}/object_converter.rst (81%) create mode 100644 docs/tutorial/basic/engine_pool.html rename docs/tutorial/{ => basic}/engine_pool.rst (62%) create mode 100644 docs/tutorial/basic/hello_javet.html rename docs/tutorial/{ => basic}/hello_javet.rst (86%) create mode 100644 docs/tutorial/basic/index.html create mode 100644 docs/tutorial/basic/index.rst create mode 100644 docs/tutorial/basic/installation.html rename docs/tutorial/{ => basic}/installation.rst (74%) create mode 100644 docs/tutorial/basic/interception.html rename docs/tutorial/{ => basic}/interception.rst (94%) create mode 100644 docs/tutorial/basic/javet_shell.html rename docs/tutorial/{ => basic}/javet_shell.rst (89%) create mode 100644 docs/tutorial/basic/node_js_mode_and_v8_mode.html rename docs/tutorial/{ => basic}/node_js_mode_and_v8_mode.rst (92%) create mode 100644 docs/tutorial/basic/polyfill.html rename docs/tutorial/{ => basic}/polyfill.rst (93%) create mode 100644 docs/tutorial/basic/spring_integration.html rename docs/tutorial/{ => basic}/spring_integration.rst (94%) create mode 100644 docs/tutorial/index.html create mode 100644 docs/tutorial/migration_guides/index.html create mode 100644 docs/tutorial/migration_guides/index.rst create mode 100644 docs/tutorial/migration_guides/migrate_from_j2v8.html create mode 100644 docs/tutorial/migration_guides/migrate_from_j2v8.rst create mode 100644 src/main/java/com/caoccao/javet/annotations/package-info.java create mode 100644 src/main/java/com/caoccao/javet/entities/package-info.java create mode 100644 src/main/java/com/caoccao/javet/enums/V8ValueSymbolType.java create mode 100644 src/main/java/com/caoccao/javet/enums/package-info.java create mode 100644 src/main/java/com/caoccao/javet/exceptions/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interception/logging/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interception/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interfaces/IJavetSupplier.java create mode 100644 src/main/java/com/caoccao/javet/interfaces/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interop/binding/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interop/callback/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interop/converters/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interop/engine/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interop/executors/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interop/package-info.java create mode 100644 src/main/java/com/caoccao/javet/interop/proxy/package-info.java create mode 100644 src/main/java/com/caoccao/javet/node/modules/package-info.java create mode 100644 src/main/java/com/caoccao/javet/utils/package-info.java create mode 100644 src/main/java/com/caoccao/javet/utils/receivers/package-info.java create mode 100644 src/main/java/com/caoccao/javet/values/package-info.java create mode 100644 src/main/java/com/caoccao/javet/values/primitive/package-info.java create mode 100644 src/main/java/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.java create mode 100644 src/main/java/com/caoccao/javet/values/reference/builtin/package-info.java create mode 100644 src/main/java/com/caoccao/javet/values/reference/package-info.java create mode 100644 src/main/java/com/caoccao/javet/values/virtual/package-info.java diff --git a/.github/workflows/linux_build.yml b/.github/workflows/linux_build.yml index 29d038800..8b24f847e 100644 --- a/.github/workflows/linux_build.yml +++ b/.github/workflows/linux_build.yml @@ -5,11 +5,11 @@ on: types: [opened, synchronize, reopened, ready_for_review] paths-ignore: - '**.rst' - - 'doc/**' + - 'docs/**' push: paths-ignore: - '**.rst' - - 'doc/**' + - 'docs/**' jobs: diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..62305e2d8 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,298 @@ + + + + + + + + + + +
+ + + + true + true + true + true + + + +
+
+ + + + true + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + + + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + true + + + BY_NAME + +
+
+ + + + true + true + + + BY_NAME + +
+
+ + + + true + true + + + BY_NAME + +
+
+ + + + true + true + + + BY_NAME + +
+
+ + + + true + true + + + BY_NAME + +
+
+ + + true + + BY_NAME + +
+
+ + + true + + +
+
+ + + true + + BY_NAME + +
+
+ + + + true + true + + + BY_NAME + +
+
+ + + true + + BY_NAME + +
+
+ + + true + + BY_NAME + +
+
+ + + true + + BY_NAME + +
+
+ + + + true + true + + + BY_NAME + +
+
+ + + true + + BY_NAME + +
+
+
+
+ + +
+
\ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..307554b77 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/Apache_License_2_0.xml b/.idea/copyright/Apache_License_2_0.xml new file mode 100644 index 000000000..0fd503e41 --- /dev/null +++ b/.idea/copyright/Apache_License_2_0.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000..47b33c7cd --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/README.rst b/README.rst index aed20879a..57fde7898 100644 --- a/README.rst +++ b/README.rst @@ -15,11 +15,11 @@ Javet .. |Linux Build| image:: https://img.shields.io/github/workflow/status/caoccao/Javet/Linux%20Build?label=Linux%20Build&style=for-the-badge :target: https://github.com/caoccao/Javet/actions/workflows/linux_build.yml -Javet is Java + V8 (JAVa + V + EighT). It is an awesome way of embedding Node.js and V8 in Java. +`Javet `_ is Java + V8 (JAVa + V + EighT). It is an awesome way of embedding Node.js and V8 in Java. If you like my work, please **Star** this project. And, you may follow me `@sjtucaocao `_, or visit http://caoccao.blogspot.com/. And the official support channel is at `discord `_. -💖 If you use Mac OS (x86_64), please be aware that the Mac OS (x86_64) build will discontinue anytime because my MacBook Air mid-2012 will be soon deprecated by new version of V8. Please `donate `_ to support me purchasing a new Mac OS (x86_64) device. +💖 If you use Mac OS (x86_64), please be aware that the Mac OS (x86_64) build will discontinue anytime because my `MacBook Air mid-2012 `_ will be soon deprecated by new version of V8. Please `donate `_ to support me purchasing a new Mac OS (x86_64) device. Or, if you have a retired Mac OS (x86_64) device and are fine with mailing it to me, that will also be great. Thank you for supporting Javet. 💖 If you use Mac OS (arm64), unfortunately there is no Mac OS (arm64) build because I don't have any Mac OS (arm64) device. Please `donate `_ to support me purchasing a new Mac OS (arm64) device. @@ -52,14 +52,14 @@ Maven com.caoccao.javet javet - 0.9.11 + 0.9.12 com.caoccao.javet javet-macos - 0.9.11 + 0.9.12 Gradle Kotlin DSL @@ -67,16 +67,16 @@ Gradle Kotlin DSL .. code-block:: kotlin - implementation("com.caoccao.javet:javet:0.9.11") // Linux or Windows - implementation("com.caoccao.javet:javet-macos:0.9.11") // Mac OS (x86_64 Only) + implementation("com.caoccao.javet:javet:0.9.12") // Linux or Windows + implementation("com.caoccao.javet:javet-macos:0.9.12") // Mac OS (x86_64 Only) Gradle Groovy DSL ^^^^^^^^^^^^^^^^^ .. code-block:: groovy - implementation 'com.caoccao.javet:javet:0.9.11' // Linux or Windows - implementation 'com.caoccao.javet:javet-macos:0.9.11' // Mac OS (x86_64 Only) + implementation 'com.caoccao.javet:javet:0.9.12' // Linux or Windows + implementation 'com.caoccao.javet:javet-macos:0.9.12' // Mac OS (x86_64 Only) Hello Javet ----------- @@ -93,17 +93,13 @@ Hello Javet System.out.println(v8Runtime.getExecutor("'Hello Javet'").executeString()); } -Documents -========= - -* `Javet Intro `_ -* `Tutorial `_ -* `Reference `_ -* `Release Notes `_ -* `FAQ `_ -* `Development `_ - License ======= `APACHE LICENSE, VERSION 2.0 `_. + +Documents +========= + +* `Javet Intro `_ +* `Javet Document Portal `_ diff --git a/build.gradle.kts b/build.gradle.kts index 2164263e1..f648ccb0c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ repositories { } group = "com.caoccao.javet" -version = "0.9.11" +version = "0.9.12" repositories { mavenCentral() diff --git a/cpp/build-linux.sh b/cpp/build-linux.sh index 879ebac19..c7e6995d9 100755 --- a/cpp/build-linux.sh +++ b/cpp/build-linux.sh @@ -2,7 +2,7 @@ # Usage for V8: sh build-linux.sh -DV8_DIR=${HOME}/v8 # Usage for Node: sh build-linux.sh -DNODE_DIR=${HOME}/node -JAVET_VERSION=0.9.11 +JAVET_VERSION=0.9.12 rm -rf build mkdir build cd build diff --git a/cpp/build-macos.sh b/cpp/build-macos.sh index 073a9db44..e91abec9e 100755 --- a/cpp/build-macos.sh +++ b/cpp/build-macos.sh @@ -2,7 +2,7 @@ # Usage for V8: sh build-macos.sh -DV8_DIR=${HOME}/v8 # Usage for Node: sh build-macos.sh -DNODE_DIR=${HOME}/node -JAVET_VERSION=0.9.11 +JAVET_VERSION=0.9.12 rm -rf build mkdir build cd build diff --git a/cpp/build-windows.cmd b/cpp/build-windows.cmd index 6cf06435c..4c8a3ca65 100644 --- a/cpp/build-windows.cmd +++ b/cpp/build-windows.cmd @@ -1,7 +1,7 @@ @echo off REM Usage for V8: build -DV8_DIR=C:\v8 REM Usage for Node: build -DNODE_DIR=C:\node -SET JAVET_VERSION=0.9.11 +SET JAVET_VERSION=0.9.12 rd /s/q build mkdir build cd build diff --git a/cpp/jni/com_caoccao_javet_interop_V8Native.cpp b/cpp/jni/com_caoccao_javet_interop_V8Native.cpp index 650314b8e..738e8f9fc 100644 --- a/cpp/jni/com_caoccao_javet_interop_V8Native.cpp +++ b/cpp/jni/com_caoccao_javet_interop_V8Native.cpp @@ -396,6 +396,18 @@ JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_delete return false; } +JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_deletePrivateProperty +(JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jlong v8ValueHandle, jint v8ValueType, jstring mKey) { + RUNTIME_AND_VALUE_HANDLES_TO_OBJECTS_WITH_SCOPE(v8RuntimeHandle, v8ValueHandle); + if (v8LocalValue->IsObject()) { + auto v8LocalStringKey = Javet::Converter::ToV8String(jniEnv, v8Context, mKey); + auto v8LocalPrivateKey = v8::Private::ForApi(v8Context->GetIsolate(), v8LocalStringKey); + auto v8MaybeBool = v8LocalValue.As()->DeletePrivate(v8Context, v8LocalPrivateKey); + return v8MaybeBool.FromMaybe(false); + } + return false; +} + JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_equals (JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jlong v8ValueHandle1, jlong v8ValueHandle2) { RUNTIME_AND_2_VALUES_HANDLES_TO_OBJECTS_WITH_SCOPE(v8RuntimeHandle, v8ValueHandle1, v8ValueHandle2); @@ -578,7 +590,24 @@ JNIEXPORT jobject JNICALL Java_com_caoccao_javet_interop_V8Native_getOwnProperty } if (v8LocalValue->IsObject()) { auto v8LocalObject = v8LocalValue.As(); - return v8Runtime->SafeToExternalV8Value(jniEnv, v8Context, v8LocalObject->GetOwnPropertyNames(v8Context).ToLocalChecked()); + auto v8MaybeLocalArray = v8LocalObject->GetOwnPropertyNames(v8Context); + if (!v8MaybeLocalArray.IsEmpty()) { + return v8Runtime->SafeToExternalV8Value(jniEnv, v8Context, v8MaybeLocalArray.ToLocalChecked()); + } + } + return Javet::Converter::ToExternalV8ValueUndefined(jniEnv, v8Runtime->externalV8Runtime); +} + +JNIEXPORT jobject JNICALL Java_com_caoccao_javet_interop_V8Native_getPrivateProperty +(JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jlong v8ValueHandle, jint v8ValueType, jstring mKey) { + RUNTIME_AND_VALUE_HANDLES_TO_OBJECTS_WITH_SCOPE(v8RuntimeHandle, v8ValueHandle); + if (v8LocalValue->IsObject()) { + auto v8LocalStringKey = Javet::Converter::ToV8String(jniEnv, v8Context, mKey); + auto v8LocalPrivateKey = v8::Private::ForApi(v8Context->GetIsolate(), v8LocalStringKey); + auto v8MaybeLocalValue = v8LocalValue.As()->GetPrivate(v8Context, v8LocalPrivateKey); + if (!v8MaybeLocalValue.IsEmpty()) { + return v8Runtime->SafeToExternalV8Value(jniEnv, v8Context, v8MaybeLocalValue.ToLocalChecked()); + } } return Javet::Converter::ToExternalV8ValueUndefined(jniEnv, v8Runtime->externalV8Runtime); } @@ -716,6 +745,18 @@ JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_hasOwnPropert return false; } +JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_hasPrivateProperty +(JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jlong v8ValueHandle, jint v8ValueType, jstring mKey) { + RUNTIME_AND_VALUE_HANDLES_TO_OBJECTS_WITH_SCOPE(v8RuntimeHandle, v8ValueHandle); + if (v8LocalValue->IsObject()) { + auto v8LocalStringKey = Javet::Converter::ToV8String(jniEnv, v8Context, mKey); + auto v8LocalPrivateKey = v8::Private::ForApi(v8Context->GetIsolate(), v8LocalStringKey); + auto v8MaybeBool = v8LocalValue.As()->HasPrivate(v8Context, v8LocalPrivateKey); + return v8MaybeBool.FromMaybe(false); + } + return false; +} + JNIEXPORT void JNICALL Java_com_caoccao_javet_interop_V8Native_idleNotificationDeadline (JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jlong deadlineInMillis) { if (deadlineInMillis > 0) { @@ -944,9 +985,7 @@ JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_promiseReject if (IS_V8_PROMISE(v8ValueType)) { auto v8LocalPromiseResolver = v8LocalValue.As(); auto v8MaybeBool = v8LocalPromiseResolver->Reject(v8Context, Javet::Converter::ToV8Value(jniEnv, v8Context, value)); - if (v8MaybeBool.IsJust()) { - return v8MaybeBool.ToChecked(); - } + return v8MaybeBool.FromMaybe(false); } return false; } @@ -1159,6 +1198,19 @@ JNIEXPORT void JNICALL Java_com_caoccao_javet_interop_V8Native_setFlags } } +JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_setPrivateProperty +(JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jlong v8ValueHandle, jint v8ValueType, jstring mKey, jobject mValue) { + RUNTIME_AND_VALUE_HANDLES_TO_OBJECTS_WITH_SCOPE(v8RuntimeHandle, v8ValueHandle); + if (v8LocalValue->IsObject()) { + auto v8LocalStringKey = Javet::Converter::ToV8String(jniEnv, v8Context, mKey); + auto v8LocalPrivateKey = v8::Private::ForApi(v8Context->GetIsolate(), v8LocalStringKey); + auto v8LocalPrivateValue = Javet::Converter::ToV8Value(jniEnv, v8Context, mValue); + auto v8MaybeBool = v8LocalValue.As()->SetPrivate(v8Context, v8LocalPrivateKey, v8LocalPrivateValue); + return v8MaybeBool.FromMaybe(false); + } + return false; +} + JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_setProperty (JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jlong v8ValueHandle, jint v8ValueType, jobject key, jobject value) { RUNTIME_AND_VALUE_HANDLES_TO_OBJECTS_WITH_SCOPE(v8RuntimeHandle, v8ValueHandle); @@ -1248,7 +1300,7 @@ JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_setSourceCode #else v8InternalFunction.set_code(v8InternalIsolate->builtins()->code(V8InternalBuiltin::kCompileLazy)); #endif - } + } /* * Set the source and update the start and end position. @@ -1261,9 +1313,9 @@ JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_setSourceCode const int newEndPosition = startPosition + umSourceCode->Length(); v8InternalShared.scope_info().SetPositionInfo(startPosition, newEndPosition); return true; + } } } -} return false; } diff --git a/cpp/jni/com_caoccao_javet_interop_V8Native.h b/cpp/jni/com_caoccao_javet_interop_V8Native.h index 00016c7ad..30e64e47c 100644 --- a/cpp/jni/com_caoccao_javet_interop_V8Native.h +++ b/cpp/jni/com_caoccao_javet_interop_V8Native.h @@ -119,6 +119,14 @@ JNIEXPORT jobject JNICALL Java_com_caoccao_javet_interop_V8Native_createV8Value JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_delete (JNIEnv *, jobject, jlong, jlong, jint, jobject); +/* + * Class: com_caoccao_javet_interop_V8Native + * Method: deletePrivateProperty + * Signature: (JJILjava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_deletePrivateProperty + (JNIEnv *, jobject, jlong, jlong, jint, jstring); + /* * Class: com_caoccao_javet_interop_V8Native * Method: equals @@ -207,6 +215,14 @@ JNIEXPORT jint JNICALL Java_com_caoccao_javet_interop_V8Native_getLength JNIEXPORT jobject JNICALL Java_com_caoccao_javet_interop_V8Native_getOwnPropertyNames (JNIEnv *, jobject, jlong, jlong, jint); +/* + * Class: com_caoccao_javet_interop_V8Native + * Method: getPrivateProperty + * Signature: (JJILjava/lang/String;)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_com_caoccao_javet_interop_V8Native_getPrivateProperty + (JNIEnv *, jobject, jlong, jlong, jint, jstring); + /* * Class: com_caoccao_javet_interop_V8Native * Method: getProperty @@ -271,6 +287,14 @@ JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_has JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_hasOwnProperty (JNIEnv *, jobject, jlong, jlong, jint, jobject); +/* + * Class: com_caoccao_javet_interop_V8Native + * Method: hasPrivateProperty + * Signature: (JJILjava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_hasPrivateProperty + (JNIEnv *, jobject, jlong, jlong, jint, jstring); + /* * Class: com_caoccao_javet_interop_V8Native * Method: idleNotificationDeadline @@ -567,6 +591,14 @@ JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_setAccessor JNIEXPORT void JNICALL Java_com_caoccao_javet_interop_V8Native_setFlags (JNIEnv *, jobject, jstring); +/* + * Class: com_caoccao_javet_interop_V8Native + * Method: setPrivateProperty + * Signature: (JJILjava/lang/String;Ljava/lang/Object;)Z + */ +JNIEXPORT jboolean JNICALL Java_com_caoccao_javet_interop_V8Native_setPrivateProperty + (JNIEnv *, jobject, jlong, jlong, jint, jstring, jobject); + /* * Class: com_caoccao_javet_interop_V8Native * Method: setProperty diff --git a/cpp/jni/javet_callbacks.cpp b/cpp/jni/javet_callbacks.cpp index 4d2e0309c..5b27a5955 100644 --- a/cpp/jni/javet_callbacks.cpp +++ b/cpp/jni/javet_callbacks.cpp @@ -60,8 +60,19 @@ namespace Javet { FETCH_JNI_ENV(GlobalJavaVM); auto javetCallbackContextReferencePointer = info.GetParameter(); auto v8Context = info.GetIsolate()->GetCurrentContext(); - jobject externalV8Runtime = Javet::V8Runtime::FromV8Context(v8Context)->externalV8Runtime; - javetCallbackContextReferencePointer->RemoveCallbackContext(externalV8Runtime); + if (v8Context.IsEmpty()) { + LOG_ERROR("JavetCloseWeakCallbackContextHandle: V8 context is empty."); + } + else { + auto v8Runtime = V8Runtime::FromV8Context(v8Context); + if (v8Runtime == nullptr) { + LOG_ERROR("JavetCloseWeakCallbackContextHandle: V8 runtime is empty."); + } + else { + jobject externalV8Runtime = v8Runtime->externalV8Runtime; + javetCallbackContextReferencePointer->RemoveCallbackContext(externalV8Runtime); + } + } delete javetCallbackContextReferencePointer; INCREASE_COUNTER(Javet::Monitor::CounterType::DeleteJavetCallbackContextReference); } @@ -97,32 +108,40 @@ namespace Javet { V8LocalFixedArray importAssertions, #endif V8LocalModule referrer) { - auto v8Runtime = V8Runtime::FromV8Context(v8Context); - FETCH_JNI_ENV(GlobalJavaVM); - auto externalV8Runtime = v8Runtime->externalV8Runtime; - jobject mReferrerV8Module = referrer.IsEmpty() ? nullptr : Javet::Converter::ToExternalV8Module(jniEnv, externalV8Runtime, v8Context, referrer); - jobject mIV8Module = jniEnv->CallObjectMethod( - externalV8Runtime, jmethodIDV8RuntimeGetV8Module, - Javet::Converter::ToJavaString(jniEnv, v8Context, specifier), - mReferrerV8Module); - V8MaybeLocalModule resolvedV8MaybeLocalModule; - if (jniEnv->ExceptionCheck()) { - // JNI exception is not re-thrown in this callback function because it will pop up automatically. - LOG_ERROR("ModuleResolveCallback: module " << *Javet::Converter::ToStdString(v8Context, specifier) << " with exception"); - resolvedV8MaybeLocalModule = V8MaybeLocalModule(); - } - else if (mIV8Module == nullptr) { - LOG_ERROR("ModuleResolveCallback: module " << *Javet::Converter::ToStdString(v8Context, specifier) << " not found"); - resolvedV8MaybeLocalModule = V8MaybeLocalModule(); + V8MaybeLocalModule resolvedV8MaybeLocalModule = V8MaybeLocalModule(); + if (v8Context.IsEmpty()) { + LOG_ERROR("JavetModuleResolveCallback: V8 context is empty."); } else { - auto mHandle = jniEnv->CallLongMethod(mIV8Module, jmethodIDIV8ModuleGetHandle); - auto v8PersistentModule = TO_V8_PERSISTENT_MODULE_POINTER(mHandle); - LOG_DEBUG("ModuleResolveCallback: module " << *Javet::Converter::ToStdString(v8Context, specifier) << " found"); - resolvedV8MaybeLocalModule = v8PersistentModule->Get(v8Context->GetIsolate()); - } - if (mReferrerV8Module != nullptr) { - jniEnv->CallVoidMethod(mReferrerV8Module, jmethodIDIV8ValueReferenceClose, true); + auto v8Runtime = V8Runtime::FromV8Context(v8Context); + if (v8Runtime == nullptr) { + LOG_ERROR("JavetModuleResolveCallback: V8 runtime is empty."); + } + else { + FETCH_JNI_ENV(GlobalJavaVM); + auto externalV8Runtime = v8Runtime->externalV8Runtime; + jobject mReferrerV8Module = referrer.IsEmpty() ? nullptr : Javet::Converter::ToExternalV8Module(jniEnv, externalV8Runtime, v8Context, referrer); + jobject mIV8Module = jniEnv->CallObjectMethod( + externalV8Runtime, jmethodIDV8RuntimeGetV8Module, + Javet::Converter::ToJavaString(jniEnv, v8Context, specifier), + mReferrerV8Module); + if (jniEnv->ExceptionCheck()) { + // JNI exception is not re-thrown in this callback function because it will pop up automatically. + LOG_ERROR("JavetModuleResolveCallback: module " << *Javet::Converter::ToStdString(v8Context, specifier) << " with exception"); + } + else if (mIV8Module == nullptr) { + LOG_ERROR("JavetModuleResolveCallback: module " << *Javet::Converter::ToStdString(v8Context, specifier) << " not found"); + } + else { + auto mHandle = jniEnv->CallLongMethod(mIV8Module, jmethodIDIV8ModuleGetHandle); + auto v8PersistentModule = TO_V8_PERSISTENT_MODULE_POINTER(mHandle); + LOG_DEBUG("JavetModuleResolveCallback: module " << *Javet::Converter::ToStdString(v8Context, specifier) << " found"); + resolvedV8MaybeLocalModule = v8PersistentModule->Get(v8Context->GetIsolate()); + } + if (mReferrerV8Module != nullptr) { + jniEnv->CallVoidMethod(mReferrerV8Module, jmethodIDIV8ValueReferenceClose, true); + } + } } return resolvedV8MaybeLocalModule; } @@ -134,21 +153,31 @@ namespace Javet { FETCH_JNI_ENV(GlobalJavaVM); auto v8Isolate = v8LocalPromise->GetIsolate(); auto v8Context = v8Isolate->GetCurrentContext(); - auto v8Runtime = Javet::V8Runtime::FromV8Context(v8Context); - auto externalV8Runtime = v8Runtime->externalV8Runtime; - jobject value; - if (promiseRejectEvent == v8::PromiseRejectEvent::kPromiseHandlerAddedAfterReject) { - value = Javet::Converter::ToExternalV8ValueUndefined(jniEnv, externalV8Runtime); + if (v8Context.IsEmpty()) { + LOG_ERROR("JavetPromiseRejectCallback: V8 context is empty."); } else { - value = Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, message.GetValue()); + auto v8Runtime = Javet::V8Runtime::FromV8Context(v8Context); + if (v8Runtime == nullptr) { + LOG_ERROR("JavetPromiseRejectCallback: V8 runtime is empty."); + } + else { + auto externalV8Runtime = v8Runtime->externalV8Runtime; + jobject value; + if (promiseRejectEvent == v8::PromiseRejectEvent::kPromiseHandlerAddedAfterReject) { + value = Javet::Converter::ToExternalV8ValueUndefined(jniEnv, externalV8Runtime); + } + else { + value = Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, message.GetValue()); + } + jniEnv->CallVoidMethod( + externalV8Runtime, + jmethodIDV8RuntimeReceivePromiseRejectCallback, + promiseRejectEvent, + Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, v8LocalPromise), + value); + } } - jniEnv->CallVoidMethod( - externalV8Runtime, - jmethodIDV8RuntimeReceivePromiseRejectCallback, - promiseRejectEvent, - Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, v8LocalPromise), - value); } JavetCallbackContextReference::JavetCallbackContextReference(JNIEnv* jniEnv, jobject callbackContext) { @@ -165,44 +194,50 @@ namespace Javet { V8HandleScope v8HandleScope(v8Isolate); auto v8Context = v8Isolate->GetCurrentContext(); if (v8Context.IsEmpty()) { - // The callback may come after V8 context is closed. + LOG_ERROR("CallFunction: V8 context is empty."); args.GetReturnValue().SetUndefined(); } else { auto v8Runtime = Javet::V8Runtime::FromV8Context(v8Context); - jobject externalV8Runtime = v8Runtime->externalV8Runtime; - V8ContextScope v8ContextScope(v8Context); - jboolean isReturnResult = IsReturnResult(); - jboolean isThisObjectRequired = IsThisObjectRequired(); - jobject externalArgs = Javet::Converter::ToExternalV8ValueArray(jniEnv, externalV8Runtime, v8Context, args); - jobject thisObject = isThisObjectRequired ? Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, args.This()) : nullptr; - jobject mResult = jniEnv->CallStaticObjectMethod( - jclassV8FunctionCallback, - jmethodIDV8FunctionCallbackReceiveCallback, - externalV8Runtime, - callbackContext, - thisObject, - externalArgs); - if (jniEnv->ExceptionCheck()) { - Javet::Exceptions::ThrowV8Exception(jniEnv, v8Context, "Uncaught JavaError in function callback"); + if (v8Runtime == nullptr) { + LOG_ERROR("CallFunction: V8 runtime is empty."); + args.GetReturnValue().SetUndefined(); } - else if (isReturnResult) { - if (mResult == nullptr) { - args.GetReturnValue().SetUndefined(); + else { + jobject externalV8Runtime = v8Runtime->externalV8Runtime; + V8ContextScope v8ContextScope(v8Context); + jboolean isReturnResult = IsReturnResult(); + jboolean isThisObjectRequired = IsThisObjectRequired(); + jobject externalArgs = Javet::Converter::ToExternalV8ValueArray(jniEnv, externalV8Runtime, v8Context, args); + jobject thisObject = isThisObjectRequired ? Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, args.This()) : nullptr; + jobject mResult = jniEnv->CallStaticObjectMethod( + jclassV8FunctionCallback, + jmethodIDV8FunctionCallbackReceiveCallback, + externalV8Runtime, + callbackContext, + thisObject, + externalArgs); + if (jniEnv->ExceptionCheck()) { + Javet::Exceptions::ThrowV8Exception(jniEnv, v8Context, "Uncaught JavaError in function callback"); } - else { - args.GetReturnValue().Set(Javet::Converter::ToV8Value(jniEnv, v8Context, mResult)); + else if (isReturnResult) { + if (mResult == nullptr) { + args.GetReturnValue().SetUndefined(); + } + else { + args.GetReturnValue().Set(Javet::Converter::ToV8Value(jniEnv, v8Context, mResult)); + } + } + if (thisObject != nullptr) { + jniEnv->DeleteLocalRef(thisObject); + } + if (externalArgs != nullptr) { + jniEnv->DeleteLocalRef(externalArgs); + } + if (mResult != nullptr) { + jniEnv->CallStaticVoidMethod(jclassJavetResourceUtils, jmethodIDJavetResourceUtilsSafeClose, mResult); + jniEnv->DeleteLocalRef(mResult); } - } - if (thisObject != nullptr) { - jniEnv->DeleteLocalRef(thisObject); - } - if (externalArgs != nullptr) { - jniEnv->DeleteLocalRef(externalArgs); - } - if (mResult != nullptr) { - jniEnv->CallStaticVoidMethod(jclassJavetResourceUtils, jmethodIDJavetResourceUtilsSafeClose, mResult); - jniEnv->DeleteLocalRef(mResult); } } } @@ -214,39 +249,45 @@ namespace Javet { V8HandleScope v8HandleScope(v8Isolate); auto v8Context = v8Isolate->GetCurrentContext(); if (v8Context.IsEmpty()) { - // The callback may come after V8 context is closed. + LOG_ERROR("CallPropertyGetter: V8 context is empty."); args.GetReturnValue().SetUndefined(); } else { auto v8Runtime = Javet::V8Runtime::FromV8Context(v8Context); - jobject externalV8Runtime = v8Runtime->externalV8Runtime; - V8ContextScope v8ContextScope(v8Context); - jboolean isThisObjectRequired = IsThisObjectRequired(); - jobject thisObject = isThisObjectRequired ? Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, args.This()) : nullptr; - jobject mResult = jniEnv->CallStaticObjectMethod( - jclassV8FunctionCallback, - jmethodIDV8FunctionCallbackReceiveCallback, - externalV8Runtime, - callbackContext, - thisObject, - nullptr); - if (jniEnv->ExceptionCheck()) { - Javet::Exceptions::ThrowV8Exception(jniEnv, v8Context, "Uncaught JavaError in property getter callback"); + if (v8Runtime == nullptr) { + LOG_ERROR("CallPropertyGetter: V8 runtime is empty."); + args.GetReturnValue().SetUndefined(); } else { - if (mResult == nullptr) { - args.GetReturnValue().SetUndefined(); + jobject externalV8Runtime = v8Runtime->externalV8Runtime; + V8ContextScope v8ContextScope(v8Context); + jboolean isThisObjectRequired = IsThisObjectRequired(); + jobject thisObject = isThisObjectRequired ? Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, args.This()) : nullptr; + jobject mResult = jniEnv->CallStaticObjectMethod( + jclassV8FunctionCallback, + jmethodIDV8FunctionCallbackReceiveCallback, + externalV8Runtime, + callbackContext, + thisObject, + nullptr); + if (jniEnv->ExceptionCheck()) { + Javet::Exceptions::ThrowV8Exception(jniEnv, v8Context, "Uncaught JavaError in property getter callback"); } else { - args.GetReturnValue().Set(Javet::Converter::ToV8Value(jniEnv, v8Context, mResult)); + if (mResult == nullptr) { + args.GetReturnValue().SetUndefined(); + } + else { + args.GetReturnValue().Set(Javet::Converter::ToV8Value(jniEnv, v8Context, mResult)); + } + } + if (thisObject != nullptr) { + jniEnv->DeleteLocalRef(thisObject); + } + if (mResult != nullptr) { + jniEnv->CallStaticVoidMethod(jclassJavetResourceUtils, jmethodIDJavetResourceUtilsSafeClose, mResult); + jniEnv->DeleteLocalRef(mResult); } - } - if (thisObject != nullptr) { - jniEnv->DeleteLocalRef(thisObject); - } - if (mResult != nullptr) { - jniEnv->CallStaticVoidMethod(jclassJavetResourceUtils, jmethodIDJavetResourceUtilsSafeClose, mResult); - jniEnv->DeleteLocalRef(mResult); } } } @@ -257,32 +298,40 @@ namespace Javet { V8IsolateScope v8IsolateScope(v8Isolate); V8HandleScope v8HandleScope(v8Isolate); auto v8Context = v8Isolate->GetCurrentContext(); - if (!v8Context.IsEmpty()) { + if (v8Context.IsEmpty()) { + LOG_ERROR("CallPropertySetter: V8 context is empty."); + } + else { auto v8Runtime = Javet::V8Runtime::FromV8Context(v8Context); - jobject externalV8Runtime = v8Runtime->externalV8Runtime; - V8ContextScope v8ContextScope(v8Context); - auto v8Array = v8::Array::New(v8Context->GetIsolate(), 1); - auto maybeResult = v8Array->Set(v8Context, 0, propertyValue); - maybeResult.Check(); - jboolean isThisObjectRequired = IsThisObjectRequired(); - jobject thisObject = isThisObjectRequired ? Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, args.This()) : nullptr; - jobject mPropertyValue = Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, v8Array); - jobject mResult = jniEnv->CallStaticObjectMethod( - jclassV8FunctionCallback, - jmethodIDV8FunctionCallbackReceiveCallback, - externalV8Runtime, - callbackContext, - thisObject, - mPropertyValue); - if (jniEnv->ExceptionCheck()) { - Javet::Exceptions::ThrowV8Exception(jniEnv, v8Context, "Uncaught JavaError in property setter callback"); + if (v8Runtime == nullptr) { + LOG_ERROR("CallPropertySetter: V8 runtime is empty."); } - if (thisObject != nullptr) { - jniEnv->DeleteLocalRef(thisObject); - } - if (mResult != nullptr) { - jniEnv->CallStaticVoidMethod(jclassJavetResourceUtils, jmethodIDJavetResourceUtilsSafeClose, mResult); - jniEnv->DeleteLocalRef(mResult); + else { + jobject externalV8Runtime = v8Runtime->externalV8Runtime; + V8ContextScope v8ContextScope(v8Context); + auto v8Array = v8::Array::New(v8Context->GetIsolate(), 1); + auto maybeResult = v8Array->Set(v8Context, 0, propertyValue); + maybeResult.Check(); + jboolean isThisObjectRequired = IsThisObjectRequired(); + jobject thisObject = isThisObjectRequired ? Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, args.This()) : nullptr; + jobject mPropertyValue = Javet::Converter::ToExternalV8Value(jniEnv, externalV8Runtime, v8Context, v8Array); + jobject mResult = jniEnv->CallStaticObjectMethod( + jclassV8FunctionCallback, + jmethodIDV8FunctionCallbackReceiveCallback, + externalV8Runtime, + callbackContext, + thisObject, + mPropertyValue); + if (jniEnv->ExceptionCheck()) { + Javet::Exceptions::ThrowV8Exception(jniEnv, v8Context, "Uncaught JavaError in property setter callback"); + } + if (thisObject != nullptr) { + jniEnv->DeleteLocalRef(thisObject); + } + if (mResult != nullptr) { + jniEnv->CallStaticVoidMethod(jclassJavetResourceUtils, jmethodIDJavetResourceUtilsSafeClose, mResult); + jniEnv->DeleteLocalRef(mResult); + } } } } diff --git a/cpp/jni/javet_converter.cpp b/cpp/jni/javet_converter.cpp index 464353332..93ad039c5 100644 --- a/cpp/jni/javet_converter.cpp +++ b/cpp/jni/javet_converter.cpp @@ -46,6 +46,7 @@ #define IS_JAVA_REFERENCE(jniEnv, obj) jniEnv->IsInstanceOf(obj, jclassV8ValueReference) #define IS_JAVA_REG_EXP(jniEnv, obj) jniEnv->IsInstanceOf(obj, jclassV8ValueRegExp) #define IS_JAVA_SET(jniEnv, obj) jniEnv->IsInstanceOf(obj, jclassV8ValueSet) +#define IS_JAVA_SHARED_ARRAY_BUFFER(jniEnv, obj) jniEnv->IsInstanceOf(obj, jclassV8ValueSharedArrayBuffer) #define IS_JAVA_SYMBOL(jniEnv, obj) jniEnv->IsInstanceOf(obj, jclassV8ValueSymbol) #define IS_JAVA_SYMBOL_OBJECT(jniEnv, obj) jniEnv->IsInstanceOf(obj, jclassV8ValueSymbolObject) #define IS_JAVA_WEAK_MAP(jniEnv, obj) jniEnv->IsInstanceOf(obj, jclassV8ValueWeakMap) @@ -169,6 +170,10 @@ namespace Javet { jmethodIDV8ValueSetConstructor = jniEnv->GetMethodID(jclassV8ValueSet, JAVA_CONSTRUCTOR_AND_SIGNATURE_FROM_HANDLE); jmethodIDV8ValueSetGetHandle = jniEnv->GetMethodID(jclassV8ValueSet, JAVA_METHOD_AND_SIGNATURE_GET_HANDLE); + jclassV8ValueSharedArrayBuffer = (jclass)jniEnv->NewGlobalRef(jniEnv->FindClass("com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer")); + jmethodIDV8ValueSharedArrayBufferConstructor = jniEnv->GetMethodID(jclassV8ValueSharedArrayBuffer, "", "(JLjava/nio/ByteBuffer;)V"); + jmethodIDV8ValueSharedArrayBufferGetHandle = jniEnv->GetMethodID(jclassV8ValueSharedArrayBuffer, JAVA_METHOD_AND_SIGNATURE_GET_HANDLE); + jclassV8ValueSymbol = (jclass)jniEnv->NewGlobalRef(jniEnv->FindClass("com/caoccao/javet/values/reference/V8ValueSymbol")); jmethodIDV8ValueSymbolConstructor = jniEnv->GetMethodID(jclassV8ValueSymbol, JAVA_CONSTRUCTOR_AND_SIGNATURE_FROM_HANDLE); jmethodIDV8ValueSymbolGetHandle = jniEnv->GetMethodID(jclassV8ValueSymbol, JAVA_METHOD_AND_SIGNATURE_GET_HANDLE); @@ -273,6 +278,11 @@ namespace Javet { return jniEnv->NewObject(jclassV8ValueArrayBuffer, jmethodIDV8ValueArrayBufferConstructor, ToV8PersistentValueReference(v8Context, v8Value), jniEnv->NewDirectByteBuffer(v8ArrayBuffer->GetBackingStore()->Data(), v8ArrayBuffer->ByteLength())); } + if (v8Value->IsSharedArrayBuffer()) { + auto v8SharedArrayBuffer = v8Value.As(); + return jniEnv->NewObject(jclassV8ValueSharedArrayBuffer, jmethodIDV8ValueSharedArrayBufferConstructor, ToV8PersistentValueReference(v8Context, v8Value), + jniEnv->NewDirectByteBuffer(v8SharedArrayBuffer->GetBackingStore()->Data(), v8SharedArrayBuffer->ByteLength())); + } if (v8Value->IsArrayBufferView()) { /* ArrayBufferView is a helper type representing any of typed array or DataView. @@ -349,7 +359,10 @@ namespace Javet { return ToExternalV8ValuePrimitive(jniEnv, jclassV8ValueString, jmethodIDV8ValueStringConstructor, v8Context, v8Value); } if (v8Value->IsName()) { - // It defaults to V8ValueObject. + /* + * Name is handled by either String or Symbol. + * This block should not be entered. + */ } #ifndef ENABLE_NODE if (v8Value->IsModule()) { diff --git a/cpp/jni/javet_converter.h b/cpp/jni/javet_converter.h index 3dc45b313..d1ef590c6 100644 --- a/cpp/jni/javet_converter.h +++ b/cpp/jni/javet_converter.h @@ -135,6 +135,10 @@ namespace Javet { static jmethodID jmethodIDV8ValueSetConstructor; static jmethodID jmethodIDV8ValueSetGetHandle; + static jclass jclassV8ValueSharedArrayBuffer; + static jmethodID jmethodIDV8ValueSharedArrayBufferConstructor; + static jmethodID jmethodIDV8ValueSharedArrayBufferGetHandle; + static jclass jclassV8ValueSymbol; static jmethodID jmethodIDV8ValueSymbolConstructor; static jmethodID jmethodIDV8ValueSymbolGetHandle; diff --git a/cpp/jni/javet_enums.h b/cpp/jni/javet_enums.h index 53b7ac5e8..e0503a8af 100644 --- a/cpp/jni/javet_enums.h +++ b/cpp/jni/javet_enums.h @@ -62,17 +62,18 @@ namespace Javet { Module = 21, DataView = 30, ArrayBuffer = 31, - Int8Array = 32, // -128 to 127 1 8-bit two's complement signed integer byte int8_t - Uint8Array = 33, // 0 to 255 1 8-bit unsigned integer octet uint8_t - Uint8ClampedArray = 34, // 0 to 255 1 8-bit unsigned integer (clamped) octet uint8_t - Int16Array = 35, // -32768 to 32767 2 16-bit two's complement signed integer short int16_t - Uint16Array = 36, // 0 to 65535 2 16-bit unsigned integer unsigned short uint16_t - Int32Array = 37, // -2147483648 to 2147483647 4 32-bit two's complement signed integer long int32_t - Uint32Array = 38, // 0 to 4294967295 4 32-bit unsigned integer unsigned long uint32_t - Float32Array = 39, // 1.2¡Á10^-38 to 3.4¡Á10^38 4 32-bit IEEE floating point number (7 significant digits e.g., 1.234567) unrestricted float float - Float64Array = 40, // 5.0¡Á10^-324 to 1.8¡Á10^308 8 64-bit IEEE floating point number (16 significant digits e.g., 1.23456789012345) unrestricted double double - BigInt64Array = 41, // -2^63 to 2^63-1 8 64-bit two's complement signed integer bigint int64_t (signed long long) - BigUint64Array = 42, // 0 to 2^64-1 8 64-bit unsigned integer bigint uint64_t (unsigned long long) + SharedArrayBuffer = 32, + Int8Array = 33, // -128 to 127 1 8-bit two's complement signed integer byte int8_t + Uint8Array = 34, // 0 to 255 1 8-bit unsigned integer octet uint8_t + Uint8ClampedArray = 35, // 0 to 255 1 8-bit unsigned integer (clamped) octet uint8_t + Int16Array = 36, // -32768 to 32767 2 16-bit two's complement signed integer short int16_t + Uint16Array = 37, // 0 to 65535 2 16-bit unsigned integer unsigned short uint16_t + Int32Array = 38, // -2147483648 to 2147483647 4 32-bit two's complement signed integer long int32_t + Uint32Array = 39, // 0 to 4294967295 4 32-bit unsigned integer unsigned long uint32_t + Float32Array = 40, // 1.2¡Á10^-38 to 3.4¡Á10^38 4 32-bit IEEE floating point number (7 significant digits e.g., 1.234567) unrestricted float float + Float64Array = 41, // 5.0¡Á10^-324 to 1.8¡Á10^308 8 64-bit IEEE floating point number (16 significant digits e.g., 1.23456789012345) unrestricted double double + BigInt64Array = 42, // -2^63 to 2^63-1 8 64-bit two's complement signed integer bigint int64_t (signed long long) + BigUint64Array = 43, // 0 to 2^64-1 8 64-bit unsigned integer bigint uint64_t (unsigned long long) }; }; diff --git a/cpp/jni/javet_resource_node.rc b/cpp/jni/javet_resource_node.rc index b6253da40..7675a4c78 100644 --- a/cpp/jni/javet_resource_node.rc +++ b/cpp/jni/javet_resource_node.rc @@ -61,8 +61,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,9,11,0 - PRODUCTVERSION 0,9,11,0 + FILEVERSION 0,9,12,0 + PRODUCTVERSION 0,9,12,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -79,12 +79,12 @@ BEGIN BEGIN VALUE "CompanyName", "caoccao.com" VALUE "FileDescription", "caoccao.com" - VALUE "FileVersion", "0.9.11.0" - VALUE "InternalName", "libjavet-node-windows-x86_64.v.0.9.11.dll" + VALUE "FileVersion", "0.9.12.0" + VALUE "InternalName", "libjavet-node-windows-x86_64.v.0.9.12.dll" VALUE "LegalCopyright", "Copyright (C) 2021" - VALUE "OriginalFilename", "libjavet-node-windows-x86_64.v.0.9.11.dll" + VALUE "OriginalFilename", "libjavet-node-windows-x86_64.v.0.9.12.dll" VALUE "ProductName", "Javet Windows" - VALUE "ProductVersion", "0.9.11.0" + VALUE "ProductVersion", "0.9.12.0" END END BLOCK "VarFileInfo" diff --git a/cpp/jni/javet_resource_v8.rc b/cpp/jni/javet_resource_v8.rc index 579c845a5..e97987c33 100644 --- a/cpp/jni/javet_resource_v8.rc +++ b/cpp/jni/javet_resource_v8.rc @@ -61,8 +61,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,9,11,0 - PRODUCTVERSION 0,9,11,0 + FILEVERSION 0,9,12,0 + PRODUCTVERSION 0,9,12,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -79,12 +79,12 @@ BEGIN BEGIN VALUE "CompanyName", "caoccao.com" VALUE "FileDescription", "caoccao.com" - VALUE "FileVersion", "0.9.11.0" - VALUE "InternalName", "libjavet-v8-windows-x86_64.v.0.9.11.dll" + VALUE "FileVersion", "0.9.12.0" + VALUE "InternalName", "libjavet-v8-windows-x86_64.v.0.9.12.dll" VALUE "LegalCopyright", "Copyright (C) 2021" - VALUE "OriginalFilename", "libjavet-v8-windows-x86_64.v.0.9.11.dll" + VALUE "OriginalFilename", "libjavet-v8-windows-x86_64.v.0.9.12.dll" VALUE "ProductName", "Javet Windows" - VALUE "ProductVersion", "0.9.11.0" + VALUE "ProductVersion", "0.9.12.0" END END BLOCK "VarFileInfo" diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/docs/_images/chome_developer_tools_console.png b/docs/_images/chome_developer_tools_console.png new file mode 100644 index 0000000000000000000000000000000000000000..5387dc0928b5af1beb547ccaeffc45866aa7552f GIT binary patch literal 31552 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

(I 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 literal 0 HcmV?d00001 diff --git a/docs/_images/javet_cross_platform.png b/docs/_images/javet_cross_platform.png new file mode 100644 index 0000000000000000000000000000000000000000..77cfa6028fb1308cb24942b8de263fb26a9898f3 GIT binary patch literal 69645 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

)?VOR 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

  • b`19;=@e^(Co#rrRK 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 riS(iOKkpgS!F literal 0 HcmV?d00001 diff --git a/docs/_images/javet_interception.png b/docs/_images/javet_interception.png new file mode 100644 index 0000000000000000000000000000000000000000..949265cfa129d13a1dbe2571c05393e65a4c0c70 GIT binary patch literal 51754 zcmdq}byOTp6zGdK5FiP`f(1_?xFxttaQEO4+#zIePe^bH!QI{6nGk$%cP2Ot?#|pH z-?``9b?#mFz5m`?uhy`-SIu;H)!tRL_x|l_LR6HbF`tt>2LJ$5Rz^Y%08qdHfV}<` z8BrtCN}z~1Jo_x80|Ef7uE#&5I3_GoL?y1Xq_(rVqlL4Z@fUMI-NE{^G0556fM|FL z0A2&K5@H(ese4Oa`myFDJVzPpPnGyHgCkiPbCKC$qLFAxPsEVLP@AGz^NyNJt9Fh1 z-A;c>;)m3;?H2FAqR>UfBmFFfWf1^jaD@rGZ8Nl$x4+V*D<58` zr>P#DR?kcO`I~P5E*`Qat3rSIyOl%gaC=YfZh) zAi11g0zO6t4kiWjiB6sgnoq^z?cQ7u5AVkpz?GWn=c1H|T?~ANn})eP=#%^6snF!r zTx&di!{nBmfxDa=Oit<3hJ0r4e)B)IS9b?k@)BmnKC*$1M=30Ojug0DZdHo9W$bSB z1`}kOged+N>aJDhE~jZ~J9uR#9uKOZ-jmTr$~aQP4h$gxunuiA0RMo+d05|owVWzY z=jxa%WKuTpj53k_ataxDHt^kI?~Po$ivMw@1Cqbx{yuu^`<04{%CoV~xvGd~vt)=& zVWw;3j#if{aF%VQq3kq?B74rRaUr3$qLbhHsQ5MAZwCJNi#fe0UfN3u&6ZLANr7j4 zC7C5>O@=y0d1yeFd_a1YwV{5EkhKFh;NBWjxO~P}i<*pw~7bxIfmu3XA$O(v^Rf}BJ-6LCW)qS>R z21KJZ^_`T(X%QX8_);W#Oar*f2mw|f&6!yEee$LId`Li@{f?gRfY+df%e1(c(@duy zQ2@c!4{f?E6)N`VK6ret#Mk0E`cd+m#0&%aMUYj2>aZGpFaziov*Ff7fXhu-6}-P zu=RPHKEcQgVV3S5uH^)R4KHNv-T|e{v8Fl%-DiExM%2@MKP0440QLz20;z_={t*Q< zK*sV$Ho|_Cl+g7wAow8Ud3OdfUAT{j!xvp&9Yl*zlNjWwX%(I-%+C~qc8dP;G5}^4 zgs%oHnNAuuQOHHa8S(v|r~W0ba`&+~W&nN{t=_S%St^pR;LY^+;^OM0hTaW52NFp) zZ)1(Lae!Q(Xw|Wui*DJn_IsP>x;=X&E5y8)If~sq!V<}lA2FdwlVn2*hOgdF<^Ahp zx=535XpYryYuWq{9G>Lfz&9G~tqxY% z2+~rUR;Wm^^7@ta_-96C-ffJwP)_zjFXhYPfbGvtQua_1gL*Ddo^k;HKr?RUPU!* z*;O0=zJ=5L+WJ|Ix71bFmTUZiHRBg8u%PjWuJPDGAA*}s{N14IP$dD+{qm7KsXG4F z&UYq8<>>yj%tI3;1Z6ibnRLp#h#*FP1#q!^HV0rZv?K4&#R-B73mnqH7 z`}QWMS>Nc@8rK9Y>`O_+SG0dRUpyzN6~xp;qS- z`j(nxH2wh6SI<@f{Gl(53gUmHK-1&Ok^T}GIe&hf=Y|gD6ux3(C9VYa!T2cjO6~%Z zMw?>`JxY$E69(nJfvB#n`;ulB=htxEvJV59$R=>81d2ZuO-)Mlu7*6d;e%e4y2@U$ zpTo#pT+HcE^6YCmK-6g*gUzM%1R2O3^fazQcHkf^gH|)qSq0hzKH0`^6# z<@_2I1axh@9>+?UuU)-Z{#)+InQcgnH$=5VNZ zHHW2vBhQy3&p#T;n-euD3Bcj(thnaLZRg#G?+}$kk0P}e$Y!m3GG?SuM2}(2N`F6? z%_Rq}zZ|(ZpN7+7pJ1k70L5IP2fkmsJN%aYjuyBOX5sew=DLlnWpg1Q5UE9_)qR6@ zZR(|Rw*wUPSzOIIu_7bG@hIGln{2VhI8c~UpEBdi)>7Mfw=H4UAEbN+C!Jbs^&eVPqRi_g@JfIqgh?1d4dmXv>`EE2m zuL9MpsoCQSZN%MjphJAuG8hTJ7fh1jSi9?E)YJk1v3O|J&QsqhiU3#a zMsxf=?HZ|I0^nQ0Egu(~#@6m_T+Y^afvf;AL*EG`(VENN&`8^mK9k9HJGpTHr#Fy0 zs?U7u@(USYrG}4cuvtAJVpubpv!7r|TH(fBI)jZ`&!uRbd(mmS1JUfDUSK8VTdVQw z+5wOCS}yNcQ6^MRywm{RdF{{36x8q9wJz(l$Uy}v8Cv+Dt^2Hj0vc6L`!@GnhVU(7 zC3|&y(wXf#hAI;vdCG5J1r-2R8`)+gTh48323ef*+ffA7%}b9iR=$YTSpH_>97X|7 zcnCCVbxZq~bCuKAES|Ws=es)!@FexlM&1vYfR6x2ClP8doH6nKez!nMAlIxR*{8_D z$d_ca{7hamH49#{#x=Z+9yV)D2E1-qT{(R9#?zmR=Gl1T-vZru?xoS`xAsGa#jz%- zF)`73N-Ll8+Hq<`)j& zu$9PE2sAfC+tk?kbMNsG(DKvjzKN895_s1Qvg=jY(^5*mp=2zkxCuf(bi7#fp5cN| zgvZO}!3pdZo&&4hV#`vy7!^eygOn4GdSKoW>PL%QdaeZIf=-oIGx1!YfHcnQ5@_PP zH{Nwsj9yfpDw7)ccDh0$RHH}kEh|OGI(iZI0uVE=1EnL(jrR~;0c;VU z{N^32AN>Lz?m@@^XP)%ows_9!XEfmTAgJ`Xm!Wmp+Ul`r!_1w}eR5Pcworh(T!%Ef zap!}ko^}VplLOGji>M=y4$%}oZl*6h7RdI8eYGDm;A8S(ZZ<&0_q+RrneM=A&!!0H z(-X`vgNFOR=}*{1Ye2{HZaUqF=BfEH+aJt!uufR87-l3ny0^C3Dz5d?@eIYO80l70 z0Dt~?Ujt9Z#HHfmvH>6}32C1;9xoaBSTFS1-U81ZLqD~%lxsR{`=wdl`{qHcR(Tc zCamQL<4FUf|Am{GZtDEij2R{nm0KrYPzxS2KAjvNnZ8CEEsavH*<&~i=?k7n@x8oT ztX21)Wn<;q`kRDNhdDHCm+0VKkRKI2H3ywRDTE7qaRJ}kPQu65`5bPWFbr;(_v+!l za8*ZCHvICC{rzW;B0*xD5lD`$shI+Sg2%3~=gH}912c>Lyf3*l3G8*b$M)UcFV^P^ zxYYXyVDBFc-@kE#)>wu=k4nb`iWRRJfr1l`^E~c~TaQ-@t(%2%NWjwz_GStPigo~q zJ2?p34A~x@wADbpzD9g{9d>C|d>*zO9mj#E3zc-1Q+6UeRn|G35zo{4$N_Fb#$BYT z_6XqJEsvOe%%_y)8?)v+h)YYklMFxAfQHde<5wE2ZslRoCnf!1n6~Qd4h`sK?ZZdb z8=Sc@bmigu&il`S-^zBSyo~}TbmBT)`_B4MRie)Q>YbTblchc9lzh--8%38nEeckB|Wiz?mkKn=l=1<+VzkgeQ{hC1^Q81GH#WY8b zTyrObIpZPpP=>lhfDS7e7gO}qyb5OF^x%mZ9x=Pd$w~(NOsX(3CK?MUG)#&y)9p=! z)d!`Q7BkMkM=Qb}rY|_-ZchG|-&nPLGR=X@Io{L|y3KcgPU(ugX%#;0g(y)oh!lyq z@oc@heDe)mAKPrC5+fBC9VnjCv3`C(*equ3D@8$z3LIN0-+Psbn%_N}3C#&KO3b>y zvJdW4@ZGSul3X&>w<*<<)Xb!OK(3-Fqm(VGm~kUo;+!S`?e~tirEy#F(D0J@(@Iv+ ziio4U=5G`?Pgqj-y$OO%JQ(TH;W28E30;gv%P5R2F*@+UPIUyjrx8o|kVK`*86QPv;B6CyQ*H;YjIeoF{hH%Kd zx^jfh4H83Fhb=PriXo_gj8NK@w=B9)v`}Y{fK}Bie_G>%Kl+(9W7_9$4aZD?KDbqP z{sj4S`tsRw%X5U$Koc^*X(OU)ZV>!N&`ld*r-!FB!OtkwgU-N@}7Rny2sLe9t%Sa;hxu7~Xx>{q(nYi0AmAHEiWV zrqeV45UsPw8M{_VE^x(4Cvs@j_&YXDJqH>9ReM$$kGQ5^&0lpB_iQh7+J?(_NvGhW z7KbK3*ZgWSAzeeOkX9#)A}Y8x;v^+a|28{)<-LFyT+bl&FNg8`;#3O3;~bky`Phr5 zbQH#h7Ji=|8eqt?hcDvtXW&%J5i&diO(ztAnzi<|v?W zOOt;5ysa~B1QjXMeEJ|#{U@b{)I847ZsKGJ5(yr(Nr`_IOCATlXd%=vsbiLLZt| z^F$ap3sp*uO0}V_Qe<~qEMp`Y!DfJn4X0?(!J8Hau__r^B>%>Da3x`h8xNMHdU>+T z@kKVKa0!}=FnJwt@e(D90C*d_O>LPaP%8Q?km}jf+bv>nB=#-dm`~oYOg~z4B1ZPy zYiMPYj2^akQhe3h(#}$Th@>w^?)H2ZhMU$%P&y*&ow(RUvi!O&{ ziargb57H`Vd|E)@B417$_Do^6a;9 zr9|2Q?lj&tp+a#|=L%2`02@4W?gL-7f;;%K0lYs-A$;!MUN-v9{t4<6>=pjojg$N6 zBjiRR3lTIU5}Q2ic8U)_0-)s~X$M;tS4TuG*MZ%%_H%yag{H6 z@SL>Ak0FDa``&;BB2SO-3lzW(0*|U%HWC0=N&^0p1`kgATZCzzcZ2DeEQ;GXx^4GY z9jO;ZHNv^wP(m6>p5C>=IfW3ZekI$_o5PySmP@6)*#Yu#POw&O4F%9+$wsgUWK!e1fcWzxXOIqQpf%tQAj zO~}}Yt+mv!n$i2rez=KoS8YFQfB`L-Q$B-VV8{?`yY!-9dW*0cwjhEYhLriC%J;Z5 z0U5<8Ev42_70Kx+BdmT~1m)b|MVYK6YZyMt@Alds6=-NmVSR_biF^p}xP8c@SNVk% zgqy{e>+?xs2Wt#6b-V+AF;bVWJowgiM}4q9e7ET>*oy~8p>2c${${5~;M zbnrs7R~rQPH-|Y}gGaEtod%?Kc@S2hrEm0!OFk9I2=%oq#C(a-OjIGGMK&eMd|bo90IoR=8{xZZrdm54RGbUFV@CwHr0k@SCj1LeR)l<1;FA-uL)&)$!UU*7xAxriNJ$3< z21-gwhRC1dF2xn2Q1afL29&uSmy}M~oSvQ@W>)MUr1-v0oBewzvySK*-?ix4=(<-5;lEWn}j|7>7cj8AVP`P7Mu>*}1u;^JspnNzFK-d`h(z zB?EjDze8+45e@RIPm5zQX=Mhmx|K4oF-Q`JB^ow`H(TW7Dr9aEya(r&*8`y;C$v{L zq$hLvT&-Q!hulW|lj{;oLRDBjABnH9FO`RE#4SX&gEbHpIpJY5v_t@t2)ht`zuJYZ z=eXlPmXRz#HZjM4@2TgP_OLY%!BpKko^I3`IpZoNr$Xbj2rI)lr{f-EX05IAT0!Zz z!nMJQwRf-i+dHBD3+nmd)4`|%N{!{?z|pG*|5CEQnah7!NX*@#$X_&trfKoC*b6NvZpvk8+M>p-3Sg@~3xUAISL_)jJKB`1fFxzm2XJGx7MtKoj4 zj5<_6f&BU^&fYc#BDX2HVsE=S`#&B9V{j>G*v!4#7;jpO__l>U;ti$yoyYd6Q2cj+ zvXI}=-z~oi(rbj66&ujYGnQ}KjMrqd{Y8X`7r&4#bqjTqstr?IU$QLy>&M#O`^IA^@{oafm_h$|&!=B+Q|X}ib^K~mV`U}SaDfsfJ#!jw-_eQ`BLTpw zluxDcB5F$sW>oZjg@3I>Lu+s5jajUheD)BdQHFI132q^WGZh zcUym|9rL$CkJ`&p=ZRSy#|9r#;_$qGr6oTe$z(XY|M@D;|4m?=JsWR1>W+V0W^)(hl)z#I(NTR`g+1h$~ zBgtGPS`~(m6ZIh7p$m^mByAl491gN~L54+)d`OqaiX|CN*18x=Ul;3S!GgC-7$Dkn zRR1DsN^qrp*`MOW7l5VTY;leJ(ZkWDG5{<}ncRLWR2O0PI@!Se9akN3taW@#CnEDx z5DRcvUb|#YRvW9Kv*Fv@^0vS7rE-}fzrHM@l(RwpkWA5P=hC6-XR^C`is>j+XI2#U z&>TT%&gQ;hBKa;5g%0j>6FSf*`GwLA@OMTYju0;G6C%Rldr>$TDPnYbR~UCv5QOBP zG6{9q|Ew9pFgBH7uUw2!#j8s%ukp(iME?N_uf6x6AW@0Eu z;!94)^S}u3+h({TW~-LJ)E;d7JGyum_`K;?jPmNfXt#2+j+;9_BJ9ii%P7W;r@b`r zEwL7)PYnMSAtANWGJZ;nl`RlDsnhluIu_insjz+jfhBTuW72h>tZ#j zL=vXJ8hQ;3vf@{%D+l7|i
    _0T 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
    )lEk50j-KwmCey(nz%wpw11sx$5vca@dxM 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 GH~$N8!FtL7 literal 0 HcmV?d00001 diff --git a/docs/_images/javet_memory_management_passive_gc.png b/docs/_images/javet_memory_management_passive_gc.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b90bab78622b13b44343181a8c932ccccdc7f0 GIT binary patch literal 28083 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 X=PHpcvOJu^22gmbB2yt{_VM2Uu8;}s literal 0 HcmV?d00001 diff --git a/docs/_images/javet_modes.png b/docs/_images/javet_modes.png new file mode 100644 index 0000000000000000000000000000000000000000..b650a3127aae0eb5abed80eeb899fba5bac995cc GIT binary patch literal 95301 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 PH;pODtG_CfeG~S7WrM(M literal 0 HcmV?d00001 diff --git a/docs/_images/javet_module_system.png b/docs/_images/javet_module_system.png new file mode 100644 index 0000000000000000000000000000000000000000..9b416a887e8f23bfbae87bb096c018b2b240616a GIT binary patch literal 49159 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 literal 0 HcmV?d00001 diff --git a/docs/_images/lifecycle_of_v8_function.png b/docs/_images/lifecycle_of_v8_function.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5c601a0af3d37bd93bf358e879b82c9af72565 GIT binary patch literal 63854 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') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + break; + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + break; + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js new file mode 100644 index 000000000..489373b83 --- /dev/null +++ b/docs/_static/documentation_options.js @@ -0,0 +1,12 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.9.12', + LANGUAGE: 'en, zh-CN', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/docs/_static/file.png b/docs/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/_static/images/chome_developer_tools_console.png b/docs/_static/images/chome_developer_tools_console.png new file mode 100644 index 0000000000000000000000000000000000000000..5387dc0928b5af1beb547ccaeffc45866aa7552f GIT binary patch literal 31552 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

    (I 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 \ No newline at end of file diff --git a/docs/_static/images/javet_architecture.png b/docs/_static/images/javet_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..295eeac6cd4481b542870137c09de538be545462 GIT binary patch literal 156650 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/javet_cross_platform.png b/docs/_static/images/javet_cross_platform.png new file mode 100644 index 0000000000000000000000000000000000000000..77cfa6028fb1308cb24942b8de263fb26a9898f3 GIT binary patch literal 69645 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

    )?VOR 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

    H*}mR>omBbwc5ri z99Ho%!AKJo6*ZxOI27ckSH{e#ae3B4x0kb8G;b6x+Z){`3-N$Gewg|;2ApK6lOdkp z?Dqp~3@`YN|J|GdYsP%OGRLAV<;#Dh>7a%CQw4N-FHhoWK7V!q(*+ohWvyX@0|N_{ z27}Em=OAsnd6ahK1hc-#_6ZtSOR5Ts$WI19-^0t>R$fkz7h%+;&$rAs?ZyBIFrJBt zu(aIA!RK~3Aa?+LGwR)tYHMd#gjFZ~f*E>QvHuLcapvLUiHH;Lw)@mC&K7ho7Yp_s%LU0`G4;LWL=Dj zhb|F5z}N>`7hE+?v@e`D*f=>CIT2noV`?Wrp4<5Uk3RZ;VkMg6VZO75sFr<$d&fou zD${&Sz92pc@{2t80hTl!A3p30D+u;D7GwC6gF`H6gr*Zm)^_`mg`1`2I8@y-?VKq`F?nDB@xzB~U%MN9H)2XcA{{V3 zQUC5bWQihpyVA0NfMuM8LYUp=FnF^Y*^m#XR{;qZgGEN~?dAUueKn=!7((xt%7HdVzwL;I?TyGaHN#s zTD{Wed(uwe9zaO*-Cs$$QVYxe8{w?~qTNUR3=C^0J#5AcsMq5CW5WvDtNTt**BVOn zd}E)NQwZAmWOUNHkwrfF_In#sRm*kKvc$!zCm5H%t>4OS6yCS zS=p#%jVwvOeg(1@Ln0!n98n}7k*iQ1+OnNDXNm6jGY3Gx_5=qWLnx@#$@RT^t2G;! zy<7Hx_pl*;>RUt%MA%ehAtNOv4GRk~y{viTi(7Y?aD;kwl=O%VX9DQO8(;4)?f7uc z51zE?W#fCyHa39f%e6(51QltRBhV*aRaLkM6%94u77VW{TUpaGW zmM!WsxVGS>k8Yi6GbizvD4H;1m#`2L^5w{$I&=9D2>vyE7C)m+_kQ|+o^6XqSNHCC z5q-KfSC^NG5~OXb5#+)AAa#)rR1$((AfGoWk|RqS*ri+5pniYr9nsVUx?_ZO9 zm{kqU&F&{@+;~mPzvQ>|jr#hxIC7%;4DruVsgZ^3l$7kOtn4Ht=EHGO{dL{>_$)0; z6^ph`o##%ZkU*`wXByIVoVmcKSLVjXW>zd&uq6bu2KV&G_uzy4hV_a3AOeKJne;>W z@HKcG^4M@cx^+Q5PdQ37uxGXBh!pPDXGG!049Tglcb>gEA|ka@73{r=pMzV{iJ+sk582|G5bG8#s^$TcR3Rl*)50RV zeWPYUN>rSobddx6o4_89yPwi*<_>JG!`qrgHF-5P6@{XivRk3}RzD*0$W7I3Y_?Wf z(4wLYcXmSF_)NkJ5zWUMeaIBjHvt>B`vK#mC&)ldC6NJ@wpu0fd^E5r_kAFk%|GIn~(T(vEY z2Gi}qGh o65}8vUE*<3n${|U@Sb0Y5_CdX9q>iG<9m8DqEsI3Wd(Gg_#9=vk&(n zC`sH-rJ^}LB+nB@nI4lVRQq`z;vxr*?wsGcOXf|Q)-{=i6>J5+)tt?wM*EUkkmk%oawVt+ zMtC%NgQCygzFMTD`pCgy7>dtpu~g4QyYv1mI{E|i!syl(Co~jcdpKG&M}`6ubP_b2 zAw~x={OR!cxU{V3z}T!xh1#BC#5M@QUK6K8f3NMZf*rp&;mE*T!i3)#vPiSGSG z#w6)dTZC55o(daFNk=2`djlyCC+AzGb1xvU`GNBLMHF+=#Ot>}P*Ks)a%3qGX+Rwy zY78Uv?%>^~C8edM+|K1iSzmvzXCGXKkct0@9+ditvj*+esbHgyQzsD(3Q6X*(M|7> zom_CuuW`5^<#qe_Xy1ZIxcS%l@n=#>;%Py_hMZiWiZF~tH-`v$_aF3@M`=4d8yg!} zS66-A(k!9HXCPx1vEc_na`ei1bHIqCfPvu{O(Bw##OdXk!r!4wKk|z?_FHC@@HRR+ zv!mloZH+=*t>sb!6JJSMLSka}becWEZUf)%tt((B)l?tG4%WD~DCUJo36J&m1oh}{ zmnR2^Gd>xF8QpZeep&^K90K#8VlG&y2e zEhm-A4kyyMR%h^yXp;=ZpTW)f4<4RK&dOqWg!|M7$5bzhBmbDeSG$W8n zDTm zqwUu<*%vnXTc6k-bK;=J{m$f|(!c?YbP5a8u~_qHp*7W~Zi2Ym{jvCTV;)^WNzJTo zQ4bgS*%Fy2H-M5x7v$y&cI<$-Ckltaue?0FVeH94y2)74d73)m(iRr;Du-nUrKh$h z3BIg$6v_f-R*L?)>FJdf$teBeF3{oDBiK15;Xr9DuF)g=%V$F8Q8o{jBKu5C~g{>GXU`Dh5`@|pK=eG8u zSKFFQg1=4cGz1dT5Ka2#?yi#uKdg%n&j09YB@kZ_u3}>1uUzuR#OlO^$4LvifJi(Y zS-0*^91Zt-E&{b0QP+*Ixkwjb8hpGrEHS>st{H3T|gN>t+h=U}b_8kU{@!OGZ?$?$gD-XK9}k<+biV zw^uyI=g-d;ErQdJL60nSIrdea+|RB7oQ%Yz{*jFZN61gEPeKCI)JWcjAJ&4{^~but zSu^|#B-URW^y+s#>_|jk5|O&aBgdu|yojzn94M6j>XJg4dR2Kh>HEgqiJGirFsDPI z!^7RkXR~i&aeobmw0G@q#tVk#&n-0;XAIAsNezsO68b4_^)Vz-}k`X)7W<~NPlA@xS>8xg*K**sU<3seov;)3iIUukaxF~cf7N98v zFGRla$s>~$OmEoPqU%(@-62WLn{dbhV1mBHTK z$(zki1TaLBe=Snr{#SnH{g%I_%+Hkf> z2StjAJ~btwzqdo1`k@57Ha3+CMIZ;##o3^D9Ol){sZ68K_}JKdLtbt`-@1KW?J*5i zGP_wEoMIsRXOjV&`9hxzHTyr=HU@@+V~$8>lYDfg#g|ihy&Py8k#wp1 zGOzJ)=F^`%_`TY{P(HeUbZGt3Zd_4JM{78?C$>Fga=ceSP6b$U0Y|;HWQH5H^yx+} z8O;v|^fl@ibQmvSk*>L;GV>RblG0f$^&>ZXqDeoQGBXr7_qlN09@Pcnxnv)dHaXjE z(<8xBLagIsZ%xe%>Xtf_x$j~6Z1W_l+;0s=vm)TPhdSUoHB|OWivN}9^Juv~Txyuj z)|RPLXjb}_Dsp<=_S~M2fF2z6DQ5KY7`OD zpO~E6qN!INo9&uHeOR#v9K{kO0);n?MQ4hn!jnrcXU!Jz(aO7hYtWk(Yah$@A3l<; zs+kop%~Ych%I_>b%|6itxpRFg_*v2i|-*dkB< z?Z{&F>g({1W4eF9WYsiUDb$HLf+AGjc&kqW*W6u2>(Wy|X>TC2%}eprHKGNV@WQ1h z`J)-n)4>o~wtCK>)ze+O+jPr4zrOT{f)@MZw!DDk(D56#bVSyV<;v7ejz_4d-G59b zqc;BN&XtbRL+!0vDcUxWy)>5F7p>HI??WN*4rQ&BOl_^i~bYN8Dlp4$7tb^$km)e#wDQMQ>Vns=hIu_zvmRYaiT${(3 zsuW3jSKQRHqnp5KCToYs5?1lnzAdNbmUAu4hVzaT5HY= z0v>(I*v9`|P(3j|$l%HSq#ks?=~O!ZlPmkjFr>`-ER zP%sE>U(BykdsOz@8|!RWD#+pKGu5BOx6J95erySOyHlYvtpnrRQOWIg*VwqdxtT9$ zF8Eh2uxdWatTa;HZur#k=c;EDIA{G-kI_{xAh48~nXwqfVh(M54Hp0Vi^)Ff=;-wH zR;$&MPVEY2DK49&iUOs>wX3aD=U!OcaxLD?gwfDEBbd6LpaR5cc;CJB2 ztudqNF4G$om5bl0zZ;j?))Rz^!f)z*9BUDAZ2sUPvNEudnmV{9!e)!uWdiecK!M25 z_3&sbb&*NoRtc-P7ZOJxW_O$Fw%|n*nm(upZ_Fky+9O`ANhyc6ePVn|p_$~`wduAC zLoARsY;e|=udZaYgij~JzFolJ_ii2)FFFELvpN=MFiRWN{?JZ9i_kqHuS3UPnr!Mg!<=qr# zhrhov2$e#N-!6Hq{0iiwe~0sE>5IZ#jM%kjAK=>&;|H@v59{L-*~=!$iqIgeFI@n8 zcMo=Y%tE=mZ~MA4tB7OY3W+I&&%#}JgpVZlBY?jN8Q0#sxE&sO-CN#{ar>K7h(wYI zOuXyW{`_^*j*Nd7re;;h?#7%1}-8s4_Uc zR%mZ0-v#((ffU`Y0Vs%X{}HB7GyR>5Cjg#_Y7}2>!NwoRmfiHBqv+#*s|CY3=2nta~uNB6<|J3tMO> z+LK;lipFfIU2B4r?JuD0UHb_i;Qb*2>p$P650gjXj9==GShR$X&>$ViVX%vxE7m1` ztYv-r0r^8;&saKec-%)XKA<4j3YXHGX*XvdE*Yb5?|8}1LHud1C60_``SCFgi?~0K zb@vKCv9jOgUqm5%8fM?StRlB^cUrkGV0?VMQw@C)ptyPWvNER*{I%J=$|#8VY5CS( z*QNJuYMLtzuK{31$MIyHX8}EP>E+JpND&&@g2&7ka(ZQ+RBie_b78u6asoWhn{_6h zxg*CDUh6MI`n^Td-3^?a*~@$S42c!ty5H=R#aY^TX$ko_U^(`~C0<+V8C*-UE0v(^ zxA0xBVfjM>#^Uc+YhA?$&#WY5^qm$LD4U#eDQ*3zgG7HVE;azFl9=JODE*th1-eJI zTTGEiiZgQxC6)1-4ee1)6rugU^Wfic)0}_v4!0=z)bna`W|U1X6Fm5&Ob)hjX_6uQ zE;e%dTp0di-p9+dZN8bpw7z8+JwR;%Ju!UjiJ~^4&2iJeqU2a>*{>+|3oR6lwUjm4 zlv;C=q^nq_(N`~l?2Bj3q|F|Q_s@_1$8h5w1^Pu~1b$c54-*zvvFB570n#V`QMp$^ zGo~SCaBccp=`%9USzt5fXnWkD|AHhE*?(5tu|o19B@RfcJ5O6d#ke`+ z9yGaC}zCe{>4@cat*};LGAOBtVw|5uW?BTx`1p{j;vTp-3v~(Et zPZLDdSVl!vV#<;O^!!xwsZN%3>>amENfG9ws1-az8Z6xgBRCgp>;GN7`5?BFs}W2H z1UZ+g?=un(rO9JPaaMxFjwbJ3S^t^1pL8bk@*&Id$%;#P9W~_4por{(je`h~KxvP? z>-9d?2)r9`_(M`c&m$4p^{e8l`l+(SL@(8*O*6&*A-gGCeM{v2m@k0An1nHuyjA`p ziiAN;ait-ve(zpT&Y{uv-&v5;--K5<#HcwRQfs%*MsRC-;W1OQFh0#SZwm(y>WjfH zdE7TSIVdN?+fRNo7b!K28lTr#Xmk-8loB+$p2|kR+EJGx-X$yT{f_t=5g!w}qDuJb z)2AG@I!R&il$1o5aE~!B)8)pznUb$??--UOBO}8~SKo`{zVX%`+qVD1M!R{sE0Zd~ zEFN`GXMykz<{XRqyMy8=8hR$nwEMh%sS49Wg>oON+v}0B=~1WFI#Nlxz!80~O$1k# zX%7q{Un~Rl9)r*+pZ9A^EK9jzQ&aM#@~W~53iETj=l5BtlL@wTYG3TZnwD2S}iKhkBwQ?!1{C;$C}qJa^BtNz`tRR1RJFvjq8R`%Gmw0LAv;Td$obV z!GnWTy!RqeGC}4sHP;u_*B6L9OPZRNb{r`D??+^Iwod6V&#iRcq3{>sd%4HF&O-5% zCHhdl$a*+;Dj_0b@U`pvG9G+jpq8zN(A$u{kV#XW8Ea6G43@v@H2{E6l{KFol(nt6 zuC;$(PD@S5kL*_#-<~@uFn8kMy?wloU^UM-HHI!FBqworbo$NmJTRY0U;Igzo-=51 zC~A$O?f(1v^3pL+j!ieD8&85Fawu9DzN!+NgX4;o#d5x`thS|vo{9=Mh>?kz${W;? zQd4znR6px`+Jj0EsAf)<;$vae>Gwx*yIsl0#Lqf7NQg^FOqkx{Ajc1b&D>l9&PZcM zz4PTp#A2#sg|az4v|gQ-|M!ujQ<8X@$DN6zBa47chBSG$vdDo};AuI&uO+9z+po;MwXKa5rXOc!_Uv}HH@ErG074SfX1L-V2t=6H5JgQ<#S-C_ zO&S+lnq;8(eIGPnO0>rg6ND6SXn3k7eIxks$3;ph`--179zaoW?cQRCIsRSi00QX; ziRk+Zw_IzUNS@o!BkhiC#3v)8V0T{X`&J~FQdo@h(nLWdxX{dscWj2mFBz=E2l#LOx_strcl6g>NVbvWoD>DkAgWVFx5Gxm1NNC)myVa$ zN=}YR9<3_pJ3CnD)+6KZp54}=xH5zE*!u^cs1*&}|0RZ5LUA4Qs3 z_b6~MU;8S1+c~Qindz zQ9QgL)c~EUMFDk7^Cs&wc@ibs7{2 zUdZ1!zNAGpIb~%Y+U-(NuD_Gom0U6G8<#$eC;9dp~Hd zKEF=&Kq!Z=V3tx*2}o8Pk!{U}!>(89LE@90PcO2)v!mrYZ{XU(GqVl~ei4Y|v{l9T z=FJ;VALGOQGa;+f(a3V+8S0Q8+u&)aXWOc2jb@$kxUi5zue)d4@Sc9TGCddYJ+>#H z)*u3~%vUUYt?3Eipy!B-4sD}W>ouraTwIhg*r}~$c^Tof{3$-vUfyU(zpBBV2Shau z`wVSdK(T8HnQ=Pwi9`L-WPu4o=>r4EEUfqc9*tvhG+@KF=iQDO5hRpCYt154zSBYSO)YbG?OP=Oi}HSF_+3o2ytlPQy#Oav2tnB*6U51(~ zxU^|A$_$If)bjb_F|-pQM=vZZV@(vd;us#^fSMIWe1I-M=M|xFK9=KB*?_hj2NGHo; zW4V$0Vi7RAd%yugeozU5U_t%f5-?$XJH~*b18`ZFU1=Aw5Wb8b(W30)q`s1QC@?^T z#*NVh<~3;Z`X;Sv3_p=<=H-N)g>FRhd>CD^lX8=i60)M>CujZa;OD9#&%z9)iR(Nx zPvy7i^_NE9y1E5%2Qg&43*EUh3@QM%$%2xAq9HWIpYzDV1jVGJ0P=MgfCSCV4t96* zEzPP_OV+KOt?}DNjjHCW8C5K0QIq=-qc`E+*vURmgPp1U-2=P&<*7tXJ#rjJmln*X zmewjeExoKS8TE#ze_~={c4434@!tl2k6@4JGXmr`k(D2iVciN4py)7CQ&p{vkFh4F zWMyY3=1J?(4mGA{*gSK+FHw9MA(S`Hzy7!2T9i;^0t>F*qgAu2p*1TjBaciR@?oQQ zIEh=WXgb_@2)w`DI&`IxM4VKvMDhJ{R7?yyScN?w?!rL4;@{&^HVJJqH>w7MyY~z4 z4SQ8{Oq~q!!pv6B_N}u3{+#J)*c@3($X_-byyRhB`fzqw5(r{rvu53>ksSx;{r&UT zkRfJ7d~`am$(eqMBEmr^C=$A%+kB=XCh8BzZE~KM9Gv3Jg z;c-6>lQ1Iwmtr4D|8AY?H7hHXJqK-kQ(H^R<`^Mia!I7{g=mf{kq%R0pj#W>Eh`ie znQVG%%7QVtA$Y-|J} zPB{mTL}Bz2L9~!AnfbBr8*ILUlT@);TvmRQ8@D#smaHP0t=fE&lHv2_mL?`9X3rOu zh53bR3mb@7f+Qn81iLVN5Wmrr_W@muiPQ{KW|F#@nq~3*`qCy~lB^w~-Xp#yB#G|F zq|;1^ja8_$Sgc)Gco-f=la-6ER(%;iXvi4I9v`4cOD8O~+H53cqJUx636t}U(RBI+ zPn*|Hhp&T%29~fEAD1aXsW1s@ z&^Kb-=cpb8P483J53tO;xVV7ze|mZvM22FIj+(Hs{mg4aMpzbfORg_&cP@p~!E)W=OLgUfwU>-zB-ZF5KU@Wc*Yu8IdmnC!Ma3mjzT* z-eDuzbuZxZub20%la~}O$Z3^L9PA7yUkB1Y1CH9+t;`LeD6hP=2VyAXa>Xl@sZ#+s zoQ6hXc(^Gk+4u8jE=;j@Lpv2}WZw=$##{5+?_D}$dzx*l$Bs?SnpOmBSNF@_zyik0 zBrg$Ua=1FYxVX5varOZ;bCfI=3m3~Hsa1UuqmtsGcQ9Hc0xs^YSFNoYfykdfhTZ!6 zpYMz+A?gLwfSRmPe+E%|KF~cxk)a=1kqPyy<~cYx8k?Fd6pOkn@xemo;h~vM2Z57D z7k~iA+nP-Sfbft+@A>iP$R?(wP)GL%Tp0osW|U~os{8q{)cqBE%ZhxeWc#|c3bpQB z7-@&}@2yMZIrA_Lje9k<#8({?W~Kf8!~UP7gnkrdXP@_eL~DCWOH9K%PzDvk=}H)( z4+y?cz3C#E=Sd%3w}$cMV@V#~IhQhM7ce#52ggUe9=76fKYxxbDLJ)u305qM628G1 z`4Ad~6s=DHwRh!871Yyna;h5t0S&EQS^_3wS{;+FKP>D5Cf!v`ERv;8cVCEAJ)h%2 z3CsoO%NO6zdsU)!aL__}bSsqe++tKqTK^1CovW!`pR9TTvvgoaF-$rkb9x^=_&2pO zHEFa*ie?VFz^yM|+3Lypy+_Bd<-NlyWe$m4#b^=gXo)12675bHfBu(d1%oH8$*fkI zoA+Pj5=ikqx)XaD)@Q~me5>Z;u2)Y~ z8vul%$BZzb3&{NV1{aAgLKvJa9EBJy4+UT+wg7EO9c%27YeZt7u64xH zu>go|gL+F#i(nQ51P-ViSABQt)Ddm^1o2#PQV>s}ce^$r#0@W>7M+ohS5UIalRQ#xP2n^M{^R`?&ijQ-%w<-DE55t*>2=#j zo`^3#Ccl3E@{+L3=G8X-9?WY( zYR#l1@(c|Sx(C4MX7qyGVsP70d^_a0o3@7y~e|x{SYAv|AUp1&(4xkT>O!xs|@bX*_`N zvxVe%?0tIt2WUJMElW?v2&Gg$=tG6N=&5Cr9#w8XdY5AnqLY3l5jZwq4uxcr+smy# zR3Jk_30r^G<(6eGu80x>LE+C|91kbVM%|U?$IZrCtNs%3Qt;dCKx`yw1e~C3)Fbbc zPHqk%q8#t_lGVKqRHG!9pYU6h5Y`_nlXq7a)_IZwLZ+d9Az0_M_1__IuW)hem50U- z-eY}*u*Gxw%-Y3eO(uLOZ1%wYM92u8MOL zg8f+wt0=!+1)dR+o{0JBvCepJqU*hN3Mpy^@rIdj-6DW{&b;Tnz~zF@cP29LCHPCP z(+lQpd<{U*LF^3@%KEO?35m-~t;{=$&-l0p)AEHitbIM=#ZA}`nrXO=dHYhbHSDF| znN>BJ&L5;Oy4u_4cir*j-wDEvY)$A_c4?vZYrFE@KD2-d@OY`T%z2`JdA)P@U~@2o zTLuXw$k+aPaVto*Z>N$;{dFi3i6!9`a zF_T*>`XIgzE&MsYOG|@6tvNI@7$V+|QM(vX$Hc@CSvp=XCN>@kuhtiUblK40U0XXI zbfwNuZ2YEikNMBvUu1}cEo>?sv)wF|^sohQI6i5K$pn6+rT9j9gPrptNx0p_7haaW z5H83sGRf5C-h!XJyFuN_<`e{nE5pU7gYDQtyT55^q}rVuI%?ucDLc>Uv ztAEQW&e*MbL}5^Y$gFpG_?+f%mA7B#Zt5x2_Gg9gCg5DXJ+YB-uiItn#k~a~blSm3 zJP4hT2*NSA4S#Bz;*D2E`1xHgvOogv>QUZNV68Sk-i2=sGO(zfpLo4>bLD?{fFn%l ziY!&#Dk?B(I}`PiL+hkJJ=Ceog`98(#k&d>6Anff_w@^HW@&VViGN+J3i!IvxRONc zjZL?)TW;@(?@acW=cy+pL6d_zz0Ird{QmLIdbQ*{s`=$7QXtTYYISDX>EfcZ-G2c_ z#ts5vSFc$fL1-o_Y_`<+RWkf{ zE53MWNLdIFHE72GHIO-U3KB;T#`k$Wao6ROSANp3um`(XJXXoeDLMLeRsg*s`xOiG zO=Zrs$Df~{9A}9iEhMK%sj9LHMTE#txUT7G-pK6ojuJMjqI~RhQY!KYj&Sh)gjFIL z6C3)23lRyCSt8lc<;lbEConKr*yry$-VWPswX7~A$58RClX|S$RYqoN=lu9<5DqJ7cEzXwVpHhJyqlb}K z@g>(IA>ChbE8AIdJ78o=q@c(wD#O%r!X@Ux1JI@48mjx0wBb*8W?(w<3*WB!`YD^c z-WseFtJwRlcYi{2_gvyU`MWbJ1Q$s=+n#I{97n6ba|Q=iMmbq)?_YX*vRV$Gzvg{( zK9|_jdL(K(V)4_Nh^6|98M3wP;Q($$VPG|aFVq(AbGkrQx>eYel^}R^nY5&n~%sjH$ z512U=qH*}JXk4+q4eoeV%?uU z9skkY8;E5K5olbNXXA2)5s3Oh@*yZF&xy#V-MCt~^T5CiIsuDuY$e5a_C!kmrDH9 zhS-RJEL-wDCyuYn>#g%hyitbHuS!KK4GpCwY6a5dl|8_?u&}MnD-K1$0#R=7aO5O$ z%v+)x_fWwu(&sYqrgXlOM;9xvuQb-UtZ;38ea|2#*M%IY_uzUztJT+Xjy$qu zn*~;#{v;0PANA4lFDuIx_dj~88EQpGmJvg$Y)8`UmcX#hF{tV-p#uf8x-pa%or2WAMy!I$=3Z!iEKG)lssuGG#s zPZBiU$DRHXjOdau3WzYAs>bxWv+2YNd@pfTavkN<>^UQuzX zU0*G>n9ZuLc*Lis(>0v-{_L@BMmseeW%+mA*4u}F;rD3v}uPt)>_eH0JAF9}01{5o5Y_82=(oN#xXFdJp;l=j#MM0kIGqS&)r zciMP_&p6Mon?p%{hNh{O%&h!p`Lm z)SHJ54o)OexvKf4rI{I785!sPPtjyjacQ5A_39X+W<`&nW@E(Ml6#ewwsbfqp zP4~PrnH0i*=XjVfzm%fQ7-sCsAiRAlezY$N4v}7CY5hAnC|g`u;Llr~ex34RVr$>+ zkik(?v(sr6tc;<&PNnwKl*^3{K)YzD)%9{To+pj&tTx*Wrn0UwQCO%Z5$zO)lzN<8 zzNa=cE8gJ8Fo-n?PC?SL2!*-b^>}i=X!W{r?>oNspk#5cIh~kSs%5DWpyE%ScAT7; z22XBy2>9S5P#Ycul(8W1925F!daaiv$CcKqSd0h5r=$y(BWD#A9WbpCi z70q#*-k?y3_o~+1WY>HDD-N8v$46cb8v#{S>`;aeZ(5VEuV+dcBY3b?H9FGRA~`LR zis}=5KC)ibNkRQ^R+aJe=rd3aUU^-NX`?#0sNWp(j8*H-7QZPrck)LLoL(XY|$!kE4Eh{2+Z=5-w|@b~sq z%M155&Ay@Wq`s@gEdDB1NqM7Jh4-=ke8KE9T`T$Hc{)k}yXU`(jZv?-Wt+gOocK;f zGq5R#;p7Ow+bt`LaJ#nvXR%!Oa;|d3HlD6|1&NwD)4q9WJ@L-)Y}wcI++IDzTx|aC z&D@LLp-H)4)57;y4|=-qLx>pIWH_jZ;iV{RebO!-@!X$My*x`ULkSY7K!*8V)%8Ok z>e%!EvICTY6Q8DL2i+?x`A+*>4r~HBiNhDx&Qt;q9Q!dTT6FD=_ii2)(J4r69OHJoLl*6jTEOJ8r; z>8g7d4JAKZL7ID|-aO+XmKOO;Dek%%N0Wco=G~L0lGftQzXPfFxmYL^d;Nn}t=lV$ zGb0VwGqJOpctvn}yO&rilypVz>%(4rD=)rG2|T@SSv*>)F;lvoDJeigVkez6$-&~o zabkqN#*xHIU!{(m`n@#`FHpiiP7u#3LW29sJGKWN(!CcDV_Y@7yT4CIF<)sCy>(OM z?K{3sOQEx~#Sj(IJgoz@x;iYM-nX)Pe|2?NSXeKYrz^D0Na)OUD4bK>l{!FdFt0k=*QdtztRHs5 z-qR(!DS#=MNfBS{cDtP6@tJafk}lQ5z`|kK2;bdiT3|Mp!d6k;=KT1`tyAYLUZRJp zw4Ple((Wj|lRcRjn>gUdj)y9LTtTf0bx#VXD@+ zwlK`S zf6IfvdSsYtyCGIMkCR_k22M5~G0qpySNZd=Cu$P0y*u<99G6+A|IZp_A(890##wj% zmE&J3Eu8@&jK&=ZTP$|-Q0pZ9Sp;onB#(>L6 z_nN!g^WyP3zRZ(jl7;ZUCOzkUdYmdfaw~1yYHY%5Cbo6EKH;RF6U9LGUv=B?-Fdn_ z5s26N_eX6s=`A&W>3#jS_7PJVS4Ple%FQ8stosq~@%>Gz6bk>KrE=j+{uss5m-Nx6 zr472`rxT~yvc}`mw2`bEG*+r1=jJMJd0l|B zMFz(dzetGgSTKFOsh=j97dMy#?=M;ef)|LeUEmDc!{ZkMZH7c}eCuv_`(<+2_!xny zxx7jVQG5t4d}?(rOjf>rbbo`=`37 zl68Y6!3L(Lt~$>sr{!jw ziN69uNP>=FrCuqU`;+^6VN$f_6(M>$y4QV})5)R+PlC>c{pC=S)8#|N%J6nM3cm|l z-*U}at5xe#IZ%9Xf4+S#024L6`Tlm;%u?B*Zx|-*3*2x5=R-kYy2nOO9cmP!ZBBDe z!IoFLhuzM?=Rl`~AW}?>rI!82^_3dE`BSsK&FVcNtG2tlPhL+utH5y{po2x%n(r>P zMRwxBQ(^o{BhUwHI`_$+255i``eoN0{@}HI>;Eb4ES#$P{;!W80qGVgX(@?I zHwYqK(%s!99nuI~kZzC`kWxCOOIo_Sq?-%e-{w2d|L~j{W_0i#&pl_K9q+x?Yu%5a zhfdPdghUo8Ws6wOFO?m^H(N)k>(`alhhH3sJRZ8>43ejK%?!eL>}P+PT%O^F_iZ_! z)5XB|niWuTQA3fK3GuT!F@G#J2RsC{`}~^=XKgg03Nr?GZD-qj#b;q}Cb!FvdilJSzhtlC5`|KgTC<0Z;*QDX)+?i`LGc&L)@>W#Ta*?l5&p+tlHI@|M zH~1+iEImGytE>OK^A4UWbrayHFB>%q7w7l$YtwJOI=NLzV`gK+?g|qvX1Jlzu%Poe z(pxCbIkWgfM5ef2R^fg;OZ9N_9*pTDsm2fgeu3?Q0t)0j22dryGhv@JqAXAWrB~Yn z4N!%R3yZHB`taHs(HKf<3Ew7V!ui(M^Pw)}HCE<;#EEM(o~h$XMZ9o|p0jhu=6wfr zPuuzxbLy{rPfJIS94ax2IX-hqV_KjFv98&__)+ua0}|TQ+KOJIN(EHaXK}eh958#z zDh=^u*l@%LtOuSxTV^&IZ_6gyA>|sGC+j~)g>&}mey_8?nMOQf*x2x*_?DMddro*br@JC}g9df=c#*yxlorEw;=w-{vs&EfMunU$`Axof5>JV#41 znYj{HNi*BMB*DW>C|2CJJ3ea=?rYB5;NQbc>@R4Rb+?2LF=z5vpBx)28eAn3hi*T! zQbz82S&IQ);@96xZRYCP%IkTT-AVGlJ4c!z|7R0uG_g5=Pbbf3Jrx8T=_rULz}I+o zF6Z&@`+R+6ejQJFE|sg%X9|?e8!dmzuPZC<^*?_K(9;7SHgj0|@7*php()eYS~l&8 zYLig6OPip+b8@~h_@XOt+y;cKJf z6~Uc*_M2%Jm51KIu=!r_%s6Tc0x3@tYc}f*y!-4puq}x6fFZVTAHzA=@grZ%T08v9 zE{1d5J~Y?d|Nh7ld=B4?$UorstgRVGTKTX&UB0!GkE3R#8r`1V0U9BaZpK25vrXe! zee9dKPNlELyLfKbBEFiNu-0ba#B{^n#(eJ@nxD0<72i>Z#~KS8eMSD74At(}tb$~M zPFX2aB}r5J=nn7Il`acUp!DqI6pdwn zWylS4N*`2-3zXWz*np}@({krg*yrZ*vV;!bRT}9=hH>#I@90Q>q25svh02Xd23b6U zG6EQM!QNw50uURh=+ZpOyyU~cQeO3a_m75D6mxP%2Kxqf zf?AWTtbk(+`zh==oChZ}Tq`XN6-3s<|NVMBV?bJ`qs`AhSZn(M{MmZsx0lf2+e(a< zE1emZdWr3>2%nwT9pFVQMd=7a3S(>A)o-qY8^YIzv&%hi)*k7zBM5vh0!#ZSUK#lF z7rdgkkRBUKI?FyvBlR_^sqGT6-s2ghVeQTdvL?d$)V+-Z+5&SbpNws{dN} z1yiYmzCUbyR0o;aIR3(`l}~K-#`>=*l&$}@;aAdI5h9eZE;F~jZ=fj6>+EYIDa%Ku zs3=FW=uoS5fHgJqx)i>iUl}7ZcqmY4u{G&(MoNU$sP9lMf%3A+h*pBW%c*%uU0pr7 zwAA;P_7VSKX$z+u2aY%ymL;IT=#;x>NdEHJ=sj!oITsY@rkCSTd;Yxqg6ET7jQgj6?%XR&Qu#84)U~vttYHbuVe3FX4{M%j=cO2DlbNn8G)FYxaTU4a z!>g=`z*Rm1CNEhX71#Gs3tJ*hzls;O{I{!jZhar20osB1h$(>|Px!Be-`z!X#qhzY|IHP> zMieI1#c6Yn@X08Qrks|#nt_{UE7Ckl^T*>kJGM~p7rrjz36J}BPx{tC#qg-1jj%4- zm(Bc0zxkO3^3@k~bjz-fUe?#_Di-^heV2~!m~Znt-^n>%s2}ySX_cVabh#}|G4KXU zu7x56!EYKqN*XLwr`{VckU^0fn~V>KPrGXnb(L8I{%iD(lw_m<5kWFgo+^Xg<8CB= z>BZZ!SpT}(5_=e%;PXHP!{4e5=3svGGb6iZv~8e%?~0lwrX(Hd_`~t&@UA>8 zEbseBOa&*_r&NZ>yW8+`(i!;8b->~^_^Ee(h!urbai2X7Z@7NI`)KRBFeXn;MhAcR zJ7lYIU)%gEe87xhYEX3XZDgK-&*QM5V_V;>PeUV^ZnG4E#_1>AyMg37LE69OvW|bL za5=1T?r2XflCv`FvB>d^@6*SAh!FWG*r;AqS0}bOmmy_TG~$y%&Qi<~`m~=}R#_KK zs>zmgr=($D!IP1ut`5W&k{fAo>Vcz{gbIyo(Q7iVOdHaP!=r$!Ii1$F$PO!JX1Dtb z{OB^oeC)2O+bGsC;&lVxv#s8yqFg0nAAtNmWdRAEa;(M>BH7wftKQAw6~~fA4JA#PA9(HI9&#BYS_{PR|yBQK^uQI#&dy;U&Q zc3=M0i^ptcGa5l%Jj!RdxML_0gdLbwgnvuKTWfWi2GqS5mX}#w?d@ONrp-G`&chCN z6Wyy!`^Fb~K9;HPYY}^tsaZ2KAxntGzoW&Wr1BX#j#YIfPJU1MOfUO5Tr?~p;ksq# zPhWQUwcqm2;muiP^PZak`!jZ7VRbUv`BvM?LRd=o#N9k;-=nk1tp4RkzeA|KZate; zd;))f;`Tj1dh({-LQ`wo6|%TA8CfE`W$*ZLjJ}ZJ7BS~{4fW#{KV@okbSz9j>oy(1 zcyFsaYFX&m=657-E^Sq%%)E-|vN`T@nWQrcVi%fpyspG6MLc_Hk^Me*qbfktgMHf1 z^-d>xa+Jt~g*!)4g>dd6aua|57PR?lI~^puH9RLG@5*MSqJ2YeOUTx?IMt(3lD9B# z^}K!LgGO1W)sK&5j(=ycn+NHIIXG_G;my_GD4j;g))JJi?h;#gu1+dYexLMH7dWXX=FGZb%Adr6g;DX_Jt zuH?Y_c;apUkav$H!5>~an8S0w#`_b6QCyl`(cos?^&sHE!BT1m{QA)TP*4<>r@cUp zh37R{4fnLKz4pkR+;vYp-1jiV`@(GZ*y#lT05Ez%z^$-+=udc?zJ3w-V8p0pWiHm*RiFR^0t-g7?6~{|X5yABVm_ zf6JP)_~8^gVE^C0%sb`5Bsop&03V4oj*_zT6r^Q0fh@LFiW^w&@fAgOCYQCI-NiTT zuY4V@J@aL?%^pX!VlM?(vHc?;IyyRJQ0PYs&c1^?9a>*h4gih;_|1=%m9<)kQ&Ut~ zS+w-%%}plwW0t=RZ8&h!uX+Y&-e0S8CCl!-qHF)0gbf!C&hBp&y{`#6Tj<@gO zB_D>e4bqbmyf(+iE8YM3AJp4M-06U5k}n%6!nGHz^}K~eh0KG7I0VeBj7v4gWe+~> zv+(ibdfBc*Y_>oC7M}tweIpuH5Y6u`1Mcn%Ee+SuZ-kYMIEX7N{IsbPd~au#astlk z)6({O-W(j*R2;+ZezO@CtDNO%$^Yfmef;;6ciAti!|1E%J0|Ge;$;ItHJv71wt;wWX+V}ReEuXcqekdjFAMDb4U!J{M57#Orp|El5*toB5B zQ%}c-v^~`ArdehR=y%~OLGbYkD141XJVt&c7u=TD|KR4vU8q-W)LYk`eyi!gtVdMs z=d=1l`+XCc=eNJp)8u>&Ij{Z<=s-Mvz}6|Mu3y~Tc5da28V-zP^7`FfR3D)e3Ab$< z19_gkD*l2Mtzn08zDhv+K$|)fo1_F0jMVgBPfBL=Zfa`3^`sjvuDyrB;lnx~8P(E~ zzJh`dv=`P3%afs{vYjFEI6k_+(j65$o1bmdd(!7O(BF_4@47XO6cyoQKz-5igmaD~ zB1w4dbzsrNG_TE0Zttxpi%`kEzq9kriZy9A_uIKoPwmy{u<4Scuxn1J=-IXZszA(F z8L%;Z%4xh7G^7DbYDe|5o`Q24EVK_agsv3c4Dc`X7NU=y3;i#MnAO#@5+ID|t$AZXkff{G8IJ4fymU8hkfZ&sSPtrUAt@I=$(E!5Qhme0;k zXYk4}eLnr?-qtfQJ#PacGUJ&0HXQ#gJUqPZT(N7SF#9X?2M-Sdc6^@(^ML+6N{ZVw z9)c76l(BR7=m_ZC0ADe8C&fN$4#iY|H&5f=+nX4nh~ z<%XnL2xOT_aTQH|@o-DMTVTyZq+xY1(bunhQhl&6#w90u#w_B$smQXoPaYgRqVQj3 z)%u++@aac0cvh<-Ypx;29PCRD@gH*e#OctGc3gaV5y`OVS!kY1?IMcP5SUfX*;T(& zrpKw_Orym`227XQdYC!J#`1dI+z%%8nYFI%1p3!HEJ=MEU_t(=7&L%IQC}$Jp9SZu zzUn}a;cC?qeWG5|>i?d@%~!I1|Nc!(Ow1P(tM|176QkhlmQWyTldPyKkQ8b$AwLC+ z2582LNVG}ON8`#$kGi_1Xvs}C4ii)30~&B<|4r2pW3Y)ur;4y=K&nA9ESn$tQ;V6f zY(`4rYaot5%*HF6GoP=xzm3Lb?dYwSp98#@hr0-hDN#%j-TB_6emJ&nz~h`VtgacX zv3^mJNud~{G-fH*4{X{wQXDuecYPn%?s$0BvBdT~;$c@me_p7L9_UNDv zZ#8=ZTtWRpmIWu23$+Vs%!-k(%#ipftLoIKXF|KdCoZ~vqXzAb6+_PI_*SK*I1x|e zR!^$U%(L*7SD{U_VSb_c?b~6g*!0mX*Il=YX^oVD5URhn-JK1bG34z{*K0|TgN)C(R2pMCm)=n1y7Y4R9d)HF1GP|}?g#fYFFT6^Ou7HVMdz zR~x`n7s%q8|C|EEgq)V6k|?O|KteD0V2il1ex+kpKq@PS?<<-5&6(D)F#HV%l86S}HZ85}V3v8wO_ z*IbLDw@NVTlC zvc*KeUH<<5d}0Mo{*l2i_U1Zrxf8+^E46j{UuTzg0zEpp&mZ^0^xI9Dg<9KLtxrJ2 z|NEhTh8=?^V@WZ0w&ZW%pf^X>2xZjP^l(N!3F!b0#*;TIgWD1-=IgOo*qmLPJw#ca zZo~)|S)Gz-;^<^|sWKTAc! z-=pw<5;&MD!_D#Em$BXTF(Z*_9O>z8w-{fBHIZ(FR= zY{f;FBieFLBdJHm`_}e%EQ~G-BQxx24}8(mm!zT(!py~$NceKQ*tHg<$sqF2ZwXwM)7enFK(W$9y_vh!TN$;C%ISEoNKCfB*yT`@WChhz8 zW;5Z6ly`Ay392Nlo|6T|DIFcD80vSbtGg@f0+;w(`h=V69d%q)U+l~aYRbFd@6?D=%(PA=(GcN%CG&(=FGo^D`4w>6A&f0biWZI11c zprer~C`9_fOcZm9oEmuvS>3pJ27zSO=GY)a8Js2Z0cK4d*Dmm6j)+DyT=|ikn=7`q zhRo9(+(F6D^1WGidcL&Ltwgc>s?9m@9mMiz@#2k~!<#pl*0eM&rLvx)#tF`jBV3C9Pz9b-;Mo$iS~1yGIFMh=>%8HJ{Kn^F@CV`|2^y7q7I3W zJc`u&2rkyhsLcZT#IvP8BEtJifqF4Mwvf>~*XAvIdzKW|2j5c@H~Hx69w5gsw$LDq z8Dj*TPv3Nn0|mw2f4!2x`6lz$m?%yDy^)cG=gqgbddSqEVBE10>*L=eZOV)dILxZrWt6l@d zawN0*2&JL&hUyx^#T?CVEH0<7U(@mKC)7vTqh7D9{BcJ#79|v0^d2Bhu73LEDgz?h z7pHq#aU$^&14QD@w`!=!JPU6UK7@q>%qE-91bS#!E~Z~7{gD$Gc%XpzTW7C3x)E&% zCuv-2n3OU8#jd2t5cV+_jU2&<7WAs+2CX{f8kL6a{^NNcOqX6e!B4u3n&s)xzr;+V zAeI-Xzp--gh&Es=E4?#@KLT+CmbIX2oOEJZQc_%s$6Lm|7Pb9hH&lLfXwlX=KPqb6 z$B!aB+-gKwiZ9WE4Sd-R$_{Vw?|VtX1GVDv@Zc3WnJ`2ME6&X|zCGJgg)y+PT^G)s zot=TwPDy@#a6`8gg`dPfn%VL3(+N4Y+gZ={!NI|ZY@Z6bpxv+?ixf7)<*~8VYgWwn zUS5qUSpZ)M0MfK~l`19o%lOnSR%C{3izD9G!I&?w$WCByem@_=HYEa3j-pq8)xEfH6%^-*;XHtVfM5g_8M<%*3~m*mi3nCKgyszqPe>dwbhT-l<}`I@7nk+!j@N=Q6rvR~ z2U#Eu1`wpZutkM7#-$vYl6Gk0*N}*H0^hNvNWGzz!18!Gz;@VjHu$onW+(Qvtg_{n zTA%vMY$GQn-S+l+54W@PYoBXL|En~kJ(czR{?~%LYipOWLMj>Y>qq;McUQW-A*d+1 zpHox6r5H3lG_TbDFgzw1B*RCb1$BSm!yU%djFF#^+s6Rsz%p@ zU6h-f|Bdh`a0e8lo#B3h2~;Rd2f4oVmJflpG6nfUuPF*KR0o}Cz+4be(!Pu zv{99#2p4ks<2V7-9&TN_er0-;IF?#&?CLcnF5gdMjZ6W3cp zh`A{O`*%t@$_O6`6t5#*PR@i>1FCHeA!w$s4G|+JYUtDxZh^?4dmcfq&4E795 zZXQM8RR`6HR$X9&Y;8WfzXhGZQ3oB#KX<{H4P0DYve0!KW#vibBL07BHd$IfR2fX@ z6waIxo_~gYmMvsrVHqAC-a5YpgO3q#ei_rcfHcl>U<%2HA<*gJ74D3pBVO4N?# zYlmPp2=U2Z@BzCvf|o02baZ(5O&W~PbsOU}Xmn_Z^kTSNjVUTB3RnCoJ4En1Naa!f z__5kzm}FgY)5Qxwu-F5|r~$sEnwsZ%A{sjS7oLsvbucV&kqkq!&DcPD^mNp$wh|fGR`prpq}Or!NQzcSNA|i7XXAS`nT3(WX7GH<8X1QtNFeT z6)u-NUjvIGjWPh3&X6xh4lc^gUF$^B{Pd~wa6xRjK!h>`$Hi0&KgW>MIgd+FkpE5S z-gyuK!V&)g=#T3i^has3+uONGpc2%3x5v~V87D8V(~66U01c2Fa&ipS)VQKEmBD?x z_z#$z6$HW42koh+r$?p4ZEG+IBtU^z6?EaWfXODIw%+V>1!7Gsu}`H$ad|HPI8rLo z{S*dSCPHiIap%svV^q{fdr2>;5(a>s5QGjvB{#so_PL^EW@ct*uU^s0O#x{+jvOq~ z*=8$q)a4q@#$CuA8ib)y)r4a#{cYZt`=CotNlbj_`Ajlglm-J_B(OLBnp0DxA6ir1 zzob2o6_U_6s0j;8O-?@W_6r8eI}6Uv&LDjJU;?z!f-ggByBtJK=^26<>3>*Q0turQ zt^Qa!U|k8cyhB;qcB+V`U>h76(XM)ztBi3>{;Z)GlPgcLMdQUCVKpSgQzj)jnL4Be zo4a54=vCaSiGw5=41Ui$Lp{9~hb6#}R#R2YpWFjB$9{Yc@Zg1iK|rcXL~QJgP3=QA z=-WRD=!2}5cM6x@eR72p**O(@jX!5@K?g|tnl!?ovVP7^_=R=Y9c`h?-reQFil1q) z5qgwJ_C6{{D!SGG-lLr*5ztxgjOI92YgK47i)YyT>Sm-E5@?s_710$c&h(n>k&tG9 zmU4Ad{Gkg%9)|iF%gfU8+W>8yRztz10L;dcgH2L$9fV~J4S@6t;t7vu4ac}LiJNSY z^*7KXGg2I>`-z{t-ot-4H#e=g(m^Ln9a3k%FwNUS>B0y?G$uKpgT(7sgoNPYn`GP2y)Wrl6DmqS4^T^sEU3 z+oL&fbD!qY{P$M1-l9=~IA~6do$^JH1jdrWo>+YjB*c4$xSFB@q4b1=uc^Cz$T3|4RMVpBVB#pO+s#_LEPw?5`5*p1QC5&QzYa^8iu zII4Kv_1-+Y14f|hq)P6>35*)HC@U>J!_dDVF#!|{a0`r$je+r$nb5G&rDu|o-7G#M zS?1xwg9wo$_77;z`fCqr*{C<>H*#xP`(%1~}Gr?>FD*2~i!@X90)Mw zZHgu*C3)?Kx7}`M0Kj~?#?H>pwSLW>Obs(5<6hcQBdA>l1^w5k$C@$($P~Qx^AbNK z4tIA!H$DUu%tKq}+rykh7={54+^6NBYXk01X058v4TiNkhm9$q)0vo1S*M{^_yk79 z>=7ImkiF3bTcG7_p>MPr&s%9}TE5Ba`FJ1>8rR27I6H>8ip$Soi-iN1EHjA8{y`xf z{!&yX1{`!Df(a$@(lrAEdvYlwnf#oTltzg#gx{?}qdWN4pZE6mK*4-gOX)RW!Z(63 zDVrGiVcQjC;2h6Z(|{od5O#KKlfYNTMK=M%G?2_i(13Oi$cEIts35)zRw0!%v=wkW zWGFQA!OwynyglX|#MM`|I|>6^XR)G>H;45rpzg;c&cMO~)yj~~1apcaWrn-f6p)%l zjh=MF&Bo>kZbmSx`sH#}PJtzDFkCQsFTn2UwF#UHPaT8Mf=Ss^vX^RcqGqKeDb$XQ zhxYuHU{Wb2#*dh2uHqsKHhlpanyy&*$TK2-hk75dDPN{hP6F2HTGvPy8U_YOC5r6R ze#AeYzreDatuh9& zpF5h!`Xt?w+uf(YZvs5YS;<$k>pe1)MbL|v&k$Bw0hNP#))g_jC=Lpk&rb<&U?pe3 z&_YHutF13=P>FrGPtw?dL7Fr_VlovaafweaYdJbHJPd73@C8M1Y`*`s)6=K=Mv`p6 zWtrhXXXi)`pYu_14t0e->C7@KS4L||@|rMx=){28^5(hY;MP${$mYexoa>HkOW7u< zrY`R`rZ6LXUbK=R0_CZ95MDt+i_Q@IzF5PuA9ign9}EmDAtbki=u3xJ)z0*xCV7*! zLI$mBHklAAp*QB!f6}T?PnR7rvB3%z0Zvi~u0=tjhLyy+PPH4ov(!P^CfDk??AEG#*~9w&%stcnt}f|E}T3)KAsxyi{$>3`2}G$ zbUX@z0@&`1j54e#Z~_X$Pp5f0Wv$B-opyEvJiOsrf{#}g;c+J^~gb1VPaij|-09pgY;LK7#nF|`wmtF>3 zOj^}|845V|CX4Z>Aa|XRXvO05+k2mC zCvpV;@%edyX?^g0*P7*MFc8Siz=j5xKM@}oAguE8#mLddS05n}*@NgMrx~xK#vM0- zC9UiK5ZXH+7?CJKpC#RQIG;`}luGIR1Xw|Me1ZEv3&lMMUwiud4TZ%2LOM=FBmNiC zu^IqQ1&-fv5W)kF&+w;s9&o__U$o5s#}mNd7RGNH`W9kso-Rn{gQ7%*xKYsm0Vk11 AUH||9 literal 0 HcmV?d00001 diff --git a/docs/_images/memory_layout_of_v8_function.png b/docs/_images/memory_layout_of_v8_function.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a460537430c01a45f8e0f769094db7177b2bbe GIT binary patch literal 75895 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 literal 0 HcmV?d00001 diff --git a/docs/_images/v8_promise_lifecycle.png b/docs/_images/v8_promise_lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..919cd326080ba9039524953d75741a77f3130e24 GIT binary patch literal 40832 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 literal 0 HcmV?d00001 diff --git a/docs/_sources/development/build.rst.txt b/docs/_sources/development/build.rst.txt new file mode 100644 index 000000000..743b30f33 --- /dev/null +++ b/docs/_sources/development/build.rst.txt @@ -0,0 +1,18 @@ +=========== +Build Javet +=========== + +It's quite hard for developers to build Javet successfully for various reasons. + +* Node.js needs to be built to static libraries. +* V8 needs to be built to monolith. +* Every OS platform has its own pitfalls which usually make developers frustrated, or even desperate. + +Here are 3 ways of building Javet. + +.. toctree:: + :maxdepth: 1 + + build_javet_with_docker + build_javet_with_pre_built_binaries + build_javet_from_scratch diff --git a/docs/_sources/development/build_javet_from_scratch.rst.txt b/docs/_sources/development/build_javet_from_scratch.rst.txt new file mode 100644 index 000000000..786b9b0ff --- /dev/null +++ b/docs/_sources/development/build_javet_from_scratch.rst.txt @@ -0,0 +1,153 @@ +======================== +Build Javet from Scratch +======================== + +Build Environment +================= + +Linux Environment +----------------- + +* Ubuntu 20.04 +* CMake 3.10+ +* JDK 8 +* Gradle 7.0+ + +MacOS Environment +----------------- + +* MacOS Catalina+ +* Latest Brew +* Xcode 11.4.1+ +* Cmake 3.16+ +* JDK 8 +* Gradle 7.0+ + +Windows Environment +------------------- + +* Latest Windows 10 +* Visual Studio 2019 Community +* CMake 3.16+ (comes with Visual Studio) +* Latest Windows 10 SDK with WinDbg +* JDK 8 +* Gradle 7.0+ + +Build V8 +======== + +Please follow the `official guide `_ to build V8. If you face any issues, you may contact `@sjtucaocao `_. + +Prepare V8 +---------- + +* Clone the source code. +* Checkout a proper version. + +Also, please make sure ``args.gn`` file looks like the following. + +.. code-block:: ini + + is_debug = false + target_cpu = "x64" + v8_monolithic = true + v8_use_external_startup_data = false + is_component_build = false + v8_enable_i18n_support= false + v8_enable_pointer_compression = false + v8_static_library = true + symbol_level = 0 + use_custom_libcxx = false + +Build V8 on Linux and Mac OS +---------------------------- + +.. code-block:: shell + + export PATH=path_to_depot_tools:$PATH + cd root_path_to_v8 + ninja -C out.gn/x64.release v8_monolith + +âš ï¸ In V8 v9.3, the following file needs to be patched. + +./include/cppgc/allocation.h +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: cpp + + #include + #include // This line needs to be added. + #include + +Build V8 on Windows +------------------- + +âš ï¸ The patch script requires Python 3. + +.. code-block:: shell + + set PATH=path_to_depot_tools;%PATH% + set DEPOT_TOOLS_WIN_TOOLCHAIN=0 + cd root_path_to_v8 + ninja -C out.gn/x64.release v8_monolith + python root_path_to_javet\scripts\python\patch_v8_build.py -p .\ + ninja -C out.gn/x64.release v8_monolith + gn gen --ide=vs out.gn\x64.solution + +Why Patching? + +A few ninja files set certain warnings as errors so that MSVC stops compilation. The patch is to turn off those errors. + +Build Node.js +============= + +Please follow `Building Node.js `_ to build the static and LTS version of Node.js libraries. + +Prepare Node.js +--------------- + +* Clone the source code. +* Checkout a proper version. + +Build Node.js on Linux +---------------------- + +âš ï¸ The patch script requires Python 3. + +.. code-block:: shell + + cd root_path_to_node_js + python3 root_path_to_javet/scripts/python/patch_node_build.py -p ./ + ./configure --enable-static --without-intl + python3 root_path_to_javet/scripts/python/patch_node_build.py -p ./ + make -j4 + +Why Patching? + +* First patch: All static node libraries are ```` libraries. The patch is to disable ````. +* Second patch: Many static node libraries are not compiled to `position independent code `_ and link phase is broken with the following error. The patch is to set ``-fPIC`` to those make files. + + /usr/bin/ld: /....../out/Release/libnode.a(node_binding.o): + relocation R_X86_64_TPOFF32 against ``_ZN4nodeL23thread_local_modpendingE`` + can not be used when making a shared object; + recompile with -fPIC + +Build Node.js on Mac OS +----------------------- + +.. code-block:: shell + + ./configure --enable-static --without-intl + make -j4 + +Build Node.js on Windows +------------------------ + +.. code-block:: shell + + vcbuild.bat static without-intl + +Build Javet +=========== + +Once Node.js and V8 are ready, please proceed with :doc:`build_javet_with_pre_built_binaries`. diff --git a/docs/_sources/development/build_javet_with_docker.rst.txt b/docs/_sources/development/build_javet_with_docker.rst.txt new file mode 100644 index 000000000..71c78fdce --- /dev/null +++ b/docs/_sources/development/build_javet_with_docker.rst.txt @@ -0,0 +1,64 @@ +======================= +Build Javet with Docker +======================= + +The Docker build supports building Javet for Linux and Windows. As Docker supports Linux and Windows with WSL2, Javet for Linux can also be built on Windows. + +Regarding Docker build for Mac OS, contributors are welcome if you are interested. Or, you will have to wait for a long while. + +Build Environment +================= + +Linux Environment +----------------- + +* Ubuntu 20.04 +* Git +* Docker + +Windows Environment +------------------- + +* Latest Windows 10 +* WSL2 + Ubuntu 20.04 +* Git +* Docker + +Docker Hub and Github +--------------------- + +Please make sure the network connection to the Docker Hub and Github is up and running. The Docker repository of the Javet images are available at https://hub.docker.com/repository/docker/sjtucaocao. + +Build Javet for Linux on Linux or Windows +========================================= + +1. Clone Javet. +2. Navigate to the root directory of the Javet repository. +3. Execute ``docker build -f docker/linux-x86_64/build.Dockerfile .`` (Be careful, please include the last ``.``). + + * Docker will pull the corresponding image (~10GB) from Docker Hub. + * The actual build takes few minutes including pulling dependent libraries from Maven Central, building and testing. + +Build Javet for Windows on Windows +================================== + +1. Update daemon.json + +.. code-block:: json + + "storage-opts": [ + "dm.basesize=120GB", + "size=120GB" + ] + +2. Restart WSL2 +3. Restart docker +4. Clone Javet. +5. Navigate to the root directory of the Javet repository. +6. Execute ``docker build -t sjtucaocao/javet-windows:x.x.x -m 4G -f docker/windows-x86_64/base.Dockerfile .`` (Be careful, please include the last ``.``). +7. Execute ``docker build -f docker/windows-x86_64/build.Dockerfile .`` (Be careful, please include the last ``.``). + +Note: + +* The base image is so large (60+GB) that it's not efficient to push the base image to docker hub. Of course, without the base image at docker hub, it's not wise to enable the github workflow for Windows build. +* Building the base image takes many hours and may experience intermittent errors. diff --git a/docs/_sources/development/build_javet_with_pre_built_binaries.rst.txt b/docs/_sources/development/build_javet_with_pre_built_binaries.rst.txt new file mode 100644 index 000000000..6ca9c1db0 --- /dev/null +++ b/docs/_sources/development/build_javet_with_pre_built_binaries.rst.txt @@ -0,0 +1,83 @@ +=================================== +Build Javet with Pre-built Binaries +=================================== + +Build Environment +================= + +Linux Environment +----------------- + +* Ubuntu 20.04 +* CMake 3.10+ +* JDK 8 +* Gradle 7.0+ + +MacOS Environment +----------------- + +* MacOS Catalina+ +* Latest Brew +* Xcode 11.4.1+ +* Cmake 3.16+ +* JDK 8 +* Gradle 7.0+ + +Windows Environment +------------------- + +* Latest Windows 10 +* Visual Studio 2019 Community +* CMake 3.16+ (comes with Visual Studio) +* Latest Windows 10 SDK with WinDbg +* JDK 8 +* Gradle 7.0+ + +Download Pre-built Node.js and V8 +================================= + +âš ï¸ As the docker builds are available, I have stopped publishing pre-built binaries. If you really need them, please contact the maintainer wisely. Legacy pre-built binaries are at this `drive `_. + +Build Javet JNI Library +======================= + +Once Node.js and V8 are ready, please navigate to ``./cpp``, make sure CMake is accessible and execute corresponding build script. + +=========== =================================================================== =================================================================== +OS Node.js V8 +=========== =================================================================== =================================================================== +Linux ``sh build-linux.sh -DNODE_DIR=/absolute_path_to_node_js_build`` ``build-linux.sh -DV8_DIR=\absolute_path_to_v8_build`` +Mac OS ``sh build-macos.sh -DNODE_DIR=/absolute_path_to_node_js_build`` ``build-macos.sh -DV8_DIR=\absolute_path_to_v8_build`` +Windows ``sh build-windows.cmd -DNODE_DIR=/absolute_path_to_node_js_build`` ``build-windows.cmd -DV8_DIR=\absolute_path_to_v8_build`` +=========== =================================================================== =================================================================== + +After a while, the following libraries will be placed in folder ``src/main/resources``. + +=========== =========================================================== ========================================================== +OS Node.js V8 +=========== =========================================================== ========================================================== +Linux ``libjavet-node-linux-x86_64.v.*.*.*.so`` ``libjavet-v8-linux-x86_64.v.*.*.*.so`` +Mac OS ``libjavet-node-macos-x86_64.v.*.*.*.dylib`` ``libjavet-v8-macos-x86_64.v.*.*.*.dylib`` +Windows ``libjavet-node-windows-x86_64.v.*.*.*.dll`` ``libjavet-v8-windows-x86_64.v.*.*.*.dll`` +=========== =========================================================== ========================================================== + +Build Javet Jar +=============== + +Once all these libraries are built, please put them altogether under ``src/main/resources`` then kick off ``gradle build test``. + +After a while, ``javet-*.*.*.jar`` will be placed in folder ``build/libs``. + +Upload Javet to Maven Central (Optional) +---------------------------------------- + +Package Jar files in Maven. + +.. code-block:: sh + + # mvn package + mvn clean + mvn release:prepare + mvn release:perform + +Jar files are built under ``./target``. diff --git a/docs/_sources/development/debug_with_chrome_developer_tools.rst.txt b/docs/_sources/development/debug_with_chrome_developer_tools.rst.txt new file mode 100644 index 000000000..94cf38767 --- /dev/null +++ b/docs/_sources/development/debug_with_chrome_developer_tools.rst.txt @@ -0,0 +1,94 @@ +================================= +Debug with Chrome Developer Tools +================================= + +`Chrome DevTools `_ (aka. CDT) is a set of web developer tools built directly into the Google Chrome browser. DevTools can help you edit pages on-the-fly and diagnose problems quickly, which ultimately helps you build better websites, faster. + +CDT Shell +========= + +Javet ships a demo :extsource2:`CDT Shell <../../src/test/java/com/caoccao/javet/tutorial/cdt/TestCDT.java>` application to demonstrate how to work with CDT to perform a live debugging. + +1. Run CDT Shell +---------------- + +Run CDT Shell as a normal Java console application and an interactive console will appear working just like a node console does. + +2. Run Script in CDT Shell +-------------------------- + +Run arbitrary code in the console just like what can be done in a node console. + +.. code-block:: js + + > let a = 3 + undefined + > let b = 4 + undefined + > a + b + 7 + +3. Open CDT +----------- + +Open chrome://inspect/ in Chrome, wait few seconds and Javet will appear as a remote target. + +.. image:: ../resources/images/chome_developer_tools_devices_remote_target_javet.png + :alt: Remote Target Javet + +4. Debug as Usual +----------------- + +Click ``inspect``. Voilà, DevTools is up. As the screenshot shows, live evaluation and auto-completion work successfully. Enjoy the live debugging. + +.. image:: ../resources/images/chome_developer_tools_console.png + :alt: Remote Target Javet + +Chrome Developer Tools Internals +================================ + +Handshake +--------- + +* CDT Shell listens to port 9229 by default because CDT constantly queries http://127.0.0.1:9229/json for remote target. CDT Shell tells CDT that it is a node flavored remote target via http://127.0.0.1:9229/json and the websocket address is http://127.0.0.1:9229/javet. +* CDT queries http://127.0.0.1:9229/json/version for protocol version. CDT Shell currently uses v1.3. The complete protocol API docs are available at https://chromedevtools.github.io/devtools-protocol/. +* CDT queries http://127.0.0.1:9229/javet with a websocket upgrade request. CDT Shell responses with websocket upgrade accepted. +* CDT switches to ws://127.0.0.1:9229/javet and sends the following 8 messages to perform a handshake with a node flavored remote target. + +.. code-block:: js + + Chrome: {"id":1,"method":"Runtime.enable","params":{}} + Javet Notification: {"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"origin":"","name":"Javet Inspector 00000000","uniqueId":"00000000.00000000"}}} + Javet Response: {"id":1,"result":{}} + Chrome: {"id":2,"method":"Debugger.enable","params":{"maxScriptsCacheSize":100000000}} + Javet Response: {"id":2,"result":{"debuggerId":"00000000.00000000"}} + Chrome: {"id":3,"method":"Debugger.setPauseOnExceptions","params":{"state":"none"}} + Javet Response: {"id":3,"result":{}} + Chrome: {"id":4,"method":"Debugger.setAsyncCallStackDepth","params":{"maxDepth":32}} + Javet Response: {"id":4,"result":{}} + Chrome: {"id":5,"method":"Profiler.enable","params":{}} + Javet Response: {"id":5,"result":{}} + Chrome: {"id":6,"method":"Runtime.getIsolateId","params":{}} + Javet Response: {"id":6,"result":{"id":"00000000"}} + Chrome: {"id":7,"method":"Debugger.setBlackboxPatterns","params":{"patterns":[]}} + Javet Response: {"id":7,"result":{}} + Chrome: {"id":8,"method":"Runtime.runIfWaitingForDebugger","params":{}} + Javet Response: {"id":8,"result":{}} + +Note: Method ``Runtime.runIfWaitingForDebugger`` can be regarded as the handshake completion and there is no need to parse this message because it is exposed as a callback in ``IV8InspectorListener``. + +Actually, inside V8, the first message can enable the debugging without the rest of them. Please refer to the :extsource2:`source code <../../src/test/java/com/caoccao/javet/interop/TestV8Inspector.java>` for detail. + +Customization +============= + +Yes, please feel free to customize the debugging server in your environment. CDT Shell is created as a showcase for further customization. Here are some tips. + +* Integrate with your HTTP and WebSocket servers. CDT Shell currently uses embedded Jetty. Be careful, HTTP and WebSocket servers need to be hosted together, otherwise, CDT refuses to communicate with the WebSocket server. +* Add your ``IV8InspectorListener`` to intercept all the event messages. In practice, a decent JSON library like JackSon, GSon may help interpret those messages. As a demo, CDT Shell doesn't process those messages. Why intercept those messages? Because: + + * To set up breakpoints before script is executed. + * To send messages to CDT right after CDT is connected. + * To turn on / off certain features. + * To enforce authentication and authorization. + * To change V8 runtime. diff --git a/docs/_sources/development/design.rst.txt b/docs/_sources/development/design.rst.txt new file mode 100644 index 000000000..98edc382e --- /dev/null +++ b/docs/_sources/development/design.rst.txt @@ -0,0 +1,150 @@ +============ +Javet Design +============ + +Architecture +============ + +.. image:: ../resources/images/javet_architecture.png + :alt: Javet Architecture + +Primitive and Reference Types in Javet +-------------------------------------- + +There is a vague boundary between V8 primitive and reference types. In Javet, the definition of primitive is a mixture of both V8 and Java primitive types as a trade-off in design. + +=========================== ======================= ============================== +Feature Primitive Reference +=========================== ======================= ============================== +Interception No Yes +Memory Copy Copy by Value Copy by Reference +Resource Leak Not Possible Possible +Set to Weak No Yes +=========================== ======================= ============================== + +Reference typed objects keep memory footprint in V8 + JNI + JVM. All resource will be recycled when ``close()`` is called. That is quite an old school way of managing resource. Javet tries to hide that kind of tedious work from Java applications via try-with-resource. + +Please refer to :doc:`../reference/best_practices` for detail. + +Node.js Mode vs. V8 Mode +======================== + +Javet supports both Node.js mode and V8 mode both of which can co-exist in one JVM. In other words, they can run side by side and don't interfere with each other. + +.. image:: ../resources/images/javet_modes.png + :alt: Javet Modes + +As the diagram shows, both Node.js and V8 are lazy loaded in dedicated custom classloaders. Detailed comparisons are as following. + +=========================== ======================= ============================== +Feature Node.js Mode V8 Mode +=========================== ======================= ============================== +Lazy Loadable **Yes** **Yes** +Customization **High** **High** +Node.js Ecosystem **Complete** No +Security Low **High** +Unload **Yes** **Yes** +V8 Ecosystem **Complete** **Complete** +V8 Version Low **High** +=========================== ======================= ============================== + +One of the beauties of Javet is all the features in V8 mode can be applied to Node.js mode. Here are some examples. + +* Virtualization - All Node.js modules can be virtualized. E.g. ``console``, ``fs``, ``HTTP``, ``Net``, ``OS``, etc. +* Zero-copy - JVM can share the same byte buffer with Node.js and V8 to achieve zero-copy. +* Multi-threading - Multiple Java threads can host multiple Node.js runtime instances with only one copy of V8 objects visible to those instances. +* Beyond Node.js - Javet allows explicit ``await()`` so that applications can take more control over ``async`` execution. + +Module +====== + +Executing all scripts in global context is not recommended when project size increases. Javet provides complete support to applications so that V8 runtime context is aligned with the way Node or Chrome does. That brings the module system. + +Unfortunately, V8 has very limited support to the JS module system. However, that is not bad because V8 leaves all the possibilities to Javet. The typical challenges Javet faces are as following. + +* Sync or Async +* Module Location +* Module Dependency + +require() vs. import() +---------------------- + +=============== =========== ======================= =================== ============================== +Feature Async Original V8 Javet Node.js Mode Javet V8 Mode +=============== =========== ======================= =================== ============================== +``require()`` No No Yes (Complete) Yes (with an Interceptor) +``import()`` Yes Yes (Partial) Yes (Complete) Yes (Complete) +=============== =========== ======================= =================== ============================== + +Module Virtualization +--------------------- + +Javet doesn't build ``require()`` in but allows applications to set an interceptor because Javet doesn't know how to locate the modules and doesn't want to know for security issues. So it's up to the applications to define their own ways of locating the modules. + +Javet provides complete support to ES6 ``import()`` because certain work inside JNI has to be in place as V8 only partially supports ``import()``. So, in Javet the module is kind of virtualized, in other words, the module is represented by an arbitrary string that can be interpreted by applications during runtime. E.g. ``module.js`` may come from a file, a URL, a string in memory or whatever. Javet stores the compiled and evaluated module in a map with that string as key, and feeds V8 that module when V8 looks it up by that string. + +.. image:: ../resources/images/javet_module_system.png + :alt: Javet Module System + +Engine Pool +=========== + +.. image:: ../resources/images/javet_engine_pool.png + :alt: Javet Engine Pool + +V8 Isolate and Context in Javet +------------------------------- + +`Getting started with embedding V8 `_ is an excellent article that explains the concepts, design, insights of V8. In summary: + +* An isolate is a VM instance with its own heap. +* A context is an execution environment that allows separate, unrelated, JavaScript applications to run in a single instance of V8. + +In Javet, that model is simplified to 1 engine - 1 runtime - 1 isolate - 1 context. In V8Runtime, ``resetIsolate()`` and ``resetContext()`` are both exposed. It is recommended to always use ``resetContext()`` to get a brand new V8 context for the following reasons. + +* ``resetContext()`` is a much cheaper operation with much better performance. +* ``resetContext()`` is good enough in terms of getting a brand new V8 context. + +Javet Engine Pool +----------------- + +Multiple Javet engines are managed by Javet Engine Pool which works almost the same way as a typical DB connection pool. Javet Engine Pool is thread-safe. However, Javet Engine is **NOT** thread-safe because it is designed to be single-threaded and lock free for the following reasons. + +* V8 isolate and V8 context are single-threaded. Thread context violation results in V8 core dump immediately. +* Javet Engine performs better without locks. Actually, Javet engine only validates current thread ID to minimize the performance overhead. + +Please refer to :doc:`../reference/best_practices` for detail. + +Interception +============ + +Javet allows intercepting almost all V8 API so that JS code actually interacts with Java code behind the scene. + +.. image:: ../resources/images/javet_interception.png + :alt: Javet Interception + +Sample code is available at :doc:`../reference/v8_function`. + +Cross-platform +============== + +Javet packages all the libraries in a single jar file and automatically loads corresponding library per OS and JS runtime. + +.. image:: ../resources/images/javet_cross_platform.png + :alt: Javet Cross-platform + +* Javet calculates the library file name from OS and JS runtime. +* Javet unpacks the library files from resource directory to ``system_temporary_directory/javet/pid``. +* Javet loads the library files using either default classloader or custom classloader. + +Multi-process Safety +-------------------- + +Javet is multi-process safe because it deploys the library files to ``system_temporary_directory/javet/pid`` to avoid race conditions during initialization. Also, Javet purges legacy libraries (at least 1 minute old) at the beginning of the initialization. + +Memory Leak Detection +===================== + +Javet native library keeps track of every ``new`` and ``delete`` in ``JavetNativeMonitor``. Javet every unit test case fetches the tracking data, compares the ``new`` and ``delete`` count to verify unmanaged objects are properly allocated and freed. + +This feature is only turned on in debug version and there is zero performance overhead in release version. diff --git a/docs/_sources/development/index.rst.txt b/docs/_sources/development/index.rst.txt new file mode 100644 index 000000000..db4ce780c --- /dev/null +++ b/docs/_sources/development/index.rst.txt @@ -0,0 +1,12 @@ +=========== +Development +=========== + +.. toctree:: + :maxdepth: 2 + + tools + build + test + design + debug_with_chrome_developer_tools diff --git a/docs/_sources/development/test.rst.txt b/docs/_sources/development/test.rst.txt new file mode 100644 index 000000000..09adda82b --- /dev/null +++ b/docs/_sources/development/test.rst.txt @@ -0,0 +1,7 @@ +========== +Test Javet +========== + +Test is designed to completely reuse test cases for either Node.js or V8 mode. + +How do test cases know which mode to test? The base test suite compares the timestamp of the Node.js and V8 libraries and set test target to the newer one. So, if a new library is built, test cases automatically set test target to that new library. diff --git a/docs/_sources/development/tools.rst.txt b/docs/_sources/development/tools.rst.txt new file mode 100644 index 000000000..d53ed7ba7 --- /dev/null +++ b/docs/_sources/development/tools.rst.txt @@ -0,0 +1,38 @@ +================= +Development Tools +================= + +JDK +=== + +Javet development requires JDK 8 to be installed, though Javet supports JDK 8+. JDK 6 support has been dropped because a few JDK 8 features are heavily used in Javet. + +IntelliJ +======== + +I personally recommend IntelliJ IDEA. + +Gradle +====== + +For now, Gradle v7.2 + Kotlin DSL constructs the build system. + +Node.js +================= + +Node.js 14.17.6+ is supported. + +Maven (Optional) +================ + +Maven v3.6.3+ is used for packaging bundle to maven central. + +Visual Studio Community 2019 (Optional) +======================================= + +Visual Studio Community 2019 is used for JNI development. + +Python 3.8+ (Optional) +====================== + +Python 3.8+ is required if you want to upgrade the version. diff --git a/docs/_sources/faq/background/history_with_j2v8.rst.txt b/docs/_sources/faq/background/history_with_j2v8.rst.txt new file mode 100644 index 000000000..447a3fff7 --- /dev/null +++ b/docs/_sources/faq/background/history_with_j2v8.rst.txt @@ -0,0 +1,65 @@ +================= +History with J2V8 +================= + +J2V8 Issues +=========== + +J2V8 is an excellent project on embedding V8 in Java. However, J2V8 community hasn't been active since 2017. + +The last Windows version 4.6.0 was released in 2016 and the last Linux version 4.8.0 was released in 2017. The V8 in Windows v4.6.0 doesn't even fully support ES6. + +The latest community activities were around Android versions. The Node.js API was dropped. The Windows build has been seriously broken for years. The Linux build is nearly broken. There are serious memory leak issues which are hard to be fixed under the current architecture. + +Its API has stopped evolving for years. Many new features I expect just don't get any chances to be implemented. Obviously, if the build system was broken and couldn't be easily fixed, almost no one would like to contribute. That includes me. When I was trying to fix the build system for Windows and Linux, I had to admit that's so, so, so, challenging. Why is that? I think it's not merely J2V8 community's problem because in the meanwhile V8, Node.js and ECMAScript move forward rapidly causing many unexpected challenges. Someone or some team needs to look after J2V8 from time to time. Unfortunately, the reality is cruel. + +J2V8 Latest Version +=================== + +I managed to unofficially build the latest `J2V8 v6.2.0 `_. + +* V8 is upgraded to v8.3.110.9 which was released in May, 2020. +* Windows and Linux are supported. +* Node.js is dropped temporarily. + +I've tested the performance between ``j2v8_win32_x86_64-4.6.0.jar`` and ``j2v8_win32_x86_64-6.2.0.jar`` on a Windows machine with CPU i7 10700K. The test code is just ``1+1 -> 2``. Here are the comparisons. + +=============================== ============== ============= + Case 4.6.0 (TPS) 6.2.0 (TPS) +=============================== ============== ============= + Single Session with 1 Thread 1,003,009 1,338,688 + Ad-hoc Session with 1 Thread 35 299 + 4 Sessions with 4 threads 2,274,019 4,571,428 +=============================== ============== ============= + +With this kind of performance improvement, what are the reasons of sticking to ``v4.6.0``? + +Why Windows and Linux only? +=========================== + +* I don't own a decent Mac device. To be more precisely, I have Mac Mini and MacBook Air, but they are too old (building V8 would take many hours). And I have no plan on buying a new one in the near future. Call for donation? Don't be joking. So there's no MacOS release. +* I don't intend to support Android for now. + +Why not Automate the J2V8 Build System? +======================================= + +TL;DR: It's too hard. + +* V8 is evolving rapidly. v8.3.110.9 is a relatively easy one to be mastered. I didn't move forward well with v8.9.213 which placed a different set of *solvable* challenges to me. I plan to revisit the latest V8 in near future. +* Node.js was removed early. I haven't got time reviving it in J2V8. +* J2V8 build system is too old. + + * Gradle v2.14.1 is far from the lowest supported gradle version in my latest IntelliJ IDEA. And I don't have interest in installing a legacy Eclipse to play with that version of gradle. Hey, why not upgrade gradle to satisfy IDEA? I tried, but all was bad luck. You may take a try, then understand what I have suffered from. + * CMake is old and seriously broken on Windows. Nowadays, V8 only supports VS 2017 or 2019, but ``CMakeLists.txt`` is still at the VS 2015 age. No surprise, it doesn't work at all. + * Docker build is deeply broken as well. The dependent docker image was gone. There are many errors in many steps. Sitting there, watching the docker build breaks made me full of frustration because I thought it would take me a few months fixing the problems, but I don't have a few months. No one pays me to do that. + * Python2 scripts form the outer layer of the build system, also hide the actual building logic from someone who tries to fix the build system. I don't want to spend my precious time fixing Python2 scripts, because I've been on Python3 for many years. I wish my hair could be as much as Guido van Rossum's. Obviously, I am not, so no more Python2. + * Maven is old but the least problematic. At least it allows me to package the jar files with my hack to the ``pom.xml``. + +With these uncertainties, to me, automating the build system is something with ROI closing to 0. Supposing I achieved it in a particular version of V8, let's say ``v8.3.110.9``, it would for sure break in ``v8.9.x``. Later, I managed to build ``v8.9.255`` which has been embeded into Javet. + +Why not Deploy J2V8 to Maven Repository? +======================================== + +* I don't have the permission to its official repository. +* There has been no Windows / Linux releases deployed since 2016 / 2017. I really don't know who to contact with. +* You may easily integrate the jar files in your local maven repository. diff --git a/docs/_sources/faq/background/index.rst.txt b/docs/_sources/faq/background/index.rst.txt new file mode 100644 index 000000000..f34978f5e --- /dev/null +++ b/docs/_sources/faq/background/index.rst.txt @@ -0,0 +1,9 @@ +========== +Background +========== + +.. toctree:: + :maxdepth: 1 + + what_is_the_motivation + history_with_j2v8 diff --git a/docs/_sources/faq/background/what_is_the_motivation.rst.txt b/docs/_sources/faq/background/what_is_the_motivation.rst.txt new file mode 100644 index 000000000..1ce83fee8 --- /dev/null +++ b/docs/_sources/faq/background/what_is_the_motivation.rst.txt @@ -0,0 +1,11 @@ +======================= +What is the Motivation? +======================= + +I used to take a try of J2V8 and find it's quite compelling. However, J2V8 is slowly dying, with serious memory leak issues, V8 version issue, etc. + +Sometimes starting from scratch implies lower cost than upgrading an existing solution. I think it might be true here in this project. I've learned quite a lot by manually fixing the Windows and Linux build system of J2V8. + +Also, I had got many ideas on how the API will look like. At the end of 2020, I thought I would be able to write a new one from scratch and leave J2V8 behind. Indeed, I made it few months later. + +Please refer to :doc:`history_with_j2v8` for detail. diff --git a/docs/_sources/faq/development/how_to_think_in_javet.rst.txt b/docs/_sources/faq/development/how_to_think_in_javet.rst.txt new file mode 100644 index 000000000..de194ec67 --- /dev/null +++ b/docs/_sources/faq/development/how_to_think_in_javet.rst.txt @@ -0,0 +1,46 @@ +====================== +How to Think in Javet? +====================== + +There are folks migrating projects from other libraries (e.g. J2V8) to Javet. Some experienced certain challenges which from Javet perspective required **Thinking in Javet**. So, how? + +V8Runtime and V8ValueGlobalObject +================================= + +In Javet, ``V8Runtime`` and ``V8ValueGlobalObject`` are separate concepts. + +V8Runtime +--------- + +``V8Runtime`` is only a representative of the V8 isolate and V8 context. It has nothing to do with ``globalThis`` or ``window``. However, in few other libraries these concepts are mixed up. + +V8ValueGlobalObject +------------------- + +As ``V8Runtime`` no longer represents ``globalThis`` or ``window``, ``V8ValueGlobalObject`` from ``V8Runtime.getGlobalObject()`` is the one. + +If you want to access global objects or call top level functions, ``globalObject.get('...')`` and ``globalObject.invoke('...')`` are the Javet ways. + +Executor and Execute +==================== + +In Javet, executing a script involves 2 steps. + +1. Get an executor. +2. Call certain execute method of that executor. + +This is quite different from the common practice of few other libraries where execute is just a 1-step thing. + +Why? Javet intends to offer a builder pattern in the script execution. With an executor, application may do every other things before the actual execution. For instance: security check, enable / disable certain V8 features, hack the AST, set up interception, etc. The scope may be limited to that executor only. Also, the executor can be reused to avoid the duplicated resource loading overhead. + +Declarative Function and Property Interception +============================================== + +Javet offers an easy way of registering function and property interception in a declarative way. Just decorate a function of arbitrary object with ``@V8Function(name = "...")`` or ``@V8Property(name = "...")``, Javet is able to register it and that function will be called back from V8. Application is free from managing those tedious things like resource leakage, object lifecycle, type conversion, etc. Javet just handles that behind the scene and everything goes smoothly. + +The coding experience is a little bit close to working with Spring Framework. + +Learn from Unit Test +==================== + +Most of the Javet API is unit test covered. Learning from Javet unit test is an express and effective way to Thinking in Javet. diff --git a/docs/_sources/faq/development/index.rst.txt b/docs/_sources/faq/development/index.rst.txt new file mode 100644 index 000000000..c29b71412 --- /dev/null +++ b/docs/_sources/faq/development/index.rst.txt @@ -0,0 +1,9 @@ +=========== +Development +=========== + +.. toctree:: + :maxdepth: 1 + + how_to_think_in_javet + where_are_es6_api_in_v8_mode diff --git a/docs/_sources/faq/development/where_are_es6_api_in_v8_mode.rst.txt b/docs/_sources/faq/development/where_are_es6_api_in_v8_mode.rst.txt new file mode 100644 index 000000000..9f905cd07 --- /dev/null +++ b/docs/_sources/faq/development/where_are_es6_api_in_v8_mode.rst.txt @@ -0,0 +1,7 @@ +============================= +Where are ES6 API in V8 Mode? +============================= + +V8 mode only offers the basic functionality so that some ES6 API are absent. E.g. setTimeout, setInterval, etc. + +Project `Javenode `_ is an extension of Javet aiming at simulating Node.js with Java in Javet V8 mode. diff --git a/docs/_sources/faq/environment/can_javet_support_legacy_linux.rst.txt b/docs/_sources/faq/environment/can_javet_support_legacy_linux.rst.txt new file mode 100644 index 000000000..fe7cb646a --- /dev/null +++ b/docs/_sources/faq/environment/can_javet_support_legacy_linux.rst.txt @@ -0,0 +1,37 @@ +=============================== +Can Javet Support Legacy Linux? +=============================== + +Yes, Javet can support some legacy linux distributions, eg: Ubuntu 16.04, Ubuntu 18.04, but not with the official builds which rely on more advanced tool chain. + +Please download the private builds from this `drive `_ and prepare your runtime environment as following. + +.. code-block:: shell + + sudo apt update + sudo apt upgrade -y + sudo apt install build-essential -y + sudo apt install software-properties-common -y + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + sudo apt upgrade -y + sudo apt install gcc-snapshot -y + sudo apt upgrade -y + sudo apt install gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7 + sudo update-alternatives --config gcc + + There are 3 choices for the alternative gcc (providing /usr/bin/gcc). + + Selection Path Priority Status + ------------------------------------------------------------ + * 0 /usr/bin/gcc-9 90 auto mode + 1 /usr/bin/gcc-7 70 manual mode + 2 /usr/bin/gcc-8 80 manual mode + 3 /usr/bin/gcc-9 90 manual mode + +Notes +===== + +Private builds imply considerable additional effort, so there is no commitments. Please contact the maintainer for private builds wisely. diff --git a/docs/_sources/faq/environment/can_javet_support_mac.rst.txt b/docs/_sources/faq/environment/can_javet_support_mac.rst.txt new file mode 100644 index 000000000..10a244dca --- /dev/null +++ b/docs/_sources/faq/environment/can_javet_support_mac.rst.txt @@ -0,0 +1,43 @@ +====================== +Can Javet Support Mac? +====================== + +Now +=== + +My `MacBook Air mid-2012 `_ was revived with Mac OS Catalina which is the lowest version supported by latest V8. I managed to include it in the regular release cycle. + +Known Issue +----------- + +Some of the Node.js symbols might not be exposed correctly. That might cause native node modules malfunction. Quick fix will be served per issue reported. + +Will the Mac OS Build be LTS? +----------------------------- + +I doubt because when next time V8 abandons Catalina, I won't be able to create any new builds unless someone takes care of the Mac OS build or I get enough donation for a new device. |Donate| + +How about arm64? +---------------- + +That is still not supported. Please |Donate| + +.. |Donate| image:: https://img.shields.io/badge/Donate-PayPal-green.svg + :target: https://paypal.me/caoccao?locale.x=en_US + +Before Aug 10, 2021 +=================== + +Short answer is **Yes and No**. + +Yes +--- + +There is no technical difficulties. The code is written in cross-platform manner. Someone needs to pay considerable effort creating and maintaining the Mac build. + +No +-- + +I don't own a decent Mac device. To be more precisely, I have Mac Mini and MacBook Air, but they are too old (building Node.js and V8 would take many hours). Besides, there are both x86 and arm64 to be supported. + +I have no plan on buying 2 new Mac devices for supporting Javet only in the near future. If I could be well funded, I would consider supporting Mac. diff --git a/docs/_sources/faq/environment/index.rst.txt b/docs/_sources/faq/environment/index.rst.txt new file mode 100644 index 000000000..de6b5a214 --- /dev/null +++ b/docs/_sources/faq/environment/index.rst.txt @@ -0,0 +1,9 @@ +=========== +Environment +=========== + +.. toctree:: + :maxdepth: 1 + + can_javet_support_mac + can_javet_support_legacy_linux diff --git a/docs/_sources/faq/index.rst.txt b/docs/_sources/faq/index.rst.txt new file mode 100644 index 000000000..b6bc02345 --- /dev/null +++ b/docs/_sources/faq/index.rst.txt @@ -0,0 +1,11 @@ +=== +FAQ +=== + +.. toctree:: + :maxdepth: 2 + + background/index + development/index + environment/index + troubleshooting/index diff --git a/docs/_sources/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.rst.txt b/docs/_sources/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.rst.txt new file mode 100644 index 000000000..e85bcab1f --- /dev/null +++ b/docs/_sources/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.rst.txt @@ -0,0 +1,5 @@ +========================================================== +A dynamic link library (DLL) initialization routine failed +========================================================== + +This failure happens when Javet Node.js mode tries to load a Node.js native module. The root cause is some ``NAPI`` symbols cannot be found on Windows. The fix is is available at :doc:`../../reference/modularization`. diff --git a/docs/_sources/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst.txt b/docs/_sources/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst.txt new file mode 100644 index 000000000..9766a1223 --- /dev/null +++ b/docs/_sources/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst.txt @@ -0,0 +1,8 @@ +===================================== +Can I Debug Javet in Chrome DevTools? +===================================== + +Yes, you can do that. Please visit :doc:`../../development/debug_with_chrome_developer_tools` for detail. + +.. image:: ../../resources/images/chome_developer_tools_devices_remote_target_javet.png + :alt: Remote Target Javet diff --git a/docs/_sources/faq/troubleshooting/index.rst.txt b/docs/_sources/faq/troubleshooting/index.rst.txt new file mode 100644 index 000000000..dd860e885 --- /dev/null +++ b/docs/_sources/faq/troubleshooting/index.rst.txt @@ -0,0 +1,10 @@ +=============== +Troubleshooting +=============== + +.. toctree:: + :maxdepth: 1 + + a_dynamic_link_library_dll_initialization_routine_failed + can_i_debug_javet_in_chrome_dev_tools + why_node_js_crashes_when_being_closed diff --git a/docs/_sources/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst.txt b/docs/_sources/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst.txt new file mode 100644 index 000000000..491927ce8 --- /dev/null +++ b/docs/_sources/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst.txt @@ -0,0 +1,50 @@ +====================================== +Why Node.js Crashes When being Closed? +====================================== + +Background +========== + +Some Javet users experience segfaults when using the Node.js mode. The segfaults occur when ``NodeRuntime`` is being closed. E.g. `issue #20 `_ and `issue #82 `_. + +Root Cause +========== + +The root cause is Node.js event loop is activated when Node.js is exiting. Let's see how ``NodeRuntime.close()`` works behind the scenes. + +1. Close all Node.js modules +2. Close all reference objects +3. Close all callback context objects +4. Close all V8 modules +5. Hand over the control to Node.js exiting process + +If the application registers interceptors, those interceptors will be closed at step 3. However, the corresponding JavaScript objects hasn't been recycled yet. So, at step 5, Node.js activates the event loop and async objects will get resolved or rejected. The callbacks land Javet which is not able to handle because the callback context objects are gone. That leads to memory corruption and segfaults. + +Can Javet address that? Yes, but that implies hacking Node.js event loop. People choose Javet Node.js mode mostly because it is a genuine Node.js. So, no, Javet does not perform such hack. + +Solution +======== + +Well, how to prevent that from happening? In fact, knowing how Javet works and following the Javet way, that won't happen. + +Event unhandledRejection +------------------------ + +Node.js provides a standard `solution `_. Application can listen to event ``unhandledRejection`` to prevent that event from hitting Javet so that the segfaults will not take place. + +.. code-block:: javascript + + import process from 'process'; + process.on('unhandledRejection', (reason, promise) => { + // Do whatever you want to do + }); + +NodeRuntime.await() +------------------- + +Application may call ``NodeRuntime.await()`` before closing the ``NodeRuntime``. This call explicitly tells ``NodeRuntime`` to activate the event loop. + +NodeRuntime.lowMemoryNotification() +----------------------------------- + +Application may call ``NodeRuntime.lowMemoryNotification()`` before closing the ``NodeRuntime``. This call forces ``NodeRuntime`` to perform garbage collection. During the garbage collection, the callbacks can be safely handled by Javet without segfaults. diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt new file mode 100644 index 000000000..0f481303e --- /dev/null +++ b/docs/_sources/index.rst.txt @@ -0,0 +1,10 @@ +.. include:: ../README.rst + +.. toctree:: + :maxdepth: 2 + + tutorial/index + reference/index + release_notes/index + faq/index + development/index diff --git a/docs/_sources/reference/best_practices.rst.txt b/docs/_sources/reference/best_practices.rst.txt new file mode 100644 index 000000000..1d5377f8b --- /dev/null +++ b/docs/_sources/reference/best_practices.rst.txt @@ -0,0 +1,46 @@ +============== +Best Practices +============== + +Thread, Engine and Pool +======================= + +* Always get 1 Javet engine from the pool in 1 thread. +* If multiple context is required in 1 thread, there are 2 options. + + * Call ``resetContext()`` between context switch. + * Obtain multiple V8Runtime instances. + +* Do not pass Javet engine to other threads. +* Always return Javet engine to pool in the end via try-with-resource or calling ``close()`` explicitly. +* Subclass Javet engine pool and Javet engine to complete your customization. Indeed, they are open to full customization. + +Resource Management +=================== + +* Dangling V8 objects will be forced to be recycled by Javet under the following scenarios and corresponding log will reflect that. Keeping an eye on the log helps address memory leak issues in the early stage. + + * Engine is closed. + * Pool is closed. + * Context is reset. + * Isolate is reset. + +* Always apply ``try-with-resource`` to Javet objects regardless of primitive or reference if they are not returned to Javet. +* Always prohibit calling ``close()`` of Javet objects if they will be returned to Javet. +* If the lifecycle of V8 objects is uncertain, calling ``setWeak()`` is the only way so that calling ``close()`` is no longer required. Be careful, calling ``close()`` after calling ``setWeak()`` may lead to V8 core dump immediately. +* In performance sensitive scenarios, please explicitly acquire ``V8Locker``. + +Security +======== + +* Malicious scripts are recommended to be executed in V8 mode or in ``vm`` module in Node.js mode. +* ``eval`` can be disabled in Javet. +* V8 0-day vulnerable issues most likely impact Node.js because the embedded V8 in Node.js is very old. It's recommended to use the V8 mode to minimize the risk. + +Node.js +======= + +* Modularize the code as much as possible so that performance is maximized. +* Always register unhandled rejection event. +* In **non-module** mode (similar to V8 in web browser), always put launch script in a dedicated folder whose parent folder contains ``node_modules`` and avoid ``require`` modules in the same folder. +* In **module** mode (similar to V8 in Node.js), be aware that the execution result is a promise and the behavior is different from native Node.js runtime behavior unless ``await()`` is called. diff --git a/docs/_sources/reference/error_codes.rst.txt b/docs/_sources/reference/error_codes.rst.txt new file mode 100644 index 000000000..ef61d1798 --- /dev/null +++ b/docs/_sources/reference/error_codes.rst.txt @@ -0,0 +1,59 @@ +=========== +Error Codes +=========== + +Why Error Codes? +---------------- + +Because Javet doesn't want to support i18n though both Node.js and V8 support i18n. + +* The final binary size will significantly increase with i18n. +* There is no development resource for i18n. + +Backward Compatibility +---------------------- + +Once the error codes are released, they are likely not changed any more for backward compatibility. + +The following error codes are generated automatically from the :extsource2:`source code <../../src/main/java/com/caoccao/javet/exceptions/JavetError.java>`. + +.. Error Codes Begin + + +==== =========== ====================================== ================================================================================================================================================================= +Code Type Name Format +==== =========== ====================================== ================================================================================================================================================================= +101 System OSNotSupported OS ${OS} is not supported +102 System LibraryNotFound Javet library ${path} is not found +103 System LibraryNotLoaded Javet library is not loaded because ${reason} +104 System NotSupported ${feature} is not supported +105 System FailedToReadPath Failed to read ${path} +201 Compilation CompilationFailure ${message} +301 Execution ExecutionFailure ${message} +302 Execution ExecutionTerminated Execution is terminated and continuable is ${continuable} +401 Callback CallbackSignatureParameterSizeMismatch Callback signature mismatches: method name is ${methodName}, expected parameter size is ${expectedParameterSize}, actual parameter size is ${actualParameterSize} +402 Callback CallbackSignatureParameterTypeMismatch Callback signature mismatches: expected parameter type is ${expectedParameterType}, actual parameter type is ${actualParameterType} +403 Callback CallbackInjectionFailure Failed to inject runtime with error message ${message} +404 Callback CallbackRegistrationFailure Callback ${methodName} registration failed with error message ${message} +405 Callback CallbackMethodFailure Callback ${methodName} failed with error message ${message} +406 Callback CallbackUnknownFailure Callback failed with unknown error message ${message} +407 Callback CallbackUnregistrationFailure Callback ${methodName} unregistration failed with error message ${message} +501 Converter ConverterFailure Failed to convert values with error message ${message} +502 Converter ConverterCircularStructure Circular structure is detected with max depth ${maxDepth} reached +503 Converter ConverterSymbolNotBuiltIn ${symbol} is not a built-in symbol +601 Module ModuleNameEmpty Module name is empty +602 Module ModuleNotFound Module ${moduleName} is not found +603 Module ModulePermissionDenied Denied access to module ${moduleName} +701 Lock LockAcquisitionFailure Failed to acquire the lock +702 Lock LockReleaseFailure Failed to release the lock +703 Lock LockConflictThreadIdMismatch Runtime lock conflict is detected with locked thread ID ${lockedThreadID} and current thread ID ${currentThreadID} +801 Runtime RuntimeAlreadyClosed Runtime is already closed +802 Runtime RuntimeAlreadyRegistered Runtime is already registered +803 Runtime RuntimeNotRegistered Runtime is not registered +804 Runtime RuntimeLeakageDetected ${count} runtime(s) leakage is detected +805 Runtime RuntimeCloseFailure Failed to close the runtime with error message ${message} +==== =========== ====================================== ================================================================================================================================================================= + + +.. Error Codes End + diff --git a/docs/_sources/reference/index.rst.txt b/docs/_sources/reference/index.rst.txt new file mode 100644 index 000000000..ef03781b2 --- /dev/null +++ b/docs/_sources/reference/index.rst.txt @@ -0,0 +1,21 @@ +========= +Reference +========= + +.. toctree:: + :maxdepth: 1 + + javadoc/index + v8_collection + v8_function + v8_promise + modularization + memory_management + lock + termination + logging + load_and_unload + best_practices + performance + error_codes + todo_list diff --git a/docs/_sources/reference/javadoc/index.rst.txt b/docs/_sources/reference/javadoc/index.rst.txt new file mode 100644 index 000000000..a26617ce3 --- /dev/null +++ b/docs/_sources/reference/javadoc/index.rst.txt @@ -0,0 +1,3 @@ +============= +API Reference +============= \ No newline at end of file diff --git a/docs/_sources/reference/load_and_unload.rst.txt b/docs/_sources/reference/load_and_unload.rst.txt new file mode 100644 index 000000000..3a77133b8 --- /dev/null +++ b/docs/_sources/reference/load_and_unload.rst.txt @@ -0,0 +1,45 @@ +=============== +Load and Unload +=============== + +As documented in :doc:`../development/design`, Javet supports loading and unloading the JNI libraries during runtime in both Node.js and V8 modes. + +How? +==== + +Unload +------ + +Assuming the JNI library per mode is already loaded, here are the step-by-step on how to unload it. + +.. code-block:: java + + // Step 1: Set library reloadable. Why? Because Javet defaults that switch to false. + V8Host.setLibraryReloadable(true); + // Step 2: Get V8Host per JS runtime type. + V8Host v8Host = V8Host.getInstance(jsRuntimeType); + // Step 3: Unload the library. + v8Host.unloadLibrary(); + // Step 4: Restore the switch. + V8Host.setLibraryReloadable(false); + +How does ``unloadLibrary()`` work? There is no API that allows unloading a JNI library explicitly. The only way is GC will automatically unload the library if all references to that library are garbage collectable. So, application is supposed to close all V8 values, V8 runtimes prior to calling ``unloadLibrary()``. + +Load +---- + +Assuming the JNI library per mode is already unloaded, here are the step-by-step on how to load it again. + +.. code-block:: java + + // Step 1: Get V8Host per JS runtime type. + V8Host v8Host = V8Host.getInstance(jsRuntimeType); + // Step 2: Load the library. + v8Host.loadLibrary(); + +Notes +===== + +* ``unloadLibrary()`` can only take effect after all references are garbage collectable. +* ``loadLibrary()`` is internally called by Javet at the first time and only takes effect after ``unloadLibrary()`` is called. +* ``loadLibrary()`` and ``unloadLibrary()`` are for experiment only. **They may be unstable and crash JVM. Please use this feature at your own risk.** diff --git a/docs/_sources/reference/lock.rst.txt b/docs/_sources/reference/lock.rst.txt new file mode 100644 index 000000000..81c6fd2aa --- /dev/null +++ b/docs/_sources/reference/lock.rst.txt @@ -0,0 +1,43 @@ +============= +Know the Lock +============= + +What does Lock Mean in Javet? +============================= + +V8 runtime runs in an isolated and single-threaded environment so that there is no race condition issue. How about playing V8 runtime in JVM among multiple threads? Yes, that is possible in 2 modes. + +1. Implicit Mode +---------------- + +Javet automatically handles the ``lock()`` and ``unlock()`` regardless of thread context switch. So, in most of the cases, application just calls regular API without calling single line of locking API. + +2. Explicit Mode +---------------- + +In explicit mode, application just needs to surround the code block with a ``V8Locker`` applied by ``try-with-resource``. Internally, Javet allocates a long-live V8 locker instead of creating V8 locker per API call to achieve better performance. + +.. code-block:: java + + try (V8Locker v8Locker = v8Runtime.getV8Locker()) { + // Do whatever you want to do. + } + +Be careful, ``V8Locker`` cannot be nested, otherwise checked exception will be thrown reporting lock conflict. Also, if the JS runtime type is Node.js, calling ``resetContext()`` or ``resetIsolate()`` may trigger core dump. Please refer to the :extsource2:`source code <../../src/test/java/com/caoccao/javet/interop/engine/TestPerformance.java>` for detail. + +Comparisons +=========== + +Performance +----------- + +Implicit mode comes with a slight performance overhead in V8 because every native call is protected by a new V8 locker. + +Explicit mode is designed for performance sensitive work. In extreme performance test cases, the performance improvement may be up to 150% compared to implicit mode. + +Thread-safety +------------- + +Implicit mode is thread-safe because its locking granularity is at API call level. Multiple threads are free to share the same V8 runtime in concurrent scenarios. Of course, be careful that JavaScript variables may be changed by other threads. It's better not to touch the same JavaScript variable among multiple threads, otherwise, Javet may crash. Yes, crash, because Javet doesn't perform this kind of check. + +Explicit mode is **NOT** thread-safe because it's designed to improve performance in single-threaded scenarios. Sharing V8 locker protected V8 runtime among multiple threads will result in Javet crash immediately. diff --git a/docs/_sources/reference/logging.rst.txt b/docs/_sources/reference/logging.rst.txt new file mode 100644 index 000000000..ec7b55889 --- /dev/null +++ b/docs/_sources/reference/logging.rst.txt @@ -0,0 +1,77 @@ +======= +Logging +======= + +As Javet is a fundamental SDK, it doesn't rely on any other libraries except JDK so that Javet users don't get dependency hell. That also means Javet has to use the JDK logging API, but Javet allows injecting 3rd party logging API. + +Step 1: Implement IJavetLogger +============================== + +``IJavetLogger`` is the the only logging interface accepted by Javet. You may implement ``IJavetLogger`` with ``slf4j`` as following. + +.. code-block:: java + + import com.caoccao.javet.interfaces.IJavetLogger; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + + public class MyJavetLogger implements IJavetLogger { + protected Logger logger; + + public MyJavetLogger(String name) { + logger = LoggerFactory.getLogger(name); + } + + @Override + public void debug(String message) { + if (logger.isDebugEnabled()) { + logger.debug(message); + } + } + + @Override + public void error(String message) { + if (logger.isDebugEnabled()) { + logger.error(message); + } + } + + @Override + public void error(String message, Throwable throwable) { + if (logger.isDebugEnabled()) { + logger.error(message, throwable); + } + } + + @Override + public void info(String message) { + if (logger.isInfoEnabled()) { + logger.info(message); + } + } + + @Override + public void warn(String message) { + if (logger.isWarnEnabled()) { + logger.warn(message); + } + } + } + +Step 2: Inject the Logger +========================= + +Injecting the logger is quite simple. + +* Create an instance of the logger. +* Set the logger to a config. +* Set the config to a pool. + +.. code-block:: java + + MyJavetLogger javetLogger = new MyJavetLogger("TestLogger"); + JavetEngineConfig javetEngineConfig = new JavetEngineConfig(); + javetEngineConfig.setJavetLogger(javetLogger); + JavetEnginePool javetEnginePool = new JavetEnginePool(javetEngineConfig); + +Now, Javet is integrated into your logging system. diff --git a/docs/_sources/reference/memory_management.rst.txt b/docs/_sources/reference/memory_management.rst.txt new file mode 100644 index 000000000..0e850c637 --- /dev/null +++ b/docs/_sources/reference/memory_management.rst.txt @@ -0,0 +1,157 @@ +================= +Memory Management +================= + +3 Challenges in Memory Management +================================= + +JVM GC +------ + +JVM is known to have a GC that manages memory automatically. However, that doesn't cover the objects in JNI native implementation. Once ``NewGlobalRef(javaObject)`` is called, that ``javaObject`` lives forever in JVM until ``DeleteGlobalRef(javaObject)`` is called. + +C++ Runtime +----------- + +Smart pointers in C++ cannot easily work across JNI to JVM, in other words, raw pointers are directly referenced in JVM as ``long``. C++ runtime has no idea when to free the memory of those raw pointers unless JVM tells C++ runtime to release via JNI. + +V8 GC +----- + +V8 generally categorizes objects in memory to 3 types. + +1. ``v8::Local`` - It lives within the local scope of a C++ function call. +2. ``v8::Persistent`` - Its lifecycle is managed by V8 GC. +3. ``v8::External`` - V8 GC treats it as root object so that it lives as long as the V8 isolate lives. + +The awful thing in V8 GC is V8 does not make final callback when a context is being closed. From V8 perspective, that's a performance improvement. But from Javet perspective, Javet cannot completely rely on V8 to do the resource management. So, Javet keeps track of all unmanaged resource and makes sure there is no memory leak in all cases. + +Recommended Options +=================== + +Javet directly borrows the way V8 manages objects in JVM. The rule is simple in the following 2 Options. + +Automatic Management with try-with-resource +------------------------------------------- + +.. code-block:: java + + // Create an object and wrap it with try resource. + try (V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject()) { + // Do whatever you want to do with this object + // v8ValueObject.close() is called automatically at the end of the block. + } + // Outside the code block, this object is no longer valid. + +Automatically Manage with Weak Reference +---------------------------------------- + +.. code-block:: java + + // Create an object. + V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject(); + // Do whatever you want to do with this object + v8ValueObject.setWeak(); + // Do whatever you want to do with this object + /* + v8ValueObject.close() is called automatically via V8 GC callback. + So, there is no need to close the V8 object explicitly. + This is quite useful when the lifecycle is not determined, E.g. V8 function. + */ + +Note: V8 does not recycle objects that are referenced by other objects. Please make sure the object chain is broken so that GC can work as expected. ``com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor`` is a good sample showing how to deal with that. + +Alternative Option: ArrayBuffer +=============================== + +The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer. + +It is an array of bytes, often referred to in other languages as a "byte array".You cannot directly manipulate the contents of an ArrayBuffer; instead, you create one of the typed array objects or a DataView object which represents the buffer in a specific format, and use that to read and write the contents of the buffer. + +Javet offers complete support to all the typed arrays as well as ``DataView`` as following. There is a ``java.nio.ByteBuffer`` inside every typed array and ``DataView``. That ``ByteBuffer`` directly links to the corresponding backing store of V8 typed array. In other words, Javet and V8 can both access the same address to achieve zero memory copy. Please consider using typed array in performance sensitive scenarios. + ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Type | Value Range | Size in bytes | Description | Web IDL type | Equivalent C type | ++===================+=============================+===============+====================================================================================+=====================+===============================+ +| Int8Array | -128 to 127 | 1 | 8-bit two's complement signed integer | byte | int8_t | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Uint8Array | 0 to 255 | 1 | 8-bit unsigned integer | octet | uint8_t | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Uint8ClampedArray | 0 to 255 | 1 | 8-bit unsigned integer (clamped) | octet | uint8_t | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Int16Array | -32768 to 32767 | 2 | 16-bit two's complement signed integer | short | int16_t | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Uint16Array | 0 to 65535 | 2 | 16-bit unsigned integer | unsigned short | uint16_t | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Int32Array | -2147483648 to 2147483647 | 4 | 32-bit two's complement signed integer | long | int32_t | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Uint32Array | 0 to 4294967295 | 4 | 32-bit unsigned integer | unsigned long | uint32_t | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Float32Array | 1.2×10-38 to 3.4×1038 | 4 | 32-bit IEEE floating point number (7 significant digits e.g., 1.234567) | unrestricted float | float | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| Float64Array | 5.0×10-324 to 1.8×10308 | 8 | 64-bit IEEE floating point number (16 significant digits e.g., 1.23456789012345) | unrestricted double | double | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| BigInt64Array | -263 to 263-1 | 8 | 64-bit two's complement signed integer | bigint | int64_t (signed long long) | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ +| BigUint64Array | 0 to 264-1 | 8 | 64-bit unsigned integer | bigint | uint64_t (unsigned long long) | ++-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ + +Please refer to :extsource2:`TestV8ValueTypedArray <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueTypedArray.java>` and :extsource2:`TestV8ValueDataView <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueDataView.java>` for sample code snippets. + +GC +== + +Automatic GC +------------ + +Javet has built-in automatic GC in both Node.js mode and V8 mode. Why? In high frequency API calling area, V8 may not keep up with the GC pace that JVM performs. Sometimes, JVM is running out of heap memory whereas V8 holds many zombie objects that are referenced by Javet in JVM. In this case, JVM ignores those objects unless V8 releases them in V8 GC cycle. + +Passive GC +^^^^^^^^^^ + +So, how to notify V8 GC that Java heap memory pool is running out of space? Javet automates this via ``V8Host`` and ``V8Notifier``. By default, this feature is disabled. Here is the step-by-step on how to enable this feature. + +1. (Optional) Call ``V8Host.setMemoryUsageThresholdRatio(double)`` to set memory usage threshold ratio. This is optional because the default value is 0.7. +2. Call ``V8Host.getNodeInstance().enableGCNotification()`` or ``V8Host.getV8Instance().enableGCNotification()`` to enable the notification. + +Here is a sample heap memory usage with default memory usage threshold ration and ``-Xms64m -Xmx64m``. Please note that in this sample, application is under high pressure of creating and destroying V8 objects. In normal cases, the curve is much smoother. + +.. image:: ../resources/images/javet_memory_management_passive_gc.png + :alt: Javet Memory Management Passive GC + +What happens internally is as following. + +1. ``V8Notifier`` listens to the heap memory notification from JVM per ``V8Host`` instance. +2. JVM notifies ``V8Notifier`` that memory threshold exceeds. +3. ``V8Notifier`` broadcasts GC scheduled flag to all ``V8Runtime`` managed by the ``V8Host`` instance. +4. Each ``V8Runtime`` performs GC in its own isolate. + +Aggressive GC +^^^^^^^^^^^^^ + +Just get ``V8Runtime`` from Javet engine pool that aggressively sends GC notification to idle engine in daemon thread. There is no performance overhead because: + +* The engine performs GC when it is idle in a dedicated thread. +* Javet engine pool is lock free so that the GC doesn't affect other worker threads. + +Of course, this behavior can be turned off by calling ``JavetEngineConfig.setAutoSendGCNotification(false)``. + +Manual GC +--------- + +There are 3 ways of manually triggering GC in both Node.js mode and V8 mode. + +V8Runtime.await() +^^^^^^^^^^^^^^^^^ + +This API represents a light-weighted way of giving V8 a hint to perform GC. It actually tells Node.js or V8 runtime to drain the message or task queue. As a side effect of the drain, a GC may occur based on the decision of Node.js or V8 runtime. + +V8Runtime.idleNotificationDeadline(long deadlineInMillis) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This API explicitly tells Node.js or V8 runtime that the application expects a GC to happen in the given milliseconds. Be careful, Node.js or V8 runtime may disregard this instruction. + +V8Runtime.lowMemoryNotification() +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This API explicitly tells Node.js or V8 runtime to perform a GC immediately. It is also used in automatic GC aforementioned. diff --git a/docs/_sources/reference/modularization.rst.txt b/docs/_sources/reference/modularization.rst.txt new file mode 100644 index 000000000..1287ce081 --- /dev/null +++ b/docs/_sources/reference/modularization.rst.txt @@ -0,0 +1,204 @@ +============== +Modularization +============== + +Node.js Mode +============ + +Example +------- + +In Node.js mode, Javet leaves Node.js with its own ways of handling modules. The coding experience is identical to the one in Node.js and applications can get all features supported by Javet, like function interception. Here is an example. + +.. code-block:: java + + try (JavetEnginePool javetEnginePool = new JavetEnginePool()) { + javetEnginePool.getConfig().setJSRuntimeType(JSRuntimeType.Node); + try (IJavetEngine iJavetEngine = javetEnginePool.getEngine()) { + NodeRuntime nodeRuntime = iJavetEngine.getV8Runtime(); + Path workingDirectory = new File(JavetOSUtils.WORKING_DIRECTORY, "scripts/node/test-node").toPath(); + // Set the require root directory so that Node.js is able to locate node_modules. + nodeRuntime.getNodeModule(NodeModuleModule.class).setRequireRootDirectory(workingDirectory); + getLogger().logInfo("1.23 + 2.34 = {0}", nodeRuntime.getExecutor( + "const Decimal = require('decimal.js');" + + "const a = new Decimal(1.23);" + + "const b = new Decimal(2.34);" + + "a.add(b).toString();").executeString()); + } + } + +Gaps between Javet Node.js Mode and Native Node.js +-------------------------------------------------- + +=================== ======================================= ============================================== +Feature Javet Node.js Mode Native Node.js +=================== ======================================= ============================================== +``require()`` Root Java Application Working Directory JavaScript Application Working Directory +Working Directory Java Application Working Directory JavaScript Application Working Directory +``__dirname`` N/A Yes +``__filename`` N/A Yes +Module Mode default: false default: true +=================== ======================================= ============================================== + +Usually the Java application working directory doesn't contain ``node_modules``. That for sure breaks Node.js. No worry, here are the steps on closing the gaps. + +1. Set the ``require()`` root directory so that Node.js is able to locate ``node_modules``. +2. Set working directory to where the script is located. +3. Set ``__dirname``. +4. Set ``__filename``. + +Luckily, in Javet, when ``getExecutor(File scriptFile)`` or ``getExecutor(Path scriptPath)`` is called, all these 4 steps are automatically performed. If ``getExecutor(String scriptString)`` is called, obviously Javet doesn't know what to do, but application may call ``IV8Executor.setResourceName(String resourceName)`` later to perform these 4 steps. So, Javet Node.js mode doesn't care where the script comes from. Application may feel free to virtualize Node.js. + +Can Javet run script in Node.js Module Mode? Yes, just call ``IV8Executor.setModule(true)``. + +The exciting thing is: in Javet, applications may have multiple instances of Node.js pointing to different ``node_modules`` and potentially these Node.js instances can share the same piece of data. + +Deal with Native Modules +------------------------ + +Node.js native modules usually cannot be dynamically loaded to Javet. E.g. sqlite3. That issue also bothers Electron. Electron folks created project `electron-rebuild `_ which rebuilds the native modules from source code and its own native symbols. + +Javet follows the same approach on Windows, and a simpler approach on Linux. + +Patch ELF Native Modules on Linux +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The native modules on Linux don't know the existence of Javet. When they look up Node.js symbols which are provided by Javet, they just fail with errors like the following. + + com.caoccao.javet.exceptions.JavetExecutionException: Error: /....../node_modules/sqlite3/lib/binding/napi-v3-linux-x64/node_sqlite3.node: undefined symbol: napi_create_error + +The fix is very simple. Here is a sample sqlite3. + +.. code-block:: shell + + # Install patchelf on Ubuntu (Optional) + sudo apt install patchelf + cd scripts/node + # Install sqlite3 + npm install + cd javet-rebuild + export NODE_MODULE_FILE="../node_modules/sqlite3/lib/binding/napi-v3-linux-x64/node_sqlite3.node" + ./rebuild.sh + +The `rebuild.sh <../../scripts/node/javet-rebuild/rebuild.sh>`_ actually calls `patchelf `_ to add Javet to the node module's dependency. + +Rebuild Native Modules on Windows +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The native modules on Windows don't know the existence of Javet. Windows dynamic library loading API ``LoadLibraryExW`` throws the following error. + + A dynamic link library (DLL) initialization routine failed. + +The fix is a bit complicated. + +* Prepare the Windows build environment by following :doc:`../development/build`. +* Install the node modules from source code ``npm install --build-from-source``. +* Download the corresponding Javet library file from this `drive `_. +* Unzip the Javet library file somewhere. +* Create a rebuild script pointing to the Javet library file by referencing `rebuild-sqlite3.cmd <../../scripts/node/javet-rebuild/rebuild-sqlite3.cmd>`_ and `rebuild.cmd <../../scripts/node/javet-rebuild/rebuild.cmd>`_. +* Run the rebuild script. + +The rebuild script actually replaces ``node.lib`` with ``libjavet....lib`` during the rebuild so that the new node modules can tell ``LoadLibraryExW`` to look for Javet instead of Node.js. + +Javet calls for someone who can voluntarily host the Javet libraries and Javet compatible node modules so that major Javet users don't need to go through these. For now, it has to be a pretty manual work. + +Caution! +^^^^^^^^ + +* Once the node modules are patched or rebuilt, they can only be loaded by that particular version of Javet and they cannot be loaded by Node.js any more. +* Make backups. + +V8 Mode +======= + +In V8 mode, there is no out-of-box support to ES6 dynamic import. But, Javet provides complete support on top of V8. There are 2 ways of playing around with the ES6 dynamic import: Pre-load and On-demand. + +Pre-load +-------- + +Javet stores compiled modules in a map with key = module path, value = compiled module. When V8 meets a new module to be imported, Javet will look up the map and return the compiled module to V8. So, in order to simulate dynamic import, application needs to compile those required modules before the final execution. + +For instance: The dependency is as following. + +.. code-block:: + + Application + ├─A + │ ├─a.js (depends on b.js) + │ └─B + │ └─b.js + ├─C + │ └─c.js + └─d.js + +The execution steps are as following. + +1. Compile module ./A/B/b.js +2. Compile module ./A/a.js +3. Compile module ./C/c.js +4. Compile module ./d.js +5. Launch the application + +Here is an example. Assuming ``test.js`` depends on ``module.js``, the code looks like the following. + +.. code-block:: java + + String codeString = "export function testFromModule() { return { a: 1 }; };"; + // Step 1: Assign a resource name to a piece of code. + IV8Executor iV8Executor = v8Runtime.getExecutor(codeString).setResourceName("./module.js"); + // Step 2: Compile the module.js. + try (V8Module v8Module = iV8Executor.compileModule()) { + // Step 3: Evaluate the module.js. + v8Module.executeVoid(); + if (v8Runtime.containsModule("./module.js")) { + System.out.println("./module.js is registered as a module."); + } + codeString = "import { testFromModule } from './module.js'; testFromModule();"; + // Step 4: Do the same to test.js. + iV8Executor = v8Runtime.getExecutor(codeString).setResourceName("./test.js").setModule(true); + // Step 5: Compile and evaluate test.js and Javet will automatically feed V8 with module.js. + try (V8ValueObject v8ValueObject = iV8Executor.execute()) { + // Step 6: Verify the module.js taking effect. + System.out.println("Variable a = " + v8ValueObject.getInteger("a") + "."); + } + } + +On-demand +--------- + +Obviously, pre-loading modules requires application to analyze the code for complete dependency. That is too heavy in most of the cases. Luckily, Javet also supports registering a module resolver which is called back when the modules are being imported. With the module resolver, application doesn't need to analyze the code for dependency. Of course, application is responsible for security check. + +Here is an example. Assuming ``test.js`` depends on ``module.js``, the code looks like the following. + +.. code-block:: java + + // Step 1: Create a V8 runtime from V8 host in try-with-resource. + try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) { + // Step 2: Register a custom module resolver. + v8Runtime.setV8ModuleResolver((runtime, resourceName, v8ModuleReferrer) -> { + // Step 3: Compile module.js from source code if the resource name matches. + if ("./module.js".equals(resourceName)) { + return runtime.getExecutor("export function test() { return 1; }") + .setResourceName(resourceName).compileV8Module(); + } else { + return null; + } + }); + // Step 4: Import module.js in test.js and expose test() in global context. + v8Runtime.getExecutor("import { test } from './module.js'; globalThis.test = test;") + .setModule(true).setResourceName("./test.js").executeVoid(); + // Step 5: Call test() in global context. + System.out.println("test() -> " + v8Runtime.getExecutor("test()").executeInteger()); + } + +It is V8 that performs the dependency analysis. Javet just relays the callback to application and actively caches the compiled modules so that the module resolver is only called one time per module. + +Internals +========= + +How Javet and V8 work internally for supporting modules can be found at :doc:`../development/design`. + +.. image:: ../resources/images/javet_module_system.png + :alt: Javet Module System + +Please note that the way Javet handles dynamic import in V8 mode can be applied to Node.js mode. That means all Node.js modules can be virtualized by Javet. diff --git a/docs/_sources/reference/performance.rst.txt b/docs/_sources/reference/performance.rst.txt new file mode 100644 index 000000000..d4995fd19 --- /dev/null +++ b/docs/_sources/reference/performance.rst.txt @@ -0,0 +1,39 @@ +================= +Javet Performance +================= + +In V8, a context is an execution environment that allows separate, unrelated, JavaScript applications to run in a single instance of V8. + +It's recommended to reset context if a new execution environment is required. + +Result +====== + +Here is the performance test result from i7 10700K + Windows 10. Test case is just ``1 + 1 = 2``. + +======== =============================== =============== +Type Case TPS +======== =============================== =============== +Node Single Context with 1 Thread 751,032 +Node Ad-hoc Context with 1 Thread 65 +Node Single Context with 8 Threads 4,410,143 +Node Ad-hoc Context with 8 Threads 363 +Node Ad-hoc Isolate with 1 Thread 51 +Node Ad-hoc Isolate with 8 Threads 263 +V8 Single Context with 1 Thread 647,458 +V8 Ad-hoc Context with 1 Thread 2,846 +V8 Single Context with 8 Threads 3,968,253 +V8 Ad-hoc Context with 8 Threads 16,508 +V8 Ad-hoc Isolate with 1 Thread 748 +V8 Ad-hoc Isolate with 8 Threads 3,660 +======== =============================== =============== + +Highlights +========== + +* Node.js performs slightly better in **Single Context** mode mainly because the V8 embedded in Node.js is much older than the built-in V8. +* Built-in V8 dramatically outperforms Node.js in **Ad-hoc** mode mainly because Node.js comes with a huge overhead that seriously slows down the context and isolate creation and recycle. +* It's recommended to use built-in V8 unless Node.js is required in some particular cases. +* Node.js on Linux is built as `position independent code `_ which comes with an additional performance overhead. + +Reference: https://v8.dev/docs/embed#contexts diff --git a/docs/_sources/reference/termination.rst.txt b/docs/_sources/reference/termination.rst.txt new file mode 100644 index 000000000..596846033 --- /dev/null +++ b/docs/_sources/reference/termination.rst.txt @@ -0,0 +1,73 @@ +=========== +Termination +=========== + +Terminating scripts that run out of control is quite important in terms of protecting the applications from being attacked by malicious scripts. In Javet, there are 2 typical ways of terminating scripts. + +Automatic Termination with Pool and Engine +========================================== + +``IJavetEngineGuard`` is the built-in support for terminating a script which runs out of control. + +.. code-block:: java + + // Get an engine from the pool as usual. + try (IJavetEngine iJavetEngine = iJavetEnginePool.getEngine()) { + V8Runtime v8Runtime = iJavetEngine.getV8Runtime(); + // Get a guard from the engine and apply try-with-resource pattern. + try (IJavetEngineGuard iJavetEngineGuard = iJavetEngine.getGuard(10000)) { + v8Runtime.getExecutor("while (true) {}").executeVoid(); + // That infinite loop will be terminated in 10 seconds by the guard. + } catch (JavetTerminatedException e) { + // JavetTerminatedException will be thrown to mark that. + assertFalse(e.isContinuable()); + } + assertEquals(2, v8Runtime.getExecutor("1 + 1").executeInteger(), + "The V8 runtime is not dead and still be able to execute code afterwards."); + } + +Does ``IJavetEngineGuard`` hang normal scripts till timeout is hit? No, it doesn't cause any overhead. If the script completes, ``IJavetEngineGuard.close()`` will be called via try-with-resource pattern and cancel the daemon thread immediately. + +Please refer to the :extsource2:`source code <../../src/test/java/com/caoccao/javet/interop/engine/TestJavetEngineGuard.java>` for more detail. + +Manual Termination +================== + +Manual termination gives applications complete control. In return, the coding effort is considerable. + +.. code-block:: java + + V8Host v8Host = V8Host.getV8Instance(); + try (V8Runtime v8Runtime = v8Host.createV8Runtime()) { + // Create a daemon thread monitoring the V8 runtime status. + Thread daemonThread = new Thread(() -> { + // V8 runtime isInUse() does not require lock. + while (!v8Runtime.isInUse()) { + try { + TimeUnit.MILLISECONDS.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + // V8 runtime terminateExecution() does not require lock. + v8Runtime.terminateExecution(); + }); + daemonThread.start(); + try { + v8Runtime.getExecutor( + "var count = 0; while (true) { ++count; }") + .executeVoid(); + fail("Failed to throw exception when execution is terminated."); + } catch (JavetTerminatedException e) { + assertFalse(e.isContinuable()); + } + final int count = v8Runtime.getGlobalObject().getInteger("count"); + assertTrue(count > 0, "Count should be greater than 0."); + assertEquals(2, v8Runtime.getExecutor("1 + 1").executeInteger(), + "V8 runtime should still be able to execute script after being terminated."); + } + +How about Debug Mode? +===================== + +Usually, when application is being debugged, ``JavetEngineGuard`` may easily interrupt the debug. No worry, ``JavetEngineGuard`` is by default disabled in debug mode. Please refer to ``disableInDebugMode()`` and ``enableInDebugMode()`` for detail. diff --git a/docs/_sources/reference/todo_list.rst.txt b/docs/_sources/reference/todo_list.rst.txt new file mode 100644 index 000000000..772b4f6c9 --- /dev/null +++ b/docs/_sources/reference/todo_list.rst.txt @@ -0,0 +1,7 @@ +========= +TODO List +========= + +* To upgrade V8 and Node.js periodically. +* To expose more Node.js modules in Javet style. +* To polyfill V8 mode with more API. diff --git a/docs/_sources/reference/v8_collection.rst.txt b/docs/_sources/reference/v8_collection.rst.txt new file mode 100644 index 000000000..6a54652d5 --- /dev/null +++ b/docs/_sources/reference/v8_collection.rst.txt @@ -0,0 +1,80 @@ +============= +V8 Collection +============= + +Collection in V8 +================ + +Javet provides decent support on manipulating V8 collection as following. + +=================== =========================== ================ =========== ============ ======= =================================== =============== =============== =================== ============================ +Collection getLength() / getSize() add() / set() delete() has() get() getKeys() / getOwnPropertyNames() getValues() getEntries() forEach(Consumer) forEach(BiConsumer) +=================== =========================== ================ =========== ============ ======= =================================== =============== =============== =================== ============================ +Object No **Yes** **yes** **Yes** **Yes** **Yes** No No **Yes** **Yes** +Array **Yes** **Yes** **yes** **Yes** **Yes** **Yes** No No **Yes** No +Map **Yes** **Yes** **yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** +Set **Yes** **Yes** **yes** **Yes** **Yes** **Yes** No No **Yes** No +WeakMap No **Yes** **yes** **Yes** **Yes** No No No No No +WeakSet No **Yes** **yes** **Yes** No No No No No No +=================== =========================== ================ =========== ============ ======= =================================== =============== =============== =================== ============================ + +Usage +===== + +V8ValueArray +------------ + +.. code-block:: java + + try (V8ValueArray v8ValueArray = v8Runtime.getExecutor("const a = new Array(0,1,2); a;").execute()) { + AtomicInteger count = new AtomicInteger(0); + v8ValueArray.forEach((V8ValueInteger value) -> { + assertEquals(count.getAndIncrement(), value.getValue()); + }); + assertEquals(4, v8ValueArray.push(3)); + assertEquals(3, v8ValueArray.popInteger()); + } + +V8ValueSet +---------- + +.. code-block:: java + + try (V8ValueSet v8ValueSet = v8Runtime.getExecutor( + "const a = new Set(); a.add('0'); a.add('1'); a.add('2'); a;").execute()) { + // V8 feature: Order is preserved. + AtomicInteger count = new AtomicInteger(0); + assertEquals(3, v8ValueSet.forEach((V8ValueString key) -> { + assertEquals(Integer.toString(count.getAndIncrement()), key.getValue()); + })); + v8ValueSet.add("3"); + assertTrue(v8ValueSet.has("3")); + assertTrue(v8ValueSet.delete("3")); + assertFalse(v8ValueSet.has("3")); + } + +V8ValueMap +---------- + +.. code-block:: java + + try (V8ValueMap v8ValueMap = v8Runtime.getExecutor( + "const a = new Map(); a.set('0', 0); a.set('1', 1); a.set('2', 2); a;").execute()) { + // V8 feature: Order is preserved. + AtomicInteger count = new AtomicInteger(0); + assertEquals(3, v8ValueMap.forEach((V8ValueString key) -> { + assertNotNull(key); + assertEquals(Integer.toString(count.getAndIncrement()), key.getValue()); + })); + count.set(0); + assertEquals(3, v8ValueMap.forEach((V8ValueString key, V8ValueInteger value) -> { + assertNotNull(key); + assertNotNull(value); + assertEquals(Integer.toString(count.get()), key.getValue()); + assertEquals(count.getAndIncrement(), value.getValue()); + })); + v8ValueMap.set("a", 1); + assertEquals(4, v8ValueMap.getSize()); + assertTrue(v8ValueMap.has("a")); + assertTrue(v8ValueMap.delete("a")); + } diff --git a/docs/_sources/reference/v8_function.rst.txt b/docs/_sources/reference/v8_function.rst.txt new file mode 100644 index 000000000..575960ab2 --- /dev/null +++ b/docs/_sources/reference/v8_function.rst.txt @@ -0,0 +1,490 @@ +=========== +V8 Function +=========== + +Function Types +============== + +In general, there are 3 types of function exposed by Javet. + +* **Native** functions are V8 built-in functions. +* **API** functions are C++ backed functions. Node.js defined C++ functions and Javet defined Java functions are all API functions. +* **User Defined** functions are JavaScript backed functions. Basically, any function generated via JavaScript code execution is user defined function. + +Comparisons +----------- + +=============== =========== =========== =========== =============== ================== +Type V8 Built-in C++ or Java JavaScript Interception Change on the Fly +=============== =========== =========== =========== =============== ================== +Native Yes Yes No Yes No +API No Yes No Yes No +User Defined No No Yes Yes Yes +=============== =========== =========== =========== =============== ================== + +Call ``getJSFunctionType()`` to determine which function type it is. + +Function Interception +===================== + +Functions can be intercepted via Javet API. This is equivalent to the capability provided by Node.js. However, there is still a key difference between user defined functions and function interception: local scoped context is visible to user defined function, but invisible to function interceptor. Why? That's a long story related to how closure is implemented in V8 which is not the goal in this section. If local scoped context has to be required, please consider changing the function on the fly which is documented in next section. + +``com.caoccao.javet.values.reference.IV8ValueObject`` exposes a set of ``bindFunction()`` that allow caller to register function interceptors in automatic or manual ways. + +Automatic Registration +---------------------- + +bind() +^^^^^^ + +``bind()`` scans the input callback receiver for functions decorated by ``@V8Function`` and ``@V8Property``. It allows registering many getters / setters and functions in one call. + +.. code-block:: java + + List bind(Object functionCallbackReceiver); + +How about Object Type Conversion? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As V8 only accepts data represented by its own format, Java objects need to be converted to native ``V8Value`` objects. Creating native ``V8Value`` objects is tricky in the callback receiver. There are typically 2 options. + +1. **Use Object Converter** - Enhance the :doc:`../tutorial/advanced/object_converter` and it just works as a charm. This is the recommended option. Please refer to ``generateArrayWithConverter()``. + +The beauty of the object converter is Javet doesn't intrude into the receiver at all so that application may pass any objects that are untouchable in the application code, e.g. a native object from a 3rd party library. Of course, in that situation, application may ignore the annotation and register the methods directly in the manual registration which is documented in the next section. + +2. **Convert via V8Runtime** - V8Runtime can be directly used to perform the type conversion. V8Runtime can be manually set by application, or borrowed from the input arguments. Sometimes the callback receiver is not able to borrow ``V8Runtime`` from input arguments, it may decorate a setter with ``@V8RuntimeSetter`` so that Javet will inject the current ``V8Runtime``. Please refer to ``generateArrayWithoutConverter()``. + +Here is a sample. The first step is to declare callback receiver and callback functions. That is quite easy as the sample code shows. + +.. code-block:: java + + public class AnnotationBasedCallbackReceiver { + private V8Runtime v8Runtime; + private String stringValue; + + public AnnotationBasedCallbackReceiver() { + stringValue = null; + v8Runtime = null; + } + + // Javet detects the getter automatically. + @V8Property(name = "stringValue") + public String getStringValue() { + return stringValue; + } + + // Javet detects the setter and property name automatically. + @V8Property + public void setStringValue(String stringValue) { + this.stringValue = stringValue; + } + + // Instance method with same name and same signature. + @V8Function(name = "echo") + public String echo(String str) { + return str; + } + + // Instance method with different name and same signature. + @V8Function(name = "add") + public Integer mathAdd(Integer a, Integer b) { + return a + b; + } + + // Instance method with converter for non-primitive objects. + @V8Function(name = "generateArrayWithConverter") + public Object[] generateArrayWithConverter() throws JavetException { + // Converter is able to recognize non-primitive types. + return new Object[]{"a", 1}; + } + + // Instance method requiring V8Runtime without converter. + @V8Function(name = "generateArrayWithoutConverter") + public V8ValueArray generateArrayWithoutConverter() throws JavetException { + V8ValueArray v8ValueArray = v8Runtime.createV8ValueArray(); + v8ValueArray.push("a"); + v8ValueArray.push(1); + return v8ValueArray; + } + + // Static method. + @V8Function(name = "staticEcho") + public static String staticEcho(String str) { + return str; + } + + // Declare the V8RuntimeSetter for dependency injection. + @V8RuntimeSetter + public void setV8Runtime(V8Runtime v8Runtime) { + this.v8Runtime = v8Runtime; + } + } + +The second step is to call the functions or properties. + +.. code-block:: java + + try (V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject()) { + v8Runtime.getGlobalObject().set("a", v8ValueObject); + AnnotationBasedCallbackReceiver annotationBasedCallbackReceiver = new AnnotationBasedCallbackReceiver(); + v8ValueObject.bind(annotationBasedCallbackReceiver); + assertEquals("test", v8Runtime.getExecutor("a.echo('test')").executeString()); + assertEquals(3, v8Runtime.getExecutor("a.add(1, 2)").executeInteger()); + try (V8ValueArray v8ValueArray = v8Runtime.getExecutor( + "a.generateArrayWithConverter()").execute()) { + assertEquals("[\"a\",1]", v8ValueArray.toJsonString()); + } + try (V8ValueArray v8ValueArray = v8Runtime.getExecutor( + "a.generateArrayWithoutConverter()").execute()) { + assertEquals("[\"a\",1]", v8ValueArray.toJsonString()); + } + assertEquals("static", v8Runtime.getExecutor("a.staticEcho('static')").executeString()); + v8Runtime.getExecutor("a.stringValue = 'abc';").executeVoid(); + assertEquals("abc", v8Runtime.getExecutor("a.stringValue").executeString()); + v8Runtime.getGlobalObject().delete("a"); + } + +Can **this** be Passed in? +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Yes, both ``@V8Function`` and ``@V8Property`` support ``thisObjectRequired``. Just set it to ``true`` and specify the first argument as ``this``. + +.. code-block:: java + + @V8Property(thisObjectRequired = true) + public ... functionName(V8ValueObject thisObject, ...) { + // function body + } + +This feature is especially useful when ``this`` needs to be returned. Just simply return the input ``this`` object and there is no need to create a new V8 object. + +Can Symbol Properties be Intercepted? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Yes, ``@V8Property`` supports ``symbol``. Just set it to ``true``. + +.. code-block:: java + + @V8Property(symbol = true) + public String getValue() { + return value; + } + + @V8Property(symbol = true) + public void setValue(String value) { + this.value = value; + } + +Be careful, Javet only supports symbols that are registered as global symbols in property interception. + +How to Disable Properties or Functions? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As ``@V8Function`` and ``@V8Property`` are statically declared, there is no way of selectively disabling them. ``@V8BindEnabler`` is designed to give Javet a hint on which properties or functions are enabled. Here is a sample. + +.. code-block:: java + + @V8Function + public String disabledFunction() { + return "I am a disabled function."; + } + + @V8Property + public String disabledProperty() { + return "I am a disabled property."; + } + + @V8BindEnabler + public boolean isV8BindEnabled(String methodName) { + if ("disabledFunction".equals(methodName) || "disabledProperty".equals(methodName)) { + return false; + } + return true; + } + +``@V8BindEnabler`` can be used to decorate a method with signature ``boolean arbitraryMethod(String methodName)``. Javet calls that method by each method name for whether each method is enabled or not. + +How to Unregister Properties or Functions? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``unbind()`` follows the same way that ``bind()`` goes to unregister both properties and functions. + +``unbindProperty()`` and ``unbindFunction()`` provide precise way of unregistering single property or function. + +Manual Registration +------------------- + +Manual registration allows the applications to have full control over every step of the function interception. + +boolean bindFunction(String functionName, JavetCallbackContext javetCallbackContext) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This method is for binding a Java code based function in semi-manual way. The caller is expected to do the following steps. + +* Create a callback receiver. +* Find certain callback method in the callback receiver. +* Create ``JavetCallbackContext`` by the callback receiver and callback method. +* Bind the callback context to a V8 object via ``bindFunction``. +* Call the function to trigger the callback. + +.. code-block:: java + + MockCallbackReceiver mockCallbackReceiver = new MockCallbackReceiver(v8Runtime); + JavetCallbackContext javetCallbackContext = new JavetCallbackContext( + mockCallbackReceiver, mockCallbackReceiver.getMethod("blank")); + V8ValueObject globalObject = v8Runtime.getGlobalObject(); + globalObject.bindFunction("blank", javetCallbackContext); + v8Runtime.getExecutor("blank();").executeVoid(); + globalObject.delete("blank"); + +boolean set(String key, V8Value value) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This method is for binding a Java code based function in complete manual way. The caller is expected to do the following steps. + +* Create a callback receiver. +* Find certain callback method in the callback receiver. +* Create ``JavetCallbackContext`` by the callback receiver and callback method. +* Create ``V8ValueFunction`` by ``JavetCallbackContext``. +* Bind the function to a V8 object via ``set``. +* Call the function to trigger the callback. + +.. code-block:: java + + MockCallbackReceiver mockCallbackReceiver = new MockCallbackReceiver(v8Runtime); + JavetCallbackContext javetCallbackContext = new JavetCallbackContext( + mockCallbackReceiver, mockCallbackReceiver.getMethod("blank")); + V8ValueObject globalObject = v8Runtime.getGlobalObject(); + try (V8ValueFunction v8ValueFunction = v8Runtime.createV8ValueFunction(javetCallbackContext); + V8ValueObject a = v8Runtime.createV8ValueObject()) { + globalObject.set("a", a); + a.set("blank", v8ValueFunction); + assertFalse(mockCallbackReceiver.isCalled()); + v8Runtime.getExecutor("a.blank();").executeVoid(); + assertTrue(mockCallbackReceiver.isCalled()); + a.delete("blank"); + globalObject.delete("a"); + } + +boolean bindFunction(String functionName, String codeString) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This method is for binding a JavaScript code based function. + +.. code-block:: java + + v8Runtime.getGlobalObject().bindFunction("b", "(x) => x + 1;"); + assertEquals(2, v8Runtime.getExecutor("b(1);").executeInteger()); + v8Runtime.getGlobalObject().delete("b"); + +Type Mismatch +------------- + +It is very easy to cause type mismatches in JavaScript. The Javet exception is so generic that applications may not be happy with it. So, how to customize the type mismatch exception? The recommended way is to declare the function signature to ``(V8Value... v8Values)`` or ``(Object... objects)``. + +* Javet doesn't throw exceptions under this signature in all cases. +* Application is the one that performs the argument validation so that the error handling is completely customized. +* When dealing with ``V8Value...``, application is responsible for the type conversion. +* Variable arguments can be achieved under this signature so that a JavaScript function can be completely mirrored in Java. + +Resource Management +------------------- + +In the function callback, Javet manages the lifecycle of the input arguments and the return value. So, **DO NOT** close the input arguments, and **DO NOT** apply ``try-with-resource`` to the return value. + +Summary +------- + +Obviously, the automatic registration is much better than the manual registration. Please use them wisely. + +Change a User Defined JavaScript Function on the Fly +==================================================== + +Why is Changing a User Defined JavaScript Function Important? +------------------------------------------------------------- + +Functions can be changed on the fly at JavaScript code level via Javet API. Why to choose this approach? Because sometimes local scoped context is required which is usually called closure. E.g: + +.. code-block:: javascript + + const a = function () { + const b = 1; + return () => b; + } + const x = a(); + console.log(x()); + // Output is: 1 + +Local const b is visible to the anonymous function at line 3, but invisible to the function interceptor. Javet provides a way of changing the function at JavaScript source code level so that local scoped context is still visible. + +How to Change a User Defined JavaScript Function on the Fly? +------------------------------------------------------------ + +``getSourceCode()`` and ``setSourceCode(String sourceCode)`` are designed for getting and setting the source code. ``setSourceCode(String sourceCode)`` actually performs the follow steps. + +.. code-block:: python + + def setSourceCode(sourceCode): + existingSourceCode = v8Function.getSourceCode() + (startPosition, endPosition) = v8Function.getPosition() + newSourceCode = existingSourceCode[:startPosition] + sourceCode + existingSourceCode[endPosition:] + v8Function.setSourceCode(newSourceCode) + v8Function.setPosition(startPosition, startPosition + len(sourceCode)) + +Be careful, ``setSourceCode(String sourceCode)`` has radical impacts that may break the execution because all functions during one execution share the same source code but have their own positions. The following diagram shows the rough memory layout. Assuming function (4) has been changed to something else with position changed, function (1) and (2) will not be impacted because their positions remain the same, but function (3) will be broken because its end position is not changed to the end position of function (4) accordingly. + +.. image:: ../resources/images/memory_layout_of_v8_function.png + :alt: Memory Layout of V8 Function + +Javet does not scan memory for all impacted function. So, it is caller's responsibility for restoring the original source code after invocation. The pseudo logic is as following. + +.. code-block:: java + + originalSourceCode = v8ValueFunction.getSourceCode() + v8ValueFunction.setSourceCode(sourceCode) + v8ValueFunction.call(...) + v8ValueFunction.setSourceCode(originalSourceCode) + +Why does ``setSourceCode()`` sometimes return ``false``? Usually, that means the local scoped context hasn't been generated by V8. ``getJSScopeType().isClass() == true`` indicates that state. After ``callVoid(null)``, the local scoped context will be created with ``getJSScopeType().isFunction() == true`` and ``setSourceCode()`` will work. The pseudo logic is as following. + +.. code-block:: java + + originalSourceCode = v8ValueFunction.getSourceCode() + if (v8ValueFunction.getJSScopeType().isClass()) { + try { + v8ValueFunction.callVoid(null); + // Now v8ValueFunction.getJSScopeType().isFunction() is true + } catch (JavetException e) { + } + } + v8ValueFunction.setSourceCode(sourceCode) // true + v8ValueFunction.call(...) + v8ValueFunction.setSourceCode(originalSourceCode) + +The rough lifecycle of a V8 function is as following. + +.. image:: ../resources/images/lifecycle_of_v8_function.png + :alt: Lifecycle of V8 Function + +What is the Source Code of a Function in V8? +-------------------------------------------- + +When V8 calculates start position of a function, it does not include the keyword ``function`` and function name. E.g. + +.. code-block:: javascript + + function abc(a, b, c) { ... } // Source code is (a, b, c) { ... } + + (a, b, c) => { ... } // Source code is (a, b, c) => { ... } + +So, please always discard the keyword ``function`` and function name when calling ``setSourceCode()``. + +Automatic Type Conversion +========================= + +Javet is capable of automatically converting its internal ``V8Value`` to primitive types by inspecting the function signature. So, the following 4 functions are all the same and valid. + +.. code-block:: java + + // Option 1 + public String echo(String str) { + return str; + } + + // Option 2 + public String echo(V8Value arg) { + return arg == null ? null : arg.toString(); + } + + // Option 3 + public V8Value echo(String str) { + return v8Runtime.createV8ValueString(str); + } + + // Option 4 + public V8Value echo(V8Value arg) throws JavetException { + return arg.toClone(); + } + + // All 4 functions above can be handled in Javet as the following function + echo("123"); + +Primitive types can be in either primitive or object form in the method signature. Javet just automatically handles the type conversion and it is null safe. + +* ``boolean``: ``boolean``, ``Boolean``, ``null`` âŸ¶ï¸ ``false``, ``undefined`` âŸ¶ï¸ ``false``. +* ``byte``, ``integer``, ``long``, ``Short``: ``int``, ``Integer``, ``long``, ``Long``, ``short``, ``Short``, ``byte``, ``Byte``, ``null`` âŸ¶ï¸ ``0``, ``undefined`` âŸ¶ï¸ ``0``. +* ``char``: ``char``, ``Char``, ``null`` âŸ¶ï¸ ``\0``, ``undefined`` âŸ¶ï¸ ``\0``. +* ``float``, ``double``: ``float``, ``Float``, ``double``, ``Double``, ``int``, ``Integer``, ``long``, ``Long``, ``short``, ``Short``, ``byte``, ``Byte``, ``null`` âŸ¶ï¸ ``0``, ``undefined`` âŸ¶ï¸ ``0``. + +For instance: The following 4 functions are all the same and valid. + +.. code-block:: java + + // Option 1 + public int echo(Integer i) { + return i == null? 0: i.intValue(); + } + + // Option 2 + public Integer echo(int arg) { + return Integer.valueOf(int); + } + + // Option 3 + public V8ValueInteger echo(int i) { + return new V8ValueInteger(i); + } + + // Option 4 + public Integer echo(V8ValueInteger i) { + return i == null? 0: i.getValue(); + } + +Can the default values be changed in terms of null safety? Yes, :doc:`../tutorial/advanced/object_converter` allows overriding the default values. + +Call vs. Invoke +=============== + +In one sentence, ``call()`` belongs to function and ``invoke()`` belongs to object. + +Call +---- + +``call()`` is almost equivalent to ``Function.prototype.call()``. It allows the caller to specify receiver. Besides, Javet combines ``Function.prototype.call()`` and ``Function.prototype.apply()`` because Java is friendly to varargs. + +.. code-block:: java + + func.call(object, a, b, c); // func.call(object, a, b, c); with V8 object returned + func.callVoid(object, a, b, c); // func.call(object, a, b, c); without return + func.callObject(object, a, b, c); // func.call(object, a, b, c); with Java object returned + func.callPrimitive(object, a, b, c); // func.call(object, a, b, c); with Java primitive returned + func.callAsConstructor(a, b, c); // new func(a, b, c); + +Invoke +------ + +``invoke()`` takes function name and arguments, but not receiver because the object itself is the receiver. So the API is almost identical to ``call()`` except for the first argument. + +.. code-block:: java + + object.invoke("func", a, b, c); // object.func(a, b, c); with V8 object returned + object.invokeVoid("func", a, b, c); // object.func(a, b, c); without return + object.invokeObject("func", a, b, c); // object.func(a, b, c); with Java object returned + object.invokePrimitive("func", a, b, c); // object.func(a, b, c); with Java primitive returned + +``invoke()`` is heavily used in Javet so that the JNI implementation can be dramatically simplified. In few extreme cases, V8 doesn't expose its C++ API and ``invoke()`` appears to be the only way. So, feel free to invoke all kinds of JS API despite of the deficit of Javet built-in API. + +How about Bind? +--------------- + +``Function.prototype.bind()`` is simply a ``set()`` in Javet. + +.. code-block:: java + + // func.bind(object); func(a, b, c); with return + object.set("func", func); object.invoke("func", a, b, c); + + // func.bind(object); func(a, b, c); without return + object.set("func", func); object.invokeVoid("func", a, b, c); + +Please review the :extsource2:`test cases <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueFunction.java>` for more detail. diff --git a/docs/_sources/reference/v8_promise.rst.txt b/docs/_sources/reference/v8_promise.rst.txt new file mode 100644 index 000000000..2ecf7d696 --- /dev/null +++ b/docs/_sources/reference/v8_promise.rst.txt @@ -0,0 +1,97 @@ +========== +V8 Promise +========== + +V8 promise is an advanced topic because it's usually hard to be mastered due to its multi-threaded nature. Javet enables applications to play with V8 promise in a decent way. + +Promise and Resolver +==================== + +Resolver is a new concept to some JavaScript developers. In fact, it is already an old friend. Inside ``new Promise((resolve, reject) => {});``, ``(resolve, reject)`` is called resolver in V8. Javet exposes the V8 promise and resolver via the same interface ``IV8ValuePromise`` because in V8 they really are the same. So, they both share the same set of API. But the ownership of the API makes the difference as the following chart shows. + +.. image:: ../resources/images/v8_promise_and_resolver.png + :alt: V8 Promise and Resolver + +Lifecycle +========= + +The lifecycle is as the following chart shows. + +1. JavaScript application calls an API for certain resource. E.g. ``readFileAsync``. +2. Java application receives a callback from V8 for the resource. +3. Java application creates a V8 promise resolver and holds the resolver. +4. Java application gets a V8 promise from the resolver and returns that V8 promise as callback return. +5. JavaScript application gets that promise and binds the ``.then()`` and ``.catch()``. +6. Java application fetches the resource and calls the resolver via ``.resolve()``. +7. JavaScript application receives the resource in ``.then()`` and processes the result. + +.. image:: ../resources/images/v8_promise_lifecycle.png + :alt: V8 Promise Lifecycle + +Example fs.readFileAsync() +========================== + +Requirements: Create a JavaScript API ``fs.readFileAsync()`` for reading a file in async manner. + +The pseudo code is as following. + +.. code-block:: java + + // Java application injects an interceptor as 'fs'. + v8Runtime.getGlobalObject().set("fs", fs); + +.. code-block:: javascript + + // JavaScript application calls 'readFileAsync()' and registers 'then()' + fs.readFileAsync('a.log').then(fileContent => console.log(fileContent)); + +.. code-block:: java + + // Java application creates a resolver, pushes the resolver to task queue, returns a promise from the resolver. + @V8Function + public V8ValuePromise readFileAsync(String filePath) throws JavetException { + V8ValuePromise v8ValuePromiseResolver = v8Runtime.createV8ValuePromise(); + queue.add(new Task(v8ValuePromiseResolver, filePath, timeout)); + return v8ValuePromiseResolver.getPromise(); + } + +.. code-block:: java + + // Java application fetches the file content and resolve/reject the promise in a background thread. + String fileContent = getFileContent(task.getFilePath()); + try (V8ValuePromise promise = task.getPromise()) { + if (fileContent == null) { + promise.reject(v8Runtime.createV8ValueUndefined()); + } else { + promise.resolve(fileContent); + } + } + // JavaScript application prints the file content in console afterwards. + +Notes +----- + +* Java application needs to have background thread(s) process async calls from V8. +* Node.js mode has its own event loop. So, sometimes, Java application has to call ``await()`` after ``resolve()`` or ``reject()``. + +Unhandled Rejection +=================== + +Sometimes Java application breaks when unhandled rejection is raised. + +In V8 mode, ``V8Runtime.setPromiseRejectCallback()`` allows Java application to register a callback implementing ``IJavetPromiseRejectCallback``. + +In Node.js mode, event ``unhandledRejection`` is recommended to be listened. + +.. code-block:: javascript + + import process from 'process'; + + process.on('unhandledRejection', (reason, promise) => { + console.log('Unhandled Rejection at:', promise, 'reason:', reason); + // Application specific logging, throwing an error, or other logic here + }); + +Be careful, the ``V8Runtime.setPromiseRejectCallback()`` in V8 mode also works in Node.js mode and it can disable the built-in Node.js event ``unhandledRejection``. Sometimes, this is a handy feature. + +Please review the :extsource2:`test cases <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValuePromise.java>` for more detail. diff --git a/docs/_sources/release_notes/index.rst.txt b/docs/_sources/release_notes/index.rst.txt new file mode 100644 index 000000000..63ed9ba28 --- /dev/null +++ b/docs/_sources/release_notes/index.rst.txt @@ -0,0 +1,10 @@ +============= +Release Notes +============= + +.. toctree:: + :maxdepth: 1 + + release_notes_0_9 + release_notes_0_8 + release_notes_0_7 diff --git a/docs/_sources/release_notes/release_notes_0_7.rst.txt b/docs/_sources/release_notes/release_notes_0_7.rst.txt new file mode 100644 index 000000000..65796b08e --- /dev/null +++ b/docs/_sources/release_notes/release_notes_0_7.rst.txt @@ -0,0 +1,44 @@ +=================== +Release Notes 0.7.x +=================== + +0.7.4 Live Debug +---------------- + +* Added V8 primitive value cache +* Added live debug for Chrome Developer Tools + +0.7.3 Locker +------------ + +* Added ``V8ValueWeakMap`` and ``V8ValueWeakSet`` +* Added ``forEach()`` to Collection +* Added ``V8Locker`` for Performance Sensitive Scenarios + +0.7.2 Engine Guard +------------------ + +* Added ``setFunction(String functionName, String codeString)`` to ``IV8ValueObject`` +* Added ``equals()`` and ``strictEquals()`` and ``sameValue()`` to ``IV8Value`` +* Added ``getIdentityHash()`` to ``IV8ValueReference`` +* Added ``isDead()``, ``isInUse()``, ``callAsConstructor()`` and ``terminateExecution()`` to ``V8Runtime`` +* Added V8 typed array and data view +* Added ``IJavetEngineGuard`` + +0.7.1 Bug Fixes +--------------- + +* Easy spring integration +* Performance test cases +* Few bug fixes + +0.7.0 Birth with V8 v8.9 +------------------------ + +* First release of Javet +* Linux + Windows +* V8 ``v8.9.255`` `(2021-02-04) `_ +* Exposure of the majority of V8 API in JVM +* JS function interception +* Native BigInt and Date +* Javet engine pool diff --git a/docs/_sources/release_notes/release_notes_0_8.rst.txt b/docs/_sources/release_notes/release_notes_0_8.rst.txt new file mode 100644 index 000000000..3db323872 --- /dev/null +++ b/docs/_sources/release_notes/release_notes_0_8.rst.txt @@ -0,0 +1,89 @@ +=================== +Release Notes 0.8.x +=================== + +0.8.10 Index in forEach +----------------------- + +* Renamed ``IJavetConsumer`` to ``IJavetUniConsumer`` +* Added ``IJavetUniIndexedConsumer`` and ``IJavetBiIndexedConsumer`` +* Fixed a bug in ``V8FunctionCallback`` on varargs +* Deprecated ``bindFunctions()`` and ``bindProperties()`` +* Added ``@CheckReturnValue`` to warn ignored return value + +0.8.9 Declarative Property Interception +--------------------------------------- + +* Renamed ``setFunction()`` to ``bindFunction()`` in ``IV8ValueObject`` +* Renamed ``setFunctions()`` to ``bindFunctions()`` in ``IV8ValueObject`` +* Added ``disableInDebugMode()`` and ``enableInDebugMode()`` to ``JavetEngineGuard`` +* Added ``bind()``, ``bindProperty()`` and ``bindProperties()`` in ``IV8ValueObject`` +* Added ``@V8Property`` for ``IV8ValueObject.bindProperties()`` + +0.8.8 Hotfix the Source Code +---------------------------- + +* Re-organized doc. +* Added ``getJSFunctionType()``, ``getSourceCode()`` and ``setSourceCode()`` to ``IV8ValueFunction`` + +0.8.7 Native Modules for Node.js +-------------------------------- + +* Supported native modules with rebuilt scripts +* Fixed ``NodeRuntime.await()`` to emit tasks + +0.8.6 Event Loop for Node.js +---------------------------- + +* Upgraded Linux build environment to Ubuntu 20.04 + GCC 9.3 +* Enhanced ``NodeRuntime.await()`` to allow interaction from other threads + +0.8.5 Error Codes +----------------- + +* Universal object conversion is turned on for all API +* Added ``createV8ValueDouble()``, ``createV8ValueString()`` and ``createV8ValueZonedDateTime()`` to ``V8Runtime`` +* Added ``JavetError`` with error codes +* Refactored ``invoke()``, ``call()``, ``set()``, ``has()`` to take ``Object`` instead of ``V8Value`` +* Removed a few exceptions + +0.8.4 V8 v9.0 +------------- + +* Added ``gcBeforeEngineClose`` to ``JavetEngineConfig`` +* Added ``JavetCallbackException`` +* Added ``IV8Value#isNullOrUndefined`` +* Upgraded Node.js to ``v14.16.1`` `(2021-04-06) `_ +* Upgraded V8 to ``v9.0.257`` `(2021-02-24) `_ + +0.8.3 GC +-------- + +* Added ``V8Runtime.lowMemoryNotification()`` and ``V8Runtime.idleNotificationDeadline()`` +* Added ``V8Host.setMemoryUsageThresholdRatio()``, ``V8Host.enableGCNotification()``, and ``V8Host.disableGCNotification()`` +* Updated JavetEnginePool to be lock free +* Added ``autoSendGCNotification`` to ``JavetEngineConfig`` +* Moved ``JavetCallbackContext`` management from ``V8ValueFunction`` to V8 +* Added ``JavetPromiseRejectCallback`` for V8 mode + +0.8.2 Conversion for Primitive +------------------------------ + +* Enabled auto type conversion in primitive types +* Fixed a memory leak issue during V8Runtime ``resetContext()``, ``resetIsolate()``, ``close()`` + +0.8.1 Declarative Function Interception +--------------------------------------- + +* Enabled declarative function interception +* Enabled custom object converter in function callback +* Added ``allowEval`` to ``JavetEngineConfig`` +* Refactored built-in module API for Node.js mode + +0.8.0 First Time with Node.js +----------------------------- + +* Supported Node.js ``v14.16.0`` `(2021-02-23) `_ +* Added ``V8Module`` and ``V8Script`` +* Enhanced ``V8ValuePromise`` +* Added dynamic switch between Node.js and V8 diff --git a/docs/_sources/release_notes/release_notes_0_9.rst.txt b/docs/_sources/release_notes/release_notes_0_9.rst.txt new file mode 100644 index 000000000..7517a8137 --- /dev/null +++ b/docs/_sources/release_notes/release_notes_0_9.rst.txt @@ -0,0 +1,110 @@ +=================== +Release Notes 0.9.x +=================== + +0.9.12 Private Properties +------------------------- + +* Added error code 503 +* Enhanced ``V8Property`` to support built-in symbols +* Added ``V8ValueSharedArrayBuffer`` +* Added ``registerCustomObject()`` and ``unregisterCustomObject()`` to ``JavetObjectConverter`` +* Added private property support to ``IV8ValueObject`` +* Fixed potential core dump issue in V8 runtime close. +* Added Javadoc. + +0.9.11 V8 v9.3 +-------------- + +* Upgraded Node.js to ``v14.17.6`` `(2021-08-31) `_ +* Upgraded V8 to ``v9.3.345.16`` `(2021-08-17) `_ +* Added ``unbind()``, ``unbindProperty()``, ``unbindFunction()`` to ``IV8ValueObject`` +* Updated ``V8Runtime`` to be completely thread-safe +* Added ``V8ValueBuiltInSymbol`` +* Added ``getOwnPropertySymbols()`` to ``V8ValueBuiltInObject`` +* Added ``createV8ValueSymbol()`` to ``V8Runtime`` +* Added ``symbol`` to ``V8Property`` to enable getter and setter on symbol +* Added error code 407 and 805 + +0.9.10 Polyfill Java Interfaces +------------------------------- + +* Added ``JavetVirtualObject`` +* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8Value`` +* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8ValueFunction`` as anonymous function +* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8ValueObject`` as anonymous object +* Added ``isClosed()`` to ``IJavetClosable`` +* Added error code 602 and 603 + +0.9.9 Mac OS x86_64 +------------------- + +* Upgraded Node.js to ``v14.17.4`` `(2021-07-29) `_ +* Added support to Mac OS x86_64 +* Removed ``staticClassEnabled`` from ``JavetProxyConverter`` + +0.9.8 Empower the Promise +------------------------- + +* Added ``resolve()`` and ``reject()`` to ``V8ValuePromise`` +* Added ``staticClassEnabled`` to ``JavetProxyConverter`` +* Added ``construct()`` to ``JavetUniversalProxyHandler`` +* Added Dockerfile for Linux x86-64 +* Refactored document for how to build Javet + +0.9.7 Proxy Converter v2 +------------------------ + +* Added static mode to ``JavetUniversalProxyHandler`` +* Added ``ownKeys()`` to ``JavetUniversalProxyHandler`` + +0.9.6 Proxy Converter v1 +------------------------ + +* Added ``IV8ValueProxy`` and ``V8ValueProxy`` +* Added ``getTarget()``, ``getHandler()``, ``isRevoked()`` and ``revoke()`` to ``IV8ValueProxy`` +* Added ``createV8ValueProxy()`` to ``V8Runtime`` +* Added ``JavetUniversalProxyHandler`` and ``JavetProxyConverter`` + +0.9.5 V8 v9.2 +------------- + +* Upgraded V8 to ``v9.2.230.21`` `(2021-07-19) `_ + +0.9.4 Multi-process Safe +------------------------ + +* Added ``JavetConverterConfig`` +* Added ``JavetEntityFunction`` for ``JavetObjectConverter`` +* Updated ``JavetObjectConverter`` to allow skipping functions +* Added ``getPrototype()`` and ``setPrototype()`` to ``IV8ValueObject`` +* Changed the way that Javet libraries are deployed to be multi-process safe + +0.9.3 Module Resolver +--------------------- + +* Upgraded Node.js to ``v14.17.2`` `(2021-07-01) `_ +* Added ``IV8ModuleResolver`` to allow intercepting module resolving callback +* Added ``V8BindEnabler`` to determine whether certain injection is enabled or not +* Added ``NodeModuleProcess#getVersion`` +* Updated ``JavetPrimitiveConverter`` and ``JavetObjectConverter`` to check recursion depth for circular structure detection + +0.9.2 Anonymous Functions in Converter +-------------------------------------- + +* Upgraded Node.js to ``v14.17.1`` `(2021-06-15) `_ +* Updated ``JavetObjectConverter`` to handle anonymous functions more efficiently +* Added ``V8ValueBuiltInObject#assign`` + +0.9.1 V8 in Classloader +----------------------- + +* Moved V8 to a custom classloader +* Enabled ``unloadLibrary()`` and ``loadLibrary()`` in ``V8Host`` + +0.9.0 V8 v9.1 +------------- + +* Upgraded Node.js to ``v14.17.0`` `(2021-05-11) `_ +* Upgraded V8 to ``v9.1.269.28`` `(2021-05-10) `_ +* Added ``thisObjectRequired`` to ``@V8Function`` and ``@V8Property`` diff --git a/docs/_sources/tutorial/advanced/index.rst.txt b/docs/_sources/tutorial/advanced/index.rst.txt new file mode 100644 index 000000000..3c893598b --- /dev/null +++ b/docs/_sources/tutorial/advanced/index.rst.txt @@ -0,0 +1,10 @@ +======== +Advanced +======== + +.. toctree:: + :maxdepth: 1 + + object_converter + java_and_javascript_interop + interact_with_node_js diff --git a/docs/_sources/tutorial/advanced/interact_with_node_js.rst.txt b/docs/_sources/tutorial/advanced/interact_with_node_js.rst.txt new file mode 100644 index 000000000..a7ca858e5 --- /dev/null +++ b/docs/_sources/tutorial/advanced/interact_with_node_js.rst.txt @@ -0,0 +1,138 @@ +===================== +Interact with Node.js +===================== + +Is That Possible? +================= + +In native Node.js, once a JavaScript server application (e.g. express server) is up, there is no normal way of interacting with the Node.js runtime via console. The reasons are quite simple: + +* V8 is single-threaded. +* Node.js event loop is dedicated to that JavaScript server application. + +So, that almost closes the door to interacting with Node.js runtime from JVM. No worry, Javet is able to hijack the Node.js event loop to allow interaction from JVM. In other words, Java application can seamlessly interact with Node.js runtime as usual. That applies to all Javet API. + +How? +==== + +Step 1: JavaScript Server +------------------------- + +* Create a JavaScript server application. Here is a sample. + +.. code-block:: js + + /* + npm install express body-parser cookie-parser multer --save + */ + + const express = require("express"); + const app = express(); + + // This is the callback function that takes calls from JVM. + var test = (count) => { + console.log(`Call #${count}`); + } + + // This is the express handler. + app.get('/', function (req, res) { + res.send('Hello'); + console.log('GET /'); + }) + + // Start the express server. + const server = app.listen(8991, "0.0.0.0", () => { + const host = server.address().address; + const port = server.address().port; + console.log(`Listening at http://${host}:${port}`); + }); + +Step 2: Worker Thread for the JavaScript Server +----------------------------------------------- + +* Create a worker thread hosting that JavaScript server application. +* Call ``NodeRuntime.await()`` in that worker thread once the Node.js runtime is up. +* Make sure that Node.js runtime is shared with the main thread. + +Step 3: Main Thread for the Interaction +--------------------------------------- + +* Start that worker thread. +* Wait for the Node.js runtime completely initialized. +* Perform the interaction as usual. + +.. code-block:: java + + public class TestExpress { + public static void main(String[] args) throws JavetException, InterruptedException { + // Make sure node_modules and test folders stay together. + File codeFile = Path.of(JavetOSUtils.WORKING_DIRECTORY) + .resolve("test/test-express.js").toFile(); + AtomicBoolean serverUp = new AtomicBoolean(false); + // Make sure Node.js runtime is shared with all threads. + try (NodeRuntime nodeRuntime = V8Host.getNodeInstance().createV8Runtime()) { + // Create a worker thread. + Thread thread = new Thread(() -> { + try { + System.out.println("Starting the server."); + nodeRuntime.getExecutor(codeFile).executeVoid(); + serverUp.set(true); + System.out.println("Awaiting..."); + nodeRuntime.await(); + } catch (JavetException e) { + e.printStackTrace(); + } + }); + // Start the worker thread. + thread.start(); + while (!serverUp.get()) { + System.out.println("Waiting for server getting up."); + TimeUnit.MILLISECONDS.sleep(500); + } + System.out.println("Server is up."); + // Let's call Node.js. + for (int i = 0; i < Integer.MAX_VALUE; ++i) { + try (V8ValueFunction v8ValueFunction = nodeRuntime.getGlobalObject().get("test")) { + v8ValueFunction.callVoid(null, i); + } + TimeUnit.MILLISECONDS.sleep(1000); + } + } + } + } + +Voilà! The calls (``Call #``) from JVM work. And in the meanwhile, calls (``GET /``) to that JavaScript server also work. Here is the console output. + +.. code-block:: shell + + Waiting for server getting up. + Starting the server. + Awaiting... + Listening at http://0.0.0.0:8991 + Server is up. + Call #0 + Call #1 + Call #2 + Call #3 + Call #4 + GET / + Call #5 + Call #6 + Call #7 + Call #8 + Call #9 + +How can this work? The ``await()`` in the worker thread actually plays the following trick. + +.. code-block:: python + + # This is the pseudo logic. + def await(): + while True: + drain_the_task_queue() + pause_the_event_loop() + if there_are_more_tasks_in_task_queue(): + sleep_a_while() # This allows calls from other thread to take effect. + resume_the_event_loop() + else: + break diff --git a/docs/_sources/tutorial/advanced/java_and_javascript_interop.rst.txt b/docs/_sources/tutorial/advanced/java_and_javascript_interop.rst.txt new file mode 100644 index 000000000..d95d0a5bd --- /dev/null +++ b/docs/_sources/tutorial/advanced/java_and_javascript_interop.rst.txt @@ -0,0 +1,83 @@ +=========================== +Java and JavaScript Interop +=========================== + +Javet allows injecting arbitrary Java objects into V8 which enables the complete interop between Java and JavaScript. To enable this feature, application just needs to call ``v8Runtime.setConverter(new JavetProxyConverter());``. Here are 3 examples. + +Inject a Static Class +===================== + +.. code-block:: java + + v8Runtime.getGlobalObject().set("System", System.class); + v8Runtime.getExecutor("function main() {\n" + + // Java reference can be directly called in JavaScript. + " System.out.println('Hello from Java');\n" + + // Java reference can be directly assigned to JavaScript variable. + " const println = System.out.println;\n" + + // Java reference can be directly assigned to JavaScript variable. + " println('Hello from JavaScript');\n" + + "}\n" + + "main();").executeVoid(); + v8Runtime.getGlobalObject().delete("System"); + + /* + * Output: + * Hello from Java + * Hello from JavaScript + */ + +Inject an Enum +============== + +.. code-block:: java + + v8Runtime.getGlobalObject().set("Color", Color.class); + System.out.println(v8Runtime.getExecutor("Color.pink.toString();").executeString()); + System.out.println("The enum in JavaScript is the one in Java: " + + (Color.pink == (Color) v8Runtime.getExecutor("Color.pink;").executeObject())); + v8Runtime.getGlobalObject().delete("Color"); + + /* + * Output: + * java.awt.Color[r=255,g=175,b=175] + * The enum in JavaScript is the one in Java: true + */ + +Inject a Pattern +================ + +.. code-block:: java + + Pattern pattern = Pattern.compile("^\\d+$"); + v8Runtime.getExecutor("function main(pattern) {\n" + + " return [\n" + + " pattern.matcher('123').matches(),\n" + + " pattern.matcher('abc').matches(),\n" + + " ];\n" + + "}").executeVoid(); + System.out.println(v8Runtime.getGlobalObject().invokeObject("main", pattern).toString()); + + /* + * Output: + * [true, false] + */ + +Inject a StringBuilder +====================== + +.. code-block:: java + + v8Runtime.getGlobalObject().set("StringBuilder", StringBuilder.class); + System.out.println(v8Runtime.getExecutor("function main() {\n" + + " return new StringBuilder('Hello').append(' from StringBuilder').toString();\n" + + "}\n" + + "main();").executeString()); + v8Runtime.getGlobalObject().delete("StringBuilder"); + + /* + * Output: + * Hello from StringBuilder + */ + +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/TestJavaAndJSInterop.java>` for detail. diff --git a/docs/_sources/tutorial/advanced/object_converter.rst.txt b/docs/_sources/tutorial/advanced/object_converter.rst.txt new file mode 100644 index 000000000..4db272593 --- /dev/null +++ b/docs/_sources/tutorial/advanced/object_converter.rst.txt @@ -0,0 +1,568 @@ +================ +Object Converter +================ + +Javet has a built-in ``JavetObjectConverter`` with the following features. + +* It covers primitive types + Set + Map + Array. +* It is completely open to subclass. +* It minimizes the performance overhead. +* It allows registering custom objects. + +So, Javet doesn't natively support converting POJO objects because a POJO converter has to deal with reflection which is so slow that Javet leaves that to applications. However, if the POJO objects are owned by the application, it is possible to register custom objects with the built-in ``JavetObjectConverter``. Otherwise, designing a POJO converter is the alternative solution. + +What if the application wants to inject arbitrary Java objects? No worry, the ``JavetProxyConverter`` is designed for that purpose. + +Register Custom Objects +======================= + +``JavetObjectConverter`` exposes ``registerCustomObject()`` for alien objects which match the following conditions. + +* Default constructor without arguments +* Method with signature ``void fromMap(Map map)`` +* Method with signature ``Map toMap()`` + +Enhance the Custom Object +------------------------- + +* Create a default constructor without arguments. +* Add a method with signature ``void fromMap(Map map)`` +* Add a method with signature ``Map toMap()`` + +Can the method names be changed? Yes, they can have arbitrary names. + +.. code-block:: java + + public final class CustomObject { + private String name; + private int value; + + public CustomObject(String name, int value) { + this.name = name; + this.value = value; + } + + public CustomObject() { + this(null, 0); + } + + public void fromMap(Map map) { + setName((String) map.get("name")); + setValue((Integer) map.get("value")); + } + + public Map toMap() { + return new HashMap() { + { + put("name", getName()); + put("value", getValue()); + } + }; + } + + // getters and setters + } + +Register the Custom Object +-------------------------- + +As the default converter is ``JavetObjectConverter``, just follow the code snippet below to register a custom object. + +.. code-block:: java + + JavetObjectConverter converter = (JavetObjectConverter)v8Runtime.getConverter(); + converter.registerCustomObject(CustomObject.class); + +If the method names are different from the default ones, just provide the names upon registration as the following. + +.. code-block:: java + + converter.registerCustomObject(CustomObject.class, "customFromMap", "customToMap"); + +Usage +----- + +After the registration is completed, there is no additional steps any more. Just follow the regular pattern. + +.. code-block:: java + + CustomObject[] customObjects = new CustomObject[]{ + new CustomObject("x", 1), + new CustomObject("y", 2), + }; + v8Runtime.getGlobalObject().set("a", customObjects); + assertEquals(2, v8Runtime.getExecutor("a.length").executeInteger()); + List v8CustomObjects = v8Runtime.getGlobalObject().getObject("a"); + assertNotNull(v8CustomObjects); + assertEquals(2, v8CustomObjects.size()); + for (int i = 0; i < customObjects.length; i++) { + assertEquals(customObjects[i].getName(), v8Runtime.getExecutor("a[" + i + "].name").executeString()); + assertEquals(customObjects[i].getValue(), v8Runtime.getExecutor("a[" + i + "].value").executeInteger()); + assertEquals(customObjects[i].getName(), v8CustomObjects.get(i).getName()); + assertEquals(customObjects[i].getValue(), v8CustomObjects.get(i).getValue()); + } + +Highlights +---------- + +* PROS: This is a built-in feature so there is no need to deal with a POJO converter. +* CONS: This is a little bit intrusive to the custom objects. + +How does It Work? +----------------- + +As V8 supports private properties, ``JavetObjectConverter`` sets the custom object class name to the V8 object in ``toMap()`` and gets the name from the V8 object in ``fromMap()``. So it is the V8 object that carries the type information all the time and ``JavetObjectConverter`` is free from memorizing the complicated relationship between the Java objects and V8 objects. + +Design a POJO Converter +======================= + +A POJO converter usually is designed for the Java objects that are now owned by the application. So, it has to deal with reflection heavily. The following sample code runs in JDK 11. It's easy to tweak few API for JDK 8. + +Define POJO Object +------------------ + +Let's say you have a Pojo that allows you to define a name-value pair. + +.. code-block:: java + + public class Pojo { + private String name; + private String value; + + public Pojo() { + this(null, null); + } + + public Pojo(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + +Create PojoConverter +-------------------- + +Then, create a generic PojoConverter. + +* It is generic enough to cover all kinds of Pojo objects in a recursive way. +* There is no need to deal with primitive types because the parent converter handles that. +* Always override the methods with depth as argument for circular structure detection. +* Always increment the depth in recursive call. + +.. code-block:: java + + @SuppressWarnings("unchecked") + public class PojoConverter extends JavetObjectConverter { + public static final String METHOD_PREFIX_GET = "get"; + public static final String METHOD_PREFIX_IS = "is"; + protected static final Set EXCLUDED_METHODS; + + static { + EXCLUDED_METHODS = new HashSet<>(); + for (Method method : Object.class.getMethods()) { + if (method.getParameterCount() == 0) { + String methodName = method.getName(); + if (methodName.startsWith(METHOD_PREFIX_IS) || methodName.startsWith(METHOD_PREFIX_GET)) { + EXCLUDED_METHODS.add(methodName); + } + } + } + } + + @Override + protected V8Value toV8Value( + V8Runtime v8Runtime, Object object, final int depth) throws JavetException { + V8Value v8Value = super.toV8Value(v8Runtime, object, depth); + if (v8Value != null && !(v8Value.isUndefined())) { + return v8Value; + } + Class objectClass = object.getClass(); + V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject(); + for (Method method : objectClass.getMethods()) { + if (method.getParameterCount() == 0 && method.canAccess(object)) { + String methodName = method.getName(); + String propertyName = null; + if (methodName.startsWith(METHOD_PREFIX_IS) && !EXCLUDED_METHODS.contains(methodName) + && methodName.length() > METHOD_PREFIX_IS.length()) { + propertyName = methodName.substring(METHOD_PREFIX_IS.length(), METHOD_PREFIX_IS.length() + 1).toLowerCase(Locale.ROOT) + + methodName.substring(METHOD_PREFIX_IS.length() + 1); + } else if (methodName.startsWith(METHOD_PREFIX_GET) && !EXCLUDED_METHODS.contains(methodName) + && methodName.length() > METHOD_PREFIX_GET.length()) { + propertyName = methodName.substring(METHOD_PREFIX_GET.length(), METHOD_PREFIX_GET.length() + 1).toLowerCase(Locale.ROOT) + + methodName.substring(METHOD_PREFIX_GET.length() + 1); + } + if (propertyName != null) { + try (V8Value v8ValueTemp = toV8Value(v8Runtime, method.invoke(object), depth + 1)) { + v8ValueObject.set(propertyName, v8ValueTemp); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + v8Value = v8ValueObject; + return v8Runtime.decorateV8Value(v8Value); + } + } + +Ready! Go! +---------- + +Just write few lines of code to interact with Javet. + +.. code-block:: java + + public class TestPojo { + public static void main(String[] args) throws JavetException { + Pojo[] pojoArray = new Pojo[]{ + new Pojo("Tom", "CEO"), + new Pojo("Jerry", "CFO")}; + try (V8Runtime v8Runtime = V8Host.getNodeInstance().createV8Runtime()) { + v8Runtime.setConverter(new PojoConverter()); + v8Runtime.getGlobalObject().set("pojoArray", pojoArray); + v8Runtime.getExecutor("console.log(pojoArray);").executeVoid(); + } + } + } + +The console output is: + +.. code-block:: js + + [ { name: 'Tom', value: 'CEO' }, { name: 'Jerry', value: 'CFO' } ] + +This process is transparent and fully automated once the converter is set to ``V8Runtime``. + +Universal Converter +=================== + +Can I inject arbitrary Java objects and call all the API in JavaScript? Yes, ``JavetProxyConverter`` is designed for that. In general, the user experience is very much close to the one provided by GraalJS. As ``JavetProxyConverter`` opens almost the whole JVM to V8, it is very dangerous to allow end users to touch that V8 runtime, so ``JavetProxyConverter`` is not enabled by default. Here are the steps on how to enable that. + +Preparation +----------- + +.. code-block:: java + + // Step 1: Create an instance of JavetProxyConverter. + JavetProxyConverter javetProxyConverter = new JavetProxyConverter(); + // Step 2: Set the V8Runtime converter to JavetProxyConverter. + v8Runtime.setConverter(javetProxyConverter); + // Please feel free to inject arbitrary Java objects. + +Instance: File +-------------- + +.. code-block:: java + + File file = new File("/tmp/i-am-not-accessible"); + v8Runtime.getGlobalObject().set("file", file); + assertEquals(file, v8Runtime.getGlobalObject().getObject("file")); + assertEquals(file.exists(), v8Runtime.getExecutor("file.exists()").executeBoolean()); + assertEquals(file.isFile(), v8Runtime.getExecutor("file.isFile()").executeBoolean()); + assertEquals(file.isDirectory(), v8Runtime.getExecutor("file.isDirectory()").executeBoolean()); + assertEquals(file.canRead(), v8Runtime.getExecutor("file.canRead()").executeBoolean()); + assertEquals(file.canWrite(), v8Runtime.getExecutor("file.canWrite()").executeBoolean()); + assertEquals(file.canExecute(), v8Runtime.getExecutor("file.canExecute()").executeBoolean()); + v8Runtime.getGlobalObject().delete("file"); + v8Runtime.lowMemoryNotification(); + +Instance: Map +------------- + +.. code-block:: java + + javetProxyConverter.getConfig().setProxyMapEnabled(true); + Map map = new HashMap() {{ + put("x", 1); + put("y", "2"); + }}; + v8Runtime.getGlobalObject().set("map", map); + assertTrue(map == v8Runtime.getGlobalObject().getObject("map")); + assertEquals(1, v8Runtime.getExecutor("map['x']").executeInteger()); + assertEquals("2", v8Runtime.getExecutor("map['y']").executeString()); + assertEquals(1, v8Runtime.getExecutor("map.x").executeInteger()); + assertEquals("2", v8Runtime.getExecutor("map.y").executeString()); + assertEquals("3", v8Runtime.getExecutor("map['z'] = '3'; map.z;").executeString()); + assertEquals("3", map.get("z")); + assertEquals("4", v8Runtime.getExecutor("map.z = '4'; map.z;").executeString()); + assertEquals("4", map.get("z")); + v8Runtime.getGlobalObject().delete("map"); + v8Runtime.lowMemoryNotification(); + javetProxyConverter.getConfig().setProxyMapEnabled(false); + +Instance: Path +-------------- + +.. code-block:: java + + Path path = new File("/tmp/i-am-not-accessible").toPath(); + v8Runtime.getGlobalObject().set("path", path); + assertEquals(path, v8Runtime.getGlobalObject().getObject("path")); + assertEquals(path.toString(), v8Runtime.getExecutor("path.toString()").executeString()); + Path newPath = v8Runtime.toObject(v8Runtime.getExecutor("path.resolve('abc')").execute(), true); + assertNotNull(newPath); + assertEquals(path.resolve("abc").toString(), newPath.toString()); + assertEquals(path.resolve("abc").toString(), v8Runtime.getExecutor("path.resolve('abc').toString()").executeString()); + v8Runtime.getGlobalObject().delete("path"); + v8Runtime.lowMemoryNotification(); + +Static: StringBuilder +--------------------- + +.. code-block:: java + + v8Runtime.getGlobalObject().set("StringBuilder", StringBuilder.class); + assertEquals("abc def", v8Runtime.getExecutor( + "function main() {\n" + + " return new StringBuilder().append('abc').append(' ').append('def').toString();\n" + + "}\n" + + "main();").executeString()); + v8Runtime.getGlobalObject().delete("StringBuilder"); + v8Runtime.lowMemoryNotification(); + +Static: Pattern +--------------- + +.. code-block:: java + + v8Runtime.getGlobalObject().set("Pattern", Pattern.class); + assertTrue(v8Runtime.getExecutor("let p = Pattern.compile('^\\\\d+$'); p;").executeObject() instanceof Pattern); + assertTrue(v8Runtime.getExecutor("p.matcher('123').matches();").executeBoolean()); + assertFalse(v8Runtime.getExecutor("p.matcher('a123').matches();").executeBoolean()); + v8Runtime.getGlobalObject().delete("Pattern"); + v8Runtime.getExecutor("p = undefined;").executeVoid(); + v8Runtime.lowMemoryNotification(); + +Static: Enum +------------ + +Static class usually does not have an instance. The universal proxy based converter is smart enough to handle that. + +.. code-block:: java + + v8Runtime.getGlobalObject().set("JavetErrorType", JavetErrorType.class); + assertEquals(JavetErrorType.Converter, v8Runtime.getExecutor("JavetErrorType.Converter").executeObject()); + assertThrows( + JavetExecutionException.class, + () -> v8Runtime.getExecutor("JavetErrorType.Converter = 1;").executeVoid(), + "Public final field should not be writable."); + v8Runtime.getGlobalObject().delete("JavetErrorType"); + v8Runtime.getGlobalObject().set("Converter", JavetErrorType.Converter); + assertEquals(JavetErrorType.Converter, v8Runtime.getGlobalObject().getObject("Converter")); + v8Runtime.getGlobalObject().delete("Converter"); + v8Runtime.lowMemoryNotification(); + +Static: Interface +----------------- + +Sometimes an interface or annotation class can be injected for enabling Java reflection in V8. + +.. code-block:: java + + v8Runtime.getGlobalObject().set("AutoCloseable", AutoCloseable.class); + v8Runtime.getGlobalObject().set("IJavetClosable", IJavetClosable.class); + assertTrue(AutoCloseable.class.isAssignableFrom(IJavetClosable.class)); + assertTrue(v8Runtime.getExecutor("AutoCloseable.isAssignableFrom(IJavetClosable);").executeBoolean()); + assertEquals(AutoCloseable.class, v8Runtime.getExecutor("AutoCloseable").executeObject()); + assertEquals(IJavetClosable.class, v8Runtime.getExecutor("IJavetClosable").executeObject()); + v8Runtime.getGlobalObject().delete("AutoCloseable"); + v8Runtime.getGlobalObject().delete("IJavetClosable"); + v8Runtime.lowMemoryNotification(); + +Dynamic: Anonymous Function +--------------------------- + +This feature is quite special as it allows implementing Java interfaces in JavaScript via anonymous functions, also known as lambda expressions. + +1. Define a simple interface ``IStringJoiner`` for joining two strings. + +.. code-block:: java + + interface IStringJoiner extends AutoCloseable { + String join(String a, String b); + } + +2. Define a simple class ``StringJoiner`` which holds the interface ``IStringJoiner``. + +.. code-block:: java + + public class StringJoiner implements AutoCloseable { + private IStringJoiner joiner; + + public StringJoiner() { + joiner = null; + } + + @Override + public void close() throws Exception { + if (joiner != null) { + joiner.close(); + joiner = null; + } + } + + public IStringJoiner getJoiner() { + return joiner; + } + + public void setJoiner(IStringJoiner joiner) { + this.joiner = joiner; + } + } + +3. Inject the implementation from JavaScript. + +.. code-block:: java + + try (StringJoiner stringJoiner = new StringJoiner()) { + v8Runtime.getGlobalObject().set("stringJoiner", stringJoiner); + v8Runtime.getExecutor("stringJoiner.setJoiner((a, b) => a + ',' + b);").executeVoid(); + IStringJoiner joiner = stringJoiner.getJoiner(); + assertEquals("a,b", joiner.join("a", "b")); + assertEquals("a,b,c", joiner.join(joiner.join("a", "b"), "c")); + v8Runtime.getGlobalObject().delete("stringJoiner"); + } + v8Runtime.lowMemoryNotification(); + +Voilà! It works. + +Note: The JavaScript implementation is backed up by ``V8ValueFunction`` which is an orphan object. After its internal ``V8Runtime`` is closed, it will no longer callable. It's recommended to have the interface implement ``AutoClosable`` as the sample shows so that the orphan ``V8ValueFunction`` can be recycled explicitly. If you don't own the interface, Javet will force the recycle of the orphan ``V8ValueFunction`` when the ``V8Runtime`` is being closed. Be careful, if you keep the application running for long while without recycling them in time, ``OutOfMemoryError`` may occur. + +Dynamic: Anonymous Object +------------------------- + +This feature is similar to the dynamic anonymous function, but is an enhanced version because it allows implementing all methods exposed by the Java interface. + +1. Define a simple interface ``IStringUtils`` for joining two strings. + +.. code-block:: java + + interface IStringUtils extends AutoCloseable { + String hello(); + String join(String separator, String... strings); + List split(String separator, String string); + } + +2. Define a simple class ``StringUtils`` which holds the interface ``IStringUtils``. + +.. code-block:: java + + public class StringUtils implements AutoCloseable { + private IStringUtils utils; + + public StringUtils() { + utils = null; + } + + @Override + public void close() throws Exception { + if (utils != null) { + utils.close(); + utils = null; + } + } + + public IStringUtils getUtils() { + return utils; + } + + public void setUtils(IStringUtils utils) { + this.utils = utils; + } + } + +3. Inject the implementation from JavaScript. + +.. code-block:: java + + try (StringUtils stringUtils = new StringUtils()) { + v8Runtime.getGlobalObject().set("stringUtils", stringUtils); + v8Runtime.getExecutor( + "stringUtils.setUtils({\n" + + " hello: () => 'hello',\n" + + " join: (separator, ...strings) => [...strings].join(separator),\n" + + " split: (separator, str) => str.split(separator),\n" + + "});" + ).executeVoid(); + IStringUtils utils = stringUtils.getUtils(); + assertEquals("hello", utils.hello()); + assertEquals("a,b,c", utils.join(",", "a", "b", "c")); + assertArrayEquals( + new String[]{"a", "b", "c"}, + utils.split(",", "a,b,c").toArray(new String[0])); + v8Runtime.getGlobalObject().delete("stringUtils"); + } + v8Runtime.lowMemoryNotification(); + +Voilà aussi! It works again. + +Note: The JavaScript implementation is backed up by ``V8ValueObject`` which is an orphan object. After its internal ``V8Runtime`` is closed, it will no longer callable. It's recommended to have the interface implement ``AutoClosable`` as the sample shows so that the orphan ``V8ValueObject`` can be recycled explicitly. If you don't own the interface, Javet will force the recycle of the orphan ``V8ValueObject`` when the ``V8Runtime`` is being closed. Be careful, if you keep the application running for long while without recycling them in time, ``OutOfMemoryError`` may occur. + +Features +-------- + +* Any Java objects generated inside V8 are automatically handled by the converter. +* Getters and setters (``get``, ``is``, ``set`` and ``put``) are smartly handled. +* Overloaded methods and varargs methods are identified well. +* Primitive types, Set, Map, List, Array are not handled. Map is special because it can be enabled. +* Java interfaces can be implemented by anonymous functions in JavaScript. + +How does JavetProxyConverter Work? +---------------------------------- + +``JavetProxyConverter`` creates a JavaScript proxy per Java object. For now, the proxy intercepts ``get``, ``has`` and ``set`` to achieve the complete virtualization of Java objects in JavaScript runtime. + +How to Customize JavetProxyConverter? +------------------------------------- + +It is recommended to subclass ``JavetProxyConverter`` and override few internal API to achieve complete customization. + +Null Safety +=========== + +What if the object converter meets ``null`` or ``undefined`` when target type is primitive? This is a quite famous topic in Java because converting null to primitive type results in ``java.lang.NullPointerException``. Luckily, Javet object converter is null safe by injecting default primitive values to ``JavetConverterConfig`` and these default primitive values can be overridden. + +Functions and Objects +===================== + +There are few challenges in the object conversion. + +* V8 functions cannot be easily represented by Java objects. +* V8 objects and maps cannot be easily differentiated in Java. +* Sometimes unexpected functions from object conversion may break applications. + +So, Javet introduced ``IJavetEntityFunction`` and ``IJavetEntityMap`` so that V8 functions and V8 maps can be precisely represented in Java. + +Also, ``JavetConverterConfig`` exposes ``setSkipFunctionInObject(boolean)`` and ``setExtractFunctionSourceCode(boolean)`` to give application the opportunity to skip functions in objects or extract source code of functions. + +If the source code is provided to a user defined function, Javet object converter will inject that function from the source code automatically. That makes sure Java object from V8 object can be smoothly converted back to V8 object at both property and function levels. + +Circular Structure +================== + +It is inefficient and inconvenient for Javet to substantially detect circular structure during object conversion. Instead, Javet converter keeps increasing the depth of recursion and throws ``JavetConverterException`` when maximum depth is reach. Maximum depth can be changed before object conversion is started. This is a cheap operation with high performance. + +Please avoid setting maximum depth to an unrealistic number because JVM will throw ``StackOverflowError`` which brings considerable performance overhead. The thing worse than that is there will be memory leak because resource recycling logic written in ``finally`` block sometimes won't be called when stack overflow occurs. Attackers may easily drain the server resource in minutes by sending tiny circular structure data. + +Final Note +========== + +The built-in converter supports bi-directional conversion. The sample above shows the way of how to convert Java objects to V8 values. The opposite way follows the same pattern. + +Please refer to :extsource3:`source code <../../../src/test/java/com/caoccao/javet/interop/converters/TestJavetCustomConverter.java>` for detail. diff --git a/docs/_sources/tutorial/basic/engine_pool.rst.txt b/docs/_sources/tutorial/basic/engine_pool.rst.txt new file mode 100644 index 000000000..749d9d29f --- /dev/null +++ b/docs/_sources/tutorial/basic/engine_pool.rst.txt @@ -0,0 +1,46 @@ +================= +Javet Engine Pool +================= + +Motivation +========== + +* It takes quite some time to spawn a ``V8Runtime``, especially in Node.js mode. +* It takes a lot of time to initialize a ``V8Runtime`` to prepare for script execution. +* ``V8Runtime`` is not recommended to be used in multi-threaded environments. (Though Javet allows it to be used that way.) + +Goals +===== + +* Provide a basic user experience similar to a database connection pool. +* Minimize the performance overhead of ``V8Runtime`` creation and initialization. +* Free applications from explicitly closing ``V8Runtime`` from time to time. +* Allow easy extension. + +Usage +===== + +.. code-block:: java + + // Create a Javet engine pool. + try (IJavetEnginePool javetEnginePool = new JavetEnginePool<>()) { + // Get a Javet engine from the pool. + try (IJavetEngine javetEngine = javetEnginePool.getEngine()) { + // Get a V8 runtime from the engine. + V8Runtime v8Runtime = javetEngine.getV8Runtime(); + // Create a Javet console interceptor. + JavetStandardConsoleInterceptor javetConsoleInterceptor = + new JavetStandardConsoleInterceptor(v8Runtime); + // Register the Javet console to V8 global object. + javetConsoleInterceptor.register(v8Runtime.getGlobalObject()); + // V8 console log is redirected to JVM console log. + v8Runtime.getExecutor("console.log('Hello Javet from Pool');").executeVoid(); + // Unregister the Javet console to V8 global object. + javetConsoleInterceptor.unregister(v8Runtime.getGlobalObject()); + // close() is not necessary because the Javet engine pool handles that. + v8Runtime.lowMemoryNotification(); + // Force V8 to GC. + } + } + +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/HelloJavet.java>` for more detail. diff --git a/docs/_sources/tutorial/basic/hello_javet.rst.txt b/docs/_sources/tutorial/basic/hello_javet.rst.txt new file mode 100644 index 000000000..e0b213764 --- /dev/null +++ b/docs/_sources/tutorial/basic/hello_javet.rst.txt @@ -0,0 +1,29 @@ +=========== +Hello Javet +=========== + +Print **Hello Javet** in V8 Mode +================================ + +.. code-block:: java + + // Step 1: Create a V8 runtime from V8 host in try-with-resource. + try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) { + // Step 2: Execute a string as JavaScript code and print the result to console. + System.out.println(v8Runtime.getExecutor("'Hello Javet'").executeString()); // Hello Javet + // Step 3: Resource is recycled automatically at the end of the try-with-resource block. + } + +Print **1 + 1** in Node.js Mode +=============================== + +.. code-block:: java + + // Step 1: Create a Node runtime from V8 host in try-with-resource. + try (NodeRuntime nodeRuntime = V8Host.getNodeInstance().createV8Runtime()) { + // Step 2: Execute a string as JavaScript code and print the result to console. + System.out.println("1 + 1 = " + nodeRuntime.getExecutor("1 + 1").executeInteger()); // 2 + // Step 3: Resource is recycled automatically at the end of the try-with-resource block. + } + +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/HelloJavet.java>` for more detail. diff --git a/docs/_sources/tutorial/basic/index.rst.txt b/docs/_sources/tutorial/basic/index.rst.txt new file mode 100644 index 000000000..ea2320a2c --- /dev/null +++ b/docs/_sources/tutorial/basic/index.rst.txt @@ -0,0 +1,15 @@ +===== +Basic +===== + +.. toctree:: + :maxdepth: 1 + + installation + hello_javet + engine_pool + interception + javet_shell + node_js_mode_and_v8_mode + spring_integration + polyfill diff --git a/docs/_sources/tutorial/basic/installation.rst.txt b/docs/_sources/tutorial/basic/installation.rst.txt new file mode 100644 index 000000000..e75b3fb42 --- /dev/null +++ b/docs/_sources/tutorial/basic/installation.rst.txt @@ -0,0 +1,58 @@ +============ +Installation +============ + +Dependency +========== + +Maven +----- + +.. code-block:: xml + + + + com.caoccao.javet + javet + 0.9.12 + + + + + com.caoccao.javet + javet-macos + 0.9.12 + + +Gradle Kotlin DSL +----------------- + +.. code-block:: kotlin + + implementation("com.caoccao.javet:javet:0.9.12") // Linux or Windows + implementation("com.caoccao.javet:javet-macos:0.9.12") // Mac OS (x86_64 Only) + +Gradle Groovy DSL +----------------- + +.. code-block:: groovy + + implementation 'com.caoccao.javet:javet:0.9.12' // Linux or Windows + implementation 'com.caoccao.javet:javet-macos:0.9.12' // Mac OS (x86_64 Only) + +OS Compatibility +================ + +=========================== ======================================================================================================================= +OS Compatible +=========================== ======================================================================================================================= +Windows 10 Yes +Windows 7 Yes +Windows Server Not Tested +Ubuntu 20.04 Yes +Ubuntu 18.04 Yes (`Private Build `_) +Ubuntu 16.04 Yes (`Private Build `_) +Other Linux Distributions Not Tested +MacOS x86_64 Yes +MacOS arm64 No (:doc:`../../faq/environment/can_javet_support_mac`) +=========================== ======================================================================================================================= diff --git a/docs/_sources/tutorial/basic/interception.rst.txt b/docs/_sources/tutorial/basic/interception.rst.txt new file mode 100644 index 000000000..5d0919f1f --- /dev/null +++ b/docs/_sources/tutorial/basic/interception.rst.txt @@ -0,0 +1,110 @@ +============ +Interception +============ + +Javet provides ``@V8Property`` and ``@V8Function`` which allow Java applications to intercept JavaScript properties and functions in an automatic way as following. + +* Decorate a Java class with ``@V8Property`` or ``@V8Function``. +* Bind an instance of that Java class to a V8 value object. +* Call the properties or functions of that V8 value object in JavaScript. +* The calls are intercepted by that instance of the Java class. + +Sample +====== + +@V8Property and @V8Function +--------------------------- + +``@V8Property`` is for registering getters and setters. Javet is good at guessing the property name, e.g. getName => name, setValue => value. + +``@V8Function`` is for registering functions. By default, the Java function name is identical to the JavaScript function name, e.g. increaseAndGet => increaseAndGet, add => add. + +If the default name is not suitable, please tell Javet which one to bind via ``@V8Property(name = "...")`` and ``@V8Function(name = "...")``. + +.. code-block:: java + + public class TestInterception { + private String name; + private int value; + + @V8Property + public String getName() { + return name; + } + + @V8Property + public void setName(String name) { + this.name = name; + } + + @V8Property + public int getValue() { + return value; + } + + @V8Property + public void setValue(int value) { + this.value = value; + } + + @V8Function + public int increaseAndGet() { + return ++value; + } + + @V8Function + public int add(int delta) { + value += delta; + return value; + } + } + +Test +---- + +.. code-block:: java + + // Step 1: Create a V8 runtime from V8 host in try-with-resource. + try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) { + // Step 2: Register console. + JavetStandardConsoleInterceptor javetStandardConsoleInterceptor = new JavetStandardConsoleInterceptor(v8Runtime); + javetStandardConsoleInterceptor.register(v8Runtime.getGlobalObject()); + // Step 3: Create an interceptor. + TestInterception testInterceptor = new TestInterception(); + // Step 4: Bind the interceptor to a variable. + try (V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject()) { + v8Runtime.getGlobalObject().set("a", v8ValueObject); + v8ValueObject.bind(testInterceptor); + } + + // Test property name + v8Runtime.getExecutor("console.log(`a.name is initially ${a.name}.`);").executeVoid(); // null + // a.name setter => setName(String name) + v8Runtime.getExecutor("a.name = 'Javet';").executeVoid(); + // name is changed + System.out.println("Interceptor name is " + testInterceptor.getName() + "."); // Javet + // a.name getter => getName() + v8Runtime.getExecutor("console.log(`a.name is now ${a.name}.`);").executeVoid(); // Javet + + // Test property value + v8Runtime.getExecutor("console.log(`a.value is initially ${a.value}.`);").executeVoid(); // 0 + // a.value setter => setValue(String value) + v8Runtime.getExecutor("a.value = 123;").executeVoid(); + // value is changed + System.out.println("Interceptor value is " + testInterceptor.getValue() + "."); // 123 + // a.value getter => getValue() + v8Runtime.getExecutor("console.log(`a.value is now ${a.value}.`);").executeVoid(); // 123 + + // Test functions + v8Runtime.getExecutor("console.log(`a.increaseAndGet() is ${a.increaseAndGet()}.`);").executeVoid(); // 124 + v8Runtime.getExecutor("console.log(`a.add(76) is ${a.add(76)}.`);").executeVoid(); // 200 + + // Step 5: Delete the interceptor. + v8Runtime.getGlobalObject().delete("a"); + // Step 6: Unregister console. + javetStandardConsoleInterceptor.unregister(v8Runtime.getGlobalObject()); + // Step 7: Notify V8 to perform GC. (Optional) + v8Runtime.lowMemoryNotification(); + } + +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/TestInterception.java>` for more detail. diff --git a/docs/_sources/tutorial/basic/javet_shell.rst.txt b/docs/_sources/tutorial/basic/javet_shell.rst.txt new file mode 100644 index 000000000..4fa51120c --- /dev/null +++ b/docs/_sources/tutorial/basic/javet_shell.rst.txt @@ -0,0 +1,47 @@ +=========== +Javet Shell +=========== + +It is very easy to create a node flavored interactive shell application with a few lines of code. + +.. code-block:: java + + // Step 1: Create a V8 runtime from V8 host in try resource. + try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) { + System.out.println("Welcome to CDT Shell!"); + System.out.println("Input the script or '.exit' to exit."); + // Step 2: Create a scanner to take console input line by line. + try (Scanner scanner = new Scanner(System.in)) { + // Step 3: Create an infinite loop. + while (true) { + System.out.print("> "); + String command = scanner.nextLine(); + // Step 4: If the command is ".exit", exit the loop. + if (".exit".equals(command)) { + break; + } + // Step 5: Execute the command and capture the result. + try (V8Value v8Value = v8Runtime.getExecutor(command).execute()) { + if (v8Value != null) { + // Step 6: Print the result as string. + System.out.println(v8Value.toString()); + } + } catch (Throwable t) { + System.err.println(t.getMessage()); + } + } + } + } + +The user experience is very much like the one in node. + +.. code-block:: js + + > let a = 3 + undefined + > let b = 4 + undefined + > a + b + 7 + +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/cdt/CDTShell.java>` for more detail. diff --git a/docs/_sources/tutorial/basic/node_js_mode_and_v8_mode.rst.txt b/docs/_sources/tutorial/basic/node_js_mode_and_v8_mode.rst.txt new file mode 100644 index 000000000..8c5f05236 --- /dev/null +++ b/docs/_sources/tutorial/basic/node_js_mode_and_v8_mode.rst.txt @@ -0,0 +1,55 @@ +======================== +Node.js Mode and V8 Mode +======================== + +Co-existence +============ + +Javet support both Node.js mode and V8 mode both of which can co-exist in one JVM. This is an awesome feature with the following highlights. + +* Latest V8 features are available in V8 mode. +* Node.js ecosystem is available in Node.js mode. +* There are 2 versions of V8 runtime in 1 JVM and they don't see each other. + +Usage +===== + +It's very simple to get into Node.js mode or V8 mode. E.g. + +V8Host +------ + +.. code-block:: java + + // Node.js Mode + try (V8Runtime v8Runtime = V8Host.getNodeInstance().createV8Runtime()) { + // ... + } + + // V8 Mode + try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) { + // ... + } + +Pool +---- + +.. code-block:: java + + // Node.js Mode + try (JavetEnginePool javetEnginePool = new JavetEnginePool()) { + javetEnginePool.getConfig().setJSRuntimeType(JSRuntimeType.Node); + try (IJavetEngine javetEngine = javetEnginePool.getEngine()) { + // ... + } + } + + // V8 Mode + try (JavetEnginePool javetEnginePool = new JavetEnginePool()) { + javetEnginePool.getConfig().setJSRuntimeType(JSRuntimeType.V8); // Optional, because it defaults to V8. + try (IJavetEngine javetEngine = javetEnginePool.getEngine()) { + // ... + } + } + +Note: The default mode in pool is V8 mode. More technical detail is available at :doc:`../../development/design`. diff --git a/docs/_sources/tutorial/basic/polyfill.rst.txt b/docs/_sources/tutorial/basic/polyfill.rst.txt new file mode 100644 index 000000000..8e86c1612 --- /dev/null +++ b/docs/_sources/tutorial/basic/polyfill.rst.txt @@ -0,0 +1,56 @@ +======== +Polyfill +======== + +Node.js Mode +============ + +Yes, you can polyfill Javet with Node.js modules. + +decimal.js +---------- + +.. code-block:: java + + public void loadJS() throws JavetException { + File decimalJSFile = new File( + JavetOSUtils.WORKING_DIRECTORY, + "scripts/node/node_modules/decimal.js/decimal.js"); + if (decimalJSFile.exists() && decimalJSFile.canRead()) { + getLogger().logInfo("Loading {0}.", decimalJSFile.getAbsolutePath()); + V8Runtime v8Runtime = iJavetEngine.getV8Runtime(); + v8Runtime.getExecutor(decimalJSFile).executeVoid(); + } else { + getLogger().logError("{0} is not found.", decimalJSFile.getAbsolutePath()); + getLogger().logError("Please make sure Node.js is installed, then visit script/node directory and run npm install."); + } + } + + public void test() throws JavetException { + V8Runtime v8Runtime = iJavetEngine.getV8Runtime(); + getLogger().logInfo("1.23 + 2.34 = {0}", v8Runtime.getExecutor( + "const a = new Decimal(1.23);" + + "const b = new Decimal(2.34);" + + "a.add(b).toString();").executeString()); + try (V8ValueFunction v8ValueFunctionDecimal = v8Runtime.getGlobalObject().get("Decimal")) { + try (V8ValueObject v8ValueObjectDecimal = v8ValueFunctionDecimal.callAsConstructor("123.45")) { + getLogger().logInfo(v8ValueObjectDecimal.toString()); + if (v8ValueObjectDecimal.hasOwnProperty("constructor")) { + try (V8ValueFunction v8ValueFunction = v8ValueObjectDecimal.get("constructor")) { + String name = v8ValueFunction.getString("name"); + if ("Decimal".equals(name)) { + BigDecimal bigDecimal = new BigDecimal(v8ValueObjectDecimal.toString()); + getLogger().logInfo("BigDecimal: {0}", bigDecimal.toString()); + } + } + } + } + } + } + +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/DecimalJavetInV8Mode.java>` for more detail. + +V8 Mode +======= + +Polyfilling V8 mode is at another project `Javenode `_ which aims at simulating Node.js with Java in Javet V8 mode. Why? Because Javet V8 mode is much more secure than the Node.js mode, but lacks of some basic features, e.g. setTimeout, setInterval, etc. So, these must-have API can be found in Javenode. diff --git a/docs/_sources/tutorial/basic/spring_integration.rst.txt b/docs/_sources/tutorial/basic/spring_integration.rst.txt new file mode 100644 index 000000000..2b9cdbca7 --- /dev/null +++ b/docs/_sources/tutorial/basic/spring_integration.rst.txt @@ -0,0 +1,64 @@ +================== +Spring Integration +================== + +As Javet is a fundamental SDK, it doesn't rely on Spring Framework so that Javet users don't get dependency hell. But, Javet can be integrated with Spring easily. + +Configuration +============= + +* Create a Spring configuration. +* Declare ``IJavetEnginePool`` as ``@Bean``. + +.. code-block:: java + + @Configuration + @PropertySource("classpath:javet-engine.properties") + @ConfigurationProperties(prefix = "javet.engine") + public class MyJavetEngineConfig { + + @Bean(name = "JavetEnginePoolNode") + public IJavetEnginePool getJavetEnginePoolNode() { + JavetEngineConfig javetEngineConfigNode = new JavetEngineConfig(); + javetEngineConfigNode.setAllowEval(...); + javetEngineConfigNode.setAutoSendGCNotification(...); + javetEngineConfigNode.setDefaultEngineGuardTimeoutMillis(...); + javetEngineConfigNode.setEngineGuardCheckIntervalMillis(...); + javetEngineConfigNode.setPoolDaemonCheckIntervalMillis(...); + javetEngineConfigNode.setPoolIdleTimeoutSeconds(...); + javetEngineConfigNode.setPoolMinSize(...); + javetEngineConfigNode.setPoolMaxSize(...); + javetEngineConfigNode.setPoolShutdownTimeoutSeconds(...); + javetEngineConfigNode.setResetEngineTimeoutSeconds(...); + javetEngineConfigNode.setJavetLogger(new MyJavetLogger(MyJavetLogger.class.getName())); + javetEngineConfigNode.setJSRuntimeType(JSRuntimeType.Node); + return new JavetEnginePool<>(javetEngineConfigNode); + } + + @Bean(name = "JavetEnginePoolV8") + public IJavetEnginePool getJavetEnginePoolV8() { + JavetEngineConfig javetEngineConfigV8 = new JavetEngineConfig(); + javetEngineConfigV8.setAllowEval(...); + javetEngineConfigV8.setAutoSendGCNotification(...); + javetEngineConfigV8.setDefaultEngineGuardTimeoutMillis(...); + javetEngineConfigV8.setEngineGuardCheckIntervalMillis(...); + javetEngineConfigV8.setPoolDaemonCheckIntervalMillis(...); + javetEngineConfigV8.setPoolIdleTimeoutSeconds(...); + javetEngineConfigV8.setPoolMinSize(...); + javetEngineConfigV8.setPoolMaxSize(...); + javetEngineConfigV8.setPoolShutdownTimeoutSeconds(...); + javetEngineConfigV8.setResetEngineTimeoutSeconds(...); + javetEngineConfigV8.setJavetLogger(new MyJavetLogger(MyJavetLogger.class.getName())); + javetEngineConfigV8.setJSRuntimeType(JSRuntimeType.V8); + return new JavetEnginePool<>(javetEngineConfigV8); + } + +Injection +========= + +You may easily inject your engine pool in the Spring way. + +.. code-block:: java + + @Resource + protected IJavetEnginePool javetEnginePool; diff --git a/docs/_sources/tutorial/index.rst.txt b/docs/_sources/tutorial/index.rst.txt new file mode 100644 index 000000000..6535b252a --- /dev/null +++ b/docs/_sources/tutorial/index.rst.txt @@ -0,0 +1,10 @@ +======== +Tutorial +======== + +.. toctree:: + :maxdepth: 2 + + basic/index + advanced/index + migration_guides/index diff --git a/docs/_sources/tutorial/migration_guides/index.rst.txt b/docs/_sources/tutorial/migration_guides/index.rst.txt new file mode 100644 index 000000000..719198d9d --- /dev/null +++ b/docs/_sources/tutorial/migration_guides/index.rst.txt @@ -0,0 +1,8 @@ +================ +Migration Guides +================ + +.. toctree:: + :maxdepth: 1 + + migrate_from_j2v8 diff --git a/docs/_sources/tutorial/migration_guides/migrate_from_j2v8.rst.txt b/docs/_sources/tutorial/migration_guides/migrate_from_j2v8.rst.txt new file mode 100644 index 000000000..6be6232b5 --- /dev/null +++ b/docs/_sources/tutorial/migration_guides/migrate_from_j2v8.rst.txt @@ -0,0 +1,77 @@ +================= +Migrate from J2V8 +================= + +How to migrate from J2V8 to Javet is a frequently asked question, especially when people are evaluating Javet. I created Javet in Jan, 2021 for various reasons (:doc:`../../faq/background/what_is_the_motivation`, :doc:`../../faq/background/history_with_j2v8`). After the first release v0.7.0 was published, I started migrating from J2V8 to Javet. It was quite smooth, though it took a week. + +Why Migrate from J2V8 to Javet? +=============================== + +* Its Linux, Mac OS and Windows releases have been abandoned for years. +* Its type hierarchy is inconsistent because primitive types are out of the hierarchy so that tedious ``if-else`` sentences have to be repeated all over the code base. +* Its function registration API is kind of verbose. +* Segfaults take place so frequently and don't get maintainers' attention for years. +* Its locking mechanism heavily increases mental pressure in the code base. +* Its V8 runtime is not multi-threaded friendly unless application adds a synchronous layer on top of it. + +Migration Guides +================ + +V8 ⟶ V8Runtime +--------------- + +* ``V8`` in J2V8 is ``V8Runtime`` in Javet. +* ``V8`` in J2V8 carries 2 roles: 1 as the V8 runtime and 1 as the global object (``globalThis`` or ``global``). In Javet, ``V8Runtime`` no longer inherits from ``V8Value`` so that it literally represents the V8 runtime. ``V8Runtime.getGlobalObject()`` is dedicated to the global object. +* ``V8Runtime`` has much richer API than ``V8`` has. E.g. ``compileV8Module()``, ``lowMemoryNotification()``, ``terminateExecution()``. + +Primitive Types +--------------- + +* Primitive types in Javet inherit from ``V8ValuePrimitive`` ⟶ ``V8Value`` ⟶ ``V8Data``. +* The Javet type hierarchy is consistent so that ``V8Value`` in all supported API can represent all V8 types. This is hard in J2V8 because ``Object`` has to be used to represent all types, however, by using ``Object`` the type check during compilation doesn't work at all and that is a rich source of runtime bugs or even segfaults. + +registerJavaMethod() ⟶ @V8Function +----------------------------------- + +* It is quite painful to register many functions in J2V8. Javet makes that a declarative one instead of the imperative one. Just decorate the target function with ``@V8Function``, then call ``V8ValueObject.bind(javaObject)`` to bind that Java object, it's done. +* In addition, Javet provides ``@V8Property`` which allows registering getters and setters in the same manner. That feature has never been delivered by J2V8. +* Javet also allows unbinding the registration. Just call ``V8ValueObject.unbind(javaObject)``. + +Please refer to :doc:`../../reference/v8_function` for more details. + +V8Locker +-------- + +* Javet introduced **Implicit Mode** which allows applications to eliminate ``V8Locker`` from the code base and still be able to share the same ``V8Runtime`` among multiple threads, because Javet does the synchronization automatically. That frees application developers from the tedious ``acquire()`` and ``release()`` calls, and gets the rid of the runtime exceptions caused by multiple threads. +* Javet also has **Explicit Mode** for performance sensitive scenarios. + +Please refer to :doc:`../../reference/lock` for more details. + +Type Conversion +--------------- + +* Javet has built-in ``JavetObjectConverter`` which covers the majority cases on type conversion so that the arguments of Javet API can be of any type and the converter just does the conversion transparently. That frees application developers from writing tedious type conversion code everywhere. +* Javet also provides ``JavetProxyConverter`` which allows injecting arbitrary Java objects in V8 and polyfilling Java interfaces with JavaScript functions or objects. Especially the polyfilling feature implies hotfixing business logic without restarting the JVM. + +Please refer to :doc:`../advanced/object_converter` for more details. + +Node.js and V8 +-------------- + +* Javet provides both Node.js mode and V8 mode for various usages. Each mode stays at a dedicated classloader so that both modes don't cross each other, and are completely isolated. If the application only uses one mode, it doesn't need to pay extra amount of memory for the other mode because the other mode is not loaded at all. Of course, both modes can be unloaded as well without shutting down the JVM. +* In Node.js mode, all node modules can be directly used including the native modules. Please refer to :doc:`../../reference/modularization` for more detail. +* In V8 mode, it is much more secure than the Node.js mode is, but lacks of some basic ES API, e.g. ``setTimeout()``. Project `Javenode `_ is the one that aims at simulating Node.js with Java in Javet V8 mode. + +Please refer to :doc:`../../development/design` for more details. + +ES6 Module +---------- + +* Javet supports ``import { *** } from '***.js'`` and exposes module resolve event for applications to specify where to locate the modules. + +Please refer to :doc:`../../reference/modularization` for more detail. + +Blessing +======== + +In case this migration guide couldn't cover all your use cases, please contact the maintainer at `discord `_. Wish you a successful migration! diff --git a/docs/_static/basic.css b/docs/_static/basic.css new file mode 100644 index 000000000..acd4167e0 --- /dev/null +++ b/docs/_static/basic.css @@ -0,0 +1,904 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css new file mode 100644 index 000000000..ca805991e --- /dev/null +++ b/docs/_static/css/custom.css @@ -0,0 +1,7 @@ +h4, h5, h6 { + text-transform: initial; +} + +code.literal { + background-color: lightgray; +} \ No newline at end of file diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js new file mode 100644 index 000000000..8cbf1b161 --- /dev/null +++ b/docs/_static/doctools.js @@ -0,0 +1,323 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('

  • b`19;=@e^(Co#rrRK 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 riS(iOKkpgS!F literal 0 HcmV?d00001 diff --git a/docs/_static/images/javet_interception.png b/docs/_static/images/javet_interception.png new file mode 100644 index 0000000000000000000000000000000000000000..949265cfa129d13a1dbe2571c05393e65a4c0c70 GIT binary patch literal 51754 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
    _0T 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
    )lEk50j-KwmCey(nz%wpw11sx$5vca@dxM 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 GH~$N8!FtL7 literal 0 HcmV?d00001 diff --git a/docs/_static/images/javet_memory_management_passive_gc.png b/docs/_static/images/javet_memory_management_passive_gc.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b90bab78622b13b44343181a8c932ccccdc7f0 GIT binary patch literal 28083 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 X=PHpcvOJu^22gmbB2yt{_VM2Uu8;}s literal 0 HcmV?d00001 diff --git a/docs/_static/images/javet_modes.png b/docs/_static/images/javet_modes.png new file mode 100644 index 0000000000000000000000000000000000000000..b650a3127aae0eb5abed80eeb899fba5bac995cc GIT binary patch literal 95301 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 PH;pODtG_CfeG~S7WrM(M literal 0 HcmV?d00001 diff --git a/docs/_static/images/javet_module_system.drawio b/docs/_static/images/javet_module_system.drawio new file mode 100644 index 000000000..3b1f68341 --- /dev/null +++ b/docs/_static/images/javet_module_system.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/_static/images/javet_module_system.png b/docs/_static/images/javet_module_system.png new file mode 100644 index 0000000000000000000000000000000000000000..9b416a887e8f23bfbae87bb096c018b2b240616a GIT binary patch literal 49159 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/lifecycle_of_v8_function.png b/docs/_static/images/lifecycle_of_v8_function.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5c601a0af3d37bd93bf358e879b82c9af72565 GIT binary patch literal 63854 zcmeFYWmHvR+b+5kg(WSWA|N5%or~`7lJ4#nDUk*NX^`#)X^{qL>5}g5-jDA$zH`Rd zXY3z)pC9MXnPWKSV!Gy<&vVCh*EPcwco7153y~5P zR`p2RUv$^S+#-Y=U$MMG{}u8PUQ9?gtMIJ|mP57?c8PkK8m*w?krDz!msLqw+1z(n zS+^4IRM_MfOr@XC$f&;~o7z90ZM=JMv`t|l+m#Z^IO-K#-*iq|*l2Vori|}L2g`s! z@+{_1|MP)_w2$fE2O<9d@6SIaC}?T-4i}q^sx*DStJ3iM-kw()c52ckrl;#EE63IU zvX&JW7ta*%6^|m)Qdgg{;iZ6*QBZ97Kiy^K<>iHi^$(}>rrJ)IrEAi)d0*M7t0&gO zJ2v^A2cA*V`{(CmJc!DI-tv9TG+;6FGx zNTpa(e=8s$z{GU?wn$(u{NUhVPY)$Cb5&L3LZfqUS6A2IAT2L% zY8q_Q`Ps8)l$4ZoIM${in^XIrhUt+84Gzl8zx~~y~!SWC08zi7=>gwfM zHD=(4bQz{+XOlZV3;c+Ph>(h> z)Y8^|!{;&D)fJRBQ=~$LfPlcu%S%j5TqgQbs04x!f9+8@yFZl5X}{E><-58!U9q;d z)_#8~!^z1h$*39xGxYNEx;k8xh<>y9!7BjWsAje^6m7ZH+g(?8;ZKoDWJJU+ouaO; z&()zGL(<;bnn=OKYgmCo=2E-AzmU++a=qr#(o%F71qH?4R9SdLgo~4tcC#COqoy$q zqduSGs^}Ng6F4VFM=3eENjEG=t&5_}^SKv1>8LwmzH9_?XO=rtWvQ8&20*P~B@c}| zJ3Fsly?XQJjl8@(lr&b-1qhrWso7;mnWa?-3U)q}%-TCV%m8#-U41G-^b(R~`Ux4% zhp)@%1gKhzZYrJE9UbO=xL{bN3A7>#Jy>qf>|LwUEX|RKE>5f{D~tT{g@DZhefBvU z7Z(==Metkbg{^enIIH=v&+SeDunlkkBLSOCl+J^a<|#Kiu8HG>*8%h3vHtgK-A2Jd zLDUJ-LFiFyK(J{7zD;>~rW2`@=r2yrcT`Td8h5N?d+Xef^iO}#(bH4Or+GZwx)SyF zH=3H7l1oIbpWP%e8pumY?JTu6hlHReCMG`IUEv}IPgfXJI7dk5ozB%+!?H(5Mxsjv zVx;qc_KA7j*x1?C48~_>X2!>rsj)aHJW%@3YW)gL2vH}gWEgO8aKtkZ7#SIH!Y5n3 zuk71y@>^P3hB;)UrQ4n!y`7SImIHtQ;%M`8b9LK%l1H|tZ>%Q6f^4`6iHKzV^nvp% z`<%&1Nl873SQyzrYTaTCKSn1uHhOAm&ZKcWqr-qs2svz^NJuqxbrf4T*w`;$z8w0- zoKsop036Uq;OS=ooJa^Vx8rKiZb5B*z1zj^=v8UG&Kta!b{0k&Tatamu<{Eye1%@KnVsF^go5D4<|bLtS7}oZk82=M zN`;L3?Xev2eSR{s?#|`O;07tW zxSWGM++OUtZw;pdEByBDTPPYyxn|WWfQglr6%$ek-;1un0wJbt{=DIy{gO~egD4{B?B{GH6Y^*fmy z9s2wC?|iw`dY_xqSD2KQnx*g!JAeQFJv_{aiBT;0z7C8B2pNyh!vQR(|2-YfUN~c$ zgOk%70L=ti4J^c$QENaL%aw+3@%?G6=JL*Fcw=K@JUl#FT3QW2;jVjA0O|Df^w3BI z($dmo85EV3tIdW|fM!el5y}nPmw>Q<9198xnj0JGfw1Ok0sNW)ydO^E2I6a|sj+r& zpDx$askhPUjUuivX!kqY974inSOC}vOddd)f$xQypWmZSH~i1uXDrC0INiOy5@KR< z={)Sz)Sqp(J{x`u4ed=b@RNG{P9CJ+>g9TSZb?N|pjM&|fIW^@TU(n!tGa7!>|{jn zskFG5g_-%}?2MM0`iJXYqSe0*DgYFjuE+#_Dkjz)hDmjPanXLeOFPNPoHUpYAPxA5 zv9a;l>FI8$hK|nNAY*&q#wiLRM_~oK_oa=7#x&5=)O&eFDQRgQ=gr?URmMpSdIK9y z{b2xdkWo-vU0nFQ&bL9}SiaOf@o32w2}KP4rPE+nbV`~m>$cW|5)=bO1iZy+uNd)fqD%#aAXm;o7Xg#rj6}~F~ zfia!id9!9j;O=ygQEmB|yZhB_jkzF5E`S@!Eo<1?9#k3kqQk&4u8xo2%DBwfTz-A8 zvN@dY{cw9B_;|fmW(4x{2UPKY|4ui<}^W!tFC}X_Mot^%zGY}q2ii^=<%0+C<%&~(TsBieb$rrTy zJ>2%kQ-R%>=tyF#s7&Cqnnk?fZ|Vq1^z`(Me#7tN?(Xj3pqOcAXt=V!pO%=YuBfQ! zPp{Vb8351Z&Xu9L`E zOd%+QJsVD#n3%yZLri11zd6rZ)r3>YVHuU%zk!7%vu%6G8Ck^pcfzLPElNL8*S4NOfgpWkUla9o<*Scg4ySkU3}{lh8cCNwW_h z6#aR)+f*>aOFj8AKwbi158$n?t}e(*SJ&1!ZDxerDm*d^lmmo5*xM`Quq%$v{1s9F z>97a|G}*94htGy%etsT=yG4Lc$0sLB)L0-#Sa)iCe0iP^Y$7)8YCNh*1BaE7kY1Cm31qDS;P7VnPiI#?jfJhekV>F%# zUe>`}y=`h}sD!bzTC4n0-^9ek*ch{bz~kA7V7ucQ{A|L<(#JxBv{4t4P}IdX-)1lT zHZvmB0=;Ip$RP^M{GKLQOKfWD{Ksc-c1tbENl8?(lHfy;)j)AvYHDgs43pi$4<2u3 zR@S}Al7IPdCZFeb?oJC1;MGTGV}G(&YLgNYuyJq*@bQJ8!CM4o5d+WDq{GqTcwFzt zLJ2| zIbfPK)zu)|DyXPaYS!cYF0hSXEUuMv&gk&CO&S`8hY72md75c5k zB-ui5L4;~@T5|xQ3{cvrqbHk}Zw^3P7uS|fJmGx|@Ob4VP#ToDI z!{rOm00s?iWbk>Of+zrzM*z02EU#2lR6wKvE8r2F2jT@FwCdD&q-7&iFwv-6F8NM* zL=_9Mn-`f}xL^X9VA7|gX1j8J6 z#woHDXBzAcs5>FH=)lzIPtVVZc-{6v&H*gCkib=m4hKZHX7iDZ_NPZ)SfTITrEyP$ zl%(Vgut}@rxHt@!NGKGlXdkc*0CRWO3#9PAzP=Zk`sCy}VDpoI{saXF7xnxuEGt_C z?w-tQ9)gTN{x_N-x;K^2lO<^oNKj8!7MYufN*EnP(Y4-aP!@U_qj21v@0|5hWfJkY zY=@HgDLx#UnVN#Mj?eejWwk4eVBl=IP$r3?t*uQWiYP29>hj_O#IMqtj{pQRGnYZB z1yoZk-TnuyUcPK#9s~LUm=D;;1Bgg{&SW^@K+-?lkCxnLQVI&Ts4{(=KxPXP_82L6 zVRVoh&o|h+ySNYu`24v21uSYeU3hnNVuF1B0C)@Y`}bk8hb%>AE(~Y(ppcIYF(sK9(%L^{NV|{B*4SR4-N@Y*U*p<7mo|nAKf_z#cn*D z5h?*2lvK1}!h9$tAv3exdYZurKS&Wo1W(T!4UkjJnr9XXt`+NxXt#%3e)#YgBwh73 zv*QH{BoZ_k(@9UmVL0>Q(#<;2+7u^3VjknIGbpI%;;KPe8I)g;kr#U&>< z0wG~i$rom-p`k@b5^_%YyU*!V)z+r5S&j!Hpi#6?Lh~I25Sm7XNUmmACO*U7af^>;3Nz8iWJk|K-x4oCKl0q@5ig1-P40 zr~Y?mXP}L68dzU!?8^Fjt>pye#T!mYEitH6rbIzWbgi?xzWy$0aM?-)cq>Tc1VNk! zIT1+ahBut}`S{u%F6UP|LrdWMf!gM)O~aFtrWxDsVQn$LdV9^6T0DWzxi)zedg=UV zZl1<(jO+M7r{D6=B7g(6x*ceHdNx*6*ryXu_I_Y88_77>*r)^M1H>=jb>7#}VL0|( z3{;7ey3=pbp{OJRvTvqAwF7qfuM#05(iPlv7pk{3tc;Rvl5Uc_Vf@C5+b~K@f*}a?CclBEXYAIfq|W1 zf56lnKxm}ZD2KlI6pVxmk{X2v3NJAi-706d-Pj`N)A}U73v!`CCSvFaWNS0FMW7%kOnQ>c$0uWciMw!a)$Ru(3h5 z(%9HIi4VboK<4N`N6NzhJR&wW78I`}EGAGFe9)@GsO^OOT{JZ@kxgL>v$5v_iQH>) zaSL8D2*lz&C}{pJGAGNz!NCOxF?pV@gC%ot!E-|(wQ{55nEzT`e*)d`{++YlnEe0e z|1CMJ`KqhaB!F_2ot<4(3{FVq=Le?!gM&Kamq5IBM+t_XMZX)jKgk!+;6St?X>Y$m z%QUNC*3bTS4U@R@w`3NUK_J)YJnn~0ZU;2B63@bU2>5(T*s5elLI z<;Yi&yS`Lot{wU5ha)|Q!vI-X4+N3`{lw*KQBa=)89HbM_K6o6Wry?iVXRQ@aqFh9WiLsw(xGt z{Oi|3c7;Qp{coO6NJgBU7O3R3f0%}A(v%6hTZ;zWb$Bz+waEA%w-R0AJOQkXxGk^%5|oP;-$MTw!{x-Pj9HF(@G;Y(IRO2(N-6U zTo}^%zo5rScY*I%?|(?$9-qwtw?aMw;|9miP>8WtJ^e#kx^-M!Es#A4wmI&VH$DcC zs8BeZ>HlTaN1tuFD%r`%s097}G&Q{qmM`1d&N_cNot{nNmSBgI%V(S?bI7$TkYrj; zkjbYj+n+1ysnqNp8;`czA z6t;$IzeL1s9_5!QAo6(CF4JI-`9iq7nw`w({Ql-WKE8>h9^CV`+r#E*F|plw)w<3? zwBD0cDJje(`kM1gyQ4i`?}>b>>aPPeRaNWdRP+WJanCNgJ{rY(*W2iERxmMg z-ru2QUUOZav*@%soYqjGsTnv0#c1k!@AkDZ_FlL(JD@T`gJU%D-kg9>nzSw_!aqow+C++30mZC>HRGyCb z`_=N^!iv?+tat~i%Ncv`9yHg}9n*TF;cJ9f4ZCzg_5WG@ox6SMH&%V@k?;uBiy|KYM zRlayVp&-J?KXN#`25R3q62F-y|8`YM@~vUr_Q#~{?JALww5Oc{eB<6XJnnYll6~O| zx|5e;82wY9Kc7ukFs89={7t0)m6AfS>{Da5HJs`9#BZ@bBQjqIv zXZ7Ey$LIaa%blm=tFAHy!T#+X&Oa;l5E#zS2wL`1CxI^eOq7FSl#95C8l8uJjoeIe zq_#iVs%;;RuYNME5p4C_h@c^jkrZv;zq#!(Fc-|M@;DnVoFiCiAjEyR9x66Qa7U28 zU!E3xlRdVxY@=H^M{fBPoyw5T&Eq=tMQ$DqXg;qaz+aE=q{mo^23x{!w$bLYz=k-A zCWE3Q01d+~7U{3_#u%KSANvuju*BWJ#q9}t-1Ue>lPu+(20hQB7)4!c?Gp4lUjx0x z5Y%oao2-(OpW{yBU$BdklR4DYUkDS0he>&zu8-E+!rfkqL2rIEY3pbP9V`<5U7IM8 zN%HNDE-*3KpZ_s7*!_}}ZFF*Su-jBzQqsib{Fd8!h7Jd|EoNtj=6wfeXebU34<#jk zWB+HN5r>lUbt;Eeaw>Vy{)lm z!DTE@;f|M|_^O!C=Uso)71pg%z>v-nDO^Av1n=$PbFt_?Pe!)SVO!0{KGZiH#pBLk za%nU99JGMsbZRyOGYm)J7u&s!537gb&FQ{R;6t-f(|Ibs@gFJ~=_VbvzWVgT<U@V2o%GLi=XBb#-4j|WJo1~#p`xR}ARPq1B@W+9>B(JRejj%meW&vz5~Ajd zRh{{_LHefVbG$ske(s|m%_GoPPa?JyNDPh4s!rzN%y879q(J%=n+or)3cpAfsg^%c zeixyV2#N_$y}FbOAIZ3`ODbt7O3n*0?w3>$aOCnCcuJH-(UO>AsE8A&`rn{VDD8O3E64h~Q}uH&hP zJ5Q?%0s%Wa6EMH9vbUV=?C2Qm4z@QFm#<=D$JW%I`Yc+!!Tah3>vOpN^XH_0@>B{w z2EbKNyeqV?5%~1BysP)@$HGtHz`p%wq`AE-5%_G|+A!E$I4(4sH~P){uLG|^CH8XP z#wNtet8KmrE{pkqcg7PLPx^6zEU0wOwYKhv24nJVkX12l{A$J372#}70U=mJctQ7XUu{E z8ylJ(_vK5=>Z-tEv-1ovze^4dX74MqAPms?jZ5Y>-q*ZvddU+x)jj2Q7XSxJDckit?u1Q-b-(=0w z!*(eUBRd>h#NUnU+6q@!RTs00ooOG?(YgF_B2bg$in7*}p^II|!g`mVA7xOT`?wHy z>O>J0PJscs3)ZmTkU~~A7Ix+u3x`Bq226F0spP_v-i_^@>168H;SPDqXHgEH6lt)5 zC=zJdLYB)#(%+}F&!iJIogqi=DQHk*5lqENcD?lER*1t)8Y0l~xAW9uE?1TAA|udM z|4aT7zsG-+DMGj){2hjAt9LT2sPuK1EDDO6E6!0JIf0ykhDOne#?xX815KP{9%$7T zzn3OzU}L8sbYl|_9kMewWS$#2Du_XcduZZx4~mgx*xKF(Gq0g!M99S$Q-r*^cgWd)kzh7=A*DX>#@_>cm;uonUZ0xE)KmByn)o2I^7YiPms;acv;-zzt zn;CKaq9*CoC>xp+-f8+$Ksko%DU>19my84grSSRZBc=`1f^KAyc z_13Vl(^E63A7yB3D>2)htlInCbpP%vOikAts4-`0)MeKQTianYxZEA@UbtR7suu&J zwuC1EEE-2Xa^Cr+9`RPU9087SQ!A76)yb0Y)hrh~Rab|e@) zb}u*Gi8az}xBOm!q0zSY^}cYI5gd+MS#8?wx>ywHf$Zm_Fd=#=z0Q^v_21vB?54{J!@|hnk(oA621<$<7Ji)YQJLQ) z8QlJ8;&9}}3z0j%iuOMK;HNngQDxjbKif@3_2hEC-SwLMeqnKkZSMEUno6c%CJ7FQ z=^tt^L{VmCC09siVP;F?woBV2Kp8rBb@k`*Vyh^$==%7~l2KnYgJ-f)B$QF$WnSLW?= zF_ruum)oyhFKx~fXd7R?1SuGto}RyE-N0b?Mj3%gG9jUa-IC97v>+;w_5Hrq^5Nq2 zNII|Qx@0w0*TT&8*2SKGSd@V4&1sWfa~iMvBj4K(yHuIq2=H4K?m<1qIh5J{)D>1# zqMl5E@B0S**!05(mAR-Ggrx$VhD`q_-?`mMC@G1?bUd%S*X6EQeQGC@&BAE5`sSvf zsF-h)MQm&2&~L{zkd^yVE%6VHCB+kxok#Np)W!+Yp=gn^EDEj z2)PE@vgcsuKF^hh@tMNVl>eQKx|!GY6(P-lOe;d9ZsqBoJnG`|4;;_Gi)puS?rhPx z2gD5AGl{)(ye}@4_0&bg<(XeSJ)q;u|XT?-*NF@ zRq_9Q&dS@8*eJ<*Ya0sr+1oSQ{h%KrI<`cBgcD3UCJbtN3&t~x38zC5KI15+kay2&!(_P^IJ4RNaOn*K5?CIWrAkN$Eo*U zrSCJZdMsZGqrVW=<#|Ag6rVQ2gD65ZXmnt!s426c*})Yhv*8rdCJ^|nRllS6<6G#v zgn^QhI%4RmBR60f%|$(jSpE6)=c|yE`}~=H^0UxRz%&6ZXO3fijAJE5YAj1jOW^+F zM#y+z4zanlH4S(<^q_wc%)-iQ(BhGOKrQ4Pn3(ZzpZ_QQt*n=zPk48EFwye6&G!y4 zc+R@uAdtW5phcpMn5~FMMC3!~^wbkcNT_4h8G_PFb_Ga5B5~mPL9msJy=l-2x}E`J z4(%5#t=lTGspIo(yd3!*?~K8hxu+TO&N&WLVv(faA*!SmZGb8P`jhhWRUf0JWqvco z#mC>Vz2oM-@#P@I#ANk~>`|H=QP1cJa ztQ5BjK?Ms7DR2c>sjov(&BtRvB$BhaL3;Xhg z$8{I$CIq)gwaK_Q3h=u8A1g2Bw2LBEB|bO39TIB3WW zAnJ5i*E@RpGW;Ar12E$D5ipRD*dm_VaB2jta5)x?-=6xx=*o=!g_-*A@LydXE)H%u zy%+dc-#a_&3C0}#{rz(9bHqn)GU3E-jp z>g>$P$>Hbc@Aoe8axC|%D!$z*4BH~)zt$7(zz$(B`W>jQzp9xi>v7Uw+D;;5HYZ@YP~M3)T$6Rk`ito3c_5| zBlXnRrI22|3X6`uIy)n8xU5gYhHV3O8a_V0E9H~|BhA*AP}etYhMggtcIY1|t=RG5 zZ?0hiWEyH}^g8v(q*%DPNnmn-gF zXFJ^p2}wy30%X?LeX5fv>(g{BEKXo*x@!w%Gf=m`XYu(wh)DVe3>{A!8mlr52N-Fq zS&~|w0560z2>9OE*LOJ`gJ1Ycva_?nND) zx6vxx+}u@FRbck=u0#nin(}3nVTtEfs54+1G+S-Dz7lU9mL_JWsK(g2cJk@dCt$d# zGf{Ma{j-ptlVkkh!-w>7+{u+3aRKrn!ir22A+M8_cT`lNp@3W^kk-3qdEM8C5d~-g zan{_tyd>OCxnQwN*QVD(NeMMI&K4HbFpHiD{0k&(>h{t;Bkaj4!1n}tD#*|8>FMFv zp!5Cw9~l`+z#{!8#gI&j-@%O|joN72g=9CqkLi;@IUO%ESY8IQug-0-o-PMH zH<}Hn2 zLj5&Qly?|X!omT7Z#5D4uHt~l^xb+*tW`S@3itw$IGCo<1Eyke@wj6CcdGye^(!zg z_ShNEi+nh4Xa38>Ne)|1o+VL&HYt$rF?94d%M5B{t`f5bQsY7#Ze$LGc#aF1CDad zEu9*CoJ0|P~jUuK&Op=xz%BQ#o{mKV1PSD$zq8fI^P+{4NQp~CfOX>oi!Zo$~i zt=mxwC5LcyHrvb)h zq8I0d<~$He>>bLAkB(kx*MB?UX>{XE0fPdcOVc(D0q|;QWaI=0kf%%8OWI|_lAagV z;!;ynQz-S6V2uu1TC-rH+b1}gn#94+SDmd6)NYm42?&8;ni_+RdEwvPPiY2hZP)!f zNMr!g0cWq7wECdCEJ$;sBNY zaC>{^yz`GN2y-(uk&)hGGhFzp!HALs0xZ=C`MV`LnwsBIQs#gI^Gu5wCr$GD;O~0R z4@ystDz|b?5XcHF`0|QIIgeW$6;^5#Ae7ZjalpK&D z2BMSkhPB$NJ=c=MeEoW5YfC~tncaFSmRzEb=Pw}j-=19G-MJskxlR_VnXItFsKL7c zfG$_e>!GL^1E$iuKUC|+Qs5|?C;te_TyV~uTU}6sn8a=YLgIT3h9xHs%gU|3f0z&$ zI4N3dj-)@HTE?{2mFJhrFb+mq~+@x_$touMXy?bypyY8rChPkWm~!7W#Mm zKMKA7x$yh%zp1y&q|t+5*&a^^kStf}Jmq;(Fg2A}1yf_>PCR6BSJ%4Ry%*0cCPm3! z2WD?L8gUWH1NI2G?A8hSNFydDhSiq&vKHsal?sfG0gDGzT;FL3Ahl5)AO84B0{JEiM*EhxrKU+;lC|> z^cqci@$bVQ@Jh=6+w;fzyzk;#n$H+T9_QnA!|FvKe{)^}lBzFai9xr3;MtG2O7j7= z(l;BY5zmY2b1Ys%gY5DT=;2sTpF;8-pXQbtA2nu0Xvphx(#cot~_ddf`VEAKCNJB&p}e z0SVBAsNmU#aFEXlheCo*u3KnFy+to)7pqRV)UW7auoI zibYc{rQ`JI)vP=45L{#N`7*@Pk5CM50vr%=)br1P4zGh8zr9eT(7_}*y zI^tLkwMm*oKFk%a*f?_f;vgFB|ElS2#T*k@YJ`e^zK&894n8$inlGa!g}Q7NL7#ZL z$+B9hASBPhgKM!XWHuD^r5w}VLdhCL6CaxnE~!b;9Vr^sh0&p;$wZ-FFdzai0QOtO=PxH*QL6WQNiK)!&YS|~L}gHpkt zzWYgv85*RY^gg5Qk#oy}7b>bNU!FkwL<}!d{_{yX1gwY}9<(h;+MTk=$PKiW?(BJl z(St-o%(12P6Y3j{BB&b2Ta@v$6SZHzpuwcU%oJe;MK*YOCmTg%pRlsN&+v`AiV`d9k_(-W>EashB>msIe9Ehrs1@AwiLGaq=!EBW6 z{4J}ISlTeEid<7zp0~N49!`(R=x^k0Bm7~*y5vxl=gEZQ`N-?9UyvqZ^sW~7{J_WC z1#j}$z*EMpHtlmb(?G6&0_Xfo9%}g6zKd-N%qepbVF5Ww!OHD#yh6NOg3!}LG?8WJ znK?+1MaaDf-v&XSCrndEcdMZs_S@PIyxXcyw%t~R9A^WW{ggoML{AN?N_Gi~5tXmR z#|wWPMunF4YRH8O@(s!uFlR}9gge|8($hW=|bee|yzxQaV&e^4**c0YYu z?dtl(Zrz1OqV0P{++${~S+cn~loSX*`*@Mm*5Fn@$L-M?yG3QqQgiUC2@wxq ztNoDtde@E1h=2lvwi2;PPWHgG^z^U@QW((rrX~gnm|wUT1v{wQ=eZ)U!0HI z+R{doNN|;x!M&g-5zd0E!k(8;l3drm&iEsJ^78dfY7{Q}Q#s+g*fnsS=yRE3b4H57 zt+nOP#QjvuI_(+G>zE*o&H=O+)Y6&Oyy&B5t9L>40(X>E?*J`)=3HqRxCTVy)T4$@je?|0jzv zi@t!7jCI@fv1E}PL*Ue(Je1y+VXPp&gvpk{->ytbpQtGX7d2v>Dp0~X*RS}j7|)co zqK1$L#i)w6P=A%)_<=!%=OUY0^~sEM=)Pogjsr%jCfA{POBaxu(W{%1QG^2rH#a%J ziu@_2)kCS;HdTHkW4~MvkY!ibP5dxUa&*ilwH^ z`QMoBB>}yLGgLYf`wh*NOzcE%7~CMJw0&|xCpyH8$ar^jW*)c3c|y>CIj+hYU5uqBRVh^u z`848U-mBAux#j=9>6G(!Uws=S9X#N9cdC2fDii!A2zjjO70#00MaGs)L*{#5CF+ez ziyU2)b!l5R&ufIp5Z~2-)(maum9|QAi73gCiZ3*5>{%6r_Fz2kz)>tZa4a}zpF7ou zCCaO^xnM}?yYJFp!d)QR_7EL+&i4vd7+yDAJ!ZyXCL1(5R6A$?M2)}Iad(!j7?!ih zS|)eCvxQOO->k2spJQYGi)g*HqFd#e>bEKWJbZr|8CHNJy1L$X2s`1{LAnvl-23tZ zUiwI{8Vh%$Uk(&&KuO11edE@R;h!xt%N``CRao2EXkZCYenm_vXD+zHl5ZG;-Zf8V z?RVGhBGEc1af_Q*^P)|hX@4FQy!_IyUZQ4(hnFkE}LYz;N*0uK@yz8)^k*>aa!JLA$(ZKkmLl zbA;iWyI-H%Y1R>qP9fxXJXaoWnoaekLB7hR_ObbXfAztt*Ntc5A!06-$sl1sgM@)?G_L~Bc-ZIz?h#Vv zhSZJtTuWNy1%5qF>4I{yVrgzkUF)a=hgH}0?Q%Hczy=bWEN@DU{6dlTmG@Y&kn@q9 z7bBu6tsm{SNynpQzH6Q2&027E40-T;!O4&(a*$%#i>C*5)Ar$}RvxDrWUMpAAA3f# zKM%c@7SCyd20A%uttdtrbncGlSYYo99O+*NATd_NZwZd?VEo+OrjX};@9Fl6G*{3e zxZ}8jVh6V?I?BmQ{?88I*Br zJ@C!@G4*i7wEdv;^a?PvDwwdXt&hfLD+S7lj5Rk6i;J^SFE^Q=Cl7)K!`@?Y)K``_ zd*9f%_p`9}yWs`FV%tq#ktXRp9gCcaA!~CJguHWV(T>n5k;581P7#; zNe|i%Pr;H2hRFNn?JT1aKIhB+c|@eOhM&Z|RVZPF<`U@}2uLY6GkZUoM02vOUNfkW z4YyMSrVNWO)Xd?&td_&1@B5OFm-#JmntFul6<|@4n1<0Kf*Msp06qW^|jX=wXs+eyF%OyPou;J3NS_ zU6s3P;CpOm#qtdb=rFv%ye)yGMNewj=YIF%wpwxh>lZ8$ID0t*OyAViL7X2yYU{MN zLWil1jU`A#pY}vOc$dE&D@^@wEOSZgFQ?&Z3Z-@a=53Pq=!pB?>Tv*pqlyn7IAY&mu3#uB zIsC&B83_rzqN#N-uVK&>H2r7P#Z}AAE&pr_H#q1|PY+@gi8&sj&cTA#Z6{hqzMRU} zgdH@ZnU!ckm+S_p2O(F0%QrT-VSm3xd>5MzNlZfLO%nGK#-)nw>dBX3LtQhn@UYKsM?2{p*9|t3gIOA3DmjR0LR?Yj7t9W{SSn8oiIn9R=i6Oxy{EfgzwV_)5%Y-x8{Ns_? zHC~|HR-Foah9XwpSskH&1{h@ObBvRI z%c3AT=<4$5|Hu;PHhSHUiL9d1 z4Bnn#bvizY?K|mh#Atinsn~uP_!TvtqhrG1Q$e<>{DN%BBBqMES_u^2z9Y*}nuwi? zX1aCjdu4og<`05WVspb%1zhQ45a|dO7*Ryn2;v4_1y{d}_73=Blcl$z#LAsc->#`NAw>&6gOvnWKwJ-2e2bt<@Es?K21@9h--enPL#mGA=E+dSbqBc+j&($UGw}`>q>1(gkg$(qeIL&tzQ&i3V#OtML>1VC@ZN_*z%;3&SEs?(dwq zclN_MD>mncUGJ$iK*|^^Gmy}=D-ukLiZk{3Bo}uTb+eR|ztIfdg_5`=mYR^4P+eS> z)>wRDLR-zA00jxIECx6CZ=7`f!`s9IA%Y}@zV0B{_{=ZaHcZm;m{xhRr+4eC1DLEd zQF5IWlS9~yS+caWoe-gLhcs$j5cyUuGtSkuhYnoE-cmhuT-=Jg)qZfZt-w6d;D!~3 zMh>SJ)P*G*Ex);KqDx^2=ctbE7}H5`;USm`PyP1(cEd{SiNWhYE;+qyb_*le`-yIE zD@#YajLWy8sU?3bO1{&}kx>xCj!T`bV=JdOwc>S#n2O@qSO^6%SPMBm`XhwB2MQZ9kq(@Znc$9sw z!R9Rx_2a10rm^R;9NijyeoNrvUw@uDK~dcHE|MO(_LJS8*q%QLxsL%Rbx=~vOIuSh zhV-keZ#FJ)G7%l>>-^{w+cv!`JbKS_8SOqF9(0OrAcxznhK7E{o=sbtu;78$=7%0L zfPyot2xMSdE1pnNO1PRDlQKg4Yyx)ObkukpmSLZ#gwssMgh@#UIK3u+#zQs(^3#<^ zXL}KbP`7iljo8!#_@?udH!UE;gC{;a$TrZ<<9co2%bpiv-*xTtapmMkF^GBa1_xtH zUmJZ>ChNCX?d5TuHETy&Ja~qdgl;S|Ty~=?&|y5XrJ*QW%{xAmg)6&kX(+y^wrl1% zEB=Z8cM{CpZ+h}a=x%3r$bu-n38$n_&cY_g5WmM$-1!Gal0VV-Yf+ya7HbG%Jn8FF z63^e6&rW_#aijdr_z;2CrS5Z$2}${4xly{uq4M>-WP9ax#IT9mah7AmS5wC06r+^# zSA#wAv*porRQgJfaTE?Yg!2T*%i7My&DX+M+;2k4dv#IIaV*n8BQgH~PjR>_Y+pY8 zcOqlK85;@%66Ad|AGyF@#ie+?etl;xu?#JFEM~!xIzMB~@C7IHO8o^wgmU(3%|V4< z^0fR1co7cvtj(T=&qXEk&d=p=m*}4_z5HL1H2%9+r)>~I3exqtAIy4hB@L@Gc(}0q z&rtMrN)EFAmAl6zWu?rGWP*a`3tSOH^|vbsDFFf1xw$62Q7MB-^AcjrH%!%Z;ESWm zwbd*U11bfe_jW)|=3(69@NkbTc=vmAhS^hC_#&Bg4i)92`#H5t3locAfoK$ZQ?fc? zB?a%p#XL%~E^Rli=(;`6(yjruH2SuXO?UkS#rn@(P+`%3?yE>>TXe`wmp4_p-^6TnmPdAF6BYP?-Jyx44(9ylw+cAyABbAnhy$C>8{+ej! z<(cqwTVmCHYT!R~ehRLvk|`bH8m!Z6Dz>;<7Y96RjHqsEqGn^$ds|pT9E7f~qjNvR zxn8=jAoxExd+VS&g6>ABFGW$Om}Z#iy}Ntw)w|b9;a`2(;VkE*rh%jhYbTMd7P9~cgi`eVM8n>sr8XH@h-@mKHV=(c!exIF0&CdY+ zaehaOn;u8#H<-$pBkaODGItwDaR2m+#&n)#eBH}YlCn$$KJ`c&>5P4HX!wip==D_T zCq+w3Swm4<$*bejGTx!YQZA*uf&N#Hg@y0QS-P}Oq&bhC0WMb}(!O#myX(1+IFX0T zBw`}bzB)B0E|PF8bH8H?Xkl+DrJqM;!%InkhzXK1dKu2fj0%m?zB6;{VP~Jy{|KmAakwE*!_5b?mclW*!G`4>Ta4P)Lh|{9iTy3lex8 zU-Ru3b$mvG0@KaoI>3on{0yh0{t2zdNR1<1nO-ExDwa$BARbjUpORu>WaRT3)|i8d zJZZsORK;dNROQziS9!zge&3eoJHdo$jAvhg_RhA|#l?WsrxVC=sZT$mvYy@|p+Edm zoiYV^(%I@!i*q3nGdl6k5Q~O%qc~GC!+14&n9&$&VEN3lt z--f9WXlA$7BauXMX!1ocq6UXGyCO9EXlABp)Vo^0{)F+IE*!z4{S`$hkBfL%V-7Pp zxwHM_J*lK)ga9kP z*}X8F+nYhW!$f`Zg_kcT>Mjfw_vo2@@~RjoKk0B*%w$y;ZCR-C={GZ%?1%`q{H1XL zpK0j@U!E<_1rs6@7WS%2_GD_zszN$db1Ig*mVdH$)8nppczA*t6BrwtieP3fK-8en zt~mLW8s{?|f5z`&YG&p$RYQIu_|Z3-j-r+4QHOac`_i%;RtuaHIr?>n-?bv9w+YqF zYMxm59*Y)%=sl7d40Sfdy6H79+#4(5Sb`~+_QhkgEMHcIKL=f9dKmV2jy@72a(r2( zS$}~UY00E?gRLpN{5#(-zTeyC-}xXHo(VRhr5|%(_+73ms@tL@ z@TPP5bmqxoR>{W~wA!qwMK`u@oHr{Pn|CouYAo2rLW*czI~j`b0b5X`9+d>GW>rV8 zoY!fmAR^-C6gjpg(maX8*P15Zjx!cy?PNY<=O^hCaku=? zuQp69nl4{(!jsk<&y{EVecVoV%Q5nMg@{&GR!_H&?(5YQBNJGIuY9X4hMJD;DyH=s zdV63spU$Uod5k*gRXd@A5$SAa@YsQ0wP$~08jcf-W)xRGK~57qVz&8yDeOgeF+^F# zJ8onZe@Ji=88YV0K-CiT2@5e%V35UzU$@>s+i%pEsVTpJ>d2Xs*5}lKD>>+;y2Imf zZ-sEp-5EVLRkZ&g{i@ezYs6hA#l2*0bgqSKu9$m$XioYblzc3Zze#Lro4#e6Nth<4 z-?qI)Oy)13#r-t?O!bmsoTl!Rd)B0}#vx?W)ah7K4TEPRf+a3a+;rsg@Q7jhTAnf3 z50p16S+9BOadB#Goj|xVervh6LS%9`Gx18=Im_7dtKPz$9@@9Yh@nSXRA(#P$dL@5 zTvhg06*BMjCSF;RyeWm?_oYOtSW@Mqn&uNj%!t#rLZZH9`mkYfSd5it*M1VbhZ~n! zRB=Jsm*$Ex(jcHilP#9>Gne4$zl`2tKQJ8RER^SyDE`#T*O6am8qODQsr$8J7qxpx z-q|w#veyW0$nZ&o@9Oi$Zm~QXZ2oN0^DXZ3fcQ!SLk-OS1)g}M0zOXxuagKiZp4*G zf|zi+jQmf;_^{oR(MS95=Q7w4qQ$edO_va!$Uc%@qamKNMh4w*$0qsu_-|v|IXGJ4 zJc_u((rluq=!8u3lV0933gDD%e#p4_DdCE%Z(wrn+eD@OW#VGU>2u8%x_xeNY;Q>~J^8?)`%nDtQ`-b>~^J$#On?!jzn z4O4*c2fT~LkdU{wDzt%6oPHwMujkGwGUzXXELdWSrNO`_K;DlJI5_(y}E*bh8YbuB*^z6 zI`W|?Q9#~0`&M76zYdcpq6CS)geJ-^=lAN+u5F-4l0GOMgX<~A>rF%UrQ3Q9JeO!) z@shv5hPEFnahKGZ)T2>8nj&8}Ur$^kxM2HknFW!!_tL6l;U@L<*3M30-n<}EnitRO zEi^(0O{hQPv+<*5l6zj`lMiSU5*o>W63X;cP4!mL#H&4FN6X;CC=}{&O|#CT>F&!T zf_;0lbaOZlMJl-(g-eFZk@n@&h}e=vo(i=P3Gp{{L6rnkPAUEhaIAOex2etbO$ zAXM3D);|Zddcy z%^BxIbH$L|SDx(D^XoRV`xSam2S~M%w9sZQrjBF!P1rffD69jQ_-!~ehm$Gt2^Dcw zW;6NJFa9d+9T?2d33vBDj-(;lu#qp+-8@8Yn=To#+-UJ?IP$A*?}@-Rs;$f!V_OkI z=5dR}Ma9ezlA|>HKY!5C>FmR8a-`+i##XYTYAfDSC)(Od5{PGi$16^prKfO`9yRNA z=oL&q7`07S=5bP3^8SFzbaiOX8fj)!CKHS>AgY8WStAiS;Me2|BrB(Q(()f8I*rmJ zK8?t7<$po()6mcU5eUp?;MU))4tPCGrIoEl@^PIYoo;UY#4Kv+iraT_I8vmAGbzeO zRwv^%&msfoGvUKqfglSR)d@+3ta6!Z>&p2`K*0=TThJ(J?IVw zv;@l>;d3;yLF0a?F&kV=n=nFyDh?6s2McSqXlfVpWA;2^Q}!?;ZHY`z)ML&D-s+G$ zlFVm^*b>cDaZ4#w7!>kFS>MB+P7T_{eXuzqUdrnjPjwi^;@VpO^K;y~|NMIUNwdMb zZbrxT_VA9ku`I?e&qI|Y9ldHh-Nm`GHC%R7^pCd87o;TN80ZW9{Iv4&u0}=xuI2>& z9_&RT=u%thynp-=LkEj?;{$9`scy+a`>OW{X5=X5-ElFm!^Y(K=H+5d6Ht28+uO?J zoWXzJ={fZcw7p>c)qI9XJ67)xo!t>e4+(X<2p`@vFW$4$2utc9)WAo2O{Tt>PEFdM zbbH)V9$#uWBr;eP#p(nfJmBKS|1^>&J7nUt)HbF$%bAzDY5o+?x5NqLp2@|(Qb7o= zBud^ZhME7Q+5}x6`kleI6jXG9Xco?%VnL5UQQBVafGCVDHO>KoIX`r=+QU^hFJ*sa zNwr9fZoZJfYS_rRal;Dx@f%H)I0tpR(&ph#?W%!UbP^V0)X;FQ1?_{!i; zKXH1mH2#N-gLC0+p(-ws#<@_AEw2zGIy&zD{zp8;qMsi;aZ-Bv{N8BLx<7cWf-qm{ zBai#-YEwKRCa}9DF$LIk$!6^F-Z*l=8Jkn#_MmY1R6D5BNJfsbhghZMow#}T?K75f$nUCO-RnCP_lGc6srYFs|5Q3ztA5a21)_JmR+%$32GXDf zvq|$?tIfJN1a$6>FzB{FU&1hKd_k}5i}um1;_lElb;e)#V6ITY(BP0 zb#5vaM`vQ&SzNWSa)4?7?x>8fSWcCH9_U+Tz2NgsTi@LkB7_$)P0ZZRlGA2I`<7%; z`H(WL99zD{L%(D~A>ect6B!)k%~MmJf5a#vE&AoAR>gF$+7UB=?P`ml`45DSjY*j# zl3dF=TVd79cM105jaRw;?l*I9y7gB_iPl`TqvF2>(C^^vPp{VF(++ay6UU6ER%3nE zM4M#HwDLDK<&<&(N4CrLpQp;@z zUz2{*gRl=5i6(qBzL0=p5W+DSZnuE63_*IbqqKw{H6uw$GI6KL-*+==X=}xPmYtl9 zDT$-+!X9GdH#* zw}wP*mEfmX z0T$CK-qQz#zfz}|I?g*oA2O`e6CKdJHaKG|hLb++Km^{2%WTnNcKNZD1bpue7G@VyP&8LT5r1CQK;7tnb@T4(Dj5!W2%Zg*a??||{)qL! z*&#vL-!ZgXf|AG!;W*~3xWD=C$iiTUpl|2OV~p+9kV`5$t#3Cd-CW|SVxi+(w9{sq z$}^r!3i7H&CkE}=jS9G^x^4w~O|A#sUH!?NQj{i;E3I114|AWXsow!N=kt4u*SM%} zrsd}22R_IUjxXEx;$gD8Tl-Dv%4%h8w%`XPpIWaU?GT~yx|;ywTG|bhIlmeBiw70k zyCfm$zY3~I`NTV$Z9RSa%601}l)S#$FK0oQWIPBrvnT@Z(t8$t{7T#{Gli;*TOT3v z&FMUB`)Y}2V6meSu7E1|9#1-0lAmSVw^8h-CB!c>4{HpgWOrP$-Wcc%LR$e5t5Ho< ze=yc9%Wde_pYk^+n-1lAovg<$qnP=ns0DcEQ+zdj_smyEGxMA=lEkh3j_w=+Y7Xxk z(hxen)-aUF(a|llOS!rb+p-hkJT@E`yxti8*hfEErz`urmzAzv{pCP*hc2kCIfye{rQM`sf&?Cj%}fSWycX8^^j zv$J#+x&QaS7WA4YJ}?5B+dyCwU3f}ApHz2umQ)Dg_Aze>V~#pwT#jY%W*aYMzuJ2} z4_F?4PquzW%bI3Ef%bJ>j+s-ddw&C-m>5N$6LQngLnd%SZ#36)|7^Rcozsn#Za>|Y zPg%0S=%!k4$`|=ZnqR}&`CGEz#_P!1? z=5J7P_eQauBF!Me^8u~$n?H#WgEZ_$`}i;cBtRLgJyaUf6@xQwJ%>UJiq$b37y>MM zaC$6^Eyn#=wW^&KK9%K%gNWt!sMLdbpo~I&3hvb4b^DGbIO7qyV??4Zc}A#0(J`<0 zqU>x*I)>&5y^bytH2|-zf_VO$F)*jRf!{Tm$%T@FsMB-!vk*y@yB-b^Fp#fLqw}tF zseQQuFq~q|!N2a(2DO>N{LXxlD9dsH1||w$jP&PA;eL2iv~eztSn^mt;mg(KFmc&H z{Z-VeqwQ)wWEzb>lffjT$dE5mDompyq>E%haBOs2SRmn3)`g3sm!#EH52;@C>&c7$ zWObfvFRjFEO`U}Z)`0oh3-dwbb+mIh0J&T^PT@Qv>ixk{!}jhAPbeUkX7&ef9GpB; zi|rob1E>aC#JD{d_P)S?mk^Z3cS5nA0W#0FG^C?hn+0WoKGeBkmSHbR`Uto7sySq34?}Ild{Z=1A&*t15LPcS`*Dd_G;57JXG+k(K_m9Uf8S_Ay>V_-a)qlw0 z4ZJ5p-gQb-V4(TSUDmtP>tW#s!r%uUJ?5c9ZQR_6-5D0iWj3!C#lDW=dz?pR{|IbbeE7@qI(XwWauRCYpl!O(}}7 z`w7nSeDdyrWm~L^JBo~)nIAhq1&T~4r<^cO=wI2|8t(T<)uu0ShJ*`ZVhSyYP%j$> z3+VG3!!po9&d&|kR+^GTQr_>0JSqN9Er4Urg!{f+#>gm`gTeXQq9O`clA=)EGa&nQ z>ThvbSa@4<0+|#>M6Zyqhp{*3!~6rj<&BD3mE&%})(A>107dR$*av+QcXRygbhJo^ zZEaU#x%HK*v~JX-@F$c|&Zmg6%|@9f!hc6%c8d8^&# zYyalw*LzY1+Q>NzDGuAX@hrNh9So4+&%YKzBtx(3Z?teY&dx7xXJ$`Nq@Wf5`%S~M zwL=VwZx;;Je(WC8MYS^!flH;D8(``eJjF|lUUJmC=v!K;2pLNERDZgR4L;l>U5%uB zfJVNZ)Rr^ikJU3+@XUGEEBD(}P#?kF`~E&xPOqe`^&J-Hm2e1Aob7N+aZAm7>EP!9 z--xO|zOGOf3x}E@MHZ=CMKB*tXf(Mljozoo*t|yd3W#otOjA?AmQhb2-1E7^^?e!o z{kG^Z4Ki>RY>G!{cy}d<&UL@Dp*{vkVZW<952zb}(&ltWP=vUvs|o*a%14KAtI^mv zlKe$UiPq(z9Q#J>ffK^v70Ar$ILmWI1Ejfyg!aeLHl*1>ews!`1YH9uKW8FEoq(3h zQ`nSoGK+cco?wbS>OM(*R99;H*|A{D*RqF)2Qf5(F}ZX~u>+r;%SY9caq?Yx#@kJ- z<{N$Ih?$2&2Kxc0;A&Y5O{1(A&J+ex3_T-SFx6YqA%t0Zl5cO$|5{|prnj%0b{=ysOn~cGfh2{$V92NIT~z(Xv7xigRvSWmG>n% zfwJ6KPrEO^c%%ak+o$~t%BW!WR3M5c#~4{o-`z5zrZ0#RlPWApqwP0Bi;k`aQq}_b zw{bUQR;7(aAf3;*qAuVH`SyARBTydVqJu&uR3u`VR!g7US!KWO{Kes7_bD99hUVU_ z(Ha8?hQ#LDfCDC zkkV>sD9eOUU*G+v+MTRG`Wj|)CXuA=>}(m#e^Nvi8~&b234ojWw=C)H6bRC24%!kN zF8%Y>;q@f=a527!h*h_?etvs4ZhH(mgnTs?45)NA<xN5iQ2RkoEM0hy%0l{{T)= z+h^lW?&=ieS_E`CpFi!v0f!Y?ZU3}*0yY0s@l0=walM|5KJZziGQ@`$gtN-4BWy%C zvc3aNi2@9RnOBR;%%F+O0eU&SB?rY zXl%e1jxj;4Ny0(8?bQUTlX}ZyxOLsp;42|G=fEd;9zQu;wr1_O_MM}5^@`( zl5*moJcF6pW^;;vaDD1gND+9urjs>n8d8*KZAS1WW=rVLf70Thn3}rlG~INDYe}K% zC1(Qt`VrW|t(E{A5`__S7Bg08wSp%xQW+Zm>pHoH@XOa)*zkdJa}Gr$^n5CIto4CD z0@`^q2xerT@spTkg$?_cwS1MJ1jU|9i=oIAA`oNwjsRTv%HY5@d7iUzn9=KrtQwOWg|n2G|2dV+dcA&4?%V(^;4$Y_6dS(B zqfG0;W>sr-pSEemcL@ECOghVnQj)vwpI!Jwvp^1Db-lcQ!ADn8hRovg!< zHa*S+)?P?vXUp@1L%gE>;W8M=^4_U<)-#=vU!mE~;7pAh;h`O@q_}+Smnh$y^b}El z?wa5pLF5t_I+iL%Knsqq{=P>jR>^d#%+1?rT|{te2zCDWb!lzWtiWzB={Z1gtN%3P z7=1eWD%^>VjdCgATV+2%#_G_pDqO@e%tgeoEYDbSGH+Jg!Req^OVoYLwCRTc06HKm zwDc3uTFNQzlm*GR{`bjIL!yZ^c_d9^b~@UIa0 z(D<>1H~~xD(@u-9AAzgGGiR*|Ycuf}s~SI0|Kza##znZ*SMzIWGq7>j{6XVAaxg`M zQU|PdR(c9~=GGUBEoooVodk{#XCM*jF6uytrdeqAQ{G!LY<}ZnmE+wAU&6G{kJDlD zzUYf%F(zy|>>B#7)eKcDT9q$6q#zGESn8|t;%MI<1bhhz-dgpBH0e`k?KW|VR`@Eo zgSFvbu^N5`X1nH+j2T$B?Uxg!mu{WGYSo&Lx`C}2e;Va22ealA=Wa(B?3fM^ULveLnvBi3LnNLR5sJO4Qe zNq_2rv!g*t@ad?Tu=t%RV&cOyv|;fP9GHtEEj-w>j}%+Mt8w`<25rU{`5?RlZ0=k0 z<160-(bt2ed+eCRh)8cGa-92;BvGqJ;s;wXbm-!}VYAVo4JV%GAB3;OHA1i> zWlfC(B(tfeht4#qH;ng++nx{>Qf&J0%pCr!_}4WwVJ{MTw_P^E?3T84$@<}d=oPiI zPfL-t+lfDydJu!txQ+FrfZ|=QckjlO3sBLY1V&Nx{13>AB~fBLxE>qs&J535XIQvN z+qN^dfGFQ5LxtLF+Me;h5?-BYB|m%G|1aSk$!g<(QtjkL{Fm-65QzMT_O_BQ^#9FR zQU7z`vhx+2gc-N$A@1fdGqyz9p_z`phgT>1(Beg*|E zj^@jtCTHRIL}AkK#UkbeXNjzoBck1w1rBd0R>ZxZ>A~Vyl)13PCiF6F7~k^MfwBlO zrv*QJ4Ldrtp(=L*!M6WA4I`)tew7#htqgv2ze>IXJrH^Mn@b_c=?ZnTfNeF)U$#R@`j0>hmfVx@W#l!bwV zxPZ=afFb8^2&?IDDhylp$K$h4N8{u)ovhP|Xw^MLXp8{- zN`aw`9`N8g3XI13+i>y?v^Xr1Jq&vEqWg`n@Rm@-7o8Hw2T*)L8!&>x?+*!)BWSR^ zIzL2WbrM$%_CEtV*(oR&UyD8x|B4+G1a*GJ=w!wQngWI*L^S-?<#p?q{RvT6PAHV_ zd)Y5~S;z7ZYMU-DQUBW^ zS&Fk}0C2mc%aD8TLqlnkzzY$f{`$tM12ywrK@qnUkZu6P@C-Ozlmmi=DN*}-dmEdY z7I{e7xEwY*oASPq_TFW`yKrzno6HUI|K9104}&Ha=n8011T{l6>3crHGk+I0n839s z?7#qMjJU|^c&RpklgX{%>a=ps!e2sq+udMwi7=zRoXo=o%;Qo!t?>-0hucMa``}2)#A9sIJq$ zCn(4#1pz#C=!6$1xe*QZq3M+iOmY!=(W*YL~LzW%c@;nH9D)-%tC zW<<3zUuVrBYGdSu8uSV!)Ben^iue^4o7JGKGdW6n)dlJh8LoH&!^Bt7J3s#mhNDjr z(qNjpYemyFqJeSOC)M+&zb~6|} ze6rfA?}qYX1X8c7+QyJOtx2ePXA*pe)|x!n8Bpdg2$5sCrD(M+($=bd-v;H)PxxIf zuVU8v^el)^I6g(j{eTrJoVM3|q7br}f{fDv+v@N=mFGq0#H4ViOZ88O`PR21L{Obs zDOE8+Bj|dZFo-?PwJ2wwzq*}n-8dyK1$$Z-0p5co(jOR^H;u*Zda{ALp?yI5vvb)! z+G>`(wloh?T}4!}F(4{%7kaq5kpGZPaQ0edS8}5h^`_lyHJ0#zGCkFi`r?~Bw@QlB z0A{n)vvbSR%9p#}y(3U;(|&45=Qb2G6T__OkSheUn7(FET~&P3f3dmFn|nR+61mZP zxxxvW?JT_Ejr=1OF0KC7x+m#3_m=;3reR~}Mi8G$U)Ex;(I#0~Hb8pONuFZ(1iZ-< zi*vtU(?q@|R_pFcS)*dT|L zsg%f)vj~M299TCf31n4gYYuo!kwWq{lZgrC`4U~isG@3ys4jn{2vfxE`Ms6gkYQma z)4!VHJ4-ZlZMz-w^yisfoGZG~`R7y^qG<*yqECEZk@x*|L6j?5(=YE^Xj(I|!RB99 z4Y*Qa4P_b**B;+G)cVMN#q<5>CCw0({wR3so2$vKr-y*?ZNh_~EDqhXCo;tA_tVihwcXsRA9bQ*)Faq=%%;LvHX2?x0r^64uJAdV3N9JD#@tjUBZyu!g zHKt0(dTOr^z~l6ERQSwB2HR#)4B(E-?cZQ!`_&r6BNN`il*=KPHa!8uVNP}ThmPgj zm1aNj!n(I>RRecPEM??O&L_3PK>>BTcDJWBd)&9C#7Bdk%b<3>Q}~?c?l?!~4u0p? z%ihVJJ^zQH)T`tUt^4WR(v`({{=LdYNTK^QK{VdVev2lUB?Qcw{(LpB{Qjji^}0@L zwcGTgRg~LQa`>y4tH_ljWTchau+zh&zO()d85X8H73GOYnp`9;V+LP#D3?tEhP7qLtU}_ z*}~)PSAUe-sle^#+aB$+RX4>MijkZn`NQE*UW6`B{qp5e1IKBB>Pt}jo~Q{D3F5@} zy!G+#@J-Dl;HE;gT-p0wchJPvu0Gs{2U5^dU5v#V_0Clcc?bv=#hlG4Yc~uyR zeMJzxeX`V`N~K!jCx!j=AP)B9$|4E_jITp*mQ2=RW@f_XTx6kfwkn&>d*n|TjXQLV zy7K#=kkHTZxbx!OS^xYm!oaTc`GO8MtI=>*0j7tr;|cas+ma!$jP=~_gCFkOqh?n7 z^{ZZOuOX`IswSM=MziA|dFoHYPd}^9|9pS5vba<7c6Sm<{L*ZUjXBNVJr?eg#Q#*v9i$o*g`+K37@lojFxp;ew9>ujD^ZGJZ~Jc$pHzF|llGtr zF`bZd*CF6CIqm@-rg=W=ft((N+I)Ae7_pHpOM}V96$*$vBF7O33&iqB&ok(6Y##nZ z{d9Tv^?EY7kU^(P1pBLI)3#Xso7Iz{Yne?bROGCJ3;5NZ|Lskr?b#uTFubYRzLsAO z;2~w#2)>ySMby}2@9Z<+?g+B@{n-611ooD3h(U%L8p~?B+eYZ}wa_RwEAYfK?b57*=n&+0g0DdjL0&KM$orvx&)eUx*B?*(k+qm_Oi>;{Pu%^3 za~c0axqm$5yz1StOZeA(aiLXJLS?`WYfMk2WTr1j6l+|!o&btOf}~y?i_o7?I{~g} zU5mqhiHaJ+d{k-q%U>d1OeztUSVgUz*N?o(y+Q7zTZ<8Fgguv|dz1|Y)-FZ?`YR?& zlHgG;=5MH4(u~#zxSNy72azeVqw<@DXf(MPp2JpN9qkWrt~T>ax~C8uN7q zH|m2a4iWAtelFWMxzhucr8u>R0u|r|!$7i6i6DP|>4>1iQBX-s)JC0b<~q9|O@`0uf5$KWrWb|E?f>u?#dFt>7}N0DLITgrNx8AS zYmM+pnij?6)5EhA#m&`4rBA>nr(QAr{ewqi3xBHZXkL@i$z1DC5<>ZgL;Ac%mDqIs zon874huz>Cw=y|!yt;;t68Xl}Dc_*Y&i*bDrY8TFj}KALtq9>#S!v{g8~CK!PhKsg zAQ$eJ`qdEMwiTXQ>ro$^4Q*wlKi9R?f~dq%@3q+Mw~S`ti9i-<^ngHxe@beiw!_2H z3CobWJelsF(~Fs(-EkxHcIsZpWYoOZ-LJBc#NX5%6XEY8r1bxFK9CB*l2kfE2~k#H zI;TO%S-iA-6v7~)dz7w~Yd^O=M#l?>bWHG&Tc*TnhGbHUaiWL)5&}^lcc1kA1v}Ip zi-5J+Dp9Or9%~N^-NROxQlWyW=R`hV$vS21qqUOw$Mn8G)%!L3e^W*il=6#5*Hvd} zXMGZqTUNLW3@KG{oTI+vH0B*ImCXQA0|xt9(PObvK2s`0s!r>WviQaLw+*JXL*BU8Q`tYMF@ zqSs15>VyN&AW-px=#7Wt%p0tt>8lk`QNCE@be=le7S*dW$n`%q;ULw8?(?Zep}Wc9cLee9Gj;_Z{i9Aqk74qH50dnRsNxvN&x5dE@(pZBH}! zpQREdh!~a4Mx1GGRsT?ena@IYN;n$I_3(i8K#;bZk(Q$4d?Kud;UMy+Jk)>y)`H0A zxiyzZG>g}X`^C>|R=z^NE!BfLj7Wk$=4gBWgx0-1)oI!bu1+fRm8fS{m;S{b>#y_B z7-Uw_Hgzs7F-CoKp2k*Oxg? zagfADkn{UYMPWo4GE~o(oLpmrSU=h_$YH#$<3#e&`G&J^;a(K(uEDH=Mt zi@Ud`+DQfU0d1Mo8Kyi*gW)KZz>A^v#6_7^skZfIQDv-stO|Hfm_AW8`QY@?nbq3s zY$!tYrqbZtUXp+r#kjO2!%Xd()U-N}z8{nE(=5&)AHVF5`Ldaix$$W$*T;;NpIBp7 zy1bAK4W|`qrGG$9i=2-IIR*ZQG{T238Jvnl+iq8)?SZYIZRE>vK0@;DTLbrMOMJbRrqK3Aww=9uA0tFyqCz;i$d?CYP2RWj z`1|yA{*`+4vA|rpuXe1+b?uJz?qv{-c{Bx+Z3x*YvhHsfAweYZhx;cHw@}W;A7|dG z|5FR_bl%2ene_ZEONP5~U*daqhr+jC+#^fw(cHEBgNYGT5M;CXhrw54ce^#;&C;Lq zNhJ}i%%u;6Ja_i%-U+|6u4_$AcFSL!)m1z!fN#3^IBuzCHyiKs-bIrV!>1CC(=2ZH zVoRXA};PxvIUA(k{@r(|q zH$$^?fAe5I)ixRuU_nL_2cmb+_3<RE?M)xAlvD3y)ZEmF7;_4BS(62IfZ?={+CC9+M#{ zMnv3Ox$)`!^2qeZ8}Xi}1`C{&l#FU#!x8TnZ`UI{N!0tsJ2?H8Om@4&c~ZDLOAH(c zZ8?#v6E=?%YRJphdnOWMf6s2h#U_}x7FQ!R7mJm_vp`~B>#S!H)O$GLN4-WTwIueHB$;$!HM? zsaUCu>M?VTL>w8SS*bP_ke$xVT}ntu!i^Lo=rXL)pl2?8KQLYok8CyD8WvNyoU-|T zOuzl2Yu}mQ6Hv-p@x054$E`ofx;-dTBbJRMR~|L@Srj#K1{R3m_dS)-RVN&8Eq43* zZ&|!Phx3H$q#%;tOFoag_YK?Icz9r$WkmSPH_Oqfn-Y$4{k8)`EiVz3^f%e`1$zZB zcYEDVnO@Zk?2TrF)ppvO_B0hwX7d9M0lItR7yTo3d$j~A?p_i92BXQeFGq)Q+UHAgJUq6~rkiuR zaBqv=E(aAyiPW;&P~h0W$H+Ga2c)a-))H2uNtwXgwR>&biIn_;(T^fzs^nn7P(D3Q zIPb|=XSaPjS{I(iqO<=x<Kb9!Dl{l;`|Zj!;}L79k4C_0=nt;YfI$HmOz+zsD0Ku@aIO1P4jJCgppq-M2;o(GHdhu^NF}Pd~huvV< z$gI}$l8^eb&)JsQ>*Y5iYR|9xTe}_WZD6!%{;fO0{hQOduy0}JV%SCPU(n1LvGraw zX@;=56PAl&Z7xlOl%^fnJm>-0M>mvT4KYz5o>g@~E!LmKnn}oF>1T1>N2*SQ!Lh-` z=VdTqB=#3HG{g805&u=sc3u3$Km_QR-W<+Oj{0tKFO$dLi~-rFd3=T4^X^d^7=VK% z%2PTU;&D&qZ@#kwPtr8kl-f!_HBXuP7P=?zO&-AhC}%| z9AK^0qOWHUX~hB5-YZPaQsPW5!Etey%*-qRA^v;!JIS}rvyK|~wN_7t?a%hiN9);j zz?}|m9%;z5Uj)EZ3}~tX zI^44-8L_cUfL1S{&#P7L4zS|CJl$0oE8K*y0zCpKCP2tSf`gZMeG8(T?}Nk}H<3He zZ!;DEnsuvmFbtq~PC-tt_4*l5T24z(=K+LEabAB|-*T(-1qm^EUYcNGVI38i%@ipz z9C$yH0sjx+gf(80Nl&KmIw=7*zp~4PgoObz>2#o1x<^-Nk}@;#(b2aK55rMEp`b7T zB&IYaxA=De@i#KS9Um4}WfK+=feSGH1LVkuPG|SwyE{7)`ATqbA<40g`B6Qh*g_IF zHT)BF7J&RU!?sRmnh42PJ}(zQY2C}Kx$R1cW?c1VEQ>D!6^GLy+f>@Z;_puwghNH; zKvZgggc=Y6aCi6r8rJcu3T&_$ya#lk=c0o0)hm?-4D$KqN5qrLmw^6>!C|9jW2^Ij zdj+)ERa>mUY1O6;T5g?Q9v(L9?Joc`x>uVYpa-2qUcn6r!*XYid5r*OD3k}=c{-Z` zn#H!|^HW_TE>(bj^%V2H(m_3hyGzS0kVTjaa1?n72?OK|PRHLuIR=-EfO+%s@)i~} zq^)LOqW{FFr9I9RnSLfw$LzRC=h2B)A0} z2V>BukCmW(Xt15FAwVzNMKy6%jiIUqXuSb4^k^Km;kYGS)f)ioW&f3#Y1Zg zfO;7l9bHKn&IaIC2AJ`S6mtP}duL~7Ky_HZN4vhKrziDn?-2G!YJuly8e5VMQyJ{^ zfOV5zLE!wO7lmvZDNk~98k`c@((EBoRxmGU3}DVdp?jbJY~1S}~nD{E>Oi>onQq!z0D=AS zVojk4$>gCt6PAT++;m@-~t%7Osmdl>2sJ!wa>$4V`HOMR(^0oDn6id zo?3;795M|MMdNTAoUJs~_&<6iiHZx`Pnt?u6z0Tp%PMG2lFZopKlR;INFHfm7f0 z7PD__5_`f|>7@pHaQ;P^%S@H=05dal$_HS4jQI3!I;{ELt>SXn0m9>@?D-~K3M8@D z!1Gz1N!vS(Mn@Az3WF&NShx+A#iulpD43ocY-|eFJ%9T&oIF!;0DUN@ zu0FJ6I^|A=f`!$$GzmBrFbS(cy7}E*?7&N3%2j|_-jV4xb0t%C#7yLbH~Bc9tignl5Ac3Q(IlUQYxNHnPoH&QWy55_lT z)kfE;-p?dMt7$p=J-xkPco`pLkt+998qpHS)AuCw8*$7vFF{{`NoQ=F|LJ($nhlJa zt7)+`hI~t&&n0N6TDdl#1M8P*1&m%WNr99Kg<)fS{1{^DgfBN3^DJI8R8)G$7}V6< zFyg#_ffRrTw*LI_fdJZiK}}7~oQI-quZ!Jrcz@mPp+qo3fXdtOF2CrwVDHr9S`Pc$rJZQuThsJLPYJf-^r=9e(XI{CfX- zZh|RKT+LE6;XVP7$j_YR4vYCuTc>kw9#o}m%1~GFN+f1j=PES98od3fS zMJ>t$qx#ESAX_!VHMx{T;D?O4CMTs;9 zpC3o5iQy4aF<38OsDTQANA6BFwJj*Ou&ET*DovU+jeK+Uq%W*0laA_ArsU;@dOEigz* zxO7)0#T8>ofYH;{EhPN`S*W%6$WKm5S$GwH+w3o$9929uk#RTqf9v}-LaDR-*bJ

    H*}mR>omBbwc5ri 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 AUH||9 literal 0 HcmV?d00001 diff --git a/docs/_static/images/logo.drawio b/docs/_static/images/logo.drawio new file mode 100644 index 000000000..8da09ac9c --- /dev/null +++ b/docs/_static/images/logo.drawio @@ -0,0 +1 @@ +zVbbctowEP0aHsP4xu0xMZc0k3bSSdqEvKlY2KKy15UFGL6+kr3GFoYmnaGdwAx4z14s7Tlau+P6cT4TJI0+Q0B5x7GCvOOOO47jDBz1q4EdAh4CoWBBCdk18Mj2FEEL0TULaGYESgAuWWqCC0gSupAGRoSArRm2BG7eNSUhbQGPC8Lb6DMLZFSiw55V47eUhVF1Z9tCT0yqYASyiASwbUDupOP6AkCWV3HuU657V/WlzJue8R4WJmgi35MwWt1++QrRXX+feQGbk/nKnV0NRrg4uat2TAPVADRByAhCSAif1OiNgHUSUF3WUlYdcw+QKtBW4IpKuUM2yVqCgiIZc/TSnMkXnd7toTVveMY5Vi6MXWUkUuxemsa8rqDNOq2w6rzgWutAmQkktESmjHP0LyGRuFC7sn3gIIpuuN5YfxXebjcyoPvVALD5MwoxVetQAYJyItnGFBRBXYaHOExViyW7RkAKLJFZo/KDBlQAnrAByqs6X7ahAnVRFnxXsj2yzNVlsBYLiklG1cYOa6hQ3Gn1PT/d7Gfh/vUb+3Q3vk/ms3D1ejUs77YhfI3daalxGzFJH1Oy0PZWjRhTSSRLy1O/ZLlWZEHflMSM6y3dUr6hki2IybPjtXm2rH7f9xW+oUJn8GvOwkT5YhYEheozKeAnrVJQS0slpEYV35/0ptODWnQtmp89r2f0UiX0tbgNeqqhuK0nkYc9jBpDqMJOacyg8G/5clt83V23GFM7liZJb3YOIYItX6gOUfEnLk6pwpxKnPyg/AEyJhmcrHl/FHCoXQgFt2NfhMcjFpX8jlm0nW6l/SaRjvWPiPRaRE46Tp9r3rKUJAah/V9r/Ygq+nKFsGLdSkDEhNd+dRXq/6eqklpZWazEP6hQmnS7l6B7OOoOhm8z7v1fxnstxr9/YELOTvBTE9s8sO1JfwlSB27XbX68I4Lbg9nRR7r5uQjZyqzfGMvHcP3a7U5+Aw== \ No newline at end of file diff --git a/docs/_static/images/logo.ico b/docs/_static/images/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..2ebbc2723a6e75446c8cf8f3197c60c2c8d0b5e6 GIT binary patch literal 1150 zcmd^<%S%*o6vux->u?o<8*>r;2W@oWu6>(Y1O`#!D+Y9uQAr{5QEFj9hC~iyX3;~& z2VsIZO+IGkMrrn#9L>2iI;1WJHD5EI&b`ys<$$}0%lCKA_nh7kH{EQ`dFALKb`~bgT&tf) zc-UM;%XJ%#j#8Sc%BZnjW^Ka7r;1D#?w#SwXfIbUou~If1HY!<(tg8E?BlTc9!cFt zJm{gl-p=bsEnK;97T5iotn^)D+MdO1%}MmpPKqy{<8fOp^OJ6xtIG)c2lwmPo*&2E z)rPJOQD0e1(DRJB+j&Hv6!N1rpU86?ovpQWG&ykIt)sG}fPUv45|Z1RokTdL@9BQl z{Vrx4C)m__h`p*Hcq^BkkcZ!)_a?R^pH;uLe_u*3qCG`?YdB4Eaojv(#*xFi&nbP8 y9;BJqq&`LLWjSlZjZ&XR;-{DB(<0*D4wI+bf8hT+3u*El#Q&T3$odZ)R{jB)UVl9R literal 0 HcmV?d00001 diff --git a/docs/_static/images/logo.png b/docs/_static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fca42ab030c643786c73ede4ad278137b9902450 GIT binary patch literal 1289 zcmV+k1@`)hP)Px#1ZP1_K>z@;j|==^1poj6j8IHeMa<>@!{7ZoirWBY%vGD=%jExQsOChF-Nxen zbgtg_Z4%|25Qcj#qyxa^a^dy9(mNX*7?Ta{X&o2UZCSo zm*C0c{(ZFTD1X+w+WP`%&62_KU!mlHw(Kf_*S_5Qn#S|4)A$#3(rv2e5OC0@&i1p_ z`5SlBOO)S>yze!K*}>lY4Q|h(%k{0o*d{7300028$KEV4H(F(J$Kd&+x6Bk488$sc zUu$=0b%KMFq*Y&PWpRGP+w@IVV1107%HsTCZFzc$n5w?iAtfm;G&){sb-vc_JVQ&R zxz4P?*CZ${z}WCZOH_`ZvBux{SYvK+e~ruJ{xdm1x6b9EwaK%|;EJ2AxXD0|rS%K~!i%?UrX-6fqQq150m8 z?@c;NCv*WpK(Nr8h=70%up**h|Kle2p3E#|WS*VYUI871OEW@3XRAht$*2;VKtktoi;x>^R#gqHKth={(7~v! zyWoa|($k=Wk(5Yo;Ta*JddQ$$$Os8FG(rdE<}LEe$%Zxw734z)rMQXwLJ80&p%Td8 zWU!&Rr%0%-mSq$;mk|r=;)N49X#ynmQwcg(%57~CyNt8^XuzZtH8i*42VIxex9%bLwZ$r7mKir zkPsRvtpdY$Fd(ifFfvNZ?vfCxDdeipE)wF#F*Z)Cn2A9Qh^q?Ro0L=cr5qh06(2{g zp=6T~w(Nt4%9lnCs>AaLHt2{LLEbzErPOXV2YHO_1h4@194V7?0Xr#+e)vev2p@Y8y z%S*IH*QVs=7GKHABjN;? z;3!mc`Wn+n-@KJ_kB2TE1>Q-yxFE#)4-`%KUw1ZoCG6css`h~V$U_&80?P96)6wT+ zDR;I-Zx5GK=>LMF;AUhRsku{U@F?)*D}JwzTsKlAukXgmDGkjVyZaWYPP@za7*Bc> z5Z?}Y-LXnsoiEx;8ucs9QNXj_c_ZBz=C3f{dD63h`0?|XJpBFVNQi^|u+4FL;v5A$ zi=8*H)fISaoR;KSz+$mjEEbE!VzF2(|3-+vRx_p>bCjCm00000NkvXXu0mjfl7xH} literal 0 HcmV?d00001 diff --git a/docs/_static/images/memory_layout_of_v8_function.png b/docs/_static/images/memory_layout_of_v8_function.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a460537430c01a45f8e0f769094db7177b2bbe GIT binary patch literal 75895 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/v8_promise_lifecycle.png b/docs/_static/images/v8_promise_lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..919cd326080ba9039524953d75741a77f3130e24 GIT binary patch literal 40832 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 literal 0 HcmV?d00001 diff --git a/docs/_static/jquery-3.5.1.js b/docs/_static/jquery-3.5.1.js new file mode 100644 index 000000000..50937333b --- /dev/null +++ b/docs/_static/jquery-3.5.1.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/build.rst b/docs/development/build.rst index 5d47f1c0d..743b30f33 100644 --- a/docs/development/build.rst +++ b/docs/development/build.rst @@ -10,8 +10,9 @@ It's quite hard for developers to build Javet successfully for various reasons. Here are 3 ways of building Javet. -1. `Build Javet with Docker `_ (Linux and Windows) -2. `Build Javet with Pre-built Binaries `_ (Linux, Mac OS and Windows) -3. `Build Javet from Scratch `_ (Linux, Mac OS and Windows) +.. toctree:: + :maxdepth: 1 -[`Home <../../README.rst>`_] [`Development `_] + build_javet_with_docker + build_javet_with_pre_built_binaries + build_javet_from_scratch diff --git a/docs/development/build_javet_from_scratch.html b/docs/development/build_javet_from_scratch.html new file mode 100644 index 000000000..ea2b10024 --- /dev/null +++ b/docs/development/build_javet_from_scratch.html @@ -0,0 +1,512 @@ + + + + + + + + Build Javet from Scratch - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Build Javet from Scratch¶

    +
    +

    Build Environment¶

    +
    +

    Linux Environment¶

    +
      +
    • Ubuntu 20.04

    • +
    • CMake 3.10+

    • +
    • JDK 8

    • +
    • Gradle 7.0+

    • +
    +
    +
    +

    MacOS Environment¶

    +
      +
    • MacOS Catalina+

    • +
    • Latest Brew

    • +
    • Xcode 11.4.1+

    • +
    • Cmake 3.16+

    • +
    • JDK 8

    • +
    • Gradle 7.0+

    • +
    +
    +
    +

    Windows Environment¶

    +
      +
    • Latest Windows 10

    • +
    • Visual Studio 2019 Community

    • +
    • CMake 3.16+ (comes with Visual Studio)

    • +
    • Latest Windows 10 SDK with WinDbg

    • +
    • JDK 8

    • +
    • Gradle 7.0+

    • +
    +
    +
    +
    +

    Build V8¶

    +

    Please follow the official guide to build V8. If you face any issues, you may contact @sjtucaocao.

    +
    +

    Prepare V8¶

    +
      +
    • Clone the source code.

    • +
    • Checkout a proper version.

    • +
    +

    Also, please make sure args.gn file looks like the following.

    +
    is_debug = false
    +target_cpu = "x64"
    +v8_monolithic = true
    +v8_use_external_startup_data = false
    +is_component_build = false
    +v8_enable_i18n_support= false
    +v8_enable_pointer_compression = false
    +v8_static_library = true
    +symbol_level = 0
    +use_custom_libcxx = false
    +
    +
    +
    +
    +

    Build V8 on Linux and Mac OS¶

    +
    export PATH=path_to_depot_tools:$PATH
    +cd root_path_to_v8
    +ninja -C out.gn/x64.release v8_monolith
    +
    +
    +

    âš ï¸ In V8 v9.3, the following file needs to be patched.

    +
    +

    ./include/cppgc/allocation.h¶

    +
    #include <cstdint>
    +#include <utility> // This line needs to be added.
    +#include <new>
    +
    +
    +
    +
    +
    +

    Build V8 on Windows¶

    +

    âš ï¸ The patch script requires Python 3.

    +
    set PATH=path_to_depot_tools;%PATH%
    +set DEPOT_TOOLS_WIN_TOOLCHAIN=0
    +cd root_path_to_v8
    +ninja -C out.gn/x64.release v8_monolith
    +python root_path_to_javet\scripts\python\patch_v8_build.py -p .\
    +ninja -C out.gn/x64.release v8_monolith
    +gn gen --ide=vs out.gn\x64.solution
    +
    +
    +

    Why Patching?

    +

    A few ninja files set certain warnings as errors so that MSVC stops compilation. The patch is to turn off those errors.

    +
    +
    +
    +

    Build Node.js¶

    +

    Please follow Building Node.js to build the static and LTS version of Node.js libraries.

    +
    +

    Prepare Node.js¶

    +
      +
    • Clone the source code.

    • +
    • Checkout a proper version.

    • +
    +
    +
    +

    Build Node.js on Linux¶

    +

    âš ï¸ The patch script requires Python 3.

    +
    cd root_path_to_node_js
    +python3 root_path_to_javet/scripts/python/patch_node_build.py -p ./
    +./configure --enable-static --without-intl
    +python3 root_path_to_javet/scripts/python/patch_node_build.py -p ./
    +make -j4
    +
    +
    +

    Why Patching?

    +
      +
    • First patch: All static node libraries are <thin> libraries. The patch is to disable <thin>.

    • +
    • Second patch: Many static node libraries are not compiled to position independent code and link phase is broken with the following error. The patch is to set -fPIC to those make files.

      +
      +

      /usr/bin/ld: /....../out/Release/libnode.a(node_binding.o): +relocation R_X86_64_TPOFF32 against _ZN4nodeL23thread_local_modpendingE +can not be used when making a shared object; +recompile with -fPIC

      +
      +
    • +
    +
    +
    +

    Build Node.js on Mac OS¶

    +
    ./configure --enable-static --without-intl
    +make -j4
    +
    +
    +
    +
    +

    Build Node.js on Windows¶

    +
    vcbuild.bat static without-intl
    +
    +
    +
    +
    +
    +

    Build Javet¶

    +

    Once Node.js and V8 are ready, please proceed with Build Javet with Pre-built Binaries.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/build_javet_from_scratch.rst b/docs/development/build_javet_from_scratch.rst index 1abb81194..786b9b0ff 100644 --- a/docs/development/build_javet_from_scratch.rst +++ b/docs/development/build_javet_from_scratch.rst @@ -150,6 +150,4 @@ Build Node.js on Windows Build Javet =========== -Once Node.js and V8 are ready, please proceed with `Build Javet with Pre-built Binaries `_. - -[`Home <../../README.rst>`_] [`Development `_] +Once Node.js and V8 are ready, please proceed with :doc:`build_javet_with_pre_built_binaries`. diff --git a/docs/development/build_javet_with_docker.html b/docs/development/build_javet_with_docker.html new file mode 100644 index 000000000..25be3a81a --- /dev/null +++ b/docs/development/build_javet_with_docker.html @@ -0,0 +1,420 @@ + + + + + + + + Build Javet with Docker - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Build Javet with Docker¶

    +

    The Docker build supports building Javet for Linux and Windows. As Docker supports Linux and Windows with WSL2, Javet for Linux can also be built on Windows.

    +

    Regarding Docker build for Mac OS, contributors are welcome if you are interested. Or, you will have to wait for a long while.

    +
    +

    Build Environment¶

    +
    +

    Linux Environment¶

    +
      +
    • Ubuntu 20.04

    • +
    • Git

    • +
    • Docker

    • +
    +
    +
    +

    Windows Environment¶

    +
      +
    • Latest Windows 10

    • +
    • WSL2 + Ubuntu 20.04

    • +
    • Git

    • +
    • Docker

    • +
    +
    +
    +

    Docker Hub and Github¶

    +

    Please make sure the network connection to the Docker Hub and Github is up and running. The Docker repository of the Javet images are available at https://hub.docker.com/repository/docker/sjtucaocao.

    +
    +
    +
    +

    Build Javet for Linux on Linux or Windows¶

    +
      +
    1. Clone Javet.

    2. +
    3. Navigate to the root directory of the Javet repository.

    4. +
    5. Execute docker build -f docker/linux-x86_64/build.Dockerfile . (Be careful, please include the last .).

      +
        +
      • Docker will pull the corresponding image (~10GB) from Docker Hub.

      • +
      • The actual build takes few minutes including pulling dependent libraries from Maven Central, building and testing.

      • +
      +
    6. +
    +
    +
    +

    Build Javet for Windows on Windows¶

    +
      +
    1. Update daemon.json

    2. +
    +
    "storage-opts": [
    +  "dm.basesize=120GB",
    +  "size=120GB"
    +]
    +
    +
    +
      +
    1. Restart WSL2

    2. +
    3. Restart docker

    4. +
    5. Clone Javet.

    6. +
    7. Navigate to the root directory of the Javet repository.

    8. +
    9. Execute docker build -t sjtucaocao/javet-windows:x.x.x -m 4G -f docker/windows-x86_64/base.Dockerfile . (Be careful, please include the last .).

    10. +
    11. Execute docker build -f docker/windows-x86_64/build.Dockerfile . (Be careful, please include the last .).

    12. +
    +

    Note:

    +
      +
    • The base image is so large (60+GB) that it's not efficient to push the base image to docker hub. Of course, without the base image at docker hub, it's not wise to enable the github workflow for Windows build.

    • +
    • Building the base image takes many hours and may experience intermittent errors.

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/build_javet_with_docker.rst b/docs/development/build_javet_with_docker.rst index 138030a6a..71c78fdce 100644 --- a/docs/development/build_javet_with_docker.rst +++ b/docs/development/build_javet_with_docker.rst @@ -62,5 +62,3 @@ Note: * The base image is so large (60+GB) that it's not efficient to push the base image to docker hub. Of course, without the base image at docker hub, it's not wise to enable the github workflow for Windows build. * Building the base image takes many hours and may experience intermittent errors. - -[`Home <../../README.rst>`_] [`Development `_] diff --git a/docs/development/build_javet_with_pre_built_binaries.html b/docs/development/build_javet_with_pre_built_binaries.html new file mode 100644 index 000000000..35ae073b6 --- /dev/null +++ b/docs/development/build_javet_with_pre_built_binaries.html @@ -0,0 +1,473 @@ + + + + + + + + Build Javet with Pre-built Binaries - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Build Javet with Pre-built Binaries¶

    +
    +

    Build Environment¶

    +
    +

    Linux Environment¶

    +
      +
    • Ubuntu 20.04

    • +
    • CMake 3.10+

    • +
    • JDK 8

    • +
    • Gradle 7.0+

    • +
    +
    +
    +

    MacOS Environment¶

    +
      +
    • MacOS Catalina+

    • +
    • Latest Brew

    • +
    • Xcode 11.4.1+

    • +
    • Cmake 3.16+

    • +
    • JDK 8

    • +
    • Gradle 7.0+

    • +
    +
    +
    +

    Windows Environment¶

    +
      +
    • Latest Windows 10

    • +
    • Visual Studio 2019 Community

    • +
    • CMake 3.16+ (comes with Visual Studio)

    • +
    • Latest Windows 10 SDK with WinDbg

    • +
    • JDK 8

    • +
    • Gradle 7.0+

    • +
    +
    +
    +
    +

    Download Pre-built Node.js and V8¶

    +

    âš ï¸ As the docker builds are available, I have stopped publishing pre-built binaries. If you really need them, please contact the maintainer wisely. Legacy pre-built binaries are at this drive.

    +
    +
    +

    Build Javet JNI Library¶

    +

    Once Node.js and V8 are ready, please navigate to ./cpp, make sure CMake is accessible and execute corresponding build script.

    +
    +++++ + + + + + + + + + + + + + + + + + + + + +

    OS

    Node.js

    V8

    Linux

    sh build-linux.sh -DNODE_DIR=/absolute_path_to_node_js_build

    build-linux.sh -DV8_DIR=\absolute_path_to_v8_build

    Mac OS

    sh build-macos.sh -DNODE_DIR=/absolute_path_to_node_js_build

    build-macos.sh -DV8_DIR=\absolute_path_to_v8_build

    Windows

    sh build-windows.cmd -DNODE_DIR=/absolute_path_to_node_js_build

    build-windows.cmd -DV8_DIR=\absolute_path_to_v8_build

    +

    After a while, the following libraries will be placed in folder src/main/resources.

    +
    +++++ + + + + + + + + + + + + + + + + + + + + +

    OS

    Node.js

    V8

    Linux

    libjavet-node-linux-x86_64.v.*.*.*.so

    libjavet-v8-linux-x86_64.v.*.*.*.so

    Mac OS

    libjavet-node-macos-x86_64.v.*.*.*.dylib

    libjavet-v8-macos-x86_64.v.*.*.*.dylib

    Windows

    libjavet-node-windows-x86_64.v.*.*.*.dll

    libjavet-v8-windows-x86_64.v.*.*.*.dll

    +
    +
    +

    Build Javet Jar¶

    +

    Once all these libraries are built, please put them altogether under src/main/resources then kick off gradle build test.

    +

    After a while, javet-*.*.*.jar will be placed in folder build/libs.

    +
    +

    Upload Javet to Maven Central (Optional)¶

    +

    Package Jar files in Maven.

    +
    # mvn package
    +mvn clean
    +mvn release:prepare
    +mvn release:perform
    +
    +
    +

    Jar files are built under ./target.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/build_javet_with_pre_built_binaries.rst b/docs/development/build_javet_with_pre_built_binaries.rst index 666273943..6ca9c1db0 100644 --- a/docs/development/build_javet_with_pre_built_binaries.rst +++ b/docs/development/build_javet_with_pre_built_binaries.rst @@ -36,9 +36,7 @@ Windows Environment Download Pre-built Node.js and V8 ================================= -I have prepared pre-built Linux and Windows version of Node.js ``v14.17.6`` and V8 ``v9.3.345.16``. Please download the zipped headers and binaries from this `drive `_ and unzip them to local folders respectively. - -Note: As the docker builds are available, I'll stop publishing pre-built binaries. If you really need them, please contact the maintainer wisely. +âš ï¸ As the docker builds are available, I have stopped publishing pre-built binaries. If you really need them, please contact the maintainer wisely. Legacy pre-built binaries are at this `drive `_. Build Javet JNI Library ======================= @@ -83,5 +81,3 @@ Package Jar files in Maven. mvn release:perform Jar files are built under ``./target``. - -[`Home <../../README.rst>`_] [`Development `_] diff --git a/docs/development/debug_with_chrome_developer_tools.html b/docs/development/debug_with_chrome_developer_tools.html new file mode 100644 index 000000000..c9df8411a --- /dev/null +++ b/docs/development/debug_with_chrome_developer_tools.html @@ -0,0 +1,434 @@ + + + + + + + + Debug with Chrome Developer Tools - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Debug with Chrome Developer Tools¶

    +

    Chrome DevTools (aka. CDT) is a set of web developer tools built directly into the Google Chrome browser. DevTools can help you edit pages on-the-fly and diagnose problems quickly, which ultimately helps you build better websites, faster.

    +
    +

    CDT Shell¶

    +

    Javet ships a demo CDT Shell application to demonstrate how to work with CDT to perform a live debugging.

    +
    +

    1. Run CDT Shell¶

    +

    Run CDT Shell as a normal Java console application and an interactive console will appear working just like a node console does.

    +
    +
    +

    2. Run Script in CDT Shell¶

    +

    Run arbitrary code in the console just like what can be done in a node console.

    +
    > let a = 3
    +undefined
    +> let b = 4
    +undefined
    +> a + b
    +7
    +
    +
    +
    +
    +

    3. Open CDT¶

    +

    Open chrome://inspect/ in Chrome, wait few seconds and Javet will appear as a remote target.

    +Remote Target Javet +
    +
    +

    4. Debug as Usual¶

    +

    Click inspect. Voilà, DevTools is up. As the screenshot shows, live evaluation and auto-completion work successfully. Enjoy the live debugging.

    +Remote Target Javet +
    +
    +
    +

    Chrome Developer Tools Internals¶

    +
    +

    Handshake¶

    + +
    Chrome: {"id":1,"method":"Runtime.enable","params":{}}
    +Javet Notification: {"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"origin":"","name":"Javet Inspector 00000000","uniqueId":"00000000.00000000"}}}
    +Javet Response: {"id":1,"result":{}}
    +Chrome: {"id":2,"method":"Debugger.enable","params":{"maxScriptsCacheSize":100000000}}
    +Javet Response: {"id":2,"result":{"debuggerId":"00000000.00000000"}}
    +Chrome: {"id":3,"method":"Debugger.setPauseOnExceptions","params":{"state":"none"}}
    +Javet Response: {"id":3,"result":{}}
    +Chrome: {"id":4,"method":"Debugger.setAsyncCallStackDepth","params":{"maxDepth":32}}
    +Javet Response: {"id":4,"result":{}}
    +Chrome: {"id":5,"method":"Profiler.enable","params":{}}
    +Javet Response: {"id":5,"result":{}}
    +Chrome: {"id":6,"method":"Runtime.getIsolateId","params":{}}
    +Javet Response: {"id":6,"result":{"id":"00000000"}}
    +Chrome: {"id":7,"method":"Debugger.setBlackboxPatterns","params":{"patterns":[]}}
    +Javet Response: {"id":7,"result":{}}
    +Chrome: {"id":8,"method":"Runtime.runIfWaitingForDebugger","params":{}}
    +Javet Response: {"id":8,"result":{}}
    +
    +
    +

    Note: Method Runtime.runIfWaitingForDebugger can be regarded as the handshake completion and there is no need to parse this message because it is exposed as a callback in IV8InspectorListener.

    +

    Actually, inside V8, the first message can enable the debugging without the rest of them. Please refer to the source code for detail.

    +
    +
    +
    +

    Customization¶

    +

    Yes, please feel free to customize the debugging server in your environment. CDT Shell is created as a showcase for further customization. Here are some tips.

    +
      +
    • Integrate with your HTTP and WebSocket servers. CDT Shell currently uses embedded Jetty. Be careful, HTTP and WebSocket servers need to be hosted together, otherwise, CDT refuses to communicate with the WebSocket server.

    • +
    • Add your IV8InspectorListener to intercept all the event messages. In practice, a decent JSON library like JackSon, GSon may help interpret those messages. As a demo, CDT Shell doesn't process those messages. Why intercept those messages? Because:

      +
      +
        +
      • To set up breakpoints before script is executed.

      • +
      • To send messages to CDT right after CDT is connected.

      • +
      • To turn on / off certain features.

      • +
      • To enforce authentication and authorization.

      • +
      • To change V8 runtime.

      • +
      +
      +
    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/debug_with_chrome_developer_tools.rst b/docs/development/debug_with_chrome_developer_tools.rst index a60636bba..94cf38767 100644 --- a/docs/development/debug_with_chrome_developer_tools.rst +++ b/docs/development/debug_with_chrome_developer_tools.rst @@ -7,7 +7,7 @@ Debug with Chrome Developer Tools CDT Shell ========= -Javet ships a demo `CDT Shell <../../src/test/java/com/caoccao/javet/tutorial/cdt/TestCDT.java>`_ application to demonstrate how to work with CDT to perform a live debugging. +Javet ships a demo :extsource2:`CDT Shell <../../src/test/java/com/caoccao/javet/tutorial/cdt/TestCDT.java>` application to demonstrate how to work with CDT to perform a live debugging. 1. Run CDT Shell ---------------- @@ -33,7 +33,7 @@ Run arbitrary code in the console just like what can be done in a node console. Open chrome://inspect/ in Chrome, wait few seconds and Javet will appear as a remote target. -.. image:: ../resources/images/chome_developer_tools_devices_remote_target_javet.png?raw=true +.. image:: ../resources/images/chome_developer_tools_devices_remote_target_javet.png :alt: Remote Target Javet 4. Debug as Usual @@ -41,7 +41,7 @@ Open chrome://inspect/ in Chrome, wait few seconds and Javet will appear as a re Click ``inspect``. Voilà, DevTools is up. As the screenshot shows, live evaluation and auto-completion work successfully. Enjoy the live debugging. -.. image:: ../resources/images/chome_developer_tools_console.png?raw=true +.. image:: ../resources/images/chome_developer_tools_console.png :alt: Remote Target Javet Chrome Developer Tools Internals @@ -55,7 +55,7 @@ Handshake * CDT queries http://127.0.0.1:9229/javet with a websocket upgrade request. CDT Shell responses with websocket upgrade accepted. * CDT switches to ws://127.0.0.1:9229/javet and sends the following 8 messages to perform a handshake with a node flavored remote target. -.. code-block:: json +.. code-block:: js Chrome: {"id":1,"method":"Runtime.enable","params":{}} Javet Notification: {"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"origin":"","name":"Javet Inspector 00000000","uniqueId":"00000000.00000000"}}} @@ -77,7 +77,7 @@ Handshake Note: Method ``Runtime.runIfWaitingForDebugger`` can be regarded as the handshake completion and there is no need to parse this message because it is exposed as a callback in ``IV8InspectorListener``. -Actually, inside V8, the first message can enable the debugging without the rest of them. Please visit `TestV8Inspector.java <../../src/test/java/com/caoccao/javet/interop/TestV8Inspector.java>`_ for detail. +Actually, inside V8, the first message can enable the debugging without the rest of them. Please refer to the :extsource2:`source code <../../src/test/java/com/caoccao/javet/interop/TestV8Inspector.java>` for detail. Customization ============= diff --git a/docs/development/design.html b/docs/development/design.html new file mode 100644 index 000000000..fedb9a473 --- /dev/null +++ b/docs/development/design.html @@ -0,0 +1,567 @@ + + + + + + + + Javet Design - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Javet Design¶

    +
    +

    Architecture¶

    +Javet Architecture +
    +

    Primitive and Reference Types in Javet¶

    +

    There is a vague boundary between V8 primitive and reference types. In Javet, the definition of primitive is a mixture of both V8 and Java primitive types as a trade-off in design.

    +
    +++++ + + + + + + + + + + + + + + + + + + + + + + + + +

    Feature

    Primitive

    Reference

    Interception

    No

    Yes

    Memory Copy

    Copy by Value

    Copy by Reference

    Resource Leak

    Not Possible

    Possible

    Set to Weak

    No

    Yes

    +

    Reference typed objects keep memory footprint in V8 + JNI + JVM. All resource will be recycled when close() is called. That is quite an old school way of managing resource. Javet tries to hide that kind of tedious work from Java applications via try-with-resource.

    +

    Please refer to Best Practices for detail.

    +
    +
    +
    +

    Node.js Mode vs. V8 Mode¶

    +

    Javet supports both Node.js mode and V8 mode both of which can co-exist in one JVM. In other words, they can run side by side and don't interfere with each other.

    +Javet Modes +

    As the diagram shows, both Node.js and V8 are lazy loaded in dedicated custom classloaders. Detailed comparisons are as following.

    +
    +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Feature

    Node.js Mode

    V8 Mode

    Lazy Loadable

    Yes

    Yes

    Customization

    High

    High

    Node.js Ecosystem

    Complete

    No

    Security

    Low

    High

    Unload

    Yes

    Yes

    V8 Ecosystem

    Complete

    Complete

    V8 Version

    Low

    High

    +

    One of the beauties of Javet is all the features in V8 mode can be applied to Node.js mode. Here are some examples.

    +
      +
    • Virtualization - All Node.js modules can be virtualized. E.g. console, fs, HTTP, Net, OS, etc.

    • +
    • Zero-copy - JVM can share the same byte buffer with Node.js and V8 to achieve zero-copy.

    • +
    • Multi-threading - Multiple Java threads can host multiple Node.js runtime instances with only one copy of V8 objects visible to those instances.

    • +
    • Beyond Node.js - Javet allows explicit await() so that applications can take more control over async execution.

    • +
    +
    +
    +

    Module¶

    +

    Executing all scripts in global context is not recommended when project size increases. Javet provides complete support to applications so that V8 runtime context is aligned with the way Node or Chrome does. That brings the module system.

    +

    Unfortunately, V8 has very limited support to the JS module system. However, that is not bad because V8 leaves all the possibilities to Javet. The typical challenges Javet faces are as following.

    +
      +
    • Sync or Async

    • +
    • Module Location

    • +
    • Module Dependency

    • +
    +
    +

    require() vs. import()¶

    +
    +++++++ + + + + + + + + + + + + + + + + + + + + + + +

    Feature

    Async

    Original V8

    Javet Node.js Mode

    Javet V8 Mode

    require()

    No

    No

    Yes (Complete)

    Yes (with an Interceptor)

    import()

    Yes

    Yes (Partial)

    Yes (Complete)

    Yes (Complete)

    +
    +
    +

    Module Virtualization¶

    +

    Javet doesn't build require() in but allows applications to set an interceptor because Javet doesn't know how to locate the modules and doesn't want to know for security issues. So it's up to the applications to define their own ways of locating the modules.

    +

    Javet provides complete support to ES6 import() because certain work inside JNI has to be in place as V8 only partially supports import(). So, in Javet the module is kind of virtualized, in other words, the module is represented by an arbitrary string that can be interpreted by applications during runtime. E.g. module.js may come from a file, a URL, a string in memory or whatever. Javet stores the compiled and evaluated module in a map with that string as key, and feeds V8 that module when V8 looks it up by that string.

    +Javet Module System +
    +
    +
    +

    Engine Pool¶

    +Javet Engine Pool +
    +

    V8 Isolate and Context in Javet¶

    +

    Getting started with embedding V8 is an excellent article that explains the concepts, design, insights of V8. In summary:

    +
      +
    • An isolate is a VM instance with its own heap.

    • +
    • A context is an execution environment that allows separate, unrelated, JavaScript applications to run in a single instance of V8.

    • +
    +

    In Javet, that model is simplified to 1 engine - 1 runtime - 1 isolate - 1 context. In V8Runtime, resetIsolate() and resetContext() are both exposed. It is recommended to always use resetContext() to get a brand new V8 context for the following reasons.

    +
      +
    • resetContext() is a much cheaper operation with much better performance.

    • +
    • resetContext() is good enough in terms of getting a brand new V8 context.

    • +
    +
    +
    +

    Javet Engine Pool¶

    +

    Multiple Javet engines are managed by Javet Engine Pool which works almost the same way as a typical DB connection pool. Javet Engine Pool is thread-safe. However, Javet Engine is NOT thread-safe because it is designed to be single-threaded and lock free for the following reasons.

    +
      +
    • V8 isolate and V8 context are single-threaded. Thread context violation results in V8 core dump immediately.

    • +
    • Javet Engine performs better without locks. Actually, Javet engine only validates current thread ID to minimize the performance overhead.

    • +
    +

    Please refer to Best Practices for detail.

    +
    +
    +
    +

    Interception¶

    +

    Javet allows intercepting almost all V8 API so that JS code actually interacts with Java code behind the scene.

    +Javet Interception +

    Sample code is available at V8 Function.

    +
    +
    +

    Cross-platform¶

    +

    Javet packages all the libraries in a single jar file and automatically loads corresponding library per OS and JS runtime.

    +Javet Cross-platform +
      +
    • Javet calculates the library file name from OS and JS runtime.

    • +
    • Javet unpacks the library files from resource directory to system_temporary_directory/javet/pid.

    • +
    • Javet loads the library files using either default classloader or custom classloader.

    • +
    +
    +

    Multi-process Safety¶

    +

    Javet is multi-process safe because it deploys the library files to system_temporary_directory/javet/pid to avoid race conditions during initialization. Also, Javet purges legacy libraries (at least 1 minute old) at the beginning of the initialization.

    +
    +
    +
    +

    Memory Leak Detection¶

    +

    Javet native library keeps track of every new and delete in JavetNativeMonitor. Javet every unit test case fetches the tracking data, compares the new and delete count to verify unmanaged objects are properly allocated and freed.

    +

    This feature is only turned on in debug version and there is zero performance overhead in release version.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/design.rst b/docs/development/design.rst index a32ec47e0..98edc382e 100644 --- a/docs/development/design.rst +++ b/docs/development/design.rst @@ -5,7 +5,7 @@ Javet Design Architecture ============ -.. image:: ../resources/images/javet_architecture.png?raw=true +.. image:: ../resources/images/javet_architecture.png :alt: Javet Architecture Primitive and Reference Types in Javet @@ -24,14 +24,14 @@ Set to Weak No Yes Reference typed objects keep memory footprint in V8 + JNI + JVM. All resource will be recycled when ``close()`` is called. That is quite an old school way of managing resource. Javet tries to hide that kind of tedious work from Java applications via try-with-resource. -Please refer to `Best Practices <../reference/best_practices.rst>`_ for detail. +Please refer to :doc:`../reference/best_practices` for detail. Node.js Mode vs. V8 Mode ======================== Javet supports both Node.js mode and V8 mode both of which can co-exist in one JVM. In other words, they can run side by side and don't interfere with each other. -.. image:: ../resources/images/javet_modes.png?raw=true +.. image:: ../resources/images/javet_modes.png :alt: Javet Modes As the diagram shows, both Node.js and V8 are lazy loaded in dedicated custom classloaders. Detailed comparisons are as following. @@ -83,13 +83,13 @@ Javet doesn't build ``require()`` in but allows applications to set an intercept Javet provides complete support to ES6 ``import()`` because certain work inside JNI has to be in place as V8 only partially supports ``import()``. So, in Javet the module is kind of virtualized, in other words, the module is represented by an arbitrary string that can be interpreted by applications during runtime. E.g. ``module.js`` may come from a file, a URL, a string in memory or whatever. Javet stores the compiled and evaluated module in a map with that string as key, and feeds V8 that module when V8 looks it up by that string. -.. image:: ../resources/images/javet_module_system.png?raw=true +.. image:: ../resources/images/javet_module_system.png :alt: Javet Module System Engine Pool =========== -.. image:: ../resources/images/javet_engine_pool.png?raw=true +.. image:: ../resources/images/javet_engine_pool.png :alt: Javet Engine Pool V8 Isolate and Context in Javet @@ -113,24 +113,24 @@ Multiple Javet engines are managed by Javet Engine Pool which works almost the s * V8 isolate and V8 context are single-threaded. Thread context violation results in V8 core dump immediately. * Javet Engine performs better without locks. Actually, Javet engine only validates current thread ID to minimize the performance overhead. -Please refer to `Best Practices <../reference/best_practices.rst>`_ for detail. +Please refer to :doc:`../reference/best_practices` for detail. Interception ============ Javet allows intercepting almost all V8 API so that JS code actually interacts with Java code behind the scene. -.. image:: ../resources/images/javet_interception.png?raw=true +.. image:: ../resources/images/javet_interception.png :alt: Javet Interception -Sample code is available at `here <../reference/v8_function.rst>`_. +Sample code is available at :doc:`../reference/v8_function`. Cross-platform ============== Javet packages all the libraries in a single jar file and automatically loads corresponding library per OS and JS runtime. -.. image:: ../resources/images/javet_cross_platform.png?raw=true +.. image:: ../resources/images/javet_cross_platform.png :alt: Javet Cross-platform * Javet calculates the library file name from OS and JS runtime. @@ -148,5 +148,3 @@ Memory Leak Detection Javet native library keeps track of every ``new`` and ``delete`` in ``JavetNativeMonitor``. Javet every unit test case fetches the tracking data, compares the ``new`` and ``delete`` count to verify unmanaged objects are properly allocated and freed. This feature is only turned on in debug version and there is zero performance overhead in release version. - -[`Home <../../README.rst>`_] [`Development `_] diff --git a/docs/development/index.html b/docs/development/index.html new file mode 100644 index 000000000..60c94a7c4 --- /dev/null +++ b/docs/development/index.html @@ -0,0 +1,367 @@ + + + + + + + + Development - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + + +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/index.rst b/docs/development/index.rst index 8da39dc1c..db4ce780c 100644 --- a/docs/development/index.rst +++ b/docs/development/index.rst @@ -2,15 +2,11 @@ Development =========== -* `Development Tools `_ -* `Build `_ - - * `Build Javet with Docker `_ (Linux and Windows) - * `Build Javet with Pre-built Binaries `_ (Linux, Mac OS and Windows) - * `Build Javet from Scratch `_ (Linux, Mac OS and Windows) - -* `Test `_ -* `Design `_ -* `Debug with Chrome Developer Tools `_ - -[`Home <../../README.rst>`_] +.. toctree:: + :maxdepth: 2 + + tools + build + test + design + debug_with_chrome_developer_tools diff --git a/docs/development/test.html b/docs/development/test.html new file mode 100644 index 000000000..bf96e2aed --- /dev/null +++ b/docs/development/test.html @@ -0,0 +1,332 @@ + + + + + + + + Test Javet - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Test Javet¶

    +

    Test is designed to completely reuse test cases for either Node.js or V8 mode.

    +

    How do test cases know which mode to test? The base test suite compares the timestamp of the Node.js and V8 libraries and set test target to the newer one. So, if a new library is built, test cases automatically set test target to that new library.

    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/test.rst b/docs/development/test.rst index f9b78ade0..09adda82b 100644 --- a/docs/development/test.rst +++ b/docs/development/test.rst @@ -5,5 +5,3 @@ Test Javet Test is designed to completely reuse test cases for either Node.js or V8 mode. How do test cases know which mode to test? The base test suite compares the timestamp of the Node.js and V8 libraries and set test target to the newer one. So, if a new library is built, test cases automatically set test target to that new library. - -[`Home <../../README.rst>`_] [`Development `_] diff --git a/docs/development/tools.html b/docs/development/tools.html new file mode 100644 index 000000000..e94372640 --- /dev/null +++ b/docs/development/tools.html @@ -0,0 +1,383 @@ + + + + + + + + Development Tools - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Development Tools¶

    +
    +

    JDK¶

    +

    Javet development requires JDK 8 to be installed, though Javet supports JDK 8+. JDK 6 support has been dropped because a few JDK 8 features are heavily used in Javet.

    +
    +
    +

    IntelliJ¶

    +

    I personally recommend IntelliJ IDEA.

    +
    +
    +

    Gradle¶

    +

    For now, Gradle v7.2 + Kotlin DSL constructs the build system.

    +
    +
    +

    Node.js¶

    +

    Node.js 14.17.6+ is supported.

    +
    +
    +

    Maven (Optional)¶

    +

    Maven v3.6.3+ is used for packaging bundle to maven central.

    +
    +
    +

    Visual Studio Community 2019 (Optional)¶

    +

    Visual Studio Community 2019 is used for JNI development.

    +
    +
    +

    Python 3.8+ (Optional)¶

    +

    Python 3.8+ is required if you want to upgrade the version.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/development/tools.rst b/docs/development/tools.rst index 0a2954781..d53ed7ba7 100644 --- a/docs/development/tools.rst +++ b/docs/development/tools.rst @@ -15,7 +15,7 @@ I personally recommend IntelliJ IDEA. Gradle ====== -For now, Gradle v6.7 + Kotlin DSL constructs the build system. +For now, Gradle v7.2 + Kotlin DSL constructs the build system. Node.js ================= @@ -36,5 +36,3 @@ Python 3.8+ (Optional) ====================== Python 3.8+ is required if you want to upgrade the version. - -[`Home <../../README.rst>`_] [`Development `_] diff --git a/docs/faq/background/history_with_j2v8.html b/docs/faq/background/history_with_j2v8.html new file mode 100644 index 000000000..cb2d5469c --- /dev/null +++ b/docs/faq/background/history_with_j2v8.html @@ -0,0 +1,431 @@ + + + + + + + + History with J2V8 - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    History with J2V8¶

    +
    +

    J2V8 Issues¶

    +

    J2V8 is an excellent project on embedding V8 in Java. However, J2V8 community hasn't been active since 2017.

    +

    The last Windows version 4.6.0 was released in 2016 and the last Linux version 4.8.0 was released in 2017. The V8 in Windows v4.6.0 doesn't even fully support ES6.

    +

    The latest community activities were around Android versions. The Node.js API was dropped. The Windows build has been seriously broken for years. The Linux build is nearly broken. There are serious memory leak issues which are hard to be fixed under the current architecture.

    +

    Its API has stopped evolving for years. Many new features I expect just don't get any chances to be implemented. Obviously, if the build system was broken and couldn't be easily fixed, almost no one would like to contribute. That includes me. When I was trying to fix the build system for Windows and Linux, I had to admit that's so, so, so, challenging. Why is that? I think it's not merely J2V8 community's problem because in the meanwhile V8, Node.js and ECMAScript move forward rapidly causing many unexpected challenges. Someone or some team needs to look after J2V8 from time to time. Unfortunately, the reality is cruel.

    +
    +
    +

    J2V8 Latest Version¶

    +

    I managed to unofficially build the latest J2V8 v6.2.0.

    +
      +
    • V8 is upgraded to v8.3.110.9 which was released in May, 2020.

    • +
    • Windows and Linux are supported.

    • +
    • Node.js is dropped temporarily.

    • +
    +

    I've tested the performance between j2v8_win32_x86_64-4.6.0.jar and j2v8_win32_x86_64-6.2.0.jar on a Windows machine with CPU i7 10700K. The test code is just 1+1 -> 2. Here are the comparisons.

    +
    +++++ + + + + + + + + + + + + + + + + + + + + +

    Case

    4.6.0 (TPS)

    6.2.0 (TPS)

    Single Session with 1 Thread

    1,003,009

    1,338,688

    Ad-hoc Session with 1 Thread

    35

    299

    4 Sessions with 4 threads

    2,274,019

    4,571,428

    +

    With this kind of performance improvement, what are the reasons of sticking to v4.6.0?

    +
    +
    +

    Why Windows and Linux only?¶

    +
      +
    • I don't own a decent Mac device. To be more precisely, I have Mac Mini and MacBook Air, but they are too old (building V8 would take many hours). And I have no plan on buying a new one in the near future. Call for donation? Don't be joking. So there's no MacOS release.

    • +
    • I don't intend to support Android for now.

    • +
    +
    +
    +

    Why not Automate the J2V8 Build System?¶

    +

    TL;DR: It's too hard.

    +
      +
    • V8 is evolving rapidly. v8.3.110.9 is a relatively easy one to be mastered. I didn't move forward well with v8.9.213 which placed a different set of solvable challenges to me. I plan to revisit the latest V8 in near future.

    • +
    • Node.js was removed early. I haven't got time reviving it in J2V8.

    • +
    • J2V8 build system is too old.

      +
        +
      • Gradle v2.14.1 is far from the lowest supported gradle version in my latest IntelliJ IDEA. And I don't have interest in installing a legacy Eclipse to play with that version of gradle. Hey, why not upgrade gradle to satisfy IDEA? I tried, but all was bad luck. You may take a try, then understand what I have suffered from.

      • +
      • CMake is old and seriously broken on Windows. Nowadays, V8 only supports VS 2017 or 2019, but CMakeLists.txt is still at the VS 2015 age. No surprise, it doesn't work at all.

      • +
      • Docker build is deeply broken as well. The dependent docker image was gone. There are many errors in many steps. Sitting there, watching the docker build breaks made me full of frustration because I thought it would take me a few months fixing the problems, but I don't have a few months. No one pays me to do that.

      • +
      • Python2 scripts form the outer layer of the build system, also hide the actual building logic from someone who tries to fix the build system. I don't want to spend my precious time fixing Python2 scripts, because I've been on Python3 for many years. I wish my hair could be as much as Guido van Rossum's. Obviously, I am not, so no more Python2.

      • +
      • Maven is old but the least problematic. At least it allows me to package the jar files with my hack to the pom.xml.

      • +
      +
    • +
    +

    With these uncertainties, to me, automating the build system is something with ROI closing to 0. Supposing I achieved it in a particular version of V8, let's say v8.3.110.9, it would for sure break in v8.9.x. Later, I managed to build v8.9.255 which has been embeded into Javet.

    +
    +
    +

    Why not Deploy J2V8 to Maven Repository?¶

    +
      +
    • I don't have the permission to its official repository.

    • +
    • There has been no Windows / Linux releases deployed since 2016 / 2017. I really don't know who to contact with.

    • +
    • You may easily integrate the jar files in your local maven repository.

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/history_with_j2v8.rst b/docs/faq/background/history_with_j2v8.rst similarity index 98% rename from docs/faq/history_with_j2v8.rst rename to docs/faq/background/history_with_j2v8.rst index 0f2675107..447a3fff7 100644 --- a/docs/faq/history_with_j2v8.rst +++ b/docs/faq/background/history_with_j2v8.rst @@ -63,5 +63,3 @@ Why not Deploy J2V8 to Maven Repository? * I don't have the permission to its official repository. * There has been no Windows / Linux releases deployed since 2016 / 2017. I really don't know who to contact with. * You may easily integrate the jar files in your local maven repository. - -[`Home <../../README.rst>`_] [`FAQ `_] diff --git a/docs/faq/background/index.html b/docs/faq/background/index.html new file mode 100644 index 000000000..344a3d3cd --- /dev/null +++ b/docs/faq/background/index.html @@ -0,0 +1,336 @@ + + + + + + + + Background - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/background/index.rst b/docs/faq/background/index.rst new file mode 100644 index 000000000..f34978f5e --- /dev/null +++ b/docs/faq/background/index.rst @@ -0,0 +1,9 @@ +========== +Background +========== + +.. toctree:: + :maxdepth: 1 + + what_is_the_motivation + history_with_j2v8 diff --git a/docs/faq/background/what_is_the_motivation.html b/docs/faq/background/what_is_the_motivation.html new file mode 100644 index 000000000..461683579 --- /dev/null +++ b/docs/faq/background/what_is_the_motivation.html @@ -0,0 +1,334 @@ + + + + + + + + What is the Motivation? - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    What is the Motivation?¶

    +

    I used to take a try of J2V8 and find it's quite compelling. However, J2V8 is slowly dying, with serious memory leak issues, V8 version issue, etc.

    +

    Sometimes starting from scratch implies lower cost than upgrading an existing solution. I think it might be true here in this project. I've learned quite a lot by manually fixing the Windows and Linux build system of J2V8.

    +

    Also, I had got many ideas on how the API will look like. At the end of 2020, I thought I would be able to write a new one from scratch and leave J2V8 behind. Indeed, I made it few months later.

    +

    Please refer to History with J2V8 for detail.

    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/what_is_the_motivation.rst b/docs/faq/background/what_is_the_motivation.rst similarity index 83% rename from docs/faq/what_is_the_motivation.rst rename to docs/faq/background/what_is_the_motivation.rst index 57490579b..1ce83fee8 100644 --- a/docs/faq/what_is_the_motivation.rst +++ b/docs/faq/background/what_is_the_motivation.rst @@ -8,6 +8,4 @@ Sometimes starting from scratch implies lower cost than upgrading an existing so Also, I had got many ideas on how the API will look like. At the end of 2020, I thought I would be able to write a new one from scratch and leave J2V8 behind. Indeed, I made it few months later. -Please refer to `History with J2V8 `_ for detail. - -[`Home <../../README.rst>`_] [`FAQ `_] +Please refer to :doc:`history_with_j2v8` for detail. diff --git a/docs/faq/can_i_debug_javet_in_chrome_dev_tools.rst b/docs/faq/can_i_debug_javet_in_chrome_dev_tools.rst deleted file mode 100644 index 5032c9dda..000000000 --- a/docs/faq/can_i_debug_javet_in_chrome_dev_tools.rst +++ /dev/null @@ -1,10 +0,0 @@ -===================================== -Can I Debug Javet in Chrome DevTools? -===================================== - -Yes, you can do that. Please visit `Debug with Chrome Developer Tools <../development/debug_with_chrome_developer_tools.rst>`_ for detail. - -.. image:: ../resources/images/chome_developer_tools_devices_remote_target_javet.png?raw=true - :alt: Remote Target Javet - -[`Home <../../README.rst>`_] [`FAQ `_] diff --git a/docs/faq/development/how_to_think_in_javet.html b/docs/faq/development/how_to_think_in_javet.html new file mode 100644 index 000000000..5f70d0cec --- /dev/null +++ b/docs/faq/development/how_to_think_in_javet.html @@ -0,0 +1,389 @@ + + + + + + + + How to Think in Javet? - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    How to Think in Javet?¶

    +

    There are folks migrating projects from other libraries (e.g. J2V8) to Javet. Some experienced certain challenges which from Javet perspective required Thinking in Javet. So, how?

    +
    +

    V8Runtime and V8ValueGlobalObject¶

    +

    In Javet, V8Runtime and V8ValueGlobalObject are separate concepts.

    +
    +

    V8Runtime¶

    +

    V8Runtime is only a representative of the V8 isolate and V8 context. It has nothing to do with globalThis or window. However, in few other libraries these concepts are mixed up.

    +
    +
    +

    V8ValueGlobalObject¶

    +

    As V8Runtime no longer represents globalThis or window, V8ValueGlobalObject from V8Runtime.getGlobalObject() is the one.

    +

    If you want to access global objects or call top level functions, globalObject.get('...') and globalObject.invoke('...') are the Javet ways.

    +
    +
    +
    +

    Executor and Execute¶

    +

    In Javet, executing a script involves 2 steps.

    +
      +
    1. Get an executor.

    2. +
    3. Call certain execute method of that executor.

    4. +
    +

    This is quite different from the common practice of few other libraries where execute is just a 1-step thing.

    +

    Why? Javet intends to offer a builder pattern in the script execution. With an executor, application may do every other things before the actual execution. For instance: security check, enable / disable certain V8 features, hack the AST, set up interception, etc. The scope may be limited to that executor only. Also, the executor can be reused to avoid the duplicated resource loading overhead.

    +
    +
    +

    Declarative Function and Property Interception¶

    +

    Javet offers an easy way of registering function and property interception in a declarative way. Just decorate a function of arbitrary object with @V8Function(name = "...") or @V8Property(name = "..."), Javet is able to register it and that function will be called back from V8. Application is free from managing those tedious things like resource leakage, object lifecycle, type conversion, etc. Javet just handles that behind the scene and everything goes smoothly.

    +

    The coding experience is a little bit close to working with Spring Framework.

    +
    +
    +

    Learn from Unit Test¶

    +

    Most of the Javet API is unit test covered. Learning from Javet unit test is an express and effective way to Thinking in Javet.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/how_to_think_in_javet.rst b/docs/faq/development/how_to_think_in_javet.rst similarity index 66% rename from docs/faq/how_to_think_in_javet.rst rename to docs/faq/development/how_to_think_in_javet.rst index b5618088e..de194ec67 100644 --- a/docs/faq/how_to_think_in_javet.rst +++ b/docs/faq/development/how_to_think_in_javet.rst @@ -4,18 +4,18 @@ How to Think in Javet? There are folks migrating projects from other libraries (e.g. J2V8) to Javet. Some experienced certain challenges which from Javet perspective required **Thinking in Javet**. So, how? -``V8Runtime`` and ``V8ValueGlobalObject`` -========================================= +V8Runtime and V8ValueGlobalObject +================================= In Javet, ``V8Runtime`` and ``V8ValueGlobalObject`` are separate concepts. -``V8Runtime`` -------------- +V8Runtime +--------- ``V8Runtime`` is only a representative of the V8 isolate and V8 context. It has nothing to do with ``globalThis`` or ``window``. However, in few other libraries these concepts are mixed up. -``V8ValueGlobalObject`` ------------------------ +V8ValueGlobalObject +------------------- As ``V8Runtime`` no longer represents ``globalThis`` or ``window``, ``V8ValueGlobalObject`` from ``V8Runtime.getGlobalObject()`` is the one. @@ -26,23 +26,21 @@ Executor and Execute In Javet, executing a script involves 2 steps. -1. Get the executor. +1. Get an executor. 2. Call certain execute method of that executor. This is quite different from the common practice of few other libraries where execute is just a 1-step thing. Why? Javet intends to offer a builder pattern in the script execution. With an executor, application may do every other things before the actual execution. For instance: security check, enable / disable certain V8 features, hack the AST, set up interception, etc. The scope may be limited to that executor only. Also, the executor can be reused to avoid the duplicated resource loading overhead. -Declarative Function Interception -================================= +Declarative Function and Property Interception +============================================== -Javet offers an easy way of registering function interception in a declarative way. Just decorate a function of arbitrary object with ``@V8Function(name = "...")``, Javet is able to register it and that function will be called back from V8. Application is free from managing those tedious things like resource leakage, object lifecycle, type conversion, etc. Javet just handles that behind the scene and everything goes smoothly. +Javet offers an easy way of registering function and property interception in a declarative way. Just decorate a function of arbitrary object with ``@V8Function(name = "...")`` or ``@V8Property(name = "...")``, Javet is able to register it and that function will be called back from V8. Application is free from managing those tedious things like resource leakage, object lifecycle, type conversion, etc. Javet just handles that behind the scene and everything goes smoothly. The coding experience is a little bit close to working with Spring Framework. Learn from Unit Test ==================== -Most of the Javet API is unit test coverted. Learning from Javet unit test is an express and effective way to Thinking in Javet. - -[`Home <../../README.rst>`_] [`FAQ `_] +Most of the Javet API is unit test covered. Learning from Javet unit test is an express and effective way to Thinking in Javet. diff --git a/docs/faq/development/index.html b/docs/faq/development/index.html new file mode 100644 index 000000000..6cccf8e66 --- /dev/null +++ b/docs/faq/development/index.html @@ -0,0 +1,336 @@ + + + + + + + + Development - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/development/index.rst b/docs/faq/development/index.rst new file mode 100644 index 000000000..c29b71412 --- /dev/null +++ b/docs/faq/development/index.rst @@ -0,0 +1,9 @@ +=========== +Development +=========== + +.. toctree:: + :maxdepth: 1 + + how_to_think_in_javet + where_are_es6_api_in_v8_mode diff --git a/docs/faq/development/where_are_es6_api_in_v8_mode.html b/docs/faq/development/where_are_es6_api_in_v8_mode.html new file mode 100644 index 000000000..b1df9d071 --- /dev/null +++ b/docs/faq/development/where_are_es6_api_in_v8_mode.html @@ -0,0 +1,332 @@ + + + + + + + + Where are ES6 API in V8 Mode? - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Where are ES6 API in V8 Mode?¶

    +

    V8 mode only offers the basic functionality so that some ES6 API are absent. E.g. setTimeout, setInterval, etc.

    +

    Project Javenode is an extension of Javet aiming at simulating Node.js with Java in Javet V8 mode.

    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/where_are_es6_api_in_v8_mode.rst b/docs/faq/development/where_are_es6_api_in_v8_mode.rst similarity index 87% rename from docs/faq/where_are_es6_api_in_v8_mode.rst rename to docs/faq/development/where_are_es6_api_in_v8_mode.rst index cfb315014..9f905cd07 100644 --- a/docs/faq/where_are_es6_api_in_v8_mode.rst +++ b/docs/faq/development/where_are_es6_api_in_v8_mode.rst @@ -5,5 +5,3 @@ Where are ES6 API in V8 Mode? V8 mode only offers the basic functionality so that some ES6 API are absent. E.g. setTimeout, setInterval, etc. Project `Javenode `_ is an extension of Javet aiming at simulating Node.js with Java in Javet V8 mode. - -[`Home <../../README.rst>`_] [`FAQ `_] diff --git a/docs/faq/environment/can_javet_support_legacy_linux.html b/docs/faq/environment/can_javet_support_legacy_linux.html new file mode 100644 index 000000000..4d0fe2d79 --- /dev/null +++ b/docs/faq/environment/can_javet_support_legacy_linux.html @@ -0,0 +1,379 @@ + + + + + + + + Can Javet Support Legacy Linux? - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Can Javet Support Legacy Linux?¶

    +

    Yes, Javet can support some legacy linux distributions, eg: Ubuntu 16.04, Ubuntu 18.04, but not with the official builds which rely on more advanced tool chain.

    +

    Please download the private builds from this drive and prepare your runtime environment as following.

    +
    sudo apt update
    +sudo apt upgrade -y
    +sudo apt install build-essential -y
    +sudo apt install software-properties-common -y
    +sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    +sudo apt upgrade -y
    +sudo apt install gcc-snapshot -y
    +sudo apt upgrade -y
    +sudo apt install gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9 -y
    +sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
    +sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8
    +sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7
    +sudo update-alternatives --config gcc
    +
    +There are 3 choices for the alternative gcc (providing /usr/bin/gcc).
    +
    +Selection    Path            Priority   Status
    +------------------------------------------------------------
    +* 0            /usr/bin/gcc-9   90        auto mode
    +  1            /usr/bin/gcc-7   70        manual mode
    +  2            /usr/bin/gcc-8   80        manual mode
    +  3            /usr/bin/gcc-9   90        manual mode
    +
    +
    +
    +

    Notes¶

    +

    Private builds imply considerable additional effort, so there is no commitments. Please contact the maintainer for private builds wisely.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/can_javet_support_legacy_linux.rst b/docs/faq/environment/can_javet_support_legacy_linux.rst similarity index 97% rename from docs/faq/can_javet_support_legacy_linux.rst rename to docs/faq/environment/can_javet_support_legacy_linux.rst index ac0b5313f..fe7cb646a 100644 --- a/docs/faq/can_javet_support_legacy_linux.rst +++ b/docs/faq/environment/can_javet_support_legacy_linux.rst @@ -35,5 +35,3 @@ Notes ===== Private builds imply considerable additional effort, so there is no commitments. Please contact the maintainer for private builds wisely. - -[`Home <../../README.rst>`_] [`FAQ `_] diff --git a/docs/faq/environment/can_javet_support_mac.html b/docs/faq/environment/can_javet_support_mac.html new file mode 100644 index 000000000..e43349ea2 --- /dev/null +++ b/docs/faq/environment/can_javet_support_mac.html @@ -0,0 +1,388 @@ + + + + + + + + Can Javet Support Mac? - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Can Javet Support Mac?¶

    +
    +

    Now¶

    +

    My MacBook Air mid-2012 was revived with Mac OS Catalina which is the lowest version supported by latest V8. I managed to include it in the regular release cycle.

    +
    +

    Known Issue¶

    +

    Some of the Node.js symbols might not be exposed correctly. That might cause native node modules malfunction. Quick fix will be served per issue reported.

    +
    +
    +

    Will the Mac OS Build be LTS?¶

    +

    I doubt because when next time V8 abandons Catalina, I won't be able to create any new builds unless someone takes care of the Mac OS build or I get enough donation for a new device. Donate

    +
    +
    +

    How about arm64?¶

    +

    That is still not supported. Please Donate

    +
    +
    +
    +

    Before Aug 10, 2021¶

    +

    Short answer is Yes and No.

    +
    +

    Yes¶

    +

    There is no technical difficulties. The code is written in cross-platform manner. Someone needs to pay considerable effort creating and maintaining the Mac build.

    +
    +
    +

    No¶

    +

    I don't own a decent Mac device. To be more precisely, I have Mac Mini and MacBook Air, but they are too old (building Node.js and V8 would take many hours). Besides, there are both x86 and arm64 to be supported.

    +

    I have no plan on buying 2 new Mac devices for supporting Javet only in the near future. If I could be well funded, I would consider supporting Mac.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/can_javet_support_mac.rst b/docs/faq/environment/can_javet_support_mac.rst similarity index 84% rename from docs/faq/can_javet_support_mac.rst rename to docs/faq/environment/can_javet_support_mac.rst index e2bb02b61..10a244dca 100644 --- a/docs/faq/can_javet_support_mac.rst +++ b/docs/faq/environment/can_javet_support_mac.rst @@ -5,7 +5,7 @@ Can Javet Support Mac? Now === -My MacBook Air mid-2012 was revived with Mac OS Catalina which is the lowest version supported by latest V8. I managed to include it in the regular release cycle. +My `MacBook Air mid-2012 `_ was revived with Mac OS Catalina which is the lowest version supported by latest V8. I managed to include it in the regular release cycle. Known Issue ----------- @@ -41,5 +41,3 @@ No I don't own a decent Mac device. To be more precisely, I have Mac Mini and MacBook Air, but they are too old (building Node.js and V8 would take many hours). Besides, there are both x86 and arm64 to be supported. I have no plan on buying 2 new Mac devices for supporting Javet only in the near future. If I could be well funded, I would consider supporting Mac. - -[`Home <../../README.rst>`_] [`FAQ `_] diff --git a/docs/faq/environment/index.html b/docs/faq/environment/index.html new file mode 100644 index 000000000..ce75d59d0 --- /dev/null +++ b/docs/faq/environment/index.html @@ -0,0 +1,336 @@ + + + + + + + + Environment - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/environment/index.rst b/docs/faq/environment/index.rst new file mode 100644 index 000000000..de6b5a214 --- /dev/null +++ b/docs/faq/environment/index.rst @@ -0,0 +1,9 @@ +=========== +Environment +=========== + +.. toctree:: + :maxdepth: 1 + + can_javet_support_mac + can_javet_support_legacy_linux diff --git a/docs/faq/index.html b/docs/faq/index.html new file mode 100644 index 000000000..f71e0427d --- /dev/null +++ b/docs/faq/index.html @@ -0,0 +1,355 @@ + + + + + + + + FAQ - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + + +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/index.rst b/docs/faq/index.rst index 331c2cb13..b6bc02345 100644 --- a/docs/faq/index.rst +++ b/docs/faq/index.rst @@ -2,28 +2,10 @@ FAQ === -Background -========== +.. toctree:: + :maxdepth: 2 -* `What is the Motivation? `_ -* `History with J2V8 `_ - -Environment -=========== - -* `Can Javet Support Mac? `_ -* `Can Javet Support Legacy Linux? `_ - -Development -=========== - -* `How to Think in Javet? `_ -* `Where are ES6 API in V8 Mode? `_ - -Troubleshooting -=============== - -* `A dynamic link library (DLL) initialization routine failed `_ -* `Can I Debug Javet in Chrome DevTools? `_ - -[`Home <../../README.rst>`_] + background/index + development/index + environment/index + troubleshooting/index diff --git a/docs/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.html b/docs/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.html new file mode 100644 index 000000000..6905a6ce1 --- /dev/null +++ b/docs/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.html @@ -0,0 +1,331 @@ + + + + + + + + A dynamic link library (DLL) initialization routine failed - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/a_dynamic_link_library_dll_initialization_routine_failed.rst b/docs/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.rst similarity index 66% rename from docs/faq/a_dynamic_link_library_dll_initialization_routine_failed.rst rename to docs/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.rst index d93988f20..e85bcab1f 100644 --- a/docs/faq/a_dynamic_link_library_dll_initialization_routine_failed.rst +++ b/docs/faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.rst @@ -2,6 +2,4 @@ A dynamic link library (DLL) initialization routine failed ========================================================== -This failure happens when Javet Node.js mode tries to load a Node.js native module. The root cause is some ``NAPI`` symbols cannot be found on Windows. The fix is is available at `Modularization <../reference/modularization.rst>`_. - -[`Home <../../README.rst>`_] [`FAQ `_] +This failure happens when Javet Node.js mode tries to load a Node.js native module. The root cause is some ``NAPI`` symbols cannot be found on Windows. The fix is is available at :doc:`../../reference/modularization`. diff --git a/docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.html b/docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.html new file mode 100644 index 000000000..1b9fd54d8 --- /dev/null +++ b/docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.html @@ -0,0 +1,332 @@ + + + + + + + + Can I Debug Javet in Chrome DevTools? - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst b/docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst new file mode 100644 index 000000000..9766a1223 --- /dev/null +++ b/docs/faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.rst @@ -0,0 +1,8 @@ +===================================== +Can I Debug Javet in Chrome DevTools? +===================================== + +Yes, you can do that. Please visit :doc:`../../development/debug_with_chrome_developer_tools` for detail. + +.. image:: ../../resources/images/chome_developer_tools_devices_remote_target_javet.png + :alt: Remote Target Javet diff --git a/docs/faq/troubleshooting/index.html b/docs/faq/troubleshooting/index.html new file mode 100644 index 000000000..9537ce438 --- /dev/null +++ b/docs/faq/troubleshooting/index.html @@ -0,0 +1,337 @@ + + + + + + + + Troubleshooting - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/troubleshooting/index.rst b/docs/faq/troubleshooting/index.rst new file mode 100644 index 000000000..dd860e885 --- /dev/null +++ b/docs/faq/troubleshooting/index.rst @@ -0,0 +1,10 @@ +=============== +Troubleshooting +=============== + +.. toctree:: + :maxdepth: 1 + + a_dynamic_link_library_dll_initialization_routine_failed + can_i_debug_javet_in_chrome_dev_tools + why_node_js_crashes_when_being_closed diff --git a/docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.html b/docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.html new file mode 100644 index 000000000..6628239b6 --- /dev/null +++ b/docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.html @@ -0,0 +1,395 @@ + + + + + + + + Why Node.js Crashes When being Closed? - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Why Node.js Crashes When being Closed?¶

    +
    +

    Background¶

    +

    Some Javet users experience segfaults when using the Node.js mode. The segfaults occur when NodeRuntime is being closed. E.g. issue #20 and issue #82.

    +
    +
    +

    Root Cause¶

    +

    The root cause is Node.js event loop is activated when Node.js is exiting. Let's see how NodeRuntime.close() works behind the scenes.

    +
      +
    1. Close all Node.js modules

    2. +
    3. Close all reference objects

    4. +
    5. Close all callback context objects

    6. +
    7. Close all V8 modules

    8. +
    9. Hand over the control to Node.js exiting process

    10. +
    +

    If the application registers interceptors, those interceptors will be closed at step 3. However, the corresponding JavaScript objects hasn't been recycled yet. So, at step 5, Node.js activates the event loop and async objects will get resolved or rejected. The callbacks land Javet which is not able to handle because the callback context objects are gone. That leads to memory corruption and segfaults.

    +

    Can Javet address that? Yes, but that implies hacking Node.js event loop. People choose Javet Node.js mode mostly because it is a genuine Node.js. So, no, Javet does not perform such hack.

    +
    +
    +

    Solution¶

    +

    Well, how to prevent that from happening? In fact, knowing how Javet works and following the Javet way, that won't happen.

    +
    +

    Event unhandledRejection¶

    +

    Node.js provides a standard solution. Application can listen to event unhandledRejection to prevent that event from hitting Javet so that the segfaults will not take place.

    +
    import process from 'process';
    +process.on('unhandledRejection', (reason, promise) => {
    +  // Do whatever you want to do
    +});
    +
    +
    +
    +
    +

    NodeRuntime.await()¶

    +

    Application may call NodeRuntime.await() before closing the NodeRuntime. This call explicitly tells NodeRuntime to activate the event loop.

    +
    +
    +

    NodeRuntime.lowMemoryNotification()¶

    +

    Application may call NodeRuntime.lowMemoryNotification() before closing the NodeRuntime. This call forces NodeRuntime to perform garbage collection. During the garbage collection, the callbacks can be safely handled by Javet without segfaults.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst b/docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst new file mode 100644 index 000000000..491927ce8 --- /dev/null +++ b/docs/faq/troubleshooting/why_node_js_crashes_when_being_closed.rst @@ -0,0 +1,50 @@ +====================================== +Why Node.js Crashes When being Closed? +====================================== + +Background +========== + +Some Javet users experience segfaults when using the Node.js mode. The segfaults occur when ``NodeRuntime`` is being closed. E.g. `issue #20 `_ and `issue #82 `_. + +Root Cause +========== + +The root cause is Node.js event loop is activated when Node.js is exiting. Let's see how ``NodeRuntime.close()`` works behind the scenes. + +1. Close all Node.js modules +2. Close all reference objects +3. Close all callback context objects +4. Close all V8 modules +5. Hand over the control to Node.js exiting process + +If the application registers interceptors, those interceptors will be closed at step 3. However, the corresponding JavaScript objects hasn't been recycled yet. So, at step 5, Node.js activates the event loop and async objects will get resolved or rejected. The callbacks land Javet which is not able to handle because the callback context objects are gone. That leads to memory corruption and segfaults. + +Can Javet address that? Yes, but that implies hacking Node.js event loop. People choose Javet Node.js mode mostly because it is a genuine Node.js. So, no, Javet does not perform such hack. + +Solution +======== + +Well, how to prevent that from happening? In fact, knowing how Javet works and following the Javet way, that won't happen. + +Event unhandledRejection +------------------------ + +Node.js provides a standard `solution `_. Application can listen to event ``unhandledRejection`` to prevent that event from hitting Javet so that the segfaults will not take place. + +.. code-block:: javascript + + import process from 'process'; + process.on('unhandledRejection', (reason, promise) => { + // Do whatever you want to do + }); + +NodeRuntime.await() +------------------- + +Application may call ``NodeRuntime.await()`` before closing the ``NodeRuntime``. This call explicitly tells ``NodeRuntime`` to activate the event loop. + +NodeRuntime.lowMemoryNotification() +----------------------------------- + +Application may call ``NodeRuntime.lowMemoryNotification()`` before closing the ``NodeRuntime``. This call forces ``NodeRuntime`` to perform garbage collection. During the garbage collection, the callbacks can be safely handled by Javet without segfaults. diff --git a/docs/genindex.html b/docs/genindex.html new file mode 100644 index 000000000..5caeb5d1c --- /dev/null +++ b/docs/genindex.html @@ -0,0 +1,309 @@ + + + + + + + Index - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +

    Index

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 355a811c3..f4dc23331 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,98 +1,480 @@ - - - - - - + + + + + - - - - Javet - An awesome way of embedding Node.js and V8 in Java - - - + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + - .container { - height: 100%; - padding: 0; - margin: 0; - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - align-items: center; - justify-content: center; - } + + + + - .row { - width: auto; - } - .title, - .subtitle, - .author, - .twitter { - width: 70%; - min-width: 700px; - text-align: left; - } - .title { - font-size: 3em; - font-weight: bold; - line-height: 200%; - } +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Javet¶

    +

    Maven Central Discord Donate Linux Build

    +

    Javet is Java + V8 (JAVa + V + EighT). It is an awesome way of embedding Node.js and V8 in Java.

    +

    If you like my work, please Star this project. And, you may follow me @sjtucaocao, or visit http://caoccao.blogspot.com/. And the official support channel is at discord.

    +

    💖 If you use Mac OS (x86_64), please be aware that the Mac OS (x86_64) build will discontinue anytime because my MacBook Air mid-2012 will be soon deprecated by new version of V8. Please donate to support me purchasing a new Mac OS (x86_64) device. Or, if you have a retired Mac OS (x86_64) device and are fine with mailing it to me, that will also be great. Thank you for supporting Javet.

    +

    💖 If you use Mac OS (arm64), unfortunately there is no Mac OS (arm64) build because I don't have any Mac OS (arm64) device. Please donate to support me purchasing a new Mac OS (arm64) device.

    +
    +
    +

    Major Features¶

    +
      +
    • Linux + Mac OS + ï¸Windows (x86_64)

    • +
    • Node.js v14.17.6 + V8 v9.3.345.16

    • +
    • Dynamic switch between Node.js and V8 mode

    • +
    • Polyfill V8 mode with Javenode

    • +
    • Exposure of the majority of V8 API in JVM

    • +
    • JavaScript and Java interop

    • +
    • Native BigInt and Date

    • +
    • Javet engine pool

    • +
    • Easy spring integration

    • +
    • Live debug with Chrome DevTools

    • +
    +
    +
    +

    Quick Start¶

    +
    +

    Dependency¶

    +
    +

    Maven¶

    +
    <!-- Linux or Windows -->
    +<dependency>
    +    <groupId>com.caoccao.javet</groupId>
    +    <artifactId>javet</artifactId>
    +    <version>0.9.12</version>
    +</dependency>
     
    -        .author {
    -            margin-top: 10%;
    -        }
    +<!-- Mac OS (x86_64 Only) -->
    +<dependency>
    +    <groupId>com.caoccao.javet</groupId>
    +    <artifactId>javet-macos</artifactId>
    +    <version>0.9.12</version>
    +</dependency>
    +
    +
    +
    +
    +

    Gradle Kotlin DSL¶

    +
    implementation("com.caoccao.javet:javet:0.9.12") // Linux or Windows
    +implementation("com.caoccao.javet:javet-macos:0.9.12") // Mac OS (x86_64 Only)
    +
    +
    +
    +
    +

    Gradle Groovy DSL¶

    +
    implementation 'com.caoccao.javet:javet:0.9.12' // Linux or Windows
    +implementation 'com.caoccao.javet:javet-macos:0.9.12' // Mac OS (x86_64 Only)
    +
    +
    +
    +
    +
    +

    Hello Javet¶

    +
    // Node.js Mode
    +try (V8Runtime v8Runtime = V8Host.getNodeInstance().createV8Runtime()) {
    +    System.out.println(v8Runtime.getExecutor("'Hello Javet'").executeString());
    +}
     
    -        .author,
    -        .twitter {
    -            font-size: 1.2em;
    -            line-height: 150%;
    -        }
    -    
    -
    +// V8 Mode
    +try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) {
    +    System.out.println(v8Runtime.getExecutor("'Hello Javet'").executeString());
    +}
    +
    +
    +
    +
    + + - - +
    +
    +
    - + +
    +
    + + + + + + \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..0f481303e --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,10 @@ +.. include:: ../README.rst + +.. toctree:: + :maxdepth: 2 + + tutorial/index + reference/index + release_notes/index + faq/index + development/index diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 000000000..2119f5109 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/publish.cmd b/docs/publish.cmd new file mode 100644 index 000000000..15857fd3d --- /dev/null +++ b/docs/publish.cmd @@ -0,0 +1,5 @@ +robocopy _build\html\_images _images /mir /nfl /ndl /njh /njs /nc /ns /np +robocopy _build\html\_sources _sources /mir /nfl /ndl /njh /njs /nc /ns /np +robocopy _build\html\_static _static /mir /nfl /ndl /njh /njs /nc /ns /np +robocopy ..\build\docs\javadoc reference\javadoc /mir /xf index.rst /nfl /ndl /njh /njs /nc /ns /np +robocopy _build\html .\ /e /xd _sources /xd _images /xd _static /xd javadoc /xf .buildinfo /xf objects.inv /nfl /ndl /njh /njs /nc /ns /np \ No newline at end of file diff --git a/docs/reference/best_practices.html b/docs/reference/best_practices.html new file mode 100644 index 000000000..891698f1f --- /dev/null +++ b/docs/reference/best_practices.html @@ -0,0 +1,405 @@ + + + + + + + + Best Practices - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Best Practices¶

    +
    +

    Thread, Engine and Pool¶

    +
      +
    • Always get 1 Javet engine from the pool in 1 thread.

    • +
    • If multiple context is required in 1 thread, there are 2 options.

      +
      +
        +
      • Call resetContext() between context switch.

      • +
      • Obtain multiple V8Runtime instances.

      • +
      +
      +
    • +
    • Do not pass Javet engine to other threads.

    • +
    • Always return Javet engine to pool in the end via try-with-resource or calling close() explicitly.

    • +
    • Subclass Javet engine pool and Javet engine to complete your customization. Indeed, they are open to full customization.

    • +
    +
    +
    +

    Resource Management¶

    +
      +
    • Dangling V8 objects will be forced to be recycled by Javet under the following scenarios and corresponding log will reflect that. Keeping an eye on the log helps address memory leak issues in the early stage.

      +
      +
        +
      • Engine is closed.

      • +
      • Pool is closed.

      • +
      • Context is reset.

      • +
      • Isolate is reset.

      • +
      +
      +
    • +
    • Always apply try-with-resource to Javet objects regardless of primitive or reference if they are not returned to Javet.

    • +
    • Always prohibit calling close() of Javet objects if they will be returned to Javet.

    • +
    • If the lifecycle of V8 objects is uncertain, calling setWeak() is the only way so that calling close() is no longer required. Be careful, calling close() after calling setWeak() may lead to V8 core dump immediately.

    • +
    • In performance sensitive scenarios, please explicitly acquire V8Locker.

    • +
    +
    +
    +

    Security¶

    +
      +
    • Malicious scripts are recommended to be executed in V8 mode or in vm module in Node.js mode.

    • +
    • eval can be disabled in Javet.

    • +
    • V8 0-day vulnerable issues most likely impact Node.js because the embedded V8 in Node.js is very old. It's recommended to use the V8 mode to minimize the risk.

    • +
    +
    +
    +

    Node.js¶

    +
      +
    • Modularize the code as much as possible so that performance is maximized.

    • +
    • Always register unhandled rejection event.

    • +
    • In non-module mode (similar to V8 in web browser), always put launch script in a dedicated folder whose parent folder contains node_modules and avoid require modules in the same folder.

    • +
    • In module mode (similar to V8 in Node.js), be aware that the execution result is a promise and the behavior is different from native Node.js runtime behavior unless await() is called.

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/best_practices.rst b/docs/reference/best_practices.rst index 4723c9f44..1d5377f8b 100644 --- a/docs/reference/best_practices.rst +++ b/docs/reference/best_practices.rst @@ -44,5 +44,3 @@ Node.js * Always register unhandled rejection event. * In **non-module** mode (similar to V8 in web browser), always put launch script in a dedicated folder whose parent folder contains ``node_modules`` and avoid ``require`` modules in the same folder. * In **module** mode (similar to V8 in Node.js), be aware that the execution result is a promise and the behavior is different from native Node.js runtime behavior unless ``await()`` is called. - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/error_codes.html b/docs/reference/error_codes.html new file mode 100644 index 000000000..f2a600d9b --- /dev/null +++ b/docs/reference/error_codes.html @@ -0,0 +1,525 @@ + + + + + + + + Error Codes - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Error Codes¶

    +
    +

    Why Error Codes?¶

    +

    Because Javet doesn't want to support i18n though both Node.js and V8 support i18n.

    +
      +
    • The final binary size will significantly increase with i18n.

    • +
    • There is no development resource for i18n.

    • +
    +
    +
    +

    Backward Compatibility¶

    +

    Once the error codes are released, they are likely not changed any more for backward compatibility.

    +

    The following error codes are generated automatically from the source code.

    +
    ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Code

    Type

    Name

    Format

    101

    System

    OSNotSupported

    OS ${OS} is not supported

    102

    System

    LibraryNotFound

    Javet library ${path} is not found

    103

    System

    LibraryNotLoaded

    Javet library is not loaded because ${reason}

    104

    System

    NotSupported

    ${feature} is not supported

    105

    System

    FailedToReadPath

    Failed to read ${path}

    201

    Compilation

    CompilationFailure

    ${message}

    301

    Execution

    ExecutionFailure

    ${message}

    302

    Execution

    ExecutionTerminated

    Execution is terminated and continuable is ${continuable}

    401

    Callback

    CallbackSignatureParameterSizeMismatch

    Callback signature mismatches: method name is ${methodName}, expected parameter size is ${expectedParameterSize}, actual parameter size is ${actualParameterSize}

    402

    Callback

    CallbackSignatureParameterTypeMismatch

    Callback signature mismatches: expected parameter type is ${expectedParameterType}, actual parameter type is ${actualParameterType}

    403

    Callback

    CallbackInjectionFailure

    Failed to inject runtime with error message ${message}

    404

    Callback

    CallbackRegistrationFailure

    Callback ${methodName} registration failed with error message ${message}

    405

    Callback

    CallbackMethodFailure

    Callback ${methodName} failed with error message ${message}

    406

    Callback

    CallbackUnknownFailure

    Callback failed with unknown error message ${message}

    407

    Callback

    CallbackUnregistrationFailure

    Callback ${methodName} unregistration failed with error message ${message}

    501

    Converter

    ConverterFailure

    Failed to convert values with error message ${message}

    502

    Converter

    ConverterCircularStructure

    Circular structure is detected with max depth ${maxDepth} reached

    503

    Converter

    ConverterSymbolNotBuiltIn

    ${symbol} is not a built-in symbol

    601

    Module

    ModuleNameEmpty

    Module name is empty

    602

    Module

    ModuleNotFound

    Module ${moduleName} is not found

    603

    Module

    ModulePermissionDenied

    Denied access to module ${moduleName}

    701

    Lock

    LockAcquisitionFailure

    Failed to acquire the lock

    702

    Lock

    LockReleaseFailure

    Failed to release the lock

    703

    Lock

    LockConflictThreadIdMismatch

    Runtime lock conflict is detected with locked thread ID ${lockedThreadID} and current thread ID ${currentThreadID}

    801

    Runtime

    RuntimeAlreadyClosed

    Runtime is already closed

    802

    Runtime

    RuntimeAlreadyRegistered

    Runtime is already registered

    803

    Runtime

    RuntimeNotRegistered

    Runtime is not registered

    804

    Runtime

    RuntimeLeakageDetected

    ${count} runtime(s) leakage is detected

    805

    Runtime

    RuntimeCloseFailure

    Failed to close the runtime with error message ${message}

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/error_codes.rst b/docs/reference/error_codes.rst index e2ecc84ad..ef61d1798 100644 --- a/docs/reference/error_codes.rst +++ b/docs/reference/error_codes.rst @@ -15,7 +15,7 @@ Backward Compatibility Once the error codes are released, they are likely not changed any more for backward compatibility. -The following error codes are generated automatically from `source code <../../src/main/java/com/caoccao/javet/exceptions/JavetError.java>`_. +The following error codes are generated automatically from the :extsource2:`source code <../../src/main/java/com/caoccao/javet/exceptions/JavetError.java>`. .. Error Codes Begin @@ -40,6 +40,7 @@ Code Type Name Format 407 Callback CallbackUnregistrationFailure Callback ${methodName} unregistration failed with error message ${message} 501 Converter ConverterFailure Failed to convert values with error message ${message} 502 Converter ConverterCircularStructure Circular structure is detected with max depth ${maxDepth} reached +503 Converter ConverterSymbolNotBuiltIn ${symbol} is not a built-in symbol 601 Module ModuleNameEmpty Module name is empty 602 Module ModuleNotFound Module ${moduleName} is not found 603 Module ModulePermissionDenied Denied access to module ${moduleName} @@ -56,5 +57,3 @@ Code Type Name Format .. Error Codes End - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 000000000..7d4abe617 --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,348 @@ + + + + + + + + Reference - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/index.rst b/docs/reference/index.rst index d1661f93f..ef03781b2 100644 --- a/docs/reference/index.rst +++ b/docs/reference/index.rst @@ -1,18 +1,21 @@ -=============== -Javet Reference -=============== +========= +Reference +========= -* `V8 Collection `_ -* `V8 Function `_ -* `V8 Promise `_ -* `Modularization `_ -* `Memory Management `_ -* `Lock `_ -* `Termination `_ -* `Logging `_ -* `Load and Unload `_ -* `Best Practices `_ -* `Performance `_ -* `Error Codes `_ +.. toctree:: + :maxdepth: 1 -[`Home <../../README.rst>`_] + javadoc/index + v8_collection + v8_function + v8_promise + modularization + memory_management + lock + termination + logging + load_and_unload + best_practices + performance + error_codes + todo_list diff --git a/docs/reference/javadoc/allclasses-frame.html b/docs/reference/javadoc/allclasses-frame.html new file mode 100644 index 000000000..41e443814 --- /dev/null +++ b/docs/reference/javadoc/allclasses-frame.html @@ -0,0 +1,174 @@ + + + + + +All Classes (javet 0.9.12 API) + + + + +

    All Classes

    +
    + +
    + + diff --git a/docs/reference/javadoc/allclasses-noframe.html b/docs/reference/javadoc/allclasses-noframe.html new file mode 100644 index 000000000..c699d4158 --- /dev/null +++ b/docs/reference/javadoc/allclasses-noframe.html @@ -0,0 +1,174 @@ + + + + + +All Classes (javet 0.9.12 API) + + + + +

    All Classes

    +
    + +
    + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/CheckReturnValue.html b/docs/reference/javadoc/com/caoccao/javet/annotations/CheckReturnValue.html new file mode 100644 index 000000000..279c22b88 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/CheckReturnValue.html @@ -0,0 +1,169 @@ + + + + + +CheckReturnValue (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.annotations
    +

    Annotation Type CheckReturnValue

    +
    +
    +
    +
      +
    • +
      +
      +
      @Documented
      + @Target(value={METHOD,CONSTRUCTOR,TYPE,PACKAGE})
      + @Retention(value=SOURCE)
      +public @interface CheckReturnValue
      +
      This annotation is for IDE to warn application developers to consume the return value. + Memory leak may occur if the return value is not consumed.
      +
      +
      Since:
      +
      0.8.10
      +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/NodeModule.html b/docs/reference/javadoc/com/caoccao/javet/annotations/NodeModule.html new file mode 100644 index 000000000..21ace0ccf --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/NodeModule.html @@ -0,0 +1,229 @@ + + + + + +NodeModule (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.annotations
    +

    Annotation Type NodeModule

    +
    +
    +
    +
      +
    • +
      +
      +
      @Documented
      + @Target(value=TYPE)
      + @Retention(value=RUNTIME)
      +public @interface NodeModule
      +
      The annotation Node module.
      +
      +
      Since:
      +
      0.8.1
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Optional Element Summary

        + + + + + + + + + + +
        Optional Elements 
        Modifier and TypeOptional Element and Description
        java.lang.Stringname +
        Name string.
        +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Element Detail

        + + + +
          +
        • +

          name

          +
          public abstract java.lang.String name
          +
          Name string.
          +
          +
          Returns:
          +
          the string
          +
          Since:
          +
          0.8.1
          +
          +
          +
          Default:
          +
          ""
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/V8BindEnabler.html b/docs/reference/javadoc/com/caoccao/javet/annotations/V8BindEnabler.html new file mode 100644 index 000000000..cef36fd16 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/V8BindEnabler.html @@ -0,0 +1,168 @@ + + + + + +V8BindEnabler (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.annotations
    +

    Annotation Type V8BindEnabler

    +
    +
    +
    +
      +
    • +
      +
      +
      @Documented
      + @Target(value=METHOD)
      + @Retention(value=RUNTIME)
      +public @interface V8BindEnabler
      +
      The interface V8 bind config is for determining whether certain injection is enabled or not.
      +
      +
      Since:
      +
      0.9.3
      +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/V8Function.html b/docs/reference/javadoc/com/caoccao/javet/annotations/V8Function.html new file mode 100644 index 000000000..1b6434e29 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/V8Function.html @@ -0,0 +1,258 @@ + + + + + +V8Function (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.annotations
    +

    Annotation Type V8Function

    +
    +
    +
    +
      +
    • +
      +
      +
      @Documented
      + @Target(value=METHOD)
      + @Retention(value=RUNTIME)
      +public @interface V8Function
      +
      The annotation V8 function is for auto-registering JS function interception.
      +
      +
      Since:
      +
      0.8.1
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Optional Element Summary

        + + + + + + + + + + + + + + +
        Optional Elements 
        Modifier and TypeOptional Element and Description
        java.lang.Stringname +
        JS function name.
        +
        booleanthisObjectRequired +
        This object required.
        +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Element Detail

        + + + +
          +
        • +

          name

          +
          public abstract java.lang.String name
          +
          JS function name.
          +
          +
          Returns:
          +
          the name of the JS function to be injected
          +
          Since:
          +
          0.8.1
          +
          +
          +
          Default:
          +
          ""
          +
          +
        • +
        +
      • +
      +
        +
      • + + +
          +
        • +

          thisObjectRequired

          +
          public abstract boolean thisObjectRequired
          +
          This object required.
          +
          +
          Returns:
          +
          true: this object is required, false: this object is ignored
          +
          Since:
          +
          0.9.0
          +
          +
          +
          Default:
          +
          false
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/V8Property.html b/docs/reference/javadoc/com/caoccao/javet/annotations/V8Property.html new file mode 100644 index 000000000..4719a83e9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/V8Property.html @@ -0,0 +1,287 @@ + + + + + +V8Property (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.annotations
    +

    Annotation Type V8Property

    +
    +
    +
    +
      +
    • +
      +
      +
      @Documented
      + @Target(value=METHOD)
      + @Retention(value=RUNTIME)
      +public @interface V8Property
      +
      The interface V8 property is for auto-registering JS property interception.
      +
      +
      Since:
      +
      0.9.0
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Optional Element Summary

        + + + + + + + + + + + + + + + + + + +
        Optional Elements 
        Modifier and TypeOptional Element and Description
        java.lang.Stringname +
        JS property name.
        +
        V8ValueSymbolTypesymbolType +
        Symbol V8 value symbol type.
        +
        booleanthisObjectRequired +
        This object required.
        +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Element Detail

        + + + +
          +
        • +

          name

          +
          public abstract java.lang.String name
          +
          JS property name.
          +
          +
          Returns:
          +
          the name of the JS property to be injected
          +
          Since:
          +
          0.9.0
          +
          +
          +
          Default:
          +
          ""
          +
          +
        • +
        +
      • +
      +
        +
      • + + +
          +
        • +

          symbolType

          +
          public abstract V8ValueSymbolType symbolType
          +
          Symbol V8 value symbol type.
          +
          +
          Returns:
          +
          the V8 value symbol type
          +
          Since:
          +
          0.9.11
          +
          +
          +
          Default:
          +
          com.caoccao.javet.enums.V8ValueSymbolType.None
          +
          +
        • +
        +
      • +
      +
        +
      • + + +
          +
        • +

          thisObjectRequired

          +
          public abstract boolean thisObjectRequired
          +
          This object required.
          +
          +
          Returns:
          +
          true : this object is required, false: this object is ignored
          +
          Since:
          +
          0.9.0
          +
          +
          +
          Default:
          +
          false
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/V8RuntimeSetter.html b/docs/reference/javadoc/com/caoccao/javet/annotations/V8RuntimeSetter.html new file mode 100644 index 000000000..929761e00 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/V8RuntimeSetter.html @@ -0,0 +1,168 @@ + + + + + +V8RuntimeSetter (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.annotations
    +

    Annotation Type V8RuntimeSetter

    +
    +
    +
    +
      +
    • +
      +
      +
      @Documented
      + @Target(value=METHOD)
      + @Retention(value=RUNTIME)
      +public @interface V8RuntimeSetter
      +
      The interface V8 runtime setter.
      +
      +
      Since:
      +
      0.8.1
      +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/annotations/package-frame.html new file mode 100644 index 000000000..bb9269392 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/package-frame.html @@ -0,0 +1,24 @@ + + + + + +com.caoccao.javet.annotations (javet 0.9.12 API) + + + + +

    com.caoccao.javet.annotations

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/annotations/package-summary.html new file mode 100644 index 000000000..fca54d0b4 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/package-summary.html @@ -0,0 +1,184 @@ + + + + + +com.caoccao.javet.annotations (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.annotations

    +
    +
    Annotations classes for declarative coding and IDE intellisense.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Annotation Types Summary 
      Annotation TypeDescription
      CheckReturnValue +
      This annotation is for IDE to warn application developers to consume the return value.
      +
      NodeModule +
      The annotation Node module.
      +
      V8BindEnabler +
      The interface V8 bind config is for determining whether certain injection is enabled or not.
      +
      V8Function +
      The annotation V8 function is for auto-registering JS function interception.
      +
      V8Property +
      The interface V8 property is for auto-registering JS property interception.
      +
      V8RuntimeSetter +
      The interface V8 runtime setter.
      +
      +
    • +
    + + + +

    Package com.caoccao.javet.annotations Description

    +
    Annotations classes for declarative coding and IDE intellisense.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/annotations/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/annotations/package-tree.html new file mode 100644 index 000000000..3c3da7bd9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/annotations/package-tree.html @@ -0,0 +1,135 @@ + + + + + +com.caoccao.javet.annotations Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.annotations

    +Package Hierarchies: + +
    +
    +

    Annotation Type Hierarchy

    +
      +
    • com.caoccao.javet.annotations.V8Property (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.V8RuntimeSetter (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.CheckReturnValue (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.V8BindEnabler (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.NodeModule (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.V8Function (implements java.lang.annotation.Annotation)
    • +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityFunction.html b/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityFunction.html new file mode 100644 index 000000000..eee754dfe --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityFunction.html @@ -0,0 +1,449 @@ + + + + + +JavetEntityFunction (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.entities
    +

    Class JavetEntityFunction

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.entities.JavetEntityFunction
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetEntityFunction
      +
      +
      +
      +
      public class JavetEntityFunction
      +extends java.lang.Object
      +implements IJavetEntityFunction
      +
      The type Javet entity function is for converting JS function + to or from Java object.
      +
      +
      Since:
      +
      0.9.4
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected JSFunctionTypejsFunctionType +
        The JS function type.
        +
        protected java.lang.StringsourceCode +
        The Source code.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetEntityFunction() +
        Instantiates a new Javet entity function.
        +
        JavetEntityFunction(java.lang.String sourceCode) +
        Instantiates a new Javet entity function.
        +
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          jsFunctionType

          +
          protected JSFunctionType jsFunctionType
          +
          The JS function type.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          sourceCode

          +
          protected java.lang.String sourceCode
          +
          The Source code.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetEntityFunction

          +
          public JavetEntityFunction()
          +
          Instantiates a new Javet entity function.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          JavetEntityFunction

          +
          public JavetEntityFunction(java.lang.String sourceCode)
          +
          Instantiates a new Javet entity function.
          +
          +
          Parameters:
          +
          sourceCode - the source code
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityMap.html b/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityMap.html new file mode 100644 index 000000000..29e681472 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntityMap.html @@ -0,0 +1,411 @@ + + + + + +JavetEntityMap (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.entities
    +

    Class JavetEntityMap

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.util.AbstractMap<K,V>
      • +
      • +
          +
        • java.util.HashMap<java.lang.String,java.lang.Object>
        • +
        • +
            +
          • com.caoccao.javet.entities.JavetEntityMap
          • +
          +
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetEntityMap, java.io.Serializable, java.lang.Cloneable, java.util.Map<java.lang.String,java.lang.Object>
      +
      +
      +
      +
      public class JavetEntityMap
      +extends java.util.HashMap<java.lang.String,java.lang.Object>
      +implements IJavetEntityMap
      +
      The type Javet entity map is for converting JS map + to or from Java map.
      +
      +
      Since:
      +
      0.7.2
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Nested Class Summary

        +
          +
        • + + +

          Nested classes/interfaces inherited from class java.util.AbstractMap

          +java.util.AbstractMap.SimpleEntry<K,V>, java.util.AbstractMap.SimpleImmutableEntry<K,V>
        • +
        +
          +
        • + + +

          Nested classes/interfaces inherited from interface java.util.Map

          +java.util.Map.Entry<K,V>
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetEntityMap() +
        Instantiates a new Javet entity map.
        +
        JavetEntityMap(int initialCapacity) +
        Instantiates a new Javet entity map.
        +
        JavetEntityMap(int initialCapacity, + float loadFactor) +
        Instantiates a new Javet entity map.
        +
        JavetEntityMap(java.util.Map<? extends java.lang.String,?> m) +
        Instantiates a new Javet entity map.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        java.lang.Objectclone() 
        +
          +
        • + + +

          Methods inherited from class java.util.HashMap

          +clear, compute, computeIfAbsent, computeIfPresent, containsKey, containsValue, entrySet, forEach, get, getOrDefault, isEmpty, keySet, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size, values
        • +
        +
          +
        • + + +

          Methods inherited from class java.util.AbstractMap

          +equals, hashCode, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +finalize, getClass, notify, notifyAll, wait, wait, wait
        • +
        +
          +
        • + + +

          Methods inherited from interface java.util.Map

          +clear, compute, computeIfAbsent, computeIfPresent, containsKey, containsValue, entrySet, equals, forEach, get, getOrDefault, hashCode, isEmpty, keySet, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size, values
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetEntityMap

          +
          public JavetEntityMap(int initialCapacity,
          +                      float loadFactor)
          +
          Instantiates a new Javet entity map.
          +
          +
          Parameters:
          +
          initialCapacity - the initial capacity
          +
          loadFactor - the load factor
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        + + + +
          +
        • +

          JavetEntityMap

          +
          public JavetEntityMap(int initialCapacity)
          +
          Instantiates a new Javet entity map.
          +
          +
          Parameters:
          +
          initialCapacity - the initial capacity
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        + + + +
          +
        • +

          JavetEntityMap

          +
          public JavetEntityMap()
          +
          Instantiates a new Javet entity map.
          +
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        + + + +
          +
        • +

          JavetEntityMap

          +
          public JavetEntityMap(java.util.Map<? extends java.lang.String,?> m)
          +
          Instantiates a new Javet entity map.
          +
          +
          Parameters:
          +
          m - the m
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          clone

          +
          public java.lang.Object clone()
          +
          +
          Overrides:
          +
          clone in class java.util.HashMap<java.lang.String,java.lang.Object>
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntitySymbol.html b/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntitySymbol.html new file mode 100644 index 000000000..4e8d5c08c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/entities/JavetEntitySymbol.html @@ -0,0 +1,335 @@ + + + + + +JavetEntitySymbol (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.entities
    +

    Class JavetEntitySymbol

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.entities.JavetEntitySymbol
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class JavetEntitySymbol
      +extends java.lang.Object
      +
      The type Javet entity symbol is for converting JS symbol + to or from Java symbol.
      +
      +
      Since:
      +
      0.9.11
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected java.lang.Stringdescription +
        The Description.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetEntitySymbol(java.lang.String description) +
        Instantiates a new Javet entity symbol.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        java.lang.StringgetDescription() +
        Gets description.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          description

          +
          protected java.lang.String description
          +
          The Description.
          +
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetEntitySymbol

          +
          public JavetEntitySymbol(java.lang.String description)
          +
          Instantiates a new Javet entity symbol.
          +
          +
          Parameters:
          +
          description - the description
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getDescription

          +
          public java.lang.String getDescription()
          +
          Gets description.
          +
          +
          Returns:
          +
          the description
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/entities/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/entities/package-frame.html new file mode 100644 index 000000000..d8e469a1f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/entities/package-frame.html @@ -0,0 +1,21 @@ + + + + + +com.caoccao.javet.entities (javet 0.9.12 API) + + + + +

    com.caoccao.javet.entities

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/entities/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/entities/package-summary.html new file mode 100644 index 000000000..1c561f43f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/entities/package-summary.html @@ -0,0 +1,169 @@ + + + + + +com.caoccao.javet.entities (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.entities

    +
    +
    Built-in entities for default object conversion.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      JavetEntityFunction +
      The type Javet entity function is for converting JS function + to or from Java object.
      +
      JavetEntityMap +
      The type Javet entity map is for converting JS map + to or from Java map.
      +
      JavetEntitySymbol +
      The type Javet entity symbol is for converting JS symbol + to or from Java symbol.
      +
      +
    • +
    + + + +

    Package com.caoccao.javet.entities Description

    +
    Built-in entities for default object conversion.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/entities/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/entities/package-tree.html new file mode 100644 index 000000000..be2c8e8df --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/entities/package-tree.html @@ -0,0 +1,144 @@ + + + + + +com.caoccao.javet.entities Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.entities

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    +
      +
    • java.lang.Object +
        +
      • java.util.AbstractMap<K,V> (implements java.util.Map<K,V>) +
          +
        • java.util.HashMap<K,V> (implements java.lang.Cloneable, java.util.Map<K,V>, java.io.Serializable) + +
        • +
        +
      • +
      • com.caoccao.javet.entities.JavetEntityFunction (implements com.caoccao.javet.interfaces.IJavetEntityFunction)
      • +
      • com.caoccao.javet.entities.JavetEntitySymbol
      • +
      +
    • +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/JSFunctionType.html b/docs/reference/javadoc/com/caoccao/javet/enums/JSFunctionType.html new file mode 100644 index 000000000..e2c1d8d1a --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/JSFunctionType.html @@ -0,0 +1,440 @@ + + + + + +JSFunctionType (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.enums
    +

    Enum JSFunctionType

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<JSFunctionType>
      • +
      • +
          +
        • com.caoccao.javet.enums.JSFunctionType
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, java.lang.Comparable<JSFunctionType>
      +
      +
      +
      +
      public enum JSFunctionType
      +extends java.lang.Enum<JSFunctionType>
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        intgetId() 
        java.lang.StringgetName() 
        booleanisAPI() 
        booleanisNative() 
        booleanisUserDefined() 
        static JSFunctionTypeparse(int id) 
        static JSFunctionTypevalueOf(java.lang.String name) +
        Returns the enum constant of this type with the specified name.
        +
        static JSFunctionType[]values() +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          values

          +
          public static JSFunctionType[] values()
          +
          Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
          +for (JSFunctionType c : JSFunctionType.values())
          +    System.out.println(c);
          +
          +
          +
          Returns:
          +
          an array containing the constants of this enum type, in the order they are declared
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static JSFunctionType valueOf(java.lang.String name)
          +
          Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
          +
          +
          Parameters:
          +
          name - the name of the enum constant to be returned.
          +
          Returns:
          +
          the enum constant with the specified name
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
          +
          java.lang.NullPointerException - if the argument is null
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getId

          +
          public int getId()
          +
        • +
        + + + +
          +
        • +

          getName

          +
          public java.lang.String getName()
          +
        • +
        + + + +
          +
        • +

          isAPI

          +
          public boolean isAPI()
          +
        • +
        + + + +
          +
        • +

          isNative

          +
          public boolean isNative()
          +
        • +
        + + + +
          +
        • +

          isUserDefined

          +
          public boolean isUserDefined()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/JSRuntimeType.html b/docs/reference/javadoc/com/caoccao/javet/enums/JSRuntimeType.html new file mode 100644 index 000000000..d9e881f44 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/JSRuntimeType.html @@ -0,0 +1,390 @@ + + + + + +JSRuntimeType (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.enums
    +

    Enum JSRuntimeType

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<JSRuntimeType>
      • +
      • +
          +
        • com.caoccao.javet.enums.JSRuntimeType
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, java.lang.Comparable<JSRuntimeType>
      +
      +
      +
      +
      public enum JSRuntimeType
      +extends java.lang.Enum<JSRuntimeType>
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Enum Constant Summary

        + + + + + + + + + + + +
        Enum Constants 
        Enum Constant and Description
        Node 
        V8 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        java.lang.StringgetName() 
        java.lang.StringgetVersion() 
        booleanisNode() 
        booleanisV8() 
        static JSRuntimeTypevalueOf(java.lang.String name) +
        Returns the enum constant of this type with the specified name.
        +
        static JSRuntimeType[]values() +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          values

          +
          public static JSRuntimeType[] values()
          +
          Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
          +for (JSRuntimeType c : JSRuntimeType.values())
          +    System.out.println(c);
          +
          +
          +
          Returns:
          +
          an array containing the constants of this enum type, in the order they are declared
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static JSRuntimeType valueOf(java.lang.String name)
          +
          Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
          +
          +
          Parameters:
          +
          name - the name of the enum constant to be returned.
          +
          Returns:
          +
          the enum constant with the specified name
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
          +
          java.lang.NullPointerException - if the argument is null
          +
          +
        • +
        + + + +
          +
        • +

          getName

          +
          public java.lang.String getName()
          +
        • +
        + + + +
          +
        • +

          getVersion

          +
          public java.lang.String getVersion()
          +
        • +
        + + + +
          +
        • +

          isNode

          +
          public boolean isNode()
          +
        • +
        + + + +
          +
        • +

          isV8

          +
          public boolean isV8()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/JSScopeType.html b/docs/reference/javadoc/com/caoccao/javet/enums/JSScopeType.html new file mode 100644 index 000000000..1af876953 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/JSScopeType.html @@ -0,0 +1,565 @@ + + + + + +JSScopeType (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.enums
    +

    Enum JSScopeType

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<JSScopeType>
      • +
      • +
          +
        • com.caoccao.javet.enums.JSScopeType
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, java.lang.Comparable<JSScopeType>
      +
      +
      +
      +
      public enum JSScopeType
      +extends java.lang.Enum<JSScopeType>
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        intgetId() 
        java.lang.StringgetName() 
        booleanisBlock() 
        booleanisCatch() 
        booleanisClass() 
        booleanisEval() 
        booleanisFunction() 
        booleanisModule() 
        booleanisScript() 
        booleanisWith() 
        static JSScopeTypeparse(int id) 
        static JSScopeTypevalueOf(java.lang.String name) +
        Returns the enum constant of this type with the specified name.
        +
        static JSScopeType[]values() +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          values

          +
          public static JSScopeType[] values()
          +
          Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
          +for (JSScopeType c : JSScopeType.values())
          +    System.out.println(c);
          +
          +
          +
          Returns:
          +
          an array containing the constants of this enum type, in the order they are declared
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static JSScopeType valueOf(java.lang.String name)
          +
          Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
          +
          +
          Parameters:
          +
          name - the name of the enum constant to be returned.
          +
          Returns:
          +
          the enum constant with the specified name
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
          +
          java.lang.NullPointerException - if the argument is null
          +
          +
        • +
        + + + +
          +
        • +

          parse

          +
          public static JSScopeType parse(int id)
          +
        • +
        + + + +
          +
        • +

          getId

          +
          public int getId()
          +
        • +
        + + + +
          +
        • +

          getName

          +
          public java.lang.String getName()
          +
        • +
        + + + +
          +
        • +

          isBlock

          +
          public boolean isBlock()
          +
        • +
        + + + +
          +
        • +

          isCatch

          +
          public boolean isCatch()
          +
        • +
        + + + +
          +
        • +

          isClass

          +
          public boolean isClass()
          +
        • +
        + + + +
          +
        • +

          isEval

          +
          public boolean isEval()
          +
        • +
        + + + +
          +
        • +

          isFunction

          +
          public boolean isFunction()
          +
        • +
        + + + +
          +
        • +

          isModule

          +
          public boolean isModule()
          +
        • +
        + + + +
          +
        • +

          isScript

          +
          public boolean isScript()
          +
        • +
        + + + +
          +
        • +

          isWith

          +
          public boolean isWith()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/JavetErrorType.html b/docs/reference/javadoc/com/caoccao/javet/enums/JavetErrorType.html new file mode 100644 index 000000000..f22b11064 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/JavetErrorType.html @@ -0,0 +1,471 @@ + + + + + +JavetErrorType (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.enums
    +

    Enum JavetErrorType

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<JavetErrorType>
      • +
      • +
          +
        • com.caoccao.javet.enums.JavetErrorType
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, java.lang.Comparable<JavetErrorType>
      +
      +
      +
      +
      public enum JavetErrorType
      +extends java.lang.Enum<JavetErrorType>
      +
      The enum Javet error type is for categorizing the errors.
      +
      +
      Since:
      +
      0.8.5
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Enum Constant Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Enum Constants 
        Enum Constant and Description
        Callback +
        Callback javet error type.
        +
        Compilation +
        Compilation javet error type.
        +
        Converter +
        Converter javet error type.
        +
        Execution +
        Execution javet error type.
        +
        Lock +
        Lock javet error type.
        +
        Module +
        Module javet error type.
        +
        Runtime +
        Runtime javet error type.
        +
        System +
        System javet error type.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static JavetErrorTypevalueOf(java.lang.String name) +
        Returns the enum constant of this type with the specified name.
        +
        static JavetErrorType[]values() +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Enum Constant Detail

        + + + +
          +
        • +

          System

          +
          public static final JavetErrorType System
          +
          System javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          Compilation

          +
          public static final JavetErrorType Compilation
          +
          Compilation javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          Execution

          +
          public static final JavetErrorType Execution
          +
          Execution javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          Callback

          +
          public static final JavetErrorType Callback
          +
          Callback javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          Converter

          +
          public static final JavetErrorType Converter
          +
          Converter javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          Module

          +
          public static final JavetErrorType Module
          +
          Module javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          Lock

          +
          public static final JavetErrorType Lock
          +
          Lock javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          Runtime

          +
          public static final JavetErrorType Runtime
          +
          Runtime javet error type.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          values

          +
          public static JavetErrorType[] values()
          +
          Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
          +for (JavetErrorType c : JavetErrorType.values())
          +    System.out.println(c);
          +
          +
          +
          Returns:
          +
          an array containing the constants of this enum type, in the order they are declared
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static JavetErrorType valueOf(java.lang.String name)
          +
          Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
          +
          +
          Parameters:
          +
          name - the name of the enum constant to be returned.
          +
          Returns:
          +
          the enum constant with the specified name
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
          +
          java.lang.NullPointerException - if the argument is null
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/JavetPromiseRejectEvent.html b/docs/reference/javadoc/com/caoccao/javet/enums/JavetPromiseRejectEvent.html new file mode 100644 index 000000000..e465602ce --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/JavetPromiseRejectEvent.html @@ -0,0 +1,437 @@ + + + + + +JavetPromiseRejectEvent (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.enums
    +

    Enum JavetPromiseRejectEvent

    +
    +
    +
      +
    • java.lang.Object
    • +
    • + +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, java.lang.Comparable<JavetPromiseRejectEvent>
      +
      +
      +
      +
      public enum JavetPromiseRejectEvent
      +extends java.lang.Enum<JavetPromiseRejectEvent>
      +
      The enum Javet promise reject event represents the corresponding event in V8.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Enum Constant Detail

        + + + +
          +
        • +

          PromiseRejectWithNoHandler

          +
          public static final JavetPromiseRejectEvent PromiseRejectWithNoHandler
          +
          PromiseRejectWithNoHandler.
          +
        • +
        + + + +
          +
        • +

          PromiseHandlerAddedAfterReject

          +
          public static final JavetPromiseRejectEvent PromiseHandlerAddedAfterReject
          +
          PromiseHandlerAddedAfterReject.
          +
        • +
        + + + +
          +
        • +

          PromiseResolveAfterResolved

          +
          public static final JavetPromiseRejectEvent PromiseResolveAfterResolved
          +
          PromiseResolveAfterResolved.
          +
        • +
        + + + +
          +
        • +

          PromiseRejectAfterResolved

          +
          public static final JavetPromiseRejectEvent PromiseRejectAfterResolved
          +
          PromiseRejectAfterResolved.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          values

          +
          public static JavetPromiseRejectEvent[] values()
          +
          Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
          +for (JavetPromiseRejectEvent c : JavetPromiseRejectEvent.values())
          +    System.out.println(c);
          +
          +
          +
          Returns:
          +
          an array containing the constants of this enum type, in the order they are declared
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static JavetPromiseRejectEvent valueOf(java.lang.String name)
          +
          Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
          +
          +
          Parameters:
          +
          name - the name of the enum constant to be returned.
          +
          Returns:
          +
          the enum constant with the specified name
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
          +
          java.lang.NullPointerException - if the argument is null
          +
          +
        • +
        + + + +
          +
        • +

          parse

          +
          public static JavetPromiseRejectEvent parse(int code)
          +
          Parse javet promise reject event by code.
          +
          +
          Parameters:
          +
          code - the event code
          +
          Returns:
          +
          the javet promise reject event
          +
          +
        • +
        + + + +
          +
        • +

          getCode

          +
          public int getCode()
          +
          Gets event code.
          +
          +
          Returns:
          +
          the event code
          +
          +
        • +
        + + + +
          +
        • +

          getName

          +
          public java.lang.String getName()
          +
          Gets event name.
          +
          +
          Returns:
          +
          the event name
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/V8ValueReferenceType.html b/docs/reference/javadoc/com/caoccao/javet/enums/V8ValueReferenceType.html new file mode 100644 index 000000000..f597ea8eb --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/V8ValueReferenceType.html @@ -0,0 +1,737 @@ + + + + + +V8ValueReferenceType (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.enums
    +

    Enum V8ValueReferenceType

    +
    +
    +
      +
    • java.lang.Object
    • +
    • + +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/V8ValueSymbolType.html b/docs/reference/javadoc/com/caoccao/javet/enums/V8ValueSymbolType.html new file mode 100644 index 000000000..4c2109b73 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/V8ValueSymbolType.html @@ -0,0 +1,350 @@ + + + + + +V8ValueSymbolType (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.enums
    +

    Enum V8ValueSymbolType

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Enum<V8ValueSymbolType>
      • +
      • +
          +
        • com.caoccao.javet.enums.V8ValueSymbolType
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, java.lang.Comparable<V8ValueSymbolType>
      +
      +
      +
      +
      public enum V8ValueSymbolType
      +extends java.lang.Enum<V8ValueSymbolType>
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Enum Constant Summary

        + + + + + + + + + + + + + + +
        Enum Constants 
        Enum Constant and Description
        BuiltIn 
        Custom 
        None 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static V8ValueSymbolTypevalueOf(java.lang.String name) +
        Returns the enum constant of this type with the specified name.
        +
        static V8ValueSymbolType[]values() +
        Returns an array containing the constants of this enum type, in +the order they are declared.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Enum

          +clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +getClass, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          values

          +
          public static V8ValueSymbolType[] values()
          +
          Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
          +for (V8ValueSymbolType c : V8ValueSymbolType.values())
          +    System.out.println(c);
          +
          +
          +
          Returns:
          +
          an array containing the constants of this enum type, in the order they are declared
          +
          +
        • +
        + + + +
          +
        • +

          valueOf

          +
          public static V8ValueSymbolType valueOf(java.lang.String name)
          +
          Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.)
          +
          +
          Parameters:
          +
          name - the name of the enum constant to be returned.
          +
          Returns:
          +
          the enum constant with the specified name
          +
          Throws:
          +
          java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
          +
          java.lang.NullPointerException - if the argument is null
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/enums/package-frame.html new file mode 100644 index 000000000..94ab68292 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/package-frame.html @@ -0,0 +1,25 @@ + + + + + +com.caoccao.javet.enums (javet 0.9.12 API) + + + + +

    com.caoccao.javet.enums

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/enums/package-summary.html new file mode 100644 index 000000000..b7e4f9ea5 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/package-summary.html @@ -0,0 +1,180 @@ + + + + + +com.caoccao.javet.enums (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.enums

    +
    +
    Enums for various API.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.enums Description

    +
    Enums for various API.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/enums/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/enums/package-tree.html new file mode 100644 index 000000000..ad29966d7 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/enums/package-tree.html @@ -0,0 +1,144 @@ + + + + + +com.caoccao.javet.enums Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.enums

    +Package Hierarchies: + +
    +
    +

    Enum Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/BaseJavetScriptingException.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/BaseJavetScriptingException.html new file mode 100644 index 000000000..da21bcd5b --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/BaseJavetScriptingException.html @@ -0,0 +1,370 @@ + + + + + +BaseJavetScriptingException (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class BaseJavetScriptingException

    +
    +
    + +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + +
        Constructors 
        ModifierConstructor and Description
        protected BaseJavetScriptingException(JavetError error, + java.lang.String message, + java.lang.String resourceName, + java.lang.String sourceLine, + int lineNumber, + int startColumn, + int endColumn, + int startPosition, + int endPosition) 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        JavetScriptingErrorgetScriptingError() 
        + +
          +
        • + + +

          Methods inherited from class java.lang.Throwable

          +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BaseJavetScriptingException

          +
          protected BaseJavetScriptingException(JavetError error,
          +                                      java.lang.String message,
          +                                      java.lang.String resourceName,
          +                                      java.lang.String sourceLine,
          +                                      int lineNumber,
          +                                      int startColumn,
          +                                      int endColumn,
          +                                      int startPosition,
          +                                      int endPosition)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetCompilationException.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetCompilationException.html new file mode 100644 index 000000000..e98c99e51 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetCompilationException.html @@ -0,0 +1,319 @@ + + + + + +JavetCompilationException (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class JavetCompilationException

    +
    +
    + +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetCompilationException(java.lang.String message, + java.lang.String resourceName, + java.lang.String sourceLine, + int lineNumber, + int startColumn, + int endColumn, + int startPosition, + int endPosition) 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + +
          +
        • + + +

          Methods inherited from class java.lang.Throwable

          +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetCompilationException

          +
          public JavetCompilationException(java.lang.String message,
          +                                 java.lang.String resourceName,
          +                                 java.lang.String sourceLine,
          +                                 int lineNumber,
          +                                 int startColumn,
          +                                 int endColumn,
          +                                 int startPosition,
          +                                 int endPosition)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetConverterException.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetConverterException.html new file mode 100644 index 000000000..0b17665e3 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetConverterException.html @@ -0,0 +1,362 @@ + + + + + +JavetConverterException (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class JavetConverterException

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable
      +
      +
      +
      +
      public class JavetConverterException
      +extends JavetException
      +
      The type Javet converter exception is for JNI.
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + + + + +
        Constructors 
        ModifierConstructor and Description
        protected JavetConverterException(JavetError error, + java.util.Map<java.lang.String,java.lang.Object> parameters) +
        Instantiates a new Javet converter exception.
        +
         JavetConverterException(java.lang.String message) +
        Instantiates a new Javet converter exception.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static JavetConverterExceptioncircularStructure(int maxDepth) +
        Circular structure.
        +
        + +
          +
        • + + +

          Methods inherited from class java.lang.Throwable

          +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetConverterException

          +
          protected JavetConverterException(JavetError error,
          +                                  java.util.Map<java.lang.String,java.lang.Object> parameters)
          +
          Instantiates a new Javet converter exception.
          +
          +
          Parameters:
          +
          error - the error
          +
          parameters - the parameters
          +
          +
        • +
        + + + +
          +
        • +

          JavetConverterException

          +
          public JavetConverterException(java.lang.String message)
          +
          Instantiates a new Javet converter exception.
          +
          +
          Parameters:
          +
          message - the message
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          circularStructure

          +
          public static JavetConverterException circularStructure(int maxDepth)
          +
          Circular structure.
          +
          +
          Parameters:
          +
          maxDepth - the max depth
          +
          Returns:
          +
          the javet converter exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetError.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetError.html new file mode 100644 index 000000000..16d3851f7 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetError.html @@ -0,0 +1,1103 @@ + + + + + +JavetError (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class JavetError

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.exceptions.JavetError
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class JavetError
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          PARAMETER_EXPECTED_PARAMETER_TYPE

          +
          public static final java.lang.String PARAMETER_EXPECTED_PARAMETER_TYPE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_ACTUAL_PARAMETER_TYPE

          +
          public static final java.lang.String PARAMETER_ACTUAL_PARAMETER_TYPE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_METHOD_NAME

          +
          public static final java.lang.String PARAMETER_METHOD_NAME
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_EXPECTED_PARAMETER_SIZE

          +
          public static final java.lang.String PARAMETER_EXPECTED_PARAMETER_SIZE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_ACTUAL_PARAMETER_SIZE

          +
          public static final java.lang.String PARAMETER_ACTUAL_PARAMETER_SIZE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_RESOURCE_NAME

          +
          public static final java.lang.String PARAMETER_RESOURCE_NAME
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_SOURCE_LINE

          +
          public static final java.lang.String PARAMETER_SOURCE_LINE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_LINE_NUMBER

          +
          public static final java.lang.String PARAMETER_LINE_NUMBER
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_START_COLUMN

          +
          public static final java.lang.String PARAMETER_START_COLUMN
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_END_COLUMN

          +
          public static final java.lang.String PARAMETER_END_COLUMN
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_START_POSITION

          +
          public static final java.lang.String PARAMETER_START_POSITION
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_END_POSITION

          +
          public static final java.lang.String PARAMETER_END_POSITION
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_MESSAGE

          +
          public static final java.lang.String PARAMETER_MESSAGE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_CURRENT_THREAD_ID

          +
          public static final java.lang.String PARAMETER_CURRENT_THREAD_ID
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_LOCKED_THREAD_ID

          +
          public static final java.lang.String PARAMETER_LOCKED_THREAD_ID
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_OS

          +
          public static final java.lang.String PARAMETER_OS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_FEATURE

          +
          public static final java.lang.String PARAMETER_FEATURE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_SYMBOL

          +
          public static final java.lang.String PARAMETER_SYMBOL
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_COUNT

          +
          public static final java.lang.String PARAMETER_COUNT
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_CONTINUABLE

          +
          public static final java.lang.String PARAMETER_CONTINUABLE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_PATH

          +
          public static final java.lang.String PARAMETER_PATH
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_REASON

          +
          public static final java.lang.String PARAMETER_REASON
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PARAMETER_MAX_DEPTH

          +
          public static final java.lang.String PARAMETER_MAX_DEPTH
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          OSNotSupported

          +
          public static final JavetError OSNotSupported
          +
        • +
        + + + +
          +
        • +

          LibraryNotFound

          +
          public static final JavetError LibraryNotFound
          +
        • +
        + + + +
          +
        • +

          LibraryNotLoaded

          +
          public static final JavetError LibraryNotLoaded
          +
        • +
        + + + +
          +
        • +

          NotSupported

          +
          public static final JavetError NotSupported
          +
        • +
        + + + +
          +
        • +

          FailedToReadPath

          +
          public static final JavetError FailedToReadPath
          +
        • +
        + + + +
          +
        • +

          CompilationFailure

          +
          public static final JavetError CompilationFailure
          +
        • +
        + + + +
          +
        • +

          ExecutionFailure

          +
          public static final JavetError ExecutionFailure
          +
        • +
        + + + +
          +
        • +

          ExecutionTerminated

          +
          public static final JavetError ExecutionTerminated
          +
        • +
        + + + +
          +
        • +

          CallbackSignatureParameterSizeMismatch

          +
          public static final JavetError CallbackSignatureParameterSizeMismatch
          +
        • +
        + + + +
          +
        • +

          CallbackSignatureParameterTypeMismatch

          +
          public static final JavetError CallbackSignatureParameterTypeMismatch
          +
        • +
        + + + +
          +
        • +

          CallbackInjectionFailure

          +
          public static final JavetError CallbackInjectionFailure
          +
        • +
        + + + +
          +
        • +

          CallbackRegistrationFailure

          +
          public static final JavetError CallbackRegistrationFailure
          +
        • +
        + + + +
          +
        • +

          CallbackMethodFailure

          +
          public static final JavetError CallbackMethodFailure
          +
        • +
        + + + +
          +
        • +

          CallbackUnknownFailure

          +
          public static final JavetError CallbackUnknownFailure
          +
        • +
        + + + +
          +
        • +

          CallbackUnregistrationFailure

          +
          public static final JavetError CallbackUnregistrationFailure
          +
        • +
        + + + +
          +
        • +

          ConverterFailure

          +
          public static final JavetError ConverterFailure
          +
        • +
        + + + +
          +
        • +

          ConverterCircularStructure

          +
          public static final JavetError ConverterCircularStructure
          +
        • +
        + + + +
          +
        • +

          ConverterSymbolNotBuiltIn

          +
          public static final JavetError ConverterSymbolNotBuiltIn
          +
        • +
        + + + +
          +
        • +

          ModuleNameEmpty

          +
          public static final JavetError ModuleNameEmpty
          +
        • +
        + + + +
          +
        • +

          ModuleNotFound

          +
          public static final JavetError ModuleNotFound
          +
        • +
        + + + +
          +
        • +

          ModulePermissionDenied

          +
          public static final JavetError ModulePermissionDenied
          +
        • +
        + + + +
          +
        • +

          LockAcquisitionFailure

          +
          public static final JavetError LockAcquisitionFailure
          +
        • +
        + + + +
          +
        • +

          LockReleaseFailure

          +
          public static final JavetError LockReleaseFailure
          +
        • +
        + + + +
          +
        • +

          LockConflictThreadIdMismatch

          +
          public static final JavetError LockConflictThreadIdMismatch
          +
        • +
        + + + +
          +
        • +

          RuntimeAlreadyClosed

          +
          public static final JavetError RuntimeAlreadyClosed
          +
        • +
        + + + +
          +
        • +

          RuntimeAlreadyRegistered

          +
          public static final JavetError RuntimeAlreadyRegistered
          +
        • +
        + + + +
          +
        • +

          RuntimeNotRegistered

          +
          public static final JavetError RuntimeNotRegistered
          +
        • +
        + + + +
          +
        • +

          RuntimeLeakageDetected

          +
          public static final JavetError RuntimeLeakageDetected
          +
        • +
        + + + +
          +
        • +

          RuntimeCloseFailure

          +
          public static final JavetError RuntimeCloseFailure
          +
        • +
        + + + +
          +
        • +

          code

          +
          protected int code
          +
        • +
        + + + +
          +
        • +

          format

          +
          protected java.lang.String format
          +
        • +
        + + + + +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getCode

          +
          public int getCode()
          +
        • +
        + + + +
          +
        • +

          getFormat

          +
          public java.lang.String getFormat()
          +
        • +
        + + + +
          +
        • +

          getMessage

          +
          public java.lang.String getMessage(java.util.Map<java.lang.String,java.lang.Object> parameters)
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetException.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetException.html new file mode 100644 index 000000000..48a6185ed --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetException.html @@ -0,0 +1,403 @@ + + + + + +JavetException (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class JavetException

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • java.lang.Throwable
      • +
      • +
          +
        • java.lang.Exception
        • +
        • +
            +
          • com.caoccao.javet.exceptions.JavetException
          • +
          +
        • +
        +
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected JavetErrorerror 
        protected java.util.Map<java.lang.String,java.lang.Object>parameters 
        +
      • +
      + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        JavetErrorgetError() 
        java.util.Map<java.lang.String,java.lang.Object>getParameters() 
        +
          +
        • + + +

          Methods inherited from class java.lang.Throwable

          +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + + + + + +
          +
        • +

          parameters

          +
          protected java.util.Map<java.lang.String,java.lang.Object> parameters
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetException

          +
          public JavetException(JavetError error)
          +
        • +
        + + + +
          +
        • +

          JavetException

          +
          public JavetException(JavetError error,
          +                      java.util.Map<java.lang.String,java.lang.Object> parameters)
          +
        • +
        + + + +
          +
        • +

          JavetException

          +
          public JavetException(JavetError error,
          +                      java.lang.Throwable cause)
          +
        • +
        + + + +
          +
        • +

          JavetException

          +
          public JavetException(JavetError error,
          +                      java.util.Map<java.lang.String,java.lang.Object> parameters,
          +                      java.lang.Throwable cause)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          getParameters

          +
          public java.util.Map<java.lang.String,java.lang.Object> getParameters()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetExecutionException.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetExecutionException.html new file mode 100644 index 000000000..8b6cfc41e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetExecutionException.html @@ -0,0 +1,319 @@ + + + + + +JavetExecutionException (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class JavetExecutionException

    +
    +
    + +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetExecutionException(java.lang.String message, + java.lang.String resourceName, + java.lang.String sourceLine, + int lineNumber, + int startColumn, + int endColumn, + int startPosition, + int endPosition) 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + +
          +
        • + + +

          Methods inherited from class java.lang.Throwable

          +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetExecutionException

          +
          public JavetExecutionException(java.lang.String message,
          +                               java.lang.String resourceName,
          +                               java.lang.String sourceLine,
          +                               int lineNumber,
          +                               int startColumn,
          +                               int endColumn,
          +                               int startPosition,
          +                               int endPosition)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetScriptingError.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetScriptingError.html new file mode 100644 index 000000000..835554f12 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetScriptingError.html @@ -0,0 +1,494 @@ + + + + + +JavetScriptingError (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class JavetScriptingError

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.exceptions.JavetScriptingError
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetScriptingError
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetScriptingError

          +
          public JavetScriptingError(java.lang.String message,
          +                           java.lang.String resourceName,
          +                           java.lang.String sourceLine,
          +                           int lineNumber,
          +                           int startColumn,
          +                           int endColumn,
          +                           int startPosition,
          +                           int endPosition)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getEndColumn

          +
          public int getEndColumn()
          +
        • +
        + + + +
          +
        • +

          getEndPosition

          +
          public int getEndPosition()
          +
        • +
        + + + +
          +
        • +

          getLineNumber

          +
          public int getLineNumber()
          +
        • +
        + + + +
          +
        • +

          getMessage

          +
          public java.lang.String getMessage()
          +
        • +
        + + + +
          +
        • +

          getResourceName

          +
          public java.lang.String getResourceName()
          +
        • +
        + + + +
          +
        • +

          getSourceLine

          +
          public java.lang.String getSourceLine()
          +
        • +
        + + + +
          +
        • +

          getStartColumn

          +
          public int getStartColumn()
          +
        • +
        + + + +
          +
        • +

          getStartPosition

          +
          public int getStartPosition()
          +
        • +
        + + + +
          +
        • +

          setEndColumn

          +
          public void setEndColumn(int endColumn)
          +
        • +
        + + + +
          +
        • +

          setEndPosition

          +
          public void setEndPosition(int endPosition)
          +
        • +
        + + + +
          +
        • +

          setLineNumber

          +
          public void setLineNumber(int lineNumber)
          +
        • +
        + + + +
          +
        • +

          setMessage

          +
          public void setMessage(java.lang.String message)
          +
        • +
        + + + +
          +
        • +

          setResourceName

          +
          public void setResourceName(java.lang.String resourceName)
          +
        • +
        + + + +
          +
        • +

          setSourceLine

          +
          public void setSourceLine(java.lang.String sourceLine)
          +
        • +
        + + + +
          +
        • +

          setStartColumn

          +
          public void setStartColumn(int startColumn)
          +
        • +
        + + + +
          +
        • +

          setStartPosition

          +
          public void setStartPosition(int startPosition)
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetTerminatedException.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetTerminatedException.html new file mode 100644 index 000000000..f8d1158f3 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/JavetTerminatedException.html @@ -0,0 +1,348 @@ + + + + + +JavetTerminatedException (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.exceptions
    +

    Class JavetTerminatedException

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable
      +
      +
      +
      +
      public class JavetTerminatedException
      +extends JavetException
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + + + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        booleanisContinuable() 
        + +
          +
        • + + +

          Methods inherited from class java.lang.Throwable

          +addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          continuable

          +
          protected boolean continuable
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetTerminatedException

          +
          public JavetTerminatedException(boolean continuable)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          isContinuable

          +
          public boolean isContinuable()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/package-frame.html new file mode 100644 index 000000000..a2e1843af --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/package-frame.html @@ -0,0 +1,29 @@ + + + + + +com.caoccao.javet.exceptions (javet 0.9.12 API) + + + + +

    com.caoccao.javet.exceptions

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/package-summary.html new file mode 100644 index 000000000..70bf0d713 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/package-summary.html @@ -0,0 +1,193 @@ + + + + + +com.caoccao.javet.exceptions (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.exceptions

    +
    +
    Exceptions and errors for error handling.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.exceptions Description

    +
    Exceptions and errors for error handling.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/exceptions/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/exceptions/package-tree.html new file mode 100644 index 000000000..4aacbf715 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/exceptions/package-tree.html @@ -0,0 +1,155 @@ + + + + + +com.caoccao.javet.exceptions Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.exceptions

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/BaseJavetInterceptor.html b/docs/reference/javadoc/com/caoccao/javet/interception/BaseJavetInterceptor.html new file mode 100644 index 000000000..fd03d0a1c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/BaseJavetInterceptor.html @@ -0,0 +1,369 @@ + + + + + +BaseJavetInterceptor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interception
    +

    Class BaseJavetInterceptor

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interception.BaseJavetInterceptor
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BaseJavetInterceptor

          +
          public BaseJavetInterceptor(V8Runtime v8Runtime)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.html b/docs/reference/javadoc/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.html new file mode 100644 index 000000000..28678af54 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.html @@ -0,0 +1,874 @@ + + + + + +BaseJavetConsoleInterceptor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interception.logging
    +

    Class BaseJavetConsoleInterceptor

    +
    +
    + +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected static java.lang.StringJAVA_CONSOLE_DEBUG +
        The constant JAVA_CONSOLE_DEBUG.
        +
        protected static java.lang.StringJAVA_CONSOLE_ERROR +
        The constant JAVA_CONSOLE_ERROR.
        +
        protected static java.lang.StringJAVA_CONSOLE_INFO +
        The constant JAVA_CONSOLE_INFO.
        +
        protected static java.lang.StringJAVA_CONSOLE_LOG +
        The constant JAVA_CONSOLE_LOG.
        +
        protected static java.lang.StringJAVA_CONSOLE_TRACE +
        The constant JAVA_CONSOLE_TRACE.
        +
        protected static java.lang.StringJAVA_CONSOLE_WARN +
        The constant JAVA_CONSOLE_WARN.
        +
        protected static java.lang.StringJS_FUNCTION_DEBUG +
        The constant JS_FUNCTION_DEBUG.
        +
        protected static java.lang.StringJS_FUNCTION_ERROR +
        The constant JS_FUNCTION_ERROR.
        +
        protected static java.lang.StringJS_FUNCTION_INFO +
        The constant JS_FUNCTION_INFO.
        +
        protected static java.lang.StringJS_FUNCTION_LOG +
        The constant JS_FUNCTION_LOG.
        +
        protected static java.lang.StringJS_FUNCTION_TRACE +
        The constant JS_FUNCTION_TRACE.
        +
        protected static java.lang.StringJS_FUNCTION_WARN +
        The constant JS_FUNCTION_WARN.
        +
        protected static java.lang.StringPROPERTY_CONSOLE +
        The constant PROPERTY_CONSOLE.
        +
        protected static java.lang.StringSPACE +
        The constant SPACE.
        +
        + +
      • +
      + + + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          JAVA_CONSOLE_DEBUG

          +
          protected static final java.lang.String JAVA_CONSOLE_DEBUG
          +
          The constant JAVA_CONSOLE_DEBUG.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JAVA_CONSOLE_ERROR

          +
          protected static final java.lang.String JAVA_CONSOLE_ERROR
          +
          The constant JAVA_CONSOLE_ERROR.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JAVA_CONSOLE_INFO

          +
          protected static final java.lang.String JAVA_CONSOLE_INFO
          +
          The constant JAVA_CONSOLE_INFO.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JAVA_CONSOLE_LOG

          +
          protected static final java.lang.String JAVA_CONSOLE_LOG
          +
          The constant JAVA_CONSOLE_LOG.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JAVA_CONSOLE_TRACE

          +
          protected static final java.lang.String JAVA_CONSOLE_TRACE
          +
          The constant JAVA_CONSOLE_TRACE.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JAVA_CONSOLE_WARN

          +
          protected static final java.lang.String JAVA_CONSOLE_WARN
          +
          The constant JAVA_CONSOLE_WARN.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JS_FUNCTION_DEBUG

          +
          protected static final java.lang.String JS_FUNCTION_DEBUG
          +
          The constant JS_FUNCTION_DEBUG.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JS_FUNCTION_ERROR

          +
          protected static final java.lang.String JS_FUNCTION_ERROR
          +
          The constant JS_FUNCTION_ERROR.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JS_FUNCTION_INFO

          +
          protected static final java.lang.String JS_FUNCTION_INFO
          +
          The constant JS_FUNCTION_INFO.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JS_FUNCTION_LOG

          +
          protected static final java.lang.String JS_FUNCTION_LOG
          +
          The constant JS_FUNCTION_LOG.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JS_FUNCTION_TRACE

          +
          protected static final java.lang.String JS_FUNCTION_TRACE
          +
          The constant JS_FUNCTION_TRACE.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          JS_FUNCTION_WARN

          +
          protected static final java.lang.String JS_FUNCTION_WARN
          +
          The constant JS_FUNCTION_WARN.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PROPERTY_CONSOLE

          +
          protected static final java.lang.String PROPERTY_CONSOLE
          +
          The constant PROPERTY_CONSOLE.
          +
          +
          Since:
          +
          0.7.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          SPACE

          +
          protected static final java.lang.String SPACE
          +
          The constant SPACE.
          +
          +
          Since:
          +
          0.7.1
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BaseJavetConsoleInterceptor

          +
          public BaseJavetConsoleInterceptor(V8Runtime v8Runtime)
          +
          Instantiates a new Base javet console interceptor.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          concat

          +
          public java.lang.String concat(V8Value... v8Values)
          +
          Concat string.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the string
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          consoleDebug

          +
          public abstract void consoleDebug(V8Value... v8Values)
          +
          Console debug.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          consoleError

          +
          public abstract void consoleError(V8Value... v8Values)
          +
          Console error.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          consoleInfo

          +
          public abstract void consoleInfo(V8Value... v8Values)
          +
          Console info.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          consoleLog

          +
          public abstract void consoleLog(V8Value... v8Values)
          +
          Console log.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          consoleTrace

          +
          public abstract void consoleTrace(V8Value... v8Values)
          +
          Console trace.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          consoleWarn

          +
          public abstract void consoleWarn(V8Value... v8Values)
          +
          Console warn.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + + + + + +
          +
        • +

          register

          +
          protected void register(IV8ValueObject iV8ValueObject,
          +                        java.lang.String jsFunctionName,
          +                        java.lang.String javaFunctionName)
          +                 throws JavetException
          +
          Register a JS function by name.
          +
          +
          Parameters:
          +
          iV8ValueObject - the V8 value object
          +
          jsFunctionName - the JS function name
          +
          javaFunctionName - the Java function name
          +
          Throws:
          +
          JavetException - the Javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/logging/JavetStandardConsoleInterceptor.html b/docs/reference/javadoc/com/caoccao/javet/interception/logging/JavetStandardConsoleInterceptor.html new file mode 100644 index 000000000..d89ad1941 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/logging/JavetStandardConsoleInterceptor.html @@ -0,0 +1,856 @@ + + + + + +JavetStandardConsoleInterceptor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interception.logging
    +

    Class JavetStandardConsoleInterceptor

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          debug

          +
          protected java.io.PrintStream debug
          +
          The Debug.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          error

          +
          protected java.io.PrintStream error
          +
          The Error.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          info

          +
          protected java.io.PrintStream info
          +
          The Info.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          log

          +
          protected java.io.PrintStream log
          +
          The Log.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          trace

          +
          protected java.io.PrintStream trace
          +
          The Trace.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          warn

          +
          protected java.io.PrintStream warn
          +
          The Warn.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetStandardConsoleInterceptor

          +
          public JavetStandardConsoleInterceptor(V8Runtime v8Runtime)
          +
          Instantiates a new Javet standard console interceptor.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          getDebug

          +
          public java.io.PrintStream getDebug()
          +
          Gets debug.
          +
          +
          Returns:
          +
          the debug
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getError

          +
          public java.io.PrintStream getError()
          +
          Gets error.
          +
          +
          Returns:
          +
          the error
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getInfo

          +
          public java.io.PrintStream getInfo()
          +
          Gets info.
          +
          +
          Returns:
          +
          the info
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getLog

          +
          public java.io.PrintStream getLog()
          +
          Gets log.
          +
          +
          Returns:
          +
          the log
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getTrace

          +
          public java.io.PrintStream getTrace()
          +
          Gets trace.
          +
          +
          Returns:
          +
          the trace
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getWarn

          +
          public java.io.PrintStream getWarn()
          +
          Gets warn.
          +
          +
          Returns:
          +
          the warn
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setDebug

          +
          public void setDebug(java.io.PrintStream debug)
          +
          Sets debug.
          +
          +
          Parameters:
          +
          debug - the debug
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setError

          +
          public void setError(java.io.PrintStream error)
          +
          Sets error.
          +
          +
          Parameters:
          +
          error - the error
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setInfo

          +
          public void setInfo(java.io.PrintStream info)
          +
          Sets info.
          +
          +
          Parameters:
          +
          info - the info
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setLog

          +
          public void setLog(java.io.PrintStream log)
          +
          Sets log.
          +
          +
          Parameters:
          +
          log - the log
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setTrace

          +
          public void setTrace(java.io.PrintStream trace)
          +
          Sets trace.
          +
          +
          Parameters:
          +
          trace - the trace
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setWarn

          +
          public void setWarn(java.io.PrintStream warn)
          +
          Sets warn.
          +
          +
          Parameters:
          +
          warn - the warn
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-frame.html new file mode 100644 index 000000000..31ffa0413 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-frame.html @@ -0,0 +1,20 @@ + + + + + +com.caoccao.javet.interception.logging (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interception.logging

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-summary.html new file mode 100644 index 000000000..82205d32e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-summary.html @@ -0,0 +1,160 @@ + + + + + +com.caoccao.javet.interception.logging (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interception.logging

    +
    +
    Built-in interceptors for JS logging function console.log(), etc...
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interception.logging Description

    +
    Built-in interceptors for JS logging function console.log(), etc...
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-tree.html new file mode 100644 index 000000000..28a736b7a --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/logging/package-tree.html @@ -0,0 +1,142 @@ + + + + + +com.caoccao.javet.interception.logging Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interception.logging

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interception/package-frame.html new file mode 100644 index 000000000..5862592eb --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/package-frame.html @@ -0,0 +1,19 @@ + + + + + +com.caoccao.javet.interception (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interception

    +
    +

    Classes

    + +
    + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interception/package-summary.html new file mode 100644 index 000000000..c9f68593b --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/package-summary.html @@ -0,0 +1,152 @@ + + + + + +com.caoccao.javet.interception (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interception

    +
    +
    Built-in interceptors.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interception Description

    +
    Built-in interceptors.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interception/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interception/package-tree.html new file mode 100644 index 000000000..67c0cd294 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interception/package-tree.html @@ -0,0 +1,134 @@ + + + + + +com.caoccao.javet.interception Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interception

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiConsumer.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiConsumer.html new file mode 100644 index 000000000..2d8d6bddb --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiConsumer.html @@ -0,0 +1,249 @@ + + + + + +IJavetBiConsumer (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetBiConsumer<T1 extends V8Value,T2 extends V8Value,E extends java.lang.Throwable>

    +
    +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T1 - the type parameter for key
      +
      T2 - the type parameter for value
      +
      E - the type parameter for custom exception
      +
      +
      +
      +
      public interface IJavetBiConsumer<T1 extends V8Value,T2 extends V8Value,E extends java.lang.Throwable>
      +
      The interface Javet bi-consumer.
      +
      +
      Since:
      +
      0.8.9
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          accept

          +
          void accept(T1 key,
          +            T2 value)
          +     throws JavetException,
          +            E extends java.lang.Throwable
          +
          Accept.
          +
          +
          Parameters:
          +
          key - the key
          +
          value - the value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the custom exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiIndexedConsumer.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiIndexedConsumer.html new file mode 100644 index 000000000..afdfee48d --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetBiIndexedConsumer.html @@ -0,0 +1,252 @@ + + + + + +IJavetBiIndexedConsumer (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetBiIndexedConsumer<T1 extends V8Value,T2 extends V8Value,E extends java.lang.Throwable>

    +
    +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T1 - the type parameter for key
      +
      T2 - the type parameter for value
      +
      E - the type parameter for custom exception
      +
      +
      +
      +
      public interface IJavetBiIndexedConsumer<T1 extends V8Value,T2 extends V8Value,E extends java.lang.Throwable>
      +
      The interface Javet bi-indexed consumer.
      +
      +
      Since:
      +
      0.8.10
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          accept

          +
          void accept(int index,
          +            T1 key,
          +            T2 value)
          +     throws JavetException,
          +            E extends java.lang.Throwable
          +
          Accept.
          +
          +
          Parameters:
          +
          index - the index
          +
          key - the key
          +
          value - the value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the custom exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetClosable.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetClosable.html new file mode 100644 index 000000000..a2f0af287 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetClosable.html @@ -0,0 +1,265 @@ + + + + + +IJavetClosable (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetClosable

    +
    +
    + +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          close

          +
          void close()
          +    throws JavetException
          +
          +
          Specified by:
          +
          close in interface java.lang.AutoCloseable
          +
          Throws:
          +
          JavetException
          +
          +
        • +
        + + + +
          +
        • +

          isClosed

          +
          boolean isClosed()
          +
          Is closed.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityFunction.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityFunction.html new file mode 100644 index 000000000..447f2975f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityFunction.html @@ -0,0 +1,302 @@ + + + + + +IJavetEntityFunction (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetEntityFunction

    +
    +
    +
    +
      +
    • +
      +
      All Known Implementing Classes:
      +
      JavetEntityFunction
      +
      +
      +
      +
      public interface IJavetEntityFunction
      +
      The interface Javet entity function.
      +
      +
      Since:
      +
      0.9.4
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getJSFunctionType

          +
          JSFunctionType getJSFunctionType()
          +
          Gets JS function type.
          +
          +
          Returns:
          +
          the JS function type
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getSourceCode

          +
          java.lang.String getSourceCode()
          +
          Gets source code.
          +
          +
          Returns:
          +
          the source code
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setJSFunctionType

          +
          void setJSFunctionType(JSFunctionType jsFunctionType)
          +
          Sets JS function type.
          +
          +
          Parameters:
          +
          jsFunctionType - the JS function type
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setSourceCode

          +
          void setSourceCode(java.lang.String sourceCode)
          +
          Sets source code.
          +
          +
          Parameters:
          +
          sourceCode - the source code
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityMap.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityMap.html new file mode 100644 index 000000000..75f530773 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetEntityMap.html @@ -0,0 +1,214 @@ + + + + + +IJavetEntityMap (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetEntityMap

    +
    +
    +
    +
      +
    • +
      +
      All Superinterfaces:
      +
      java.util.Map<java.lang.String,java.lang.Object>
      +
      +
      +
      All Known Implementing Classes:
      +
      JavetEntityMap
      +
      +
      +
      +
      public interface IJavetEntityMap
      +extends java.util.Map<java.lang.String,java.lang.Object>
      +
      The interface Javet entity map.
      +
      +
      Since:
      +
      0.9.4
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Nested Class Summary

        +
          +
        • + + +

          Nested classes/interfaces inherited from interface java.util.Map

          +java.util.Map.Entry<K,V>
        • +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        +
          +
        • + + +

          Methods inherited from interface java.util.Map

          +clear, compute, computeIfAbsent, computeIfPresent, containsKey, containsValue, entrySet, equals, forEach, get, getOrDefault, hashCode, isEmpty, keySet, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size, values
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetInterceptor.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetInterceptor.html new file mode 100644 index 000000000..4d1e40959 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetInterceptor.html @@ -0,0 +1,268 @@ + + + + + +IJavetInterceptor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetInterceptor

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          register

          +
          boolean register(IV8ValueObject... iV8ValueObjects)
          +          throws JavetException
          +
          Register the interceptor to the given V8 value object.
          +
          +
          Parameters:
          +
          iV8ValueObjects - the V8 value objects
          +
          Returns:
          +
          true: success, false: failure
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          unregister

          +
          boolean unregister(IV8ValueObject... iV8ValueObjects)
          +            throws JavetException
          +
          Unregister the interceptor from the given V8 value object.
          +
          +
          Parameters:
          +
          iV8ValueObjects - the V8 value objects
          +
          Returns:
          +
          true: success, false: failure
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetLogger.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetLogger.html new file mode 100644 index 000000000..1018f1323 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetLogger.html @@ -0,0 +1,455 @@ + + + + + +IJavetLogger (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetLogger

    +
    +
    +
    +
      +
    • +
      +
      All Known Implementing Classes:
      +
      JavetDefaultLogger
      +
      +
      +
      +
      public interface IJavetLogger
      +
      The interface Javet logger.
      +
      +
      Since:
      +
      0.7.0
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods Default Methods 
        Modifier and TypeMethod and Description
        voiddebug(java.lang.String message) +
        Debug.
        +
        voiderror(java.lang.String message) +
        Error.
        +
        voiderror(java.lang.String message, + java.lang.Throwable cause) +
        Error.
        +
        voidinfo(java.lang.String message) +
        Info.
        +
        default voidlogDebug(java.lang.String format, + java.lang.Object... objects) +
        Log debug.
        +
        default voidlogError(java.lang.String format, + java.lang.Object... objects) +
        Log error.
        +
        default voidlogError(java.lang.Throwable cause, + java.lang.String format, + java.lang.Object... objects) +
        Log error.
        +
        default voidlogInfo(java.lang.String format, + java.lang.Object... objects) +
        Log info.
        +
        default voidlogWarn(java.lang.String format, + java.lang.Object... objects) +
        Log warn.
        +
        voidwarn(java.lang.String message) +
        Warn.
        +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          debug

          +
          void debug(java.lang.String message)
          +
          Debug.
          +
          +
          Parameters:
          +
          message - the message
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          error

          +
          void error(java.lang.String message)
          +
          Error.
          +
          +
          Parameters:
          +
          message - the message
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          error

          +
          void error(java.lang.String message,
          +           java.lang.Throwable cause)
          +
          Error.
          +
          +
          Parameters:
          +
          message - the message
          +
          cause - the cause
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          info

          +
          void info(java.lang.String message)
          +
          Info.
          +
          +
          Parameters:
          +
          message - the message
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          logDebug

          +
          default void logDebug(java.lang.String format,
          +                      java.lang.Object... objects)
          +
          Log debug.
          +
          +
          Parameters:
          +
          format - the format
          +
          objects - the objects
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          logError

          +
          default void logError(java.lang.Throwable cause,
          +                      java.lang.String format,
          +                      java.lang.Object... objects)
          +
          Log error.
          +
          +
          Parameters:
          +
          cause - the cause
          +
          format - the format
          +
          objects - the objects
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          logError

          +
          default void logError(java.lang.String format,
          +                      java.lang.Object... objects)
          +
          Log error.
          +
          +
          Parameters:
          +
          format - the format
          +
          objects - the objects
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          logInfo

          +
          default void logInfo(java.lang.String format,
          +                     java.lang.Object... objects)
          +
          Log info.
          +
          +
          Parameters:
          +
          format - the format
          +
          objects - the objects
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          logWarn

          +
          default void logWarn(java.lang.String format,
          +                     java.lang.Object... objects)
          +
          Log warn.
          +
          +
          Parameters:
          +
          format - the format
          +
          objects - the objects
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          warn

          +
          void warn(java.lang.String message)
          +
          Warn.
          +
          +
          Parameters:
          +
          message - the message
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetPromiseRejectCallback.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetPromiseRejectCallback.html new file mode 100644 index 000000000..a3a683a38 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetPromiseRejectCallback.html @@ -0,0 +1,242 @@ + + + + + +IJavetPromiseRejectCallback (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetPromiseRejectCallback

    +
    +
    +
    +
      +
    • +
      +
      All Known Implementing Classes:
      +
      JavetPromiseRejectCallback
      +
      +
      +
      +
      public interface IJavetPromiseRejectCallback
      +
      The interface Javet promise reject callback.
      +
      +
      Since:
      +
      0.8.3
      +
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetResettable.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetResettable.html new file mode 100644 index 000000000..1dcd31960 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetResettable.html @@ -0,0 +1,233 @@ + + + + + +IJavetResettable (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetResettable

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface IJavetResettable
      +
      The interface Javet resettable.
      +
      +
      Since:
      +
      0.7.0
      +
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetSupplier.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetSupplier.html new file mode 100644 index 000000000..5041e2c7c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetSupplier.html @@ -0,0 +1,230 @@ + + + + + +IJavetSupplier (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetSupplier<T,E extends java.lang.Throwable>

    +
    +
    +
    +
      +
    • +
      +
      Functional Interface:
      +
      This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
      +
      +
      +
      +
      @FunctionalInterface
      +public interface IJavetSupplier<T,E extends java.lang.Throwable>
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniConsumer.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniConsumer.html new file mode 100644 index 000000000..38f73da44 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniConsumer.html @@ -0,0 +1,245 @@ + + + + + +IJavetUniConsumer (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetUniConsumer<T extends V8Value,E extends java.lang.Throwable>

    +
    +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - the type parameter for value
      +
      E - the type parameter for custom exception
      +
      +
      +
      +
      public interface IJavetUniConsumer<T extends V8Value,E extends java.lang.Throwable>
      +
      The interface Javet uni consumer.
      +
      +
      Since:
      +
      0.8.10
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          accept

          +
          void accept(T value)
          +     throws JavetException,
          +            E extends java.lang.Throwable
          +
          Accept.
          +
          +
          Parameters:
          +
          value - the value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the custom exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniIndexedConsumer.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniIndexedConsumer.html new file mode 100644 index 000000000..d77900395 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IJavetUniIndexedConsumer.html @@ -0,0 +1,248 @@ + + + + + +IJavetUniIndexedConsumer (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IJavetUniIndexedConsumer<T extends V8Value,E extends java.lang.Throwable>

    +
    +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - the type parameter for value
      +
      E - the type parameter for custom exception
      +
      +
      +
      +
      public interface IJavetUniIndexedConsumer<T extends V8Value,E extends java.lang.Throwable>
      +
      The interface Javet uni indexed consumer.
      +
      +
      Since:
      +
      0.8.10
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          accept

          +
          void accept(int index,
          +            T value)
          +     throws JavetException,
          +            E extends java.lang.Throwable
          +
          Accept.
          +
          +
          Parameters:
          +
          index - the index
          +
          value - the value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the custom exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/IV8ModuleResolver.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/IV8ModuleResolver.html new file mode 100644 index 000000000..f8a3dd948 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/IV8ModuleResolver.html @@ -0,0 +1,243 @@ + + + + + +IV8ModuleResolver (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interfaces
    +

    Interface IV8ModuleResolver

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface IV8ModuleResolver
      +
      The interface V8 module resolver is for resolving V8 module look-up in dynamic import.
      +
      +
      Since:
      +
      0.9.3
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          resolve

          +
          IV8Module resolve(V8Runtime v8Runtime,
          +                  java.lang.String resourceName,
          +                  IV8Module v8ModuleReferrer)
          +           throws JavetException
          +
          Resolve V8 module.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          resourceName - the resource name
          +
          v8ModuleReferrer - the V8 module referrer
          +
          Returns:
          +
          the V8 module
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/package-frame.html new file mode 100644 index 000000000..2817771d9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/package-frame.html @@ -0,0 +1,31 @@ + + + + + +com.caoccao.javet.interfaces (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interfaces

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/package-summary.html new file mode 100644 index 000000000..25165b55d --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/package-summary.html @@ -0,0 +1,224 @@ + + + + + +com.caoccao.javet.interfaces (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interfaces

    +
    +
    Interfaces required by various internal and external API.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interfaces Description

    +
    Interfaces required by various internal and external API.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interfaces/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interfaces/package-tree.html new file mode 100644 index 000000000..edbf9e1d3 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interfaces/package-tree.html @@ -0,0 +1,150 @@ + + + + + +com.caoccao.javet.interfaces Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interfaces

    +Package Hierarchies: + +
    +
    +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/INodeNative.html b/docs/reference/javadoc/com/caoccao/javet/interop/INodeNative.html new file mode 100644 index 000000000..e52e9509e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/INodeNative.html @@ -0,0 +1,190 @@ + + + + + +INodeNative (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Interface INodeNative

    +
    +
    +
    +
      +
    • +
      +
      All Superinterfaces:
      +
      IV8Native
      +
      +
      +
      +
      public interface INodeNative
      +extends IV8Native
      +
    • +
    +
    + +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/IV8Cloneable.html b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Cloneable.html new file mode 100644 index 000000000..1111d99ec --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Cloneable.html @@ -0,0 +1,232 @@ + + + + + +IV8Cloneable (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Interface IV8Cloneable

    +
    + + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/IV8Convertible.html b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Convertible.html new file mode 100644 index 000000000..1fff54de4 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Convertible.html @@ -0,0 +1,310 @@ + + + + + +IV8Convertible (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Interface IV8Convertible

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          toObject

          +
          <T,V extends V8Value> T toObject(V v8Value)
          +                          throws JavetException
          +
          Convert from V8 value to object. + The caller is responsible for closing the V8 value.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          V - the type parameter
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + +
          +
        • +

          toObject

          +
          default <T,V extends V8Value> T toObject(V v8Value,
          +                                         boolean autoClose)
          +                                  throws JavetException
          +
          Convert from V8 value to object. + The V8 value is closed automatically if autoClose is set to true.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          V - the type parameter
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          autoClose - the auto close
          +
          Returns:
          +
          the t
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + +
          +
        • +

          toV8Value

          +
          @CheckReturnValue
          +<T,V extends V8Value> V toV8Value(T object)
          +                                              throws JavetException
          +
          Convert object to V8 value.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          V - the type parameter
          +
          Parameters:
          +
          object - the object
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/IV8Creatable.html b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Creatable.html new file mode 100644 index 000000000..050c4bb1f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Creatable.html @@ -0,0 +1,631 @@ + + + + + +IV8Creatable (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Interface IV8Creatable

    +
    +
    +
    +
      +
    • +
      +
      All Known Implementing Classes:
      +
      NodeRuntime, V8Runtime
      +
      +
      +
      +
      public interface IV8Creatable
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/IV8Executable.html b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Executable.html new file mode 100644 index 000000000..97bf241e1 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Executable.html @@ -0,0 +1,490 @@ + + + + + +IV8Executable (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Interface IV8Executable

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          execute

          +
          @CheckReturnValue
          +<T extends V8Value> T execute(boolean resultRequired)
          +                                          throws JavetException
          +
          Execute t.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          resultRequired - the result required
          +
          Returns:
          +
          the t
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          executeBoolean

          +
          default java.lang.Boolean executeBoolean()
          +                                  throws JavetException
          +
          Execute boolean boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          executeDouble

          +
          default java.lang.Double executeDouble()
          +                                throws JavetException
          +
          Execute double double.
          +
          +
          Returns:
          +
          the double
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          executeInteger

          +
          default java.lang.Integer executeInteger()
          +                                  throws JavetException
          +
          Execute integer integer.
          +
          +
          Returns:
          +
          the integer
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          executeLong

          +
          default java.lang.Long executeLong()
          +                            throws JavetException
          +
          Execute long long.
          +
          +
          Returns:
          +
          the long
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          executeObject

          +
          default <T> T executeObject()
          +                     throws JavetException
          +
          Execute object t.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Returns:
          +
          the t
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          executePrimitive

          +
          default <R,T extends V8ValuePrimitive<R>> R executePrimitive()
          +                                                      throws JavetException
          +
          Execute primitive r.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          T - the type parameter
          +
          Returns:
          +
          the r
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          executeString

          +
          default java.lang.String executeString()
          +                                throws JavetException
          +
          Execute string string.
          +
          +
          Returns:
          +
          the string
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + + +
          +
        • +

          executeZonedDateTime

          +
          default java.time.ZonedDateTime executeZonedDateTime()
          +                                              throws JavetException
          +
          Execute zoned date time zoned date time.
          +
          +
          Returns:
          +
          the zoned date time
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/IV8InspectorListener.html b/docs/reference/javadoc/com/caoccao/javet/interop/IV8InspectorListener.html new file mode 100644 index 000000000..031fb4df4 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/IV8InspectorListener.html @@ -0,0 +1,270 @@ + + + + + +IV8InspectorListener (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Interface IV8InspectorListener

    +
    +
    +
    +
      +
    • +
      +
      +
      public interface IV8InspectorListener
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          flushProtocolNotifications

          +
          void flushProtocolNotifications()
          +
        • +
        + + + +
          +
        • +

          receiveNotification

          +
          void receiveNotification(java.lang.String message)
          +
        • +
        + + + +
          +
        • +

          receiveResponse

          +
          void receiveResponse(java.lang.String message)
          +
        • +
        + + + +
          +
        • +

          runIfWaitingForDebugger

          +
          void runIfWaitingForDebugger(int contextGroupId)
          +
        • +
        + + + +
          +
        • +

          sendRequest

          +
          void sendRequest(java.lang.String message)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/IV8Native.html b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Native.html new file mode 100644 index 000000000..578e2bb87 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/IV8Native.html @@ -0,0 +1,1663 @@ + + + + + +IV8Native (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Interface IV8Native

    +
    +
    +
    +
      +
    • +
      +
      All Known Subinterfaces:
      +
      INodeNative
      +
      +
      +
      +
      public interface IV8Native
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods 
        Modifier and TypeMethod and Description
        voidadd(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object value) 
        voidallowCodeGenerationFromStrings(long v8RuntimeHandle, + boolean allow) 
        voidawait(long v8RuntimeHandle) 
        java.lang.Objectcall(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object receiver, + boolean returnResult, + java.lang.Object[] values) 
        java.lang.ObjectcallAsConstructor(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object[] values) 
        voidclearInternalStatistic() 
        voidclearWeak(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectcloneV8Value(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        voidcloseV8Runtime(long v8RuntimeHandle) 
        java.lang.Objectcompile(long v8RuntimeHandle, + java.lang.String script, + boolean returnResult, + java.lang.String resourceName, + int resourceLineOffset, + int resourceColumnOffset, + int scriptId, + boolean isWASM, + boolean isModule) 
        voidcreateV8Inspector(long v8RuntimeHandle, + java.lang.Object v8Inspector) 
        longcreateV8Runtime(java.lang.String globalName) 
        java.lang.ObjectcreateV8Value(long v8RuntimeHandle, + int v8ValueType, + java.lang.Object context) 
        booleandelete(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object key) 
        booleandeletePrivateProperty(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.String key) 
        booleanequals(long v8RuntimeHandle, + long v8ValueHandle1, + long v8ValueHandle2) 
        java.lang.Objectexecute(long v8RuntimeHandle, + java.lang.String script, + boolean returnResult, + java.lang.String resourceName, + int resourceLineOffset, + int resourceColumnOffset, + int scriptId, + boolean isWASM, + boolean isModule) 
        java.lang.Objectget(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object key) 
        java.lang.ObjectgetGlobalObject(long v8RuntimeHandle) 
        intgetIdentityHash(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectgetInternalProperties(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        long[]getInternalStatistic() 
        intgetJSFunctionType(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        intgetJSScopeType(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        intgetLength(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectgetOwnPropertyNames(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectgetPrivateProperty(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.String propertyName) 
        java.lang.ObjectgetProperty(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object key) 
        java.lang.ObjectgetPropertyNames(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectgetPrototype(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        intgetSize(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.StringgetSourceCode(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.StringgetVersion() 
        booleanhas(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object value) 
        booleanhasOwnProperty(long v8RuntimeHandle, + long v8ValueHandle, + int type, + java.lang.Object key) 
        booleanhasPrivateProperty(long v8RuntimeHandle, + long v8ValueHandle, + int type, + java.lang.String propertyName) 
        voididleNotificationDeadline(long v8RuntimeHandle, + long deadlineInMillis) 
        java.lang.Objectinvoke(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.String functionName, + boolean returnResult, + java.lang.Object[] values) 
        booleanisDead(long v8RuntimeHandle) 
        booleanisInUse(long v8RuntimeHandle) 
        booleanisWeak(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        booleanlockV8Runtime(long v8RuntimeHandle) 
        voidlowMemoryNotification(long v8RuntimeHandle) 
        java.lang.ObjectmoduleEvaluate(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + boolean resultRequired) 
        java.lang.ObjectmoduleGetException(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectmoduleGetNamespace(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        intmoduleGetScriptId(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        intmoduleGetStatus(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        booleanmoduleInstantiate(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectpromiseCatch(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + long v8ValueFunctionHandle) 
        java.lang.ObjectpromiseGetPromise(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectpromiseGetResult(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        intpromiseGetState(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        booleanpromiseHasHandler(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        voidpromiseMarkAsHandled(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        booleanpromiseReject(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object value) 
        booleanpromiseResolve(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object value) 
        java.lang.ObjectpromiseThen(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + long v8ValueFunctionFulfilledHandle, + long v8ValueFunctionRejectedHandle) 
        java.lang.ObjectproxyGetHandler(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.ObjectproxyGetTarget(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        booleanproxyIsRevoked(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        voidproxyRevoke(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        voidregisterV8Runtime(long v8RuntimeHandle, + java.lang.Object v8Runtime) 
        voidremoveJNIGlobalRef(long handle) 
        voidremoveReferenceHandle(long referenceHandle, + int referenceType) 
        voidrequestGarbageCollectionForTesting(long v8RuntimeHandle, + boolean fullGC) 
        voidresetV8Context(long v8RuntimeHandle, + java.lang.String globalName) 
        voidresetV8Isolate(long v8RuntimeHandle, + java.lang.String globalName) 
        booleansameValue(long v8RuntimeHandle, + long v8ValueHandle1, + long v8ValueHandle2) 
        java.lang.ObjectscriptRun(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + boolean resultRequired) 
        booleanset(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object key, + java.lang.Object value) 
        booleansetAccessor(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object propertyName, + java.lang.Object getter, + java.lang.Object setter) 
        voidsetFlags(java.lang.String flags) +
        Sets flags.
        +
        booleansetPrivateProperty(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.String key, + java.lang.Object value) 
        booleansetProperty(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object key, + java.lang.Object value) 
        booleansetPrototype(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + long v8ValueHandlePrototype) 
        booleansetSourceCode(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.String sourceCode) 
        voidsetWeak(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType, + java.lang.Object objectReference) 
        booleanstrictEquals(long v8RuntimeHandle, + long v8ValueHandle1, + long v8ValueHandle2) 
        voidterminateExecution(long v8RuntimeHandle) 
        java.lang.StringtoProtoString(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        java.lang.StringtoString(long v8RuntimeHandle, + long v8ValueHandle, + int v8ValueType) 
        booleanunlockV8Runtime(long v8RuntimeHandle) 
        voidv8InspectorSend(long v8RuntimeHandle, + java.lang.String message) 
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          add

          +
          void add(long v8RuntimeHandle,
          +         long v8ValueHandle,
          +         int v8ValueType,
          +         java.lang.Object value)
          +
        • +
        + + + +
          +
        • +

          allowCodeGenerationFromStrings

          +
          void allowCodeGenerationFromStrings(long v8RuntimeHandle,
          +                                    boolean allow)
          +
        • +
        + + + +
          +
        • +

          await

          +
          void await(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          call

          +
          java.lang.Object call(long v8RuntimeHandle,
          +                      long v8ValueHandle,
          +                      int v8ValueType,
          +                      java.lang.Object receiver,
          +                      boolean returnResult,
          +                      java.lang.Object[] values)
          +
        • +
        + + + +
          +
        • +

          callAsConstructor

          +
          java.lang.Object callAsConstructor(long v8RuntimeHandle,
          +                                   long v8ValueHandle,
          +                                   int v8ValueType,
          +                                   java.lang.Object[] values)
          +
        • +
        + + + +
          +
        • +

          clearInternalStatistic

          +
          void clearInternalStatistic()
          +
        • +
        + + + +
          +
        • +

          clearWeak

          +
          void clearWeak(long v8RuntimeHandle,
          +               long v8ValueHandle,
          +               int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          cloneV8Value

          +
          java.lang.Object cloneV8Value(long v8RuntimeHandle,
          +                              long v8ValueHandle,
          +                              int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          closeV8Runtime

          +
          void closeV8Runtime(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          compile

          +
          java.lang.Object compile(long v8RuntimeHandle,
          +                         java.lang.String script,
          +                         boolean returnResult,
          +                         java.lang.String resourceName,
          +                         int resourceLineOffset,
          +                         int resourceColumnOffset,
          +                         int scriptId,
          +                         boolean isWASM,
          +                         boolean isModule)
          +
        • +
        + + + +
          +
        • +

          createV8Inspector

          +
          void createV8Inspector(long v8RuntimeHandle,
          +                       java.lang.Object v8Inspector)
          +
        • +
        + + + +
          +
        • +

          createV8Runtime

          +
          long createV8Runtime(java.lang.String globalName)
          +
        • +
        + + + +
          +
        • +

          createV8Value

          +
          java.lang.Object createV8Value(long v8RuntimeHandle,
          +                               int v8ValueType,
          +                               java.lang.Object context)
          +
        • +
        + + + +
          +
        • +

          delete

          +
          boolean delete(long v8RuntimeHandle,
          +               long v8ValueHandle,
          +               int v8ValueType,
          +               java.lang.Object key)
          +
        • +
        + + + +
          +
        • +

          deletePrivateProperty

          +
          boolean deletePrivateProperty(long v8RuntimeHandle,
          +                              long v8ValueHandle,
          +                              int v8ValueType,
          +                              java.lang.String key)
          +
        • +
        + + + +
          +
        • +

          equals

          +
          boolean equals(long v8RuntimeHandle,
          +               long v8ValueHandle1,
          +               long v8ValueHandle2)
          +
        • +
        + + + +
          +
        • +

          execute

          +
          java.lang.Object execute(long v8RuntimeHandle,
          +                         java.lang.String script,
          +                         boolean returnResult,
          +                         java.lang.String resourceName,
          +                         int resourceLineOffset,
          +                         int resourceColumnOffset,
          +                         int scriptId,
          +                         boolean isWASM,
          +                         boolean isModule)
          +
        • +
        + + + +
          +
        • +

          get

          +
          java.lang.Object get(long v8RuntimeHandle,
          +                     long v8ValueHandle,
          +                     int v8ValueType,
          +                     java.lang.Object key)
          +
        • +
        + + + +
          +
        • +

          getGlobalObject

          +
          java.lang.Object getGlobalObject(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          getIdentityHash

          +
          int getIdentityHash(long v8RuntimeHandle,
          +                    long v8ValueHandle,
          +                    int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getInternalProperties

          +
          java.lang.Object getInternalProperties(long v8RuntimeHandle,
          +                                       long v8ValueHandle,
          +                                       int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getInternalStatistic

          +
          long[] getInternalStatistic()
          +
        • +
        + + + +
          +
        • +

          getJSFunctionType

          +
          int getJSFunctionType(long v8RuntimeHandle,
          +                      long v8ValueHandle,
          +                      int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getJSScopeType

          +
          int getJSScopeType(long v8RuntimeHandle,
          +                   long v8ValueHandle,
          +                   int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getLength

          +
          int getLength(long v8RuntimeHandle,
          +              long v8ValueHandle,
          +              int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getOwnPropertyNames

          +
          java.lang.Object getOwnPropertyNames(long v8RuntimeHandle,
          +                                     long v8ValueHandle,
          +                                     int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getPrivateProperty

          +
          java.lang.Object getPrivateProperty(long v8RuntimeHandle,
          +                                    long v8ValueHandle,
          +                                    int v8ValueType,
          +                                    java.lang.String propertyName)
          +
        • +
        + + + +
          +
        • +

          getProperty

          +
          java.lang.Object getProperty(long v8RuntimeHandle,
          +                             long v8ValueHandle,
          +                             int v8ValueType,
          +                             java.lang.Object key)
          +
        • +
        + + + +
          +
        • +

          getPropertyNames

          +
          java.lang.Object getPropertyNames(long v8RuntimeHandle,
          +                                  long v8ValueHandle,
          +                                  int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getPrototype

          +
          java.lang.Object getPrototype(long v8RuntimeHandle,
          +                              long v8ValueHandle,
          +                              int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getSize

          +
          int getSize(long v8RuntimeHandle,
          +            long v8ValueHandle,
          +            int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getSourceCode

          +
          java.lang.String getSourceCode(long v8RuntimeHandle,
          +                               long v8ValueHandle,
          +                               int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          getVersion

          +
          java.lang.String getVersion()
          +
        • +
        + + + +
          +
        • +

          has

          +
          boolean has(long v8RuntimeHandle,
          +            long v8ValueHandle,
          +            int v8ValueType,
          +            java.lang.Object value)
          +
        • +
        + + + +
          +
        • +

          hasOwnProperty

          +
          boolean hasOwnProperty(long v8RuntimeHandle,
          +                       long v8ValueHandle,
          +                       int type,
          +                       java.lang.Object key)
          +
        • +
        + + + +
          +
        • +

          hasPrivateProperty

          +
          boolean hasPrivateProperty(long v8RuntimeHandle,
          +                           long v8ValueHandle,
          +                           int type,
          +                           java.lang.String propertyName)
          +
        • +
        + + + +
          +
        • +

          idleNotificationDeadline

          +
          void idleNotificationDeadline(long v8RuntimeHandle,
          +                              long deadlineInMillis)
          +
        • +
        + + + +
          +
        • +

          invoke

          +
          java.lang.Object invoke(long v8RuntimeHandle,
          +                        long v8ValueHandle,
          +                        int v8ValueType,
          +                        java.lang.String functionName,
          +                        boolean returnResult,
          +                        java.lang.Object[] values)
          +
        • +
        + + + +
          +
        • +

          isDead

          +
          boolean isDead(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          isInUse

          +
          boolean isInUse(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          isWeak

          +
          boolean isWeak(long v8RuntimeHandle,
          +               long v8ValueHandle,
          +               int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          lockV8Runtime

          +
          boolean lockV8Runtime(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          lowMemoryNotification

          +
          void lowMemoryNotification(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          moduleEvaluate

          +
          java.lang.Object moduleEvaluate(long v8RuntimeHandle,
          +                                long v8ValueHandle,
          +                                int v8ValueType,
          +                                boolean resultRequired)
          +
        • +
        + + + +
          +
        • +

          moduleGetException

          +
          java.lang.Object moduleGetException(long v8RuntimeHandle,
          +                                    long v8ValueHandle,
          +                                    int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          moduleGetNamespace

          +
          java.lang.Object moduleGetNamespace(long v8RuntimeHandle,
          +                                    long v8ValueHandle,
          +                                    int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          moduleGetScriptId

          +
          int moduleGetScriptId(long v8RuntimeHandle,
          +                      long v8ValueHandle,
          +                      int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          moduleGetStatus

          +
          int moduleGetStatus(long v8RuntimeHandle,
          +                    long v8ValueHandle,
          +                    int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          moduleInstantiate

          +
          boolean moduleInstantiate(long v8RuntimeHandle,
          +                          long v8ValueHandle,
          +                          int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          promiseCatch

          +
          java.lang.Object promiseCatch(long v8RuntimeHandle,
          +                              long v8ValueHandle,
          +                              int v8ValueType,
          +                              long v8ValueFunctionHandle)
          +
        • +
        + + + +
          +
        • +

          promiseGetPromise

          +
          java.lang.Object promiseGetPromise(long v8RuntimeHandle,
          +                                   long v8ValueHandle,
          +                                   int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          promiseGetResult

          +
          java.lang.Object promiseGetResult(long v8RuntimeHandle,
          +                                  long v8ValueHandle,
          +                                  int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          promiseGetState

          +
          int promiseGetState(long v8RuntimeHandle,
          +                    long v8ValueHandle,
          +                    int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          promiseHasHandler

          +
          boolean promiseHasHandler(long v8RuntimeHandle,
          +                          long v8ValueHandle,
          +                          int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          promiseMarkAsHandled

          +
          void promiseMarkAsHandled(long v8RuntimeHandle,
          +                          long v8ValueHandle,
          +                          int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          promiseReject

          +
          boolean promiseReject(long v8RuntimeHandle,
          +                      long v8ValueHandle,
          +                      int v8ValueType,
          +                      java.lang.Object value)
          +
        • +
        + + + +
          +
        • +

          promiseResolve

          +
          boolean promiseResolve(long v8RuntimeHandle,
          +                       long v8ValueHandle,
          +                       int v8ValueType,
          +                       java.lang.Object value)
          +
        • +
        + + + +
          +
        • +

          promiseThen

          +
          java.lang.Object promiseThen(long v8RuntimeHandle,
          +                             long v8ValueHandle,
          +                             int v8ValueType,
          +                             long v8ValueFunctionFulfilledHandle,
          +                             long v8ValueFunctionRejectedHandle)
          +
        • +
        + + + +
          +
        • +

          proxyGetHandler

          +
          java.lang.Object proxyGetHandler(long v8RuntimeHandle,
          +                                 long v8ValueHandle,
          +                                 int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          proxyGetTarget

          +
          java.lang.Object proxyGetTarget(long v8RuntimeHandle,
          +                                long v8ValueHandle,
          +                                int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          proxyIsRevoked

          +
          boolean proxyIsRevoked(long v8RuntimeHandle,
          +                       long v8ValueHandle,
          +                       int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          proxyRevoke

          +
          void proxyRevoke(long v8RuntimeHandle,
          +                 long v8ValueHandle,
          +                 int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          registerV8Runtime

          +
          void registerV8Runtime(long v8RuntimeHandle,
          +                       java.lang.Object v8Runtime)
          +
        • +
        + + + +
          +
        • +

          removeJNIGlobalRef

          +
          void removeJNIGlobalRef(long handle)
          +
        • +
        + + + +
          +
        • +

          removeReferenceHandle

          +
          void removeReferenceHandle(long referenceHandle,
          +                           int referenceType)
          +
        • +
        + + + +
          +
        • +

          requestGarbageCollectionForTesting

          +
          void requestGarbageCollectionForTesting(long v8RuntimeHandle,
          +                                        boolean fullGC)
          +
        • +
        + + + +
          +
        • +

          resetV8Context

          +
          void resetV8Context(long v8RuntimeHandle,
          +                    java.lang.String globalName)
          +
        • +
        + + + +
          +
        • +

          resetV8Isolate

          +
          void resetV8Isolate(long v8RuntimeHandle,
          +                    java.lang.String globalName)
          +
        • +
        + + + +
          +
        • +

          sameValue

          +
          boolean sameValue(long v8RuntimeHandle,
          +                  long v8ValueHandle1,
          +                  long v8ValueHandle2)
          +
        • +
        + + + +
          +
        • +

          scriptRun

          +
          java.lang.Object scriptRun(long v8RuntimeHandle,
          +                           long v8ValueHandle,
          +                           int v8ValueType,
          +                           boolean resultRequired)
          +
        • +
        + + + +
          +
        • +

          set

          +
          boolean set(long v8RuntimeHandle,
          +            long v8ValueHandle,
          +            int v8ValueType,
          +            java.lang.Object key,
          +            java.lang.Object value)
          +
        • +
        + + + +
          +
        • +

          setAccessor

          +
          boolean setAccessor(long v8RuntimeHandle,
          +                    long v8ValueHandle,
          +                    int v8ValueType,
          +                    java.lang.Object propertyName,
          +                    java.lang.Object getter,
          +                    java.lang.Object setter)
          +
        • +
        + + + +
          +
        • +

          setFlags

          +
          void setFlags(java.lang.String flags)
          +
          Sets flags. +

          + Famous flags: + --use_strict type: bool default: false

          +
          +
          Parameters:
          +
          flags - the flags
          +
          +
        • +
        + + + +
          +
        • +

          setPrivateProperty

          +
          boolean setPrivateProperty(long v8RuntimeHandle,
          +                           long v8ValueHandle,
          +                           int v8ValueType,
          +                           java.lang.String key,
          +                           java.lang.Object value)
          +
        • +
        + + + +
          +
        • +

          setProperty

          +
          boolean setProperty(long v8RuntimeHandle,
          +                    long v8ValueHandle,
          +                    int v8ValueType,
          +                    java.lang.Object key,
          +                    java.lang.Object value)
          +
        • +
        + + + +
          +
        • +

          setPrototype

          +
          boolean setPrototype(long v8RuntimeHandle,
          +                     long v8ValueHandle,
          +                     int v8ValueType,
          +                     long v8ValueHandlePrototype)
          +
        • +
        + + + +
          +
        • +

          setSourceCode

          +
          boolean setSourceCode(long v8RuntimeHandle,
          +                      long v8ValueHandle,
          +                      int v8ValueType,
          +                      java.lang.String sourceCode)
          +
        • +
        + + + +
          +
        • +

          setWeak

          +
          void setWeak(long v8RuntimeHandle,
          +             long v8ValueHandle,
          +             int v8ValueType,
          +             java.lang.Object objectReference)
          +
        • +
        + + + +
          +
        • +

          strictEquals

          +
          boolean strictEquals(long v8RuntimeHandle,
          +                     long v8ValueHandle1,
          +                     long v8ValueHandle2)
          +
        • +
        + + + +
          +
        • +

          terminateExecution

          +
          void terminateExecution(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          toProtoString

          +
          java.lang.String toProtoString(long v8RuntimeHandle,
          +                               long v8ValueHandle,
          +                               int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          toString

          +
          java.lang.String toString(long v8RuntimeHandle,
          +                          long v8ValueHandle,
          +                          int v8ValueType)
          +
        • +
        + + + +
          +
        • +

          unlockV8Runtime

          +
          boolean unlockV8Runtime(long v8RuntimeHandle)
          +
        • +
        + + + +
          +
        • +

          v8InspectorSend

          +
          void v8InspectorSend(long v8RuntimeHandle,
          +                     java.lang.String message)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/JavetLibLoader.html b/docs/reference/javadoc/com/caoccao/javet/interop/JavetLibLoader.html new file mode 100644 index 000000000..a881aed0b --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/JavetLibLoader.html @@ -0,0 +1,319 @@ + + + + + +JavetLibLoader (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class JavetLibLoader

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.JavetLibLoader
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetLibLoader
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetLibLoader

          +
          public JavetLibLoader(JSRuntimeType jsRuntimeType)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/NodeRuntime.html b/docs/reference/javadoc/com/caoccao/javet/interop/NodeRuntime.html new file mode 100644 index 000000000..fa264148a --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/NodeRuntime.html @@ -0,0 +1,467 @@ + + + + + +NodeRuntime (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class NodeRuntime

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/V8Flags.html b/docs/reference/javadoc/com/caoccao/javet/interop/V8Flags.html new file mode 100644 index 000000000..fb5f6d8e1 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/V8Flags.html @@ -0,0 +1,377 @@ + + + + + +V8Flags (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class V8Flags

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.V8Flags
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class V8Flags
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          isAllowNativesSyntax

          +
          public boolean isAllowNativesSyntax()
          +
        • +
        + + + +
          +
        • +

          isExposeGC

          +
          public boolean isExposeGC()
          +
        • +
        + + + +
          +
        • +

          isExposeInspectorScripts

          +
          public boolean isExposeInspectorScripts()
          +
        • +
        + + + +
          +
        • +

          isSealed

          +
          public boolean isSealed()
          +
        • +
        + + + +
          +
        • +

          isTrackRetainingPath

          +
          public boolean isTrackRetainingPath()
          +
        • +
        + + + +
          +
        • +

          isUseStrict

          +
          public boolean isUseStrict()
          +
        • +
        + + + +
          +
        • +

          seal

          +
          public void seal()
          +
        • +
        + + + +
          +
        • +

          setAllowNativesSyntax

          +
          public void setAllowNativesSyntax(boolean allowNativesSyntax)
          +
        • +
        + + + +
          +
        • +

          setExposeGC

          +
          public void setExposeGC(boolean exposeGC)
          +
        • +
        + + + +
          +
        • +

          setExposeInspectorScripts

          +
          public void setExposeInspectorScripts(boolean exposeInspectorScripts)
          +
        • +
        + + + +
          +
        • +

          setTrackRetainingPath

          +
          public void setTrackRetainingPath(boolean trackRetainingPath)
          +
        • +
        + + + +
          +
        • +

          setUseStrict

          +
          public void setUseStrict(boolean useStrict)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/V8Host.html b/docs/reference/javadoc/com/caoccao/javet/interop/V8Host.html new file mode 100644 index 000000000..22d3881cb --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/V8Host.html @@ -0,0 +1,891 @@ + + + + + +V8Host (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class V8Host

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.V8Host
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.lang.AutoCloseable
      +
      +
      +
      +
      public final class V8Host
      +extends java.lang.Object
      +implements java.lang.AutoCloseable
      +
      The type V8 host.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          GLOBAL_THIS

          +
          public static final java.lang.String GLOBAL_THIS
          +
          The constant GLOBAL_THIS.
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getInstance

          +
          public static V8Host getInstance(JSRuntimeType jsRuntimeType)
          +
          Gets instance by JS runtime type.
          +
          +
          Parameters:
          +
          jsRuntimeType - the JS runtime type
          +
          Returns:
          +
          the instance
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getMemoryUsageThresholdRatio

          +
          public static double getMemoryUsageThresholdRatio()
          +
          Gets memory usage threshold ratio.
          +
          +
          Returns:
          +
          the memory usage threshold ratio
          +
          Since:
          +
          0.8.3
          +
          +
        • +
        + + + +
          +
        • +

          getNodeInstance

          +
          public static V8Host getNodeInstance()
          +
          Gets Node instance. +

          + Note: Node runtime library is loaded by a custom class loader.

          +
          +
          Returns:
          +
          the Node instance
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getV8Instance

          +
          public static V8Host getV8Instance()
          +
          Gets V8 instance. +

          + Note: V8 runtime library is loaded by a custom class loader.

          +
          +
          Returns:
          +
          the V8 instance
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          isLibraryReloadable

          +
          public static boolean isLibraryReloadable()
          +
          Determines whether the JNI library is reloadable or not.
          +
          +
          Returns:
          +
          true: reloadable, false: not reloadable, default: false
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          setLibraryReloadable

          +
          public static void setLibraryReloadable(boolean libraryReloadable)
          +
          Sets whether the JNI library is reloadable or not.
          +
          +
          Parameters:
          +
          libraryReloadable - true: reloadable, false: not reloadable
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          setMemoryUsageThresholdRatio

          +
          public static void setMemoryUsageThresholdRatio(double memoryUsageThresholdRatio)
          +
          Sets memory usage threshold ratio. +

          + This manageable usage threshold attribute is designed for monitoring + the increasing trend of memory usage with low overhead.

          +
          +
          Parameters:
          +
          memoryUsageThresholdRatio - the memory usage threshold ratio
          +
          Since:
          +
          0.8.3
          +
          +
        • +
        + + + +
          +
        • +

          clearInternalStatistic

          +
          public void clearInternalStatistic()
          +
          Clear internal statistic for internal test purpose.
          +
        • +
        + + + +
          +
        • +

          close

          +
          public void close()
          +           throws JavetException
          +
          +
          Specified by:
          +
          close in interface java.lang.AutoCloseable
          +
          Throws:
          +
          JavetException
          +
          +
        • +
        + + + +
          +
        • +

          closeV8Runtime

          +
          public void closeV8Runtime(V8Runtime v8Runtime)
          +
          Close V8 runtime.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          createV8Runtime

          +
          public <R extends V8Runtime> R createV8Runtime()
          +                                        throws JavetException
          +
          Create V8 runtime.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          Returns:
          +
          the V8 runtime
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          createV8Runtime

          +
          public <R extends V8Runtime> R createV8Runtime(java.lang.String globalName)
          +                                        throws JavetException
          +
          Create V8 runtime.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          Parameters:
          +
          globalName - the global name
          +
          Returns:
          +
          the V8 runtime
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          createV8Runtime

          +
          public <R extends V8Runtime> R createV8Runtime(boolean pooled,
          +                                               java.lang.String globalName)
          +                                        throws JavetException
          +
          Create V8 runtime.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          Parameters:
          +
          pooled - the pooled
          +
          globalName - the global name
          +
          Returns:
          +
          the V8 runtime
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          disableGCNotification

          +
          public V8Host disableGCNotification()
          +
          Disable GC notification.
          +
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.8.3
          +
          +
        • +
        + + + +
          +
        • +

          enableGCNotification

          +
          public V8Host enableGCNotification()
          +
          Enable GC notification.
          +
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.8.3
          +
          +
        • +
        + + + +
          +
        • +

          getFlags

          +
          public V8Flags getFlags()
          +
          Gets flags.
          +
          +
          Returns:
          +
          the flags
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getInternalStatistic

          +
          public long[] getInternalStatistic()
          +
          Get internal statistic internal for test purpose.
          +
          +
          Returns:
          +
          the long [ ]
          +
          Since:
          +
          0.8.3
          +
          +
        • +
        + + + +
          +
        • +

          getJSRuntimeType

          +
          public JSRuntimeType getJSRuntimeType()
          +
          Gets JS runtime type.
          +
          +
          Returns:
          +
          the JS runtime type
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getJavetVersion

          +
          public java.lang.String getJavetVersion()
          +
          Gets javet version.
          +
          +
          Returns:
          +
          the javet version
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        + + + +
          +
        • +

          getLastException

          +
          public JavetException getLastException()
          +
          Gets last exception.
          +
          +
          Returns:
          +
          the last exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getLogger

          +
          public IJavetLogger getLogger()
          +
          Gets logger.
          +
          +
          Returns:
          +
          the logger
          +
          Since:
          +
          0.7.3
          +
          +
        • +
        + + + +
          +
        • +

          getV8RuntimeCount

          +
          public int getV8RuntimeCount()
          +
          Gets V8 runtime count.
          +
          +
          Returns:
          +
          the V8 runtime count
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          isIsolateCreated

          +
          public boolean isIsolateCreated()
          +
          Is isolate created.
          +
          +
          Returns:
          +
          true: created, false: not created
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          isLibraryLoaded

          +
          public boolean isLibraryLoaded()
          +
          Is library loaded.
          +
          +
          Returns:
          +
          true: loaded, false: not loaded
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          loadLibrary

          +
          public boolean loadLibrary()
          +
          Load library. +

          + Note: setLibraryReloadable(true) must be called, otherwise, JVM will crash.

          +
          +
          Returns:
          +
          true: library is loaded, false: library is not loaded
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          setFlags

          +
          public boolean setFlags()
          +
          Sets flags.
          +
          +
          Returns:
          +
          true: flags are set, false: flags are not set
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          unloadLibrary

          +
          public boolean unloadLibrary()
          +
          Unload library. +

          + Note: setLibraryReloadable(true) must be called, otherwise, JVM will crash.

          +
          +
          Returns:
          +
          true: library is unloaded, false: library is loaded
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/V8Inspector.html b/docs/reference/javadoc/com/caoccao/javet/interop/V8Inspector.html new file mode 100644 index 000000000..7befcb18e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/V8Inspector.html @@ -0,0 +1,356 @@ + + + + + +V8Inspector (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class V8Inspector

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.V8Inspector
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class V8Inspector
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          flushProtocolNotifications

          +
          public void flushProtocolNotifications()
          +
        • +
        + + + + + + + +
          +
        • +

          getName

          +
          public java.lang.String getName()
          +
        • +
        + + + +
          +
        • +

          receiveNotification

          +
          public void receiveNotification(java.lang.String message)
          +
        • +
        + + + +
          +
        • +

          receiveResponse

          +
          public void receiveResponse(java.lang.String message)
          +
        • +
        + + + + + + + +
          +
        • +

          runIfWaitingForDebugger

          +
          public void runIfWaitingForDebugger(int contextGroupId)
          +
        • +
        + + + + + + + +
          +
        • +

          setLogger

          +
          public void setLogger(IJavetLogger logger)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/V8Locker.html b/docs/reference/javadoc/com/caoccao/javet/interop/V8Locker.html new file mode 100644 index 000000000..bb47e0b3c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/V8Locker.html @@ -0,0 +1,299 @@ + + + + + +V8Locker (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class V8Locker

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.V8Locker
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, java.lang.AutoCloseable
      +
      +
      +
      +
      public final class V8Locker
      +extends java.lang.Object
      +implements IJavetClosable
      +
      The type V8 locker. + It's designed for performance sensitive scenarios.
      +
      +
      Since:
      +
      0.7.3
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidclose() 
        booleanisClosed() +
        Is closed.
        +
        booleanisLocked() +
        Is locked.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          isClosed

          +
          public boolean isClosed()
          +
          Description copied from interface: IJavetClosable
          +
          Is closed.
          +
          +
          Specified by:
          +
          isClosed in interface IJavetClosable
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          isLocked

          +
          public boolean isLocked()
          +
          Is locked.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/V8Notifier.html b/docs/reference/javadoc/com/caoccao/javet/interop/V8Notifier.html new file mode 100644 index 000000000..97744252d --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/V8Notifier.html @@ -0,0 +1,305 @@ + + + + + +V8Notifier (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class V8Notifier

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.V8Notifier
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.util.EventListener, javax.management.NotificationListener
      +
      +
      +
      +
      public final class V8Notifier
      +extends java.lang.Object
      +implements javax.management.NotificationListener
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        V8Notifier(java.util.concurrent.ConcurrentHashMap<java.lang.Long,V8Runtime> v8RuntimeMap) 
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8Notifier

          +
          public V8Notifier(java.util.concurrent.ConcurrentHashMap<java.lang.Long,V8Runtime> v8RuntimeMap)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          handleNotification

          +
          public void handleNotification(javax.management.Notification notification,
          +                               java.lang.Object handback)
          +
          +
          Specified by:
          +
          handleNotification in interface javax.management.NotificationListener
          +
          +
        • +
        + + + +
          +
        • +

          registerListeners

          +
          public void registerListeners()
          +
        • +
        + + + +
          +
        • +

          unregisterListener

          +
          public void unregisterListener()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/V8Runtime.html b/docs/reference/javadoc/com/caoccao/javet/interop/V8Runtime.html new file mode 100644 index 000000000..b5a13361e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/V8Runtime.html @@ -0,0 +1,3330 @@ + + + + + +V8Runtime (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class V8Runtime

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.V8Runtime
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/V8ScriptOrigin.html b/docs/reference/javadoc/com/caoccao/javet/interop/V8ScriptOrigin.html new file mode 100644 index 000000000..365b34b78 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/V8ScriptOrigin.html @@ -0,0 +1,475 @@ + + + + + +V8ScriptOrigin (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop
    +

    Class V8ScriptOrigin

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.V8ScriptOrigin
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class V8ScriptOrigin
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ScriptOrigin

          +
          public V8ScriptOrigin(java.lang.String resourceName,
          +                      int resourceLineOffset,
          +                      int resourceColumnOffset,
          +                      int scriptId,
          +                      boolean wasm,
          +                      boolean module)
          +
        • +
        + + + +
          +
        • +

          V8ScriptOrigin

          +
          public V8ScriptOrigin()
          +
        • +
        + + + +
          +
        • +

          V8ScriptOrigin

          +
          public V8ScriptOrigin(java.lang.String resourceName)
          +
        • +
        + + + +
          +
        • +

          V8ScriptOrigin

          +
          public V8ScriptOrigin(java.lang.String resourceName,
          +                      int resourceLineOffset,
          +                      int resourceColumnOffset)
          +
        • +
        + + + +
          +
        • +

          V8ScriptOrigin

          +
          public V8ScriptOrigin(java.lang.String resourceName,
          +                      int scriptId)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getResourceColumnOffset

          +
          public int getResourceColumnOffset()
          +
        • +
        + + + +
          +
        • +

          getResourceLineOffset

          +
          public int getResourceLineOffset()
          +
        • +
        + + + +
          +
        • +

          getResourceName

          +
          public java.lang.String getResourceName()
          +
        • +
        + + + +
          +
        • +

          getScriptId

          +
          public int getScriptId()
          +
        • +
        + + + +
          +
        • +

          isModule

          +
          public boolean isModule()
          +
        • +
        + + + +
          +
        • +

          isWasm

          +
          public boolean isWasm()
          +
        • +
        + + + + + + + +
          +
        • +

          setResourceColumnOffset

          +
          public V8ScriptOrigin setResourceColumnOffset(int resourceColumnOffset)
          +
        • +
        + + + +
          +
        • +

          setResourceLineOffset

          +
          public V8ScriptOrigin setResourceLineOffset(int resourceLineOffset)
          +
        • +
        + + + +
          +
        • +

          setResourceName

          +
          public V8ScriptOrigin setResourceName(java.lang.String resourceName)
          +
        • +
        + + + +
          +
        • +

          setScriptId

          +
          public V8ScriptOrigin setScriptId(int scriptId)
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/binding/BindingContext.html b/docs/reference/javadoc/com/caoccao/javet/interop/binding/BindingContext.html new file mode 100644 index 000000000..26350ee82 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/binding/BindingContext.html @@ -0,0 +1,544 @@ + + + + + +BindingContext (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.binding
    +

    Class BindingContext

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.binding.BindingContext
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class BindingContext
      +extends java.lang.Object
      +
      The type Binding context.
      +
      +
      Since:
      +
      0.9.2
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          functionMap

          +
          protected java.util.Map<java.lang.String,MethodDescriptor> functionMap
          +
          The Function map.
          +
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          propertyGetterMap

          +
          protected java.util.Map<java.lang.String,MethodDescriptor> propertyGetterMap
          +
          The Property getter map.
          +
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          propertySetterMap

          +
          protected java.util.Map<java.lang.String,MethodDescriptor> propertySetterMap
          +
          The Property setter map.
          +
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          v8BindEnabler

          +
          protected java.lang.reflect.Method v8BindEnabler
          +
          The V8 bind enabler.
          +
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          v8RuntimeSetter

          +
          protected java.lang.reflect.Method v8RuntimeSetter
          +
          The V8 runtime setter.
          +
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          BindingContext

          +
          public BindingContext()
          +
          Instantiates a new Binding context.
          +
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getFunctionMap

          +
          public java.util.Map<java.lang.String,MethodDescriptor> getFunctionMap()
          +
          Gets function map.
          +
          +
          Returns:
          +
          the function map
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyGetterMap

          +
          public java.util.Map<java.lang.String,MethodDescriptor> getPropertyGetterMap()
          +
          Gets property getter map.
          +
          +
          Returns:
          +
          the property getter map
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          getPropertySetterMap

          +
          public java.util.Map<java.lang.String,MethodDescriptor> getPropertySetterMap()
          +
          Gets property setter map.
          +
          +
          Returns:
          +
          the property setter map
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          getV8BindEnabler

          +
          public java.lang.reflect.Method getV8BindEnabler()
          +
          Gets V8 bind enabler.
          +
          +
          Returns:
          +
          the V8 bind enabler
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          getV8RuntimeSetter

          +
          public java.lang.reflect.Method getV8RuntimeSetter()
          +
          Gets V8 runtime setter.
          +
          +
          Returns:
          +
          the V8 runtime setter
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          setV8BindEnabler

          +
          public void setV8BindEnabler(java.lang.reflect.Method v8BindEnabler)
          +
          Sets V8 bind enabler.
          +
          +
          Parameters:
          +
          v8BindEnabler - the V8 bind enabler
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          setV8RuntimeSetter

          +
          public void setV8RuntimeSetter(java.lang.reflect.Method v8RuntimeSetter)
          +
          Sets V8 runtime setter.
          +
          +
          Parameters:
          +
          v8RuntimeSetter - the V8 runtime setter
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/binding/MethodDescriptor.html b/docs/reference/javadoc/com/caoccao/javet/interop/binding/MethodDescriptor.html new file mode 100644 index 000000000..48b1ccf56 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/binding/MethodDescriptor.html @@ -0,0 +1,448 @@ + + + + + +MethodDescriptor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.binding
    +

    Class MethodDescriptor

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.binding.MethodDescriptor
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class MethodDescriptor
      +extends java.lang.Object
      +
      The type Method descriptor.
      +
      +
      Since:
      +
      0.9.2
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected java.lang.reflect.Methodmethod +
        The Method.
        +
        protected V8ValueSymbolTypesymbolType +
        The Symbol type.
        +
        protected booleanthisObjectRequired +
        The This object required.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + +
        Constructors 
        Constructor and Description
        MethodDescriptor(java.lang.reflect.Method method, + boolean thisObjectRequired) +
        Instantiates a new Method descriptor.
        +
        MethodDescriptor(java.lang.reflect.Method method, + boolean thisObjectRequired, + V8ValueSymbolType symbolType) +
        Instantiates a new Method descriptor.
        +
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          method

          +
          protected java.lang.reflect.Method method
          +
          The Method.
          +
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          symbolType

          +
          protected V8ValueSymbolType symbolType
          +
          The Symbol type.
          +
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          thisObjectRequired

          +
          protected boolean thisObjectRequired
          +
          The This object required.
          +
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          MethodDescriptor

          +
          public MethodDescriptor(java.lang.reflect.Method method,
          +                        boolean thisObjectRequired)
          +
          Instantiates a new Method descriptor.
          +
          +
          Parameters:
          +
          method - the method
          +
          thisObjectRequired - the this object required
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          MethodDescriptor

          +
          public MethodDescriptor(java.lang.reflect.Method method,
          +                        boolean thisObjectRequired,
          +                        V8ValueSymbolType symbolType)
          +
          Instantiates a new Method descriptor.
          +
          +
          Parameters:
          +
          method - the method
          +
          thisObjectRequired - the this object required
          +
          symbolType - the symbol type
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getMethod

          +
          public java.lang.reflect.Method getMethod()
          +
          Gets method.
          +
          +
          Returns:
          +
          the method
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        + + + +
          +
        • +

          getSymbolType

          +
          public V8ValueSymbolType getSymbolType()
          +
          Gets symbol type.
          +
          +
          Returns:
          +
          the symbol type
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          isThisObjectRequired

          +
          public boolean isThisObjectRequired()
          +
          Is this object required boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.2
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-frame.html new file mode 100644 index 000000000..6165aacb8 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-frame.html @@ -0,0 +1,20 @@ + + + + + +com.caoccao.javet.interop.binding (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interop.binding

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-summary.html new file mode 100644 index 000000000..7643b4059 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-summary.html @@ -0,0 +1,160 @@ + + + + + +com.caoccao.javet.interop.binding (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interop.binding

    +
    +
    Callback data structure for binding context and method descriptor.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      BindingContext +
      The type Binding context.
      +
      MethodDescriptor +
      The type Method descriptor.
      +
      +
    • +
    + + + +

    Package com.caoccao.javet.interop.binding Description

    +
    Callback data structure for binding context and method descriptor.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-tree.html new file mode 100644 index 000000000..11ce23ca1 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/binding/package-tree.html @@ -0,0 +1,135 @@ + + + + + +com.caoccao.javet.interop.binding Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interop.binding

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/callback/JavetCallbackContext.html b/docs/reference/javadoc/com/caoccao/javet/interop/callback/JavetCallbackContext.html new file mode 100644 index 000000000..62a663f91 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/callback/JavetCallbackContext.html @@ -0,0 +1,496 @@ + + + + + +JavetCallbackContext (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.callback
    +

    Class JavetCallbackContext

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.callback.JavetCallbackContext
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetCallbackContext
      +extends java.lang.Object
      +
      The type Javet callback context.
      +
      +
      Since:
      +
      0.7.1
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        static longINVALID_HANDLE +
        The constant INVALID_HANDLE.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetCallbackContext(java.lang.Object callbackReceiver, + java.lang.reflect.Method callbackMethod) +
        Instantiates a new Javet callback context.
        +
        JavetCallbackContext(java.lang.Object callbackReceiver, + java.lang.reflect.Method callbackMethod, + boolean thisObjectRequired) +
        Instantiates a new Javet callback context.
        +
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          INVALID_HANDLE

          +
          public static final long INVALID_HANDLE
          +
          The constant INVALID_HANDLE.
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetCallbackContext

          +
          public JavetCallbackContext(java.lang.Object callbackReceiver,
          +                            java.lang.reflect.Method callbackMethod)
          +
          Instantiates a new Javet callback context.
          +
          +
          Parameters:
          +
          callbackReceiver - the callback receiver
          +
          callbackMethod - the callback method
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        + + + +
          +
        • +

          JavetCallbackContext

          +
          public JavetCallbackContext(java.lang.Object callbackReceiver,
          +                            java.lang.reflect.Method callbackMethod,
          +                            boolean thisObjectRequired)
          +
          Instantiates a new Javet callback context.
          +
          +
          Parameters:
          +
          callbackReceiver - the callback receiver
          +
          callbackMethod - the callback method
          +
          thisObjectRequired - the this object required
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getCallbackMethod

          +
          public java.lang.reflect.Method getCallbackMethod()
          +
          Gets callback method.
          +
          +
          Returns:
          +
          the callback method
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          getCallbackReceiver

          +
          public java.lang.Object getCallbackReceiver()
          +
          Gets callback receiver.
          +
          +
          Returns:
          +
          the callback receiver
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        + + + +
          +
        • +

          getHandle

          +
          public long getHandle()
          +
          Gets handle.
          +
          +
          Returns:
          +
          the handle
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        + + + +
          +
        • +

          isReturnResult

          +
          public boolean isReturnResult()
          +
          Is return result.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          isThisObjectRequired

          +
          public boolean isThisObjectRequired()
          +
          Is this object required.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          isValid

          +
          public boolean isValid()
          +
          Is valid.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          setHandle

          +
          public void setHandle(long handle)
          +
          Sets handle.
          +
          +
          Parameters:
          +
          handle - the handle
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/callback/V8FunctionCallback.html b/docs/reference/javadoc/com/caoccao/javet/interop/callback/V8FunctionCallback.html new file mode 100644 index 000000000..7ce32a0ee --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/callback/V8FunctionCallback.html @@ -0,0 +1,296 @@ + + + + + +V8FunctionCallback (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.callback
    +

    Class V8FunctionCallback

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.callback.V8FunctionCallback
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class V8FunctionCallback
      +extends java.lang.Object
      +
      The type V8 function callback.
      +
      +
      Since:
      +
      0.8.3
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8FunctionCallback

          +
          public V8FunctionCallback()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          receiveCallback

          +
          public static V8Value receiveCallback(V8Runtime v8Runtime,
          +                                      JavetCallbackContext javetCallbackContext,
          +                                      V8Value thisObject,
          +                                      V8ValueArray args)
          +                               throws java.lang.Throwable
          +
          Receive callback V8 value.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          javetCallbackContext - the javet callback context
          +
          thisObject - the this object
          +
          args - the args
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          java.lang.Throwable - the throwable
          +
          Since:
          +
          0.8.3
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-frame.html new file mode 100644 index 000000000..def309fc2 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-frame.html @@ -0,0 +1,20 @@ + + + + + +com.caoccao.javet.interop.callback (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interop.callback

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-summary.html new file mode 100644 index 000000000..ae5b0f7ad --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-summary.html @@ -0,0 +1,160 @@ + + + + + +com.caoccao.javet.interop.callback (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interop.callback

    +
    +
    Callback bridge between JVM and C++ via JNI.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interop.callback Description

    +
    Callback bridge between JVM and C++ via JNI.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-tree.html new file mode 100644 index 000000000..7fde79f28 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/callback/package-tree.html @@ -0,0 +1,135 @@ + + + + + +com.caoccao.javet.interop.callback Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interop.callback

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/IJavetConverter.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/IJavetConverter.html new file mode 100644 index 000000000..2cf6074b7 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/IJavetConverter.html @@ -0,0 +1,332 @@ + + + + + +IJavetConverter (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.converters
    +

    Interface IJavetConverter

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getConfig

          +
          JavetConverterConfig getConfig()
          +
          Gets config.
          +
          +
          Returns:
          +
          the config
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          toObject

          +
          java.lang.Object toObject(V8Value v8Value)
          +                   throws JavetException
          +
          To object from V8 value. +

          + Don't override this function, instead, override the one with depth as argument + for circular structure detection.

          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        + + + +
          +
        • +

          toObject

          +
          default java.lang.Object toObject(V8Value v8Value,
          +                                  boolean autoClose)
          +                           throws JavetException
          +
          To object from V8 value and auto close the V8 value.
          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          autoClose - the auto close
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          toV8Value

          +
          @CheckReturnValue
          +<T extends V8Value> T toV8Value(V8Runtime v8Runtime,
          +                                                   java.lang.Object object)
          +                                            throws JavetException
          +
          To V8 value from object. +

          + Don't override this function, instead, override the one with depth as argument + for circular structure detection.

          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          object - the object
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetConverterConfig.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetConverterConfig.html new file mode 100644 index 000000000..7eb40e4ba --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetConverterConfig.html @@ -0,0 +1,1174 @@ + + + + + +JavetConverterConfig (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.converters
    +

    Class JavetConverterConfig<T extends JavetConverterConfig>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.converters.JavetConverterConfig<T>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - the type parameter
      +
      +
      +
      +
      public class JavetConverterConfig<T extends JavetConverterConfig>
      +extends java.lang.Object
      +
      The type Javet converter config.
      +
      +
      Since:
      +
      0.9.4
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          DEFAULT_MAX_DEPTH

          +
          public static final int DEFAULT_MAX_DEPTH
          +
          The constant DEFAULT_MAX_DEPTH.
          +
          +
          Since:
          +
          0.9.4
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          defaultBoolean

          +
          protected boolean defaultBoolean
          +
          The Default boolean.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          defaultByte

          +
          protected byte defaultByte
          +
          The Default byte.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          defaultChar

          +
          protected char defaultChar
          +
          The Default char.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          defaultDouble

          +
          protected double defaultDouble
          +
          The Default double.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          defaultFloat

          +
          protected float defaultFloat
          +
          The Default float.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          defaultInt

          +
          protected int defaultInt
          +
          The Default int.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          defaultLong

          +
          protected long defaultLong
          +
          The Default long.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          defaultShort

          +
          protected short defaultShort
          +
          The Default short.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          extractFunctionSourceCode

          +
          protected boolean extractFunctionSourceCode
          +
          The Extract function source code.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          maxDepth

          +
          protected int maxDepth
          +
          The Max depth.
          +
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          proxyMapEnabled

          +
          protected boolean proxyMapEnabled
          +
          The Proxy map enabled.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          proxySetEnabled

          +
          protected boolean proxySetEnabled
          +
          The Proxy set enabled.
          +
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + +
          +
        • +

          skipFunctionInObject

          +
          protected boolean skipFunctionInObject
          +
          This flag determines whether function should be skipped in object or not.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetConverterConfig

          +
          public JavetConverterConfig()
          +
          Instantiates a new Javet converter config.
          +
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getDefaultBoolean

          +
          public boolean getDefaultBoolean()
          +
          Gets default boolean boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getDefaultByte

          +
          public byte getDefaultByte()
          +
          Gets default byte.
          +
          +
          Returns:
          +
          the default byte
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getDefaultChar

          +
          public char getDefaultChar()
          +
          Gets default char.
          +
          +
          Returns:
          +
          the default char
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getDefaultDouble

          +
          public double getDefaultDouble()
          +
          Gets default double.
          +
          +
          Returns:
          +
          the default double
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getDefaultFloat

          +
          public float getDefaultFloat()
          +
          Gets default float.
          +
          +
          Returns:
          +
          the default float
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getDefaultInt

          +
          public int getDefaultInt()
          +
          Gets default int.
          +
          +
          Returns:
          +
          the default int
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getDefaultLong

          +
          public long getDefaultLong()
          +
          Gets default long.
          +
          +
          Returns:
          +
          the default long
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getDefaultShort

          +
          public short getDefaultShort()
          +
          Gets default short.
          +
          +
          Returns:
          +
          the default short
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          getMaxDepth

          +
          public int getMaxDepth()
          +
          Gets max depth.
          +
          +
          Returns:
          +
          the max depth
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          isExtractFunctionSourceCode

          +
          public boolean isExtractFunctionSourceCode()
          +
          Is extract function source code boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          isProxyMapEnabled

          +
          public boolean isProxyMapEnabled()
          +
          Is proxy map enabled.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          isProxySetEnabled

          +
          public boolean isProxySetEnabled()
          +
          Is proxy set enabled.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + +
          +
        • +

          isSkipFunctionInObject

          +
          public boolean isSkipFunctionInObject()
          +
          Is skip functions boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultBoolean

          +
          public T setDefaultBoolean(boolean defaultBoolean)
          +
          Sets default boolean.
          +
          +
          Parameters:
          +
          defaultBoolean - the default boolean
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultByte

          +
          public T setDefaultByte(byte defaultByte)
          +
          Sets default byte.
          +
          +
          Parameters:
          +
          defaultByte - the default byte
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultChar

          +
          public T setDefaultChar(char defaultChar)
          +
          Sets default char.
          +
          +
          Parameters:
          +
          defaultChar - the default char
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultDouble

          +
          public T setDefaultDouble(double defaultDouble)
          +
          Sets default double.
          +
          +
          Parameters:
          +
          defaultDouble - the default double
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultFloat

          +
          public T setDefaultFloat(float defaultFloat)
          +
          Sets default float.
          +
          +
          Parameters:
          +
          defaultFloat - the default float
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultInt

          +
          public T setDefaultInt(int defaultInt)
          +
          Sets default int.
          +
          +
          Parameters:
          +
          defaultInt - the default int
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultLong

          +
          public T setDefaultLong(long defaultLong)
          +
          Sets default long.
          +
          +
          Parameters:
          +
          defaultLong - the default long
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultShort

          +
          public T setDefaultShort(short defaultShort)
          +
          Sets default short.
          +
          +
          Parameters:
          +
          defaultShort - the default short
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setExtractFunctionSourceCode

          +
          public T setExtractFunctionSourceCode(boolean extractFunctionSourceCode)
          +
          Sets extract function source code.
          +
          +
          Parameters:
          +
          extractFunctionSourceCode - the extract function source code
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setMaxDepth

          +
          public T setMaxDepth(int maxDepth)
          +
          Sets max depth.
          +
          +
          Parameters:
          +
          maxDepth - the max depth
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          setProxyMapEnabled

          +
          public T setProxyMapEnabled(boolean proxyMapEnabled)
          +
          Sets proxy map enabled.
          +
          +
          Parameters:
          +
          proxyMapEnabled - the proxy map enabled
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          setProxySetEnabled

          +
          public T setProxySetEnabled(boolean proxySetEnabled)
          +
          Sets proxy set enabled.
          +
          +
          Parameters:
          +
          proxySetEnabled - the proxy set enabled
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + +
          +
        • +

          setSkipFunctionInObject

          +
          public T setSkipFunctionInObject(boolean skipFunctionInObject)
          +
          Sets skip functions.
          +
          +
          Parameters:
          +
          skipFunctionInObject - the skip functions
          +
          Returns:
          +
          the self
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetObjectConverter.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetObjectConverter.html new file mode 100644 index 000000000..952c55187 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetObjectConverter.html @@ -0,0 +1,752 @@ + + + + + +JavetObjectConverter (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.converters
    +

    Class JavetObjectConverter

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR

          +
          protected static final int EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR
          +
          The constant EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR.
          +
          +
          Since:
          +
          0.9.12
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          EXECUTABLE_INDEX_FROM_MAP

          +
          protected static final int EXECUTABLE_INDEX_FROM_MAP
          +
          The constant EXECUTABLE_INDEX_FROM_MAP.
          +
          +
          Since:
          +
          0.9.12
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          EXECUTABLE_INDEX_TO_MAP

          +
          protected static final int EXECUTABLE_INDEX_TO_MAP
          +
          The constant EXECUTABLE_INDEX_TO_MAP.
          +
          +
          Since:
          +
          0.9.12
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          METHOD_NAME_FROM_MAP

          +
          protected static final java.lang.String METHOD_NAME_FROM_MAP
          +
          The constant METHOD_NAME_FROM_MAP.
          +
          +
          Since:
          +
          0.9.12
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          METHOD_NAME_TO_MAP

          +
          protected static final java.lang.String METHOD_NAME_TO_MAP
          +
          The constant METHOD_NAME_TO_MAP.
          +
          +
          Since:
          +
          0.9.12
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME

          +
          protected static final java.lang.String PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME
          +
          The constant PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME.
          +
          +
          Since:
          +
          0.9.6
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PRIVATE_PROPERTY_PROXY_TARGET

          +
          protected static final java.lang.String PRIVATE_PROPERTY_PROXY_TARGET
          +
          The constant PRIVATE_PROPERTY_PROXY_TARGET.
          +
          +
          Since:
          +
          0.9.6
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PROPERTY_NAME

          +
          protected static final java.lang.String PROPERTY_NAME
          +
          The constant PROPERTY_NAME.
          +
          +
          Since:
          +
          0.7.2
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PUBLIC_PROPERTY_CONSTRUCTOR

          +
          protected static final java.lang.String PUBLIC_PROPERTY_CONSTRUCTOR
          +
          The constant PUBLIC_PROPERTY_CONSTRUCTOR.
          +
          +
          Since:
          +
          0.7.2
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          customObjectLock

          +
          protected java.util.concurrent.locks.ReentrantReadWriteLock customObjectLock
          +
          The Custom object lock.
          +
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          customObjectMap

          +
          protected java.util.Map<java.lang.String,java.lang.reflect.Executable[]> customObjectMap
          +
          The Custom object map.
          +
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetObjectConverter

          +
          public JavetObjectConverter()
          +
          Instantiates a new Javet object converter.
          +
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          createEntityFunction

          +
          protected IJavetEntityFunction createEntityFunction()
          +
          Create entity function javet entity function.
          +
          +
          Returns:
          +
          the javet entity function
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          createEntityMap

          +
          protected java.util.Map<java.lang.String,java.lang.Object> createEntityMap()
          +
          Create entity map map.
          +
          +
          Returns:
          +
          the map
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        + + + +
          +
        • +

          registerCustomObject

          +
          public boolean registerCustomObject(java.lang.Class<?> customObjectClass)
          +
          Register custom object.
          +
          +
          Parameters:
          +
          customObjectClass - the custom object class
          +
          Returns:
          +
          true : success, false: failure
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          registerCustomObject

          +
          public boolean registerCustomObject(java.lang.Class<?> customObjectClass,
          +                                    java.lang.String methodNameFromMap,
          +                                    java.lang.String methodNameToMap)
          +
          Register custom object.
          +
          +
          Parameters:
          +
          customObjectClass - the custom object class
          +
          methodNameFromMap - the method name from map
          +
          methodNameToMap - the method name to map
          +
          Returns:
          +
          true : success, false: failure
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          unregisterCustomObject

          +
          public boolean unregisterCustomObject(java.lang.Class<?> customObjectClass)
          +
          Unregister custom object.
          +
          +
          Parameters:
          +
          customObjectClass - the custom object class
          +
          Returns:
          +
          true : success, false: failure
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetPrimitiveConverter.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetPrimitiveConverter.html new file mode 100644 index 000000000..de8805f89 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetPrimitiveConverter.html @@ -0,0 +1,530 @@ + + + + + +JavetPrimitiveConverter (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.converters
    +

    Class JavetPrimitiveConverter

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.converters.JavetPrimitiveConverter
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetConverter
      +
      +
      +
      Direct Known Subclasses:
      +
      JavetObjectConverter
      +
      +
      +
      +
      public class JavetPrimitiveConverter
      +extends java.lang.Object
      +implements IJavetConverter
      +
      The type Javet primitive converter.
      +
      +
      Since:
      +
      0.7.1
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetPrimitiveConverter

          +
          public JavetPrimitiveConverter()
          +
          Instantiates a new Javet primitive converter.
          +
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          setConfig

          +
          public void setConfig(JavetConverterConfig config)
          +
          Sets config.
          +
          +
          Parameters:
          +
          config - the config
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          toObject

          +
          public final java.lang.Object toObject(V8Value v8Value)
          +                                throws JavetException
          +
          Description copied from interface: IJavetConverter
          +
          To object from V8 value. +

          + Don't override this function, instead, override the one with depth as argument + for circular structure detection.

          +
          +
          Specified by:
          +
          toObject in interface IJavetConverter
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          toObject

          +
          protected java.lang.Object toObject(V8Value v8Value,
          +                                    int depth)
          +                             throws JavetException
          +
          To object with stack depth.
          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          depth - the stack depth
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          toV8Value

          +
          @CheckReturnValue
          +public final <T extends V8Value> T toV8Value(V8Runtime v8Runtime,
          +                                                                java.lang.Object object)
          +                                                         throws JavetException
          +
          Description copied from interface: IJavetConverter
          +
          To V8 value from object. +

          + Don't override this function, instead, override the one with depth as argument + for circular structure detection.

          +
          +
          Specified by:
          +
          toV8Value in interface IJavetConverter
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          object - the object
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          toV8Value

          +
          @CheckReturnValue
          +protected <T extends V8Value> T toV8Value(V8Runtime v8Runtime,
          +                                                             java.lang.Object object,
          +                                                             int depth)
          +                                                      throws JavetException
          +
          To V8 value with stack depth.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          object - the object
          +
          depth - the stack depth
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        + + + +
          +
        • +

          validateDepth

          +
          protected void validateDepth(int depth)
          +                      throws JavetException
          +
          Validate the stack depth.
          +
          +
          Parameters:
          +
          depth - the stack depth
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.3
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetProxyConverter.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetProxyConverter.html new file mode 100644 index 000000000..982d870d4 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/JavetProxyConverter.html @@ -0,0 +1,398 @@ + + + + + +JavetProxyConverter (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.converters
    +

    Class JavetProxyConverter

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetConverter
      +
      +
      +
      +
      public class JavetProxyConverter
      +extends JavetObjectConverter
      +
      The type Javet proxy converter.
      +
      +
      Since:
      +
      0.9.6
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          DUMMY_FUNCTION_STRING

          +
          protected static final java.lang.String DUMMY_FUNCTION_STRING
          +
          The constant DUMMY_FUNCTION_STRING.
          +
          +
          Since:
          +
          0.9.8
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetProxyConverter

          +
          public JavetProxyConverter()
          +
          Instantiates a new Javet proxy converter.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-frame.html new file mode 100644 index 000000000..bcf02acb7 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-frame.html @@ -0,0 +1,26 @@ + + + + + +com.caoccao.javet.interop.converters (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interop.converters

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-summary.html new file mode 100644 index 000000000..ceeefc0da --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-summary.html @@ -0,0 +1,189 @@ + + + + + +com.caoccao.javet.interop.converters (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interop.converters

    +
    +
    Built-in converters, interface and config.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interop.converters Description

    +
    Built-in converters, interface and config.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-tree.html new file mode 100644 index 000000000..e8f62d821 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/converters/package-tree.html @@ -0,0 +1,147 @@ + + + + + +com.caoccao.javet.interop.converters Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interop.converters

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngine.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngine.html new file mode 100644 index 000000000..4bf47ec5c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngine.html @@ -0,0 +1,342 @@ + + + + + +IJavetEngine (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Interface IJavetEngine<R extends V8Runtime>

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngineGuard.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngineGuard.html new file mode 100644 index 000000000..f9005a82c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEngineGuard.html @@ -0,0 +1,326 @@ + + + + + +IJavetEngineGuard (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Interface IJavetEngineGuard

    +
    +
    +
    +
      +
    • +
      +
      All Superinterfaces:
      +
      java.lang.AutoCloseable, IJavetClosable, java.lang.Runnable
      +
      +
      +
      All Known Implementing Classes:
      +
      JavetEngineGuard
      +
      +
      +
      +
      public interface IJavetEngineGuard
      +extends IJavetClosable, java.lang.Runnable
      +
      The interface Javet engine guard is the one guarding the script execution with a timeout. +

      + Usage: + + + try (IJavetEngineGuard iJavetEngineGuard = iJavetEngine.getGuard(5000)) { + v8Runtime.getExecutor("while (true) {}").executeVoid(); + // That infinite loop will be terminated in 5 seconds by the guard. + } +

      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          cancel

          +
          void cancel()
          +
          Cancel.
          +
        • +
        + + + +
          +
        • +

          disableInDebugMode

          +
          void disableInDebugMode()
          +
          Disable in debug mode.
          +
        • +
        + + + +
          +
        • +

          enableInDebugMode

          +
          void enableInDebugMode()
          +
          Enable in debug mode.
          +
        • +
        + + + +
          +
        • +

          getTimeoutMillis

          +
          long getTimeoutMillis()
          +
          Gets timeout millis.
          +
          +
          Returns:
          +
          the timeout millis
          +
          +
        • +
        + + + +
          +
        • +

          setTimeoutMillis

          +
          void setTimeoutMillis(long timeoutMillis)
          +
          Sets timeout millis.
          +
          +
          Parameters:
          +
          timeoutMillis - the timeout millis
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEnginePool.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEnginePool.html new file mode 100644 index 000000000..d866abca9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/IJavetEnginePool.html @@ -0,0 +1,318 @@ + + + + + +IJavetEnginePool (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Interface IJavetEnginePool<R extends V8Runtime>

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngine.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngine.html new file mode 100644 index 000000000..a2337fb80 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngine.html @@ -0,0 +1,608 @@ + + + + + +JavetEngine (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Class JavetEngine<R extends V8Runtime>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.engine.JavetEngine<R>
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineConfig.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineConfig.html new file mode 100644 index 000000000..923676d9f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineConfig.html @@ -0,0 +1,830 @@ + + + + + +JavetEngineConfig (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Class JavetEngineConfig

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.engine.JavetEngineConfig
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetEngineConfig
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          DEFAULT_ENGINE_GUARD_TIMEOUT_MILLIS

          +
          public static final int DEFAULT_ENGINE_GUARD_TIMEOUT_MILLIS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_ENGINE_GUARD_CHECK_INTERVAL_MILLIS

          +
          public static final int DEFAULT_ENGINE_GUARD_CHECK_INTERVAL_MILLIS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_JS_RUNTIME_TYPE

          +
          public static final JSRuntimeType DEFAULT_JS_RUNTIME_TYPE
          +
        • +
        + + + +
          +
        • +

          DEFAULT_POOL_MIN_SIZE

          +
          public static final int DEFAULT_POOL_MIN_SIZE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_POOL_IDLE_TIMEOUT_SECONDS

          +
          public static final int DEFAULT_POOL_IDLE_TIMEOUT_SECONDS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_POOL_DAEMON_CHECK_INTERVAL_MILLIS

          +
          public static final int DEFAULT_POOL_DAEMON_CHECK_INTERVAL_MILLIS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_RESET_ENGINE_TIMEOUT_SECONDS

          +
          public static final int DEFAULT_RESET_ENGINE_TIMEOUT_SECONDS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_GLOBAL_NAME

          +
          public static final java.lang.String DEFAULT_GLOBAL_NAME
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_POOL_SHUTDOWN_TIMEOUT_SECONDS

          +
          public static final int DEFAULT_POOL_SHUTDOWN_TIMEOUT_SECONDS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_JAVET_LOGGER

          +
          public static IJavetLogger DEFAULT_JAVET_LOGGER
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetEngineConfig

          +
          public JavetEngineConfig()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getDefaultEngineGuardTimeoutMillis

          +
          public int getDefaultEngineGuardTimeoutMillis()
          +
        • +
        + + + +
          +
        • +

          getEngineGuardCheckIntervalMillis

          +
          public int getEngineGuardCheckIntervalMillis()
          +
        • +
        + + + +
          +
        • +

          getExecutorService

          +
          public java.util.concurrent.ExecutorService getExecutorService()
          +
        • +
        + + + +
          +
        • +

          getGlobalName

          +
          public java.lang.String getGlobalName()
          +
        • +
        + + + +
          +
        • +

          getJSRuntimeType

          +
          public JSRuntimeType getJSRuntimeType()
          +
        • +
        + + + +
          +
        • +

          getJavetLogger

          +
          public IJavetLogger getJavetLogger()
          +
        • +
        + + + +
          +
        • +

          getPoolDaemonCheckIntervalMillis

          +
          public int getPoolDaemonCheckIntervalMillis()
          +
        • +
        + + + +
          +
        • +

          getPoolIdleTimeoutSeconds

          +
          public int getPoolIdleTimeoutSeconds()
          +
        • +
        + + + +
          +
        • +

          getPoolMaxSize

          +
          public int getPoolMaxSize()
          +
        • +
        + + + +
          +
        • +

          getPoolMinSize

          +
          public int getPoolMinSize()
          +
        • +
        + + + +
          +
        • +

          getPoolShutdownTimeoutSeconds

          +
          public int getPoolShutdownTimeoutSeconds()
          +
        • +
        + + + +
          +
        • +

          getResetEngineTimeoutSeconds

          +
          public int getResetEngineTimeoutSeconds()
          +
        • +
        + + + +
          +
        • +

          isAllowEval

          +
          public boolean isAllowEval()
          +
        • +
        + + + +
          +
        • +

          isAutoSendGCNotification

          +
          public boolean isAutoSendGCNotification()
          +
        • +
        + + + +
          +
        • +

          isGcBeforeEngineClose

          +
          public boolean isGcBeforeEngineClose()
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          setAutoSendGCNotification

          +
          public JavetEngineConfig setAutoSendGCNotification(boolean autoSendGCNotification)
          +
        • +
        + + + +
          +
        • +

          setDefaultEngineGuardTimeoutMillis

          +
          public JavetEngineConfig setDefaultEngineGuardTimeoutMillis(int defaultEngineGuardTimeoutMillis)
          +
        • +
        + + + +
          +
        • +

          setEngineGuardCheckIntervalMillis

          +
          public JavetEngineConfig setEngineGuardCheckIntervalMillis(int engineGuardCheckIntervalMillis)
          +
        • +
        + + + +
          +
        • +

          setGcBeforeEngineClose

          +
          public JavetEngineConfig setGcBeforeEngineClose(boolean gcBeforeEngineClose)
          +
        • +
        + + + +
          +
        • +

          setGlobalName

          +
          public JavetEngineConfig setGlobalName(java.lang.String globalName)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          setPoolDaemonCheckIntervalMillis

          +
          public JavetEngineConfig setPoolDaemonCheckIntervalMillis(int poolDaemonCheckIntervalMillis)
          +
        • +
        + + + +
          +
        • +

          setPoolIdleTimeoutSeconds

          +
          public JavetEngineConfig setPoolIdleTimeoutSeconds(int poolIdleTimeoutSeconds)
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          setPoolShutdownTimeoutSeconds

          +
          public JavetEngineConfig setPoolShutdownTimeoutSeconds(int poolShutdownTimeoutSeconds)
          +
        • +
        + + + +
          +
        • +

          setResetEngineTimeoutSeconds

          +
          public JavetEngineConfig setResetEngineTimeoutSeconds(int resetEngineTimeoutSeconds)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineGuard.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineGuard.html new file mode 100644 index 000000000..cb68faa2b --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineGuard.html @@ -0,0 +1,678 @@ + + + + + +JavetEngineGuard (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Class JavetEngineGuard

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.engine.JavetEngineGuard
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, IJavetEngineGuard, java.lang.AutoCloseable, java.lang.Runnable
      +
      +
      +
      +
      public class JavetEngineGuard
      +extends java.lang.Object
      +implements IJavetEngineGuard
      +
      The type Javet engine guard.
      +
      +
      Since:
      +
      0.7.2
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected booleanclosed +
        The Closed.
        +
        protected java.util.concurrent.Future<?>future +
        The Future.
        +
        protected IJavetEngine<?>iJavetEngine +
        The Javet engine.
        +
        protected static booleanIS_IN_DEBUG_MODE +
        The constant IS_IN_DEBUG_MODE.
        +
        protected booleanquitting +
        The Quitting.
        +
        protected booleanskipInDebugMode +
        The Skip in debug mode.
        +
        protected longtimeoutMillis +
        The Timeout millis.
        +
        protected V8Runtimev8Runtime +
        The V8 runtime.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetEngineGuard(IJavetEngine<?> iJavetEngine, + V8Runtime v8Runtime, + long timeoutMills) +
        Instantiates a new Javet engine guard.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidcancel() +
        Cancel.
        +
        voidclose() 
        voiddisableInDebugMode() +
        Disable in debug mode.
        +
        voidenableInDebugMode() +
        Enable in debug mode.
        +
        longgetTimeoutMillis() +
        Gets timeout millis.
        +
        protected java.time.ZonedDateTimegetUTCNow() +
        Gets utc now.
        +
        booleanisClosed() +
        Is closed.
        +
        booleanisQuitting() +
        Is quitting boolean.
        +
        voidrun() 
        voidsetTimeoutMillis(long timeoutSeconds) +
        Sets timeout millis.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          IS_IN_DEBUG_MODE

          +
          protected static final boolean IS_IN_DEBUG_MODE
          +
          The constant IS_IN_DEBUG_MODE.
          +
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          closed

          +
          protected boolean closed
          +
          The Closed.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          future

          +
          protected java.util.concurrent.Future<?> future
          +
          The Future.
          +
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        + + + +
          +
        • +

          iJavetEngine

          +
          protected IJavetEngine<?> iJavetEngine
          +
          The Javet engine.
          +
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        + + + +
          +
        • +

          quitting

          +
          protected volatile boolean quitting
          +
          The Quitting.
          +
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        + + + +
          +
        • +

          skipInDebugMode

          +
          protected boolean skipInDebugMode
          +
          The Skip in debug mode.
          +
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          timeoutMillis

          +
          protected long timeoutMillis
          +
          The Timeout millis.
          +
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          v8Runtime

          +
          protected V8Runtime v8Runtime
          +
          The V8 runtime.
          +
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetEngineGuard

          +
          public JavetEngineGuard(IJavetEngine<?> iJavetEngine,
          +                        V8Runtime v8Runtime,
          +                        long timeoutMills)
          +
          Instantiates a new Javet engine guard.
          +
          +
          Parameters:
          +
          iJavetEngine - the javet engine
          +
          v8Runtime - the V8 runtime
          +
          timeoutMills - the timeout mills
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          getUTCNow

          +
          protected java.time.ZonedDateTime getUTCNow()
          +
          Gets utc now.
          +
          +
          Returns:
          +
          the utc now
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          isClosed

          +
          public boolean isClosed()
          +
          Description copied from interface: IJavetClosable
          +
          Is closed.
          +
          +
          Specified by:
          +
          isClosed in interface IJavetClosable
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          isQuitting

          +
          public boolean isQuitting()
          +
          Is quitting boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.7.2
          +
          +
        • +
        + + + +
          +
        • +

          run

          +
          public void run()
          +
          +
          Specified by:
          +
          run in interface java.lang.Runnable
          +
          +
        • +
        + + + +
          +
        • +

          setTimeoutMillis

          +
          public void setTimeoutMillis(long timeoutSeconds)
          +
          Description copied from interface: IJavetEngineGuard
          +
          Sets timeout millis.
          +
          +
          Specified by:
          +
          setTimeoutMillis in interface IJavetEngineGuard
          +
          Parameters:
          +
          timeoutSeconds - the timeout millis
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEnginePool.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEnginePool.html new file mode 100644 index 000000000..d7c69914e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEnginePool.html @@ -0,0 +1,753 @@ + + + + + +JavetEnginePool (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Class JavetEnginePool<R extends V8Runtime>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.engine.JavetEnginePool<R>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      R - the type parameter
      +
      +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, IJavetEnginePool<R>, java.lang.AutoCloseable, java.lang.Runnable
      +
      +
      +
      +
      public class JavetEnginePool<R extends V8Runtime>
      +extends java.lang.Object
      +implements IJavetEnginePool<R>, java.lang.Runnable
      +
      The type Javet engine pool.
      +
      +
      Since:
      +
      0.8.0
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          JAVET_DAEMON_THREAD_NAME

          +
          protected static final java.lang.String JAVET_DAEMON_THREAD_NAME
          +
          The constant JAVET_DAEMON_THREAD_NAME.
          +
          +
          Since:
          +
          0.8.10
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          activeEngineList

          +
          protected final java.util.concurrent.ConcurrentLinkedQueue<JavetEngine<R extends V8Runtime>> activeEngineList
          +
          The Active engine list.
          +
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          externalLock

          +
          protected final java.lang.Object externalLock
          +
          The External lock.
          +
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        + + + +
          +
        • +

          idleEngineList

          +
          protected final java.util.concurrent.ConcurrentLinkedQueue<JavetEngine<R extends V8Runtime>> idleEngineList
          +
          The Idle engine list.
          +
          +
          Since:
          +
          0.9.1
          +
          +
        • +
        + + + +
          +
        • +

          active

          +
          protected volatile boolean active
          +
          The Active.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + + + + + +
          +
        • +

          daemonThread

          +
          protected java.lang.Thread daemonThread
          +
          The Daemon thread.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          quitting

          +
          protected volatile boolean quitting
          +
          The Quitting.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetEnginePool

          +
          public JavetEnginePool()
          +
          Instantiates a new Javet engine pool.
          +
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          JavetEnginePool

          +
          public JavetEnginePool(JavetEngineConfig config)
          +
          Instantiates a new Javet engine pool.
          +
          +
          Parameters:
          +
          config - the config
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineUsage.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineUsage.html new file mode 100644 index 000000000..5b5166c2e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/JavetEngineUsage.html @@ -0,0 +1,369 @@ + + + + + +JavetEngineUsage (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.engine
    +

    Class JavetEngineUsage

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.engine.JavetEngineUsage
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class JavetEngineUsage
      +extends java.lang.Object
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          engineUsedCount

          +
          protected int engineUsedCount
          +
        • +
        + + + +
          +
        • +

          lastActiveZonedDatetime

          +
          protected java.time.ZonedDateTime lastActiveZonedDatetime
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetEngineUsage

          +
          public JavetEngineUsage()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getEngineUsedCount

          +
          public int getEngineUsedCount()
          +
        • +
        + + + +
          +
        • +

          getLastActiveZonedDatetime

          +
          public java.time.ZonedDateTime getLastActiveZonedDatetime()
          +
        • +
        + + + +
          +
        • +

          increaseUsedCount

          +
          public void increaseUsedCount()
          +
        • +
        + + + +
          +
        • +

          reset

          +
          protected void reset()
          +
        • +
        + + + +
          +
        • +

          setLastActiveZonedDatetime

          +
          public void setLastActiveZonedDatetime(java.time.ZonedDateTime lastActiveZonedDatetime)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-frame.html new file mode 100644 index 000000000..06dd9bc2c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-frame.html @@ -0,0 +1,29 @@ + + + + + +com.caoccao.javet.interop.engine (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interop.engine

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-summary.html new file mode 100644 index 000000000..bb1899330 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-summary.html @@ -0,0 +1,197 @@ + + + + + +com.caoccao.javet.interop.engine (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interop.engine

    +
    +
    Engine pool, config and guard.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interop.engine Description

    +
    Engine pool, config and guard.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-tree.html new file mode 100644 index 000000000..21a4128c5 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/engine/package-tree.html @@ -0,0 +1,157 @@ + + + + + +com.caoccao.javet.interop.engine Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interop.engine

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/executors/BaseV8Executor.html b/docs/reference/javadoc/com/caoccao/javet/interop/executors/BaseV8Executor.html new file mode 100644 index 000000000..889db7436 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/executors/BaseV8Executor.html @@ -0,0 +1,461 @@ + + + + + +BaseV8Executor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.executors
    +

    Class BaseV8Executor

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.executors.BaseV8Executor
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/executors/IV8Executor.html b/docs/reference/javadoc/com/caoccao/javet/interop/executors/IV8Executor.html new file mode 100644 index 000000000..3b58c4699 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/executors/IV8Executor.html @@ -0,0 +1,509 @@ + + + + + +IV8Executor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.executors
    +

    Interface IV8Executor

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/executors/V8PathExecutor.html b/docs/reference/javadoc/com/caoccao/javet/interop/executors/V8PathExecutor.html new file mode 100644 index 000000000..68beb6250 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/executors/V8PathExecutor.html @@ -0,0 +1,396 @@ + + + + + +V8PathExecutor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.executors
    +

    Class V8PathExecutor

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/executors/V8StringExecutor.html b/docs/reference/javadoc/com/caoccao/javet/interop/executors/V8StringExecutor.html new file mode 100644 index 000000000..7f6117cbf --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/executors/V8StringExecutor.html @@ -0,0 +1,454 @@ + + + + + +V8StringExecutor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.executors
    +

    Class V8StringExecutor

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-frame.html new file mode 100644 index 000000000..2cd468a28 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-frame.html @@ -0,0 +1,25 @@ + + + + + +com.caoccao.javet.interop.executors (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interop.executors

    +
    +

    Interfaces

    + +

    Classes

    + +
    + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-summary.html new file mode 100644 index 000000000..8c85a0f60 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-summary.html @@ -0,0 +1,175 @@ + + + + + +com.caoccao.javet.interop.executors (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interop.executors

    +
    +
    Executors and interface.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interop.executors Description

    +
    Executors and interface.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-tree.html new file mode 100644 index 000000000..0c16dc845 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/executors/package-tree.html @@ -0,0 +1,154 @@ + + + + + +com.caoccao.javet.interop.executors Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interop.executors

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interop/package-frame.html new file mode 100644 index 000000000..50edcc733 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/package-frame.html @@ -0,0 +1,37 @@ + + + + + +com.caoccao.javet.interop (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interop

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interop/package-summary.html new file mode 100644 index 000000000..0321f87b7 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/package-summary.html @@ -0,0 +1,233 @@ + + + + + +com.caoccao.javet.interop (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interop

    +
    +
    Interoperation between JVM and C++ via JNI.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interop Description

    +
    Interoperation between JVM and C++ via JNI.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interop/package-tree.html new file mode 100644 index 000000000..bade1f773 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/package-tree.html @@ -0,0 +1,161 @@ + + + + + +com.caoccao.javet.interop Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interop

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/BaseJavetProxyHandler.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/BaseJavetProxyHandler.html new file mode 100644 index 000000000..20739b112 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/BaseJavetProxyHandler.html @@ -0,0 +1,402 @@ + + + + + +BaseJavetProxyHandler (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.proxy
    +

    Class BaseJavetProxyHandler<T>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.proxy.BaseJavetProxyHandler<T>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - the type parameter
      +
      +
      +
      All Implemented Interfaces:
      +
      IJavetProxyHandler<T>
      +
      +
      +
      Direct Known Subclasses:
      +
      JavetUniversalProxyHandler
      +
      +
      +
      +
      public abstract class BaseJavetProxyHandler<T>
      +extends java.lang.Object
      +implements IJavetProxyHandler<T>
      +
      The type Base javet proxy handler.
      +
      +
      Since:
      +
      0.9.6
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          targetObject

          +
          protected T targetObject
          +
          The Target object.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          v8Runtime

          +
          protected V8Runtime v8Runtime
          +
          The V8 runtime.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + + + +
          +
        • +

          BaseJavetProxyHandler

          +
          public BaseJavetProxyHandler(V8Runtime v8Runtime,
          +                             T targetObject)
          +
          Instantiates a new Base javet proxy handler.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          targetObject - the target object
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          getV8Runtime

          +
          public V8Runtime getV8Runtime()
          +
          Gets V8 runtime.
          +
          +
          Returns:
          +
          the V8 runtime
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueFunctionInvocationHandler.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueFunctionInvocationHandler.html new file mode 100644 index 000000000..9ee13439c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueFunctionInvocationHandler.html @@ -0,0 +1,339 @@ + + + + + +DynamicProxyV8ValueFunctionInvocationHandler (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.proxy
    +

    Class DynamicProxyV8ValueFunctionInvocationHandler

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.proxy.DynamicProxyV8ValueFunctionInvocationHandler
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, java.lang.AutoCloseable, java.lang.reflect.InvocationHandler
      +
      +
      +
      +
      public class DynamicProxyV8ValueFunctionInvocationHandler
      +extends java.lang.Object
      +implements java.lang.reflect.InvocationHandler, IJavetClosable
      +
      The type Dynamic proxy V8 value function invocation handler.
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidclose() 
        java.lang.Objectinvoke(java.lang.Object proxy, + java.lang.reflect.Method method, + java.lang.Object[] args) 
        booleanisClosed() +
        Is closed.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicProxyV8ValueFunctionInvocationHandler

          +
          public DynamicProxyV8ValueFunctionInvocationHandler(V8ValueFunction v8ValueFunction)
          +
          Instantiates a new Dynamic proxy V8 value function invocation handler.
          +
          +
          Parameters:
          +
          v8ValueFunction - the V8 value function
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          invoke

          +
          public java.lang.Object invoke(java.lang.Object proxy,
          +                               java.lang.reflect.Method method,
          +                               java.lang.Object[] args)
          +                        throws java.lang.Throwable
          +
          +
          Specified by:
          +
          invoke in interface java.lang.reflect.InvocationHandler
          +
          Throws:
          +
          java.lang.Throwable
          +
          +
        • +
        + + + +
          +
        • +

          isClosed

          +
          public boolean isClosed()
          +
          Description copied from interface: IJavetClosable
          +
          Is closed.
          +
          +
          Specified by:
          +
          isClosed in interface IJavetClosable
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueObjectInvocationHandler.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueObjectInvocationHandler.html new file mode 100644 index 000000000..4b5069b2f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/DynamicProxyV8ValueObjectInvocationHandler.html @@ -0,0 +1,339 @@ + + + + + +DynamicProxyV8ValueObjectInvocationHandler (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.proxy
    +

    Class DynamicProxyV8ValueObjectInvocationHandler

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.proxy.DynamicProxyV8ValueObjectInvocationHandler
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, java.lang.AutoCloseable, java.lang.reflect.InvocationHandler
      +
      +
      +
      +
      public class DynamicProxyV8ValueObjectInvocationHandler
      +extends java.lang.Object
      +implements java.lang.reflect.InvocationHandler, IJavetClosable
      +
      The type Dynamic proxy V8 value object invocation handler.
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidclose() 
        java.lang.Objectinvoke(java.lang.Object proxy, + java.lang.reflect.Method method, + java.lang.Object[] args) 
        booleanisClosed() +
        Is closed.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicProxyV8ValueObjectInvocationHandler

          +
          public DynamicProxyV8ValueObjectInvocationHandler(V8ValueObject v8ValueObject)
          +
          Instantiates a new Dynamic proxy V8 value object invocation handler.
          +
          +
          Parameters:
          +
          v8ValueObject - the V8 value object
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          invoke

          +
          public java.lang.Object invoke(java.lang.Object proxy,
          +                               java.lang.reflect.Method method,
          +                               java.lang.Object[] args)
          +                        throws java.lang.Throwable
          +
          +
          Specified by:
          +
          invoke in interface java.lang.reflect.InvocationHandler
          +
          Throws:
          +
          java.lang.Throwable
          +
          +
        • +
        + + + +
          +
        • +

          isClosed

          +
          public boolean isClosed()
          +
          Description copied from interface: IJavetClosable
          +
          Is closed.
          +
          +
          Specified by:
          +
          isClosed in interface IJavetClosable
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/IJavetProxyHandler.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/IJavetProxyHandler.html new file mode 100644 index 000000000..f6f964c7e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/IJavetProxyHandler.html @@ -0,0 +1,545 @@ + + + + + +IJavetProxyHandler (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.proxy
    +

    Interface IJavetProxyHandler<T>

    +
    +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - the type parameter
      +
      +
      +
      All Known Implementing Classes:
      +
      BaseJavetProxyHandler, JavetUniversalProxyHandler
      +
      +
      +
      +
      public interface IJavetProxyHandler<T>
      +
      The interface Javet proxy handler. +

      + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

      +
      +
      Since:
      +
      0.9.6
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          apply

          +
          default V8Value apply(V8Value target,
          +                      V8Value thisObject,
          +                      V8ValueArray arguments)
          +               throws JavetException
          +
          Apply to object
          +
          +
          Parameters:
          +
          target - the target
          +
          thisObject - the this object
          +
          arguments - the arguments
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          construct

          +
          default V8Value construct(V8Value target,
          +                          V8ValueArray arguments,
          +                          V8Value newTarget)
          +                   throws JavetException
          +
          Construct.
          +
          +
          Parameters:
          +
          target - the target
          +
          arguments - the arguments
          +
          newTarget - the new target
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          get

          +
          default V8Value get(V8Value target,
          +                    V8Value property,
          +                    V8Value receiver)
          +             throws JavetException
          +
          Get by property.
          +
          +
          Parameters:
          +
          target - the target
          +
          property - the property
          +
          receiver - the receiver
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          getPrototypeOf

          +
          default V8Value getPrototypeOf(V8Value target)
          +                        throws JavetException
          +
          Gets prototype of.
          +
          +
          Parameters:
          +
          target - the target
          +
          Returns:
          +
          the prototype of
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          getTargetObject

          +
          T getTargetObject()
          +
          Gets target object.
          +
          +
          Returns:
          +
          the target object
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + + + + + +
          +
        • +

          isExtensible

          +
          default V8ValueBoolean isExtensible(V8Value target)
          +                             throws JavetException
          +
          Is extensible.
          +
          +
          Parameters:
          +
          target - the target
          +
          Returns:
          +
          the V8 value boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          ownKeys

          +
          default V8Value ownKeys(V8Value target)
          +                 throws JavetException
          +
          Own keys V8 value.
          +
          +
          Parameters:
          +
          target - the target
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          preventExtensions

          +
          default V8ValueBoolean preventExtensions(V8Value target)
          +                                  throws JavetException
          +
          Prevent extensions.
          +
          +
          Parameters:
          +
          target - the target
          +
          Returns:
          +
          the V8 value boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          set

          +
          default V8ValueBoolean set(V8Value target,
          +                           V8Value propertyKey,
          +                           V8Value propertyValue,
          +                           V8Value receiver)
          +                    throws JavetException
          +
          Set value by property.
          +
          +
          Parameters:
          +
          target - the target
          +
          propertyKey - the property key
          +
          propertyValue - the property value
          +
          receiver - the receiver
          +
          Returns:
          +
          the V8 value boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          setPrototypeOf

          +
          default V8ValueBoolean setPrototypeOf(V8Value target,
          +                                      V8Value prototype)
          +                               throws JavetException
          +
          Sets prototype of.
          +
          +
          Parameters:
          +
          target - the target
          +
          prototype - the prototype
          +
          Returns:
          +
          the V8 value boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.JavetUniversalInterceptor.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.JavetUniversalInterceptor.html new file mode 100644 index 000000000..bfc52eeae --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.JavetUniversalInterceptor.html @@ -0,0 +1,397 @@ + + + + + +JavetUniversalProxyHandler.JavetUniversalInterceptor (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.proxy
    +

    Class JavetUniversalProxyHandler.JavetUniversalInterceptor

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.JavetUniversalInterceptor
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Enclosing class:
      +
      JavetUniversalProxyHandler<T>
      +
      +
      +
      +
      public static class JavetUniversalProxyHandler.JavetUniversalInterceptor
      +extends java.lang.Object
      +
      The type Javet universal interceptor.
      +
      +
      Since:
      +
      0.9.6
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetUniversalInterceptor(V8Runtime v8Runtime, + java.lang.Object targetObject, + java.lang.String jsMethodName, + java.util.List<java.lang.reflect.Method> methods) +
        Instantiates a new Javet universal interceptor.
        +
        +
      • +
      + + +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetUniversalInterceptor

          +
          public JavetUniversalInterceptor(V8Runtime v8Runtime,
          +                                 java.lang.Object targetObject,
          +                                 java.lang.String jsMethodName,
          +                                 java.util.List<java.lang.reflect.Method> methods)
          +
          Instantiates a new Javet universal interceptor.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          targetObject - the target object
          +
          jsMethodName - the JS method name
          +
          methods - the methods
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getCallbackContext

          +
          public JavetCallbackContext getCallbackContext()
          +
          Gets callback context.
          +
          +
          Returns:
          +
          the callback context
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          getJSMethodName

          +
          public java.lang.String getJSMethodName()
          +
          Gets JS method name.
          +
          +
          Returns:
          +
          the JS method name
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          getMethods

          +
          public java.util.List<java.lang.reflect.Method> getMethods()
          +
          Gets methods.
          +
          +
          Returns:
          +
          the methods
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          getTargetObject

          +
          public java.lang.Object getTargetObject()
          +
          Gets target object.
          +
          +
          Returns:
          +
          the target object
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          invoke

          +
          public java.lang.Object invoke(V8Value... v8Values)
          +                        throws JavetException
          +
          Invoke.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.ScoredExecutable.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.ScoredExecutable.html new file mode 100644 index 000000000..3669dab9c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.ScoredExecutable.html @@ -0,0 +1,358 @@ + + + + + +JavetUniversalProxyHandler.ScoredExecutable (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.proxy
    +

    Class JavetUniversalProxyHandler.ScoredExecutable<E extends java.lang.reflect.Executable>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.ScoredExecutable<E>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      E - the type parameter
      +
      +
      +
      Enclosing class:
      +
      JavetUniversalProxyHandler<T>
      +
      +
      +
      +
      public static class JavetUniversalProxyHandler.ScoredExecutable<E extends java.lang.reflect.Executable>
      +extends java.lang.Object
      +
      The type Scored executable.
      +
      +
      Since:
      +
      0.9.6
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        ScoredExecutable(V8Runtime v8Runtime, + java.lang.Object targetObject, + E executable, + JavetVirtualObject[] javetVirtualObjects) +
        Instantiates a new Scored executable.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidcalculateScore() +
        Calculate score double.
        +
        java.lang.Objectexecute() +
        Execute.
        +
        doublegetScore() +
        Gets score.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + + + +
          +
        • +

          ScoredExecutable

          +
          public ScoredExecutable(V8Runtime v8Runtime,
          +                        java.lang.Object targetObject,
          +                        E executable,
          +                        JavetVirtualObject[] javetVirtualObjects)
          +
          Instantiates a new Scored executable.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          targetObject - the target object
          +
          executable - the executable
          +
          javetVirtualObjects - the javet virtual objects
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          calculateScore

          +
          public void calculateScore()
          +                    throws JavetException
          +
          Calculate score double.
          +
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          execute

          +
          public java.lang.Object execute()
          +                         throws java.lang.Throwable
          +
          Execute.
          +
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          java.lang.Throwable - the throwable
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          getScore

          +
          public double getScore()
          +
          Gets score.
          +
          +
          Returns:
          +
          the score
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.html new file mode 100644 index 000000000..c526be03a --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/JavetUniversalProxyHandler.html @@ -0,0 +1,1237 @@ + + + + + +JavetUniversalProxyHandler (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.interop.proxy
    +

    Class JavetUniversalProxyHandler<T>

    +
    +
    + +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - the type parameter
      +
      +
      +
      All Implemented Interfaces:
      +
      IJavetProxyHandler<T>
      +
      +
      +
      +
      public class JavetUniversalProxyHandler<T>
      +extends BaseJavetProxyHandler<T>
      +
      The type Javet universal proxy handler.
      +
      +
      Since:
      +
      0.9.6
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          GETTER_PREFIX_ARRAY

          +
          protected static final java.lang.String[] GETTER_PREFIX_ARRAY
          +
          The constant GETTER_PREFIX_ARRAY.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          METHOD_NAME_CONSTRUCT

          +
          protected static final java.lang.String METHOD_NAME_CONSTRUCT
          +
          The constant METHOD_NAME_CONSTRUCT.
          +
          +
          Since:
          +
          0.9.9
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          METHOD_NAME_CONSTRUCTOR

          +
          protected static final java.lang.String METHOD_NAME_CONSTRUCTOR
          +
          The constant METHOD_NAME_CONSTRUCTOR.
          +
          +
          Since:
          +
          0.9.8
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PATTERN_CAPITALIZED_PREFIX

          +
          protected static final java.util.regex.Pattern PATTERN_CAPITALIZED_PREFIX
          +
          The constant PATTERN_CAPITALIZED_PREFIX.
          +
          +
          Since:
          +
          0.9.7
          +
          +
        • +
        + + + +
          +
        • +

          SETTER_PREFIX_ARRAY

          +
          protected static final java.lang.String[] SETTER_PREFIX_ARRAY
          +
          The constant SETTER_PREFIX_ARRAY.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          V8_VALUE_CLASS

          +
          protected static final java.lang.Class<?> V8_VALUE_CLASS
          +
          The constant V8_VALUE_CLASS.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          V8_VALUE_FUNCTION_CLASS

          +
          protected static final java.lang.Class<?> V8_VALUE_FUNCTION_CLASS
          +
          The constant V8_VALUE_FUNCTION_CLASS.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          V8_VALUE_OBJECT_CLASS

          +
          protected static final java.lang.Class<?> V8_VALUE_OBJECT_CLASS
          +
          The constant V8_VALUE_OBJECT_CLASS.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          V8_VALUE_PROXY_CLASS

          +
          protected static final java.lang.Class<?> V8_VALUE_PROXY_CLASS
          +
          The constant V8_VALUE_PROXY_CLASS.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          classMode

          +
          protected boolean classMode
          +
          The Class mode.
          +
          +
          Since:
          +
          0.9.9
          +
          +
        • +
        + + + +
          +
        • +

          constructors

          +
          protected java.util.List<java.lang.reflect.Constructor> constructors
          +
          The Constructors.
          +
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + +
          +
        • +

          fieldMap

          +
          protected java.util.Map<java.lang.String,java.lang.reflect.Field> fieldMap
          +
          The Field map.
          +
          +
          Since:
          +
          0.9.7
          +
          +
        • +
        + + + +
          +
        • +

          genericGetters

          +
          protected java.util.List<java.lang.reflect.Method> genericGetters
          +
          The Generic getters.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          genericSetters

          +
          protected java.util.List<java.lang.reflect.Method> genericSetters
          +
          The Generic setters.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          gettersMap

          +
          protected java.util.Map<java.lang.String,java.util.List<java.lang.reflect.Method>> gettersMap
          +
          The Getters map.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          isTargetTypeMap

          +
          protected boolean isTargetTypeMap
          +
          The Is target type map.
          +
          +
          Since:
          +
          0.9.7
          +
          +
        • +
        + + + +
          +
        • +

          isTargetTypeSet

          +
          protected boolean isTargetTypeSet
          +
          The Is target type set.
          +
          +
          Since:
          +
          0.9.7
          +
          +
        • +
        + + + +
          +
        • +

          methodsMap

          +
          protected java.util.Map<java.lang.String,java.util.List<java.lang.reflect.Method>> methodsMap
          +
          The Methods map.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          settersMap

          +
          protected java.util.Map<java.lang.String,java.util.List<java.lang.reflect.Method>> settersMap
          +
          The Setters map.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          targetClass

          +
          protected java.lang.Class<T> targetClass
          +
          The Target class.
          +
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          uniqueKeySet

          +
          protected java.util.Set<java.lang.String> uniqueKeySet
          +
          The Unique key set.
          +
          +
          Since:
          +
          0.9.7
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + + + +
          +
        • +

          JavetUniversalProxyHandler

          +
          public JavetUniversalProxyHandler(V8Runtime v8Runtime,
          +                                  T targetObject)
          +
          Instantiates a new Javet universal proxy handler.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          targetObject - the target object
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          execute

          +
          protected static <E extends java.lang.reflect.Executable> java.lang.Object execute(V8Runtime v8Runtime,
          +                                                                                   java.lang.Object targetObject,
          +                                                                                   java.util.List<E> executables,
          +                                                                                   JavetVirtualObject[] javetVirtualObjects)
          +                                                                            throws java.lang.Throwable
          +
          Execute.
          +
          +
          Type Parameters:
          +
          E - the type parameter
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          targetObject - the target object
          +
          executables - the executables
          +
          javetVirtualObjects - the javet virtual objects
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          java.lang.Throwable - the throwable
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          isClassMode

          +
          public static boolean isClassMode(java.lang.Class objectClass)
          +
          Is class mode.
          +
          +
          Parameters:
          +
          objectClass - the object class
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          addMethod

          +
          protected void addMethod(java.lang.reflect.Method method,
          +                         int startIndex,
          +                         java.util.Map<java.lang.String,java.util.List<java.lang.reflect.Method>> map)
          +
          Add method.
          +
          +
          Parameters:
          +
          method - the method
          +
          startIndex - the start index
          +
          map - the map
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          getGetterPrefixLength

          +
          protected int getGetterPrefixLength(java.lang.reflect.Method method)
          +
          Gets getter prefix length.
          +
          +
          Parameters:
          +
          method - the method
          +
          Returns:
          +
          the getter prefix length
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          getSetterPrefixLength

          +
          protected int getSetterPrefixLength(java.lang.reflect.Method method)
          +
          Gets setter prefix length.
          +
          +
          Parameters:
          +
          method - the method
          +
          Returns:
          +
          the setter prefix length
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + + + + + +
          +
        • +

          hasConstructors

          +
          public boolean hasConstructors()
          +
          Has constructors.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.9
          +
          +
        • +
        + + + +
          +
        • +

          initialize

          +
          protected void initialize()
          +
          Initialize.
          +
          +
          Since:
          +
          0.9.7
          +
          +
        • +
        + + + +
          +
        • +

          initializeFieldsAndMethods

          +
          protected void initializeFieldsAndMethods(java.lang.Class currentClass,
          +                                          boolean staticMode)
          +
          Initialize fields and methods.
          +
          +
          Parameters:
          +
          currentClass - the current class
          +
          staticMode - the static mode
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          isClassMode

          +
          public boolean isClassMode()
          +
          Is class mode.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.9
          +
          +
        • +
        + + + +
          +
        • +

          isGenericGetter

          +
          protected boolean isGenericGetter(java.lang.reflect.Method method)
          +
          Is generic getter boolean.
          +
          +
          Parameters:
          +
          method - the method
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          isGenericSetter

          +
          protected boolean isGenericSetter(java.lang.reflect.Method method)
          +
          Is generic setter boolean.
          +
          +
          Parameters:
          +
          method - the method
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.6
          +
          +
        • +
        + + + +
          +
        • +

          isV8BindEnabled

          +
          @V8BindEnabler
          +public boolean isV8BindEnabled(java.lang.String methodName)
          +
          Is V8 bind enabled.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + + + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-frame.html new file mode 100644 index 000000000..26347dbde --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-frame.html @@ -0,0 +1,28 @@ + + + + + +com.caoccao.javet.interop.proxy (javet 0.9.12 API) + + + + +

    com.caoccao.javet.interop.proxy

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-summary.html new file mode 100644 index 000000000..295eb9cbd --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-summary.html @@ -0,0 +1,201 @@ + + + + + +com.caoccao.javet.interop.proxy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.interop.proxy

    +
    +
    Dynamic proxy handlers for polyfilling Java interfaces with JS functions or objects.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.interop.proxy Description

    +
    Dynamic proxy handlers for polyfilling Java interfaces with JS functions or objects.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-tree.html new file mode 100644 index 000000000..86529c835 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/interop/proxy/package-tree.html @@ -0,0 +1,146 @@ + + + + + +com.caoccao.javet.interop.proxy Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.interop.proxy

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/BaseNodeModule.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/BaseNodeModule.html new file mode 100644 index 000000000..689349f43 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/BaseNodeModule.html @@ -0,0 +1,394 @@ + + + + + +BaseNodeModule (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.node.modules
    +

    Class BaseNodeModule

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.node.modules.BaseNodeModule
      • +
      +
    • +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected V8ValueObjectmoduleObject 
        protected java.lang.Stringname 
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        BaseNodeModule(V8ValueObject moduleObject, + java.lang.String name) 
        +
      • +
      + + +
    • +
    +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/INodeModule.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/INodeModule.html new file mode 100644 index 000000000..e96eec4cb --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/INodeModule.html @@ -0,0 +1,247 @@ + + + + + +INodeModule (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.node.modules
    +

    Interface INodeModule

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          getName

          +
          java.lang.String getName()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleAny.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleAny.html new file mode 100644 index 000000000..993bdd2f0 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleAny.html @@ -0,0 +1,267 @@ + + + + + +NodeModuleAny (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.node.modules
    +

    Class NodeModuleAny

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          NodeModuleAny

          +
          public NodeModuleAny(V8ValueObject moduleObject,
          +                     java.lang.String name)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleModule.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleModule.html new file mode 100644 index 000000000..8d80934fe --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleModule.html @@ -0,0 +1,356 @@ + + + + + +NodeModuleModule (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.node.modules
    +

    Class NodeModuleModule

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          FUNCTION_CREATE_REQUIRE

          +
          public static final java.lang.String FUNCTION_CREATE_REQUIRE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PROPERTY_REQUIRE

          +
          public static final java.lang.String PROPERTY_REQUIRE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          NodeModuleModule

          +
          public NodeModuleModule(V8ValueObject moduleObject,
          +                        java.lang.String name)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setRequireRootDirectory

          +
          public void setRequireRootDirectory(java.nio.file.Path path)
          +                             throws JavetException
          +
          +
          Throws:
          +
          JavetException
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleProcess.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleProcess.html new file mode 100644 index 000000000..408af7d60 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/NodeModuleProcess.html @@ -0,0 +1,446 @@ + + + + + +NodeModuleProcess (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.node.modules
    +

    Class NodeModuleProcess

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/package-frame.html new file mode 100644 index 000000000..4f61b27ef --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/package-frame.html @@ -0,0 +1,26 @@ + + + + + +com.caoccao.javet.node.modules (javet 0.9.12 API) + + + + +

    com.caoccao.javet.node.modules

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/package-summary.html new file mode 100644 index 000000000..bff021634 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/package-summary.html @@ -0,0 +1,179 @@ + + + + + +com.caoccao.javet.node.modules (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.node.modules

    +
    +
    Reference classes for Node.js built-in modules.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.node.modules Description

    +
    Reference classes for Node.js built-in modules.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/node/modules/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/node/modules/package-tree.html new file mode 100644 index 000000000..01e2a2096 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/node/modules/package-tree.html @@ -0,0 +1,152 @@ + + + + + +com.caoccao.javet.node.modules Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.node.modules

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    +
      +
    • java.lang.AutoCloseable + +
    • +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetDateTimeUtils.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetDateTimeUtils.html new file mode 100644 index 000000000..cd0b329f8 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetDateTimeUtils.html @@ -0,0 +1,330 @@ + + + + + +JavetDateTimeUtils (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetDateTimeUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetDateTimeUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetDateTimeUtils
      +extends java.lang.Object
      +
      The type Date time utils.
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        static java.time.ZoneIdZONE_ID_UTC +
        The constant ZONE_ID_UTC.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static java.time.ZonedDateTimegetUTCNow() +
        Gets utc now.
        +
        static java.time.ZonedDateTimetoZonedDateTime(long jsTimestamp) +
        From JS timestamp to zoned date time.
        +
        static java.time.ZonedDateTimetoZonedDateTime(long jsTimestamp, + java.time.ZoneId zoneId) +
        From JS timestamp to zoned date time.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          ZONE_ID_UTC

          +
          public static final java.time.ZoneId ZONE_ID_UTC
          +
          The constant ZONE_ID_UTC.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getUTCNow

          +
          public static java.time.ZonedDateTime getUTCNow()
          +
          Gets utc now.
          +
          +
          Returns:
          +
          the utc now
          +
          +
        • +
        + + + +
          +
        • +

          toZonedDateTime

          +
          public static java.time.ZonedDateTime toZonedDateTime(long jsTimestamp,
          +                                                      java.time.ZoneId zoneId)
          +
          From JS timestamp to zoned date time.
          +
          +
          Parameters:
          +
          jsTimestamp - the JS timestamp
          +
          zoneId - the zone id
          +
          Returns:
          +
          the zoned date time
          +
          +
        • +
        + + + +
          +
        • +

          toZonedDateTime

          +
          public static java.time.ZonedDateTime toZonedDateTime(long jsTimestamp)
          +
          From JS timestamp to zoned date time. +

          + Note: the ZoneId needs to be system default because that's what V8 sees.

          +
          +
          Parameters:
          +
          jsTimestamp - the JS timestamp
          +
          Returns:
          +
          the zoned date time
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetDefaultLogger.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetDefaultLogger.html new file mode 100644 index 000000000..eac95c4cd --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetDefaultLogger.html @@ -0,0 +1,460 @@ + + + + + +JavetDefaultLogger (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetDefaultLogger

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetDefaultLogger
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetLogger
      +
      +
      +
      +
      public class JavetDefaultLogger
      +extends java.lang.Object
      +implements IJavetLogger
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected java.util.logging.Loggerlogger 
        protected java.lang.Stringname 
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetDefaultLogger(java.lang.String name) 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voiddebug(java.lang.String message) +
        Debug.
        +
        voiderror(java.lang.String message) +
        Error.
        +
        voiderror(java.lang.String message, + java.lang.Throwable cause) +
        Error.
        +
        java.util.logging.LoggergetLogger() 
        java.lang.StringgetName() 
        voidinfo(java.lang.String message) +
        Info.
        +
        voidwarn(java.lang.String message) +
        Warn.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        + +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          logger

          +
          protected java.util.logging.Logger logger
          +
        • +
        + + + +
          +
        • +

          name

          +
          protected java.lang.String name
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetDefaultLogger

          +
          public JavetDefaultLogger(java.lang.String name)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          debug

          +
          public void debug(java.lang.String message)
          +
          Description copied from interface: IJavetLogger
          +
          Debug.
          +
          +
          Specified by:
          +
          debug in interface IJavetLogger
          +
          Parameters:
          +
          message - the message
          +
          +
        • +
        + + + +
          +
        • +

          error

          +
          public void error(java.lang.String message)
          +
          Description copied from interface: IJavetLogger
          +
          Error.
          +
          +
          Specified by:
          +
          error in interface IJavetLogger
          +
          Parameters:
          +
          message - the message
          +
          +
        • +
        + + + +
          +
        • +

          error

          +
          public void error(java.lang.String message,
          +                  java.lang.Throwable cause)
          +
          Description copied from interface: IJavetLogger
          +
          Error.
          +
          +
          Specified by:
          +
          error in interface IJavetLogger
          +
          Parameters:
          +
          message - the message
          +
          cause - the cause
          +
          +
        • +
        + + + +
          +
        • +

          getLogger

          +
          public java.util.logging.Logger getLogger()
          +
        • +
        + + + +
          +
        • +

          getName

          +
          public java.lang.String getName()
          +
        • +
        + + + +
          +
        • +

          info

          +
          public void info(java.lang.String message)
          +
          Description copied from interface: IJavetLogger
          +
          Info.
          +
          +
          Specified by:
          +
          info in interface IJavetLogger
          +
          Parameters:
          +
          message - the message
          +
          +
        • +
        + + + +
          +
        • +

          warn

          +
          public void warn(java.lang.String message)
          +
          Description copied from interface: IJavetLogger
          +
          Warn.
          +
          +
          Specified by:
          +
          warn in interface IJavetLogger
          +
          Parameters:
          +
          message - the message
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetOSUtils.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetOSUtils.html new file mode 100644 index 000000000..c07571799 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetOSUtils.html @@ -0,0 +1,361 @@ + + + + + +JavetOSUtils (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetOSUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetOSUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetOSUtils
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static intgetCPUCount() 
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          OS_NAME

          +
          public static final java.lang.String OS_NAME
          +
        • +
        + + + +
          +
        • +

          IS_LINUX

          +
          public static final boolean IS_LINUX
          +
        • +
        + + + +
          +
        • +

          IS_MACOS

          +
          public static final boolean IS_MACOS
          +
        • +
        + + + +
          +
        • +

          IS_WINDOWS

          +
          public static final boolean IS_WINDOWS
          +
        • +
        + + + +
          +
        • +

          PROCESS_ID

          +
          public static final long PROCESS_ID
          +
        • +
        + + + +
          +
        • +

          LINE_SEPARATOR

          +
          public static final java.lang.String LINE_SEPARATOR
          +
        • +
        + + + +
          +
        • +

          TEMP_DIRECTORY

          +
          public static final java.lang.String TEMP_DIRECTORY
          +
        • +
        + + + +
          +
        • +

          WORKING_DIRECTORY

          +
          public static final java.lang.String WORKING_DIRECTORY
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getCPUCount

          +
          public static int getCPUCount()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetPrimitiveUtils.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetPrimitiveUtils.html new file mode 100644 index 000000000..344f3f6e8 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetPrimitiveUtils.html @@ -0,0 +1,270 @@ + + + + + +JavetPrimitiveUtils (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetPrimitiveUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetPrimitiveUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetPrimitiveUtils
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static java.lang.ObjecttoExactPrimitive(java.lang.Class<?> expectedClass, + java.lang.Object object) 
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetPrimitiveUtils

          +
          public JavetPrimitiveUtils()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          toExactPrimitive

          +
          public static java.lang.Object toExactPrimitive(java.lang.Class<?> expectedClass,
          +                                                java.lang.Object object)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetPromiseRejectCallback.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetPromiseRejectCallback.html new file mode 100644 index 000000000..74376c0f0 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetPromiseRejectCallback.html @@ -0,0 +1,325 @@ + + + + + +JavetPromiseRejectCallback (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetPromiseRejectCallback

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetPromiseRejectCallback
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetReflectionUtils.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetReflectionUtils.html new file mode 100644 index 000000000..23751a92e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetReflectionUtils.html @@ -0,0 +1,248 @@ + + + + + +JavetReflectionUtils (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetReflectionUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetReflectionUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetReflectionUtils
      +extends java.lang.Object
      +
      The type Javet reflection utils.
      +
      +
      Since:
      +
      0.9.7
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static voidsafeSetAccessible(java.lang.reflect.AccessibleObject accessibleObject) +
        Safe set accessible.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          safeSetAccessible

          +
          public static void safeSetAccessible(java.lang.reflect.AccessibleObject accessibleObject)
          +
          Safe set accessible.
          +
          +
          Parameters:
          +
          accessibleObject - the accessible object
          +
          Since:
          +
          0.9.7
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetResourceUtils.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetResourceUtils.html new file mode 100644 index 000000000..9d25b704c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetResourceUtils.html @@ -0,0 +1,321 @@ + + + + + +JavetResourceUtils (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetResourceUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetResourceUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class JavetResourceUtils
      +extends java.lang.Object
      +
      The type Javet resource utils.
      +
      +
      Since:
      +
      0.7.0
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static booleanisClosed(java.lang.Object object) +
        Is closed.
        +
        static voidsafeClose(java.lang.Object... objects) +
        Safe close.
        +
        static voidsafeClose(java.lang.Object object) +
        Safe close.
        +
        static V8Value[]toClone(V8Value[] v8Values) +
        To clone V8 value array.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          isClosed

          +
          public static boolean isClosed(java.lang.Object object)
          +
          Is closed.
          +
          +
          Parameters:
          +
          object - the object
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          safeClose

          +
          public static void safeClose(java.lang.Object... objects)
          +
          Safe close.
          +
          +
          Parameters:
          +
          objects - the objects
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        + + + +
          +
        • +

          safeClose

          +
          public static void safeClose(java.lang.Object object)
          +
          Safe close.
          +
          +
          Parameters:
          +
          object - the object
          +
          Since:
          +
          0.7.1
          +
          +
        • +
        + + + +
          +
        • +

          toClone

          +
          public static V8Value[] toClone(V8Value[] v8Values)
          +                         throws JavetException
          +
          To clone V8 value array.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the V8 value array
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/JavetVirtualObject.html b/docs/reference/javadoc/com/caoccao/javet/utils/JavetVirtualObject.html new file mode 100644 index 000000000..0cacf4121 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/JavetVirtualObject.html @@ -0,0 +1,421 @@ + + + + + +JavetVirtualObject (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class JavetVirtualObject

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.JavetVirtualObject
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public class JavetVirtualObject
      +extends java.lang.Object
      +
      The type Javet virtual object.
      +
      +
      Since:
      +
      0.9.10
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected booleanconverted +
        The Converted.
        +
        protected java.lang.Objectobject +
        The Object.
        +
        protected V8Valuev8Value +
        The V8 value.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        JavetVirtualObject(V8Value v8Value) +
        Instantiates a new Javet virtual object.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        java.lang.ObjectgetObject() +
        Gets object.
        +
        V8ValuegetV8Value() +
        Gets V8 value.
        +
        booleanisConverted() +
        Is converted.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          converted

          +
          protected boolean converted
          +
          The Converted.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          object

          +
          protected java.lang.Object object
          +
          The Object.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          v8Value

          +
          protected V8Value v8Value
          +
          The V8 value.
          +
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetVirtualObject

          +
          public JavetVirtualObject(V8Value v8Value)
          +
          Instantiates a new Javet virtual object.
          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getObject

          +
          public java.lang.Object getObject()
          +                           throws JavetException
          +
          Gets object.
          +
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          getV8Value

          +
          public V8Value getV8Value()
          +
          Gets V8 value.
          +
          +
          Returns:
          +
          the V8 value
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        + + + +
          +
        • +

          isConverted

          +
          public boolean isConverted()
          +
          Is converted.
          +
          +
          Returns:
          +
          the boolean
          +
          Since:
          +
          0.9.10
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/SimpleFreeMarkerFormat.html b/docs/reference/javadoc/com/caoccao/javet/utils/SimpleFreeMarkerFormat.html new file mode 100644 index 000000000..40699be58 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/SimpleFreeMarkerFormat.html @@ -0,0 +1,310 @@ + + + + + +SimpleFreeMarkerFormat (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class SimpleFreeMarkerFormat

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.SimpleFreeMarkerFormat
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class SimpleFreeMarkerFormat
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        static java.lang.StringSTRING_NULL 
        +
      • +
      + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static java.lang.Stringformat(java.lang.String format, + java.util.Map<java.lang.String,java.lang.Object> parameters) 
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SimpleFreeMarkerFormat

          +
          public SimpleFreeMarkerFormat()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          format

          +
          public static java.lang.String format(java.lang.String format,
          +                                      java.util.Map<java.lang.String,java.lang.Object> parameters)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/SimpleMap.html b/docs/reference/javadoc/com/caoccao/javet/utils/SimpleMap.html new file mode 100644 index 000000000..f2d50716c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/SimpleMap.html @@ -0,0 +1,504 @@ + + + + + +SimpleMap (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class SimpleMap

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.SimpleMap
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class SimpleMap
      +extends java.lang.Object
      +
      The type Simple map is a polyfill because Map.of is not available at JDK 8 .
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        SimpleMap() 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static <K,V> java.util.Map<K,V>of(K k1, + V v1) 
        static <K,V> java.util.Map<K,V>of(K k1, + V v1, + K k2, + V v2) 
        static <K,V> java.util.Map<K,V>of(K k1, + V v1, + K k2, + V v2, + K k3, + V v3) 
        static <K,V> java.util.Map<K,V>of(K k1, + V v1, + K k2, + V v2, + K k3, + V v3, + K k4, + V v4) 
        static <K,V> java.util.Map<K,V>of(K k1, + V v1, + K k2, + V v2, + K k3, + V v3, + K k4, + V v4, + K k5, + V v5) 
        static <K,V> java.util.Map<K,V>of(K k1, + V v1, + K k2, + V v2, + K k3, + V v3, + K k4, + V v4, + K k5, + V v5, + K k6, + V v6) 
        static <K,V> java.util.Map<K,V>of(K k1, + V v1, + K k2, + V v2, + K k3, + V v3, + K k4, + V v4, + K k5, + V v5, + K k6, + V v6, + K k7, + V v7) 
        static <K,V> java.util.Map<K,V>of(K k1, + V v1, + K k2, + V v2, + K k3, + V v3, + K k4, + V v4, + K k5, + V v5, + K k6, + V v6, + K k7, + V v7, + K k8, + V v8) 
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SimpleMap

          +
          public SimpleMap()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1)
          +
        • +
        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1,
          +                                          K k2,
          +                                          V v2)
          +
        • +
        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1,
          +                                          K k2,
          +                                          V v2,
          +                                          K k3,
          +                                          V v3)
          +
        • +
        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1,
          +                                          K k2,
          +                                          V v2,
          +                                          K k3,
          +                                          V v3,
          +                                          K k4,
          +                                          V v4)
          +
        • +
        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1,
          +                                          K k2,
          +                                          V v2,
          +                                          K k3,
          +                                          V v3,
          +                                          K k4,
          +                                          V v4,
          +                                          K k5,
          +                                          V v5)
          +
        • +
        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1,
          +                                          K k2,
          +                                          V v2,
          +                                          K k3,
          +                                          V v3,
          +                                          K k4,
          +                                          V v4,
          +                                          K k5,
          +                                          V v5,
          +                                          K k6,
          +                                          V v6)
          +
        • +
        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1,
          +                                          K k2,
          +                                          V v2,
          +                                          K k3,
          +                                          V v3,
          +                                          K k4,
          +                                          V v4,
          +                                          K k5,
          +                                          V v5,
          +                                          K k6,
          +                                          V v6,
          +                                          K k7,
          +                                          V v7)
          +
        • +
        + + + + + +
          +
        • +

          of

          +
          public static <K,V> java.util.Map<K,V> of(K k1,
          +                                          V v1,
          +                                          K k2,
          +                                          V v2,
          +                                          K k3,
          +                                          V v3,
          +                                          K k4,
          +                                          V v4,
          +                                          K k5,
          +                                          V v5,
          +                                          K k6,
          +                                          V v6,
          +                                          K k7,
          +                                          V v7,
          +                                          K k8,
          +                                          V v8)
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/V8ValueUtils.html b/docs/reference/javadoc/com/caoccao/javet/utils/V8ValueUtils.html new file mode 100644 index 000000000..4ba52178c --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/V8ValueUtils.html @@ -0,0 +1,312 @@ + + + + + +V8ValueUtils (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils
    +

    Class V8ValueUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.V8ValueUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      +
      public final class V8ValueUtils
      +extends java.lang.Object
      +
      The type V8 value utils.
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        static java.lang.StringEMPTY +
        The constant EMPTY.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + +
        All Methods Static Methods Concrete Methods 
        Modifier and TypeMethod and Description
        static java.lang.Stringconcat(java.lang.String delimiter, + V8Value... v8Values) +
        Concat string.
        +
        static JavetVirtualObject[]convertToVirtualObjects(V8Value... v8Values) +
        Convert to virtual objects.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          EMPTY

          +
          public static final java.lang.String EMPTY
          +
          The constant EMPTY.
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          concat

          +
          public static java.lang.String concat(java.lang.String delimiter,
          +                                      V8Value... v8Values)
          +
          Concat string.
          +
          +
          Parameters:
          +
          delimiter - the delimiter
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the string
          +
          +
        • +
        + + + +
          +
        • +

          convertToVirtualObjects

          +
          public static JavetVirtualObject[] convertToVirtualObjects(V8Value... v8Values)
          +
          Convert to virtual objects.
          +
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the javet virtual objects
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/utils/package-frame.html new file mode 100644 index 000000000..99071e9ad --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/package-frame.html @@ -0,0 +1,29 @@ + + + + + +com.caoccao.javet.utils (javet 0.9.12 API) + + + + +

    com.caoccao.javet.utils

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/utils/package-summary.html new file mode 100644 index 000000000..e1b80d28d --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/package-summary.html @@ -0,0 +1,204 @@ + + + + + +com.caoccao.javet.utils (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.utils

    +
    +
    Built-in utilities.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.utils Description

    +
    Built-in utilities.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/utils/package-tree.html new file mode 100644 index 000000000..2737931d1 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/package-tree.html @@ -0,0 +1,144 @@ + + + + + +com.caoccao.javet.utils Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.utils

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/receivers/IJavetCallbackReceiver.html b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/IJavetCallbackReceiver.html new file mode 100644 index 000000000..164b9ac57 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/IJavetCallbackReceiver.html @@ -0,0 +1,416 @@ + + + + + +IJavetCallbackReceiver (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils.receivers
    +

    Interface IJavetCallbackReceiver

    +
    +
    +
    +
      +
    • +
      +
      All Known Implementing Classes:
      +
      JavetCallbackReceiver
      +
      +
      +
      +
      public interface IJavetCallbackReceiver
      +
      The interface Javet callback receiver.
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods Default Methods 
        Modifier and TypeMethod and Description
        default java.lang.reflect.MethodgetMethod(java.lang.String methodName) +
        Gets method that does not take any arguments by method name.
        +
        default java.lang.reflect.MethodgetMethod(java.lang.String methodName, + boolean thisObjectRequired) +
        Gets method.
        +
        default java.lang.reflect.MethodgetMethod(java.lang.String methodName, + boolean thisObjectRequired, + int argCount) +
        Gets method that takes given number of arguments by method name.
        +
        default java.lang.reflect.MethodgetMethod(java.lang.String methodName, + java.lang.Class<?>... parameterTypes) +
        Gets method that is customized to given argument types by method name.
        +
        default java.lang.reflect.MethodgetMethod(java.lang.String methodName, + int argCount) +
        Gets method.
        +
        default java.lang.reflect.MethodgetMethodVarargs(java.lang.String methodName) +
        Gets method that takes an arbitrary number of arguments by method name.
        +
        default java.lang.reflect.MethodgetMethodVarargs(java.lang.String methodName, + boolean thisObjectRequired) +
        Gets method that takes an arbitrary number of arguments by method name.
        +
        V8RuntimegetV8Runtime() 
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getMethod

          +
          default java.lang.reflect.Method getMethod(java.lang.String methodName)
          +                                    throws java.lang.NoSuchMethodException
          +
          Gets method that does not take any arguments by method name.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          Returns:
          +
          the method
          +
          Throws:
          +
          java.lang.NoSuchMethodException - the no such method exception
          +
          +
        • +
        + + + +
          +
        • +

          getMethod

          +
          default java.lang.reflect.Method getMethod(java.lang.String methodName,
          +                                           int argCount)
          +                                    throws java.lang.NoSuchMethodException
          +
          Gets method.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          argCount - the arg count
          +
          Returns:
          +
          the method
          +
          Throws:
          +
          java.lang.NoSuchMethodException - the no such method exception
          +
          +
        • +
        + + + +
          +
        • +

          getMethod

          +
          default java.lang.reflect.Method getMethod(java.lang.String methodName,
          +                                           boolean thisObjectRequired)
          +                                    throws java.lang.NoSuchMethodException
          +
          Gets method.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          thisObjectRequired - the this object required
          +
          Returns:
          +
          the method
          +
          Throws:
          +
          java.lang.NoSuchMethodException - the no such method exception
          +
          +
        • +
        + + + +
          +
        • +

          getMethod

          +
          default java.lang.reflect.Method getMethod(java.lang.String methodName,
          +                                           boolean thisObjectRequired,
          +                                           int argCount)
          +                                    throws java.lang.NoSuchMethodException
          +
          Gets method that takes given number of arguments by method name.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          thisObjectRequired - the this object required
          +
          argCount - the arg count
          +
          Returns:
          +
          the method
          +
          Throws:
          +
          java.lang.NoSuchMethodException - the no such method exception
          +
          +
        • +
        + + + +
          +
        • +

          getMethod

          +
          default java.lang.reflect.Method getMethod(java.lang.String methodName,
          +                                           java.lang.Class<?>... parameterTypes)
          +                                    throws java.lang.NoSuchMethodException
          +
          Gets method that is customized to given argument types by method name.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          parameterTypes - the parameter types
          +
          Returns:
          +
          the method
          +
          Throws:
          +
          java.lang.NoSuchMethodException - the no such method exception
          +
          +
        • +
        + + + +
          +
        • +

          getMethodVarargs

          +
          default java.lang.reflect.Method getMethodVarargs(java.lang.String methodName)
          +                                           throws java.lang.NoSuchMethodException
          +
          Gets method that takes an arbitrary number of arguments by method name.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          Returns:
          +
          the method varargs
          +
          Throws:
          +
          java.lang.NoSuchMethodException - the no such method exception
          +
          +
        • +
        + + + +
          +
        • +

          getMethodVarargs

          +
          default java.lang.reflect.Method getMethodVarargs(java.lang.String methodName,
          +                                                  boolean thisObjectRequired)
          +                                           throws java.lang.NoSuchMethodException
          +
          Gets method that takes an arbitrary number of arguments by method name.
          +
          +
          Parameters:
          +
          methodName - the method name
          +
          thisObjectRequired - the this object required
          +
          Returns:
          +
          the method varargs
          +
          Throws:
          +
          java.lang.NoSuchMethodException - the no such method exception
          +
          +
        • +
        + + + +
          +
        • +

          getV8Runtime

          +
          V8Runtime getV8Runtime()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/receivers/JavetCallbackReceiver.html b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/JavetCallbackReceiver.html new file mode 100644 index 000000000..fd83b89d8 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/JavetCallbackReceiver.html @@ -0,0 +1,472 @@ + + + + + +JavetCallbackReceiver (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.utils.receivers
    +

    Class JavetCallbackReceiver

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.utils.receivers.JavetCallbackReceiver
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetCallbackReceiver
      +
      +
      +
      +
      public class JavetCallbackReceiver
      +extends java.lang.Object
      +implements IJavetCallbackReceiver
      +
      The type Javet explicit callback receiver. +

      + It is supposed to provide a common ground for customized V8 callback receiver.

      +
    • +
    +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          JavetCallbackReceiver

          +
          public JavetCallbackReceiver(V8Runtime v8Runtime)
          +
          Instantiates a new V8 callback receiver.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          echo

          +
          @CheckReturnValue
          +public V8ValueArray echo(V8Value... args)
          +                                     throws JavetException
          +
          Echo the given V8 value array. +

          + Note: Lifecycle of the input and return arrays is managed by the caller.

          +
          +
          Parameters:
          +
          args - the args
          +
          Returns:
          +
          the V8 value array
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          echoString

          +
          public java.lang.String echoString(java.lang.String str)
          +
          Echo string from input string.
          +
          +
          Parameters:
          +
          str - the str
          +
          Returns:
          +
          the string
          +
          +
        • +
        + + + +
          +
        • +

          echoString

          +
          public java.lang.String echoString(V8Value arg)
          +
          Echo string from input V8 value.
          +
          +
          Parameters:
          +
          arg - the arg
          +
          Returns:
          +
          the string
          +
          +
        • +
        + + + +
          +
        • +

          echoString

          +
          public java.lang.String echoString(V8Value... args)
          +
          Echo string from the given V8 value array. +

          + Note: Lifecycle of the input and return arrays is managed by the caller.

          +
          +
          Parameters:
          +
          args - the args
          +
          Returns:
          +
          the string
          +
          +
        • +
        + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-frame.html new file mode 100644 index 000000000..a026fc9a1 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-frame.html @@ -0,0 +1,23 @@ + + + + + +com.caoccao.javet.utils.receivers (javet 0.9.12 API) + + + + +

    com.caoccao.javet.utils.receivers

    +
    +

    Interfaces

    + +

    Classes

    + +
    + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-summary.html new file mode 100644 index 000000000..fe6233d68 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-summary.html @@ -0,0 +1,171 @@ + + + + + +com.caoccao.javet.utils.receivers (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.utils.receivers

    +
    +
    Built-in callback receivers.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      Interface Summary 
      InterfaceDescription
      IJavetCallbackReceiver +
      The interface Javet callback receiver.
      +
      +
    • +
    • + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      JavetCallbackReceiver +
      The type Javet explicit callback receiver.
      +
      +
    • +
    + + + +

    Package com.caoccao.javet.utils.receivers Description

    +
    Built-in callback receivers.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-tree.html new file mode 100644 index 000000000..edeb46a5a --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/utils/receivers/package-tree.html @@ -0,0 +1,138 @@ + + + + + +com.caoccao.javet.utils.receivers Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.utils.receivers

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/IV8Value.html b/docs/reference/javadoc/com/caoccao/javet/values/IV8Value.html new file mode 100644 index 000000000..e0ff3077a --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/IV8Value.html @@ -0,0 +1,417 @@ + + + + + +IV8Value (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values
    +

    Interface IV8Value

    +
    +
    + +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          equals

          +
          boolean equals(V8Value v8Value)
          +        throws JavetException
          +
          Equals. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          getV8Runtime

          +
          V8Runtime getV8Runtime()
          +
          Gets V8 runtime.
          +
          +
          Returns:
          +
          the V8 runtime
          +
          +
        • +
        + + + +
          +
        • +

          isNull

          +
          default boolean isNull()
          +
          Is null.
          +
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          isNullOrUndefined

          +
          default boolean isNullOrUndefined()
          +
          Is null or undefined.
          +
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          isUndefined

          +
          default boolean isUndefined()
          +
          Is undefined.
          +
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          sameValue

          +
          boolean sameValue(V8Value v8Value)
          +           throws JavetException
          +
          Same value. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          setV8Runtime

          +
          void setV8Runtime(V8Runtime v8Runtime)
          +           throws JavetException
          +
          Sets V8 runtime.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          strictEquals

          +
          boolean strictEquals(V8Value v8Value)
          +              throws JavetException
          +
          Strict equals boolean. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/V8Data.html b/docs/reference/javadoc/com/caoccao/javet/values/V8Data.html new file mode 100644 index 000000000..baedb1930 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/V8Data.html @@ -0,0 +1,238 @@ + + + + + +V8Data (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values
    +

    Class V8Data

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.values.V8Data
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Direct Known Subclasses:
      +
      V8Value
      +
      +
      +
      +
      public abstract class V8Data
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        V8Data() 
        +
      • +
      + +
        +
      • + + +

        Method Summary

        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8Data

          +
          public V8Data()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/V8Value.html b/docs/reference/javadoc/com/caoccao/javet/values/V8Value.html new file mode 100644 index 000000000..deafe6eb3 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/V8Value.html @@ -0,0 +1,537 @@ + + + + + +V8Value (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values
    +

    Class V8Value

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8Value

          +
          protected V8Value()
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/values/package-frame.html new file mode 100644 index 000000000..bc58807f3 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/package-frame.html @@ -0,0 +1,24 @@ + + + + + +com.caoccao.javet.values (javet 0.9.12 API) + + + + +

    com.caoccao.javet.values

    +
    +

    Interfaces

    + +

    Classes

    + +
    + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/values/package-summary.html new file mode 100644 index 000000000..bc589535f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/package-summary.html @@ -0,0 +1,173 @@ + + + + + +com.caoccao.javet.values (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.values

    +
    +
    Classes for V8 values.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + +
      Interface Summary 
      InterfaceDescription
      IV8Value +
      The interface V8 value.
      +
      +
    • +
    • + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      V8Data 
      V8Value 
      +
    • +
    + + + +

    Package com.caoccao.javet.values Description

    +
    Classes for V8 values.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/values/package-tree.html new file mode 100644 index 000000000..874284c00 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/package-tree.html @@ -0,0 +1,155 @@ + + + + + +com.caoccao.javet.values Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.values

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    +
      +
    • java.lang.Object +
        +
      • com.caoccao.javet.values.V8Data +
          +
        • com.caoccao.javet.values.V8Value (implements com.caoccao.javet.values.IV8Value)
        • +
        +
      • +
      +
    • +
    +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueBoolean.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueBoolean.html new file mode 100644 index 000000000..f2961590a --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueBoolean.html @@ -0,0 +1,364 @@ + + + + + +V8ValueBoolean (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueBoolean

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueDouble.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueDouble.html new file mode 100644 index 000000000..0fe204c02 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueDouble.html @@ -0,0 +1,403 @@ + + + + + +V8ValueDouble (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueDouble

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ValueDouble

          +
          public V8ValueDouble()
          +
        • +
        + + + +
          +
        • +

          V8ValueDouble

          +
          public V8ValueDouble(double value)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueInteger.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueInteger.html new file mode 100644 index 000000000..714b0a121 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueInteger.html @@ -0,0 +1,364 @@ + + + + + +V8ValueInteger (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueInteger

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueLong.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueLong.html new file mode 100644 index 000000000..4c7003d4b --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueLong.html @@ -0,0 +1,376 @@ + + + + + +V8ValueLong (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueLong

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ValueLong

          +
          public V8ValueLong()
          +
        • +
        + + + +
          +
        • +

          V8ValueLong

          +
          public V8ValueLong(long value)
          +
        • +
        + + + +
          +
        • +

          V8ValueLong

          +
          public V8ValueLong(java.lang.String value)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueNull.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueNull.html new file mode 100644 index 000000000..3dbc22107 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueNull.html @@ -0,0 +1,477 @@ + + + + + +V8ValueNull (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueNull

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ValueNull

          +
          public V8ValueNull()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          equals

          +
          public boolean equals(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Equals. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          equals in interface IV8Value
          +
          Specified by:
          +
          equals in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          sameValue

          +
          public boolean sameValue(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Same value. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          sameValue in interface IV8Value
          +
          Specified by:
          +
          sameValue in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          strictEquals

          +
          public boolean strictEquals(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Strict equals boolean. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          strictEquals in interface IV8Value
          +
          Specified by:
          +
          strictEquals in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + + + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValuePrimitive.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValuePrimitive.html new file mode 100644 index 000000000..057fb2bc9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValuePrimitive.html @@ -0,0 +1,511 @@ + + + + + +V8ValuePrimitive (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValuePrimitive<T>

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          value

          +
          protected T value
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ValuePrimitive

          +
          public V8ValuePrimitive()
          +
        • +
        + + + + + +
          +
        • +

          V8ValuePrimitive

          +
          public V8ValuePrimitive(T value)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          equals

          +
          public boolean equals(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Equals. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          equals in interface IV8Value
          +
          Specified by:
          +
          equals in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          getValue

          +
          public T getValue()
          +
        • +
        + + + +
          +
        • +

          isEmpty

          +
          public boolean isEmpty()
          +
        • +
        + + + +
          +
        • +

          isPresent

          +
          public boolean isPresent()
          +
        • +
        + + + +
          +
        • +

          sameValue

          +
          public boolean sameValue(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Same value. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          sameValue in interface IV8Value
          +
          Specified by:
          +
          sameValue in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          strictEquals

          +
          public boolean strictEquals(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Strict equals boolean. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          strictEquals in interface IV8Value
          +
          Specified by:
          +
          strictEquals in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueString.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueString.html new file mode 100644 index 000000000..0b30c73bc --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueString.html @@ -0,0 +1,364 @@ + + + + + +V8ValueString (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueString

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUndefined.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUndefined.html new file mode 100644 index 000000000..be1074295 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUndefined.html @@ -0,0 +1,480 @@ + + + + + +V8ValueUndefined (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueUndefined

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + + + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ValueUndefined

          +
          public V8ValueUndefined()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          equals

          +
          public boolean equals(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Equals. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          equals in interface IV8Value
          +
          Specified by:
          +
          equals in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          sameValue

          +
          public boolean sameValue(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Same value. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          sameValue in interface IV8Value
          +
          Specified by:
          +
          sameValue in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + +
          +
        • +

          strictEquals

          +
          public boolean strictEquals(V8Value v8Value)
          +
          Description copied from interface: IV8Value
          +
          Strict equals boolean. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          strictEquals in interface IV8Value
          +
          Specified by:
          +
          strictEquals in class V8Value
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        + + + + + + + +
          +
        • +

          toString

          +
          public java.lang.String toString()
          +
          +
          Overrides:
          +
          toString in class java.lang.Object
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUnknown.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUnknown.html new file mode 100644 index 000000000..eb8067ca8 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueUnknown.html @@ -0,0 +1,351 @@ + + + + + +V8ValueUnknown (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueUnknown

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueZonedDateTime.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueZonedDateTime.html new file mode 100644 index 000000000..0d82bcd24 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/V8ValueZonedDateTime.html @@ -0,0 +1,376 @@ + + + + + +V8ValueZonedDateTime (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.primitive
    +

    Class V8ValueZonedDateTime

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ValueZonedDateTime

          +
          public V8ValueZonedDateTime()
          +
        • +
        + + + +
          +
        • +

          V8ValueZonedDateTime

          +
          public V8ValueZonedDateTime(long jsTimestamp)
          +
        • +
        + + + +
          +
        • +

          V8ValueZonedDateTime

          +
          public V8ValueZonedDateTime(java.time.ZonedDateTime value)
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-frame.html new file mode 100644 index 000000000..b0252d3df --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-frame.html @@ -0,0 +1,28 @@ + + + + + +com.caoccao.javet.values.primitive (javet 0.9.12 API) + + + + +

    com.caoccao.javet.values.primitive

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-summary.html new file mode 100644 index 000000000..b5d3f8a15 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-summary.html @@ -0,0 +1,188 @@ + + + + + +com.caoccao.javet.values.primitive (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.values.primitive

    +
    +
    Classes for V8 primitive values.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.values.primitive Description

    +
    Classes for V8 primitive values.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-tree.html new file mode 100644 index 000000000..2b77f96d6 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/primitive/package-tree.html @@ -0,0 +1,154 @@ + + + + + +com.caoccao.javet.values.primitive Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.values.primitive

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Module.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Module.html new file mode 100644 index 000000000..4437270be --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Module.html @@ -0,0 +1,624 @@ + + + + + +IV8Module (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8Module

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Script.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Script.html new file mode 100644 index 000000000..b230e0a53 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8Script.html @@ -0,0 +1,350 @@ + + + + + +IV8Script (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8Script

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getResourceName

          +
          java.lang.String getResourceName()
          +
        • +
        + + + +
          +
        • +

          setResourceName

          +
          void setResourceName(java.lang.String resourceName)
          +
        • +
        + + + + + +
          +
        • +

          toObject

          +
          default <T,V extends V8Value> T toObject(V v8Value)
          +                                  throws JavetException
          +
          Description copied from interface: IV8Convertible
          +
          Convert from V8 value to object. + The caller is responsible for closing the V8 value.
          +
          +
          Specified by:
          +
          toObject in interface IV8Convertible
          +
          Type Parameters:
          +
          T - the type parameter
          +
          V - the type parameter
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueArray.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueArray.html new file mode 100644 index 000000000..8bc2cb5a9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueArray.html @@ -0,0 +1,558 @@ + + + + + +IV8ValueArray (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueArray

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueFunction.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueFunction.html new file mode 100644 index 000000000..57816ab5d --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueFunction.html @@ -0,0 +1,840 @@ + + + + + +IV8ValueFunction (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueFunction

    +
    +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          call

          +
          @CheckReturnValue
          +default <T extends V8Value> T call(IV8ValueObject receiver,
          +                                                      java.lang.Object... objects)
          +                                               throws JavetException
          +
          Call function by objects and return V8 value.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          call

          +
          @CheckReturnValue
          +default <T extends V8Value> T call(IV8ValueObject receiver,
          +                                                      V8Value... v8Values)
          +                                               throws JavetException
          +
          Call function by V8 values and return V8 value.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          receiver - the receiver
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callAsConstructor

          +
          @CheckReturnValue
          +<T extends V8Value> T callAsConstructor(java.lang.Object... objects)
          +                                                    throws JavetException
          +
          Call function as constructor by objects.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          objects - the objects
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callAsConstructor

          +
          @CheckReturnValue
          +<T extends V8Value> T callAsConstructor(V8Value... v8Values)
          +                                                    throws JavetException
          +
          Call function as constructor by V8 values.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the V8 value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callBoolean

          +
          default java.lang.Boolean callBoolean(IV8ValueObject receiver,
          +                                      java.lang.Object... objects)
          +                               throws JavetException
          +
          Call function by objects and return boolean.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callDouble

          +
          default java.lang.Double callDouble(IV8ValueObject receiver,
          +                                    java.lang.Object... objects)
          +                             throws JavetException
          +
          Call function by objects and return double.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the double
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callExtended

          +
          @CheckReturnValue
          +<T extends V8Value> T callExtended(IV8ValueObject receiver,
          +                                                      boolean returnResult,
          +                                                      java.lang.Object... objects)
          +                                               throws JavetException
          +
          Call function by objects and return V8 value.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          receiver - the receiver
          +
          returnResult - the return result
          +
          objects - the objects
          +
          Returns:
          +
          the t
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callExtended

          +
          @CheckReturnValue
          +<T extends V8Value> T callExtended(IV8ValueObject receiver,
          +                                                      boolean returnResult,
          +                                                      V8Value... v8Values)
          +                                               throws JavetException
          +
          Call function by V8 values and return V8 value.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          receiver - the receiver
          +
          returnResult - the return result
          +
          v8Values - the v 8 values
          +
          Returns:
          +
          the t
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callFloat

          +
          default java.lang.Float callFloat(IV8ValueObject receiver,
          +                                  java.lang.Object... objects)
          +                           throws JavetException
          +
          Call function by objects and return float.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the float
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callInteger

          +
          default java.lang.Integer callInteger(IV8ValueObject receiver,
          +                                      java.lang.Object... objects)
          +                               throws JavetException
          +
          Call function by objects and return integer.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the integer
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callLong

          +
          default java.lang.Long callLong(IV8ValueObject receiver,
          +                                java.lang.Object... objects)
          +                         throws JavetException
          +
          Call function by objects and return long.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the long
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callObject

          +
          default <T> T callObject(IV8ValueObject receiver,
          +                         java.lang.Object... objects)
          +                  throws JavetException
          +
          Call function by objects and return object.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callPrimitive

          +
          default <R,T extends V8ValuePrimitive<R>> R callPrimitive(IV8ValueObject receiver,
          +                                                          java.lang.Object... objects)
          +                                                   throws JavetException
          +
          Call function by objects and return primitive object.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          T - the type parameter
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the primitive object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callString

          +
          default java.lang.String callString(IV8ValueObject receiver,
          +                                    java.lang.Object... objects)
          +                             throws JavetException
          +
          Call function by objects and return string.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Returns:
          +
          the string
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callVoid

          +
          default void callVoid(IV8ValueObject receiver,
          +                      java.lang.Object... objects)
          +               throws JavetException
          +
          Call function by objects without return.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          objects - the objects
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          callVoid

          +
          default void callVoid(IV8ValueObject receiver,
          +                      V8Value... v8Values)
          +               throws JavetException
          +
          Call function by V8 values without return.
          +
          +
          Parameters:
          +
          receiver - the receiver
          +
          v8Values - the V8 values
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + + + + + + + + + + +
          +
        • +

          getSourceCode

          +
          java.lang.String getSourceCode()
          +                        throws JavetException
          +
          Gets source code.
          +
          +
          Returns:
          +
          the source code
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          setSourceCode

          +
          boolean setSourceCode(java.lang.String sourceCode)
          +               throws JavetException
          +
          Sets source code. +

          + Note: The source is shared among all function objects. + So the caller is responsible for restoring the original source code, + otherwise the next function call will likely fail because the source code + of the next function call is incorrect.

          +
          +
          Parameters:
          +
          sourceCode - the source code
          +
          Returns:
          +
          the source code
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueIterator.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueIterator.html new file mode 100644 index 000000000..9188432c9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueIterator.html @@ -0,0 +1,246 @@ + + + + + +IV8ValueIterator (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueIterator<T extends V8Value>

    +
    +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - the type parameter
      +
      +
      +
      All Superinterfaces:
      +
      java.lang.AutoCloseable, IJavetClosable
      +
      +
      +
      All Known Implementing Classes:
      +
      V8ValueIterator
      +
      +
      +
      +
      public interface IV8ValueIterator<T extends V8Value>
      +extends IJavetClosable
      +
      The interface V8 value iterator.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getNext

          +
          T getNext()
          +
          Gets next.
          +
          +
          Returns:
          +
          the next
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueKeyContainer.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueKeyContainer.html new file mode 100644 index 000000000..65e428ae9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueKeyContainer.html @@ -0,0 +1,290 @@ + + + + + +IV8ValueKeyContainer (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueKeyContainer

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueMap.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueMap.html new file mode 100644 index 000000000..c2a6a4a15 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueMap.html @@ -0,0 +1,294 @@ + + + + + +IV8ValueMap (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueMap

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueObject.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueObject.html new file mode 100644 index 000000000..3b9700b83 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueObject.html @@ -0,0 +1,2855 @@ + + + + + +IV8ValueObject (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueObject

    +
    +
    + +
    +
      +
    • + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods Default Methods 
        Modifier and TypeMethod and Description
        java.util.List<JavetCallbackContext>bind(java.lang.Object callbackReceiver) +
        Bind both functions via @V8Function and properties via @V8Property.
        +
        booleanbindFunction(java.lang.String functionName, + JavetCallbackContext javetCallbackContext) +
        Binds function by name and callback context.
        +
        default booleanbindFunction(java.lang.String functionName, + java.lang.String codeString) +
        Binds function by name and string.
        +
        default booleanbindProperty(java.lang.String propertyName, + JavetCallbackContext javetCallbackContextGetter) +
        Bind property.
        +
        default booleanbindProperty(java.lang.String propertyName, + JavetCallbackContext javetCallbackContextGetter, + JavetCallbackContext javetCallbackContextSetter) +
        Bind property.
        +
        default booleanbindProperty(V8ValueString propertyName, + JavetCallbackContext javetCallbackContextGetter) +
        Bind property.
        +
        booleanbindProperty(V8ValueString propertyName, + JavetCallbackContext javetCallbackContextGetter, + JavetCallbackContext javetCallbackContextSetter) +
        Bind property.
        +
        default booleanbindProperty(V8ValueSymbol propertyName, + JavetCallbackContext javetCallbackContextGetter) +
        Bind property.
        +
        booleanbindProperty(V8ValueSymbol propertyName, + JavetCallbackContext javetCallbackContextGetter, + JavetCallbackContext javetCallbackContextSetter) +
        Bind property.
        +
        booleandelete(java.lang.Object key) +
        Delete boolean.
        +
        default booleandeleteNull() +
        Delete null boolean.
        +
        booleandeletePrivateProperty(java.lang.String propertyName) +
        Delete private property boolean.
        +
        default booleandeleteUndefined() +
        Delete undefined boolean.
        +
        <Key extends V8Value,Value extends V8Value,E extends java.lang.Throwable>
        int
        forEach(IJavetBiConsumer<Key,Value,E> consumer) +
        For each.
        +
        <Key extends V8Value,Value extends V8Value,E extends java.lang.Throwable>
        int
        forEach(IJavetBiIndexedConsumer<Key,Value,E> consumer) +
        For each.
        +
        <Key extends V8Value,E extends java.lang.Throwable>
        int
        forEach(IJavetUniConsumer<Key,E> consumer) +
        For each.
        +
        <Key extends V8Value,E extends java.lang.Throwable>
        int
        forEach(IJavetUniIndexedConsumer<Key,E> consumer) +
        For each.
        +
        <T extends V8Value>
        T
        get(java.lang.Object key) +
        Get t.
        +
        default java.lang.BooleangetBoolean(java.lang.Object key) +
        Gets boolean.
        +
        default java.lang.DoublegetDouble(java.lang.Object key) +
        Gets double.
        +
        default java.lang.FloatgetFloat(java.lang.Object key) +
        Gets float.
        +
        intgetIdentityHash() +
        Returns the identity hash for this object.
        +
        default java.lang.IntegergetInteger(java.lang.Object key) +
        Gets integer.
        +
        default java.lang.LonggetLong(java.lang.Object key) +
        Gets long.
        +
        default V8ValueNullgetNull(java.lang.Object key) +
        Gets null.
        +
        default <T> TgetObject(java.lang.Object key) +
        Gets object.
        +
        IV8ValueArraygetOwnPropertyNames() +
        Gets own property names.
        +
        default <R,T extends V8ValuePrimitive<R>>
        R
        getPrimitive(java.lang.Object key) +
        Gets primitive.
        +
        <T extends V8Value>
        T
        getPrivateProperty(java.lang.String propertyName) +
        Gets private property.
        +
        default java.lang.BooleangetPrivatePropertyBoolean(java.lang.String propertyName) +
        Gets private property boolean.
        +
        default java.lang.DoublegetPrivatePropertyDouble(java.lang.String propertyName) +
        Gets private property double.
        +
        default java.lang.FloatgetPrivatePropertyFloat(java.lang.String propertyName) +
        Gets private property float.
        +
        default java.lang.IntegergetPrivatePropertyInteger(java.lang.String propertyName) +
        Gets private property integer.
        +
        default java.lang.LonggetPrivatePropertyLong(java.lang.String propertyName) +
        Gets private property long.
        +
        default V8ValueNullgetPrivatePropertyNull(java.lang.String propertyName) +
        Gets private property null.
        +
        default <T> TgetPrivatePropertyObject(java.lang.String propertyName) +
        Gets private property object.
        +
        default <R,T extends V8ValuePrimitive<R>>
        R
        getPrivatePropertyPrimitive(java.lang.String propertyName) +
        Gets private property primitive.
        +
        default java.lang.StringgetPrivatePropertyString(java.lang.String propertyName) +
        Gets private property string.
        +
        default V8ValueUndefinedgetPrivatePropertyUndefined(java.lang.String propertyName) +
        Gets private property undefined.
        +
        default java.time.ZonedDateTimegetPrivatePropertyZonedDateTime(java.lang.String propertyName) +
        Gets private property zoned date time.
        +
        <T extends V8Value>
        T
        getProperty(java.lang.Object key) +
        Gets property.
        +
        default java.lang.BooleangetPropertyBoolean(java.lang.Object key) +
        Gets property boolean.
        +
        default java.lang.DoublegetPropertyDouble(java.lang.Object key) +
        Gets property double.
        +
        default java.lang.FloatgetPropertyFloat(java.lang.Object key) +
        Gets property float.
        +
        default java.lang.IntegergetPropertyInteger(java.lang.Object key) +
        Gets property integer.
        +
        default java.lang.LonggetPropertyLong(java.lang.Object key) +
        Gets property long.
        +
        IV8ValueArraygetPropertyNames() +
        Gets property names.
        +
        default <T> TgetPropertyObject(java.lang.Object key) +
        Gets property object.
        +
        default <R,T extends V8ValuePrimitive<R>>
        R
        getPropertyPrimitive(java.lang.Object key) +
        Gets property primitive.
        +
        default java.lang.StringgetPropertyString(java.lang.Object key) +
        Gets property string.
        +
        default java.time.ZonedDateTimegetPropertyZonedDateTime(java.lang.Object key) +
        Gets property zoned date time.
        +
        <T extends IV8ValueObject>
        T
        getPrototype() +
        Gets prototype.
        +
        default java.lang.StringgetString(java.lang.Object key) +
        Gets string.
        +
        default V8ValueUndefinedgetUndefined(java.lang.Object key) +
        Gets undefined.
        +
        default java.time.ZonedDateTimegetZonedDateTime(java.lang.Object key) +
        Gets zoned date time.
        +
        booleanhas(java.lang.Object value) +
        Has object property key.
        +
        default booleanhasNull() +
        Has null property key.
        +
        booleanhasOwnProperty(java.lang.Object key) +
        Has own property key.
        +
        booleanhasPrivateProperty(java.lang.String propertyName) +
        Has private property boolean.
        +
        default booleanhasUndefined() +
        Has undefined property key.
        +
        default <T extends V8Value>
        T
        invoke(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return V8 value by name and objects as arguments.
        +
        default <T extends V8Value>
        T
        invoke(java.lang.String functionName, + V8Value... v8Values) +
        Invoke function with return V8 value by name and V8 values as arguments.
        +
        default java.lang.BooleaninvokeBoolean(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value boolean by name and objects as arguments.
        +
        default java.lang.DoubleinvokeDouble(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value double by name and objects as arguments.
        +
        <T extends V8Value>
        T
        invokeExtended(java.lang.String functionName, + boolean returnResult, + java.lang.Object... objects) +
        Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
        +
        <T extends V8Value>
        T
        invokeExtended(java.lang.String functionName, + boolean returnResult, + V8Value... v8Values) +
        Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
        +
        default java.lang.FloatinvokeFloat(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value float by name and objects as arguments.
        +
        default java.lang.IntegerinvokeInteger(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value integer by name and objects as arguments.
        +
        default java.lang.LonginvokeLong(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value long by name and objects as arguments.
        +
        default <T> TinvokeObject(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value object by name and objects as arguments.
        +
        default <R,T extends V8ValuePrimitive<R>>
        R
        invokePrimitive(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value primitive by name and objects as arguments.
        +
        default java.lang.StringinvokeString(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function with return value string by name and objects as arguments.
        +
        default voidinvokeVoid(java.lang.String functionName, + java.lang.Object... objects) +
        Invoke function without return value by name and objects as arguments.
        +
        default voidinvokeVoid(java.lang.String functionName, + V8Value... v8Values) +
        Invoke function without return value by name and V8 values as arguments.
        +
        booleanset(java.lang.Object key, + java.lang.Object value) +
        Set boolean.
        +
        default booleansetNull(java.lang.Object key) +
        Sets null.
        +
        booleansetPrivateProperty(java.lang.String propertyName, + java.lang.Object propertyValue) +
        Sets private property.
        +
        default booleansetPrivatePropertyNull(java.lang.String propertyKey) +
        Sets private property null.
        +
        default booleansetPrivatePropertyUndefined(java.lang.String propertyKey) +
        Sets private property undefined.
        +
        booleansetProperty(java.lang.Object key, + java.lang.Object value) +
        Sets property.
        +
        default booleansetPropertyNull(java.lang.Object key) +
        Sets property null.
        +
        default booleansetPropertyUndefined(java.lang.Object key) +
        Sets property undefined.
        +
        booleansetPrototype(IV8ValueObject v8ValueObject) +
        Sets prototype.
        +
        default booleansetUndefined(java.lang.Object key) +
        Sets undefined.
        +
        java.lang.StringtoJsonString() +
        To json string.
        +
        java.lang.StringtoProtoString() +
        To proto string.
        +
        intunbind(java.lang.Object callbackReceiver) +
        Unbind the interception.
        +
        booleanunbindFunction(java.lang.String functionName) +
        Unbind function.
        +
        default booleanunbindProperty(java.lang.String propertyName) +
        Unbind property.
        +
        booleanunbindProperty(V8ValueString propertyName) +
        Unbind property boolean.
        +
        booleanunbindProperty(V8ValueSymbol propertyName) +
        Unbind property boolean.
        +
        + + + + +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          bind

          +
          java.util.List<JavetCallbackContext> bind(java.lang.Object callbackReceiver)
          +                                   throws JavetException
          +
          Bind both functions via @V8Function and properties via @V8Property.
          +
          +
          Parameters:
          +
          callbackReceiver - the callback receiver
          +
          Returns:
          +
          the list of callback context
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          bindFunction

          +
          boolean bindFunction(java.lang.String functionName,
          +                     JavetCallbackContext javetCallbackContext)
          +              throws JavetException
          +
          Binds function by name and callback context. +

          + It is for creating a Java code based function in V8.

          +
          +
          Parameters:
          +
          functionName - the function name
          +
          javetCallbackContext - the javet callback context
          +
          Returns:
          +
          true : function is bind, false: function is not bind
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          bindFunction

          +
          default boolean bindFunction(java.lang.String functionName,
          +                             java.lang.String codeString)
          +                      throws JavetException
          +
          Binds function by name and string. +

          + It is for creating a string based function in V8. +

          + JS equivalent: + + obj.func = function(arg1, arg2) { ... }; +

          +
          +
          Parameters:
          +
          functionName - the function name
          +
          codeString - the code string
          +
          Returns:
          +
          true : function is bind, false: function is not bind
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          bindProperty

          +
          default boolean bindProperty(java.lang.String propertyName,
          +                             JavetCallbackContext javetCallbackContextGetter)
          +                      throws JavetException
          +
          Bind property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          javetCallbackContextGetter - the javet callback context getter
          +
          Returns:
          +
          true if the property is bind, false if the property is not bind
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          bindProperty

          +
          default boolean bindProperty(java.lang.String propertyName,
          +                             JavetCallbackContext javetCallbackContextGetter,
          +                             JavetCallbackContext javetCallbackContextSetter)
          +                      throws JavetException
          +
          Bind property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          javetCallbackContextGetter - the javet callback context getter
          +
          javetCallbackContextSetter - the javet callback context setter
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          bindProperty

          +
          default boolean bindProperty(V8ValueString propertyName,
          +                             JavetCallbackContext javetCallbackContextGetter)
          +                      throws JavetException
          +
          Bind property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          javetCallbackContextGetter - the javet callback context getter
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          bindProperty

          +
          default boolean bindProperty(V8ValueSymbol propertyName,
          +                             JavetCallbackContext javetCallbackContextGetter)
          +                      throws JavetException
          +
          Bind property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          javetCallbackContextGetter - the javet callback context getter
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          bindProperty

          +
          boolean bindProperty(V8ValueString propertyName,
          +                     JavetCallbackContext javetCallbackContextGetter,
          +                     JavetCallbackContext javetCallbackContextSetter)
          +              throws JavetException
          +
          Bind property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          javetCallbackContextGetter - the javet callback context getter
          +
          javetCallbackContextSetter - the javet callback context setter
          +
          Returns:
          +
          true if the property is bind, false if the property is not bind
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          bindProperty

          +
          boolean bindProperty(V8ValueSymbol propertyName,
          +                     JavetCallbackContext javetCallbackContextGetter,
          +                     JavetCallbackContext javetCallbackContextSetter)
          +              throws JavetException
          +
          Bind property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          javetCallbackContextGetter - the javet callback context getter
          +
          javetCallbackContextSetter - the javet callback context setter
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          delete

          +
          boolean delete(java.lang.Object key)
          +        throws JavetException
          +
          Delete boolean.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          deleteNull

          +
          default boolean deleteNull()
          +                    throws JavetException
          +
          Delete null boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          deletePrivateProperty

          +
          boolean deletePrivateProperty(java.lang.String propertyName)
          +                       throws JavetException
          +
          Delete private property boolean.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          deleteUndefined

          +
          default boolean deleteUndefined()
          +                         throws JavetException
          +
          Delete undefined boolean.
          +
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          <Key extends V8Value,E extends java.lang.Throwable> int forEach(IJavetUniConsumer<Key,E> consumer)
          +                                                         throws JavetException,
          +                                                                E extends java.lang.Throwable
          +
          For each.
          +
          +
          Type Parameters:
          +
          Key - the type of key
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          <Key extends V8Value,E extends java.lang.Throwable> int forEach(IJavetUniIndexedConsumer<Key,E> consumer)
          +                                                         throws JavetException,
          +                                                                E extends java.lang.Throwable
          +
          For each.
          +
          +
          Type Parameters:
          +
          Key - the type of key
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          <Key extends V8Value,Value extends V8Value,E extends java.lang.Throwable> int forEach(IJavetBiConsumer<Key,Value,E> consumer)
          +                                                                               throws JavetException,
          +                                                                                      E extends java.lang.Throwable
          +
          For each.
          +
          +
          Type Parameters:
          +
          Key - the type of key
          +
          Value - the type of value
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.9
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          <Key extends V8Value,Value extends V8Value,E extends java.lang.Throwable> int forEach(IJavetBiIndexedConsumer<Key,Value,E> consumer)
          +                                                                               throws JavetException,
          +                                                                                      E extends java.lang.Throwable
          +
          For each.
          +
          +
          Type Parameters:
          +
          Key - the type of key
          +
          Value - the type of value
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          Since:
          +
          0.8.10
          +
          +
        • +
        + + + +
          +
        • +

          get

          +
          @CheckReturnValue
          +<T extends V8Value> T get(java.lang.Object key)
          +                                      throws JavetException
          +
          Get t.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the t
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getBoolean

          +
          default java.lang.Boolean getBoolean(java.lang.Object key)
          +                              throws JavetException
          +
          Gets boolean.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getDouble

          +
          default java.lang.Double getDouble(java.lang.Object key)
          +                            throws JavetException
          +
          Gets double.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the double
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getFloat

          +
          default java.lang.Float getFloat(java.lang.Object key)
          +                          throws JavetException
          +
          Gets float.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the float
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getIdentityHash

          +
          int getIdentityHash()
          +             throws JavetException
          +
          Returns the identity hash for this object. The current implementation + uses an inline property on the object to store the identity hash. +

          + The return value will never be 0. Also, it is not guaranteed to be + unique.

          +
          +
          Returns:
          +
          the identity hash
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getInteger

          +
          default java.lang.Integer getInteger(java.lang.Object key)
          +                              throws JavetException
          +
          Gets integer.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the integer
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getLong

          +
          default java.lang.Long getLong(java.lang.Object key)
          +                        throws JavetException
          +
          Gets long.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the long
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getNull

          +
          default V8ValueNull getNull(java.lang.Object key)
          +                     throws JavetException
          +
          Gets null.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the null
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getObject

          +
          default <T> T getObject(java.lang.Object key)
          +                 throws JavetException
          +
          Gets object.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getPrimitive

          +
          default <R,T extends V8ValuePrimitive<R>> R getPrimitive(java.lang.Object key)
          +                                                  throws JavetException
          +
          Gets primitive.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          T - the type parameter
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the primitive
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPrivateProperty

          +
          @CheckReturnValue
          +<T extends V8Value> T getPrivateProperty(java.lang.String propertyName)
          +                                                     throws JavetException
          +
          Gets private property.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyBoolean

          +
          default java.lang.Boolean getPrivatePropertyBoolean(java.lang.String propertyName)
          +                                             throws JavetException
          +
          Gets private property boolean.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyDouble

          +
          default java.lang.Double getPrivatePropertyDouble(java.lang.String propertyName)
          +                                           throws JavetException
          +
          Gets private property double.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property double
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyFloat

          +
          default java.lang.Float getPrivatePropertyFloat(java.lang.String propertyName)
          +                                         throws JavetException
          +
          Gets private property float.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property float
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyInteger

          +
          default java.lang.Integer getPrivatePropertyInteger(java.lang.String propertyName)
          +                                             throws JavetException
          +
          Gets private property integer.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property integer
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyLong

          +
          default java.lang.Long getPrivatePropertyLong(java.lang.String propertyName)
          +                                       throws JavetException
          +
          Gets private property long.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property long
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyNull

          +
          default V8ValueNull getPrivatePropertyNull(java.lang.String propertyName)
          +                                    throws JavetException
          +
          Gets private property null.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property null
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyObject

          +
          default <T> T getPrivatePropertyObject(java.lang.String propertyName)
          +                                throws JavetException
          +
          Gets private property object.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyPrimitive

          +
          default <R,T extends V8ValuePrimitive<R>> R getPrivatePropertyPrimitive(java.lang.String propertyName)
          +                                                                 throws JavetException
          +
          Gets private property primitive.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          T - the type parameter
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property primitive
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyString

          +
          default java.lang.String getPrivatePropertyString(java.lang.String propertyName)
          +                                           throws JavetException
          +
          Gets private property string.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property string
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyUndefined

          +
          default V8ValueUndefined getPrivatePropertyUndefined(java.lang.String propertyName)
          +                                              throws JavetException
          +
          Gets private property undefined.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property undefined
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getPrivatePropertyZonedDateTime

          +
          default java.time.ZonedDateTime getPrivatePropertyZonedDateTime(java.lang.String propertyName)
          +                                                         throws JavetException
          +
          Gets private property zoned date time.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property zoned date time
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          getProperty

          +
          @CheckReturnValue
          +<T extends V8Value> T getProperty(java.lang.Object key)
          +                                              throws JavetException
          +
          Gets property.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyBoolean

          +
          default java.lang.Boolean getPropertyBoolean(java.lang.Object key)
          +                                      throws JavetException
          +
          Gets property boolean.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyDouble

          +
          default java.lang.Double getPropertyDouble(java.lang.Object key)
          +                                    throws JavetException
          +
          Gets property double.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property double
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyFloat

          +
          default java.lang.Float getPropertyFloat(java.lang.Object key)
          +                                  throws JavetException
          +
          Gets property float.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property float
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyInteger

          +
          default java.lang.Integer getPropertyInteger(java.lang.Object key)
          +                                      throws JavetException
          +
          Gets property integer.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property integer
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyLong

          +
          default java.lang.Long getPropertyLong(java.lang.Object key)
          +                                throws JavetException
          +
          Gets property long.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property long
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getPropertyObject

          +
          default <T> T getPropertyObject(java.lang.Object key)
          +                         throws JavetException
          +
          Gets property object.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyPrimitive

          +
          default <R,T extends V8ValuePrimitive<R>> R getPropertyPrimitive(java.lang.Object key)
          +                                                          throws JavetException
          +
          Gets property primitive.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          T - the type parameter
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property primitive
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyString

          +
          default java.lang.String getPropertyString(java.lang.Object key)
          +                                    throws JavetException
          +
          Gets property string.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property string
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getPropertyZonedDateTime

          +
          default java.time.ZonedDateTime getPropertyZonedDateTime(java.lang.Object key)
          +                                                  throws JavetException
          +
          Gets property zoned date time.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the property zoned date time
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getString

          +
          default java.lang.String getString(java.lang.Object key)
          +                            throws JavetException
          +
          Gets string.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the string
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getUndefined

          +
          default V8ValueUndefined getUndefined(java.lang.Object key)
          +                               throws JavetException
          +
          Gets undefined.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the undefined
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          getZonedDateTime

          +
          default java.time.ZonedDateTime getZonedDateTime(java.lang.Object key)
          +                                          throws JavetException
          +
          Gets zoned date time.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the zoned date time
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          has

          +
          boolean has(java.lang.Object value)
          +     throws JavetException
          +
          Has object property key.
          +
          +
          Parameters:
          +
          value - the value
          +
          Returns:
          +
          true : yes, false: no
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          hasNull

          +
          default boolean hasNull()
          +                 throws JavetException
          +
          Has null property key.
          +
          +
          Returns:
          +
          true : yes, false: no
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.3
          +
          +
        • +
        + + + +
          +
        • +

          hasOwnProperty

          +
          boolean hasOwnProperty(java.lang.Object key)
          +                throws JavetException
          +
          Has own property key.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          true : yes, false: no
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          hasPrivateProperty

          +
          boolean hasPrivateProperty(java.lang.String propertyName)
          +                    throws JavetException
          +
          Has private property boolean.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          hasUndefined

          +
          default boolean hasUndefined()
          +                      throws JavetException
          +
          Has undefined property key.
          +
          +
          Returns:
          +
          true : yes, false: no
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.3
          +
          +
        • +
        + + + +
          +
        • +

          invoke

          +
          @CheckReturnValue
          +default <T extends V8Value> T invoke(java.lang.String functionName,
          +                                                        java.lang.Object... objects)
          +                                                 throws JavetException
          +
          Invoke function with return V8 value by name and objects as arguments.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the result
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invoke

          +
          @CheckReturnValue
          +default <T extends V8Value> T invoke(java.lang.String functionName,
          +                                                        V8Value... v8Values)
          +                                                 throws JavetException
          +
          Invoke function with return V8 value by name and V8 values as arguments.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          v8Values - the V8 values
          +
          Returns:
          +
          the result
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeBoolean

          +
          default java.lang.Boolean invokeBoolean(java.lang.String functionName,
          +                                        java.lang.Object... objects)
          +                                 throws JavetException
          +
          Invoke function with return value boolean by name and objects as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeDouble

          +
          default java.lang.Double invokeDouble(java.lang.String functionName,
          +                                      java.lang.Object... objects)
          +                               throws JavetException
          +
          Invoke function with return value double by name and objects as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the double
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeExtended

          +
          @CheckReturnValue
          +<T extends V8Value> T invokeExtended(java.lang.String functionName,
          +                                                        boolean returnResult,
          +                                                        java.lang.Object... objects)
          +                                                 throws JavetException
          +
          Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          returnResult - the return result
          +
          objects - the objects
          +
          Returns:
          +
          the result
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          invokeExtended

          +
          @CheckReturnValue
          +<T extends V8Value> T invokeExtended(java.lang.String functionName,
          +                                                        boolean returnResult,
          +                                                        V8Value... v8Values)
          +                                                 throws JavetException
          +
          Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          returnResult - the return result
          +
          v8Values - the v 8 values
          +
          Returns:
          +
          the result
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          invokeFloat

          +
          default java.lang.Float invokeFloat(java.lang.String functionName,
          +                                    java.lang.Object... objects)
          +                             throws JavetException
          +
          Invoke function with return value float by name and objects as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the float
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeInteger

          +
          default java.lang.Integer invokeInteger(java.lang.String functionName,
          +                                        java.lang.Object... objects)
          +                                 throws JavetException
          +
          Invoke function with return value integer by name and objects as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the integer
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeLong

          +
          default java.lang.Long invokeLong(java.lang.String functionName,
          +                                  java.lang.Object... objects)
          +                           throws JavetException
          +
          Invoke function with return value long by name and objects as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the long
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeObject

          +
          default <T> T invokeObject(java.lang.String functionName,
          +                           java.lang.Object... objects)
          +                    throws JavetException
          +
          Invoke function with return value object by name and objects as arguments.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the t
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokePrimitive

          +
          default <R,T extends V8ValuePrimitive<R>> R invokePrimitive(java.lang.String functionName,
          +                                                            java.lang.Object... objects)
          +                                                     throws JavetException
          +
          Invoke function with return value primitive by name and objects as arguments.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the primitive value
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeString

          +
          default java.lang.String invokeString(java.lang.String functionName,
          +                                      java.lang.Object... objects)
          +                               throws JavetException
          +
          Invoke function with return value string by name and objects as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Returns:
          +
          the string
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeVoid

          +
          default void invokeVoid(java.lang.String functionName,
          +                        java.lang.Object... objects)
          +                 throws JavetException
          +
          Invoke function without return value by name and objects as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          objects - the objects
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          invokeVoid

          +
          default void invokeVoid(java.lang.String functionName,
          +                        V8Value... v8Values)
          +                 throws JavetException
          +
          Invoke function without return value by name and V8 values as arguments.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          v8Values - the V8 values
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          set

          +
          boolean set(java.lang.Object key,
          +            java.lang.Object value)
          +     throws JavetException
          +
          Set boolean.
          +
          +
          Parameters:
          +
          key - the key
          +
          value - the value
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setNull

          +
          default boolean setNull(java.lang.Object key)
          +                 throws JavetException
          +
          Sets null.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setPrivateProperty

          +
          boolean setPrivateProperty(java.lang.String propertyName,
          +                           java.lang.Object propertyValue)
          +                    throws JavetException
          +
          Sets private property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          propertyValue - the property value
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          setPrivatePropertyNull

          +
          default boolean setPrivatePropertyNull(java.lang.String propertyKey)
          +                                throws JavetException
          +
          Sets private property null.
          +
          +
          Parameters:
          +
          propertyKey - the property key
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          setPrivatePropertyUndefined

          +
          default boolean setPrivatePropertyUndefined(java.lang.String propertyKey)
          +                                     throws JavetException
          +
          Sets private property undefined.
          +
          +
          Parameters:
          +
          propertyKey - the property key
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.12
          +
          +
        • +
        + + + +
          +
        • +

          setProperty

          +
          boolean setProperty(java.lang.Object key,
          +                    java.lang.Object value)
          +             throws JavetException
          +
          Sets property.
          +
          +
          Parameters:
          +
          key - the key
          +
          value - the value
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setPropertyNull

          +
          default boolean setPropertyNull(java.lang.Object key)
          +                         throws JavetException
          +
          Sets property null.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setPropertyUndefined

          +
          default boolean setPropertyUndefined(java.lang.Object key)
          +                              throws JavetException
          +
          Sets property undefined.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          setPrototype

          +
          boolean setPrototype(IV8ValueObject v8ValueObject)
          +              throws JavetException
          +
          Sets prototype.
          +
          +
          Parameters:
          +
          v8ValueObject - the V8 value object
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.4
          +
          +
        • +
        + + + +
          +
        • +

          setUndefined

          +
          default boolean setUndefined(java.lang.Object key)
          +                      throws JavetException
          +
          Sets undefined.
          +
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          toJsonString

          +
          java.lang.String toJsonString()
          +
          To json string. +

          + JS equivalent: + JSON.stringify(obj);

          +
          +
          Returns:
          +
          the string
          +
          Since:
          +
          0.7.0
          +
          +
        • +
        + + + +
          +
        • +

          toProtoString

          +
          java.lang.String toProtoString()
          +
          To proto string.
          +
          +
          Returns:
          +
          the string
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          unbind

          +
          int unbind(java.lang.Object callbackReceiver)
          +    throws JavetException
          +
          Unbind the interception.
          +
          +
          Parameters:
          +
          callbackReceiver - the callback receiver
          +
          Returns:
          +
          the count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          unbindFunction

          +
          boolean unbindFunction(java.lang.String functionName)
          +                throws JavetException
          +
          Unbind function.
          +
          +
          Parameters:
          +
          functionName - the function name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          unbindProperty

          +
          default boolean unbindProperty(java.lang.String propertyName)
          +                        throws JavetException
          +
          Unbind property.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.11
          +
          +
        • +
        + + + +
          +
        • +

          unbindProperty

          +
          boolean unbindProperty(V8ValueString propertyName)
          +                throws JavetException
          +
          Unbind property boolean.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          unbindProperty

          +
          boolean unbindProperty(V8ValueSymbol propertyName)
          +                throws JavetException
          +
          Unbind property boolean.
          +
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValuePromise.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValuePromise.html new file mode 100644 index 000000000..79fcf4dbb --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValuePromise.html @@ -0,0 +1,1036 @@ + + + + + +IV8ValuePromise (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValuePromise

    +
    +
    +
    +
      +
    • +
      +
      All Superinterfaces:
      +
      java.lang.AutoCloseable, IJavetClosable, IV8Cloneable, IV8Value, IV8ValueObject, IV8ValueReference
      +
      +
      +
      All Known Implementing Classes:
      +
      V8ValuePromise
      +
      +
      +
      +
      public interface IV8ValuePromise
      +extends IV8ValueObject
      +
      The interface V8 value promise is 2-sided. + 1. As a promise resolver, its API includes getPromise(), resolve(), reject(). + 2. As a promise, its API includes _catch(), then(), hasHandler(), markAsHandled(), getState(), getResult().
      +
      +
      Since:
      +
      0.8.0
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          STATE_PENDING

          +
          static final int STATE_PENDING
          +
          The constant STATE_PENDING.
          +
          +
          Since:
          +
          0.8.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          STATE_FULFILLED

          +
          static final int STATE_FULFILLED
          +
          The constant STATE_FULFILLED.
          +
          +
          Since:
          +
          0.8.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          STATE_REJECTED

          +
          static final int STATE_REJECTED
          +
          The constant STATE_REJECTED.
          +
          +
          Since:
          +
          0.8.0
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + + + + + + + + + + + + + +
          +
        • +

          getResultBoolean

          +
          default boolean getResultBoolean()
          +                          throws JavetException
          +
          Gets result boolean.
          +
          +
          Returns:
          +
          the result boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getResultDouble

          +
          default double getResultDouble()
          +                        throws JavetException
          +
          Gets result double.
          +
          +
          Returns:
          +
          the result double
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getResultInteger

          +
          default int getResultInteger()
          +                      throws JavetException
          +
          Gets result integer.
          +
          +
          Returns:
          +
          the result integer
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getResultLong

          +
          default long getResultLong()
          +                    throws JavetException
          +
          Gets result long.
          +
          +
          Returns:
          +
          the result long
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getResultObject

          +
          default <T> T getResultObject(java.lang.Object key)
          +                       throws JavetException
          +
          Gets result object.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the result object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getResultPrimitive

          +
          default <R,T extends V8ValuePrimitive<R>> R getResultPrimitive()
          +                                                        throws JavetException
          +
          Gets result primitive.
          +
          +
          Type Parameters:
          +
          R - the type parameter
          +
          T - the type parameter
          +
          Returns:
          +
          the result primitive
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getResultString

          +
          default java.lang.String getResultString()
          +                                  throws JavetException
          +
          Gets result string.
          +
          +
          Returns:
          +
          the result string
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getResultZonedDateTime

          +
          default java.time.ZonedDateTime getResultZonedDateTime()
          +                                                throws JavetException
          +
          Gets result zoned date time.
          +
          +
          Returns:
          +
          the result zoned date time
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          getState

          +
          int getState()
          +      throws JavetException
          +
          Gets state.
          +
          +
          Returns:
          +
          the state
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          hasHandler

          +
          boolean hasHandler()
          +            throws JavetException
          +
          Has handler.
          +
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          isFulfilled

          +
          default boolean isFulfilled()
          +                     throws JavetException
          +
          Is fulfilled.
          +
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          isPending

          +
          default boolean isPending()
          +                   throws JavetException
          +
          Is pending.
          +
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          isRejected

          +
          default boolean isRejected()
          +                    throws JavetException
          +
          Is rejected.
          +
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          markAsHandled

          +
          void markAsHandled()
          +            throws JavetException
          +
          Mark as handled.
          +
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        + + + +
          +
        • +

          reject

          +
          boolean reject(V8Value v8Value)
          +        throws JavetException
          +
          Reject.
          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + +
          +
        • +

          reject

          +
          default boolean reject(java.lang.Object object)
          +                throws JavetException
          +
          Reject.
          +
          +
          Parameters:
          +
          object - the object
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + +
          +
        • +

          resolve

          +
          boolean resolve(V8Value v8Value)
          +         throws JavetException
          +
          Resolve.
          +
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + +
          +
        • +

          resolve

          +
          default boolean resolve(java.lang.Object object)
          +                 throws JavetException
          +
          Resolve.
          +
          +
          Parameters:
          +
          object - the object
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.9.8
          +
          +
        • +
        + + + + + + + + + + + + + + + +
          +
        • +

          then

          +
          @CheckReturnValue
          +default V8ValuePromise then(java.lang.String codeStringFulfilled,
          +                                               java.lang.String codeStringRejected)
          +                                        throws JavetException
          +
          Then.
          +
          +
          Parameters:
          +
          codeStringFulfilled - the code string fulfilled
          +
          codeStringRejected - the code string rejected
          +
          Returns:
          +
          the V8 value promise
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.0
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueProxy.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueProxy.html new file mode 100644 index 000000000..92ca7008b --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueProxy.html @@ -0,0 +1,354 @@ + + + + + +IV8ValueProxy (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueProxy

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueReference.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueReference.html new file mode 100644 index 000000000..e8e97160f --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueReference.html @@ -0,0 +1,378 @@ + + + + + +IV8ValueReference (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueReference

    +
    +
    + +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueSet.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueSet.html new file mode 100644 index 000000000..6a7f16ff0 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueSet.html @@ -0,0 +1,329 @@ + + + + + +IV8ValueSet (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueSet

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueTypedArray.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueTypedArray.html new file mode 100644 index 000000000..31f065708 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/IV8ValueTypedArray.html @@ -0,0 +1,348 @@ + + + + + +IV8ValueTypedArray (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Interface IV8ValueTypedArray

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8Module.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8Module.html new file mode 100644 index 000000000..59ed3b168 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8Module.html @@ -0,0 +1,618 @@ + + + + + +V8Module (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8Module

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8Script.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8Script.html new file mode 100644 index 000000000..472bdfde3 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8Script.html @@ -0,0 +1,487 @@ + + + + + +V8Script (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8Script

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArguments.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArguments.html new file mode 100644 index 000000000..57cec58c9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArguments.html @@ -0,0 +1,375 @@ + + + + + +V8ValueArguments (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueArguments

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArray.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArray.html new file mode 100644 index 000000000..76ae7c9c2 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArray.html @@ -0,0 +1,652 @@ + + + + + +V8ValueArray (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueArray

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArrayBuffer.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArrayBuffer.html new file mode 100644 index 000000000..3555596b1 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueArrayBuffer.html @@ -0,0 +1,675 @@ + + + + + +V8ValueArrayBuffer (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueArrayBuffer

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + + + + + + + + + + + + + +
          +
        • +

          PROPERTY_BYTE_LENGTH

          +
          protected static final java.lang.String PROPERTY_BYTE_LENGTH
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          byteBuffer

          +
          protected java.nio.ByteBuffer byteBuffer
          +
        • +
        + + + +
          +
        • +

          byteOrder

          +
          protected java.nio.ByteOrder byteOrder
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          fromBytes

          +
          public boolean fromBytes(byte[] bytes)
          +
        • +
        + + + +
          +
        • +

          fromDoubles

          +
          public boolean fromDoubles(double[] doubles)
          +
        • +
        + + + +
          +
        • +

          fromFloats

          +
          public boolean fromFloats(float[] floats)
          +
        • +
        + + + +
          +
        • +

          fromIntegers

          +
          public boolean fromIntegers(int[] integers)
          +
        • +
        + + + +
          +
        • +

          fromLongs

          +
          public boolean fromLongs(long[] longs)
          +
        • +
        + + + +
          +
        • +

          fromShorts

          +
          public boolean fromShorts(short[] shorts)
          +
        • +
        + + + +
          +
        • +

          getByteBuffer

          +
          public java.nio.ByteBuffer getByteBuffer()
          +
        • +
        + + + + + + + +
          +
        • +

          getByteOrder

          +
          public java.nio.ByteOrder getByteOrder()
          +
        • +
        + + + + + + + +
          +
        • +

          setByteOrder

          +
          public void setByteOrder(java.nio.ByteOrder byteOrder)
          +
        • +
        + + + +
          +
        • +

          toBytes

          +
          public byte[] toBytes()
          +
        • +
        + + + +
          +
        • +

          toDoubles

          +
          public double[] toDoubles()
          +
        • +
        + + + +
          +
        • +

          toFloats

          +
          public float[] toFloats()
          +
        • +
        + + + +
          +
        • +

          toIntegers

          +
          public int[] toIntegers()
          +
        • +
        + + + +
          +
        • +

          toLongs

          +
          public long[] toLongs()
          +
        • +
        + + + +
          +
        • +

          toShorts

          +
          public short[] toShorts()
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueDataView.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueDataView.html new file mode 100644 index 000000000..576f19d91 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueDataView.html @@ -0,0 +1,1120 @@ + + + + + +V8ValueDataView (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueDataView

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueError.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueError.html new file mode 100644 index 000000000..9b656dc75 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueError.html @@ -0,0 +1,434 @@ + + + + + +V8ValueError (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueError

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueFunction.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueFunction.html new file mode 100644 index 000000000..31caf5e82 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueFunction.html @@ -0,0 +1,699 @@ + + + + + +V8ValueFunction (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueFunction

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueGlobalObject.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueGlobalObject.html new file mode 100644 index 000000000..66d028a60 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueGlobalObject.html @@ -0,0 +1,619 @@ + + + + + +V8ValueGlobalObject (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueGlobalObject

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, IV8Cloneable, IV8Value, IV8ValueObject, IV8ValueReference, java.lang.AutoCloseable
      +
      +
      +
      +
      public final class V8ValueGlobalObject
      +extends V8ValueObject
      +
      The type V8 value global object is a special object. + 1. It lives as long as V8 runtime lives. + 2. It does not have reference count. + 3. It cannot be set to weak. + 4. Its clone is itself.
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueIterator.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueIterator.html new file mode 100644 index 000000000..6ba9004aa --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueIterator.html @@ -0,0 +1,440 @@ + + + + + +V8ValueIterator (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueIterator<T extends V8Value>

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueMap.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueMap.html new file mode 100644 index 000000000..9fff5af75 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueMap.html @@ -0,0 +1,645 @@ + + + + + +V8ValueMap (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueMap

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueObject.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueObject.html new file mode 100644 index 000000000..a9d00fe21 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueObject.html @@ -0,0 +1,1592 @@ + + + + + +V8ValueObject (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueObject

    +
    +
    + + +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          FUNCTION_ADD

          +
          protected static final java.lang.String FUNCTION_ADD
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          FUNCTION_DELETE

          +
          protected static final java.lang.String FUNCTION_DELETE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          FUNCTION_GET

          +
          protected static final java.lang.String FUNCTION_GET
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          FUNCTION_HAS

          +
          protected static final java.lang.String FUNCTION_HAS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          FUNCTION_SET

          +
          protected static final java.lang.String FUNCTION_SET
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          METHOD_PREFIX_GET

          +
          protected static final java.lang.String METHOD_PREFIX_GET
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          METHOD_PREFIX_IS

          +
          protected static final java.lang.String METHOD_PREFIX_IS
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          METHOD_PREFIX_SET

          +
          protected static final java.lang.String METHOD_PREFIX_SET
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PROPERTY_PROTOTYPE

          +
          protected static final java.lang.String PROPERTY_PROTOTYPE
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8ValueObject

          +
          protected V8ValueObject(long handle)
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          bind

          +
          public java.util.List<JavetCallbackContext> bind(java.lang.Object callbackReceiver)
          +                                          throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Bind both functions via @V8Function and properties via @V8Property.
          +
          +
          Specified by:
          +
          bind in interface IV8ValueObject
          +
          Parameters:
          +
          callbackReceiver - the callback receiver
          +
          Returns:
          +
          the list of callback context
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          bindFunction

          +
          public boolean bindFunction(java.lang.String functionName,
          +                            JavetCallbackContext javetCallbackContext)
          +                     throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Binds function by name and callback context. +

          + It is for creating a Java code based function in V8.

          +
          +
          Specified by:
          +
          bindFunction in interface IV8ValueObject
          +
          Parameters:
          +
          functionName - the function name
          +
          javetCallbackContext - the javet callback context
          +
          Returns:
          +
          true : function is bind, false: function is not bind
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          bindProperty

          +
          public boolean bindProperty(V8ValueString propertyName,
          +                            JavetCallbackContext javetCallbackContextGetter,
          +                            JavetCallbackContext javetCallbackContextSetter)
          +                     throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Bind property.
          +
          +
          Specified by:
          +
          bindProperty in interface IV8ValueObject
          +
          Parameters:
          +
          propertyName - the property name
          +
          javetCallbackContextGetter - the javet callback context getter
          +
          javetCallbackContextSetter - the javet callback context setter
          +
          Returns:
          +
          true if the property is bind, false if the property is not bind
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + + +
          +
        • +

          delete

          +
          public boolean delete(java.lang.Object key)
          +               throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Delete boolean.
          +
          +
          Specified by:
          +
          delete in interface IV8ValueObject
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          deletePrivateProperty

          +
          public boolean deletePrivateProperty(java.lang.String propertyName)
          +                              throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Delete private property boolean.
          +
          +
          Specified by:
          +
          deletePrivateProperty in interface IV8ValueObject
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          public <Key extends V8Value,E extends java.lang.Throwable> int forEach(IJavetUniConsumer<Key,E> consumer)
          +                                                                throws JavetException,
          +                                                                       E extends java.lang.Throwable
          +
          Description copied from interface: IV8ValueObject
          +
          For each.
          +
          +
          Specified by:
          +
          forEach in interface IV8ValueObject
          +
          Type Parameters:
          +
          Key - the type of key
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          public <Key extends V8Value,E extends java.lang.Throwable> int forEach(IJavetUniIndexedConsumer<Key,E> consumer)
          +                                                                throws JavetException,
          +                                                                       E extends java.lang.Throwable
          +
          Description copied from interface: IV8ValueObject
          +
          For each.
          +
          +
          Specified by:
          +
          forEach in interface IV8ValueObject
          +
          Type Parameters:
          +
          Key - the type of key
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          public <Key extends V8Value,Value extends V8Value,E extends java.lang.Throwable> int forEach(IJavetBiConsumer<Key,Value,E> consumer)
          +                                                                                      throws JavetException,
          +                                                                                             E extends java.lang.Throwable
          +
          Description copied from interface: IV8ValueObject
          +
          For each.
          +
          +
          Specified by:
          +
          forEach in interface IV8ValueObject
          +
          Type Parameters:
          +
          Key - the type of key
          +
          Value - the type of value
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          +
        • +
        + + + +
          +
        • +

          forEach

          +
          public <Key extends V8Value,Value extends V8Value,E extends java.lang.Throwable> int forEach(IJavetBiIndexedConsumer<Key,Value,E> consumer)
          +                                                                                      throws JavetException,
          +                                                                                             E extends java.lang.Throwable
          +
          Description copied from interface: IV8ValueObject
          +
          For each.
          +
          +
          Specified by:
          +
          forEach in interface IV8ValueObject
          +
          Type Parameters:
          +
          Key - the type of key
          +
          Value - the type of value
          +
          E - the type of exception
          +
          Parameters:
          +
          consumer - the consumer
          +
          Returns:
          +
          the item count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          E - the exception
          +
          E extends java.lang.Throwable
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          getIdentityHash

          +
          public int getIdentityHash()
          +                    throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Returns the identity hash for this object. The current implementation + uses an inline property on the object to store the identity hash. +

          + The return value will never be 0. Also, it is not guaranteed to be + unique.

          +
          +
          Specified by:
          +
          getIdentityHash in interface IV8ValueObject
          +
          Returns:
          +
          the identity hash
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getPrivateProperty

          +
          public <T extends V8Value> T getPrivateProperty(java.lang.String propertyName)
          +                                         throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Gets private property.
          +
          +
          Specified by:
          +
          getPrivateProperty in interface IV8ValueObject
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the private property
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + + + + + + + + + + + + + + +
          +
        • +

          has

          +
          public boolean has(java.lang.Object value)
          +            throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Has object property key.
          +
          +
          Specified by:
          +
          has in interface IV8ValueObject
          +
          Parameters:
          +
          value - the value
          +
          Returns:
          +
          true : yes, false: no
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          hasOwnProperty

          +
          public boolean hasOwnProperty(java.lang.Object key)
          +                       throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Has own property key.
          +
          +
          Specified by:
          +
          hasOwnProperty in interface IV8ValueObject
          +
          Parameters:
          +
          key - the key
          +
          Returns:
          +
          true : yes, false: no
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          hasPrivateProperty

          +
          public boolean hasPrivateProperty(java.lang.String propertyName)
          +                           throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Has private property boolean.
          +
          +
          Specified by:
          +
          hasPrivateProperty in interface IV8ValueObject
          +
          Parameters:
          +
          propertyName - the property name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          invokeExtended

          +
          @CheckReturnValue
          +public <T extends V8Value> T invokeExtended(java.lang.String functionName,
          +                                                               boolean returnResult,
          +                                                               java.lang.Object... objects)
          +                                                        throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
          +
          +
          Specified by:
          +
          invokeExtended in interface IV8ValueObject
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          returnResult - the return result
          +
          objects - the objects
          +
          Returns:
          +
          the result
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          invokeExtended

          +
          @CheckReturnValue
          +public <T extends V8Value> T invokeExtended(java.lang.String functionName,
          +                                                               boolean returnResult,
          +                                                               V8Value... v8Values)
          +                                                        throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
          +
          +
          Specified by:
          +
          invokeExtended in interface IV8ValueObject
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Parameters:
          +
          functionName - the function name
          +
          returnResult - the return result
          +
          v8Values - the v 8 values
          +
          Returns:
          +
          the result
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          sameValue

          +
          public boolean sameValue(V8Value v8Value)
          +                  throws JavetException
          +
          Description copied from interface: IV8Value
          +
          Same value. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          sameValue in interface IV8Value
          +
          Overrides:
          +
          sameValue in class V8ValueReference
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          set

          +
          public boolean set(java.lang.Object key,
          +                   java.lang.Object value)
          +            throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Set boolean.
          +
          +
          Specified by:
          +
          set in interface IV8ValueObject
          +
          Parameters:
          +
          key - the key
          +
          value - the value
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          setPrivateProperty

          +
          public boolean setPrivateProperty(java.lang.String propertyName,
          +                                  java.lang.Object propertyValue)
          +                           throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Sets private property.
          +
          +
          Specified by:
          +
          setPrivateProperty in interface IV8ValueObject
          +
          Parameters:
          +
          propertyName - the property name
          +
          propertyValue - the property value
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          setProperty

          +
          public boolean setProperty(java.lang.Object key,
          +                           java.lang.Object value)
          +                    throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Sets property.
          +
          +
          Specified by:
          +
          setProperty in interface IV8ValueObject
          +
          Parameters:
          +
          key - the key
          +
          value - the value
          +
          Returns:
          +
          true : set, false: not set
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + + +
          +
        • +

          strictEquals

          +
          public boolean strictEquals(V8Value v8Value)
          +                     throws JavetException
          +
          Description copied from interface: IV8Value
          +
          Strict equals boolean. +

          + The behavior is different from JS behavior but is the same as Java behavior.

          +
          +
          Specified by:
          +
          strictEquals in interface IV8Value
          +
          Overrides:
          +
          strictEquals in class V8ValueReference
          +
          Parameters:
          +
          v8Value - the V8 value
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          toJsonString

          +
          public java.lang.String toJsonString()
          +
          Description copied from interface: IV8ValueObject
          +
          To json string. +

          + JS equivalent: + JSON.stringify(obj);

          +
          +
          Specified by:
          +
          toJsonString in interface IV8ValueObject
          +
          Returns:
          +
          the string
          +
          +
        • +
        + + + +
          +
        • +

          toProtoString

          +
          public java.lang.String toProtoString()
          +
          Description copied from interface: IV8ValueObject
          +
          To proto string.
          +
          +
          Specified by:
          +
          toProtoString in interface IV8ValueObject
          +
          Returns:
          +
          the string
          +
          +
        • +
        + + + +
          +
        • +

          unbind

          +
          public int unbind(java.lang.Object callbackReceiver)
          +           throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Unbind the interception.
          +
          +
          Specified by:
          +
          unbind in interface IV8ValueObject
          +
          Parameters:
          +
          callbackReceiver - the callback receiver
          +
          Returns:
          +
          the count
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + +
          +
        • +

          unbindFunction

          +
          public boolean unbindFunction(java.lang.String functionName)
          +                       throws JavetException
          +
          Description copied from interface: IV8ValueObject
          +
          Unbind function.
          +
          +
          Specified by:
          +
          unbindFunction in interface IV8ValueObject
          +
          Parameters:
          +
          functionName - the function name
          +
          Returns:
          +
          the boolean
          +
          Throws:
          +
          JavetException - the javet exception
          +
          +
        • +
        + + + + + + + + +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValuePromise.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValuePromise.html new file mode 100644 index 000000000..360a14a50 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValuePromise.html @@ -0,0 +1,617 @@ + + + + + +V8ValuePromise (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValuePromise

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueProxy.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueProxy.html new file mode 100644 index 000000000..28f321148 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueProxy.html @@ -0,0 +1,457 @@ + + + + + +V8ValueProxy (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueProxy

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueReference.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueReference.html new file mode 100644 index 000000000..239471a24 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueReference.html @@ -0,0 +1,729 @@ + + + + + +V8ValueReference (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueReference

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueRegExp.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueRegExp.html new file mode 100644 index 000000000..3a1a34a47 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueRegExp.html @@ -0,0 +1,349 @@ + + + + + +V8ValueRegExp (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueRegExp

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSet.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSet.html new file mode 100644 index 000000000..5715b37d0 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSet.html @@ -0,0 +1,560 @@ + + + + + +V8ValueSet (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueSet

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.html new file mode 100644 index 000000000..6ef2fefe7 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.html @@ -0,0 +1,368 @@ + + + + + +V8ValueSharedArrayBuffer (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueSharedArrayBuffer

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbol.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbol.html new file mode 100644 index 000000000..c01a779ee --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbol.html @@ -0,0 +1,459 @@ + + + + + +V8ValueSymbol (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueSymbol

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          FUNCTION_TO_STRING

          +
          protected static final java.lang.String FUNCTION_TO_STRING
          +
          The constant FUNCTION_TO_STRING.
          +
          +
          Since:
          +
          0.9.11
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          PROPERTY_DESCRIPTION

          +
          protected static final java.lang.String PROPERTY_DESCRIPTION
          +
          The constant PROPERTY_DESCRIPTION.
          +
          +
          Since:
          +
          0.9.11
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      + + +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbolObject.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbolObject.html new file mode 100644 index 000000000..723b02b57 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueSymbolObject.html @@ -0,0 +1,437 @@ + + + + + +V8ValueSymbolObject (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueSymbolObject

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueTypedArray.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueTypedArray.html new file mode 100644 index 000000000..896f65882 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueTypedArray.html @@ -0,0 +1,1026 @@ + + + + + +V8ValueTypedArray (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueTypedArray

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, IV8Cloneable, IV8Value, IV8ValueObject, IV8ValueReference, IV8ValueTypedArray, java.lang.AutoCloseable
      +
      +
      +
      +
      public class V8ValueTypedArray
      +extends V8ValueObject
      +implements IV8ValueTypedArray
      +
      The type V8 value typed array. + The typical way of manipulating the typed array is as following. + 1. Get array buffer and apply try-with-resource. + 2. Create the value array by length. + 3. Fill the value array. + E.g.: + + try (V8ValueArrayBuffer v8ValueArrayBuffer = v8ValueTypedArray.getArrayBuffer()) { + long[] longs = new long[v8ValueArrayBuffer.getLength()]; + v8ValueArrayBuffer.toLongs(longs); + // ... + } + + Or, play with ByteBuffer directly. + 1. Get array buffer and apply try-with-resource. + 2. Get native ByteBuffer. + 3. Set order of the native ByteBuffer to native order. + 4. Get typed buffer by type. + 5. Read from or write to the typed buffer. + E.g: + + try (V8ValueArrayBuffer v8ValueArrayBuffer = v8ValueTypedArray.getArrayBuffer()) { + LongBuffer longBuffer = v8ValueArrayBuffer.getByteBuffer().order(ByteOrder.nativeOrder()).asLongBuffer(); + // ... + } +
      +
    • +
    +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakMap.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakMap.html new file mode 100644 index 000000000..0dcd72990 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakMap.html @@ -0,0 +1,510 @@ + + + + + +V8ValueWeakMap (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueWeakMap

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakSet.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakSet.html new file mode 100644 index 000000000..524173e2e --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/V8ValueWeakSet.html @@ -0,0 +1,443 @@ + + + + + +V8ValueWeakSet (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference
    +

    Class V8ValueWeakSet

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInJson.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInJson.html new file mode 100644 index 000000000..cfd1c0887 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInJson.html @@ -0,0 +1,429 @@ + + + + + +V8ValueBuiltInJson (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference.builtin
    +

    Class V8ValueBuiltInJson

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInObject.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInObject.html new file mode 100644 index 000000000..0d7ca6adf --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInObject.html @@ -0,0 +1,511 @@ + + + + + +V8ValueBuiltInObject (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference.builtin
    +

    Class V8ValueBuiltInObject

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInPromise.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInPromise.html new file mode 100644 index 000000000..b13368e17 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInPromise.html @@ -0,0 +1,744 @@ + + + + + +V8ValueBuiltInPromise (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference.builtin
    +

    Class V8ValueBuiltInPromise

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.html new file mode 100644 index 000000000..311c61077 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.html @@ -0,0 +1,1009 @@ + + + + + +V8ValueBuiltInSymbol (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.reference.builtin
    +

    Class V8ValueBuiltInSymbol

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-frame.html new file mode 100644 index 000000000..6842d9cb9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-frame.html @@ -0,0 +1,22 @@ + + + + + +com.caoccao.javet.values.reference.builtin (javet 0.9.12 API) + + + + +

    com.caoccao.javet.values.reference.builtin

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-summary.html new file mode 100644 index 000000000..9078d8426 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-summary.html @@ -0,0 +1,166 @@ + + + + + +com.caoccao.javet.values.reference.builtin (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.values.reference.builtin

    +
    +
    Classes for V8 built-in reference values.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.values.reference.builtin Description

    +
    Classes for V8 built-in reference values.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-tree.html new file mode 100644 index 000000000..5fc125f05 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/builtin/package-tree.html @@ -0,0 +1,157 @@ + + + + + +com.caoccao.javet.values.reference.builtin Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.values.reference.builtin

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/package-frame.html new file mode 100644 index 000000000..40c541e80 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/package-frame.html @@ -0,0 +1,57 @@ + + + + + +com.caoccao.javet.values.reference (javet 0.9.12 API) + + + + +

    com.caoccao.javet.values.reference

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/package-summary.html new file mode 100644 index 000000000..9ea7a6d84 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/package-summary.html @@ -0,0 +1,325 @@ + + + + + +com.caoccao.javet.values.reference (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.values.reference

    +
    +
    Classes for V8 reference values.
    +
    +

    See: Description

    +
    +
    + + + + +

    Package com.caoccao.javet.values.reference Description

    +
    Classes for V8 reference values.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/reference/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/values/reference/package-tree.html new file mode 100644 index 000000000..77d1e12f9 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/reference/package-tree.html @@ -0,0 +1,255 @@ + + + + + +com.caoccao.javet.values.reference Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.values.reference

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValue.html b/docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValue.html new file mode 100644 index 000000000..e53f02625 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValue.html @@ -0,0 +1,414 @@ + + + + + +V8VirtualValue (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.virtual
    +

    Class V8VirtualValue

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.values.virtual.V8VirtualValue
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, java.lang.AutoCloseable
      +
      +
      +
      +
      public class V8VirtualValue
      +extends java.lang.Object
      +implements IJavetClosable
      +
      The type V8 virtual value.
      +
      +
      Since:
      +
      0.8.5
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected booleanconverted +
        It indicates whether the value is converted or not.
        +
        protected V8Valuevalue +
        The Value.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        V8VirtualValue(V8Runtime v8Runtime, + java.lang.Object object) +
        Instantiates a new V8 virtual value.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidclose() 
        <T extends V8Value>
        T
        get() +
        Get the value.
        +
        booleanisClosed() +
        Is closed.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          converted

          +
          protected boolean converted
          +
          It indicates whether the value is converted or not. + true: converted + false: not converted
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          value

          +
          protected V8Value value
          +
          The Value.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8VirtualValue

          +
          public V8VirtualValue(V8Runtime v8Runtime,
          +                      java.lang.Object object)
          +               throws JavetException
          +
          Instantiates a new V8 virtual value.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          object - the object
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          get

          +
          public <T extends V8Value> T get()
          +
          Get the value.
          +
          +
          Type Parameters:
          +
          T - the type parameter
          +
          Returns:
          +
          the value
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          isClosed

          +
          public boolean isClosed()
          +
          Description copied from interface: IJavetClosable
          +
          Is closed.
          +
          +
          Specified by:
          +
          isClosed in interface IJavetClosable
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValueList.html b/docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValueList.html new file mode 100644 index 000000000..14b292494 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/virtual/V8VirtualValueList.html @@ -0,0 +1,410 @@ + + + + + +V8VirtualValueList (javet 0.9.12 API) + + + + + + + + + + + +
    +
    com.caoccao.javet.values.virtual
    +

    Class V8VirtualValueList

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.caoccao.javet.values.virtual.V8VirtualValueList
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      IJavetClosable, java.lang.AutoCloseable
      +
      +
      +
      +
      public class V8VirtualValueList
      +extends java.lang.Object
      +implements IJavetClosable
      +
      The type V8 virtual value list.
      +
      +
      Since:
      +
      0.8.5
      +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + + + +
        Fields 
        Modifier and TypeField and Description
        protected java.util.List<V8Value>toBeClosedValues +
        The To be closed values.
        +
        protected java.util.List<V8Value>values +
        The Values.
        +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        V8VirtualValueList(V8Runtime v8Runtime, + java.lang.Object... objects) +
        Instantiates a new V8 virtual value list.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethod and Description
        voidclose() 
        V8Value[]get() +
        Get V8 value array.
        +
        booleanisClosed() +
        Is closed.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          toBeClosedValues

          +
          protected java.util.List<V8Value> toBeClosedValues
          +
          The To be closed values.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          values

          +
          protected java.util.List<V8Value> values
          +
          The Values.
          +
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          V8VirtualValueList

          +
          public V8VirtualValueList(V8Runtime v8Runtime,
          +                          java.lang.Object... objects)
          +                   throws JavetException
          +
          Instantiates a new V8 virtual value list.
          +
          +
          Parameters:
          +
          v8Runtime - the V8 runtime
          +
          objects - the objects
          +
          Throws:
          +
          JavetException - the javet exception
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + + + + + +
          +
        • +

          get

          +
          public V8Value[] get()
          +
          Get V8 value array.
          +
          +
          Returns:
          +
          the V8 value array
          +
          Since:
          +
          0.8.5
          +
          +
        • +
        + + + +
          +
        • +

          isClosed

          +
          public boolean isClosed()
          +
          Description copied from interface: IJavetClosable
          +
          Is closed.
          +
          +
          Specified by:
          +
          isClosed in interface IJavetClosable
          +
          Returns:
          +
          the boolean
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-frame.html b/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-frame.html new file mode 100644 index 000000000..5017a5fbf --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-frame.html @@ -0,0 +1,20 @@ + + + + + +com.caoccao.javet.values.virtual (javet 0.9.12 API) + + + + +

    com.caoccao.javet.values.virtual

    + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-summary.html b/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-summary.html new file mode 100644 index 000000000..8d1308603 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-summary.html @@ -0,0 +1,160 @@ + + + + + +com.caoccao.javet.values.virtual (javet 0.9.12 API) + + + + + + + + + + +
    +

    Package com.caoccao.javet.values.virtual

    +
    +
    Classes for V8 virtual reference values.
    +
    +

    See: Description

    +
    +
    +
      +
    • + + + + + + + + + + + + + + + + +
      Class Summary 
      ClassDescription
      V8VirtualValue +
      The type V8 virtual value.
      +
      V8VirtualValueList +
      The type V8 virtual value list.
      +
      +
    • +
    + + + +

    Package com.caoccao.javet.values.virtual Description

    +
    Classes for V8 virtual reference values.
    +
    +
    Since:
    +
    0.7.0
    +
    +
    + + + + + + diff --git a/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-tree.html b/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-tree.html new file mode 100644 index 000000000..a1f51bec7 --- /dev/null +++ b/docs/reference/javadoc/com/caoccao/javet/values/virtual/package-tree.html @@ -0,0 +1,135 @@ + + + + + +com.caoccao.javet.values.virtual Class Hierarchy (javet 0.9.12 API) + + + + + + + + + + +
    +

    Hierarchy For Package com.caoccao.javet.values.virtual

    +Package Hierarchies: + +
    +
    +

    Class Hierarchy

    + +
    + + + + + + diff --git a/docs/reference/javadoc/constant-values.html b/docs/reference/javadoc/constant-values.html new file mode 100644 index 000000000..d439294bd --- /dev/null +++ b/docs/reference/javadoc/constant-values.html @@ -0,0 +1,1850 @@ + + + + + +Constant Field Values (javet 0.9.12 API) + + + + + + + + + + +
    +

    Constant Field Values

    +

    Contents

    + +
    +
    + + +

    com.caoccao.*

    + + + + + + + + +
      +
    • + + + + + + + + + + + + + + +
      com.caoccao.javet.utils.SimpleFreeMarkerFormat 
      Modifier and TypeConstant FieldValue
      + +public static final java.lang.StringSTRING_NULL"<null>"
      +
    • +
    • + + + + + + + + + + + + + + +
      com.caoccao.javet.utils.V8ValueUtils 
      Modifier and TypeConstant FieldValue
      + +public static final java.lang.StringEMPTY""
      +
    • +
    +
      +
    • + + + + + + + + + + + + + + +
      com.caoccao.javet.utils.receivers.JavetCallbackReceiver 
      Modifier and TypeConstant FieldValue
      + +protected static final java.lang.StringCOMMA","
      +
    • +
    +
      +
    • + + + + + + + + + + + + + + +
      com.caoccao.javet.values.primitive.V8ValueNull 
      Modifier and TypeConstant FieldValue
      + +public static final java.lang.StringNULL"null"
      +
    • +
    • + + + + + + + + + + + + + + +
      com.caoccao.javet.values.primitive.V8ValueUndefined 
      Modifier and TypeConstant FieldValue
      + +public static final java.lang.StringUNDEFINED"undefined"
      +
    • +
    + + +
    + + + + + + diff --git a/docs/reference/javadoc/deprecated-list.html b/docs/reference/javadoc/deprecated-list.html new file mode 100644 index 000000000..ddbab7f97 --- /dev/null +++ b/docs/reference/javadoc/deprecated-list.html @@ -0,0 +1,121 @@ + + + + + +Deprecated List (javet 0.9.12 API) + + + + + + + +
    + + + + + + + +
    + + +
    +

    Deprecated API

    +

    Contents

    +
    + +
    + + + + + + + +
    + + + + diff --git a/docs/reference/javadoc/help-doc.html b/docs/reference/javadoc/help-doc.html new file mode 100644 index 000000000..753620d67 --- /dev/null +++ b/docs/reference/javadoc/help-doc.html @@ -0,0 +1,222 @@ + + + + + +API Help (javet 0.9.12 API) + + + + + + + +
    + + + + + + + +
    + + +
    +

    How This API Document Is Organized

    +
    This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
    +
    +
    +
      +
    • +

      Overview

      +

      The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

      +
    • +
    • +

      Package

      +

      Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

      +
        +
      • Interfaces (italic)
      • +
      • Classes
      • +
      • Enums
      • +
      • Exceptions
      • +
      • Errors
      • +
      • Annotation Types
      • +
      +
    • +
    • +

      Class/Interface

      +

      Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

      +
        +
      • Class inheritance diagram
      • +
      • Direct Subclasses
      • +
      • All Known Subinterfaces
      • +
      • All Known Implementing Classes
      • +
      • Class/interface declaration
      • +
      • Class/interface description
      • +
      +
        +
      • Nested Class Summary
      • +
      • Field Summary
      • +
      • Constructor Summary
      • +
      • Method Summary
      • +
      +
        +
      • Field Detail
      • +
      • Constructor Detail
      • +
      • Method Detail
      • +
      +

      Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

      +
    • +
    • +

      Annotation Type

      +

      Each annotation type has its own separate page with the following sections:

      +
        +
      • Annotation Type declaration
      • +
      • Annotation Type description
      • +
      • Required Element Summary
      • +
      • Optional Element Summary
      • +
      • Element Detail
      • +
      +
    • +
    • +

      Enum

      +

      Each enum has its own separate page with the following sections:

      +
        +
      • Enum declaration
      • +
      • Enum description
      • +
      • Enum Constant Summary
      • +
      • Enum Constant Detail
      • +
      +
    • +
    • +

      Tree (Class Hierarchy)

      +

      There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

      +
        +
      • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
      • +
      • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
      • +
      +
    • +
    • +

      Deprecated API

      +

      The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

      +
    • +
    • +

      Index

      +

      The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

      +
    • +
    • +

      Prev/Next

      +

      These links take you to the next or previous class, interface, package, or related page.

      +
    • +
    • +

      Frames/No Frames

      +

      These links show and hide the HTML frames. All pages are available with or without frames.

      +
    • +
    • +

      All Classes

      +

      The All Classes link shows all classes and interfaces except non-static nested types.

      +
    • +
    • +

      Serialized Form

      +

      Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

      +
    • +
    • +

      Constant Field Values

      +

      The Constant Field Values page lists the static final fields and their values.

      +
    • +
    +This help file applies to API documentation generated using the standard doclet.
    + +
    + + + + + + + +
    + + + + diff --git a/docs/reference/javadoc/index-all.html b/docs/reference/javadoc/index-all.html new file mode 100644 index 000000000..ad2728f24 --- /dev/null +++ b/docs/reference/javadoc/index-all.html @@ -0,0 +1,5428 @@ + + + + + +Index (javet 0.9.12 API) + + + + + + + +
    + + + + + + + +
    + + +
    A B C D E F G H I J K L M N O P Q R S T U V W Z _  + + +

    A

    +
    +
    accept(T1, T2) - Method in interface com.caoccao.javet.interfaces.IJavetBiConsumer
    +
    +
    Accept.
    +
    +
    accept(int, T1, T2) - Method in interface com.caoccao.javet.interfaces.IJavetBiIndexedConsumer
    +
    +
    Accept.
    +
    +
    accept(T) - Method in interface com.caoccao.javet.interfaces.IJavetUniConsumer
    +
    +
    Accept.
    +
    +
    accept(int, T) - Method in interface com.caoccao.javet.interfaces.IJavetUniIndexedConsumer
    +
    +
    Accept.
    +
    +
    active - Variable in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    active - Variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The Active.
    +
    +
    activeEngineList - Variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The Active engine list.
    +
    +
    add(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    add(IV8ValueSet, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    add(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueSet
    +
     
    +
    add(Object) - Method in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    add(IV8ValueObject) - Method in class com.caoccao.javet.values.reference.V8ValueWeakSet
    +
     
    +
    addListeners(IV8InspectorListener...) - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    addMethod(Method, int, Map<String, List<Method>>) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Add method.
    +
    +
    addNull() - Method in interface com.caoccao.javet.values.reference.IV8ValueSet
    +
     
    +
    addReference(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    addReference() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    addReference() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    addUndefined() - Method in interface com.caoccao.javet.values.reference.IV8ValueSet
    +
     
    +
    addV8Module(IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    all(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    allowCodeGenerationFromStrings(long, boolean) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    allowEval(boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    allSettled(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    allSettledVoid(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    allVoid(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    any(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    anyVoid(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    apply(V8Value, V8Value, V8ValueArray) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Apply to object
    +
    +
    assign(V8ValueObject, V8ValueObject) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInObject
    +
    +
    Assign V8 value object.
    +
    +
    await(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    await() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    + + + +

    B

    +
    +
    BaseJavetConsoleInterceptor - Class in com.caoccao.javet.interception.logging
    +
    +
    The type Base javet console interceptor.
    +
    +
    BaseJavetConsoleInterceptor(V8Runtime) - Constructor for class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Instantiates a new Base javet console interceptor.
    +
    +
    BaseJavetInterceptor - Class in com.caoccao.javet.interception
    +
     
    +
    BaseJavetInterceptor(V8Runtime) - Constructor for class com.caoccao.javet.interception.BaseJavetInterceptor
    +
     
    +
    BaseJavetProxyHandler<T> - Class in com.caoccao.javet.interop.proxy
    +
    +
    The type Base javet proxy handler.
    +
    +
    BaseJavetProxyHandler(V8Runtime, T) - Constructor for class com.caoccao.javet.interop.proxy.BaseJavetProxyHandler
    +
    +
    Instantiates a new Base javet proxy handler.
    +
    +
    BaseJavetScriptingException - Exception in com.caoccao.javet.exceptions
    +
     
    +
    BaseJavetScriptingException(JavetError, String, String, String, int, int, int, int, int) - Constructor for exception com.caoccao.javet.exceptions.BaseJavetScriptingException
    +
     
    +
    BaseNodeModule - Class in com.caoccao.javet.node.modules
    +
     
    +
    BaseNodeModule(V8ValueObject, String) - Constructor for class com.caoccao.javet.node.modules.BaseNodeModule
    +
     
    +
    BaseV8Executor - Class in com.caoccao.javet.interop.executors
    +
     
    +
    BaseV8Executor(V8Runtime) - Constructor for class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    bind(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Bind both functions via @V8Function and properties via @V8Property.
    +
    +
    bind(Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    bindFunction(String, JavetCallbackContext) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Binds function by name and callback context.
    +
    +
    bindFunction(String, String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Binds function by name and string.
    +
    +
    bindFunction(String, JavetCallbackContext) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    BindingContext - Class in com.caoccao.javet.interop.binding
    +
    +
    The type Binding context.
    +
    +
    BindingContext() - Constructor for class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Instantiates a new Binding context.
    +
    +
    bindingContextWeakHashMap - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    bindProperty(String, JavetCallbackContext) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Bind property.
    +
    +
    bindProperty(String, JavetCallbackContext, JavetCallbackContext) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Bind property.
    +
    +
    bindProperty(V8ValueString, JavetCallbackContext) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Bind property.
    +
    +
    bindProperty(V8ValueSymbol, JavetCallbackContext) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Bind property.
    +
    +
    bindProperty(V8ValueString, JavetCallbackContext, JavetCallbackContext) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Bind property.
    +
    +
    bindProperty(V8ValueSymbol, JavetCallbackContext, JavetCallbackContext) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Bind property.
    +
    +
    bindProperty(V8ValueString, JavetCallbackContext, JavetCallbackContext) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    bindProperty(V8ValueSymbol, JavetCallbackContext, JavetCallbackContext) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    builtInSymbolMap - Variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    BYTE_LENGTH_1 - Static variable in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    BYTE_LENGTH_2 - Static variable in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    BYTE_LENGTH_3 - Static variable in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    byteBuffer - Variable in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    byteOrder - Variable in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    + + + +

    C

    +
    +
    cachedV8ValueBooleans - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    cachedV8ValueIntegers - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    cachedV8ValueLongs - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    cachedV8ValueNull - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    cachedV8ValueUndefined - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    calculateScore() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.ScoredExecutable
    +
    +
    Calculate score double.
    +
    +
    call(long, long, int, Object, boolean, Object[]) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    call(IV8ValueObject, IV8ValueObject, boolean, V8Value...) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    call(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return V8 value.
    +
    +
    call(IV8ValueObject, V8Value...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by V8 values and return V8 value.
    +
    +
    callAsConstructor(long, long, int, Object[]) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    callAsConstructor(IV8ValueObject, V8Value...) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    callAsConstructor(Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function as constructor by objects.
    +
    +
    callAsConstructor(V8Value...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function as constructor by V8 values.
    +
    +
    callAsConstructor(Object...) - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    callAsConstructor(V8Value...) - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    callback(JavetPromiseRejectEvent, V8ValuePromise, V8Value) - Method in interface com.caoccao.javet.interfaces.IJavetPromiseRejectCallback
    +
    +
    Callback.
    +
    +
    callback(JavetPromiseRejectEvent, V8ValuePromise, V8Value) - Method in class com.caoccao.javet.utils.JavetPromiseRejectCallback
    +
     
    +
    callbackContextLock - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    callbackContextMap - Variable in class com.caoccao.javet.interop.V8Runtime
    +
    +
    The Callback context map.
    +
    +
    CallbackInjectionFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    CallbackMethodFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    CallbackRegistrationFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    CallbackSignatureParameterSizeMismatch - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    CallbackSignatureParameterTypeMismatch - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    CallbackUnknownFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    CallbackUnregistrationFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    callBoolean(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return boolean.
    +
    +
    callDouble(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return double.
    +
    +
    callExtended(IV8ValueObject, boolean, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return V8 value.
    +
    +
    callExtended(IV8ValueObject, boolean, V8Value...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by V8 values and return V8 value.
    +
    +
    callExtended(IV8ValueObject, boolean, Object...) - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    callExtended(IV8ValueObject, boolean, V8Value...) - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    callFloat(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return float.
    +
    +
    callInteger(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return integer.
    +
    +
    callLong(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return long.
    +
    +
    callObject(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return object.
    +
    +
    callPrimitive(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return primitive object.
    +
    +
    callString(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects and return string.
    +
    +
    callVoid(IV8ValueObject, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by objects without return.
    +
    +
    callVoid(IV8ValueObject, V8Value...) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Call function by V8 values without return.
    +
    +
    cancel() - Method in interface com.caoccao.javet.interop.engine.IJavetEngineGuard
    +
    +
    Cancel.
    +
    +
    cancel() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    CheckReturnValue - Annotation Type in com.caoccao.javet.annotations
    +
    +
    This annotation is for IDE to warn application developers to consume the return value.
    +
    +
    checkV8Runtime() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    checkV8Runtime() - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    circularStructure(int) - Static method in exception com.caoccao.javet.exceptions.JavetConverterException
    +
    +
    Circular structure.
    +
    +
    classMode - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Class mode.
    +
    +
    clearInternalStatistic() - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    clearInternalStatistic() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Clear internal statistic for internal test purpose.
    +
    +
    clearWeak(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    clearWeak(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    clearWeak() - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    clearWeak() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    clearWeak() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    clone() - Method in class com.caoccao.javet.entities.JavetEntityMap
    +
     
    +
    cloneV8Value(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    cloneV8Value(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    close() - Method in interface com.caoccao.javet.interfaces.IJavetClosable
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    close(boolean) - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueFunctionInvocationHandler
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueObjectInvocationHandler
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.V8Host
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.V8Locker
    +
     
    +
    close() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    close(boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    close() - Method in class com.caoccao.javet.node.modules.BaseNodeModule
    +
     
    +
    close() - Method in class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    close() - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    close() - Method in class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    close(boolean) - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    close(boolean) - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    close() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    close(boolean) - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    close() - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    close() - Method in class com.caoccao.javet.values.virtual.V8VirtualValue
    +
     
    +
    close() - Method in class com.caoccao.javet.values.virtual.V8VirtualValueList
    +
     
    +
    closed - Variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The Closed.
    +
    +
    closeV8Runtime(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    closeV8Runtime(V8Runtime) - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Close V8 runtime.
    +
    +
    code - Variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    com.caoccao.javet.annotations - package com.caoccao.javet.annotations
    +
    +
    Annotations classes for declarative coding and IDE intellisense.
    +
    +
    com.caoccao.javet.entities - package com.caoccao.javet.entities
    +
    +
    Built-in entities for default object conversion.
    +
    +
    com.caoccao.javet.enums - package com.caoccao.javet.enums
    +
    +
    Enums for various API.
    +
    +
    com.caoccao.javet.exceptions - package com.caoccao.javet.exceptions
    +
    +
    Exceptions and errors for error handling.
    +
    +
    com.caoccao.javet.interception - package com.caoccao.javet.interception
    +
    +
    Built-in interceptors.
    +
    +
    com.caoccao.javet.interception.logging - package com.caoccao.javet.interception.logging
    +
    +
    Built-in interceptors for JS logging function console.log(), etc...
    +
    +
    com.caoccao.javet.interfaces - package com.caoccao.javet.interfaces
    +
    +
    Interfaces required by various internal and external API.
    +
    +
    com.caoccao.javet.interop - package com.caoccao.javet.interop
    +
    +
    Interoperation between JVM and C++ via JNI.
    +
    +
    com.caoccao.javet.interop.binding - package com.caoccao.javet.interop.binding
    +
    +
    Callback data structure for binding context and method descriptor.
    +
    +
    com.caoccao.javet.interop.callback - package com.caoccao.javet.interop.callback
    +
    +
    Callback bridge between JVM and C++ via JNI.
    +
    +
    com.caoccao.javet.interop.converters - package com.caoccao.javet.interop.converters
    +
    +
    Built-in converters, interface and config.
    +
    +
    com.caoccao.javet.interop.engine - package com.caoccao.javet.interop.engine
    +
    +
    Engine pool, config and guard.
    +
    +
    com.caoccao.javet.interop.executors - package com.caoccao.javet.interop.executors
    +
    +
    Executors and interface.
    +
    +
    com.caoccao.javet.interop.proxy - package com.caoccao.javet.interop.proxy
    +
    +
    Dynamic proxy handlers for polyfilling Java interfaces with JS functions or objects.
    +
    +
    com.caoccao.javet.node.modules - package com.caoccao.javet.node.modules
    +
    +
    Reference classes for Node.js built-in modules.
    +
    +
    com.caoccao.javet.utils - package com.caoccao.javet.utils
    +
    +
    Built-in utilities.
    +
    +
    com.caoccao.javet.utils.receivers - package com.caoccao.javet.utils.receivers
    +
    +
    Built-in callback receivers.
    +
    +
    com.caoccao.javet.values - package com.caoccao.javet.values
    +
    +
    Classes for V8 values.
    +
    +
    com.caoccao.javet.values.primitive - package com.caoccao.javet.values.primitive
    +
    +
    Classes for V8 primitive values.
    +
    +
    com.caoccao.javet.values.reference - package com.caoccao.javet.values.reference
    +
    +
    Classes for V8 reference values.
    +
    +
    com.caoccao.javet.values.reference.builtin - package com.caoccao.javet.values.reference.builtin
    +
    +
    Classes for V8 built-in reference values.
    +
    +
    com.caoccao.javet.values.virtual - package com.caoccao.javet.values.virtual
    +
    +
    Classes for V8 virtual reference values.
    +
    +
    COMMA - Static variable in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
     
    +
    CompilationFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    compile(long, String, boolean, String, int, int, int, boolean, boolean) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    compileScript(boolean) - Method in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    compileScript() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    compileScript(boolean) - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    compileScript(boolean) - Method in class com.caoccao.javet.interop.executors.V8StringExecutor
    +
     
    +
    compileScript(String, V8ScriptOrigin, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    compileScriptVoid() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    compileV8Module(boolean) - Method in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    compileV8Module() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    compileV8Module(boolean) - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    compileV8Module(boolean) - Method in class com.caoccao.javet.interop.executors.V8StringExecutor
    +
     
    +
    compileV8Module(String, V8ScriptOrigin, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    compileV8ModuleVoid() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    concat(V8Value...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Concat string.
    +
    +
    concat(String, V8Value...) - Static method in class com.caoccao.javet.utils.V8ValueUtils
    +
    +
    Concat string.
    +
    +
    config - Variable in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
    +
    The Config.
    +
    +
    config - Variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The Config.
    +
    +
    consoleDebug(V8Value...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Console debug.
    +
    +
    consoleDebug(V8Value...) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
     
    +
    consoleError(V8Value...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Console error.
    +
    +
    consoleError(V8Value...) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
     
    +
    consoleInfo(V8Value...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Console info.
    +
    +
    consoleInfo(V8Value...) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
     
    +
    consoleLog(V8Value...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Console log.
    +
    +
    consoleLog(V8Value...) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
     
    +
    consoleTrace(V8Value...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Console trace.
    +
    +
    consoleTrace(V8Value...) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
     
    +
    consoleWarn(V8Value...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Console warn.
    +
    +
    consoleWarn(V8Value...) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
     
    +
    construct(V8Value, V8ValueArray, V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Construct.
    +
    +
    construct(V8Value, V8ValueArray, V8Value) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
     
    +
    constructors - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Constructors.
    +
    +
    containsV8Module(String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    continuable - Variable in exception com.caoccao.javet.exceptions.JavetTerminatedException
    +
     
    +
    converted - Variable in class com.caoccao.javet.utils.JavetVirtualObject
    +
    +
    The Converted.
    +
    +
    converted - Variable in class com.caoccao.javet.values.virtual.V8VirtualValue
    +
    +
    It indicates whether the value is converted or not.
    +
    +
    converter - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    ConverterCircularStructure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    ConverterFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    ConverterSymbolNotBuiltIn - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    convertToVirtualObjects(V8Value...) - Static method in class com.caoccao.javet.utils.V8ValueUtils
    +
    +
    Convert to virtual objects.
    +
    +
    createEngine() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    Create engine javet engine.
    +
    +
    createEntityFunction() - Method in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    Create entity function javet entity function.
    +
    +
    createEntityMap() - Method in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    Create entity map map.
    +
    +
    createV8Inspector(long, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    createV8Runtime(String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    createV8Runtime() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Create V8 runtime.
    +
    +
    createV8Runtime(String) - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Create V8 runtime.
    +
    +
    createV8Runtime(boolean, String) - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Create V8 runtime.
    +
    +
    createV8Value(long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    createV8ValueArray() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueArray() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueArrayBuffer(int) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueArrayBuffer(int) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueBoolean(boolean) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueBoolean(boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueDataView(V8ValueArrayBuffer) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueDataView(V8ValueArrayBuffer) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueDouble(double) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueDouble(double) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueFunction(JavetCallbackContext) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueFunction(String) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueFunction(JavetCallbackContext) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueFunction(String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueInteger(int) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueInteger(int) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueLong(long) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueLong(long) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueMap() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueMap() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueNull() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueNull() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueObject() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueObject() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValuePromise() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValuePromise() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueProxy() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueProxy(V8ValueObject) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueProxy(V8ValueObject) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueSet() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueSet() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueString(String) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueString(String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueSymbol(String) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueSymbol(String, boolean) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueSymbol(String, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueTypedArray(V8ValueReferenceType, int) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueTypedArray(V8ValueReferenceType, int) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueUndefined() - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueUndefined() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueZonedDateTime(long) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueZonedDateTime(ZonedDateTime) - Method in interface com.caoccao.javet.interop.IV8Creatable
    +
     
    +
    createV8ValueZonedDateTime(long) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    createV8ValueZonedDateTime(ZonedDateTime) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    customObjectLock - Variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The Custom object lock.
    +
    +
    customObjectMap - Variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The Custom object map.
    +
    +
    + + + +

    D

    +
    +
    daemonThread - Variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The Daemon thread.
    +
    +
    debug - Variable in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    The Debug.
    +
    +
    debug(String) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Debug.
    +
    +
    debug(String) - Method in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    decorateV8Value(T) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    decorateV8Values(T...) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    DEFAULT_CONVERTER - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    DEFAULT_ENGINE_GUARD_CHECK_INTERVAL_MILLIS - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_ENGINE_GUARD_TIMEOUT_MILLIS - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_GLOBAL_NAME - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_JAVET_LOGGER - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_JS_RUNTIME_TYPE - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_MAX_DEPTH - Static variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The constant DEFAULT_MAX_DEPTH.
    +
    +
    DEFAULT_MESSAGE_FORMAT_JAVET_INSPECTOR - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    DEFAULT_POOL_DAEMON_CHECK_INTERVAL_MILLIS - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_POOL_IDLE_TIMEOUT_SECONDS - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_POOL_MIN_SIZE - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_POOL_SHUTDOWN_TIMEOUT_SECONDS - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    DEFAULT_RESET_ENGINE_TIMEOUT_SECONDS - Static variable in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    defaultBoolean - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default boolean.
    +
    +
    defaultByte - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default byte.
    +
    +
    defaultChar - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default char.
    +
    +
    defaultDouble - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default double.
    +
    +
    defaultFloat - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default float.
    +
    +
    defaultInt - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default int.
    +
    +
    defaultLong - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default long.
    +
    +
    defaultShort - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Default short.
    +
    +
    delete(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    delete(IV8ValueObject, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    delete(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Delete boolean.
    +
    +
    delete(Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    delete(Object) - Method in class com.caoccao.javet.values.reference.V8ValueWeakMap
    +
     
    +
    delete(Object) - Method in class com.caoccao.javet.values.reference.V8ValueWeakSet
    +
     
    +
    deleteNull() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Delete null boolean.
    +
    +
    deletePrivateProperty(long, long, int, String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    deletePrivateProperty(IV8ValueObject, String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    deletePrivateProperty(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Delete private property boolean.
    +
    +
    deletePrivateProperty(String) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    deleteUndefined() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Delete undefined boolean.
    +
    +
    description - Variable in class com.caoccao.javet.entities.JavetEntitySymbol
    +
    +
    The Description.
    +
    +
    disableGCNotification() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Disable GC notification.
    +
    +
    disableInDebugMode() - Method in interface com.caoccao.javet.interop.engine.IJavetEngineGuard
    +
    +
    Disable in debug mode.
    +
    +
    disableInDebugMode() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    DUMMY_FUNCTION_STRING - Static variable in class com.caoccao.javet.interop.converters.JavetProxyConverter
    +
    +
    The constant DUMMY_FUNCTION_STRING.
    +
    +
    DynamicProxyV8ValueFunctionInvocationHandler - Class in com.caoccao.javet.interop.proxy
    +
    +
    The type Dynamic proxy V8 value function invocation handler.
    +
    +
    DynamicProxyV8ValueFunctionInvocationHandler(V8ValueFunction) - Constructor for class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueFunctionInvocationHandler
    +
    +
    Instantiates a new Dynamic proxy V8 value function invocation handler.
    +
    +
    DynamicProxyV8ValueObjectInvocationHandler - Class in com.caoccao.javet.interop.proxy
    +
    +
    The type Dynamic proxy V8 value object invocation handler.
    +
    +
    DynamicProxyV8ValueObjectInvocationHandler(V8ValueObject) - Constructor for class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueObjectInvocationHandler
    +
    +
    Instantiates a new Dynamic proxy V8 value object invocation handler.
    +
    +
    + + + +

    E

    +
    +
    echo(V8Value) - Method in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
    +
    Echo the given V8 value.
    +
    +
    echo(V8Value...) - Method in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
    +
    Echo the given V8 value array.
    +
    +
    echoString(String) - Method in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
    +
    Echo string from input string.
    +
    +
    echoString(V8Value) - Method in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
    +
    Echo string from input V8 value.
    +
    +
    echoString(V8Value...) - Method in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
    +
    Echo string from the given V8 value array.
    +
    +
    EIGHT_BYTES_PER_VALUE - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant EIGHT_BYTES_PER_VALUE.
    +
    +
    EMPTY - Static variable in class com.caoccao.javet.utils.V8ValueUtils
    +
    +
    The constant EMPTY.
    +
    +
    enableGCNotification() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Enable GC notification.
    +
    +
    enableInDebugMode() - Method in interface com.caoccao.javet.interop.engine.IJavetEngineGuard
    +
    +
    Enable in debug mode.
    +
    +
    enableInDebugMode() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    engineUsedCount - Variable in class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    equals(long, long, long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    equals(IV8ValueReference, IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    equals(V8Value) - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Equals.
    +
    +
    equals(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    equals(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    equals(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    equals(V8Value) - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    equals(V8Value) - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    error - Variable in exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    error - Variable in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    The Error.
    +
    +
    error(String) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Error.
    +
    +
    error(String, Throwable) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Error.
    +
    +
    error(String) - Method in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    error(String, Throwable) - Method in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    Errored - Static variable in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    evaluate() - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    evaluate(boolean) - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    evaluate(boolean) - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    Evaluated - Static variable in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    Evaluating - Static variable in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR.
    +
    +
    EXECUTABLE_INDEX_FROM_MAP - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant EXECUTABLE_INDEX_FROM_MAP.
    +
    +
    EXECUTABLE_INDEX_TO_MAP - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant EXECUTABLE_INDEX_TO_MAP.
    +
    +
    execute(boolean) - Method in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    execute(boolean) - Method in class com.caoccao.javet.interop.executors.V8StringExecutor
    +
     
    +
    execute() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute t.
    +
    +
    execute(boolean) - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute t.
    +
    +
    execute(long, String, boolean, String, int, int, int, boolean, boolean) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    execute(V8Runtime, Object, List<E>, JavetVirtualObject[]) - Static method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Execute.
    +
    +
    execute() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.ScoredExecutable
    +
    +
    Execute.
    +
    +
    execute(String, V8ScriptOrigin, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    execute(boolean) - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    execute(boolean) - Method in class com.caoccao.javet.values.reference.V8Script
    +
     
    +
    executeBoolean() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute boolean boolean.
    +
    +
    executeDouble() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute double double.
    +
    +
    executeInteger() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute integer integer.
    +
    +
    executeLong() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute long long.
    +
    +
    executeObject() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute object t.
    +
    +
    executePrimitive() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute primitive r.
    +
    +
    executeString() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute string string.
    +
    +
    executeVoid() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute void.
    +
    +
    executeZonedDateTime() - Method in interface com.caoccao.javet.interop.IV8Executable
    +
    +
    Execute zoned date time zoned date time.
    +
    +
    ExecutionFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    ExecutionTerminated - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    externalLock - Variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The External lock.
    +
    +
    extractFunctionSourceCode - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Extract function source code.
    +
    +
    + + + +

    F

    +
    +
    FailedToReadPath - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    fieldMap - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Field map.
    +
    +
    flushProtocolNotifications() - Method in interface com.caoccao.javet.interop.IV8InspectorListener
    +
     
    +
    flushProtocolNotifications() - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    forEach(IJavetUniConsumer<Key, E>) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    For each.
    +
    +
    forEach(IJavetUniIndexedConsumer<Key, E>) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    For each.
    +
    +
    forEach(IJavetBiConsumer<Key, Value, E>) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    For each.
    +
    +
    forEach(IJavetBiIndexedConsumer<Key, Value, E>) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    For each.
    +
    +
    forEach(IJavetUniConsumer<Value, E>) - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    forEach(IJavetUniIndexedConsumer<Value, E>) - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    forEach(IJavetUniConsumer<Key, E>) - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    forEach(IJavetUniIndexedConsumer<Key, E>) - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    forEach(IJavetBiConsumer<Key, Value, E>) - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    forEach(IJavetBiIndexedConsumer<Key, Value, E>) - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    forEach(IJavetUniConsumer<Key, E>) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    forEach(IJavetUniIndexedConsumer<Key, E>) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    forEach(IJavetBiConsumer<Key, Value, E>) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    forEach(IJavetBiIndexedConsumer<Key, Value, E>) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    forEach(IJavetUniConsumer<Key, E>) - Method in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    forEach(IJavetUniIndexedConsumer<Key, E>) - Method in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    format - Variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    format(String, Map<String, Object>) - Static method in class com.caoccao.javet.utils.SimpleFreeMarkerFormat
    +
     
    +
    FOUR_BYTES_PER_VALUE - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant FOUR_BYTES_PER_VALUE.
    +
    +
    fromBytes(byte[]) - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    fromBytes(byte[]) - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    From byte array.
    +
    +
    fromDoubles(double[]) - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    fromDoubles(double[]) - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    From double array.
    +
    +
    fromFloats(float[]) - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    fromFloats(float[]) - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    From float array.
    +
    +
    fromIntegers(int[]) - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    fromIntegers(int[]) - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    From integer array.
    +
    +
    fromLongs(long[]) - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    fromLongs(long[]) - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    From long array.
    +
    +
    fromShorts(short[]) - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    fromShorts(short[]) - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    From short array.
    +
    +
    FUNCTION_ADD - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    FUNCTION_ALL - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    FUNCTION_ALL_SETTLED - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    FUNCTION_ANY - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    FUNCTION_ASSIGN - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInObject
    +
    +
    The constant FUNCTION_ASSIGN.
    +
    +
    FUNCTION_CHDIR - Static variable in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    FUNCTION_CREATE_REQUIRE - Static variable in class com.caoccao.javet.node.modules.NodeModuleModule
    +
     
    +
    FUNCTION_CWD - Static variable in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    FUNCTION_DELETE - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    FUNCTION_ENTRIES - Static variable in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    FUNCTION_ENTRIES - Static variable in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    FUNCTION_FOR - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    FUNCTION_GET - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    FUNCTION_GET_BIG_INT_64 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_GET_FLOAT_32 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_GET_FLOAT_64 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_GET_INT_16 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_GET_INT_32 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_GET_INT_8 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_GET_OWN_PROPERTY_SYMBOLS - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInObject
    +
    +
    The constant FUNCTION_GET_OWN_PROPERTY_SYMBOLS.
    +
    +
    FUNCTION_HAS - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    FUNCTION_KEY_FOR - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    FUNCTION_KEYS - Static variable in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    FUNCTION_KEYS - Static variable in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    FUNCTION_KEYS - Static variable in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    FUNCTION_NEXT - Static variable in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    FUNCTION_NEXT - Static variable in class com.caoccao.javet.values.reference.V8ValueIterator
    +
     
    +
    FUNCTION_ON - Static variable in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    FUNCTION_POP - Static variable in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    FUNCTION_PUSH - Static variable in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    FUNCTION_RACE - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    FUNCTION_REJECT - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    FUNCTION_REQUIRE - Static variable in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    FUNCTION_RESOLVE - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    FUNCTION_SET - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    FUNCTION_SET_BIG_INT_64 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_SET_FLOAT_32 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_SET_FLOAT_64 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_SET_INT_16 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_SET_INT_32 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_SET_INT_8 - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    FUNCTION_STRINGIFY - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInJson
    +
     
    +
    FUNCTION_TO_STRING - Static variable in class com.caoccao.javet.values.reference.V8ValueSymbol
    +
    +
    The constant FUNCTION_TO_STRING.
    +
    +
    FUNCTION_VALUE_OF - Static variable in class com.caoccao.javet.values.reference.V8ValueSymbolObject
    +
    +
    The constant FUNCTION_VALUE_OF.
    +
    +
    FUNCTION_VALUES - Static variable in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    functionMap - Variable in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    The Function map.
    +
    +
    future - Variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The Future.
    +
    +
    + + + +

    G

    +
    +
    gcScheduled - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    genericGetters - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Generic getters.
    +
    +
    genericSetters - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Generic setters.
    +
    +
    get() - Method in interface com.caoccao.javet.interfaces.IJavetSupplier
    +
     
    +
    get(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    get(V8Value, V8Value, V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Get by property.
    +
    +
    get(V8Value, V8Value, V8Value) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
     
    +
    get(IV8ValueObject, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    get(int) - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    get(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Get t.
    +
    +
    get(int) - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    get(Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    get(String) - Method in class com.caoccao.javet.values.reference.V8ValueWeakMap
    +
     
    +
    get(Object) - Method in class com.caoccao.javet.values.reference.V8ValueWeakMap
    +
     
    +
    get() - Method in class com.caoccao.javet.values.virtual.V8VirtualValue
    +
    +
    Get the value.
    +
    +
    get() - Method in class com.caoccao.javet.values.virtual.V8VirtualValueList
    +
    +
    Get V8 value array.
    +
    +
    getActiveEngineCount() - Method in interface com.caoccao.javet.interop.engine.IJavetEnginePool
    +
     
    +
    getActiveEngineCount() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    getAsyncIterator() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getBigInt64(int) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getBigInt64(int, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getBindingContext(Class<?>) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getBindingContextWeakHashMap() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getBoolean(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets boolean.
    +
    +
    getBuffer() - Method in interface com.caoccao.javet.values.reference.IV8ValueTypedArray
    +
     
    +
    getBuffer() - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getBuffer() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
     
    +
    getBuiltInJson() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    getBuiltInObject() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    getBuiltInPromise() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    getBuiltInSymbol(String) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getBuiltInSymbol() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    getByteBuffer() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    getByteLength() - Method in interface com.caoccao.javet.values.reference.IV8ValueTypedArray
    +
     
    +
    getByteLength() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    getByteLength() - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getByteLength() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
     
    +
    getByteOffset() - Method in interface com.caoccao.javet.values.reference.IV8ValueTypedArray
    +
     
    +
    getByteOffset() - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getByteOffset() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
     
    +
    getByteOrder() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    getCallbackContext() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.JavetUniversalInterceptor
    +
    +
    Gets callback context.
    +
    +
    getCallbackContext(long) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getCallbackContextCount() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getCallbackMethod() - Method in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Gets callback method.
    +
    +
    getCallbackReceiver() - Method in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Gets callback receiver.
    +
    +
    getCode() - Method in enum com.caoccao.javet.enums.JavetPromiseRejectEvent
    +
    +
    Gets event code.
    +
    +
    getCode() - Method in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    getConfig() - Method in interface com.caoccao.javet.interop.converters.IJavetConverter
    +
    +
    Gets config.
    +
    +
    getConfig() - Method in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
     
    +
    getConfig() - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    getConfig() - Method in interface com.caoccao.javet.interop.engine.IJavetEnginePool
    +
     
    +
    getConfig() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    getConfig() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    getConverter() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getCPUCount() - Static method in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    getDebug() - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Gets debug.
    +
    +
    getDefaultBoolean() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default boolean boolean.
    +
    +
    getDefaultByte() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default byte.
    +
    +
    getDefaultChar() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default char.
    +
    +
    getDefaultDouble() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default double.
    +
    +
    getDefaultEngineGuardTimeoutMillis() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getDefaultFloat() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default float.
    +
    +
    getDefaultInt() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default int.
    +
    +
    getDefaultLong() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default long.
    +
    +
    getDefaultShort() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets default short.
    +
    +
    getDescription() - Method in class com.caoccao.javet.entities.JavetEntitySymbol
    +
    +
    Gets description.
    +
    +
    getDescription() - Method in class com.caoccao.javet.values.reference.V8ValueSymbol
    +
    +
    Gets description.
    +
    +
    getDouble(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets double.
    +
    +
    getEndColumn() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getEndPosition() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getEngine() - Method in interface com.caoccao.javet.interop.engine.IJavetEnginePool
    +
     
    +
    getEngine() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    getEngineGuardCheckIntervalMillis() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getEngineUsedCount() - Method in class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    getEntries() - Method in interface com.caoccao.javet.values.reference.IV8ValueMap
    +
     
    +
    getEntries() - Method in interface com.caoccao.javet.values.reference.IV8ValueSet
    +
     
    +
    getEntries() - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    getEntries() - Method in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    getError() - Method in exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    getError() - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Gets error.
    +
    +
    getException() - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    getException() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    getExecutor(File) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getExecutor(Path) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getExecutor(String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getExecutorService() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getFlags() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets flags.
    +
    +
    getFloat(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets float.
    +
    +
    getFloat32(int) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getFloat32(int, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getFloat64(int) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getFloat64(int, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getFormat() - Method in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    getFunctionMap() - Method in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Gets function map.
    +
    +
    getGetterPrefixLength(Method) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Gets getter prefix length.
    +
    +
    getGlobalName() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getGlobalName() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getGlobalObject(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getGlobalObject() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getGuard() - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    getGuard(long) - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    getGuard() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    getGuard(long) - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    getHandle() - Method in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Gets handle.
    +
    +
    getHandle() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getHandle() - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    getHandle() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    getHandler() - Method in interface com.caoccao.javet.values.reference.IV8ValueProxy
    +
    +
    Gets handler.
    +
    +
    getHandler() - Method in class com.caoccao.javet.values.reference.V8ValueProxy
    +
     
    +
    getHasInstance() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getId() - Method in enum com.caoccao.javet.enums.JSFunctionType
    +
     
    +
    getId() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    getId() - Method in enum com.caoccao.javet.enums.V8ValueReferenceType
    +
     
    +
    getIdentityHash(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getIdentityHash(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getIdentityHash() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Returns the identity hash for this object.
    +
    +
    getIdentityHash() - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getIdleEngineCount() - Method in interface com.caoccao.javet.interop.engine.IJavetEnginePool
    +
     
    +
    getIdleEngineCount() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    getInfo() - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Gets info.
    +
    +
    getInstance(JSRuntimeType) - Static method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets instance by JS runtime type.
    +
    +
    getInt16(int) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getInt16(int, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getInt32(int) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getInt32(int, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getInt8(int) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getInteger(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets integer.
    +
    +
    getInternalProperties(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getInternalProperties(IV8ValueFunction) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getInternalProperties() - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Gets internal properties.
    +
    +
    getInternalProperties() - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    getInternalStatistic() - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getInternalStatistic() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Get internal statistic internal for test purpose.
    +
    +
    getIsConcatSpreadable() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getIterator() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getJavetLogger() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getJavetVersion() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets javet version.
    +
    +
    getJSFunctionType() - Method in class com.caoccao.javet.entities.JavetEntityFunction
    +
     
    +
    getJSFunctionType() - Method in interface com.caoccao.javet.interfaces.IJavetEntityFunction
    +
    +
    Gets JS function type.
    +
    +
    getJSFunctionType(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getJSFunctionType(IV8ValueFunction) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getJSFunctionType() - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Gets JS function type.
    +
    +
    getJSFunctionType() - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    getJSMethodName() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.JavetUniversalInterceptor
    +
    +
    Gets JS method name.
    +
    +
    getJSRuntimeType() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getJSRuntimeType() - Method in class com.caoccao.javet.interop.JavetLibLoader
    +
     
    +
    getJSRuntimeType() - Method in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    getJSRuntimeType() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets JS runtime type.
    +
    +
    getJSRuntimeType() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getJSScopeType(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getJSScopeType(IV8ValueFunction) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getJSScopeType() - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Gets JS scope type.
    +
    +
    getJSScopeType() - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    getKeys() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    getKeys() - Method in interface com.caoccao.javet.values.reference.IV8ValueKeyContainer
    +
     
    +
    getKeys() - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    getKeys() - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    getKeys() - Method in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    getLastActiveZonedDatetime() - Method in class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    getLastException() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets last exception.
    +
    +
    getLength(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getLength(IV8ValueArray) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getLength(IV8ValueTypedArray) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getLength() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    getLength() - Method in interface com.caoccao.javet.values.reference.IV8ValueTypedArray
    +
     
    +
    getLength() - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    getLength() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
     
    +
    getLineNumber() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getLog() - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Gets log.
    +
    +
    getLogger() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets logger.
    +
    +
    getLogger() - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    getLogger() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getLogger() - Method in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    getLong(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets long.
    +
    +
    getMatch() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getMatchAll() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getMaxDepth() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Gets max depth.
    +
    +
    getMemoryUsageThresholdRatio() - Static method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets memory usage threshold ratio.
    +
    +
    getMessage(Map<String, Object>) - Method in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    getMessage() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getMessage() - Method in class com.caoccao.javet.values.reference.V8ValueError
    +
     
    +
    getMethod() - Method in class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    Gets method.
    +
    +
    getMethod(String) - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
    +
    Gets method that does not take any arguments by method name.
    +
    +
    getMethod(String, int) - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
    +
    Gets method.
    +
    +
    getMethod(String, boolean) - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
    +
    Gets method.
    +
    +
    getMethod(String, boolean, int) - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
    +
    Gets method that takes given number of arguments by method name.
    +
    +
    getMethod(String, Class<?>...) - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
    +
    Gets method that is customized to given argument types by method name.
    +
    +
    getMethods() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.JavetUniversalInterceptor
    +
    +
    Gets methods.
    +
    +
    getMethodVarargs(String) - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
    +
    Gets method that takes an arbitrary number of arguments by method name.
    +
    +
    getMethodVarargs(String, boolean) - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
    +
    Gets method that takes an arbitrary number of arguments by method name.
    +
    +
    getModuleObject() - Method in class com.caoccao.javet.node.modules.BaseNodeModule
    +
     
    +
    getModuleObject() - Method in interface com.caoccao.javet.node.modules.INodeModule
    +
     
    +
    getName() - Method in enum com.caoccao.javet.enums.JavetPromiseRejectEvent
    +
    +
    Gets event name.
    +
    +
    getName() - Method in enum com.caoccao.javet.enums.JSFunctionType
    +
     
    +
    getName() - Method in enum com.caoccao.javet.enums.JSRuntimeType
    +
     
    +
    getName() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    getName() - Method in enum com.caoccao.javet.enums.V8ValueReferenceType
    +
     
    +
    getName() - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    getName() - Method in class com.caoccao.javet.node.modules.BaseNodeModule
    +
     
    +
    getName() - Method in interface com.caoccao.javet.node.modules.INodeModule
    +
     
    +
    getName() - Method in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    getNamespace() - Method in class com.caoccao.javet.values.reference.V8Module
    +
    +
    Gets namespace.
    +
    +
    getNext() - Method in interface com.caoccao.javet.values.reference.IV8ValueIterator
    +
    +
    Gets next.
    +
    +
    getNext() - Method in class com.caoccao.javet.values.reference.V8ValueIterator
    +
     
    +
    getNodeInstance() - Static method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets Node instance.
    +
    +
    getNodeModule(Class<Module>) - Method in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    getNodeModule(String, Class<NM>) - Method in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    getNodeModuleCount() - Method in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    getNull(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets null.
    +
    +
    getObject() - Method in class com.caoccao.javet.utils.JavetVirtualObject
    +
    +
    Gets object.
    +
    +
    getObject(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets object.
    +
    +
    getOwnPropertyNames(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getOwnPropertyNames(IV8ValueObject) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getOwnPropertyNames() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets own property names.
    +
    +
    getOwnPropertyNames() - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getOwnPropertySymbols(IV8ValueObject) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInObject
    +
    +
    Gets own property symbols.
    +
    +
    getParameters() - Method in exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    getPoolDaemonCheckIntervalMillis() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getPoolIdleTimeoutSeconds() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getPoolMaxSize() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getPoolMinSize() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getPoolShutdownTimeoutSeconds() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getPrimitive(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets primitive.
    +
    +
    getPrivateProperty(long, long, int, String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getPrivateProperty(IV8ValueObject, String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getPrivateProperty(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property.
    +
    +
    getPrivateProperty(String) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getPrivatePropertyBoolean(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property boolean.
    +
    +
    getPrivatePropertyDouble(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property double.
    +
    +
    getPrivatePropertyFloat(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property float.
    +
    +
    getPrivatePropertyInteger(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property integer.
    +
    +
    getPrivatePropertyLong(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property long.
    +
    +
    getPrivatePropertyNull(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property null.
    +
    +
    getPrivatePropertyObject(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property object.
    +
    +
    getPrivatePropertyPrimitive(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property primitive.
    +
    +
    getPrivatePropertyString(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property string.
    +
    +
    getPrivatePropertyUndefined(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property undefined.
    +
    +
    getPrivatePropertyZonedDateTime(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets private property zoned date time.
    +
    +
    getPromise() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets promise.
    +
    +
    getPromise() - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    getPromiseRejectCallback() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getProperty(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getProperty(IV8ValueObject, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getProperty(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property.
    +
    +
    getProperty(Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getPropertyBoolean(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property boolean.
    +
    +
    getPropertyDouble(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property double.
    +
    +
    getPropertyFloat(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property float.
    +
    +
    getPropertyGetterMap() - Method in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Gets property getter map.
    +
    +
    getPropertyInteger(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property integer.
    +
    +
    getPropertyLong(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property long.
    +
    +
    getPropertyNames(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getPropertyNames(IV8ValueObject) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getPropertyNames() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property names.
    +
    +
    getPropertyNames() - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getPropertyObject(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property object.
    +
    +
    getPropertyPrimitive(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property primitive.
    +
    +
    getPropertySetterMap() - Method in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Gets property setter map.
    +
    +
    getPropertyString(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property string.
    +
    +
    getPropertyZonedDateTime(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets property zoned date time.
    +
    +
    getPrototype(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getPrototype(IV8ValueObject) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getPrototype() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets prototype.
    +
    +
    getPrototype() - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getPrototypeOf(V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Gets prototype of.
    +
    +
    getReferenceCount() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getReplace() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getResetEngineTimeoutSeconds() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    getResourceColumnOffset() - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    getResourceFileName() - Method in class com.caoccao.javet.interop.JavetLibLoader
    +
     
    +
    getResourceLineOffset() - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    getResourceName() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getResourceName() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    getResourceName() - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    getResourceName() - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    getResourceName() - Method in interface com.caoccao.javet.values.reference.IV8Script
    +
     
    +
    getResourceName() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    getResourceName() - Method in class com.caoccao.javet.values.reference.V8Script
    +
     
    +
    getResult() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result.
    +
    +
    getResult() - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    getResultBoolean() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result boolean.
    +
    +
    getResultDouble() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result double.
    +
    +
    getResultInteger() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result integer.
    +
    +
    getResultLong() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result long.
    +
    +
    getResultObject(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result object.
    +
    +
    getResultPrimitive() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result primitive.
    +
    +
    getResultString() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result string.
    +
    +
    getResultZonedDateTime() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets result zoned date time.
    +
    +
    getScore() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.ScoredExecutable
    +
    +
    Gets score.
    +
    +
    getScriptId() - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    getScriptId() - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
    +
    Gets script id.
    +
    +
    getScriptId() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    getScriptingError() - Method in exception com.caoccao.javet.exceptions.BaseJavetScriptingException
    +
     
    +
    getScriptPath() - Method in class com.caoccao.javet.interop.executors.V8PathExecutor
    +
     
    +
    getScriptString() - Method in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    getScriptString() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    getScriptString() - Method in class com.caoccao.javet.interop.executors.V8PathExecutor
    +
     
    +
    getScriptString() - Method in class com.caoccao.javet.interop.executors.V8StringExecutor
    +
     
    +
    getSearch() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getSetterPrefixLength(Method) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Gets setter prefix length.
    +
    +
    getSize(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getSize(IV8ValueKeyContainer) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getSize() - Method in interface com.caoccao.javet.values.reference.IV8ValueKeyContainer
    +
     
    +
    getSize() - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    getSize() - Method in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    getSizeInBytes() - Method in interface com.caoccao.javet.values.reference.IV8ValueTypedArray
    +
     
    +
    getSizeInBytes() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
     
    +
    getSourceCode() - Method in class com.caoccao.javet.entities.JavetEntityFunction
    +
     
    +
    getSourceCode() - Method in interface com.caoccao.javet.interfaces.IJavetEntityFunction
    +
    +
    Gets source code.
    +
    +
    getSourceCode(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getSourceCode(IV8ValueFunction) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getSourceCode() - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Gets source code.
    +
    +
    getSourceCode() - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    getSourceLine() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getSpecies() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getSplit() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getStack() - Method in class com.caoccao.javet.values.reference.V8ValueError
    +
     
    +
    getStartColumn() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getStartPosition() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    getState() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Gets state.
    +
    +
    getState() - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    getStatus() - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    getStatus() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    getString(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets string.
    +
    +
    getSymbolType() - Method in class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    Gets symbol type.
    +
    +
    getTarget() - Method in interface com.caoccao.javet.values.reference.IV8ValueProxy
    +
    +
    Gets target.
    +
    +
    getTarget() - Method in class com.caoccao.javet.values.reference.V8ValueProxy
    +
     
    +
    getTargetObject() - Method in class com.caoccao.javet.interop.proxy.BaseJavetProxyHandler
    +
     
    +
    getTargetObject() - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Gets target object.
    +
    +
    getTargetObject() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.JavetUniversalInterceptor
    +
    +
    Gets target object.
    +
    +
    GETTER_PREFIX_ARRAY - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant GETTER_PREFIX_ARRAY.
    +
    +
    gettersMap - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Getters map.
    +
    +
    getTimeoutMillis() - Method in interface com.caoccao.javet.interop.engine.IJavetEngineGuard
    +
    +
    Gets timeout millis.
    +
    +
    getTimeoutMillis() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    getToPrimitive() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getToStringTag() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getTrace() - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Gets trace.
    +
    +
    getType() - Method in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    getType() - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8Script
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueArguments
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueError
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueIterator
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueProxy
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueRegExp
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueSet
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueSharedArrayBuffer
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueSymbol
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueSymbolObject
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueWeakMap
    +
     
    +
    getType() - Method in class com.caoccao.javet.values.reference.V8ValueWeakSet
    +
     
    +
    getUndefined(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets undefined.
    +
    +
    getUnscopables() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    getUsage() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    getUTCNow() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
    +
    Gets utc now.
    +
    +
    getUTCNow() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    Gets utc now.
    +
    +
    getUTCNow() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    Gets utc now.
    +
    +
    getUTCNow() - Static method in class com.caoccao.javet.utils.JavetDateTimeUtils
    +
    +
    Gets utc now.
    +
    +
    getV8BindEnabler() - Method in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Gets V8 bind enabler.
    +
    +
    getV8Inspector() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getV8Inspector(String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getV8Instance() - Static method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets V8 instance.
    +
    +
    getV8Locker() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getV8Module(String, IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getV8ModuleCount() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getV8ModuleResolver() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getV8Runtime() - Method in class com.caoccao.javet.interception.BaseJavetInterceptor
    +
     
    +
    getV8Runtime() - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    getV8Runtime() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    getV8Runtime() - Method in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    getV8Runtime() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    getV8Runtime() - Method in class com.caoccao.javet.interop.proxy.BaseJavetProxyHandler
    +
    +
    Gets V8 runtime.
    +
    +
    getV8Runtime() - Method in interface com.caoccao.javet.utils.receivers.IJavetCallbackReceiver
    +
     
    +
    getV8Runtime() - Method in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
     
    +
    getV8Runtime() - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Gets V8 runtime.
    +
    +
    getV8Runtime() - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    getV8RuntimeCount() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Gets V8 runtime count.
    +
    +
    getV8RuntimeSetter() - Method in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Gets V8 runtime setter.
    +
    +
    getV8ScriptOrigin() - Method in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    getV8ScriptOrigin() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    getV8Value() - Method in class com.caoccao.javet.utils.JavetVirtualObject
    +
    +
    Gets V8 value.
    +
    +
    getValue() - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    getValues() - Method in interface com.caoccao.javet.values.reference.IV8ValueMap
    +
     
    +
    getValues() - Method in class com.caoccao.javet.values.reference.V8ValueMap
    +
     
    +
    getVersion() - Method in enum com.caoccao.javet.enums.JSRuntimeType
    +
     
    +
    getVersion() - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    getVersion() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    getVersion() - Method in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    getWarn() - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Gets warn.
    +
    +
    getWorkingDirectory() - Method in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    getZonedDateTime(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Gets zoned date time.
    +
    +
    GLOBAL_THIS - Static variable in class com.caoccao.javet.interop.V8Host
    +
    +
    The constant GLOBAL_THIS.
    +
    +
    globalName - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    + + + +

    H

    +
    +
    handle - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    handle - Variable in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    handleNotification(Notification, Object) - Method in class com.caoccao.javet.interop.V8Notifier
    +
     
    +
    has(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    has(V8Value, V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Has property
    +
    +
    has(V8Value, V8Value) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
     
    +
    has(IV8ValueObject, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    has(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Has object property key.
    +
    +
    has(Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    has(Object) - Method in class com.caoccao.javet.values.reference.V8ValueWeakMap
    +
     
    +
    has(Object) - Method in class com.caoccao.javet.values.reference.V8ValueWeakSet
    +
     
    +
    hasConstructors() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Has constructors.
    +
    +
    hasHandler() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Has handler.
    +
    +
    hasHandler() - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    hasNull() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Has null property key.
    +
    +
    hasOwnProperty(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    hasOwnProperty(IV8ValueObject, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    hasOwnProperty(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Has own property key.
    +
    +
    hasOwnProperty(Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    hasPrivateProperty(long, long, int, String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    hasPrivateProperty(IV8ValueObject, String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    hasPrivateProperty(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Has private property boolean.
    +
    +
    hasPrivateProperty(String) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    hasUndefined() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Has undefined property key.
    +
    +
    + + + +

    I

    +
    +
    idleEngineList - Variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The Idle engine list.
    +
    +
    idleNotificationDeadline(long, long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    idleNotificationDeadline(long) - Method in class com.caoccao.javet.interop.V8Runtime
    +
    +
    Idle notification deadline.
    +
    +
    IJavetBiConsumer<T1 extends V8Value,T2 extends V8Value,E extends java.lang.Throwable> - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet bi-consumer.
    +
    +
    IJavetBiIndexedConsumer<T1 extends V8Value,T2 extends V8Value,E extends java.lang.Throwable> - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet bi-indexed consumer.
    +
    +
    IJavetCallbackReceiver - Interface in com.caoccao.javet.utils.receivers
    +
    +
    The interface Javet callback receiver.
    +
    +
    IJavetClosable - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet closable.
    +
    +
    IJavetConverter - Interface in com.caoccao.javet.interop.converters
    +
    +
    The interface Javet converter.
    +
    +
    IJavetEngine<R extends V8Runtime> - Interface in com.caoccao.javet.interop.engine
    +
     
    +
    iJavetEngine - Variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The Javet engine.
    +
    +
    IJavetEngineGuard - Interface in com.caoccao.javet.interop.engine
    +
    +
    The interface Javet engine guard is the one guarding the script execution with a timeout.
    +
    +
    IJavetEnginePool<R extends V8Runtime> - Interface in com.caoccao.javet.interop.engine
    +
     
    +
    iJavetEnginePool - Variable in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    IJavetEntityFunction - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet entity function.
    +
    +
    IJavetEntityMap - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet entity map.
    +
    +
    IJavetInterceptor - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet interceptor.
    +
    +
    IJavetLogger - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet logger.
    +
    +
    IJavetPromiseRejectCallback - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet promise reject callback.
    +
    +
    IJavetProxyHandler<T> - Interface in com.caoccao.javet.interop.proxy
    +
    +
    The interface Javet proxy handler.
    +
    +
    IJavetResettable - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet resettable.
    +
    +
    IJavetSupplier<T,E extends java.lang.Throwable> - Interface in com.caoccao.javet.interfaces
    +
     
    +
    IJavetUniConsumer<T extends V8Value,E extends java.lang.Throwable> - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet uni consumer.
    +
    +
    IJavetUniIndexedConsumer<T extends V8Value,E extends java.lang.Throwable> - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface Javet uni indexed consumer.
    +
    +
    increaseUsedCount() - Method in class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    info - Variable in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    The Info.
    +
    +
    info(String) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Info.
    +
    +
    info(String) - Method in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    initialize() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Initialize.
    +
    +
    initializeFieldsAndMethods(Class, boolean) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Initialize fields and methods.
    +
    +
    initializeV8ValueCache() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    INodeModule - Interface in com.caoccao.javet.node.modules
    +
     
    +
    INodeNative - Interface in com.caoccao.javet.interop
    +
     
    +
    instantiate() - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    instantiate() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    Instantiated - Static variable in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    Instantiating - Static variable in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    INVALID_HANDLE - Static variable in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    The constant INVALID_HANDLE.
    +
    +
    INVALID_HANDLE - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    INVALID_HANDLE - Static variable in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    invoke(long, long, int, String, boolean, Object[]) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    invoke(Object, Method, Object[]) - Method in class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueFunctionInvocationHandler
    +
     
    +
    invoke(Object, Method, Object[]) - Method in class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueObjectInvocationHandler
    +
     
    +
    invoke(V8Value...) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.JavetUniversalInterceptor
    +
    +
    Invoke.
    +
    +
    invoke(IV8ValueObject, String, boolean, V8Value...) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    invoke(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return V8 value by name and objects as arguments.
    +
    +
    invoke(String, V8Value...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return V8 value by name and V8 values as arguments.
    +
    +
    invokeBoolean(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value boolean by name and objects as arguments.
    +
    +
    invokeDouble(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value double by name and objects as arguments.
    +
    +
    invokeExtended(String, boolean, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
    +
    +
    invokeExtended(String, boolean, V8Value...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke extended and return V8 value which must be consumed, + otherwise memory leak may occur.
    +
    +
    invokeExtended(String, boolean, Object...) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    invokeExtended(String, boolean, V8Value...) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    invokeFloat(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value float by name and objects as arguments.
    +
    +
    invokeInteger(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value integer by name and objects as arguments.
    +
    +
    invokeLong(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value long by name and objects as arguments.
    +
    +
    invokeObject(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value object by name and objects as arguments.
    +
    +
    invokePrimitive(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value primitive by name and objects as arguments.
    +
    +
    invokeString(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function with return value string by name and objects as arguments.
    +
    +
    invokeVoid(String, Object...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function without return value by name and objects as arguments.
    +
    +
    invokeVoid(String, V8Value...) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Invoke function without return value by name and V8 values as arguments.
    +
    +
    IS_IN_DEBUG_MODE - Static variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The constant IS_IN_DEBUG_MODE.
    +
    +
    IS_LINUX - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    IS_MACOS - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    IS_WINDOWS - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    isActive() - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    isActive() - Method in interface com.caoccao.javet.interop.engine.IJavetEnginePool
    +
     
    +
    isActive() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    isActive() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    isAllowEval() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    isAllowNativesSyntax() - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    isAPI() - Method in enum com.caoccao.javet.enums.JSFunctionType
    +
     
    +
    isAutoSendGCNotification() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    isBlock() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    isCatch() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    isClass() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    isClassMode(Class) - Static method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Is class mode.
    +
    +
    isClassMode() - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Is class mode.
    +
    +
    isClosed() - Method in interface com.caoccao.javet.interfaces.IJavetClosable
    +
    +
    Is closed.
    +
    +
    isClosed() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueFunctionInvocationHandler
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.interop.proxy.DynamicProxyV8ValueObjectInvocationHandler
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.interop.V8Locker
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.node.modules.BaseNodeModule
    +
     
    +
    isClosed(Object) - Static method in class com.caoccao.javet.utils.JavetResourceUtils
    +
    +
    Is closed.
    +
    +
    isClosed() - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.values.virtual.V8VirtualValue
    +
     
    +
    isClosed() - Method in class com.caoccao.javet.values.virtual.V8VirtualValueList
    +
     
    +
    isContinuable() - Method in exception com.caoccao.javet.exceptions.JavetTerminatedException
    +
     
    +
    isConverted() - Method in class com.caoccao.javet.utils.JavetVirtualObject
    +
    +
    Is converted.
    +
    +
    isDead(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    isDead() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    isEmpty() - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    isEval() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    isExposeGC() - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    isExposeInspectorScripts() - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    isExtensible(V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Is extensible.
    +
    +
    isExtractFunctionSourceCode() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Is extract function source code boolean.
    +
    +
    isFinite() - Method in class com.caoccao.javet.values.primitive.V8ValueDouble
    +
     
    +
    isFulfilled() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Is fulfilled.
    +
    +
    isFunction() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    isGcBeforeEngineClose() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    isGCScheduled() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    isGenericGetter(Method) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Is generic getter boolean.
    +
    +
    isGenericSetter(Method) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Is generic setter boolean.
    +
    +
    isInfinite() - Method in class com.caoccao.javet.values.primitive.V8ValueDouble
    +
     
    +
    isInUse(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    isInUse() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    isIsolateCreated() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Is isolate created.
    +
    +
    isLibraryLoaded() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Is library loaded.
    +
    +
    isLibraryReloadable() - Static method in class com.caoccao.javet.interop.V8Host
    +
    +
    Determines whether the JNI library is reloadable or not.
    +
    +
    isLoaded() - Method in class com.caoccao.javet.interop.JavetLibLoader
    +
     
    +
    isLocked() - Method in class com.caoccao.javet.interop.V8Locker
    +
    +
    Is locked.
    +
    +
    isModule() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    isModule() - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    isModule() - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    isNaN() - Method in class com.caoccao.javet.values.primitive.V8ValueDouble
    +
     
    +
    isNative() - Method in enum com.caoccao.javet.enums.JSFunctionType
    +
     
    +
    isNode() - Method in enum com.caoccao.javet.enums.JSRuntimeType
    +
     
    +
    isNull() - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Is null.
    +
    +
    isNullOrUndefined() - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Is null or undefined.
    +
    +
    isPending() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Is pending.
    +
    +
    isPooled() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    isPresent() - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    isProxyMapEnabled() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Is proxy map enabled.
    +
    +
    isProxySetEnabled() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Is proxy set enabled.
    +
    +
    isQuitting() - Method in interface com.caoccao.javet.interop.engine.IJavetEnginePool
    +
     
    +
    isQuitting() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    Is quitting boolean.
    +
    +
    isQuitting() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    isRejected() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Is rejected.
    +
    +
    isReturnResult() - Method in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Is return result.
    +
    +
    isRevoked() - Method in interface com.caoccao.javet.values.reference.IV8ValueProxy
    +
    +
    Is revoked.
    +
    +
    isRevoked() - Method in class com.caoccao.javet.values.reference.V8ValueProxy
    +
     
    +
    isScript() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    isSealed() - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    isSkipFunctionInObject() - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Is skip functions boolean.
    +
    +
    isTargetTypeMap - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Is target type map.
    +
    +
    isTargetTypeSet - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Is target type set.
    +
    +
    isThisObjectRequired() - Method in class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    Is this object required boolean.
    +
    +
    isThisObjectRequired() - Method in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Is this object required.
    +
    +
    isTrackRetainingPath() - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    isUndefined() - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Is undefined.
    +
    +
    isUserDefined() - Method in enum com.caoccao.javet.enums.JSFunctionType
    +
     
    +
    isUseStrict() - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    isV8() - Method in enum com.caoccao.javet.enums.JSRuntimeType
    +
     
    +
    isV8BindEnabled(String) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Is V8 bind enabled.
    +
    +
    isValid() - Method in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Is valid.
    +
    +
    isValid() - Method in interface com.caoccao.javet.values.reference.IV8ValueTypedArray
    +
     
    +
    isValid() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
     
    +
    isWasm() - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    isWeak(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    isWeak(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    isWeak() - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    isWeak(boolean) - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    isWeak() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    isWeak() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    isWeak(boolean) - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    isWith() - Method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    IV8Cloneable - Interface in com.caoccao.javet.interop
    +
     
    +
    IV8Convertible - Interface in com.caoccao.javet.interop
    +
    +
    The interface V8 convertible.
    +
    +
    IV8Creatable - Interface in com.caoccao.javet.interop
    +
     
    +
    IV8Executable - Interface in com.caoccao.javet.interop
    +
    +
    The interface V8 executable.
    +
    +
    IV8Executor - Interface in com.caoccao.javet.interop.executors
    +
     
    +
    IV8InspectorListener - Interface in com.caoccao.javet.interop
    +
     
    +
    IV8Module - Interface in com.caoccao.javet.values.reference
    +
     
    +
    IV8ModuleResolver - Interface in com.caoccao.javet.interfaces
    +
    +
    The interface V8 module resolver is for resolving V8 module look-up in dynamic import.
    +
    +
    IV8Native - Interface in com.caoccao.javet.interop
    +
     
    +
    IV8Script - Interface in com.caoccao.javet.values.reference
    +
     
    +
    IV8Value - Interface in com.caoccao.javet.values
    +
    +
    The interface V8 value.
    +
    +
    IV8ValueArray - Interface in com.caoccao.javet.values.reference
    +
     
    +
    IV8ValueFunction - Interface in com.caoccao.javet.values.reference
    +
    +
    The interface V8 value function.
    +
    +
    IV8ValueIterator<T extends V8Value> - Interface in com.caoccao.javet.values.reference
    +
    +
    The interface V8 value iterator.
    +
    +
    IV8ValueKeyContainer - Interface in com.caoccao.javet.values.reference
    +
     
    +
    IV8ValueMap - Interface in com.caoccao.javet.values.reference
    +
     
    +
    IV8ValueObject - Interface in com.caoccao.javet.values.reference
    +
    +
    The interface V8 value object.
    +
    +
    IV8ValuePromise - Interface in com.caoccao.javet.values.reference
    +
    +
    The interface V8 value promise is 2-sided.
    +
    +
    IV8ValueProxy - Interface in com.caoccao.javet.values.reference
    +
    +
    The interface V8 value proxy.
    +
    +
    IV8ValueReference - Interface in com.caoccao.javet.values.reference
    +
     
    +
    IV8ValueSet - Interface in com.caoccao.javet.values.reference
    +
     
    +
    IV8ValueTypedArray - Interface in com.caoccao.javet.values.reference
    +
     
    +
    + + + +

    J

    +
    +
    JAVA_CONSOLE_DEBUG - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JAVA_CONSOLE_DEBUG.
    +
    +
    JAVA_CONSOLE_ERROR - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JAVA_CONSOLE_ERROR.
    +
    +
    JAVA_CONSOLE_INFO - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JAVA_CONSOLE_INFO.
    +
    +
    JAVA_CONSOLE_LOG - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JAVA_CONSOLE_LOG.
    +
    +
    JAVA_CONSOLE_TRACE - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JAVA_CONSOLE_TRACE.
    +
    +
    JAVA_CONSOLE_WARN - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JAVA_CONSOLE_WARN.
    +
    +
    JAVET_DAEMON_THREAD_NAME - Static variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The constant JAVET_DAEMON_THREAD_NAME.
    +
    +
    JavetCallbackContext - Class in com.caoccao.javet.interop.callback
    +
    +
    The type Javet callback context.
    +
    +
    JavetCallbackContext(Object, Method) - Constructor for class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Instantiates a new Javet callback context.
    +
    +
    JavetCallbackContext(Object, Method, boolean) - Constructor for class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Instantiates a new Javet callback context.
    +
    +
    JavetCallbackReceiver - Class in com.caoccao.javet.utils.receivers
    +
    +
    The type Javet explicit callback receiver.
    +
    +
    JavetCallbackReceiver(V8Runtime) - Constructor for class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
    +
    Instantiates a new V8 callback receiver.
    +
    +
    JavetCompilationException - Exception in com.caoccao.javet.exceptions
    +
     
    +
    JavetCompilationException(String, String, String, int, int, int, int, int) - Constructor for exception com.caoccao.javet.exceptions.JavetCompilationException
    +
     
    +
    JavetConverterConfig<T extends JavetConverterConfig> - Class in com.caoccao.javet.interop.converters
    +
    +
    The type Javet converter config.
    +
    +
    JavetConverterConfig() - Constructor for class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Instantiates a new Javet converter config.
    +
    +
    JavetConverterException - Exception in com.caoccao.javet.exceptions
    +
    +
    The type Javet converter exception is for JNI.
    +
    +
    JavetConverterException(JavetError, Map<String, Object>) - Constructor for exception com.caoccao.javet.exceptions.JavetConverterException
    +
    +
    Instantiates a new Javet converter exception.
    +
    +
    JavetConverterException(String) - Constructor for exception com.caoccao.javet.exceptions.JavetConverterException
    +
    +
    Instantiates a new Javet converter exception.
    +
    +
    JavetDateTimeUtils - Class in com.caoccao.javet.utils
    +
    +
    The type Date time utils.
    +
    +
    JavetDefaultLogger - Class in com.caoccao.javet.utils
    +
     
    +
    JavetDefaultLogger(String) - Constructor for class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    JavetEngine<R extends V8Runtime> - Class in com.caoccao.javet.interop.engine
    +
     
    +
    JavetEngine(IJavetEnginePool<R>, R) - Constructor for class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    JavetEngineConfig - Class in com.caoccao.javet.interop.engine
    +
     
    +
    JavetEngineConfig() - Constructor for class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    JavetEngineGuard - Class in com.caoccao.javet.interop.engine
    +
    +
    The type Javet engine guard.
    +
    +
    JavetEngineGuard(IJavetEngine<?>, V8Runtime, long) - Constructor for class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    Instantiates a new Javet engine guard.
    +
    +
    JavetEnginePool<R extends V8Runtime> - Class in com.caoccao.javet.interop.engine
    +
    +
    The type Javet engine pool.
    +
    +
    JavetEnginePool() - Constructor for class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    Instantiates a new Javet engine pool.
    +
    +
    JavetEnginePool(JavetEngineConfig) - Constructor for class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    Instantiates a new Javet engine pool.
    +
    +
    JavetEngineUsage - Class in com.caoccao.javet.interop.engine
    +
     
    +
    JavetEngineUsage() - Constructor for class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    JavetEntityFunction - Class in com.caoccao.javet.entities
    +
    +
    The type Javet entity function is for converting JS function + to or from Java object.
    +
    +
    JavetEntityFunction() - Constructor for class com.caoccao.javet.entities.JavetEntityFunction
    +
    +
    Instantiates a new Javet entity function.
    +
    +
    JavetEntityFunction(String) - Constructor for class com.caoccao.javet.entities.JavetEntityFunction
    +
    +
    Instantiates a new Javet entity function.
    +
    +
    JavetEntityMap - Class in com.caoccao.javet.entities
    +
    +
    The type Javet entity map is for converting JS map + to or from Java map.
    +
    +
    JavetEntityMap(int, float) - Constructor for class com.caoccao.javet.entities.JavetEntityMap
    +
    +
    Instantiates a new Javet entity map.
    +
    +
    JavetEntityMap(int) - Constructor for class com.caoccao.javet.entities.JavetEntityMap
    +
    +
    Instantiates a new Javet entity map.
    +
    +
    JavetEntityMap() - Constructor for class com.caoccao.javet.entities.JavetEntityMap
    +
    +
    Instantiates a new Javet entity map.
    +
    +
    JavetEntityMap(Map<? extends String, ?>) - Constructor for class com.caoccao.javet.entities.JavetEntityMap
    +
    +
    Instantiates a new Javet entity map.
    +
    +
    JavetEntitySymbol - Class in com.caoccao.javet.entities
    +
    +
    The type Javet entity symbol is for converting JS symbol + to or from Java symbol.
    +
    +
    JavetEntitySymbol(String) - Constructor for class com.caoccao.javet.entities.JavetEntitySymbol
    +
    +
    Instantiates a new Javet entity symbol.
    +
    +
    JavetError - Class in com.caoccao.javet.exceptions
    +
     
    +
    JavetErrorType - Enum in com.caoccao.javet.enums
    +
    +
    The enum Javet error type is for categorizing the errors.
    +
    +
    JavetException - Exception in com.caoccao.javet.exceptions
    +
     
    +
    JavetException(JavetError) - Constructor for exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    JavetException(JavetError, Map<String, Object>) - Constructor for exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    JavetException(JavetError, Throwable) - Constructor for exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    JavetException(JavetError, Map<String, Object>, Throwable) - Constructor for exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    JavetExecutionException - Exception in com.caoccao.javet.exceptions
    +
     
    +
    JavetExecutionException(String, String, String, int, int, int, int, int) - Constructor for exception com.caoccao.javet.exceptions.JavetExecutionException
    +
     
    +
    JavetLibLoader - Class in com.caoccao.javet.interop
    +
     
    +
    JavetLibLoader(JSRuntimeType) - Constructor for class com.caoccao.javet.interop.JavetLibLoader
    +
     
    +
    JavetObjectConverter - Class in com.caoccao.javet.interop.converters
    +
    +
    The type Javet object converter.
    +
    +
    JavetObjectConverter() - Constructor for class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    Instantiates a new Javet object converter.
    +
    +
    JavetOSUtils - Class in com.caoccao.javet.utils
    +
     
    +
    JavetPrimitiveConverter - Class in com.caoccao.javet.interop.converters
    +
    +
    The type Javet primitive converter.
    +
    +
    JavetPrimitiveConverter() - Constructor for class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
    +
    Instantiates a new Javet primitive converter.
    +
    +
    JavetPrimitiveUtils - Class in com.caoccao.javet.utils
    +
     
    +
    JavetPrimitiveUtils() - Constructor for class com.caoccao.javet.utils.JavetPrimitiveUtils
    +
     
    +
    JavetPromiseRejectCallback - Class in com.caoccao.javet.utils
    +
     
    +
    JavetPromiseRejectCallback(IJavetLogger) - Constructor for class com.caoccao.javet.utils.JavetPromiseRejectCallback
    +
     
    +
    JavetPromiseRejectEvent - Enum in com.caoccao.javet.enums
    +
    +
    The enum Javet promise reject event represents the corresponding event in V8.
    +
    +
    JavetProxyConverter - Class in com.caoccao.javet.interop.converters
    +
    +
    The type Javet proxy converter.
    +
    +
    JavetProxyConverter() - Constructor for class com.caoccao.javet.interop.converters.JavetProxyConverter
    +
    +
    Instantiates a new Javet proxy converter.
    +
    +
    JavetReflectionUtils - Class in com.caoccao.javet.utils
    +
    +
    The type Javet reflection utils.
    +
    +
    JavetResourceUtils - Class in com.caoccao.javet.utils
    +
    +
    The type Javet resource utils.
    +
    +
    JavetScriptingError - Class in com.caoccao.javet.exceptions
    +
     
    +
    JavetScriptingError(String, String, String, int, int, int, int, int) - Constructor for class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    JavetStandardConsoleInterceptor - Class in com.caoccao.javet.interception.logging
    +
    +
    The type Javet standard console interceptor.
    +
    +
    JavetStandardConsoleInterceptor(V8Runtime) - Constructor for class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Instantiates a new Javet standard console interceptor.
    +
    +
    JavetTerminatedException - Exception in com.caoccao.javet.exceptions
    +
     
    +
    JavetTerminatedException(boolean) - Constructor for exception com.caoccao.javet.exceptions.JavetTerminatedException
    +
     
    +
    JavetUniversalInterceptor(V8Runtime, Object, String, List<Method>) - Constructor for class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.JavetUniversalInterceptor
    +
    +
    Instantiates a new Javet universal interceptor.
    +
    +
    JavetUniversalProxyHandler<T> - Class in com.caoccao.javet.interop.proxy
    +
    +
    The type Javet universal proxy handler.
    +
    +
    JavetUniversalProxyHandler(V8Runtime, T) - Constructor for class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    Instantiates a new Javet universal proxy handler.
    +
    +
    JavetUniversalProxyHandler.JavetUniversalInterceptor - Class in com.caoccao.javet.interop.proxy
    +
    +
    The type Javet universal interceptor.
    +
    +
    JavetUniversalProxyHandler.ScoredExecutable<E extends java.lang.reflect.Executable> - Class in com.caoccao.javet.interop.proxy
    +
    +
    The type Scored executable.
    +
    +
    JavetVirtualObject - Class in com.caoccao.javet.utils
    +
    +
    The type Javet virtual object.
    +
    +
    JavetVirtualObject(V8Value) - Constructor for class com.caoccao.javet.utils.JavetVirtualObject
    +
    +
    Instantiates a new Javet virtual object.
    +
    +
    JS_FUNCTION_DEBUG - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JS_FUNCTION_DEBUG.
    +
    +
    JS_FUNCTION_ERROR - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JS_FUNCTION_ERROR.
    +
    +
    JS_FUNCTION_INFO - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JS_FUNCTION_INFO.
    +
    +
    JS_FUNCTION_LOG - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JS_FUNCTION_LOG.
    +
    +
    JS_FUNCTION_TRACE - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JS_FUNCTION_TRACE.
    +
    +
    JS_FUNCTION_WARN - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant JS_FUNCTION_WARN.
    +
    +
    jsFunctionType - Variable in class com.caoccao.javet.entities.JavetEntityFunction
    +
    +
    The JS function type.
    +
    +
    JSFunctionType - Enum in com.caoccao.javet.enums
    +
     
    +
    jsFunctionType - Variable in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    JSRuntimeType - Enum in com.caoccao.javet.enums
    +
     
    +
    JSScopeType - Enum in com.caoccao.javet.enums
    +
     
    +
    + + + +

    K

    +
    +
    keyFor(V8ValueSymbol) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    + + + +

    L

    +
    +
    lastActiveZonedDatetime - Variable in class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    LibraryNotFound - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    LibraryNotLoaded - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    LINE_SEPARATOR - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    load() - Method in class com.caoccao.javet.interop.JavetLibLoader
    +
     
    +
    loadLibrary() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Load library.
    +
    +
    LockAcquisitionFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    LockConflictThreadIdMismatch - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    LockReleaseFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    lockV8Runtime(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    log - Variable in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    The Log.
    +
    +
    logDebug(String, Object...) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Log debug.
    +
    +
    logError(Throwable, String, Object...) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Log error.
    +
    +
    logError(String, Object...) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Log error.
    +
    +
    logger - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    logger - Variable in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    logger - Variable in class com.caoccao.javet.utils.JavetPromiseRejectCallback
    +
     
    +
    logInfo(String, Object...) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Log info.
    +
    +
    logWarn(String, Object...) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Log warn.
    +
    +
    lowMemoryNotification(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    lowMemoryNotification() - Method in class com.caoccao.javet.interop.V8Runtime
    +
    +
    Send low memory notification to current V8 isolate.
    +
    +
    + + + +

    M

    +
    +
    markAsHandled() - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Mark as handled.
    +
    +
    markAsHandled() - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    maxDepth - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Max depth.
    +
    +
    MESSAGE - Static variable in class com.caoccao.javet.values.reference.V8ValueError
    +
     
    +
    method - Variable in class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    The Method.
    +
    +
    METHOD_NAME_CONSTRUCT - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant METHOD_NAME_CONSTRUCT.
    +
    +
    METHOD_NAME_CONSTRUCTOR - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant METHOD_NAME_CONSTRUCTOR.
    +
    +
    METHOD_NAME_FROM_MAP - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant METHOD_NAME_FROM_MAP.
    +
    +
    METHOD_NAME_TO_MAP - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant METHOD_NAME_TO_MAP.
    +
    +
    METHOD_PREFIX_GET - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    METHOD_PREFIX_IS - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    METHOD_PREFIX_SET - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    MethodDescriptor - Class in com.caoccao.javet.interop.binding
    +
    +
    The type Method descriptor.
    +
    +
    MethodDescriptor(Method, boolean) - Constructor for class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    Instantiates a new Method descriptor.
    +
    +
    MethodDescriptor(Method, boolean, V8ValueSymbolType) - Constructor for class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    Instantiates a new Method descriptor.
    +
    +
    methodsMap - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Methods map.
    +
    +
    moduleEvaluate(long, long, int, boolean) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    moduleEvaluate(IV8Module, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    moduleGetException(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    moduleGetException(IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    moduleGetNamespace(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    moduleGetNamespace(IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    moduleGetScriptId(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    moduleGetScriptId(IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    moduleGetStatus(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    moduleGetStatus(IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    moduleInstantiate(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    moduleInstantiate(IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    ModuleNameEmpty - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    ModuleNotFound - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    moduleObject - Variable in class com.caoccao.javet.node.modules.BaseNodeModule
    +
     
    +
    ModulePermissionDenied - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    + + + +

    N

    +
    +
    name - Variable in class com.caoccao.javet.node.modules.BaseNodeModule
    +
     
    +
    name - Variable in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    NodeModule - Annotation Type in com.caoccao.javet.annotations
    +
    +
    The annotation Node module.
    +
    +
    NodeModuleAny - Class in com.caoccao.javet.node.modules
    +
     
    +
    NodeModuleAny(V8ValueObject, String) - Constructor for class com.caoccao.javet.node.modules.NodeModuleAny
    +
     
    +
    nodeModuleMap - Variable in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    NodeModuleModule - Class in com.caoccao.javet.node.modules
    +
     
    +
    NodeModuleModule(V8ValueObject, String) - Constructor for class com.caoccao.javet.node.modules.NodeModuleModule
    +
     
    +
    NodeModuleProcess - Class in com.caoccao.javet.node.modules
    +
     
    +
    NodeModuleProcess(V8ValueObject, String) - Constructor for class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    NodeRuntime - Class in com.caoccao.javet.interop
    +
    +
    Node runtime is a thin wrapper over V8 runtime.
    +
    +
    NotSupported - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    NULL - Static variable in class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    + + + +

    O

    +
    +
    object - Variable in class com.caoccao.javet.utils.JavetVirtualObject
    +
    +
    The Object.
    +
    +
    of(K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    of(K, V, K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    of(K, V, K, V, K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    of(K, V, K, V, K, V, K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    of(K, V, K, V, K, V, K, V, K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    of(K, V, K, V, K, V, K, V, K, V, K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    of(K, V, K, V, K, V, K, V, K, V, K, V, K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    of(K, V, K, V, K, V, K, V, K, V, K, V, K, V, K, V) - Static method in class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    on(String, V8ValueFunction) - Method in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    ONE_BYTE_PER_VALUE - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant ONE_BYTE_PER_VALUE.
    +
    +
    OS_NAME - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    OSNotSupported - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    ownKeys(V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Own keys V8 value.
    +
    +
    ownKeys(V8Value) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
     
    +
    + + + +

    P

    +
    +
    PARAMETER_ACTUAL_PARAMETER_SIZE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_ACTUAL_PARAMETER_TYPE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_CONTINUABLE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_COUNT - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_CURRENT_THREAD_ID - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_END_COLUMN - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_END_POSITION - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_EXPECTED_PARAMETER_SIZE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_EXPECTED_PARAMETER_TYPE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_FEATURE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_LINE_NUMBER - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_LOCKED_THREAD_ID - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_MAX_DEPTH - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_MESSAGE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_METHOD_NAME - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_OS - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_PATH - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_REASON - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_RESOURCE_NAME - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_SOURCE_LINE - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_START_COLUMN - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_START_POSITION - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    PARAMETER_SYMBOL - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    parameters - Variable in exception com.caoccao.javet.exceptions.JavetException
    +
     
    +
    parse(int) - Static method in enum com.caoccao.javet.enums.JavetPromiseRejectEvent
    +
    +
    Parse javet promise reject event by code.
    +
    +
    parse(int) - Static method in enum com.caoccao.javet.enums.JSFunctionType
    +
     
    +
    parse(int) - Static method in enum com.caoccao.javet.enums.JSScopeType
    +
     
    +
    parse(int) - Static method in enum com.caoccao.javet.enums.V8ValueReferenceType
    +
     
    +
    PATTERN_CAPITALIZED_PREFIX - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant PATTERN_CAPITALIZED_PREFIX.
    +
    +
    pooled - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    pop() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    pop() - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    popBoolean() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popDouble() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popInteger() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popLong() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popNull() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popObject() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popPrimitive() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popString() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    popUndefined() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    PREFIX_PROPERTY - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    preventExtensions(V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Prevent extensions.
    +
    +
    PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME.
    +
    +
    PRIVATE_PROPERTY_PROXY_TARGET - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant PRIVATE_PROPERTY_PROXY_TARGET.
    +
    +
    PROCESS_ID - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    promiseCatch(long, long, int, long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseCatch(IV8ValuePromise, IV8ValueFunction) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseGetPromise(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseGetPromise(V8ValuePromise) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseGetResult(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseGetResult(IV8ValuePromise) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseGetState(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseGetState(IV8ValuePromise) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseHasHandler(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseHasHandler(IV8ValuePromise) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseMarkAsHandled(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseMarkAsHandled(IV8ValuePromise) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseReject(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseReject(V8ValuePromise, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseRejectCallback - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseResolve(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseResolve(V8ValuePromise, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    promiseThen(long, long, int, long, long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    promiseThen(IV8ValuePromise, IV8ValueFunction, IV8ValueFunction) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    PROPERTY_ASYNC_ITERATOR - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_BUFFER - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
    +
    The constant PROPERTY_BUFFER.
    +
    +
    PROPERTY_BUFFER - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant PROPERTY_BUFFER.
    +
    +
    PROPERTY_BYTE_LENGTH - Static variable in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    PROPERTY_BYTE_LENGTH - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
    +
    The constant PROPERTY_BYTE_LENGTH.
    +
    +
    PROPERTY_BYTE_LENGTH - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant PROPERTY_BYTE_LENGTH.
    +
    +
    PROPERTY_BYTE_OFFSET - Static variable in class com.caoccao.javet.values.reference.V8ValueDataView
    +
    +
    The constant PROPERTY_BYTE_OFFSET.
    +
    +
    PROPERTY_BYTE_OFFSET - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant PROPERTY_BYTE_OFFSET.
    +
    +
    PROPERTY_CONSOLE - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant PROPERTY_CONSOLE.
    +
    +
    PROPERTY_DATA_VIEW - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    PROPERTY_DESCRIPTION - Static variable in class com.caoccao.javet.values.reference.V8ValueSymbol
    +
    +
    The constant PROPERTY_DESCRIPTION.
    +
    +
    PROPERTY_DIRNAME - Static variable in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    PROPERTY_DONE - Static variable in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    PROPERTY_DONE - Static variable in class com.caoccao.javet.values.reference.V8ValueIterator
    +
     
    +
    PROPERTY_FILENAME - Static variable in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    PROPERTY_HAS_INSTANCE - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_IS_CONCAT_SPREADABLE - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_ITERATOR - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_JSON - Static variable in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    PROPERTY_MATCH - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_MATCH_ALL - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_NAME - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant PROPERTY_NAME.
    +
    +
    PROPERTY_NAME - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant PROPERTY_NAME.
    +
    +
    PROPERTY_OBJECT - Static variable in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    PROPERTY_PROMISE - Static variable in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    PROPERTY_PROTOTYPE - Static variable in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    PROPERTY_REPLACE - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_REQUIRE - Static variable in class com.caoccao.javet.node.modules.NodeModuleModule
    +
     
    +
    PROPERTY_SEARCH - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_SPECIES - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_SPLIT - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_SYMBOL - Static variable in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    PROPERTY_TO_PRIMITIVE - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_TO_STRING_TAG - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_UNSCOPABLES - Static variable in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    PROPERTY_VALUE - Static variable in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    PROPERTY_VALUE - Static variable in class com.caoccao.javet.values.reference.V8ValueIterator
    +
     
    +
    PROPERTY_VERSION - Static variable in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    propertyGetterMap - Variable in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    The Property getter map.
    +
    +
    propertySetterMap - Variable in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    The Property setter map.
    +
    +
    proxyGetHandler(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    proxyGetHandler(IV8ValueProxy) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    proxyGetTarget(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    proxyGetTarget(IV8ValueProxy) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    proxyIsRevoked(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    proxyIsRevoked(IV8ValueProxy) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    proxyMapEnabled - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Proxy map enabled.
    +
    +
    proxyRevoke(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    proxyRevoke(IV8ValueProxy) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    proxySetEnabled - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    The Proxy set enabled.
    +
    +
    PUBLIC_PROPERTY_CONSTRUCTOR - Static variable in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    The constant PUBLIC_PROPERTY_CONSTRUCTOR.
    +
    +
    push(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    push(Object) - Method in class com.caoccao.javet.values.reference.V8ValueArray
    +
     
    +
    pushNull() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    pushUndefined() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    + + + +

    Q

    +
    +
    quitting - Variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The Quitting.
    +
    +
    quitting - Variable in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    The Quitting.
    +
    +
    + + + +

    R

    +
    +
    race(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    raceVoid(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    receiveCallback(V8Runtime, JavetCallbackContext, V8Value, V8ValueArray) - Static method in class com.caoccao.javet.interop.callback.V8FunctionCallback
    +
    +
    Receive callback V8 value.
    +
    +
    receiveNotification(String) - Method in interface com.caoccao.javet.interop.IV8InspectorListener
    +
     
    +
    receiveNotification(String) - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    receivePromiseRejectCallback(int, V8ValuePromise, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    receiveResponse(String) - Method in interface com.caoccao.javet.interop.IV8InspectorListener
    +
     
    +
    receiveResponse(String) - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    referenceLock - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    referenceMap - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    register(IV8ValueObject...) - Method in class com.caoccao.javet.interception.BaseJavetInterceptor
    +
     
    +
    register(IV8ValueObject...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
     
    +
    register(IV8ValueObject, String, String) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    Register a JS function by name.
    +
    +
    register(IV8ValueObject...) - Method in interface com.caoccao.javet.interfaces.IJavetInterceptor
    +
    +
    Register the interceptor to the given V8 value object.
    +
    +
    registerCustomObject(Class<?>) - Method in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    Register custom object.
    +
    +
    registerCustomObject(Class<?>, String, String) - Method in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    Register custom object.
    +
    +
    registerListeners() - Method in class com.caoccao.javet.interop.V8Notifier
    +
     
    +
    registerV8Runtime(long, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    reject(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    reject(V8Value) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Reject.
    +
    +
    reject(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Reject.
    +
    +
    reject(V8Value) - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    rejectVoid(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    releaseEngine(IJavetEngine<R>) - Method in interface com.caoccao.javet.interop.engine.IJavetEnginePool
    +
     
    +
    releaseEngine(IJavetEngine<R>) - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    removeAllReferences() - Method in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    removeAllReferences() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeCallbackContext(long) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeCallbackContexts() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeJNIGlobalRef(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    removeJNIGlobalRef(long) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeListeners(IV8InspectorListener...) - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    removeNodeModule(INodeModule) - Method in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    removeNodeModules() - Method in class com.caoccao.javet.interop.NodeRuntime
    +
     
    +
    removeReference(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeReference() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    removeReference() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    removeReferenceHandle(long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    removeReferences() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeV8Module(String, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeV8Module(String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeV8Module(IV8Module) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeV8Module(IV8Module, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeV8Modules() - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    removeV8Modules(boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    requestGarbageCollectionForTesting(long, boolean) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    requestGarbageCollectionForTesting(boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
    +
    Requests GC for testing.
    +
    +
    reset() - Method in interface com.caoccao.javet.interfaces.IJavetResettable
    +
    +
    Reset.
    +
    +
    reset() - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    reset() - Method in class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    resetContext() - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    resetContext() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    resetContext() - Method in class com.caoccao.javet.interop.V8Runtime
    +
    +
    Reset V8 context.
    +
    +
    resetIsolate() - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    resetIsolate() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    resetIsolate() - Method in class com.caoccao.javet.interop.V8Runtime
    +
    +
    Reset V8 isolate.
    +
    +
    resetV8Context(long, String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    resetV8Isolate(long, String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    resolve(V8Runtime, String, IV8Module) - Method in interface com.caoccao.javet.interfaces.IV8ModuleResolver
    +
    +
    Resolve V8 module.
    +
    +
    resolve(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    resolve(V8Value) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Resolve.
    +
    +
    resolve(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Resolve.
    +
    +
    resolve(V8Value) - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    resolveVoid(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    resourceName - Variable in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    resourceName - Variable in class com.caoccao.javet.values.reference.V8Script
    +
     
    +
    revoke() - Method in interface com.caoccao.javet.values.reference.IV8ValueProxy
    +
    +
    Revoke.
    +
    +
    revoke() - Method in class com.caoccao.javet.values.reference.V8ValueProxy
    +
     
    +
    run() - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    run() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
     
    +
    runIfWaitingForDebugger(int) - Method in interface com.caoccao.javet.interop.IV8InspectorListener
    +
     
    +
    runIfWaitingForDebugger(int) - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    RuntimeAlreadyClosed - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    RuntimeAlreadyRegistered - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    RuntimeCloseFailure - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    RuntimeLeakageDetected - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    RuntimeNotRegistered - Static variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    + + + +

    S

    +
    +
    safeClose(Object...) - Static method in class com.caoccao.javet.utils.JavetResourceUtils
    +
    +
    Safe close.
    +
    +
    safeClose(Object) - Static method in class com.caoccao.javet.utils.JavetResourceUtils
    +
    +
    Safe close.
    +
    +
    safeSetAccessible(AccessibleObject) - Static method in class com.caoccao.javet.utils.JavetReflectionUtils
    +
    +
    Safe set accessible.
    +
    +
    sameValue(long, long, long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    sameValue(IV8ValueObject, IV8ValueObject) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    sameValue(V8Value) - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Same value.
    +
    +
    sameValue(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    sameValue(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    sameValue(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    sameValue(V8Value) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    sameValue(V8Value) - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    sameValue(V8Value) - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    ScoredExecutable(V8Runtime, Object, E, JavetVirtualObject[]) - Constructor for class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler.ScoredExecutable
    +
    +
    Instantiates a new Scored executable.
    +
    +
    scriptingError - Variable in exception com.caoccao.javet.exceptions.BaseJavetScriptingException
    +
     
    +
    scriptPath - Variable in class com.caoccao.javet.interop.executors.V8PathExecutor
    +
     
    +
    scriptRun(long, long, int, boolean) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    scriptRun(IV8Script, boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    scriptString - Variable in class com.caoccao.javet.interop.executors.V8StringExecutor
    +
     
    +
    seal() - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    sendGCNotification() - Method in interface com.caoccao.javet.interop.engine.IJavetEngine
    +
     
    +
    sendGCNotification() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    sendRequest(String) - Method in interface com.caoccao.javet.interop.IV8InspectorListener
    +
     
    +
    sendRequest(String) - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    set(long, long, int, Object, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    set(V8Value, V8Value, V8Value, V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Set value by property.
    +
    +
    set(V8Value, V8Value, V8Value, V8Value) - Method in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
     
    +
    set(IV8ValueObject, V8Value, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    set(Object, Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Set boolean.
    +
    +
    set(Object, Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    set(Object, Object) - Method in class com.caoccao.javet.values.reference.V8ValueWeakMap
    +
     
    +
    setAccessor(long, long, int, Object, Object, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    setAccessor(IV8ValueObject, V8Value, JavetCallbackContext, JavetCallbackContext) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setActive(boolean) - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    setAllowEval(boolean) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setAllowNativesSyntax(boolean) - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    setAutoSendGCNotification(boolean) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setBigInt64(int, long) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setBigInt64(int, long, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setByteOrder(ByteOrder) - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    setConfig(JavetConverterConfig) - Method in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
    +
    Sets config.
    +
    +
    setConverter(IJavetConverter) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setDebug(PrintStream) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Sets debug.
    +
    +
    setDefaultBoolean(boolean) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default boolean.
    +
    +
    setDefaultByte(byte) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default byte.
    +
    +
    setDefaultChar(char) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default char.
    +
    +
    setDefaultDouble(double) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default double.
    +
    +
    setDefaultEngineGuardTimeoutMillis(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setDefaultFloat(float) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default float.
    +
    +
    setDefaultInt(int) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default int.
    +
    +
    setDefaultLong(long) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default long.
    +
    +
    setDefaultShort(short) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets default short.
    +
    +
    setEndColumn(int) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    setEndPosition(int) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    setEngineGuardCheckIntervalMillis(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setError(PrintStream) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Sets error.
    +
    +
    setExposeGC(boolean) - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    setExposeInspectorScripts(boolean) - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    setExtractFunctionSourceCode(boolean) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets extract function source code.
    +
    +
    setFlags(String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
    +
    Sets flags.
    +
    +
    setFlags() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Sets flags.
    +
    +
    setFloat32(int, float) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setFloat32(int, float, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setFloat64(int, double) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setFloat64(int, double, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setGcBeforeEngineClose(boolean) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setGCScheduled(boolean) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setGlobalName(String) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setGlobalName(String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setHandle(long) - Method in class com.caoccao.javet.interop.callback.JavetCallbackContext
    +
    +
    Sets handle.
    +
    +
    setInfo(PrintStream) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Sets info.
    +
    +
    setInt16(int, short) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setInt16(int, short, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setInt32(int, int) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setInt32(int, int, boolean) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setInt8(int, byte) - Method in class com.caoccao.javet.values.reference.V8ValueDataView
    +
     
    +
    setJavetLogger(IJavetLogger) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setJSFunctionType(JSFunctionType) - Method in class com.caoccao.javet.entities.JavetEntityFunction
    +
     
    +
    setJSFunctionType(JSFunctionType) - Method in interface com.caoccao.javet.interfaces.IJavetEntityFunction
    +
    +
    Sets JS function type.
    +
    +
    setJSRuntimeType(JSRuntimeType) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setLastActiveZonedDatetime(ZonedDateTime) - Method in class com.caoccao.javet.interop.engine.JavetEngineUsage
    +
     
    +
    setLibraryReloadable(boolean) - Static method in class com.caoccao.javet.interop.V8Host
    +
    +
    Sets whether the JNI library is reloadable or not.
    +
    +
    setLineNumber(int) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    setLog(PrintStream) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Sets log.
    +
    +
    setLogger(IJavetLogger) - Method in class com.caoccao.javet.interop.V8Inspector
    +
     
    +
    setLogger(IJavetLogger) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setMaxDepth(int) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets max depth.
    +
    +
    setMemoryUsageThresholdRatio(double) - Static method in class com.caoccao.javet.interop.V8Host
    +
    +
    Sets memory usage threshold ratio.
    +
    +
    setMessage(String) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    setModule(boolean) - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    setModule(boolean) - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    setNull(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets null.
    +
    +
    setPoolDaemonCheckIntervalMillis(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setPoolIdleTimeoutSeconds(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setPoolMaxSize(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setPoolMinSize(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setPoolShutdownTimeoutSeconds(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setPrivateProperty(long, long, int, String, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    setPrivateProperty(IV8ValueObject, String, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setPrivateProperty(String, Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets private property.
    +
    +
    setPrivateProperty(String, Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    setPrivatePropertyNull(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets private property null.
    +
    +
    setPrivatePropertyUndefined(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets private property undefined.
    +
    +
    setPromiseRejectCallback(IJavetPromiseRejectCallback) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setProperty(long, long, int, Object, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    setProperty(IV8ValueObject, V8Value, V8Value) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setProperty(Object, Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets property.
    +
    +
    setProperty(Object, Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    setPropertyNull(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets property null.
    +
    +
    setPropertyUndefined(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets property undefined.
    +
    +
    setPrototype(long, long, int, long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    setPrototype(IV8ValueObject, IV8ValueObject) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setPrototype(IV8ValueObject) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets prototype.
    +
    +
    setPrototype(IV8ValueObject) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    setPrototypeOf(V8Value, V8Value) - Method in interface com.caoccao.javet.interop.proxy.IJavetProxyHandler
    +
    +
    Sets prototype of.
    +
    +
    setProxyMapEnabled(boolean) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets proxy map enabled.
    +
    +
    setProxySetEnabled(boolean) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets proxy set enabled.
    +
    +
    setRequireRootDirectory(Path) - Method in class com.caoccao.javet.node.modules.NodeModuleModule
    +
     
    +
    setResetEngineTimeoutSeconds(int) - Method in class com.caoccao.javet.interop.engine.JavetEngineConfig
    +
     
    +
    setResourceColumnOffset(int) - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    setResourceLineOffset(int) - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    setResourceName(String) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    setResourceName(String) - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    setResourceName(String) - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    setResourceName(String) - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    setResourceName(String) - Method in interface com.caoccao.javet.values.reference.IV8Script
    +
     
    +
    setResourceName(String) - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    setResourceName(String) - Method in class com.caoccao.javet.values.reference.V8Script
    +
     
    +
    setScriptId(int) - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    setSkipFunctionInObject(boolean) - Method in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    Sets skip functions.
    +
    +
    setSourceCode(String) - Method in class com.caoccao.javet.entities.JavetEntityFunction
    +
     
    +
    setSourceCode(String) - Method in interface com.caoccao.javet.interfaces.IJavetEntityFunction
    +
    +
    Sets source code.
    +
    +
    setSourceCode(long, long, int, String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    setSourceCode(IV8ValueFunction, String) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setSourceCode(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueFunction
    +
    +
    Sets source code.
    +
    +
    setSourceCode(String) - Method in class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    setSourceLine(String) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    setStartColumn(int) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    setStartPosition(int) - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    SETTER_PREFIX_ARRAY - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant SETTER_PREFIX_ARRAY.
    +
    +
    settersMap - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Setters map.
    +
    +
    setTimeoutMillis(long) - Method in interface com.caoccao.javet.interop.engine.IJavetEngineGuard
    +
    +
    Sets timeout millis.
    +
    +
    setTimeoutMillis(long) - Method in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
     
    +
    setTrace(PrintStream) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Sets trace.
    +
    +
    setTrackRetainingPath(boolean) - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    setType(V8ValueReferenceType) - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    Sets type.
    +
    +
    setUndefined(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Sets undefined.
    +
    +
    setUseStrict(boolean) - Method in class com.caoccao.javet.interop.V8Flags
    +
     
    +
    setV8BindEnabler(Method) - Method in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Sets V8 bind enabler.
    +
    +
    setV8ModuleResolver(IV8ModuleResolver) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setV8Runtime(V8Runtime) - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Sets V8 runtime.
    +
    +
    setV8Runtime(V8Runtime) - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    setV8Runtime(V8Runtime) - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    setV8RuntimeSetter(Method) - Method in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    Sets V8 runtime setter.
    +
    +
    setWarn(PrintStream) - Method in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    Sets warn.
    +
    +
    setWasm(boolean) - Method in class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    setWeak(long, long, int, Object) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    setWeak(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    setWeak() - Method in interface com.caoccao.javet.values.reference.IV8ValueReference
    +
     
    +
    setWeak() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    setWeak() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    setWorkingDirectory(Path) - Method in class com.caoccao.javet.node.modules.NodeModuleProcess
    +
     
    +
    SimpleFreeMarkerFormat - Class in com.caoccao.javet.utils
    +
     
    +
    SimpleFreeMarkerFormat() - Constructor for class com.caoccao.javet.utils.SimpleFreeMarkerFormat
    +
     
    +
    SimpleMap - Class in com.caoccao.javet.utils
    +
    +
    The type Simple map is a polyfill because Map.of is not available at JDK 8 .
    +
    +
    SimpleMap() - Constructor for class com.caoccao.javet.utils.SimpleMap
    +
     
    +
    sizeInBytes - Variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The Size in bytes.
    +
    +
    skipFunctionInObject - Variable in class com.caoccao.javet.interop.converters.JavetConverterConfig
    +
    +
    This flag determines whether function should be skipped in object or not.
    +
    +
    skipInDebugMode - Variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The Skip in debug mode.
    +
    +
    sourceCode - Variable in class com.caoccao.javet.entities.JavetEntityFunction
    +
    +
    The Source code.
    +
    +
    SPACE - Static variable in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
    +
    The constant SPACE.
    +
    +
    STACK - Static variable in class com.caoccao.javet.values.reference.V8ValueError
    +
     
    +
    startDaemon() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    Start daemon.
    +
    +
    STATE_FULFILLED - Static variable in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    The constant STATE_FULFILLED.
    +
    +
    STATE_PENDING - Static variable in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    The constant STATE_PENDING.
    +
    +
    STATE_REJECTED - Static variable in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    The constant STATE_REJECTED.
    +
    +
    stopDaemon() - Method in class com.caoccao.javet.interop.engine.JavetEnginePool
    +
    +
    Stop daemon.
    +
    +
    strictEquals(long, long, long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    strictEquals(IV8ValueObject, IV8ValueObject) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    strictEquals(V8Value) - Method in interface com.caoccao.javet.values.IV8Value
    +
    +
    Strict equals boolean.
    +
    +
    strictEquals(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    strictEquals(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    strictEquals(V8Value) - Method in class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    strictEquals(V8Value) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    strictEquals(V8Value) - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    strictEquals(V8Value) - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    STRING_NULL - Static variable in class com.caoccao.javet.utils.SimpleFreeMarkerFormat
    +
     
    +
    stringify(V8Value) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInJson
    +
     
    +
    symbolType - Variable in class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    The Symbol type.
    +
    +
    + + + +

    T

    +
    +
    targetClass - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Target class.
    +
    +
    targetObject - Variable in class com.caoccao.javet.interop.proxy.BaseJavetProxyHandler
    +
    +
    The Target object.
    +
    +
    TEMP_DIRECTORY - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    terminateExecution(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    terminateExecution() - Method in class com.caoccao.javet.interop.V8Runtime
    +
    +
    Terminate execution.
    +
    +
    then(IV8ValueFunction) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Then.
    +
    +
    then(IV8ValueFunction, IV8ValueFunction) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Then.
    +
    +
    then(String) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Then.
    +
    +
    then(String, String) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Then.
    +
    +
    then(IV8ValueFunction, IV8ValueFunction) - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    thisObjectRequired - Variable in class com.caoccao.javet.interop.binding.MethodDescriptor
    +
    +
    The This object required.
    +
    +
    timeoutMillis - Variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The Timeout millis.
    +
    +
    toArray() - Method in interface com.caoccao.javet.values.reference.IV8ValueArray
    +
     
    +
    toBeClosedValues - Variable in class com.caoccao.javet.values.virtual.V8VirtualValueList
    +
    +
    The To be closed values.
    +
    +
    toBytes() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    toBytes() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    To byte array.
    +
    +
    toClone() - Method in interface com.caoccao.javet.interop.IV8Cloneable
    +
     
    +
    toClone(V8Value[]) - Static method in class com.caoccao.javet.utils.JavetResourceUtils
    +
    +
    To clone V8 value array.
    +
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueBoolean
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueDouble
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueInteger
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueLong
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueString
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueUnknown
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.primitive.V8ValueZonedDateTime
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInJson
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInObject
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.V8Script
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.V8ValueGlobalObject
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.V8ValueWeakMap
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.reference.V8ValueWeakSet
    +
     
    +
    toClone() - Method in class com.caoccao.javet.values.V8Value
    +
     
    +
    toDoubles() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    toDoubles() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    To double array.
    +
    +
    toExactPrimitive(Class<?>, Object) - Static method in class com.caoccao.javet.utils.JavetPrimitiveUtils
    +
     
    +
    toFloats() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    toFloats() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    To float array.
    +
    +
    toIntegers() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    toIntegers() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    To int array.
    +
    +
    toJsonString() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    To json string.
    +
    +
    toJsonString() - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    toLongs() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    toLongs() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    To long array.
    +
    +
    toObject(V8Value) - Method in interface com.caoccao.javet.interop.converters.IJavetConverter
    +
    +
    To object from V8 value.
    +
    +
    toObject(V8Value, boolean) - Method in interface com.caoccao.javet.interop.converters.IJavetConverter
    +
    +
    To object from V8 value and auto close the V8 value.
    +
    +
    toObject(V8Value, int) - Method in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
     
    +
    toObject(V8Value) - Method in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
     
    +
    toObject(V8Value, int) - Method in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
    +
    To object with stack depth.
    +
    +
    toObject(V) - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    toObject(V) - Method in interface com.caoccao.javet.interop.IV8Convertible
    +
    +
    Convert from V8 value to object.
    +
    +
    toObject(V, boolean) - Method in interface com.caoccao.javet.interop.IV8Convertible
    +
    +
    Convert from V8 value to object.
    +
    +
    toObject(V) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    toObject(V) - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    toObject(V) - Method in interface com.caoccao.javet.values.reference.IV8Script
    +
     
    +
    toPrimitive() - Method in class com.caoccao.javet.values.primitive.V8ValueBoolean
    +
     
    +
    toPrimitive() - Method in class com.caoccao.javet.values.primitive.V8ValueDouble
    +
     
    +
    toPrimitive() - Method in class com.caoccao.javet.values.primitive.V8ValueInteger
    +
     
    +
    toPrimitive() - Method in class com.caoccao.javet.values.primitive.V8ValueLong
    +
     
    +
    toPrimitive() - Method in class com.caoccao.javet.values.primitive.V8ValueString
    +
     
    +
    toPrimitive() - Method in class com.caoccao.javet.values.primitive.V8ValueZonedDateTime
    +
     
    +
    toProtoString(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    toProtoString(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    toProtoString() - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    To proto string.
    +
    +
    toProtoString() - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    toShorts() - Method in class com.caoccao.javet.values.reference.V8ValueArrayBuffer
    +
     
    +
    toShorts() - Method in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    To short array.
    +
    +
    toString() - Method in class com.caoccao.javet.exceptions.JavetScriptingError
    +
     
    +
    toString(long, long, int) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    toString(IV8ValueReference) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    toString() - Method in class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    toString() - Method in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    toString() - Method in class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    toString() - Method in class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    toString() - Method in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    toString() - Method in class com.caoccao.javet.values.reference.V8ValueSymbol
    +
     
    +
    touchLastActiveZonedDateTime() - Method in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    toV8Value(V8Runtime, Object) - Method in interface com.caoccao.javet.interop.converters.IJavetConverter
    +
    +
    To V8 value from object.
    +
    +
    toV8Value(V8Runtime, Object, int) - Method in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
     
    +
    toV8Value(V8Runtime, Object) - Method in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
     
    +
    toV8Value(V8Runtime, Object, int) - Method in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
    +
    To V8 value with stack depth.
    +
    +
    toV8Value(V8Runtime, Object, int) - Method in class com.caoccao.javet.interop.converters.JavetProxyConverter
    +
     
    +
    toV8Value(T) - Method in interface com.caoccao.javet.interop.executors.IV8Executor
    +
     
    +
    toV8Value(T) - Method in interface com.caoccao.javet.interop.IV8Convertible
    +
    +
    Convert object to V8 value.
    +
    +
    toV8Value(T) - Method in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    toV8Value(T) - Method in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    toV8Value(T) - Method in interface com.caoccao.javet.values.reference.IV8Script
    +
     
    +
    toZonedDateTime(long, ZoneId) - Static method in class com.caoccao.javet.utils.JavetDateTimeUtils
    +
    +
    From JS timestamp to zoned date time.
    +
    +
    toZonedDateTime(long) - Static method in class com.caoccao.javet.utils.JavetDateTimeUtils
    +
    +
    From JS timestamp to zoned date time.
    +
    +
    trace - Variable in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    The Trace.
    +
    +
    TWO_BYTES_PER_VALUE - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant TWO_BYTES_PER_VALUE.
    +
    +
    type - Variable in class com.caoccao.javet.exceptions.JavetError
    +
     
    +
    type - Variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The Type.
    +
    +
    + + + +

    U

    +
    +
    unbind(Object) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Unbind the interception.
    +
    +
    unbind(Object) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    unbindFunction(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Unbind function.
    +
    +
    unbindFunction(String) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    unbindProperty(String) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Unbind property.
    +
    +
    unbindProperty(V8ValueString) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Unbind property boolean.
    +
    +
    unbindProperty(V8ValueSymbol) - Method in interface com.caoccao.javet.values.reference.IV8ValueObject
    +
    +
    Unbind property boolean.
    +
    +
    unbindProperty(V8ValueString) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    unbindProperty(V8ValueSymbol) - Method in class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    UNDEFINED - Static variable in class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    Uninstantiated - Static variable in interface com.caoccao.javet.values.reference.IV8Module
    +
     
    +
    uniqueKeySet - Variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The Unique key set.
    +
    +
    unloadLibrary() - Method in class com.caoccao.javet.interop.V8Host
    +
    +
    Unload library.
    +
    +
    unlockV8Runtime(long) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    unregister(IV8ValueObject...) - Method in class com.caoccao.javet.interception.BaseJavetInterceptor
    +
     
    +
    unregister(IV8ValueObject...) - Method in class com.caoccao.javet.interception.logging.BaseJavetConsoleInterceptor
    +
     
    +
    unregister(IV8ValueObject...) - Method in interface com.caoccao.javet.interfaces.IJavetInterceptor
    +
    +
    Unregister the interceptor from the given V8 value object.
    +
    +
    unregisterCustomObject(Class<?>) - Method in class com.caoccao.javet.interop.converters.JavetObjectConverter
    +
    +
    Unregister custom object.
    +
    +
    unregisterListener() - Method in class com.caoccao.javet.interop.V8Notifier
    +
     
    +
    usage - Variable in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    + + + +

    V

    +
    +
    V8_VALUE_BOOLEAN_FALSE_INDEX - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    V8_VALUE_BOOLEAN_TRUE_INDEX - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    V8_VALUE_CLASS - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant V8_VALUE_CLASS.
    +
    +
    V8_VALUE_FUNCTION_CLASS - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant V8_VALUE_FUNCTION_CLASS.
    +
    +
    V8_VALUE_NUMBER_LOWER_BOUND - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    V8_VALUE_NUMBER_UPPER_BOUND - Static variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    V8_VALUE_OBJECT_CLASS - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant V8_VALUE_OBJECT_CLASS.
    +
    +
    V8_VALUE_PROXY_CLASS - Static variable in class com.caoccao.javet.interop.proxy.JavetUniversalProxyHandler
    +
    +
    The constant V8_VALUE_PROXY_CLASS.
    +
    +
    V8BindEnabler - Annotation Type in com.caoccao.javet.annotations
    +
    +
    The interface V8 bind config is for determining whether certain injection is enabled or not.
    +
    +
    v8BindEnabler - Variable in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    The V8 bind enabler.
    +
    +
    V8Data - Class in com.caoccao.javet.values
    +
     
    +
    V8Data() - Constructor for class com.caoccao.javet.values.V8Data
    +
     
    +
    V8Flags - Class in com.caoccao.javet.interop
    +
     
    +
    V8Function - Annotation Type in com.caoccao.javet.annotations
    +
    +
    The annotation V8 function is for auto-registering JS function interception.
    +
    +
    V8FunctionCallback - Class in com.caoccao.javet.interop.callback
    +
    +
    The type V8 function callback.
    +
    +
    V8FunctionCallback() - Constructor for class com.caoccao.javet.interop.callback.V8FunctionCallback
    +
     
    +
    V8Host - Class in com.caoccao.javet.interop
    +
    +
    The type V8 host.
    +
    +
    v8Host - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    V8Inspector - Class in com.caoccao.javet.interop
    +
     
    +
    v8Inspector - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    v8InspectorSend(long, String) - Method in interface com.caoccao.javet.interop.IV8Native
    +
     
    +
    V8Locker - Class in com.caoccao.javet.interop
    +
    +
    The type V8 locker.
    +
    +
    V8Module - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8Module(long) - Constructor for class com.caoccao.javet.values.reference.V8Module
    +
     
    +
    v8ModuleLock - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    v8ModuleMap - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    v8ModuleResolver - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    v8Native - Variable in class com.caoccao.javet.interop.V8Runtime
    +
     
    +
    V8Notifier - Class in com.caoccao.javet.interop
    +
     
    +
    V8Notifier(ConcurrentHashMap<Long, V8Runtime>) - Constructor for class com.caoccao.javet.interop.V8Notifier
    +
     
    +
    V8PathExecutor - Class in com.caoccao.javet.interop.executors
    +
     
    +
    V8PathExecutor(V8Runtime, Path) - Constructor for class com.caoccao.javet.interop.executors.V8PathExecutor
    +
     
    +
    V8Property - Annotation Type in com.caoccao.javet.annotations
    +
    +
    The interface V8 property is for auto-registering JS property interception.
    +
    +
    v8Runtime - Variable in class com.caoccao.javet.interception.BaseJavetInterceptor
    +
     
    +
    v8Runtime - Variable in class com.caoccao.javet.interop.engine.JavetEngine
    +
     
    +
    v8Runtime - Variable in class com.caoccao.javet.interop.engine.JavetEngineGuard
    +
    +
    The V8 runtime.
    +
    +
    v8Runtime - Variable in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    v8Runtime - Variable in class com.caoccao.javet.interop.proxy.BaseJavetProxyHandler
    +
    +
    The V8 runtime.
    +
    +
    V8Runtime - Class in com.caoccao.javet.interop
    +
     
    +
    v8Runtime - Variable in class com.caoccao.javet.utils.receivers.JavetCallbackReceiver
    +
    +
    The V8 runtime.
    +
    +
    v8Runtime - Variable in class com.caoccao.javet.values.V8Value
    +
     
    +
    V8RuntimeSetter - Annotation Type in com.caoccao.javet.annotations
    +
    +
    The interface V8 runtime setter.
    +
    +
    v8RuntimeSetter - Variable in class com.caoccao.javet.interop.binding.BindingContext
    +
    +
    The V8 runtime setter.
    +
    +
    V8Script - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8Script(long) - Constructor for class com.caoccao.javet.values.reference.V8Script
    +
     
    +
    v8ScriptOrigin - Variable in class com.caoccao.javet.interop.executors.BaseV8Executor
    +
     
    +
    V8ScriptOrigin - Class in com.caoccao.javet.interop
    +
     
    +
    V8ScriptOrigin(String, int, int, int, boolean, boolean) - Constructor for class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    V8ScriptOrigin() - Constructor for class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    V8ScriptOrigin(String) - Constructor for class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    V8ScriptOrigin(String, int, int) - Constructor for class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    V8ScriptOrigin(String, int) - Constructor for class com.caoccao.javet.interop.V8ScriptOrigin
    +
     
    +
    V8StringExecutor - Class in com.caoccao.javet.interop.executors
    +
     
    +
    V8StringExecutor(V8Runtime) - Constructor for class com.caoccao.javet.interop.executors.V8StringExecutor
    +
     
    +
    V8StringExecutor(V8Runtime, String) - Constructor for class com.caoccao.javet.interop.executors.V8StringExecutor
    +
     
    +
    v8Value - Variable in class com.caoccao.javet.utils.JavetVirtualObject
    +
    +
    The V8 value.
    +
    +
    V8Value - Class in com.caoccao.javet.values
    +
     
    +
    V8Value() - Constructor for class com.caoccao.javet.values.V8Value
    +
     
    +
    V8ValueArguments - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueArray - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueArrayBuffer - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueBoolean - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueBoolean() - Constructor for class com.caoccao.javet.values.primitive.V8ValueBoolean
    +
     
    +
    V8ValueBoolean(boolean) - Constructor for class com.caoccao.javet.values.primitive.V8ValueBoolean
    +
     
    +
    V8ValueBuiltInJson - Class in com.caoccao.javet.values.reference.builtin
    +
     
    +
    V8ValueBuiltInJson(long) - Constructor for class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInJson
    +
     
    +
    V8ValueBuiltInObject - Class in com.caoccao.javet.values.reference.builtin
    +
    +
    The type V8 value built in object.
    +
    +
    V8ValueBuiltInObject(long) - Constructor for class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInObject
    +
    +
    Instantiates a new V 8 value built in object.
    +
    +
    V8ValueBuiltInPromise - Class in com.caoccao.javet.values.reference.builtin
    +
     
    +
    V8ValueBuiltInPromise(long) - Constructor for class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInPromise
    +
     
    +
    V8ValueBuiltInSymbol - Class in com.caoccao.javet.values.reference.builtin
    +
     
    +
    V8ValueBuiltInSymbol(long) - Constructor for class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    V8ValueDataView - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueDouble - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueDouble() - Constructor for class com.caoccao.javet.values.primitive.V8ValueDouble
    +
     
    +
    V8ValueDouble(double) - Constructor for class com.caoccao.javet.values.primitive.V8ValueDouble
    +
     
    +
    V8ValueError - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueFunction - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueFunction(long) - Constructor for class com.caoccao.javet.values.reference.V8ValueFunction
    +
     
    +
    V8ValueGlobalObject - Class in com.caoccao.javet.values.reference
    +
    +
    The type V8 value global object is a special object.
    +
    +
    V8ValueInteger - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueInteger() - Constructor for class com.caoccao.javet.values.primitive.V8ValueInteger
    +
     
    +
    V8ValueInteger(int) - Constructor for class com.caoccao.javet.values.primitive.V8ValueInteger
    +
     
    +
    V8ValueIterator<T extends V8Value> - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueLong - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueLong() - Constructor for class com.caoccao.javet.values.primitive.V8ValueLong
    +
     
    +
    V8ValueLong(long) - Constructor for class com.caoccao.javet.values.primitive.V8ValueLong
    +
     
    +
    V8ValueLong(String) - Constructor for class com.caoccao.javet.values.primitive.V8ValueLong
    +
     
    +
    V8ValueMap - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueNull - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueNull() - Constructor for class com.caoccao.javet.values.primitive.V8ValueNull
    +
     
    +
    V8ValueObject - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueObject(long) - Constructor for class com.caoccao.javet.values.reference.V8ValueObject
    +
     
    +
    V8ValuePrimitive<T> - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValuePrimitive() - Constructor for class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    V8ValuePrimitive(T) - Constructor for class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    V8ValuePromise - Class in com.caoccao.javet.values.reference
    +
    +
    The type V8 value promise.
    +
    +
    V8ValueProxy - Class in com.caoccao.javet.values.reference
    +
    +
    The type V8 value proxy.
    +
    +
    V8ValueReference - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueReferenceType - Enum in com.caoccao.javet.enums
    +
     
    +
    V8ValueRegExp - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueSet - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueSharedArrayBuffer - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueString - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueString() - Constructor for class com.caoccao.javet.values.primitive.V8ValueString
    +
     
    +
    V8ValueString(String) - Constructor for class com.caoccao.javet.values.primitive.V8ValueString
    +
     
    +
    V8ValueSymbol - Class in com.caoccao.javet.values.reference
    +
    +
    The type V8 value symbol.
    +
    +
    V8ValueSymbolObject - Class in com.caoccao.javet.values.reference
    +
    +
    The type V8 value symbol object.
    +
    +
    V8ValueSymbolType - Enum in com.caoccao.javet.enums
    +
     
    +
    V8ValueTypedArray - Class in com.caoccao.javet.values.reference
    +
    +
    The type V8 value typed array.
    +
    +
    V8ValueUndefined - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueUndefined() - Constructor for class com.caoccao.javet.values.primitive.V8ValueUndefined
    +
     
    +
    V8ValueUnknown - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueUnknown() - Constructor for class com.caoccao.javet.values.primitive.V8ValueUnknown
    +
     
    +
    V8ValueUnknown(String) - Constructor for class com.caoccao.javet.values.primitive.V8ValueUnknown
    +
     
    +
    V8ValueUtils - Class in com.caoccao.javet.utils
    +
    +
    The type V8 value utils.
    +
    +
    V8ValueWeakMap - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueWeakSet - Class in com.caoccao.javet.values.reference
    +
     
    +
    V8ValueZonedDateTime - Class in com.caoccao.javet.values.primitive
    +
     
    +
    V8ValueZonedDateTime() - Constructor for class com.caoccao.javet.values.primitive.V8ValueZonedDateTime
    +
     
    +
    V8ValueZonedDateTime(long) - Constructor for class com.caoccao.javet.values.primitive.V8ValueZonedDateTime
    +
     
    +
    V8ValueZonedDateTime(ZonedDateTime) - Constructor for class com.caoccao.javet.values.primitive.V8ValueZonedDateTime
    +
     
    +
    V8VirtualValue - Class in com.caoccao.javet.values.virtual
    +
    +
    The type V8 virtual value.
    +
    +
    V8VirtualValue(V8Runtime, Object) - Constructor for class com.caoccao.javet.values.virtual.V8VirtualValue
    +
    +
    Instantiates a new V8 virtual value.
    +
    +
    V8VirtualValueList - Class in com.caoccao.javet.values.virtual
    +
    +
    The type V8 virtual value list.
    +
    +
    V8VirtualValueList(V8Runtime, Object...) - Constructor for class com.caoccao.javet.values.virtual.V8VirtualValueList
    +
    +
    Instantiates a new V8 virtual value list.
    +
    +
    validateDepth(int) - Method in class com.caoccao.javet.interop.converters.JavetPrimitiveConverter
    +
    +
    Validate the stack depth.
    +
    +
    value - Variable in class com.caoccao.javet.values.primitive.V8ValuePrimitive
    +
     
    +
    value - Variable in class com.caoccao.javet.values.virtual.V8VirtualValue
    +
    +
    The Value.
    +
    +
    valueOf(String) - Static method in enum com.caoccao.javet.enums.JavetErrorType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum com.caoccao.javet.enums.JavetPromiseRejectEvent
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum com.caoccao.javet.enums.JSFunctionType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum com.caoccao.javet.enums.JSRuntimeType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum com.caoccao.javet.enums.JSScopeType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum com.caoccao.javet.enums.V8ValueReferenceType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf(String) - Static method in enum com.caoccao.javet.enums.V8ValueSymbolType
    +
    +
    Returns the enum constant of this type with the specified name.
    +
    +
    valueOf() - Method in class com.caoccao.javet.values.reference.V8ValueSymbolObject
    +
    +
    Value of V8 value symbol.
    +
    +
    values() - Static method in enum com.caoccao.javet.enums.JavetErrorType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum com.caoccao.javet.enums.JavetPromiseRejectEvent
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum com.caoccao.javet.enums.JSFunctionType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum com.caoccao.javet.enums.JSRuntimeType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum com.caoccao.javet.enums.JSScopeType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum com.caoccao.javet.enums.V8ValueReferenceType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values() - Static method in enum com.caoccao.javet.enums.V8ValueSymbolType
    +
    +
    Returns an array containing the constants of this enum type, in +the order they are declared.
    +
    +
    values - Variable in class com.caoccao.javet.values.virtual.V8VirtualValueList
    +
    +
    The Values.
    +
    +
    + + + +

    W

    +
    +
    warn - Variable in class com.caoccao.javet.interception.logging.JavetStandardConsoleInterceptor
    +
    +
    The Warn.
    +
    +
    warn(String) - Method in interface com.caoccao.javet.interfaces.IJavetLogger
    +
    +
    Warn.
    +
    +
    warn(String) - Method in class com.caoccao.javet.utils.JavetDefaultLogger
    +
     
    +
    weak - Variable in class com.caoccao.javet.values.reference.V8ValueReference
    +
     
    +
    WORKING_DIRECTORY - Static variable in class com.caoccao.javet.utils.JavetOSUtils
    +
     
    +
    + + + +

    Z

    +
    +
    ZERO_BYTE_PER_VALUE - Static variable in class com.caoccao.javet.values.reference.V8ValueTypedArray
    +
    +
    The constant ZERO_BYTE_PER_VALUE.
    +
    +
    ZONE_ID_UTC - Static variable in class com.caoccao.javet.utils.JavetDateTimeUtils
    +
    +
    The constant ZONE_ID_UTC.
    +
    +
    + + + +

    _

    +
    +
    _catch(V8ValueFunction) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Catch.
    +
    +
    _catch(String) - Method in interface com.caoccao.javet.values.reference.IV8ValuePromise
    +
    +
    Catch.
    +
    +
    _catch(V8ValueFunction) - Method in class com.caoccao.javet.values.reference.V8ValuePromise
    +
     
    +
    _for(String) - Method in class com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol
    +
     
    +
    +A B C D E F G H I J K L M N O P Q R S T U V W Z _ 
    + +
    + + + + + + + +
    + + + + diff --git a/docs/reference/javadoc/index.html b/docs/reference/javadoc/index.html new file mode 100644 index 000000000..8d90632dd --- /dev/null +++ b/docs/reference/javadoc/index.html @@ -0,0 +1,75 @@ + + + + + +javet 0.9.12 API + + + + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> + + + diff --git a/docs/reference/javadoc/index.rst b/docs/reference/javadoc/index.rst new file mode 100644 index 000000000..a26617ce3 --- /dev/null +++ b/docs/reference/javadoc/index.rst @@ -0,0 +1,3 @@ +============= +API Reference +============= \ No newline at end of file diff --git a/docs/reference/javadoc/overview-frame.html b/docs/reference/javadoc/overview-frame.html new file mode 100644 index 000000000..fe8555c45 --- /dev/null +++ b/docs/reference/javadoc/overview-frame.html @@ -0,0 +1,41 @@ + + + + + +Overview List (javet 0.9.12 API) + + + + + + +

     

    + + diff --git a/docs/reference/javadoc/overview-summary.html b/docs/reference/javadoc/overview-summary.html new file mode 100644 index 000000000..91f78c80e --- /dev/null +++ b/docs/reference/javadoc/overview-summary.html @@ -0,0 +1,263 @@ + + + + + +Overview (javet 0.9.12 API) + + + + + + + +
    + + + + + + + +
    + + +
    +

    javet 0.9.12 API

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Packages 
    PackageDescription
    com.caoccao.javet.annotations +
    Annotations classes for declarative coding and IDE intellisense.
    +
    com.caoccao.javet.entities +
    Built-in entities for default object conversion.
    +
    com.caoccao.javet.enums +
    Enums for various API.
    +
    com.caoccao.javet.exceptions +
    Exceptions and errors for error handling.
    +
    com.caoccao.javet.interception +
    Built-in interceptors.
    +
    com.caoccao.javet.interception.logging +
    Built-in interceptors for JS logging function console.log(), etc...
    +
    com.caoccao.javet.interfaces +
    Interfaces required by various internal and external API.
    +
    com.caoccao.javet.interop +
    Interoperation between JVM and C++ via JNI.
    +
    com.caoccao.javet.interop.binding +
    Callback data structure for binding context and method descriptor.
    +
    com.caoccao.javet.interop.callback +
    Callback bridge between JVM and C++ via JNI.
    +
    com.caoccao.javet.interop.converters +
    Built-in converters, interface and config.
    +
    com.caoccao.javet.interop.engine +
    Engine pool, config and guard.
    +
    com.caoccao.javet.interop.executors +
    Executors and interface.
    +
    com.caoccao.javet.interop.proxy +
    Dynamic proxy handlers for polyfilling Java interfaces with JS functions or objects.
    +
    com.caoccao.javet.node.modules +
    Reference classes for Node.js built-in modules.
    +
    com.caoccao.javet.utils +
    Built-in utilities.
    +
    com.caoccao.javet.utils.receivers +
    Built-in callback receivers.
    +
    com.caoccao.javet.values +
    Classes for V8 values.
    +
    com.caoccao.javet.values.primitive +
    Classes for V8 primitive values.
    +
    com.caoccao.javet.values.reference +
    Classes for V8 reference values.
    +
    com.caoccao.javet.values.reference.builtin +
    Classes for V8 built-in reference values.
    +
    com.caoccao.javet.values.virtual +
    Classes for V8 virtual reference values.
    +
    +
    + +
    + + + + + + + +
    + + + + diff --git a/docs/reference/javadoc/overview-tree.html b/docs/reference/javadoc/overview-tree.html new file mode 100644 index 000000000..abd23c182 --- /dev/null +++ b/docs/reference/javadoc/overview-tree.html @@ -0,0 +1,704 @@ + + + + + +Class Hierarchy (javet 0.9.12 API) + + + + + + + +
    + + + + + + + +
    + + + +
    +

    Class Hierarchy

    + +

    Interface Hierarchy

    + +

    Annotation Type Hierarchy

    +
      +
    • com.caoccao.javet.annotations.CheckReturnValue (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.NodeModule (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.V8BindEnabler (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.V8Function (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.V8Property (implements java.lang.annotation.Annotation)
    • +
    • com.caoccao.javet.annotations.V8RuntimeSetter (implements java.lang.annotation.Annotation)
    • +
    +

    Enum Hierarchy

    + +
    + +
    + + + + + + + +
    + + + + diff --git a/docs/reference/javadoc/package-list b/docs/reference/javadoc/package-list new file mode 100644 index 000000000..59bd54f9a --- /dev/null +++ b/docs/reference/javadoc/package-list @@ -0,0 +1,22 @@ +com.caoccao.javet.annotations +com.caoccao.javet.entities +com.caoccao.javet.enums +com.caoccao.javet.exceptions +com.caoccao.javet.interception +com.caoccao.javet.interception.logging +com.caoccao.javet.interfaces +com.caoccao.javet.interop +com.caoccao.javet.interop.binding +com.caoccao.javet.interop.callback +com.caoccao.javet.interop.converters +com.caoccao.javet.interop.engine +com.caoccao.javet.interop.executors +com.caoccao.javet.interop.proxy +com.caoccao.javet.node.modules +com.caoccao.javet.utils +com.caoccao.javet.utils.receivers +com.caoccao.javet.values +com.caoccao.javet.values.primitive +com.caoccao.javet.values.reference +com.caoccao.javet.values.reference.builtin +com.caoccao.javet.values.virtual diff --git a/docs/reference/javadoc/script.js b/docs/reference/javadoc/script.js new file mode 100644 index 000000000..c3a1cae44 --- /dev/null +++ b/docs/reference/javadoc/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/docs/reference/javadoc/serialized-form.html b/docs/reference/javadoc/serialized-form.html new file mode 100644 index 000000000..c32b8921d --- /dev/null +++ b/docs/reference/javadoc/serialized-form.html @@ -0,0 +1,206 @@ + + + + + +Serialized Form (javet 0.9.12 API) + + + + + + + + + + +
    +

    Serialized Form

    +
    +
    + +
    + + + + + + diff --git a/docs/reference/javadoc/stylesheet.css b/docs/reference/javadoc/stylesheet.css new file mode 100644 index 000000000..b8dad0891 --- /dev/null +++ b/docs/reference/javadoc/stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/docs/reference/load_and_unload.html b/docs/reference/load_and_unload.html new file mode 100644 index 000000000..95257a92c --- /dev/null +++ b/docs/reference/load_and_unload.html @@ -0,0 +1,391 @@ + + + + + + + + Load and Unload - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Load and Unload¶

    +

    As documented in Javet Design, Javet supports loading and unloading the JNI libraries during runtime in both Node.js and V8 modes.

    +
    +

    How?¶

    +
    +

    Unload¶

    +

    Assuming the JNI library per mode is already loaded, here are the step-by-step on how to unload it.

    +
    // Step 1: Set library reloadable. Why? Because Javet defaults that switch to false.
    +V8Host.setLibraryReloadable(true);
    +// Step 2: Get V8Host per JS runtime type.
    +V8Host v8Host = V8Host.getInstance(jsRuntimeType);
    +// Step 3: Unload the library.
    +v8Host.unloadLibrary();
    +// Step 4: Restore the switch.
    +V8Host.setLibraryReloadable(false);
    +
    +
    +

    How does unloadLibrary() work? There is no API that allows unloading a JNI library explicitly. The only way is GC will automatically unload the library if all references to that library are garbage collectable. So, application is supposed to close all V8 values, V8 runtimes prior to calling unloadLibrary().

    +
    +
    +

    Load¶

    +

    Assuming the JNI library per mode is already unloaded, here are the step-by-step on how to load it again.

    +
    // Step 1: Get V8Host per JS runtime type.
    +V8Host v8Host = V8Host.getInstance(jsRuntimeType);
    +// Step 2: Load the library.
    +v8Host.loadLibrary();
    +
    +
    +
    +
    +
    +

    Notes¶

    +
      +
    • unloadLibrary() can only take effect after all references are garbage collectable.

    • +
    • loadLibrary() is internally called by Javet at the first time and only takes effect after unloadLibrary() is called.

    • +
    • loadLibrary() and unloadLibrary() are for experiment only. They may be unstable and crash JVM. Please use this feature at your own risk.

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/load_and_unload.rst b/docs/reference/load_and_unload.rst index 1b358b642..3a77133b8 100644 --- a/docs/reference/load_and_unload.rst +++ b/docs/reference/load_and_unload.rst @@ -2,7 +2,7 @@ Load and Unload =============== -As documented in `design <../development/design.rst>`_, Javet supports loading and unloading the JNI libraries during runtime in both Node.js and V8 modes. +As documented in :doc:`../development/design`, Javet supports loading and unloading the JNI libraries during runtime in both Node.js and V8 modes. How? ==== @@ -43,5 +43,3 @@ Notes * ``unloadLibrary()`` can only take effect after all references are garbage collectable. * ``loadLibrary()`` is internally called by Javet at the first time and only takes effect after ``unloadLibrary()`` is called. * ``loadLibrary()`` and ``unloadLibrary()`` are for experiment only. **They may be unstable and crash JVM. Please use this feature at your own risk.** - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/lock.html b/docs/reference/lock.html new file mode 100644 index 000000000..cf43dfec0 --- /dev/null +++ b/docs/reference/lock.html @@ -0,0 +1,389 @@ + + + + + + + + Know the Lock - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Know the Lock¶

    +
    +

    What does Lock Mean in Javet?¶

    +

    V8 runtime runs in an isolated and single-threaded environment so that there is no race condition issue. How about playing V8 runtime in JVM among multiple threads? Yes, that is possible in 2 modes.

    +
    +

    1. Implicit Mode¶

    +

    Javet automatically handles the lock() and unlock() regardless of thread context switch. So, in most of the cases, application just calls regular API without calling single line of locking API.

    +
    +
    +

    2. Explicit Mode¶

    +

    In explicit mode, application just needs to surround the code block with a V8Locker applied by try-with-resource. Internally, Javet allocates a long-live V8 locker instead of creating V8 locker per API call to achieve better performance.

    +
    try (V8Locker v8Locker = v8Runtime.getV8Locker()) {
    +    // Do whatever you want to do.
    +}
    +
    +
    +

    Be careful, V8Locker cannot be nested, otherwise checked exception will be thrown reporting lock conflict. Also, if the JS runtime type is Node.js, calling resetContext() or resetIsolate() may trigger core dump. Please refer to the source code for detail.

    +
    +
    +
    +

    Comparisons¶

    +
    +

    Performance¶

    +

    Implicit mode comes with a slight performance overhead in V8 because every native call is protected by a new V8 locker.

    +

    Explicit mode is designed for performance sensitive work. In extreme performance test cases, the performance improvement may be up to 150% compared to implicit mode.

    +
    +
    +

    Thread-safety¶

    +

    Implicit mode is thread-safe because its locking granularity is at API call level. Multiple threads are free to share the same V8 runtime in concurrent scenarios. Of course, be careful that JavaScript variables may be changed by other threads. It's better not to touch the same JavaScript variable among multiple threads, otherwise, Javet may crash. Yes, crash, because Javet doesn't perform this kind of check.

    +

    Explicit mode is NOT thread-safe because it's designed to improve performance in single-threaded scenarios. Sharing V8 locker protected V8 runtime among multiple threads will result in Javet crash immediately.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/lock.rst b/docs/reference/lock.rst index 97cd90e44..81c6fd2aa 100644 --- a/docs/reference/lock.rst +++ b/docs/reference/lock.rst @@ -23,7 +23,7 @@ In explicit mode, application just needs to surround the code block with a ``V8L // Do whatever you want to do. } -Be careful, ``V8Locker`` cannot be nested, otherwise checked exception will be thrown reporting lock conflict. Also, if the JS runtime type is Node.js, calling ``resetContext()`` or ``resetIsolate()`` may trigger core dump. Please refer to `TestPerformance.java <../../src/test/java/com/caoccao/javet/interop/engine/TestPerformance.java>`_ for detail. +Be careful, ``V8Locker`` cannot be nested, otherwise checked exception will be thrown reporting lock conflict. Also, if the JS runtime type is Node.js, calling ``resetContext()`` or ``resetIsolate()`` may trigger core dump. Please refer to the :extsource2:`source code <../../src/test/java/com/caoccao/javet/interop/engine/TestPerformance.java>` for detail. Comparisons =========== @@ -41,5 +41,3 @@ Thread-safety Implicit mode is thread-safe because its locking granularity is at API call level. Multiple threads are free to share the same V8 runtime in concurrent scenarios. Of course, be careful that JavaScript variables may be changed by other threads. It's better not to touch the same JavaScript variable among multiple threads, otherwise, Javet may crash. Yes, crash, because Javet doesn't perform this kind of check. Explicit mode is **NOT** thread-safe because it's designed to improve performance in single-threaded scenarios. Sharing V8 locker protected V8 runtime among multiple threads will result in Javet crash immediately. - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/logging.html b/docs/reference/logging.html new file mode 100644 index 000000000..1bc09fccf --- /dev/null +++ b/docs/reference/logging.html @@ -0,0 +1,419 @@ + + + + + + + + Logging - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Logging¶

    +

    As Javet is a fundamental SDK, it doesn't rely on any other libraries except JDK so that Javet users don't get dependency hell. That also means Javet has to use the JDK logging API, but Javet allows injecting 3rd party logging API.

    +
    +

    Step 1: Implement IJavetLogger¶

    +

    IJavetLogger is the the only logging interface accepted by Javet. You may implement IJavetLogger with slf4j as following.

    +
    import com.caoccao.javet.interfaces.IJavetLogger;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +
    +public class MyJavetLogger implements IJavetLogger {
    +    protected Logger logger;
    +
    +    public MyJavetLogger(String name) {
    +        logger = LoggerFactory.getLogger(name);
    +    }
    +
    +    @Override
    +    public void debug(String message) {
    +        if (logger.isDebugEnabled()) {
    +            logger.debug(message);
    +        }
    +    }
    +
    +    @Override
    +    public void error(String message) {
    +        if (logger.isDebugEnabled()) {
    +            logger.error(message);
    +        }
    +    }
    +
    +    @Override
    +    public void error(String message, Throwable throwable) {
    +        if (logger.isDebugEnabled()) {
    +            logger.error(message, throwable);
    +        }
    +    }
    +
    +    @Override
    +    public void info(String message) {
    +        if (logger.isInfoEnabled()) {
    +            logger.info(message);
    +        }
    +    }
    +
    +    @Override
    +    public void warn(String message) {
    +        if (logger.isWarnEnabled()) {
    +            logger.warn(message);
    +        }
    +    }
    +}
    +
    +
    +
    +
    +

    Step 2: Inject the Logger¶

    +

    Injecting the logger is quite simple.

    +
      +
    • Create an instance of the logger.

    • +
    • Set the logger to a config.

    • +
    • Set the config to a pool.

    • +
    +
    MyJavetLogger javetLogger = new MyJavetLogger("TestLogger");
    +JavetEngineConfig javetEngineConfig = new JavetEngineConfig();
    +javetEngineConfig.setJavetLogger(javetLogger);
    +JavetEnginePool javetEnginePool = new JavetEnginePool(javetEngineConfig);
    +
    +
    +

    Now, Javet is integrated into your logging system.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/logging.rst b/docs/reference/logging.rst index 09fe72a81..ec7b55889 100644 --- a/docs/reference/logging.rst +++ b/docs/reference/logging.rst @@ -75,5 +75,3 @@ Injecting the logger is quite simple. JavetEnginePool javetEnginePool = new JavetEnginePool(javetEngineConfig); Now, Javet is integrated into your logging system. - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/memory_management.html b/docs/reference/memory_management.html new file mode 100644 index 000000000..a8e571853 --- /dev/null +++ b/docs/reference/memory_management.html @@ -0,0 +1,580 @@ + + + + + + + + Memory Management - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Memory Management¶

    +
    +

    3 Challenges in Memory Management¶

    +
    +

    JVM GC¶

    +

    JVM is known to have a GC that manages memory automatically. However, that doesn't cover the objects in JNI native implementation. Once NewGlobalRef(javaObject) is called, that javaObject lives forever in JVM until DeleteGlobalRef(javaObject) is called.

    +
    +
    +

    C++ Runtime¶

    +

    Smart pointers in C++ cannot easily work across JNI to JVM, in other words, raw pointers are directly referenced in JVM as long. C++ runtime has no idea when to free the memory of those raw pointers unless JVM tells C++ runtime to release via JNI.

    +
    +
    +

    V8 GC¶

    +

    V8 generally categorizes objects in memory to 3 types.

    +
      +
    1. v8::Local - It lives within the local scope of a C++ function call.

    2. +
    3. v8::Persistent - Its lifecycle is managed by V8 GC.

    4. +
    5. v8::External - V8 GC treats it as root object so that it lives as long as the V8 isolate lives.

    6. +
    +

    The awful thing in V8 GC is V8 does not make final callback when a context is being closed. From V8 perspective, that's a performance improvement. But from Javet perspective, Javet cannot completely rely on V8 to do the resource management. So, Javet keeps track of all unmanaged resource and makes sure there is no memory leak in all cases.

    +
    +
    + +
    +

    Alternative Option: ArrayBuffer¶

    +

    The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer.

    +

    It is an array of bytes, often referred to in other languages as a "byte array".You cannot directly manipulate the contents of an ArrayBuffer; instead, you create one of the typed array objects or a DataView object which represents the buffer in a specific format, and use that to read and write the contents of the buffer.

    +

    Javet offers complete support to all the typed arrays as well as DataView as following. There is a java.nio.ByteBuffer inside every typed array and DataView. That ByteBuffer directly links to the corresponding backing store of V8 typed array. In other words, Javet and V8 can both access the same address to achieve zero memory copy. Please consider using typed array in performance sensitive scenarios.

    +
    ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Type

    Value Range

    Size in bytes

    Description

    Web IDL type

    Equivalent C type

    Int8Array

    -128 to 127

    1

    8-bit two's complement signed integer

    byte

    int8_t

    Uint8Array

    0 to 255

    1

    8-bit unsigned integer

    octet

    uint8_t

    Uint8ClampedArray

    0 to 255

    1

    8-bit unsigned integer (clamped)

    octet

    uint8_t

    Int16Array

    -32768 to 32767

    2

    16-bit two's complement signed integer

    short

    int16_t

    Uint16Array

    0 to 65535

    2

    16-bit unsigned integer

    unsigned short

    uint16_t

    Int32Array

    -2147483648 to 2147483647

    4

    32-bit two's complement signed integer

    long

    int32_t

    Uint32Array

    0 to 4294967295

    4

    32-bit unsigned integer

    unsigned long

    uint32_t

    Float32Array

    1.2×10-38 to 3.4×1038

    4

    32-bit IEEE floating point number (7 significant digits e.g., 1.234567)

    unrestricted float

    float

    Float64Array

    5.0×10-324 to 1.8×10308

    8

    64-bit IEEE floating point number (16 significant digits e.g., 1.23456789012345)

    unrestricted double

    double

    BigInt64Array

    -263 to 263-1

    8

    64-bit two's complement signed integer

    bigint

    int64_t (signed long long)

    BigUint64Array

    0 to 264-1

    8

    64-bit unsigned integer

    bigint

    uint64_t (unsigned long long)

    +

    Please refer to TestV8ValueTypedArray and TestV8ValueDataView for sample code snippets.

    +
    +
    +

    GC¶

    +
    +

    Automatic GC¶

    +

    Javet has built-in automatic GC in both Node.js mode and V8 mode. Why? In high frequency API calling area, V8 may not keep up with the GC pace that JVM performs. Sometimes, JVM is running out of heap memory whereas V8 holds many zombie objects that are referenced by Javet in JVM. In this case, JVM ignores those objects unless V8 releases them in V8 GC cycle.

    +
    +

    Passive GC¶

    +

    So, how to notify V8 GC that Java heap memory pool is running out of space? Javet automates this via V8Host and V8Notifier. By default, this feature is disabled. Here is the step-by-step on how to enable this feature.

    +
      +
    1. (Optional) Call V8Host.setMemoryUsageThresholdRatio(double) to set memory usage threshold ratio. This is optional because the default value is 0.7.

    2. +
    3. Call V8Host.getNodeInstance().enableGCNotification() or V8Host.getV8Instance().enableGCNotification() to enable the notification.

    4. +
    +

    Here is a sample heap memory usage with default memory usage threshold ration and -Xms64m -Xmx64m. Please note that in this sample, application is under high pressure of creating and destroying V8 objects. In normal cases, the curve is much smoother.

    +Javet Memory Management Passive GC +

    What happens internally is as following.

    +
      +
    1. V8Notifier listens to the heap memory notification from JVM per V8Host instance.

    2. +
    3. JVM notifies V8Notifier that memory threshold exceeds.

    4. +
    5. V8Notifier broadcasts GC scheduled flag to all V8Runtime managed by the V8Host instance.

    6. +
    7. Each V8Runtime performs GC in its own isolate.

    8. +
    +
    +
    +

    Aggressive GC¶

    +

    Just get V8Runtime from Javet engine pool that aggressively sends GC notification to idle engine in daemon thread. There is no performance overhead because:

    +
      +
    • The engine performs GC when it is idle in a dedicated thread.

    • +
    • Javet engine pool is lock free so that the GC doesn't affect other worker threads.

    • +
    +

    Of course, this behavior can be turned off by calling JavetEngineConfig.setAutoSendGCNotification(false).

    +
    +
    +
    +

    Manual GC¶

    +

    There are 3 ways of manually triggering GC in both Node.js mode and V8 mode.

    +
    +

    V8Runtime.await()¶

    +

    This API represents a light-weighted way of giving V8 a hint to perform GC. It actually tells Node.js or V8 runtime to drain the message or task queue. As a side effect of the drain, a GC may occur based on the decision of Node.js or V8 runtime.

    +
    +
    +

    V8Runtime.idleNotificationDeadline(long deadlineInMillis)¶

    +

    This API explicitly tells Node.js or V8 runtime that the application expects a GC to happen in the given milliseconds. Be careful, Node.js or V8 runtime may disregard this instruction.

    +
    +
    +

    V8Runtime.lowMemoryNotification()¶

    +

    This API explicitly tells Node.js or V8 runtime to perform a GC immediately. It is also used in automatic GC aforementioned.

    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/memory_management.rst b/docs/reference/memory_management.rst index 77c257152..0e850c637 100644 --- a/docs/reference/memory_management.rst +++ b/docs/reference/memory_management.rst @@ -31,8 +31,8 @@ Recommended Options Javet directly borrows the way V8 manages objects in JVM. The rule is simple in the following 2 Options. -Automatic Management with ``try-with-resource`` ------------------------------------------------ +Automatic Management with try-with-resource +------------------------------------------- .. code-block:: java @@ -96,7 +96,7 @@ Javet offers complete support to all the typed arrays as well as ``DataView`` as | BigUint64Array | 0 to 264-1 | 8 | 64-bit unsigned integer | bigint | uint64_t (unsigned long long) | +-------------------+-----------------------------+---------------+------------------------------------------------------------------------------------+---------------------+-------------------------------+ -Please refer to `TestV8ValueTypedArray <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueTypedArray.java>`_ and `TestV8ValueDataView <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueDataView.java>`_ for sample code snippets. +Please refer to :extsource2:`TestV8ValueTypedArray <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueTypedArray.java>` and :extsource2:`TestV8ValueDataView <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueDataView.java>` for sample code snippets. GC == @@ -116,7 +116,7 @@ So, how to notify V8 GC that Java heap memory pool is running out of space? Jave Here is a sample heap memory usage with default memory usage threshold ration and ``-Xms64m -Xmx64m``. Please note that in this sample, application is under high pressure of creating and destroying V8 objects. In normal cases, the curve is much smoother. -.. image:: ../resources/images/javet_memory_management_passive_gc.png?raw=true +.. image:: ../resources/images/javet_memory_management_passive_gc.png :alt: Javet Memory Management Passive GC What happens internally is as following. @@ -141,19 +141,17 @@ Manual GC There are 3 ways of manually triggering GC in both Node.js mode and V8 mode. -``V8Runtime.await()`` -^^^^^^^^^^^^^^^^^^^^^ +V8Runtime.await() +^^^^^^^^^^^^^^^^^ This API represents a light-weighted way of giving V8 a hint to perform GC. It actually tells Node.js or V8 runtime to drain the message or task queue. As a side effect of the drain, a GC may occur based on the decision of Node.js or V8 runtime. -``V8Runtime.idleNotificationDeadline(long deadlineInMillis)`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +V8Runtime.idleNotificationDeadline(long deadlineInMillis) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This API explicitly tells Node.js or V8 runtime that the application expects a GC to happen in the given milliseconds. Be careful, Node.js or V8 runtime may disregard this instruction. -``V8Runtime.lowMemoryNotification()`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +V8Runtime.lowMemoryNotification() +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This API explicitly tells Node.js or V8 runtime to perform a GC immediately. It is also used in automatic GC aforementioned. - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/modularization.html b/docs/reference/modularization.html new file mode 100644 index 000000000..66428fbf5 --- /dev/null +++ b/docs/reference/modularization.html @@ -0,0 +1,566 @@ + + + + + + + + Modularization - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Modularization¶

    +
    +

    Node.js Mode¶

    +
    +

    Example¶

    +

    In Node.js mode, Javet leaves Node.js with its own ways of handling modules. The coding experience is identical to the one in Node.js and applications can get all features supported by Javet, like function interception. Here is an example.

    +
    try (JavetEnginePool<NodeRuntime> javetEnginePool = new JavetEnginePool<NodeRuntime>()) {
    +    javetEnginePool.getConfig().setJSRuntimeType(JSRuntimeType.Node);
    +    try (IJavetEngine<NodeRuntime> iJavetEngine = javetEnginePool.getEngine()) {
    +        NodeRuntime nodeRuntime = iJavetEngine.getV8Runtime();
    +        Path workingDirectory = new File(JavetOSUtils.WORKING_DIRECTORY, "scripts/node/test-node").toPath();
    +        // Set the require root directory so that Node.js is able to locate node_modules.
    +        nodeRuntime.getNodeModule(NodeModuleModule.class).setRequireRootDirectory(workingDirectory);
    +        getLogger().logInfo("1.23 + 2.34 = {0}", nodeRuntime.getExecutor(
    +                "const Decimal = require('decimal.js');" +
    +                        "const a = new Decimal(1.23);" +
    +                        "const b = new Decimal(2.34);" +
    +                        "a.add(b).toString();").executeString());
    +    }
    +}
    +
    +
    +
    +
    +

    Gaps between Javet Node.js Mode and Native Node.js¶

    +
    +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Feature

    Javet Node.js Mode

    Native Node.js

    require() Root

    Java Application Working Directory

    JavaScript Application Working Directory

    Working Directory

    Java Application Working Directory

    JavaScript Application Working Directory

    __dirname

    N/A

    Yes

    __filename

    N/A

    Yes

    Module Mode

    default: false

    default: true

    +

    Usually the Java application working directory doesn't contain node_modules. That for sure breaks Node.js. No worry, here are the steps on closing the gaps.

    +
      +
    1. Set the require() root directory so that Node.js is able to locate node_modules.

    2. +
    3. Set working directory to where the script is located.

    4. +
    5. Set __dirname.

    6. +
    7. Set __filename.

    8. +
    +

    Luckily, in Javet, when getExecutor(File scriptFile) or getExecutor(Path scriptPath) is called, all these 4 steps are automatically performed. If getExecutor(String scriptString) is called, obviously Javet doesn't know what to do, but application may call IV8Executor.setResourceName(String resourceName) later to perform these 4 steps. So, Javet Node.js mode doesn't care where the script comes from. Application may feel free to virtualize Node.js.

    +

    Can Javet run script in Node.js Module Mode? Yes, just call IV8Executor.setModule(true).

    +

    The exciting thing is: in Javet, applications may have multiple instances of Node.js pointing to different node_modules and potentially these Node.js instances can share the same piece of data.

    +
    +
    +

    Deal with Native Modules¶

    +

    Node.js native modules usually cannot be dynamically loaded to Javet. E.g. sqlite3. That issue also bothers Electron. Electron folks created project electron-rebuild which rebuilds the native modules from source code and its own native symbols.

    +

    Javet follows the same approach on Windows, and a simpler approach on Linux.

    +
    +

    Patch ELF Native Modules on Linux¶

    +

    The native modules on Linux don't know the existence of Javet. When they look up Node.js symbols which are provided by Javet, they just fail with errors like the following.

    +
    +

    com.caoccao.javet.exceptions.JavetExecutionException: Error: /....../node_modules/sqlite3/lib/binding/napi-v3-linux-x64/node_sqlite3.node: undefined symbol: napi_create_error

    +
    +

    The fix is very simple. Here is a sample sqlite3.

    +
    # Install patchelf on Ubuntu (Optional)
    +sudo apt install patchelf
    +cd scripts/node
    +# Install sqlite3
    +npm install
    +cd javet-rebuild
    +export NODE_MODULE_FILE="../node_modules/sqlite3/lib/binding/napi-v3-linux-x64/node_sqlite3.node"
    +./rebuild.sh
    +
    +
    +

    The rebuild.sh actually calls patchelf to add Javet to the node module's dependency.

    +
    +
    +

    Rebuild Native Modules on Windows¶

    +

    The native modules on Windows don't know the existence of Javet. Windows dynamic library loading API LoadLibraryExW throws the following error.

    +
    +

    A dynamic link library (DLL) initialization routine failed.

    +
    +

    The fix is a bit complicated.

    +
      +
    • Prepare the Windows build environment by following Build Javet.

    • +
    • Install the node modules from source code npm install --build-from-source.

    • +
    • Download the corresponding Javet library file from this drive.

    • +
    • Unzip the Javet library file somewhere.

    • +
    • Create a rebuild script pointing to the Javet library file by referencing rebuild-sqlite3.cmd and rebuild.cmd.

    • +
    • Run the rebuild script.

    • +
    +

    The rebuild script actually replaces node.lib with libjavet....lib during the rebuild so that the new node modules can tell LoadLibraryExW to look for Javet instead of Node.js.

    +

    Javet calls for someone who can voluntarily host the Javet libraries and Javet compatible node modules so that major Javet users don't need to go through these. For now, it has to be a pretty manual work.

    +
    +
    +

    Caution!¶

    +
      +
    • Once the node modules are patched or rebuilt, they can only be loaded by that particular version of Javet and they cannot be loaded by Node.js any more.

    • +
    • Make backups.

    • +
    +
    +
    +
    +
    +

    V8 Mode¶

    +

    In V8 mode, there is no out-of-box support to ES6 dynamic import. But, Javet provides complete support on top of V8. There are 2 ways of playing around with the ES6 dynamic import: Pre-load and On-demand.

    +
    +

    Pre-load¶

    +

    Javet stores compiled modules in a map with key = module path, value = compiled module. When V8 meets a new module to be imported, Javet will look up the map and return the compiled module to V8. So, in order to simulate dynamic import, application needs to compile those required modules before the final execution.

    +

    For instance: The dependency is as following.

    +
    Application
    +├─A
    +│ ├─a.js (depends on b.js)
    +│ └─B
    +│   └─b.js
    +├─C
    +│ └─c.js
    +└─d.js
    +
    +
    +

    The execution steps are as following.

    +
      +
    1. Compile module ./A/B/b.js

    2. +
    3. Compile module ./A/a.js

    4. +
    5. Compile module ./C/c.js

    6. +
    7. Compile module ./d.js

    8. +
    9. Launch the application

    10. +
    +

    Here is an example. Assuming test.js depends on module.js, the code looks like the following.

    +
    String codeString = "export function testFromModule() { return { a: 1 }; };";
    +// Step 1: Assign a resource name to a piece of code.
    +IV8Executor iV8Executor = v8Runtime.getExecutor(codeString).setResourceName("./module.js");
    +// Step 2: Compile the module.js.
    +try (V8Module v8Module = iV8Executor.compileModule()) {
    +    // Step 3: Evaluate the module.js.
    +    v8Module.executeVoid();
    +    if (v8Runtime.containsModule("./module.js")) {
    +        System.out.println("./module.js is registered as a module.");
    +    }
    +    codeString = "import { testFromModule } from './module.js'; testFromModule();";
    +    // Step 4: Do the same to test.js.
    +    iV8Executor = v8Runtime.getExecutor(codeString).setResourceName("./test.js").setModule(true);
    +    // Step 5: Compile and evaluate test.js and Javet will automatically feed V8 with module.js.
    +    try (V8ValueObject v8ValueObject = iV8Executor.execute()) {
    +        // Step 6: Verify the module.js taking effect.
    +        System.out.println("Variable a = " + v8ValueObject.getInteger("a") + ".");
    +    }
    +}
    +
    +
    +
    +
    +

    On-demand¶

    +

    Obviously, pre-loading modules requires application to analyze the code for complete dependency. That is too heavy in most of the cases. Luckily, Javet also supports registering a module resolver which is called back when the modules are being imported. With the module resolver, application doesn't need to analyze the code for dependency. Of course, application is responsible for security check.

    +

    Here is an example. Assuming test.js depends on module.js, the code looks like the following.

    +
    // Step 1: Create a V8 runtime from V8 host in try-with-resource.
    +try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) {
    +    // Step 2: Register a custom module resolver.
    +    v8Runtime.setV8ModuleResolver((runtime, resourceName, v8ModuleReferrer) -> {
    +        // Step 3: Compile module.js from source code if the resource name matches.
    +        if ("./module.js".equals(resourceName)) {
    +            return runtime.getExecutor("export function test() { return 1; }")
    +                    .setResourceName(resourceName).compileV8Module();
    +        } else {
    +            return null;
    +        }
    +    });
    +    // Step 4: Import module.js in test.js and expose test() in global context.
    +    v8Runtime.getExecutor("import { test } from './module.js'; globalThis.test = test;")
    +            .setModule(true).setResourceName("./test.js").executeVoid();
    +    // Step 5: Call test() in global context.
    +    System.out.println("test() -> " + v8Runtime.getExecutor("test()").executeInteger());
    +}
    +
    +
    +

    It is V8 that performs the dependency analysis. Javet just relays the callback to application and actively caches the compiled modules so that the module resolver is only called one time per module.

    +
    +
    +
    +

    Internals¶

    +

    How Javet and V8 work internally for supporting modules can be found at Javet Design.

    +Javet Module System +

    Please note that the way Javet handles dynamic import in V8 mode can be applied to Node.js mode. That means all Node.js modules can be virtualized by Javet.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/modularization.rst b/docs/reference/modularization.rst index efe55b40b..1287ce081 100644 --- a/docs/reference/modularization.rst +++ b/docs/reference/modularization.rst @@ -91,7 +91,7 @@ The native modules on Windows don't know the existence of Javet. Windows dynamic The fix is a bit complicated. -* Prepare the Windows build environment by following `Build Javet <../development/build.rst>`_. +* Prepare the Windows build environment by following :doc:`../development/build`. * Install the node modules from source code ``npm install --build-from-source``. * Download the corresponding Javet library file from this `drive `_. * Unzip the Javet library file somewhere. @@ -196,11 +196,9 @@ It is V8 that performs the dependency analysis. Javet just relays the callback t Internals ========= -How Javet and V8 work internally for supporting modules can be found at `here <../development/design.rst>`_. +How Javet and V8 work internally for supporting modules can be found at :doc:`../development/design`. -.. image:: ../resources/images/javet_module_system.png?raw=true +.. image:: ../resources/images/javet_module_system.png :alt: Javet Module System Please note that the way Javet handles dynamic import in V8 mode can be applied to Node.js mode. That means all Node.js modules can be virtualized by Javet. - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/performance.html b/docs/reference/performance.html new file mode 100644 index 000000000..e999feba6 --- /dev/null +++ b/docs/reference/performance.html @@ -0,0 +1,429 @@ + + + + + + + + Javet Performance - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Javet Performance¶

    +

    In V8, a context is an execution environment that allows separate, unrelated, JavaScript applications to run in a single instance of V8.

    +

    It's recommended to reset context if a new execution environment is required.

    +
    +

    Result¶

    +

    Here is the performance test result from i7 10700K + Windows 10. Test case is just 1 + 1 = 2.

    +
    +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Type

    Case

    TPS

    Node

    Single Context with 1 Thread

    751,032

    Node

    Ad-hoc Context with 1 Thread

    65

    Node

    Single Context with 8 Threads

    4,410,143

    Node

    Ad-hoc Context with 8 Threads

    363

    Node

    Ad-hoc Isolate with 1 Thread

    51

    Node

    Ad-hoc Isolate with 8 Threads

    263

    V8

    Single Context with 1 Thread

    647,458

    V8

    Ad-hoc Context with 1 Thread

    2,846

    V8

    Single Context with 8 Threads

    3,968,253

    V8

    Ad-hoc Context with 8 Threads

    16,508

    V8

    Ad-hoc Isolate with 1 Thread

    748

    V8

    Ad-hoc Isolate with 8 Threads

    3,660

    +
    +
    +

    Highlights¶

    +
      +
    • Node.js performs slightly better in Single Context mode mainly because the V8 embedded in Node.js is much older than the built-in V8.

    • +
    • Built-in V8 dramatically outperforms Node.js in Ad-hoc mode mainly because Node.js comes with a huge overhead that seriously slows down the context and isolate creation and recycle.

    • +
    • It's recommended to use built-in V8 unless Node.js is required in some particular cases.

    • +
    • Node.js on Linux is built as position independent code which comes with an additional performance overhead.

    • +
    +

    Reference: https://v8.dev/docs/embed#contexts

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/performance.rst b/docs/reference/performance.rst index b14178c42..d4995fd19 100644 --- a/docs/reference/performance.rst +++ b/docs/reference/performance.rst @@ -37,5 +37,3 @@ Highlights * Node.js on Linux is built as `position independent code `_ which comes with an additional performance overhead. Reference: https://v8.dev/docs/embed#contexts - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/termination.html b/docs/reference/termination.html new file mode 100644 index 000000000..fa8d64bee --- /dev/null +++ b/docs/reference/termination.html @@ -0,0 +1,413 @@ + + + + + + + + Termination - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Termination¶

    +

    Terminating scripts that run out of control is quite important in terms of protecting the applications from being attacked by malicious scripts. In Javet, there are 2 typical ways of terminating scripts.

    +
    +

    Automatic Termination with Pool and Engine¶

    +

    IJavetEngineGuard is the built-in support for terminating a script which runs out of control.

    +
    // Get an engine from the pool as usual.
    +try (IJavetEngine iJavetEngine = iJavetEnginePool.getEngine()) {
    +    V8Runtime v8Runtime = iJavetEngine.getV8Runtime();
    +    // Get a guard from the engine and apply try-with-resource pattern.
    +    try (IJavetEngineGuard iJavetEngineGuard = iJavetEngine.getGuard(10000)) {
    +        v8Runtime.getExecutor("while (true) {}").executeVoid();
    +        // That infinite loop will be terminated in 10 seconds by the guard.
    +    } catch (JavetTerminatedException e) {
    +        // JavetTerminatedException will be thrown to mark that.
    +        assertFalse(e.isContinuable());
    +    }
    +    assertEquals(2, v8Runtime.getExecutor("1 + 1").executeInteger(),
    +            "The V8 runtime is not dead and still be able to execute code afterwards.");
    +}
    +
    +
    +

    Does IJavetEngineGuard hang normal scripts till timeout is hit? No, it doesn't cause any overhead. If the script completes, IJavetEngineGuard.close() will be called via try-with-resource pattern and cancel the daemon thread immediately.

    +

    Please refer to the source code for more detail.

    +
    +
    +

    Manual Termination¶

    +

    Manual termination gives applications complete control. In return, the coding effort is considerable.

    +
    V8Host v8Host = V8Host.getV8Instance();
    +try (V8Runtime v8Runtime = v8Host.createV8Runtime()) {
    +    // Create a daemon thread monitoring the V8 runtime status.
    +    Thread daemonThread = new Thread(() -> {
    +        // V8 runtime isInUse() does not require lock.
    +        while (!v8Runtime.isInUse()) {
    +            try {
    +                TimeUnit.MILLISECONDS.sleep(1);
    +            } catch (InterruptedException e) {
    +                e.printStackTrace();
    +            }
    +        }
    +        // V8 runtime terminateExecution() does not require lock.
    +        v8Runtime.terminateExecution();
    +    });
    +    daemonThread.start();
    +    try {
    +        v8Runtime.getExecutor(
    +                "var count = 0; while (true) { ++count; }")
    +                .executeVoid();
    +        fail("Failed to throw exception when execution is terminated.");
    +    } catch (JavetTerminatedException e) {
    +        assertFalse(e.isContinuable());
    +    }
    +    final int count = v8Runtime.getGlobalObject().getInteger("count");
    +    assertTrue(count > 0, "Count should be greater than 0.");
    +    assertEquals(2, v8Runtime.getExecutor("1 + 1").executeInteger(),
    +            "V8 runtime should still be able to execute script after being terminated.");
    +}
    +
    +
    +
    +
    +

    How about Debug Mode?¶

    +

    Usually, when application is being debugged, JavetEngineGuard may easily interrupt the debug. No worry, JavetEngineGuard is by default disabled in debug mode. Please refer to disableInDebugMode() and enableInDebugMode() for detail.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/termination.rst b/docs/reference/termination.rst index a2bcfd3ed..596846033 100644 --- a/docs/reference/termination.rst +++ b/docs/reference/termination.rst @@ -28,7 +28,7 @@ Automatic Termination with Pool and Engine Does ``IJavetEngineGuard`` hang normal scripts till timeout is hit? No, it doesn't cause any overhead. If the script completes, ``IJavetEngineGuard.close()`` will be called via try-with-resource pattern and cancel the daemon thread immediately. -Please refer to `source code <../../src/test/java/com/caoccao/javet/interop/engine/TestJavetEngineGuard.java>`_ for more detail. +Please refer to the :extsource2:`source code <../../src/test/java/com/caoccao/javet/interop/engine/TestJavetEngineGuard.java>` for more detail. Manual Termination ================== @@ -71,5 +71,3 @@ How about Debug Mode? ===================== Usually, when application is being debugged, ``JavetEngineGuard`` may easily interrupt the debug. No worry, ``JavetEngineGuard`` is by default disabled in debug mode. Please refer to ``disableInDebugMode()`` and ``enableInDebugMode()`` for detail. - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/todo_list.html b/docs/reference/todo_list.html new file mode 100644 index 000000000..31538ee10 --- /dev/null +++ b/docs/reference/todo_list.html @@ -0,0 +1,335 @@ + + + + + + + + TODO List - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    TODO List¶

    +
      +
    • To upgrade V8 and Node.js periodically.

    • +
    • To expose more Node.js modules in Javet style.

    • +
    • To polyfill V8 mode with more API.

    • +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/todo_list.rst b/docs/reference/todo_list.rst similarity index 85% rename from docs/todo_list.rst rename to docs/reference/todo_list.rst index dbb3f7ff7..772b4f6c9 100644 --- a/docs/todo_list.rst +++ b/docs/reference/todo_list.rst @@ -5,5 +5,3 @@ TODO List * To upgrade V8 and Node.js periodically. * To expose more Node.js modules in Javet style. * To polyfill V8 mode with more API. - -[`Home <../README.rst>`_] diff --git a/docs/reference/v8_collection.html b/docs/reference/v8_collection.html new file mode 100644 index 000000000..ee72c0bbf --- /dev/null +++ b/docs/reference/v8_collection.html @@ -0,0 +1,520 @@ + + + + + + + + V8 Collection - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    V8 Collection¶

    +
    +

    Collection in V8¶

    +

    Javet provides decent support on manipulating V8 collection as following.

    +
    +++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Collection

    getLength() / getSize()

    add() / set()

    delete()

    has()

    get()

    getKeys() / getOwnPropertyNames()

    getValues()

    getEntries()

    forEach(Consumer)

    forEach(BiConsumer)

    Object

    No

    Yes

    yes

    Yes

    Yes

    Yes

    No

    No

    Yes

    Yes

    Array

    Yes

    Yes

    yes

    Yes

    Yes

    Yes

    No

    No

    Yes

    No

    Map

    Yes

    Yes

    yes

    Yes

    Yes

    Yes

    Yes

    Yes

    Yes

    Yes

    Set

    Yes

    Yes

    yes

    Yes

    Yes

    Yes

    No

    No

    Yes

    No

    WeakMap

    No

    Yes

    yes

    Yes

    Yes

    No

    No

    No

    No

    No

    WeakSet

    No

    Yes

    yes

    Yes

    No

    No

    No

    No

    No

    No

    +
    +
    +

    Usage¶

    +
    +

    V8ValueArray¶

    +
    try (V8ValueArray v8ValueArray = v8Runtime.getExecutor("const a = new Array(0,1,2); a;").execute()) {
    +    AtomicInteger count = new AtomicInteger(0);
    +    v8ValueArray.forEach((V8ValueInteger value) -> {
    +        assertEquals(count.getAndIncrement(), value.getValue());
    +    });
    +    assertEquals(4, v8ValueArray.push(3));
    +    assertEquals(3, v8ValueArray.popInteger());
    +}
    +
    +
    +
    +
    +

    V8ValueSet¶

    +
    try (V8ValueSet v8ValueSet = v8Runtime.getExecutor(
    +        "const a = new Set(); a.add('0'); a.add('1'); a.add('2'); a;").execute()) {
    +    // V8 feature: Order is preserved.
    +    AtomicInteger count = new AtomicInteger(0);
    +    assertEquals(3, v8ValueSet.forEach((V8ValueString key) -> {
    +        assertEquals(Integer.toString(count.getAndIncrement()), key.getValue());
    +    }));
    +    v8ValueSet.add("3");
    +    assertTrue(v8ValueSet.has("3"));
    +    assertTrue(v8ValueSet.delete("3"));
    +    assertFalse(v8ValueSet.has("3"));
    +}
    +
    +
    +
    +
    +

    V8ValueMap¶

    +
    try (V8ValueMap v8ValueMap = v8Runtime.getExecutor(
    +        "const a = new Map(); a.set('0', 0); a.set('1', 1); a.set('2', 2); a;").execute()) {
    +    // V8 feature: Order is preserved.
    +    AtomicInteger count = new AtomicInteger(0);
    +    assertEquals(3, v8ValueMap.forEach((V8ValueString key) -> {
    +        assertNotNull(key);
    +        assertEquals(Integer.toString(count.getAndIncrement()), key.getValue());
    +    }));
    +    count.set(0);
    +    assertEquals(3, v8ValueMap.forEach((V8ValueString key, V8ValueInteger value) -> {
    +        assertNotNull(key);
    +        assertNotNull(value);
    +        assertEquals(Integer.toString(count.get()), key.getValue());
    +        assertEquals(count.getAndIncrement(), value.getValue());
    +    }));
    +    v8ValueMap.set("a", 1);
    +    assertEquals(4, v8ValueMap.getSize());
    +    assertTrue(v8ValueMap.has("a"));
    +    assertTrue(v8ValueMap.delete("a"));
    +}
    +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/v8_collection.rst b/docs/reference/v8_collection.rst index 27fd7b4ed..6a54652d5 100644 --- a/docs/reference/v8_collection.rst +++ b/docs/reference/v8_collection.rst @@ -78,5 +78,3 @@ V8ValueMap assertTrue(v8ValueMap.has("a")); assertTrue(v8ValueMap.delete("a")); } - -[`Home <../../README.rst>`_] [`Javet Reference `_] diff --git a/docs/reference/v8_function.html b/docs/reference/v8_function.html new file mode 100644 index 000000000..2670ccdb0 --- /dev/null +++ b/docs/reference/v8_function.html @@ -0,0 +1,848 @@ + + + + + + + + V8 Function - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    V8 Function¶

    +
    +

    Function Types¶

    +

    In general, there are 3 types of function exposed by Javet.

    +
      +
    • Native functions are V8 built-in functions.

    • +
    • API functions are C++ backed functions. Node.js defined C++ functions and Javet defined Java functions are all API functions.

    • +
    • User Defined functions are JavaScript backed functions. Basically, any function generated via JavaScript code execution is user defined function.

    • +
    +
    +

    Comparisons¶

    +
    ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Type

    V8 Built-in

    C++ or Java

    JavaScript

    Interception

    Change on the Fly

    Native

    Yes

    Yes

    No

    Yes

    No

    API

    No

    Yes

    No

    Yes

    No

    User Defined

    No

    No

    Yes

    Yes

    Yes

    +

    Call getJSFunctionType() to determine which function type it is.

    +
    +
    +
    +

    Function Interception¶

    +

    Functions can be intercepted via Javet API. This is equivalent to the capability provided by Node.js. However, there is still a key difference between user defined functions and function interception: local scoped context is visible to user defined function, but invisible to function interceptor. Why? That's a long story related to how closure is implemented in V8 which is not the goal in this section. If local scoped context has to be required, please consider changing the function on the fly which is documented in next section.

    +

    com.caoccao.javet.values.reference.IV8ValueObject exposes a set of bindFunction() that allow caller to register function interceptors in automatic or manual ways.

    +
    +

    Automatic Registration¶

    +
    +

    bind()¶

    +

    bind() scans the input callback receiver for functions decorated by @V8Function and @V8Property. It allows registering many getters / setters and functions in one call.

    +
    List<JavetCallbackContext> bind(Object functionCallbackReceiver);
    +
    +
    +
    +
    +

    How about Object Type Conversion?¶

    +

    As V8 only accepts data represented by its own format, Java objects need to be converted to native V8Value objects. Creating native V8Value objects is tricky in the callback receiver. There are typically 2 options.

    +
      +
    1. Use Object Converter - Enhance the Object Converter and it just works as a charm. This is the recommended option. Please refer to generateArrayWithConverter().

    2. +
    +

    The beauty of the object converter is Javet doesn't intrude into the receiver at all so that application may pass any objects that are untouchable in the application code, e.g. a native object from a 3rd party library. Of course, in that situation, application may ignore the annotation and register the methods directly in the manual registration which is documented in the next section.

    +
      +
    1. Convert via V8Runtime - V8Runtime can be directly used to perform the type conversion. V8Runtime can be manually set by application, or borrowed from the input arguments. Sometimes the callback receiver is not able to borrow V8Runtime from input arguments, it may decorate a setter with @V8RuntimeSetter so that Javet will inject the current V8Runtime. Please refer to generateArrayWithoutConverter().

    2. +
    +

    Here is a sample. The first step is to declare callback receiver and callback functions. That is quite easy as the sample code shows.

    +
    public class AnnotationBasedCallbackReceiver {
    +    private V8Runtime v8Runtime;
    +    private String stringValue;
    +
    +    public AnnotationBasedCallbackReceiver() {
    +        stringValue = null;
    +        v8Runtime = null;
    +    }
    +
    +    // Javet detects the getter automatically.
    +    @V8Property(name = "stringValue")
    +    public String getStringValue() {
    +        return stringValue;
    +    }
    +
    +    // Javet detects the setter and property name automatically.
    +    @V8Property
    +    public void setStringValue(String stringValue) {
    +        this.stringValue = stringValue;
    +    }
    +
    +    // Instance method with same name and same signature.
    +    @V8Function(name = "echo")
    +    public String echo(String str) {
    +        return str;
    +    }
    +
    +    // Instance method with different name and same signature.
    +    @V8Function(name = "add")
    +    public Integer mathAdd(Integer a, Integer b) {
    +        return a + b;
    +    }
    +
    +    // Instance method with converter for non-primitive objects.
    +    @V8Function(name = "generateArrayWithConverter")
    +    public Object[] generateArrayWithConverter() throws JavetException {
    +        // Converter is able to recognize non-primitive types.
    +        return new Object[]{"a", 1};
    +    }
    +
    +    // Instance method requiring V8Runtime without converter.
    +    @V8Function(name = "generateArrayWithoutConverter")
    +    public V8ValueArray generateArrayWithoutConverter() throws JavetException {
    +        V8ValueArray v8ValueArray = v8Runtime.createV8ValueArray();
    +        v8ValueArray.push("a");
    +        v8ValueArray.push(1);
    +        return v8ValueArray;
    +    }
    +
    +    // Static method.
    +    @V8Function(name = "staticEcho")
    +    public static String staticEcho(String str) {
    +        return str;
    +    }
    +
    +    // Declare the V8RuntimeSetter for dependency injection.
    +    @V8RuntimeSetter
    +    public void setV8Runtime(V8Runtime v8Runtime) {
    +        this.v8Runtime = v8Runtime;
    +    }
    +}
    +
    +
    +

    The second step is to call the functions or properties.

    +
    try (V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject()) {
    +    v8Runtime.getGlobalObject().set("a", v8ValueObject);
    +    AnnotationBasedCallbackReceiver annotationBasedCallbackReceiver = new AnnotationBasedCallbackReceiver();
    +    v8ValueObject.bind(annotationBasedCallbackReceiver);
    +    assertEquals("test", v8Runtime.getExecutor("a.echo('test')").executeString());
    +    assertEquals(3, v8Runtime.getExecutor("a.add(1, 2)").executeInteger());
    +    try (V8ValueArray v8ValueArray = v8Runtime.getExecutor(
    +            "a.generateArrayWithConverter()").execute()) {
    +        assertEquals("[\"a\",1]", v8ValueArray.toJsonString());
    +    }
    +    try (V8ValueArray v8ValueArray = v8Runtime.getExecutor(
    +            "a.generateArrayWithoutConverter()").execute()) {
    +        assertEquals("[\"a\",1]", v8ValueArray.toJsonString());
    +    }
    +    assertEquals("static", v8Runtime.getExecutor("a.staticEcho('static')").executeString());
    +    v8Runtime.getExecutor("a.stringValue = 'abc';").executeVoid();
    +    assertEquals("abc", v8Runtime.getExecutor("a.stringValue").executeString());
    +    v8Runtime.getGlobalObject().delete("a");
    +}
    +
    +
    +
    +
    +

    Can this be Passed in?¶

    +

    Yes, both @V8Function and @V8Property support thisObjectRequired. Just set it to true and specify the first argument as this.

    +
    @V8Property(thisObjectRequired = true)
    +public ... functionName(V8ValueObject thisObject, ...) {
    +    // function body
    +}
    +
    +
    +

    This feature is especially useful when this needs to be returned. Just simply return the input this object and there is no need to create a new V8 object.

    +
    +
    +

    Can Symbol Properties be Intercepted?¶

    +

    Yes, @V8Property supports symbol. Just set it to true.

    +
    @V8Property(symbol = true)
    +public String getValue() {
    +    return value;
    +}
    +
    +@V8Property(symbol = true)
    +public void setValue(String value) {
    +    this.value = value;
    +}
    +
    +
    +

    Be careful, Javet only supports symbols that are registered as global symbols in property interception.

    +
    +
    +

    How to Disable Properties or Functions?¶

    +

    As @V8Function and @V8Property are statically declared, there is no way of selectively disabling them. @V8BindEnabler is designed to give Javet a hint on which properties or functions are enabled. Here is a sample.

    +
    @V8Function
    +public String disabledFunction() {
    +    return "I am a disabled function.";
    +}
    +
    +@V8Property
    +public String disabledProperty() {
    +    return "I am a disabled property.";
    +}
    +
    +@V8BindEnabler
    +public boolean isV8BindEnabled(String methodName) {
    +    if ("disabledFunction".equals(methodName) || "disabledProperty".equals(methodName)) {
    +        return false;
    +    }
    +    return true;
    +}
    +
    +
    +

    @V8BindEnabler can be used to decorate a method with signature boolean arbitraryMethod(String methodName). Javet calls that method by each method name for whether each method is enabled or not.

    +
    +
    +

    How to Unregister Properties or Functions?¶

    +

    unbind() follows the same way that bind() goes to unregister both properties and functions.

    +

    unbindProperty() and unbindFunction() provide precise way of unregistering single property or function.

    +
    +
    +
    +

    Manual Registration¶

    +

    Manual registration allows the applications to have full control over every step of the function interception.

    +
    +

    boolean bindFunction(String functionName, JavetCallbackContext javetCallbackContext)¶

    +

    This method is for binding a Java code based function in semi-manual way. The caller is expected to do the following steps.

    +
      +
    • Create a callback receiver.

    • +
    • Find certain callback method in the callback receiver.

    • +
    • Create JavetCallbackContext by the callback receiver and callback method.

    • +
    • Bind the callback context to a V8 object via bindFunction.

    • +
    • Call the function to trigger the callback.

    • +
    +
    MockCallbackReceiver mockCallbackReceiver = new MockCallbackReceiver(v8Runtime);
    +JavetCallbackContext javetCallbackContext = new JavetCallbackContext(
    +        mockCallbackReceiver, mockCallbackReceiver.getMethod("blank"));
    +V8ValueObject globalObject = v8Runtime.getGlobalObject();
    +globalObject.bindFunction("blank", javetCallbackContext);
    +v8Runtime.getExecutor("blank();").executeVoid();
    +globalObject.delete("blank");
    +
    +
    +
    +
    +

    boolean set(String key, V8Value value)¶

    +

    This method is for binding a Java code based function in complete manual way. The caller is expected to do the following steps.

    +
      +
    • Create a callback receiver.

    • +
    • Find certain callback method in the callback receiver.

    • +
    • Create JavetCallbackContext by the callback receiver and callback method.

    • +
    • Create V8ValueFunction by JavetCallbackContext.

    • +
    • Bind the function to a V8 object via set.

    • +
    • Call the function to trigger the callback.

    • +
    +
    MockCallbackReceiver mockCallbackReceiver = new MockCallbackReceiver(v8Runtime);
    +JavetCallbackContext javetCallbackContext = new JavetCallbackContext(
    +        mockCallbackReceiver, mockCallbackReceiver.getMethod("blank"));
    +V8ValueObject globalObject = v8Runtime.getGlobalObject();
    +try (V8ValueFunction v8ValueFunction = v8Runtime.createV8ValueFunction(javetCallbackContext);
    +        V8ValueObject a = v8Runtime.createV8ValueObject()) {
    +    globalObject.set("a", a);
    +    a.set("blank", v8ValueFunction);
    +    assertFalse(mockCallbackReceiver.isCalled());
    +    v8Runtime.getExecutor("a.blank();").executeVoid();
    +    assertTrue(mockCallbackReceiver.isCalled());
    +    a.delete("blank");
    +    globalObject.delete("a");
    +}
    +
    +
    +
    +
    +

    boolean bindFunction(String functionName, String codeString)¶

    +

    This method is for binding a JavaScript code based function.

    +
    v8Runtime.getGlobalObject().bindFunction("b", "(x) => x + 1;");
    +assertEquals(2, v8Runtime.getExecutor("b(1);").executeInteger());
    +v8Runtime.getGlobalObject().delete("b");
    +
    +
    +
    +
    +
    +

    Type Mismatch¶

    +

    It is very easy to cause type mismatches in JavaScript. The Javet exception is so generic that applications may not be happy with it. So, how to customize the type mismatch exception? The recommended way is to declare the function signature to (V8Value... v8Values) or (Object... objects).

    +
      +
    • Javet doesn't throw exceptions under this signature in all cases.

    • +
    • Application is the one that performs the argument validation so that the error handling is completely customized.

    • +
    • When dealing with V8Value..., application is responsible for the type conversion.

    • +
    • Variable arguments can be achieved under this signature so that a JavaScript function can be completely mirrored in Java.

    • +
    +
    +
    +

    Resource Management¶

    +

    In the function callback, Javet manages the lifecycle of the input arguments and the return value. So, DO NOT close the input arguments, and DO NOT apply try-with-resource to the return value.

    +
    +
    +

    Summary¶

    +

    Obviously, the automatic registration is much better than the manual registration. Please use them wisely.

    +
    +
    +
    +

    Change a User Defined JavaScript Function on the Fly¶

    +
    +

    Why is Changing a User Defined JavaScript Function Important?¶

    +

    Functions can be changed on the fly at JavaScript code level via Javet API. Why to choose this approach? Because sometimes local scoped context is required which is usually called closure. E.g:

    +
    const a = function () {
    +    const b = 1;
    +    return () => b;
    +}
    +const x = a();
    +console.log(x());
    +// Output is: 1
    +
    +
    +

    Local const b is visible to the anonymous function at line 3, but invisible to the function interceptor. Javet provides a way of changing the function at JavaScript source code level so that local scoped context is still visible.

    +
    +
    +

    How to Change a User Defined JavaScript Function on the Fly?¶

    +

    getSourceCode() and setSourceCode(String sourceCode) are designed for getting and setting the source code. setSourceCode(String sourceCode) actually performs the follow steps.

    +
    def setSourceCode(sourceCode):
    +    existingSourceCode = v8Function.getSourceCode()
    +    (startPosition, endPosition) = v8Function.getPosition()
    +    newSourceCode = existingSourceCode[:startPosition] + sourceCode + existingSourceCode[endPosition:]
    +    v8Function.setSourceCode(newSourceCode)
    +    v8Function.setPosition(startPosition, startPosition + len(sourceCode))
    +
    +
    +

    Be careful, setSourceCode(String sourceCode) has radical impacts that may break the execution because all functions during one execution share the same source code but have their own positions. The following diagram shows the rough memory layout. Assuming function (4) has been changed to something else with position changed, function (1) and (2) will not be impacted because their positions remain the same, but function (3) will be broken because its end position is not changed to the end position of function (4) accordingly.

    +Memory Layout of V8 Function +

    Javet does not scan memory for all impacted function. So, it is caller's responsibility for restoring the original source code after invocation. The pseudo logic is as following.

    +
    originalSourceCode = v8ValueFunction.getSourceCode()
    +v8ValueFunction.setSourceCode(sourceCode)
    +v8ValueFunction.call(...)
    +v8ValueFunction.setSourceCode(originalSourceCode)
    +
    +
    +

    Why does setSourceCode() sometimes return false? Usually, that means the local scoped context hasn't been generated by V8. getJSScopeType().isClass() == true indicates that state. After callVoid(null), the local scoped context will be created with getJSScopeType().isFunction() == true and setSourceCode() will work. The pseudo logic is as following.

    +
    originalSourceCode = v8ValueFunction.getSourceCode()
    +if (v8ValueFunction.getJSScopeType().isClass()) {
    +    try {
    +        v8ValueFunction.callVoid(null);
    +        // Now v8ValueFunction.getJSScopeType().isFunction() is true
    +    } catch (JavetException e) {
    +    }
    +}
    +v8ValueFunction.setSourceCode(sourceCode) // true
    +v8ValueFunction.call(...)
    +v8ValueFunction.setSourceCode(originalSourceCode)
    +
    +
    +

    The rough lifecycle of a V8 function is as following.

    +Lifecycle of V8 Function +
    +
    +

    What is the Source Code of a Function in V8?¶

    +

    When V8 calculates start position of a function, it does not include the keyword function and function name. E.g.

    +
    function abc(a, b, c) { ... } // Source code is (a, b, c) { ... }
    +
    +(a, b, c) => { ... }          // Source code is (a, b, c) => { ... }
    +
    +
    +

    So, please always discard the keyword function and function name when calling setSourceCode().

    +
    +
    +
    +

    Automatic Type Conversion¶

    +

    Javet is capable of automatically converting its internal V8Value to primitive types by inspecting the function signature. So, the following 4 functions are all the same and valid.

    +
    // Option 1
    +public String echo(String str) {
    +    return str;
    +}
    +
    +// Option 2
    +public String echo(V8Value arg) {
    +    return arg == null ? null : arg.toString();
    +}
    +
    +// Option 3
    +public V8Value echo(String str) {
    +    return v8Runtime.createV8ValueString(str);
    +}
    +
    +// Option 4
    +public V8Value echo(V8Value arg) throws JavetException {
    +    return arg.toClone();
    +}
    +
    +// All 4 functions above can be handled in Javet as the following function
    +echo("123");
    +
    +
    +

    Primitive types can be in either primitive or object form in the method signature. Javet just automatically handles the type conversion and it is null safe.

    +
      +
    • boolean: boolean, Boolean, null âŸ¶ï¸ false, undefined âŸ¶ï¸ false.

    • +
    • byte, integer, long, Short: int, Integer, long, Long, short, Short, byte, Byte, null âŸ¶ï¸ 0, undefined âŸ¶ï¸ 0.

    • +
    • char: char, Char, null âŸ¶ï¸ \0, undefined âŸ¶ï¸ \0.

    • +
    • float, double: float, Float, double, Double, int, Integer, long, Long, short, Short, byte, Byte, null âŸ¶ï¸ 0, undefined âŸ¶ï¸ 0.

    • +
    +

    For instance: The following 4 functions are all the same and valid.

    +
    // Option 1
    +public int echo(Integer i) {
    +    return i == null? 0: i.intValue();
    +}
    +
    +// Option 2
    +public Integer echo(int arg) {
    +    return Integer.valueOf(int);
    +}
    +
    +// Option 3
    +public V8ValueInteger echo(int i) {
    +    return new V8ValueInteger(i);
    +}
    +
    +// Option 4
    +public Integer echo(V8ValueInteger i) {
    +    return i == null? 0: i.getValue();
    +}
    +
    +
    +

    Can the default values be changed in terms of null safety? Yes, Object Converter allows overriding the default values.

    +
    +
    +

    Call vs. Invoke¶

    +

    In one sentence, call() belongs to function and invoke() belongs to object.

    +
    +

    Call¶

    +

    call() is almost equivalent to Function.prototype.call(). It allows the caller to specify receiver. Besides, Javet combines Function.prototype.call() and Function.prototype.apply() because Java is friendly to varargs.

    +
    func.call(object, a, b, c); // func.call(object, a, b, c); with V8 object returned
    +func.callVoid(object, a, b, c); // func.call(object, a, b, c); without return
    +func.callObject(object, a, b, c); // func.call(object, a, b, c); with Java object returned
    +func.callPrimitive(object, a, b, c); // func.call(object, a, b, c); with Java primitive returned
    +func.callAsConstructor(a, b, c); // new func(a, b, c);
    +
    +
    +
    +
    +

    Invoke¶

    +

    invoke() takes function name and arguments, but not receiver because the object itself is the receiver. So the API is almost identical to call() except for the first argument.

    +
    object.invoke("func", a, b, c); // object.func(a, b, c); with V8 object returned
    +object.invokeVoid("func", a, b, c); // object.func(a, b, c); without return
    +object.invokeObject("func", a, b, c); // object.func(a, b, c); with Java object returned
    +object.invokePrimitive("func", a, b, c); // object.func(a, b, c); with Java primitive returned
    +
    +
    +

    invoke() is heavily used in Javet so that the JNI implementation can be dramatically simplified. In few extreme cases, V8 doesn't expose its C++ API and invoke() appears to be the only way. So, feel free to invoke all kinds of JS API despite of the deficit of Javet built-in API.

    +
    +
    +

    How about Bind?¶

    +

    Function.prototype.bind() is simply a set() in Javet.

    +
    // func.bind(object); func(a, b, c); with return
    +object.set("func", func); object.invoke("func", a, b, c);
    +
    +// func.bind(object); func(a, b, c); without return
    +object.set("func", func); object.invokeVoid("func", a, b, c);
    +
    +
    +

    Please review the test cases for more detail.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/v8_function.rst b/docs/reference/v8_function.rst index 16c5a544b..575960ab2 100644 --- a/docs/reference/v8_function.rst +++ b/docs/reference/v8_function.rst @@ -34,8 +34,8 @@ Functions can be intercepted via Javet API. This is equivalent to the capability Automatic Registration ---------------------- -``bind()`` -^^^^^^^^^^ +bind() +^^^^^^ ``bind()`` scans the input callback receiver for functions decorated by ``@V8Function`` and ``@V8Property``. It allows registering many getters / setters and functions in one call. @@ -48,7 +48,7 @@ How about Object Type Conversion? As V8 only accepts data represented by its own format, Java objects need to be converted to native ``V8Value`` objects. Creating native ``V8Value`` objects is tricky in the callback receiver. There are typically 2 options. -1. **Use Object Converter** - Enhance the `Object Converter `_ and it just works as a charm. This is the recommended option. Please refer to ``generateArrayWithConverter()``. +1. **Use Object Converter** - Enhance the :doc:`../tutorial/advanced/object_converter` and it just works as a charm. This is the recommended option. Please refer to ``generateArrayWithConverter()``. The beauty of the object converter is Javet doesn't intrude into the receiver at all so that application may pass any objects that are untouchable in the application code, e.g. a native object from a 3rd party library. Of course, in that situation, application may ignore the annotation and register the methods directly in the manual registration which is documented in the next section. @@ -144,7 +144,7 @@ The second step is to call the functions or properties. v8Runtime.getGlobalObject().delete("a"); } -Can ``this`` be Passed in? +Can **this** be Passed in? ^^^^^^^^^^^^^^^^^^^^^^^^^^ Yes, both ``@V8Function`` and ``@V8Property`` support ``thisObjectRequired``. Just set it to ``true`` and specify the first argument as ``this``. @@ -216,8 +216,8 @@ Manual Registration Manual registration allows the applications to have full control over every step of the function interception. -``boolean bindFunction(String functionName, JavetCallbackContext javetCallbackContext)`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +boolean bindFunction(String functionName, JavetCallbackContext javetCallbackContext) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This method is for binding a Java code based function in semi-manual way. The caller is expected to do the following steps. @@ -237,8 +237,8 @@ This method is for binding a Java code based function in semi-manual way. The ca v8Runtime.getExecutor("blank();").executeVoid(); globalObject.delete("blank"); -``boolean set(String key, V8Value value)`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +boolean set(String key, V8Value value) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This method is for binding a Java code based function in complete manual way. The caller is expected to do the following steps. @@ -266,8 +266,8 @@ This method is for binding a Java code based function in complete manual way. Th globalObject.delete("a"); } -``boolean bindFunction(String functionName, String codeString)`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +boolean bindFunction(String functionName, String codeString) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This method is for binding a JavaScript code based function. @@ -333,7 +333,7 @@ How to Change a User Defined JavaScript Function on the Fly? Be careful, ``setSourceCode(String sourceCode)`` has radical impacts that may break the execution because all functions during one execution share the same source code but have their own positions. The following diagram shows the rough memory layout. Assuming function (4) has been changed to something else with position changed, function (1) and (2) will not be impacted because their positions remain the same, but function (3) will be broken because its end position is not changed to the end position of function (4) accordingly. -.. image:: ../resources/images/memory_layout_of_v8_function.png?raw=true +.. image:: ../resources/images/memory_layout_of_v8_function.png :alt: Memory Layout of V8 Function Javet does not scan memory for all impacted function. So, it is caller's responsibility for restoring the original source code after invocation. The pseudo logic is as following. @@ -363,7 +363,7 @@ Why does ``setSourceCode()`` sometimes return ``false``? Usually, that means the The rough lifecycle of a V8 function is as following. -.. image:: ../resources/images/lifecycle_of_v8_function.png?raw=true +.. image:: ../resources/images/lifecycle_of_v8_function.png :alt: Lifecycle of V8 Function What is the Source Code of a Function in V8? @@ -411,10 +411,10 @@ Javet is capable of automatically converting its internal ``V8Value`` to primiti Primitive types can be in either primitive or object form in the method signature. Javet just automatically handles the type conversion and it is null safe. -* ``boolean``: ``boolean``, ``Boolean``, ``null`` âž¡ï¸ ``false``, ``undefined`` âž¡ï¸ ``false``. -* ``byte``, ``integer``, ``long``, ``Short``: ``int``, ``Integer``, ``long``, ``Long``, ``short``, ``Short``, ``byte``, ``Byte``, ``null`` âž¡ï¸ ``0``, ``undefined`` âž¡ï¸ ``0``. -* ``char``: ``char``, ``Char``, ``null`` âž¡ï¸ ``\0``, ``undefined`` âž¡ï¸ ``\0``. -* ``float``, ``double``: ``float``, ``Float``, ``double``, ``Double``, ``int``, ``Integer``, ``long``, ``Long``, ``short``, ``Short``, ``byte``, ``Byte``, ``null`` âž¡ï¸ ``0``, ``undefined`` âž¡ï¸ ``0``. +* ``boolean``: ``boolean``, ``Boolean``, ``null`` âŸ¶ï¸ ``false``, ``undefined`` âŸ¶ï¸ ``false``. +* ``byte``, ``integer``, ``long``, ``Short``: ``int``, ``Integer``, ``long``, ``Long``, ``short``, ``Short``, ``byte``, ``Byte``, ``null`` âŸ¶ï¸ ``0``, ``undefined`` âŸ¶ï¸ ``0``. +* ``char``: ``char``, ``Char``, ``null`` âŸ¶ï¸ ``\0``, ``undefined`` âŸ¶ï¸ ``\0``. +* ``float``, ``double``: ``float``, ``Float``, ``double``, ``Double``, ``int``, ``Integer``, ``long``, ``Long``, ``short``, ``Short``, ``byte``, ``Byte``, ``null`` âŸ¶ï¸ ``0``, ``undefined`` âŸ¶ï¸ ``0``. For instance: The following 4 functions are all the same and valid. @@ -440,7 +440,7 @@ For instance: The following 4 functions are all the same and valid. return i == null? 0: i.getValue(); } -Can the default values be changed in terms of null safety? Yes, `Object Converter `_ allows overriding the default values. +Can the default values be changed in terms of null safety? Yes, :doc:`../tutorial/advanced/object_converter` allows overriding the default values. Call vs. Invoke =============== @@ -481,9 +481,10 @@ How about Bind? .. code-block:: java - object.set("func", func); object.invoke("func", a, b, c); // func.bind(object); func(a, b, c); with return - object.set("func", func); object.invokeVoid("func", a, b, c); // func.bind(object); func(a, b, c); without return + // func.bind(object); func(a, b, c); with return + object.set("func", func); object.invoke("func", a, b, c); -Please review `test cases <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueFunction.java>`_ for more detail. + // func.bind(object); func(a, b, c); without return + object.set("func", func); object.invokeVoid("func", a, b, c); -[`Home <../../README.rst>`_] [`Javet Reference `_] +Please review the :extsource2:`test cases <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValueFunction.java>` for more detail. diff --git a/docs/reference/v8_promise.html b/docs/reference/v8_promise.html new file mode 100644 index 000000000..eab625baa --- /dev/null +++ b/docs/reference/v8_promise.html @@ -0,0 +1,432 @@ + + + + + + + + V8 Promise - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    V8 Promise¶

    +

    V8 promise is an advanced topic because it's usually hard to be mastered due to its multi-threaded nature. Javet enables applications to play with V8 promise in a decent way.

    +
    +

    Promise and Resolver¶

    +

    Resolver is a new concept to some JavaScript developers. In fact, it is already an old friend. Inside new Promise((resolve, reject) => {});, (resolve, reject) is called resolver in V8. Javet exposes the V8 promise and resolver via the same interface IV8ValuePromise because in V8 they really are the same. So, they both share the same set of API. But the ownership of the API makes the difference as the following chart shows.

    +V8 Promise and Resolver +
    +
    +

    Lifecycle¶

    +

    The lifecycle is as the following chart shows.

    +
      +
    1. JavaScript application calls an API for certain resource. E.g. readFileAsync.

    2. +
    3. Java application receives a callback from V8 for the resource.

    4. +
    5. Java application creates a V8 promise resolver and holds the resolver.

    6. +
    7. Java application gets a V8 promise from the resolver and returns that V8 promise as callback return.

    8. +
    9. JavaScript application gets that promise and binds the .then() and .catch().

    10. +
    11. Java application fetches the resource and calls the resolver via .resolve().

    12. +
    13. JavaScript application receives the resource in .then() and processes the result.

    14. +
    +V8 Promise Lifecycle +
    +
    +

    Example fs.readFileAsync()¶

    +

    Requirements: Create a JavaScript API fs.readFileAsync() for reading a file in async manner.

    +

    The pseudo code is as following.

    +
    // Java application injects an interceptor as 'fs'.
    +v8Runtime.getGlobalObject().set("fs", fs);
    +
    +
    +
    // JavaScript application calls 'readFileAsync()' and registers 'then()'
    +fs.readFileAsync('a.log').then(fileContent => console.log(fileContent));
    +
    +
    +
    // Java application creates a resolver, pushes the resolver to task queue, returns a promise from the resolver.
    +@V8Function
    +public V8ValuePromise readFileAsync(String filePath) throws JavetException {
    +    V8ValuePromise v8ValuePromiseResolver = v8Runtime.createV8ValuePromise();
    +    queue.add(new Task(v8ValuePromiseResolver, filePath, timeout));
    +    return v8ValuePromiseResolver.getPromise();
    +}
    +
    +
    +
    // Java application fetches the file content and resolve/reject the promise in a background thread.
    +String fileContent = getFileContent(task.getFilePath());
    +try (V8ValuePromise promise = task.getPromise()) {
    +    if (fileContent == null) {
    +        promise.reject(v8Runtime.createV8ValueUndefined());
    +    } else {
    +        promise.resolve(fileContent);
    +    }
    +}
    +// JavaScript application prints the file content in console afterwards.
    +
    +
    +
    +

    Notes¶

    +
      +
    • Java application needs to have background thread(s) process async calls from V8.

    • +
    • Node.js mode has its own event loop. So, sometimes, Java application has to call await() after resolve() or reject().

    • +
    +
    +
    +
    +

    Unhandled Rejection¶

    +

    Sometimes Java application breaks when unhandled rejection is raised.

    +

    In V8 mode, V8Runtime.setPromiseRejectCallback() allows Java application to register a callback implementing IJavetPromiseRejectCallback.

    +

    In Node.js mode, event unhandledRejection is recommended to be listened.

    +
    import process from 'process';
    +
    +process.on('unhandledRejection', (reason, promise) => {
    +    console.log('Unhandled Rejection at:', promise, 'reason:', reason);
    +    // Application specific logging, throwing an error, or other logic here
    +});
    +
    +
    +

    Be careful, the V8Runtime.setPromiseRejectCallback() in V8 mode also works in Node.js mode and it can disable the built-in Node.js event unhandledRejection. Sometimes, this is a handy feature.

    +

    Please review the test cases for more detail.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/reference/v8_promise.rst b/docs/reference/v8_promise.rst index 205f63199..2ecf7d696 100644 --- a/docs/reference/v8_promise.rst +++ b/docs/reference/v8_promise.rst @@ -9,7 +9,7 @@ Promise and Resolver Resolver is a new concept to some JavaScript developers. In fact, it is already an old friend. Inside ``new Promise((resolve, reject) => {});``, ``(resolve, reject)`` is called resolver in V8. Javet exposes the V8 promise and resolver via the same interface ``IV8ValuePromise`` because in V8 they really are the same. So, they both share the same set of API. But the ownership of the API makes the difference as the following chart shows. -.. image:: ../resources/images/v8_promise_and_resolver.png?raw=true +.. image:: ../resources/images/v8_promise_and_resolver.png :alt: V8 Promise and Resolver Lifecycle @@ -25,7 +25,7 @@ The lifecycle is as the following chart shows. 6. Java application fetches the resource and calls the resolver via ``.resolve()``. 7. JavaScript application receives the resource in ``.then()`` and processes the result. -.. image:: ../resources/images/v8_promise_lifecycle.png?raw=true +.. image:: ../resources/images/v8_promise_lifecycle.png :alt: V8 Promise Lifecycle Example fs.readFileAsync() @@ -94,6 +94,4 @@ In Node.js mode, event ``unhandledRejection`` is recommended to be listened. Be careful, the ``V8Runtime.setPromiseRejectCallback()`` in V8 mode also works in Node.js mode and it can disable the built-in Node.js event ``unhandledRejection``. Sometimes, this is a handy feature. -Please review `test cases <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValuePromise.java>`_ for more detail. - -[`Home <../../README.rst>`_] [`Javet Reference `_] +Please review the :extsource2:`test cases <../../src/test/java/com/caoccao/javet/values/reference/TestV8ValuePromise.java>` for more detail. diff --git a/docs/release_notes.rst b/docs/release_notes.rst deleted file mode 100644 index 9bf84fd9a..000000000 --- a/docs/release_notes.rst +++ /dev/null @@ -1,228 +0,0 @@ -============= -Release Notes -============= - -0.9.11 ------- - -* Upgraded Node.js to ``v14.17.6`` `(2021-08-31) `_ -* Upgraded V8 to ``v9.3.345.16`` `(2021-08-17) `_ -* Added ``unbind()``, ``unbindProperty()``, ``unbindFunction()`` to ``IV8ValueObject`` -* Updated ``V8Runtime`` to be completely thread-safe -* Added ``V8ValueBuiltInSymbol`` -* Added ``getOwnPropertySymbols()`` to ``V8ValueBuiltInObject`` -* Added ``createV8ValueSymbol()`` to ``V8Runtime`` -* Added ``symbol`` to ``V8Property`` to enable getter and setter on symbol -* Added error code 407 and 805 - -0.9.10 ------- - -* Added ``JavetVirtualObject`` -* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8Value`` -* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8ValueFunction`` as anonymous function -* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8ValueObject`` as anonymous object -* Added ``isClosed()`` to ``IJavetClosable`` -* Added error code 602 and 603 - -0.9.9 ------ - -* Upgraded Node.js to ``v14.17.4`` `(2021-07-29) `_ -* Added support to Mac OS x86_64 -* Removed ``staticClassEnabled`` from ``JavetProxyConverter`` - -0.9.8 ------ - -* Added ``resolve()`` and ``reject()`` to ``V8ValuePromise`` -* Added ``staticClassEnabled`` to ``JavetProxyConverter`` -* Added ``construct()`` to ``JavetUniversalProxyHandler`` -* Added Dockerfile for Linux x86-64 -* Refactored document for how to build Javet - -0.9.7 ------ - -* Added static mode to ``JavetUniversalProxyHandler`` -* Added ``ownKeys()`` to ``JavetUniversalProxyHandler`` - -0.9.6 ------ - -* Added ``IV8ValueProxy`` and ``V8ValueProxy`` -* Added ``getTarget()``, ``getHandler()``, ``isRevoked()`` and ``revoke()`` to ``IV8ValueProxy`` -* Added ``createV8ValueProxy()`` to ``V8Runtime`` -* Added ``JavetUniversalProxyHandler`` and ``JavetProxyConverter`` - -0.9.5 ------ - -* Upgraded V8 to ``v9.2.230.21`` `(2021-07-19) `_ - -0.9.4 ------ - -* Added ``JavetConverterConfig`` -* Added ``JavetEntityFunction`` for ``JavetObjectConverter`` -* Updated ``JavetObjectConverter`` to allow skipping functions -* Added ``getPrototype()`` and ``setPrototype()`` to ``IV8ValueObject`` -* Changed the way that Javet libraries are deployed to be multi-process safe - -0.9.3 ------ - -* Upgraded Node.js to ``v14.17.2`` `(2021-07-01) `_ -* Added ``IV8ModuleResolver`` to allow intercepting module resolving callback -* Added ``V8BindEnabler`` to determine whether certain injection is enabled or not -* Added ``NodeModuleProcess#getVersion`` -* Updated ``JavetPrimitiveConverter`` and ``JavetObjectConverter`` to check recursion depth for circular structure detection - -0.9.2 ------ - -* Upgraded Node.js to ``v14.17.1`` `(2021-06-15) `_ -* Updated ``JavetObjectConverter`` to handle anonymous functions more efficiently -* Added ``V8ValueBuiltInObject#assign`` - -0.9.1 ------ - -* Moved V8 to a custom classloader -* Enabled ``unloadLibrary()`` and ``loadLibrary()`` in ``V8Host`` - -0.9.0 ------ - -* Upgraded Node.js to ``v14.17.0`` `(2021-05-11) `_ -* Upgraded V8 to ``v9.1.269.28`` `(2021-05-10) `_ -* Added ``thisObjectRequired`` to ``@V8Function`` and ``@V8Property`` - -0.8.10 ------- - -* Renamed ``IJavetConsumer`` to ``IJavetUniConsumer`` -* Added ``IJavetUniIndexedConsumer`` and ``IJavetBiIndexedConsumer`` -* Fixed a bug in ``V8FunctionCallback`` on varargs -* Deprecated ``bindFunctions()`` and ``bindProperties()`` -* Added ``@CheckReturnValue`` to warn ignored return value - -0.8.9 ------ - -* Renamed ``setFunction()`` to ``bindFunction()`` in ``IV8ValueObject`` -* Renamed ``setFunctions()`` to ``bindFunctions()`` in ``IV8ValueObject`` -* Added ``disableInDebugMode()`` and ``enableInDebugMode()`` to ``JavetEngineGuard`` -* Added ``bind()``, ``bindProperty()`` and ``bindProperties()`` in ``IV8ValueObject`` -* Added ``@V8Property`` for ``IV8ValueObject.bindProperties()`` - -0.8.8 ------ - -* Re-organized doc. -* Added ``getJSFunctionType()``, ``getSourceCode()`` and ``setSourceCode()`` to ``IV8ValueFunction`` - -0.8.7 ------ - -* Supported native modules with rebuilt scripts -* Fixed ``NodeRuntime.await()`` to emit tasks - -0.8.6 ------ - -* Upgraded Linux build environment to Ubuntu 20.04 + GCC 9.3 -* Enhanced ``NodeRuntime.await()`` to allow interaction from other threads - -0.8.5 ------ - -* Universal object conversion is turned on for all API -* Added ``createV8ValueDouble()``, ``createV8ValueString()`` and ``createV8ValueZonedDateTime()`` to ``V8Runtime`` -* Added ``JavetError`` with error codes -* Refactored ``invoke()``, ``call()``, ``set()``, ``has()`` to take ``Object`` instead of ``V8Value`` -* Removed a few exceptions - -0.8.4 ------ - -* Added ``gcBeforeEngineClose`` to ``JavetEngineConfig`` -* Added ``JavetCallbackException`` -* Added ``IV8Value#isNullOrUndefined`` -* Upgraded Node.js to ``v14.16.1`` `(2021-04-06) `_ -* Upgraded V8 to ``v9.0.257`` `(2021-02-24) `_ - -0.8.3 ------ - -* Added ``V8Runtime.lowMemoryNotification()`` and ``V8Runtime.idleNotificationDeadline()`` -* Added ``V8Host.setMemoryUsageThresholdRatio()``, ``V8Host.enableGCNotification()``, and ``V8Host.disableGCNotification()`` -* Updated JavetEnginePool to be lock free -* Added ``autoSendGCNotification`` to ``JavetEngineConfig`` -* Moved ``JavetCallbackContext`` management from ``V8ValueFunction`` to V8 -* Added ``JavetPromiseRejectCallback`` for V8 mode - -0.8.2 ------ - -* Enabled auto type conversion in primitive types -* Fixed a memory leak issue during V8Runtime ``resetContext()``, ``resetIsolate()``, ``close()`` - -0.8.1 ------ - -* Enabled declarative function interception -* Enabled custom object converter in function callback -* Added ``allowEval`` to ``JavetEngineConfig`` -* Refactored built-in module API for Node.js mode - -0.8.0 ------ - -* Supported Node.js ``v14.16.0`` `(2021-02-23) `_ -* Added ``V8Module`` and ``V8Script`` -* Enhanced ``V8ValuePromise`` -* Added dynamic switch between Node.js and V8 - -0.7.4 ------ - -* Added V8 primitive value cache -* Added live debug for Chrome Developer Tools - -0.7.3 ------ - -* Added ``V8ValueWeakMap`` and ``V8ValueWeakSet`` -* Added ``forEach()`` to Collection -* Added ``V8Locker`` for Performance Sensitive Scenarios - -0.7.2 ------ - -* Added ``setFunction(String functionName, String codeString)`` to ``IV8ValueObject`` -* Added ``equals()`` and ``strictEquals()`` and ``sameValue()`` to ``IV8Value`` -* Added ``getIdentityHash()`` to ``IV8ValueReference`` -* Added ``isDead()``, ``isInUse()``, ``callAsConstructor()`` and ``terminateExecution()`` to ``V8Runtime`` -* Added V8 typed array and data view -* Added ``IJavetEngineGuard`` - -0.7.1 ------ - -* Easy spring integration -* Performance test cases -* Few bug fixes - -0.7.0 ------ - -* First release of Javet -* Linux + Windows -* V8 ``v8.9.255`` `(2021-02-04) `_ -* Exposure of the majority of V8 API in JVM -* JS function interception -* Native BigInt and Date -* Javet engine pool - -[`Home <../README.rst>`_] diff --git a/docs/release_notes/index.html b/docs/release_notes/index.html new file mode 100644 index 000000000..9fc73232f --- /dev/null +++ b/docs/release_notes/index.html @@ -0,0 +1,337 @@ + + + + + + + + Release Notes - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/release_notes/index.rst b/docs/release_notes/index.rst new file mode 100644 index 000000000..63ed9ba28 --- /dev/null +++ b/docs/release_notes/index.rst @@ -0,0 +1,10 @@ +============= +Release Notes +============= + +.. toctree:: + :maxdepth: 1 + + release_notes_0_9 + release_notes_0_8 + release_notes_0_7 diff --git a/docs/release_notes/release_notes_0_7.html b/docs/release_notes/release_notes_0_7.html new file mode 100644 index 000000000..f7b50cfa9 --- /dev/null +++ b/docs/release_notes/release_notes_0_7.html @@ -0,0 +1,399 @@ + + + + + + + + Release Notes 0.7.x - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Release Notes 0.7.x¶

    +
    +

    0.7.4 Live Debug¶

    +
      +
    • Added V8 primitive value cache

    • +
    • Added live debug for Chrome Developer Tools

    • +
    +
    +
    +

    0.7.3 Locker¶

    +
      +
    • Added V8ValueWeakMap and V8ValueWeakSet

    • +
    • Added forEach() to Collection

    • +
    • Added V8Locker for Performance Sensitive Scenarios

    • +
    +
    +
    +

    0.7.2 Engine Guard¶

    +
      +
    • Added setFunction(String functionName, String codeString) to IV8ValueObject

    • +
    • Added equals() and strictEquals() and sameValue() to IV8Value

    • +
    • Added getIdentityHash() to IV8ValueReference

    • +
    • Added isDead(), isInUse(), callAsConstructor() and terminateExecution() to V8Runtime

    • +
    • Added V8 typed array and data view

    • +
    • Added IJavetEngineGuard

    • +
    +
    +
    +

    0.7.1 Bug Fixes¶

    +
      +
    • Easy spring integration

    • +
    • Performance test cases

    • +
    • Few bug fixes

    • +
    +
    +
    +

    0.7.0 Birth with V8 v8.9¶

    +
      +
    • First release of Javet

    • +
    • Linux + Windows

    • +
    • V8 v8.9.255 (2021-02-04)

    • +
    • Exposure of the majority of V8 API in JVM

    • +
    • JS function interception

    • +
    • Native BigInt and Date

    • +
    • Javet engine pool

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/release_notes/release_notes_0_7.rst b/docs/release_notes/release_notes_0_7.rst new file mode 100644 index 000000000..65796b08e --- /dev/null +++ b/docs/release_notes/release_notes_0_7.rst @@ -0,0 +1,44 @@ +=================== +Release Notes 0.7.x +=================== + +0.7.4 Live Debug +---------------- + +* Added V8 primitive value cache +* Added live debug for Chrome Developer Tools + +0.7.3 Locker +------------ + +* Added ``V8ValueWeakMap`` and ``V8ValueWeakSet`` +* Added ``forEach()`` to Collection +* Added ``V8Locker`` for Performance Sensitive Scenarios + +0.7.2 Engine Guard +------------------ + +* Added ``setFunction(String functionName, String codeString)`` to ``IV8ValueObject`` +* Added ``equals()`` and ``strictEquals()`` and ``sameValue()`` to ``IV8Value`` +* Added ``getIdentityHash()`` to ``IV8ValueReference`` +* Added ``isDead()``, ``isInUse()``, ``callAsConstructor()`` and ``terminateExecution()`` to ``V8Runtime`` +* Added V8 typed array and data view +* Added ``IJavetEngineGuard`` + +0.7.1 Bug Fixes +--------------- + +* Easy spring integration +* Performance test cases +* Few bug fixes + +0.7.0 Birth with V8 v8.9 +------------------------ + +* First release of Javet +* Linux + Windows +* V8 ``v8.9.255`` `(2021-02-04) `_ +* Exposure of the majority of V8 API in JVM +* JS function interception +* Native BigInt and Date +* Javet engine pool diff --git a/docs/release_notes/release_notes_0_8.html b/docs/release_notes/release_notes_0_8.html new file mode 100644 index 000000000..17fbc912d --- /dev/null +++ b/docs/release_notes/release_notes_0_8.html @@ -0,0 +1,456 @@ + + + + + + + + Release Notes 0.8.x - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Release Notes 0.8.x¶

    +
    +

    0.8.10 Index in forEach¶

    +
      +
    • Renamed IJavetConsumer to IJavetUniConsumer

    • +
    • Added IJavetUniIndexedConsumer and IJavetBiIndexedConsumer

    • +
    • Fixed a bug in V8FunctionCallback on varargs

    • +
    • Deprecated bindFunctions() and bindProperties()

    • +
    • Added @CheckReturnValue to warn ignored return value

    • +
    +
    +
    +

    0.8.9 Declarative Property Interception¶

    +
      +
    • Renamed setFunction() to bindFunction() in IV8ValueObject

    • +
    • Renamed setFunctions() to bindFunctions() in IV8ValueObject

    • +
    • Added disableInDebugMode() and enableInDebugMode() to JavetEngineGuard

    • +
    • Added bind(), bindProperty() and bindProperties() in IV8ValueObject

    • +
    • Added @V8Property for IV8ValueObject.bindProperties()

    • +
    +
    +
    +

    0.8.8 Hotfix the Source Code¶

    +
      +
    • Re-organized doc.

    • +
    • Added getJSFunctionType(), getSourceCode() and setSourceCode() to IV8ValueFunction

    • +
    +
    +
    +

    0.8.7 Native Modules for Node.js¶

    +
      +
    • Supported native modules with rebuilt scripts

    • +
    • Fixed NodeRuntime.await() to emit tasks

    • +
    +
    +
    +

    0.8.6 Event Loop for Node.js¶

    +
      +
    • Upgraded Linux build environment to Ubuntu 20.04 + GCC 9.3

    • +
    • Enhanced NodeRuntime.await() to allow interaction from other threads

    • +
    +
    +
    +

    0.8.5 Error Codes¶

    +
      +
    • Universal object conversion is turned on for all API

    • +
    • Added createV8ValueDouble(), createV8ValueString() and createV8ValueZonedDateTime() to V8Runtime

    • +
    • Added JavetError with error codes

    • +
    • Refactored invoke(), call(), set(), has() to take Object instead of V8Value

    • +
    • Removed a few exceptions

    • +
    +
    +
    +

    0.8.4 V8 v9.0¶

    +
      +
    • Added gcBeforeEngineClose to JavetEngineConfig

    • +
    • Added JavetCallbackException

    • +
    • Added IV8Value#isNullOrUndefined

    • +
    • Upgraded Node.js to v14.16.1 (2021-04-06)

    • +
    • Upgraded V8 to v9.0.257 (2021-02-24)

    • +
    +
    +
    +

    0.8.3 GC¶

    +
      +
    • Added V8Runtime.lowMemoryNotification() and V8Runtime.idleNotificationDeadline()

    • +
    • Added V8Host.setMemoryUsageThresholdRatio(), V8Host.enableGCNotification(), and V8Host.disableGCNotification()

    • +
    • Updated JavetEnginePool to be lock free

    • +
    • Added autoSendGCNotification to JavetEngineConfig

    • +
    • Moved JavetCallbackContext management from V8ValueFunction to V8

    • +
    • Added JavetPromiseRejectCallback for V8 mode

    • +
    +
    +
    +

    0.8.2 Conversion for Primitive¶

    +
      +
    • Enabled auto type conversion in primitive types

    • +
    • Fixed a memory leak issue during V8Runtime resetContext(), resetIsolate(), close()

    • +
    +
    +
    +

    0.8.1 Declarative Function Interception¶

    +
      +
    • Enabled declarative function interception

    • +
    • Enabled custom object converter in function callback

    • +
    • Added allowEval to JavetEngineConfig

    • +
    • Refactored built-in module API for Node.js mode

    • +
    +
    +
    +

    0.8.0 First Time with Node.js¶

    +
      +
    • Supported Node.js v14.16.0 (2021-02-23)

    • +
    • Added V8Module and V8Script

    • +
    • Enhanced V8ValuePromise

    • +
    • Added dynamic switch between Node.js and V8

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/release_notes/release_notes_0_8.rst b/docs/release_notes/release_notes_0_8.rst new file mode 100644 index 000000000..3db323872 --- /dev/null +++ b/docs/release_notes/release_notes_0_8.rst @@ -0,0 +1,89 @@ +=================== +Release Notes 0.8.x +=================== + +0.8.10 Index in forEach +----------------------- + +* Renamed ``IJavetConsumer`` to ``IJavetUniConsumer`` +* Added ``IJavetUniIndexedConsumer`` and ``IJavetBiIndexedConsumer`` +* Fixed a bug in ``V8FunctionCallback`` on varargs +* Deprecated ``bindFunctions()`` and ``bindProperties()`` +* Added ``@CheckReturnValue`` to warn ignored return value + +0.8.9 Declarative Property Interception +--------------------------------------- + +* Renamed ``setFunction()`` to ``bindFunction()`` in ``IV8ValueObject`` +* Renamed ``setFunctions()`` to ``bindFunctions()`` in ``IV8ValueObject`` +* Added ``disableInDebugMode()`` and ``enableInDebugMode()`` to ``JavetEngineGuard`` +* Added ``bind()``, ``bindProperty()`` and ``bindProperties()`` in ``IV8ValueObject`` +* Added ``@V8Property`` for ``IV8ValueObject.bindProperties()`` + +0.8.8 Hotfix the Source Code +---------------------------- + +* Re-organized doc. +* Added ``getJSFunctionType()``, ``getSourceCode()`` and ``setSourceCode()`` to ``IV8ValueFunction`` + +0.8.7 Native Modules for Node.js +-------------------------------- + +* Supported native modules with rebuilt scripts +* Fixed ``NodeRuntime.await()`` to emit tasks + +0.8.6 Event Loop for Node.js +---------------------------- + +* Upgraded Linux build environment to Ubuntu 20.04 + GCC 9.3 +* Enhanced ``NodeRuntime.await()`` to allow interaction from other threads + +0.8.5 Error Codes +----------------- + +* Universal object conversion is turned on for all API +* Added ``createV8ValueDouble()``, ``createV8ValueString()`` and ``createV8ValueZonedDateTime()`` to ``V8Runtime`` +* Added ``JavetError`` with error codes +* Refactored ``invoke()``, ``call()``, ``set()``, ``has()`` to take ``Object`` instead of ``V8Value`` +* Removed a few exceptions + +0.8.4 V8 v9.0 +------------- + +* Added ``gcBeforeEngineClose`` to ``JavetEngineConfig`` +* Added ``JavetCallbackException`` +* Added ``IV8Value#isNullOrUndefined`` +* Upgraded Node.js to ``v14.16.1`` `(2021-04-06) `_ +* Upgraded V8 to ``v9.0.257`` `(2021-02-24) `_ + +0.8.3 GC +-------- + +* Added ``V8Runtime.lowMemoryNotification()`` and ``V8Runtime.idleNotificationDeadline()`` +* Added ``V8Host.setMemoryUsageThresholdRatio()``, ``V8Host.enableGCNotification()``, and ``V8Host.disableGCNotification()`` +* Updated JavetEnginePool to be lock free +* Added ``autoSendGCNotification`` to ``JavetEngineConfig`` +* Moved ``JavetCallbackContext`` management from ``V8ValueFunction`` to V8 +* Added ``JavetPromiseRejectCallback`` for V8 mode + +0.8.2 Conversion for Primitive +------------------------------ + +* Enabled auto type conversion in primitive types +* Fixed a memory leak issue during V8Runtime ``resetContext()``, ``resetIsolate()``, ``close()`` + +0.8.1 Declarative Function Interception +--------------------------------------- + +* Enabled declarative function interception +* Enabled custom object converter in function callback +* Added ``allowEval`` to ``JavetEngineConfig`` +* Refactored built-in module API for Node.js mode + +0.8.0 First Time with Node.js +----------------------------- + +* Supported Node.js ``v14.16.0`` `(2021-02-23) `_ +* Added ``V8Module`` and ``V8Script`` +* Enhanced ``V8ValuePromise`` +* Added dynamic switch between Node.js and V8 diff --git a/docs/release_notes/release_notes_0_9.html b/docs/release_notes/release_notes_0_9.html new file mode 100644 index 000000000..15b27479e --- /dev/null +++ b/docs/release_notes/release_notes_0_9.html @@ -0,0 +1,481 @@ + + + + + + + + Release Notes 0.9.x - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Release Notes 0.9.x¶

    +
    +

    0.9.12 Private Properties¶

    +
      +
    • Added error code 503

    • +
    • Enhanced V8Property to support built-in symbols

    • +
    • Added V8ValueSharedArrayBuffer

    • +
    • Added registerCustomObject() and unregisterCustomObject() to JavetObjectConverter

    • +
    • Added private property support to IV8ValueObject

    • +
    • Fixed potential core dump issue in V8 runtime close.

    • +
    • Added Javadoc.

    • +
    +
    +
    +

    0.9.11 V8 v9.3¶

    +
      +
    • Upgraded Node.js to v14.17.6 (2021-08-31)

    • +
    • Upgraded V8 to v9.3.345.16 (2021-08-17)

    • +
    • Added unbind(), unbindProperty(), unbindFunction() to IV8ValueObject

    • +
    • Updated V8Runtime to be completely thread-safe

    • +
    • Added V8ValueBuiltInSymbol

    • +
    • Added getOwnPropertySymbols() to V8ValueBuiltInObject

    • +
    • Added createV8ValueSymbol() to V8Runtime

    • +
    • Added symbol to V8Property to enable getter and setter on symbol

    • +
    • Added error code 407 and 805

    • +
    +
    +
    +

    0.9.10 Polyfill Java Interfaces¶

    +
      +
    • Added JavetVirtualObject

    • +
    • Updated JavetUniversalProxyHandler to allow passing V8Value

    • +
    • Updated JavetUniversalProxyHandler to allow passing V8ValueFunction as anonymous function

    • +
    • Updated JavetUniversalProxyHandler to allow passing V8ValueObject as anonymous object

    • +
    • Added isClosed() to IJavetClosable

    • +
    • Added error code 602 and 603

    • +
    +
    +
    +

    0.9.9 Mac OS x86_64¶

    +
      +
    • Upgraded Node.js to v14.17.4 (2021-07-29)

    • +
    • Added support to Mac OS x86_64

    • +
    • Removed staticClassEnabled from JavetProxyConverter

    • +
    +
    +
    +

    0.9.8 Empower the Promise¶

    +
      +
    • Added resolve() and reject() to V8ValuePromise

    • +
    • Added staticClassEnabled to JavetProxyConverter

    • +
    • Added construct() to JavetUniversalProxyHandler

    • +
    • Added Dockerfile for Linux x86-64

    • +
    • Refactored document for how to build Javet

    • +
    +
    +
    +

    0.9.7 Proxy Converter v2¶

    +
      +
    • Added static mode to JavetUniversalProxyHandler

    • +
    • Added ownKeys() to JavetUniversalProxyHandler

    • +
    +
    +
    +

    0.9.6 Proxy Converter v1¶

    +
      +
    • Added IV8ValueProxy and V8ValueProxy

    • +
    • Added getTarget(), getHandler(), isRevoked() and revoke() to IV8ValueProxy

    • +
    • Added createV8ValueProxy() to V8Runtime

    • +
    • Added JavetUniversalProxyHandler and JavetProxyConverter

    • +
    +
    +
    +

    0.9.5 V8 v9.2¶

    + +
    +
    +

    0.9.4 Multi-process Safe¶

    +
      +
    • Added JavetConverterConfig

    • +
    • Added JavetEntityFunction for JavetObjectConverter

    • +
    • Updated JavetObjectConverter to allow skipping functions

    • +
    • Added getPrototype() and setPrototype() to IV8ValueObject

    • +
    • Changed the way that Javet libraries are deployed to be multi-process safe

    • +
    +
    +
    +

    0.9.3 Module Resolver¶

    +
      +
    • Upgraded Node.js to v14.17.2 (2021-07-01)

    • +
    • Added IV8ModuleResolver to allow intercepting module resolving callback

    • +
    • Added V8BindEnabler to determine whether certain injection is enabled or not

    • +
    • Added NodeModuleProcess#getVersion

    • +
    • Updated JavetPrimitiveConverter and JavetObjectConverter to check recursion depth for circular structure detection

    • +
    +
    +
    +

    0.9.2 Anonymous Functions in Converter¶

    +
      +
    • Upgraded Node.js to v14.17.1 (2021-06-15)

    • +
    • Updated JavetObjectConverter to handle anonymous functions more efficiently

    • +
    • Added V8ValueBuiltInObject#assign

    • +
    +
    +
    +

    0.9.1 V8 in Classloader¶

    +
      +
    • Moved V8 to a custom classloader

    • +
    • Enabled unloadLibrary() and loadLibrary() in V8Host

    • +
    +
    +
    +

    0.9.0 V8 v9.1¶

    +
      +
    • Upgraded Node.js to v14.17.0 (2021-05-11)

    • +
    • Upgraded V8 to v9.1.269.28 (2021-05-10)

    • +
    • Added thisObjectRequired to @V8Function and @V8Property

    • +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/release_notes/release_notes_0_9.rst b/docs/release_notes/release_notes_0_9.rst new file mode 100644 index 000000000..7517a8137 --- /dev/null +++ b/docs/release_notes/release_notes_0_9.rst @@ -0,0 +1,110 @@ +=================== +Release Notes 0.9.x +=================== + +0.9.12 Private Properties +------------------------- + +* Added error code 503 +* Enhanced ``V8Property`` to support built-in symbols +* Added ``V8ValueSharedArrayBuffer`` +* Added ``registerCustomObject()`` and ``unregisterCustomObject()`` to ``JavetObjectConverter`` +* Added private property support to ``IV8ValueObject`` +* Fixed potential core dump issue in V8 runtime close. +* Added Javadoc. + +0.9.11 V8 v9.3 +-------------- + +* Upgraded Node.js to ``v14.17.6`` `(2021-08-31) `_ +* Upgraded V8 to ``v9.3.345.16`` `(2021-08-17) `_ +* Added ``unbind()``, ``unbindProperty()``, ``unbindFunction()`` to ``IV8ValueObject`` +* Updated ``V8Runtime`` to be completely thread-safe +* Added ``V8ValueBuiltInSymbol`` +* Added ``getOwnPropertySymbols()`` to ``V8ValueBuiltInObject`` +* Added ``createV8ValueSymbol()`` to ``V8Runtime`` +* Added ``symbol`` to ``V8Property`` to enable getter and setter on symbol +* Added error code 407 and 805 + +0.9.10 Polyfill Java Interfaces +------------------------------- + +* Added ``JavetVirtualObject`` +* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8Value`` +* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8ValueFunction`` as anonymous function +* Updated ``JavetUniversalProxyHandler`` to allow passing ``V8ValueObject`` as anonymous object +* Added ``isClosed()`` to ``IJavetClosable`` +* Added error code 602 and 603 + +0.9.9 Mac OS x86_64 +------------------- + +* Upgraded Node.js to ``v14.17.4`` `(2021-07-29) `_ +* Added support to Mac OS x86_64 +* Removed ``staticClassEnabled`` from ``JavetProxyConverter`` + +0.9.8 Empower the Promise +------------------------- + +* Added ``resolve()`` and ``reject()`` to ``V8ValuePromise`` +* Added ``staticClassEnabled`` to ``JavetProxyConverter`` +* Added ``construct()`` to ``JavetUniversalProxyHandler`` +* Added Dockerfile for Linux x86-64 +* Refactored document for how to build Javet + +0.9.7 Proxy Converter v2 +------------------------ + +* Added static mode to ``JavetUniversalProxyHandler`` +* Added ``ownKeys()`` to ``JavetUniversalProxyHandler`` + +0.9.6 Proxy Converter v1 +------------------------ + +* Added ``IV8ValueProxy`` and ``V8ValueProxy`` +* Added ``getTarget()``, ``getHandler()``, ``isRevoked()`` and ``revoke()`` to ``IV8ValueProxy`` +* Added ``createV8ValueProxy()`` to ``V8Runtime`` +* Added ``JavetUniversalProxyHandler`` and ``JavetProxyConverter`` + +0.9.5 V8 v9.2 +------------- + +* Upgraded V8 to ``v9.2.230.21`` `(2021-07-19) `_ + +0.9.4 Multi-process Safe +------------------------ + +* Added ``JavetConverterConfig`` +* Added ``JavetEntityFunction`` for ``JavetObjectConverter`` +* Updated ``JavetObjectConverter`` to allow skipping functions +* Added ``getPrototype()`` and ``setPrototype()`` to ``IV8ValueObject`` +* Changed the way that Javet libraries are deployed to be multi-process safe + +0.9.3 Module Resolver +--------------------- + +* Upgraded Node.js to ``v14.17.2`` `(2021-07-01) `_ +* Added ``IV8ModuleResolver`` to allow intercepting module resolving callback +* Added ``V8BindEnabler`` to determine whether certain injection is enabled or not +* Added ``NodeModuleProcess#getVersion`` +* Updated ``JavetPrimitiveConverter`` and ``JavetObjectConverter`` to check recursion depth for circular structure detection + +0.9.2 Anonymous Functions in Converter +-------------------------------------- + +* Upgraded Node.js to ``v14.17.1`` `(2021-06-15) `_ +* Updated ``JavetObjectConverter`` to handle anonymous functions more efficiently +* Added ``V8ValueBuiltInObject#assign`` + +0.9.1 V8 in Classloader +----------------------- + +* Moved V8 to a custom classloader +* Enabled ``unloadLibrary()`` and ``loadLibrary()`` in ``V8Host`` + +0.9.0 V8 v9.1 +------------- + +* Upgraded Node.js to ``v14.17.0`` `(2021-05-11) `_ +* Upgraded V8 to ``v9.1.269.28`` `(2021-05-10) `_ +* Added ``thisObjectRequired`` to ``@V8Function`` and ``@V8Property`` diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..3c42a0721 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +Pygments==2.9.0 +furo==2021.9.8 +sphinx==4.2.0 +sphinx_inline_tabs==2021.8.17b10 diff --git a/docs/resources/css/custom.css b/docs/resources/css/custom.css new file mode 100644 index 000000000..ca805991e --- /dev/null +++ b/docs/resources/css/custom.css @@ -0,0 +1,7 @@ +h4, h5, h6 { + text-transform: initial; +} + +code.literal { + background-color: lightgray; +} \ No newline at end of file diff --git a/docs/resources/images/logo.drawio b/docs/resources/images/logo.drawio new file mode 100644 index 000000000..8da09ac9c --- /dev/null +++ b/docs/resources/images/logo.drawio @@ -0,0 +1 @@ +zVbbctowEP0aHsP4xu0xMZc0k3bSSdqEvKlY2KKy15UFGL6+kr3GFoYmnaGdwAx4z14s7Tlau+P6cT4TJI0+Q0B5x7GCvOOOO47jDBz1q4EdAh4CoWBBCdk18Mj2FEEL0TULaGYESgAuWWqCC0gSupAGRoSArRm2BG7eNSUhbQGPC8Lb6DMLZFSiw55V47eUhVF1Z9tCT0yqYASyiASwbUDupOP6AkCWV3HuU657V/WlzJue8R4WJmgi35MwWt1++QrRXX+feQGbk/nKnV0NRrg4uat2TAPVADRByAhCSAif1OiNgHUSUF3WUlYdcw+QKtBW4IpKuUM2yVqCgiIZc/TSnMkXnd7toTVveMY5Vi6MXWUkUuxemsa8rqDNOq2w6rzgWutAmQkktESmjHP0LyGRuFC7sn3gIIpuuN5YfxXebjcyoPvVALD5MwoxVetQAYJyItnGFBRBXYaHOExViyW7RkAKLJFZo/KDBlQAnrAByqs6X7ahAnVRFnxXsj2yzNVlsBYLiklG1cYOa6hQ3Gn1PT/d7Gfh/vUb+3Q3vk/ms3D1ejUs77YhfI3daalxGzFJH1Oy0PZWjRhTSSRLy1O/ZLlWZEHflMSM6y3dUr6hki2IybPjtXm2rH7f9xW+oUJn8GvOwkT5YhYEheozKeAnrVJQS0slpEYV35/0ptODWnQtmp89r2f0UiX0tbgNeqqhuK0nkYc9jBpDqMJOacyg8G/5clt83V23GFM7liZJb3YOIYItX6gOUfEnLk6pwpxKnPyg/AEyJhmcrHl/FHCoXQgFt2NfhMcjFpX8jlm0nW6l/SaRjvWPiPRaRE46Tp9r3rKUJAah/V9r/Ygq+nKFsGLdSkDEhNd+dRXq/6eqklpZWazEP6hQmnS7l6B7OOoOhm8z7v1fxnstxr9/YELOTvBTE9s8sO1JfwlSB27XbX68I4Lbg9nRR7r5uQjZyqzfGMvHcP3a7U5+Aw== \ No newline at end of file diff --git a/docs/resources/images/logo.ico b/docs/resources/images/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..2ebbc2723a6e75446c8cf8f3197c60c2c8d0b5e6 GIT binary patch literal 1150 zcmd^<%S%*o6vux->u?o<8*>r;2W@oWu6>(Y1O`#!D+Y9uQAr{5QEFj9hC~iyX3;~& z2VsIZO+IGkMrrn#9L>2iI;1WJHD5EI&b`ys<$$}0%lCKA_nh7kH{EQ`dFALKb`~bgT&tf) zc-UM;%XJ%#j#8Sc%BZnjW^Ka7r;1D#?w#SwXfIbUou~If1HY!<(tg8E?BlTc9!cFt zJm{gl-p=bsEnK;97T5iotn^)D+MdO1%}MmpPKqy{<8fOp^OJ6xtIG)c2lwmPo*&2E z)rPJOQD0e1(DRJB+j&Hv6!N1rpU86?ovpQWG&ykIt)sG}fPUv45|Z1RokTdL@9BQl z{Vrx4C)m__h`p*Hcq^BkkcZ!)_a?R^pH;uLe_u*3qCG`?YdB4Eaojv(#*xFi&nbP8 y9;BJqq&`LLWjSlZjZ&XR;-{DB(<0*D4wI+bf8hT+3u*El#Q&T3$odZ)R{jB)UVl9R literal 0 HcmV?d00001 diff --git a/docs/resources/images/logo.png b/docs/resources/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fca42ab030c643786c73ede4ad278137b9902450 GIT binary patch literal 1289 zcmV+k1@`)hP)Px#1ZP1_K>z@;j|==^1poj6j8IHeMa<>@!{7ZoirWBY%vGD=%jExQsOChF-Nxen zbgtg_Z4%|25Qcj#qyxa^a^dy9(mNX*7?Ta{X&o2UZCSo zm*C0c{(ZFTD1X+w+WP`%&62_KU!mlHw(Kf_*S_5Qn#S|4)A$#3(rv2e5OC0@&i1p_ z`5SlBOO)S>yze!K*}>lY4Q|h(%k{0o*d{7300028$KEV4H(F(J$Kd&+x6Bk488$sc zUu$=0b%KMFq*Y&PWpRGP+w@IVV1107%HsTCZFzc$n5w?iAtfm;G&){sb-vc_JVQ&R zxz4P?*CZ${z}WCZOH_`ZvBux{SYvK+e~ruJ{xdm1x6b9EwaK%|;EJ2AxXD0|rS%K~!i%?UrX-6fqQq150m8 z?@c;NCv*WpK(Nr8h=70%up**h|Kle2p3E#|WS*VYUI871OEW@3XRAht$*2;VKtktoi;x>^R#gqHKth={(7~v! zyWoa|($k=Wk(5Yo;Ta*JddQ$$$Os8FG(rdE<}LEe$%Zxw734z)rMQXwLJ80&p%Td8 zWU!&Rr%0%-mSq$;mk|r=;)N49X#ynmQwcg(%57~CyNt8^XuzZtH8i*42VIxex9%bLwZ$r7mKir zkPsRvtpdY$Fd(ifFfvNZ?vfCxDdeipE)wF#F*Z)Cn2A9Qh^q?Ro0L=cr5qh06(2{g zp=6T~w(Nt4%9lnCs>AaLHt2{LLEbzErPOXV2YHO_1h4@194V7?0Xr#+e)vev2p@Y8y z%S*IH*QVs=7GKHABjN;? z;3!mc`Wn+n-@KJ_kB2TE1>Q-yxFE#)4-`%KUw1ZoCG6css`h~V$U_&80?P96)6wT+ zDR;I-Zx5GK=>LMF;AUhRsku{U@F?)*D}JwzTsKlAukXgmDGkjVyZaWYPP@za7*Bc> z5Z?}Y-LXnsoiEx;8ucs9QNXj_c_ZBz=C3f{dD63h`0?|XJpBFVNQi^|u+4FL;v5A$ zi=8*H)fISaoR;KSz+$mjEEbE!VzF2(|3-+vRx_p>bCjCm00000NkvXXu0mjfl7xH} literal 0 HcmV?d00001 diff --git a/docs/search.html b/docs/search.html new file mode 100644 index 000000000..ff36cd68c --- /dev/null +++ b/docs/search.html @@ -0,0 +1,316 @@ + + + + + + + Search - Javet 0.9.12 documentation + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +

    Error

    +

    + Please activate JavaScript to enable the search functionality. +

    +
    + + +
    + +
    +
    + +
    + +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/docs/searchindex.js b/docs/searchindex.js new file mode 100644 index 000000000..c96c54eb5 --- /dev/null +++ b/docs/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["development/build","development/build_javet_from_scratch","development/build_javet_with_docker","development/build_javet_with_pre_built_binaries","development/debug_with_chrome_developer_tools","development/design","development/index","development/test","development/tools","faq/background/history_with_j2v8","faq/background/index","faq/background/what_is_the_motivation","faq/development/how_to_think_in_javet","faq/development/index","faq/development/where_are_es6_api_in_v8_mode","faq/environment/can_javet_support_legacy_linux","faq/environment/can_javet_support_mac","faq/environment/index","faq/index","faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed","faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools","faq/troubleshooting/index","faq/troubleshooting/why_node_js_crashes_when_being_closed","index","reference/best_practices","reference/error_codes","reference/index","reference/javadoc/index","reference/load_and_unload","reference/lock","reference/logging","reference/memory_management","reference/modularization","reference/performance","reference/termination","reference/todo_list","reference/v8_collection","reference/v8_function","reference/v8_promise","release_notes/index","release_notes/release_notes_0_7","release_notes/release_notes_0_8","release_notes/release_notes_0_9","tutorial/advanced/index","tutorial/advanced/interact_with_node_js","tutorial/advanced/java_and_javascript_interop","tutorial/advanced/object_converter","tutorial/basic/engine_pool","tutorial/basic/hello_javet","tutorial/basic/index","tutorial/basic/installation","tutorial/basic/interception","tutorial/basic/javet_shell","tutorial/basic/node_js_mode_and_v8_mode","tutorial/basic/polyfill","tutorial/basic/spring_integration","tutorial/index","tutorial/migration_guides/index","tutorial/migration_guides/migrate_from_j2v8"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["development\\build.rst","development\\build_javet_from_scratch.rst","development\\build_javet_with_docker.rst","development\\build_javet_with_pre_built_binaries.rst","development\\debug_with_chrome_developer_tools.rst","development\\design.rst","development\\index.rst","development\\test.rst","development\\tools.rst","faq\\background\\history_with_j2v8.rst","faq\\background\\index.rst","faq\\background\\what_is_the_motivation.rst","faq\\development\\how_to_think_in_javet.rst","faq\\development\\index.rst","faq\\development\\where_are_es6_api_in_v8_mode.rst","faq\\environment\\can_javet_support_legacy_linux.rst","faq\\environment\\can_javet_support_mac.rst","faq\\environment\\index.rst","faq\\index.rst","faq\\troubleshooting\\a_dynamic_link_library_dll_initialization_routine_failed.rst","faq\\troubleshooting\\can_i_debug_javet_in_chrome_dev_tools.rst","faq\\troubleshooting\\index.rst","faq\\troubleshooting\\why_node_js_crashes_when_being_closed.rst","index.rst","reference\\best_practices.rst","reference\\error_codes.rst","reference\\index.rst","reference\\javadoc\\index.rst","reference\\load_and_unload.rst","reference\\lock.rst","reference\\logging.rst","reference\\memory_management.rst","reference\\modularization.rst","reference\\performance.rst","reference\\termination.rst","reference\\todo_list.rst","reference\\v8_collection.rst","reference\\v8_function.rst","reference\\v8_promise.rst","release_notes\\index.rst","release_notes\\release_notes_0_7.rst","release_notes\\release_notes_0_8.rst","release_notes\\release_notes_0_9.rst","tutorial\\advanced\\index.rst","tutorial\\advanced\\interact_with_node_js.rst","tutorial\\advanced\\java_and_javascript_interop.rst","tutorial\\advanced\\object_converter.rst","tutorial\\basic\\engine_pool.rst","tutorial\\basic\\hello_javet.rst","tutorial\\basic\\index.rst","tutorial\\basic\\installation.rst","tutorial\\basic\\interception.rst","tutorial\\basic\\javet_shell.rst","tutorial\\basic\\node_js_mode_and_v8_mode.rst","tutorial\\basic\\polyfill.rst","tutorial\\basic\\spring_integration.rst","tutorial\\index.rst","tutorial\\migration_guides\\index.rst","tutorial\\migration_guides\\migrate_from_j2v8.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":[1,3,4,9,15,23,24,31,32,34,36,37,39,44,46,50,51,54,58],"00000000":4,"003":9,"009":9,"01":42,"019":9,"02":[40,41],"032":33,"04":[1,2,3,15,40,41,50],"05":42,"06":[41,42],"07":42,"08":42,"1":[1,3,5,9,12,15,24,28,31,32,33,34,36,37,46,51,52,53,54,58],"10":[1,2,3,31,33,34,50],"1000":44,"10000":34,"100000000":4,"101":25,"102":25,"103":25,"10308":31,"1038":31,"104":25,"105":25,"10700k":[9,33],"10gb":2,"11":[1,3,46],"110":9,"12":[23,50],"120gb":2,"123":[37,45,46,51,54],"124":51,"127":[4,31],"128":31,"14":[8,9],"143":33,"15":42,"150":29,"16":[1,3,15,23,31,33,41,42,50],"17":[8,23,42],"175":45,"18":[15,50],"19":42,"2":[8,9,12,15,16,23,24,28,31,32,33,34,36,37,46,48,51,52,53,54,58],"20":[1,2,3,22,41,50],"200":51,"201":25,"2012":[16,23],"2015":9,"2016":9,"2017":9,"2019":[1,3,6,9],"2020":[9,11],"2021":[40,41,42,58],"21":42,"213":9,"2147483647":31,"2147483648":31,"23":[32,41,54],"230":42,"234567":31,"23456789012345":31,"24":41,"253":33,"255":[9,31,40,45],"257":41,"263":[31,33],"264":31,"269":42,"274":9,"28":42,"29":42,"299":9,"3":[0,1,3,6,9,15,22,23,28,32,33,36,37,45,46,48,51,52],"301":25,"302":25,"31":42,"32":[4,31],"324":31,"32767":31,"32768":31,"338":9,"34":[32,54],"345":[23,42],"35":9,"363":33,"38":31,"3rd":[30,37],"4":[1,3,9,28,31,32,33,36,37,44,46,51,52],"401":25,"402":25,"403":25,"404":25,"405":25,"406":25,"407":[25,42],"410":33,"428":9,"4294967295":31,"45":54,"458":33,"4g":2,"5":[4,22,31,32,44,51,52],"500":44,"501":25,"502":25,"503":[25,42],"508":33,"51":33,"571":9,"6":[4,8,9,23,32,44,51,52],"60":2,"601":25,"602":[25,42],"603":[25,42],"64":[31,42],"647":33,"65":33,"65535":31,"660":33,"688":9,"7":[1,3,4,15,23,31,39,44,50,51,52,58],"70":15,"701":25,"702":25,"703":25,"748":33,"751":33,"76":51,"8":[1,3,4,6,9,15,23,31,33,39,44,46],"80":15,"801":25,"802":25,"803":25,"804":25,"805":[25,42],"82":22,"846":33,"8991":44,"9":[9,15,23,39,44,50],"90":15,"9229":4,"968":33,"boolean":46,"break":[9,32,37,38,44,46,52],"byte":[5,31,37],"case":[5,7,9,29,31,32,33,37,38,40,58],"catch":[34,37,38,44,46,52],"char":37,"class":[30,32,37,44,46,51,55],"const":[32,36,37,44,45,54],"default":[4,5,28,31,32,34,37,46,51,53],"do":[7,9,12,20,22,24,29,31,32,37],"export":[1,32],"final":[25,31,32,34],"float":[31,37],"function":[5,14,23,26,31,32,40,44,45,51,58],"import":[22,30,32,34,38,58],"instanceof":46,"int":[34,37,44,46,51],"long":[2,29,37,46],"new":[1,5,7,9,11,16,23,29,30,32,33,34,36,37,38,44,45,46,47,51,52,53,54,55],"null":[32,37,38,44,51,52],"public":[30,37,38,44,46,51,54,55],"return":[24,32,34,37,38,41,45,46,51,55],"short":[16,31,37],"static":[0,1,37,42,44],"super":46,"switch":[4,23,24,28,29,41],"throw":[32,34,37,38,44,46,54],"true":[1,11,28,32,34,37,44,45,46,52],"try":[5,9,11,23,24,29,32,34,36,37,38,44,46,47,48,51,52,53,54],"var":[34,44],"void":[30,37,44,46,51,54],"voil\u00e0":[4,44,46],"while":[2,3,34,44,46,52],A:[1,5,18,21,32,46],And:[9,23,44],As:[2,3,4,5,12,28,30,31,37,46,55],At:[9,11],Be:[2,4,24,29,31,37,38,46],But:[31,32,38,55],By:[31,51],For:[8,12,32,37,46],If:[1,3,12,16,22,23,24,32,34,37,46,51,52,58],In:[1,4,5,12,22,24,29,31,32,33,34,37,38,44,46,58],It:[0,5,9,12,23,24,29,31,32,33,37,47,52,53,58],Its:[9,31,58],NOT:[5,29,37],No:[5,9,32,34,36,37,44,46,50],Not:[5,50],Of:[2,29,31,32,37,58],One:5,Or:[2,23],That:[5,9,16,22,30,31,32,34,37,46,58],The:[1,2,4,5,7,9,12,16,19,22,25,28,31,32,34,37,38,44,45,46,51,52,53,58],Then:46,There:[5,9,12,15,16,25,28,31,32,37,46,53],To:[4,9,16,35,45],With:[9,12,32],__dirnam:32,__filenam:32,_zn4nodel23thread_local_modpending:1,a123:46,abandon:[16,58],abc:[37,45,46],abl:[11,12,16,22,32,34,37,44,58],about:29,abov:[37,46],absent:14,absolute_path_to_node_js_build:3,absolute_path_to_v8_build:3,accept:[4,30,37],access:[3,12,25,31,46],accordingli:37,achiev:[5,9,29,31,37,46],acquir:[24,25,58],across:31,activ:[9,22,32],actual:[2,4,5,9,12,25,31,32,37,44],actualparameters:25,actualparametertyp:25,ad:[1,9,33,40,41,42],add:[4,15,32,36,37,38,46,51,54,58],addit:[15,33,46,58],address:[4,22,24,31,44],admit:9,advanc:[15,23,38,56],affect:31,aforement:31,after:[3,4,9,24,28,34,37,38,46,58],afterward:[34,38],ag:9,again:[28,46],against:1,aim:[14,54,58],air:[9,16,23],aka:4,alien:46,align:5,all:[1,3,4,5,9,22,28,31,32,37,41,44,46,58],alloc:[5,29],allow:[5,9,28,30,33,37,38,41,42,44,45,46,47,51,58],allowev:41,almost:[5,9,37,44,46],alreadi:[25,28,38],also:[1,2,5,9,11,12,23,29,30,31,32,38,44,46,58],altern:[15,46],altogeth:3,alwai:[5,24,37,46],am:[9,37,46],among:[29,58],amount:58,an:[4,5,9,11,12,14,23,24,29,30,31,32,33,34,38,46,51,52,53],analysi:32,analyz:32,android:9,ani:[1,9,16,23,25,30,32,34,37,46,58],annot:[37,46],annotationbasedcallbackreceiv:37,anonym:37,anoth:54,answer:16,anytim:23,apach:23,api:[4,5,9,11,12,13,18,23,26,28,29,30,31,32,35,37,38,40,41,44,46,54,58],app:44,appear:[4,37],append:[45,46],appli:[5,24,29,32,34,37,44],applic:[4,5,12,22,28,29,31,32,33,34,37,38,44,45,46,47,51,52,58],approach:[32,37],apt:[15,32],ar:[0,1,2,3,4,5,8,9,12,13,15,16,18,22,23,24,25,28,29,31,32,34,37,38,42,44,45,46,51,53,58],arbitrari:[4,5,12,45,46,58],arbitrarymethod:37,architectur:[6,9],area:31,arg:[1,37,44,46],argument:[37,46,58],arm64:[23,50],around:[9,32],arrai:[31,36,40,46],articl:5,artifactid:[23,50],ask:58,assertarrayequ:46,assertequ:[34,36,37,46],assertfals:[34,36,37,46],assertnotnul:[36,46],assertthrow:46,asserttru:[34,36,37,46],assign:[32,42,45],assum:[28,32,37],ast:12,async:[5,22,38],atomicboolean:44,atomicinteg:36,attack:[34,46],attent:58,aussi:46,authent:4,author:4,auto:[4,15,41],autoclos:46,autom:[31,46],automat:[5,7,25,28,29,32,46,48,51,58],autosendgcnotif:41,avail:[2,3,4,5,19,53],avoid:[5,12,24,46],aw:31,await:[5,24,38,41,44],awar:[23,24],awesom:[23,53],awt:45,b:[4,32,37,45,46,52,54],back:[12,31,32,37,46],background:[18,23,38],backup:32,bad:[5,9],base:[2,7,31,37,46,58],bases:2,basic:[14,23,37,47,54,56,58],bat:1,bean:55,beauti:[5,37],becaus:[4,5,8,9,16,22,23,24,25,28,29,31,33,37,38,46,47,53,54,58],been:[8,9,22,37,58],befor:[4,12,22,32,46],begin:5,behavior:[24,31],behind:[5,11,12,22],being:[18,21,31,32,34,46],belong:37,below:46,besid:[16,37],best:[5,23,26],better:[4,5,29,33,37],between:[5,9,23,24,37,41,45,46],beyond:5,bi:46,biconsum:36,bigdecim:54,bigint64arrai:31,bigint:[23,31,40],biguint64arrai:31,bin:[1,15],binari:[0,1,6,25,31],bind:[32,38,41,51,58],bindfunct:41,bindproperti:41,bit:[12,31,32,46],blank:37,block:[29,31,46,48],blogspot:23,bodi:[37,44],borrow:[31,37],both:[5,16,25,28,31,37,38,46,53,58],bother:32,boundari:5,box:32,brand:5,breakpoint:4,brew:[1,3],bring:[5,46],broadcast:31,broken:[1,9,31,37],browser:[4,24],buffer:[5,31],bug:[41,58],bui:[9,16],build:[4,5,6,8,11,15,23,32,41,42,50],builder:12,built:[0,1,2,4,6,7,25,31,33,34,37,38,41,42,46,58],bundl:8,busi:58,bytebuff:31,c:[1,32,37,46],cach:[32,40],calcul:[5,37],call:[5,9,12,22,24,28,29,31,32,34,38,41,44,45,46,51,58],callabl:46,callasconstructor:[37,40,54],callback:[4,22,25,31,32,37,38,41,42,44],callbackinjectionfailur:25,callbackmethodfailur:25,callbackregistrationfailur:25,callbacksignatureparametersizemismatch:25,callbacksignatureparametertypemismatch:25,callbackunknownfailur:25,callbackunregistrationfailur:25,caller:37,callobject:37,callprimit:37,callvoid:[37,44],can:[1,2,4,5,12,17,18,21,22,24,28,31,32,38,44,45,46,50,53,54,55,58],canaccess:46,cancel:34,canexecut:46,cannot:[19,29,31,32,46],canread:[46,54],canwrit:46,caoccao:[23,30,31,32,37,50],capabl:37,captur:52,care:[2,4,16,24,29,31,32,37,38,46],carri:[46,58],catalina:[1,3,16],categor:31,caus:[9,16,19,34,37,58],cd:[1,32],cdt:[6,52],central:[2,8],ceo:46,certain:[1,4,5,12,37,38,42],cfo:46,chain:[15,31],challeng:[5,9,12,46],chanc:9,chang:[4,25,29,42,46,51],channel:23,charm:37,chart:38,cheap:46,cheaper:5,check:[12,29,32,42,58],checkout:1,checkreturnvalu:41,choic:15,choos:[22,37],chrome:[5,6,18,21,23,40],chromedevtool:4,circular:[25,42],clamp:31,classload:[5,58],classpath:55,clean:3,click:4,clone:[1,2],close:[5,9,12,18,21,24,25,28,31,32,34,37,41,42,44,46,47],closur:37,cmake:[1,3,9],cmakelist:9,cmd:[3,32],co:5,code:[1,4,5,9,12,16,23,24,26,29,31,32,33,34,38,42,45,46,47,48,51,52,54,58],codefil:44,codestr:[32,40],collect:[22,23,26,28,40],color:45,com:[2,23,30,31,32,37,50],combin:37,come:[1,3,5,29,32,33],command:52,commit:15,common:[12,15],commun:[1,3,4,6,9],compar:[5,7,29],comparison:[5,9],compat:32,compel:11,compil:[1,5,25,32,45,46,58],compilationfailur:25,compilemodul:32,compilev8modul:[32,58],complement:31,complet:[4,5,7,24,31,32,34,37,42,44,45,46,58],complic:[32,46],con:46,concept:[5,12,38],concurr:29,condit:[5,29,46],config:[15,30],configur:1,configurationproperti:55,conflict:[25,29],connect:[2,4,5,47],consid:[16,31,37],consider:[15,16,34,46],consist:58,consol:[4,5,37,38,44,46,47,48,51,52],constantli:4,construct:[8,42],constructor:[46,54],consum:36,contact:[1,3,9,15,58],contain:[24,32,46],containsmodul:32,content:[31,38],context:[4,12,22,24,29,31,32,33,37],continu:25,contribut:9,contributor:2,control:[5,22,34,37],convers:[12,46],convert:[25,37,41,43,56,58],convertercircularstructur:25,converterfailur:25,convertersymbolnotbuiltin:25,cooki:44,copi:[5,31],core:[5,24,29,42],correctli:16,correspond:[2,3,5,22,24,31,32],corrupt:22,cost:11,could:[9,16],couldn:[9,58],count:[5,25,34,36,44],cours:[2,29,31,32,37,58],cover:[12,31,46,58],cpp:3,cpu:9,crash:[18,21,28,29],creat:[4,16,29,30,31,32,34,37,38,44,47,48,51,52,55,58],createv8runtim:[23,32,34,44,46,48,51,52,53],createv8valuearrai:37,createv8valuedoubl:41,createv8valuefunct:37,createv8valueobject:[31,37,46,51],createv8valuepromis:38,createv8valueproxi:42,createv8valuestr:[37,41],createv8valuesymbol:42,createv8valueundefin:38,createv8valuezoneddatetim:41,creation:[33,47],cross:[6,16,58],cruel:9,cstdint:1,current:[4,5,9,25,37],currentthreadid:25,curv:31,custom:[5,6,24,32,37,41,42],customfrommap:46,customobject:46,customtomap:46,cycl:[16,31],d:[32,45,46],daemon:[2,31,34],daemonthread:34,dai:24,danger:46,dangl:24,data:[5,31,32,37,40,46],databas:47,dataview:31,date:[23,40],db:5,dead:34,deal:[31,37,46],debug:[5,6,18,21,23,30],debugg:4,debuggerid:4,decent:[4,9,16,36,38],decim:32,decimaljsfil:54,decis:31,declar:[37,55,58],decor:[12,37,51,58],decoratev8valu:46,dedic:[5,24,31,44,58],deepli:9,def:[37,44,46],deficit:37,defin:5,definit:5,delet:[5,36,37,45,46,51],deleteglobalref:31,deliv:58,delta:51,demo:4,demonstr:4,deni:25,depend:[2,5,9,30,32,37,55],deploi:[5,42],depot_tools_win_toolchain:1,deprec:[23,41],depth:[25,42,46],descript:31,design:[6,7,23,28,29,32,37,53,58],desper:0,despit:37,destroi:31,detail:[4,5,11,20,29,34,37,38,45,46,47,48,51,52,53,54,58],detect:[6,25,37,42,46],determin:[31,37,42],dev:33,develop:[0,18,20,23,25,38,40,58],devic:[9,16,23],devtool:[4,18,21,23],diagnos:4,diagram:[5,37],didn:9,differ:[9,12,24,32,37,38,46],differenti:46,difficulti:16,digit:31,direct:46,directli:[4,31,37,45,58],directori:[2,5,32,54],disabl:[1,12,24,31,34,38],disabledfunct:37,disabledproperti:37,disablegcnotif:41,disableindebugmod:[34,41],discard:37,discontinu:23,discord:[23,58],disregard:31,distribut:[15,50],dll:[3,18,21,32],dm:2,dnode_dir:3,doc:[4,33,41],docker:[0,3,6,9],dockerfil:[2,42],document:[28,37,42],doe:[4,5,22,28,31,34,37,58],doesn:[4,5,9,25,29,30,31,32,34,37,46,55,58],don:[5,9,16,23,30,32,46,53,55,58],donat:[9,16,23],done:[4,58],door:44,doubl:[31,37],doubt:16,down:[33,58],download:[15,32],dr:9,drain:[31,46],drain_the_task_queu:44,dramat:[33,37],drive:[3,15,32],drop:[8,9],dsl:8,due:38,dump:[5,24,29,42],duplic:12,dure:[5,22,28,32,37,41,46,58],dv8_dir:3,dy:11,dylib:3,dynam:[18,21,23,32,41],e:[5,12,14,22,31,32,34,37,38,44,46,51,53,54,58],each:[5,31,37,53,58],earli:[9,24],easi:[9,12,23,37,40,46,47,52],easili:[9,31,34,46,55],echo:37,eclips:9,ecmascript:9,ecosystem:[5,53],edit:4,effect:[12,28,31,32,44],effici:[2,42],effort:[15,16,34],eg:15,eight:23,either:[5,7,37],electron:32,elimin:58,els:[32,37,38,44,46,54,58],emb:33,embed:[4,5,9,23,24,33],emit:41,empti:25,enabl:[1,2,4,12,31,37,38,41,42,45,46],enablegcnotif:[31,41],enableindebugmod:[34,41],end:[11,24,31,37,46,48],endposit:37,enforc:4,engin:[6,23,31,49,55,56],enhanc:[37,41,42],enjoi:4,enough:[5,16,46],environ:[4,5,15,18,23,29,32,33,41,47],equal:[32,37,40,52,54],equival:[31,37],err:52,error:[1,2,9,23,26,30,32,37,38,42],es6:[5,9,13,18,32],es:58,especi:[37,47,58],essenti:15,etc:[5,11,12,14,54],eval:24,evalu:[4,5,32,58],even:[0,9,58],event:[4,24,38,44,58],everi:[0,5,12,29,31,37],everyth:12,everywher:58,evolv:9,exampl:[5,45],exce:31,excel:[5,9],except:[29,30,32,34,37,41,46,58],excit:32,excluded_method:46,execut:[2,3,4,5,24,25,32,33,34,36,37,46,47,48,52],executeboolean:46,executeinteg:[32,34,37,46,48],executeobject:[45,46],executestr:[23,32,37,45,46,48,54],executevoid:[32,34,37,44,45,46,47,51,54],executioncontextcr:4,executionfailur:25,executiontermin:25,exist:[5,11,32,46,54],existingsourcecod:37,exit:[22,52],expect:[9,25,31,37],expectedparameters:25,expectedparametertyp:25,experi:[2,12,22,28,32,46,47,52],experienc:12,explain:5,explicit:[5,58],explicitli:[22,24,28,31,46,47],expos:[4,5,16,32,35,37,38,46,58],exposur:[23,40],express:[12,44,46],extend:46,extens:[14,47],extern:31,extra:58,extract:46,extrem:[29,37],ey:24,f:2,face:[1,5],fact:[22,38],fail:[18,21,25,32,34],failedtoreadpath:25,failur:19,fals:[1,28,31,32,37,44,45,46],famou:46,faq:23,far:9,faster:4,featur:[4,5,8,9,12,25,28,31,32,36,37,38,45,53,54,58],feed:[5,32],feel:[4,32,37,46],fetch:[5,38],few:[1,2,4,8,9,11,12,37,40,41,46,52],field:46,file:[1,3,5,9,32,38,44,54],filecont:38,filepath:38,find:[11,37],fine:23,first:[1,4,28,37,40,58],fix:[9,11,16,19,31,32,41,42],flag:31,flavor:[4,52],float32arrai:31,float64arrai:31,fly:4,folder:[3,24,44],folk:[12,32],follow:[1,3,4,5,15,22,23,24,25,30,31,32,36,37,38,44,46,51,53],footprint:5,forc:[22,24,46,47],foreach:[36,40],forev:31,form:[9,37],format:[25,31,37],forward:9,found:[19,25,32,54],fpic:1,framework:[12,55],free:[4,5,12,29,31,32,37,41,46,47,58],freed:5,frequenc:31,frequent:58,friend:38,friendli:[37,58],from:[0,2,5,6,9,11,15,22,24,25,31,32,33,34,37,38,41,42,44,45,46,47,48,51,52,56,57],frommap:46,frustrat:[0,9],fs:5,full:[9,24,37],fulli:[9,46],func:37,functioncallbackreceiv:37,functionnam:40,fund:16,fundament:[30,55],further:4,futur:[9,16],g:[5,12,14,15,22,31,32,37,38,44,45,51,53,54,58],garbag:[22,28],gb:2,gc:[28,47,51],gcbeforeengineclos:41,gcc:[15,41],gcov:15,gen:1,gener:[25,31,37,46],generatearraywithconvert:37,generatearraywithoutconvert:37,genuin:22,get:[5,9,12,16,22,24,28,30,31,32,34,36,37,38,44,46,47,53,54,55,58],getabsolutepath:54,getandincr:36,getclass:46,getconfig:[32,46,53],getconvert:46,getengin:[32,34,47,53],getentri:36,getexecutor:[23,32,34,36,37,44,45,46,47,48,51,52,54],getfilecont:38,getfilepath:38,getglobalobject:[12,34,37,38,44,45,46,47,51,54,58],getguard:34,gethandl:42,getidentityhash:40,getinst:28,getinteg:[32,34],getisolateid:4,getjavetenginepoolnod:55,getjavetenginepoolv8:55,getjoin:46,getjsfunctiontyp:[37,41],getjsscopetyp:37,getkei:36,getlength:36,getlogg:[30,32,54],getmessag:52,getmethod:[37,46],getnam:[46,51,55],getnodeinst:[23,31,44,46,48,53],getnodemodul:32,getobject:46,getownpropertynam:36,getownpropertysymbol:42,getparametercount:46,getposit:37,getpromis:38,getprototyp:42,getsiz:36,getsourcecod:[37,41],getstr:54,getstringvalu:37,gettarget:42,getter:[37,42,46,51,58],getutil:46,getv8inst:[23,31,32,34,48,51,52,53],getv8lock:29,getv8runtim:[32,34,47,54],getvalu:[36,37,46,51],getvers:42,git:2,github:4,give:[31,34,37,46],given:31,global:[5,12,32,37,47,58],globalobject:[12,37],globalthi:[12,32,58],gn:1,go:32,goal:37,goe:[12,37],gone:[9,22],good:[5,31,51],googl:4,got:[9,11],graalj:46,gradl:[1,3,6,9],granular:29,great:23,greater:34,groupid:[23,50],gson:4,guard:34,guess:51,guid:[1,23,56],guido:9,ha:[0,5,8,9,12,30,31,32,36,37,38,41,46,58],hack:[9,12,22],had:[9,11],hair:9,hand:22,handi:38,handl:[12,22,29,32,37,42,46,47],handler:44,hang:34,happen:[19,22,31],happi:37,hard:[0,9,38,58],hashmap:46,hashset:46,hasn:[9,22,37],hasownproperti:54,have:[2,3,9,16,23,31,32,37,38,46,54,58],haven:9,heap:[5,31],heavi:32,heavili:[8,37,46,58],hei:9,hell:[30,55],hello:[44,45,46,47,49,56],help:[4,24],here:[0,4,5,9,11,28,31,32,33,37,38,44,45,46],hide:[5,9],hierarchi:58,high:[5,31,46],highlight:53,hijack:44,hint:[31,37],histori:[10,11,18,58],hit:[22,34],hoc:[9,33],hold:[31,38,46],host:[4,5,32,44,48,51,52],hotfix:58,hour:[2,9,16],how:[4,5,7,11,13,18,22,29,31,32,42,58],howev:[5,9,11,12,22,31,37,46,58],http:[2,4,5,23,33,44],huge:33,i18n:25,i7:[9,33],i:[3,8,9,11,16,18,21,23,37,44,46,58],id:[1,4,5,25],idea:[8,9,11,31],ident:[32,37,51],identifi:46,idl:31,idlenotificationdeadlin:41,ieee:31,ignor:[31,37,41],ijavetbiindexedconsum:41,ijavetclos:[42,46],ijavetconsum:41,ijavetengin:[32,34,47,53,54],ijavetengineguard:[34,40],ijavetenginepool:[34,47,55],ijavetentityfunct:46,ijavetentitymap:46,ijavetpromiserejectcallback:38,ijavetuniconsum:41,ijavetuniindexedconsum:41,imag:[2,9],immedi:[5,24,29,31,34],impact:[24,37],imper:58,implement:[9,23,31,37,38,46,50],impli:[11,15,22,58],implicit:58,improv:[9,29,31],includ:[2,9,16,37,58],inconsist:58,inconveni:46,increas:[5,25,46,58],increaseandget:51,increment:46,inde:[11,24],independ:[1,33],indic:37,ineffici:46,infinit:[34,52],info:30,inform:46,inherit:58,initi:[5,18,21,32,44,47,51],inject:[25,37,38,42,46,58],input:[37,52],insid:[4,5,31,38,46],insight:5,inspect:[4,37],inspector:4,instal:[8,9,15,32,44,49,54,56],instanc:[5,12,24,30,31,32,33,37,51],instead:[29,31,32,41,46,58],instruct:31,int16_t:31,int16arrai:31,int32_t:31,int32arrai:31,int64_t:31,int8_t:31,int8arrai:31,integ:[31,36,37,44,46],integr:[4,9,23,30,40,49,56],intellij:[6,9],intend:[9,12],interact:[4,5,41,43,46,52,56],intercept:[4,6,31,32,40,42,46,49,56],interceptor:[5,22,37,38,47,51],interest:[2,9],interfac:[30,38,58],interfer:5,intermitt:2,intern:[6,28,29,31,37,46],interop:[23,43,56],interpret:[4,5],interrupt:34,interruptedexcept:[34,44],intl:1,intro:23,introduc:[46,58],intrud:37,intrus:46,intvalu:37,invis:37,invoc:37,invok:[12,41,46],invokeobject:[37,45],invokeprimit:37,invokevoid:37,involv:12,io:4,is_component_build:1,is_debug:1,isassignablefrom:46,iscal:37,isclass:37,isclos:42,iscontinu:34,isdead:40,isdebugen:30,isdirectori:46,isfil:46,isfunct:37,isinfoen:30,isinus:[34,40],isnullorundefin:41,isol:[12,24,29,31,33,58],isrevok:42,issu:[1,5,11,22,24,29,32,41,42],istringjoin:46,istringutil:46,isundefin:46,isv8binden:37,iswarnen:30,its:[0,5,9,29,31,32,37,38,46],itself:37,iv8executor:32,iv8inspectorlisten:4,iv8moduleresolv:42,iv8valu:[40,41],iv8valuefunct:41,iv8valueobject:[37,40,41,42],iv8valuepromis:38,iv8valueproxi:42,iv8valuerefer:40,j2v8:[10,11,12,18,56,57],j2v8_win32_x86_64:9,j4:1,jackson:4,jan:58,jar:[5,9],java:[4,5,9,14,23,31,32,37,38,43,44,46,51,54,56,58],javadoc:42,javaobject:[31,58],javascript:[5,22,23,29,32,33,38,43,46,48,51,56,58],javenod:[14,23,54,58],javet:[4,6,8,9,13,14,17,18,19,21,22,24,25,26,28,30,31,34,35,36,37,38,40,42,44,45,46,49,50,51,53,54,55,56],javetcallbackcontext:41,javetcallbackexcept:41,javetconsoleinterceptor:47,javetconverterconfig:[42,46],javetconverterexcept:46,javetengin:[47,53],javetengineconfig:[30,31,41,55],javetengineconfignod:55,javetengineconfigv8:55,javetengineguard:[34,41],javetenginepoo:53,javetenginepool:[30,32,41,47,53,55],javetenginepoolnod:55,javetenginepoolv8:55,javetentityfunct:42,javeterror:41,javeterrortyp:46,javetexcept:[37,38,44,46,54],javetexecutionexcept:[32,46],javetlogg:30,javetnativemonitor:5,javetobjectconvert:[42,46,58],javetosutil:[32,44,54],javetprimitiveconvert:42,javetpromiserejectcallback:41,javetproxyconvert:[42,45,58],javetstandardconsoleinterceptor:[31,47,51],javetterminatedexcept:34,javetuniversalproxyhandl:42,javetvirtualobject:42,jdk:[1,3,6,30,46],jerri:46,jetti:4,jni:[5,8,28,31,37],join:46,joiner:46,joke:9,js:[0,6,7,9,14,16,18,19,21,23,25,28,29,31,33,35,37,38,40,42,43,47,49,56],json:[2,4],jsruntimetyp:[28,32,53,55],just:[4,9,12,29,31,32,33,37,45,46,58],jvm:[5,23,28,29,40,44,46,47,53,58],keep:[5,24,31,46],kei:[5,32,36],keyword:37,kick:3,kind:[5,9,29,37,46,58],know:[5,7,9,22,23,26,32,58],known:[31,46],kotlin:8,l:53,lack:[54,58],lambda:46,land:22,lang:46,languag:31,larg:2,last:[2,9],later:[9,11,32],latest:[1,2,3,16,53],launch:[24,32],layer:[9,58],layout:37,lazi:5,ld:1,lead:[22,24],leak:[6,9,11,24,31,41,46],leakag:[12,25],learn:11,least:[5,9],leav:[5,11,32,46],legaci:[3,5,9,17,18],len:37,length:[31,46],let:[4,9,22,44,46,52],level:[12,29,37,46],lib:[3,32],libjavet:[3,32],libnod:1,librari:[0,1,2,4,5,7,12,18,21,25,28,30,32,37,42],librarynotfound:25,librarynotload:25,lifecycl:[12,24,31,37],light:31,like:[1,4,9,11,12,23,24,25,32,52],limit:[5,12],line:[1,29,37,46,52],link:[1,18,21,31,32],linux:[11,17,18,23,33,40,41,42,50,58],list:[23,26,37,46],listen:[4,22,31,38,44],liter:58,littl:[12,46],live:[4,23,29,31],load:[5,12,19,23,25,26,54,58],loadabl:5,loadj:54,loadlibrari:[28,42],loadlibraryexw:32,local:[9,31,37,46],locat:[5,32,58],lock:[5,23,25,26,31,34,41,58],lockacquisitionfailur:25,lockconflictthreadidmismatch:25,lockedthreadid:25,locker:29,lockreleasefailur:25,log:[23,24,26,31,37,38,44,46,47,51],logerror:54,loggerfactori:30,logic:[9,37,38,44,46,58],loginfo:[32,54],longer:[12,24,31,46,58],look:[1,5,9,11,32],loop:[22,34,38,44,52],lot:[11,47],low:5,lower:11,lowest:[9,16],lowmemorynotif:[41,46,47,51,58],lt:1,luck:9,luckili:[32,46],m:2,mac:[2,3,9,17,18,23,50,58],macbook:[9,16,23],machin:9,maco:[9,23,50],made:[9,11],mai:[1,2,4,5,9,12,22,23,24,28,29,30,31,32,34,37,46,55],mail:23,main:[3,45,46],mainli:33,maintain:[3,15,16,58],major:[32,40,58],make:[0,1,2,3,31,32,38,44,46,54,58],malfunct:16,malici:[24,34],manag:[5,9,12,16,23,26,41],mani:[1,2,9,11,16,31,37,58],manipul:[31,36],manner:[16,38,58],manual:[11,15,32],map:[5,32,36],mark:34,master:[9,38],match:[32,45,46],matcher:[45,46],mathadd:37,maven:[2,6],max:25,max_valu:44,maxdepth:[4,25],maxim:24,maximum:46,maxscriptscaches:4,me:[9,23],mean:[30,32,37],meanwhil:[9,44],mechan:58,meet:[32,46],memor:46,memori:[6,9,11,22,23,24,26,37,41,46,58],mental:58,mere:9,messag:[4,25,30,31],method:[4,12,25,37,46],method_prefix_get:46,method_prefix_i:46,methodnam:[25,37,46],mid:[16,23],might:[11,16],migrat:[12,23,56],millisecond:[31,34,44],mini:[9,16],minim:[5,24,46,47],minut:[2,5,46],mirror:37,mismatch:25,mix:12,mixtur:5,mockcallbackreceiv:37,mode:[6,7,13,15,18,19,22,23,24,28,31,33,35,38,41,42,47,49,56,58],model:5,modul:[6,16,19,22,24,25,35,54],modular:[19,23,24,26,58],modulenam:25,modulenameempti:25,modulenotfound:25,modulepermissiondeni:25,monitor:34,monolith:0,month:[9,11],more:[5,9,15,16,25,32,34,35,37,38,42,46,47,48,51,52,53,54,58],most:[12,24,29,32],mostli:22,motiv:[10,18,58],move:[9,41,42],msvc:1,much:[5,9,24,31,33,37,46,52,54,58],multer:44,multi:[38,47,58],multipl:[5,24,29,32,58],must:54,mvn:3,my:[9,16,23],myjavetengineconfig:55,myjavetlogg:[30,55],n:[32,45,46],name:[4,5,12,25,30,32,37,46,51,54,55],napi:[19,32],napi_create_error:32,nativ:[5,16,19,23,24,29,31,37,40,44,46,58],natur:38,navig:[2,3],nearli:9,necessari:47,need:[0,1,3,4,9,16,29,31,32,37,38,45,46,58],nest:29,net:5,network:2,never:58,newer:7,newglobalref:31,newpath:46,newsourcecod:37,next:[16,37],nextlin:52,ninja:1,nio:31,node:[0,4,6,7,9,14,16,18,19,21,23,25,28,29,31,33,35,37,38,42,43,47,49,52,55,56],node_bind:1,node_modul:[24,32,44,54],node_module_fil:32,node_sqlite3:32,nodemodulemodul:32,nodemoduleprocess:42,noderuntim:[32,41,44,48,53],non:[24,37],none:4,normal:[4,31,34,44],note:[2,4,23,31,32,53],noth:12,notif:[4,31],notifi:[31,51],notsupport:25,now:[8,9,30,32,37,46,51],nowadai:9,npm:[32,44,54],nullpointerexcept:46,number:[31,46],o:1,object:[1,5,12,22,24,31,36,41,42,43,45,47,51,56,58],objectclass:46,obtain:24,obvious:[9,32,37],occur:[22,31,46],octet:31,off:[1,3,4,5,31],offer:[12,14,31],offici:[1,9,15,23],often:31,old:[5,9,16,24,38],older:33,onc:[1,3,25,31,32,44,46],one:[5,7,9,11,12,31,32,37,45,46,51,52,53,58],ones:46,onli:[5,12,14,16,23,24,28,30,32,37,50,58],open:[24,46],oper:[5,46],opportun:46,opposit:46,opt:2,option:[6,24,32,37,51,53],order:[32,36],org:30,organ:41,origin:[4,5,37],originalsourcecod:37,orphan:46,os:[0,2,3,5,23,25,58],osnotsupport:25,other:[5,12,24,29,30,31,38,41,44,50,53,58],otherwis:[4,29,46],out:[1,23,31,32,34,44,45,48,51,52,58],outer:9,outofmemoryerror:46,outperform:33,output:[37,44,45,46],outsid:31,over:[5,22,37,58],overflow:46,overhead:[5,12,29,31,33,34,46,47],overload:46,overrid:[30,37,46],overridden:46,own:[0,5,9,16,28,31,32,37,38,46],ownership:38,ownkei:42,p:[1,46],pace:31,packag:[3,5,8,9],page:4,pai:[9,16,58],pain:58,pair:46,param:4,paramet:25,parent:[24,46],pars:4,parser:44,parti:[30,37],partial:5,particular:[9,32,33],pass:[24,42],patch:1,patch_node_build:1,patch_v8_build:1,patchelf:32,path:[1,15,25,32,44],path_to_depot_tool:1,pattern:[4,12,34],pause_the_event_loop:44,peopl:[22,58],per:[5,16,28,29,31,32,46],perform:[3,4,5,9,22,23,24,26,31,32,37,40,44,46,47,51,58],period:35,permiss:9,persist:31,person:8,perspect:[12,31],phase:1,pid:5,piec:32,pink:45,pitfal:0,place:[3,5,9,22,58],plai:[9,29,32,38,44],plan:[9,16],platform:[0,6,16],pleas:[1,2,3,4,5,11,15,16,20,23,24,28,29,31,32,34,37,38,45,46,47,48,51,52,54,58],point:[31,32],pointer:31,pojoarrai:46,polyfil:[23,35,49,56,58],pom:9,pool:[6,23,30,31,40,49,55,56],popinteg:36,port:[4,44],portal:23,posit:[1,33,37],possibl:[5,24,29,46],potenti:[32,42],ppa:15,practic:[4,5,12,23,26],pre:[0,1,6],preciou:9,precis:[9,16,37,46],prefix:55,prepar:[3,15,32,47],preserv:36,pressur:[31,58],pretti:32,prevent:22,primit:[24,37,40,46],print:[38,52],println:[23,32,44,45,48,51,52],printstacktrac:[34,44,46],prior:28,prioriti:15,privat:[15,37,46,50,51],pro:46,problem:[4,9],problemat:9,proce:1,process:[4,22,38,46],profil:4,prohibit:24,project:[5,9,11,12,14,23,32,54,58],promis:[22,23,24,26],proper:1,properli:5,properti:[15,46,51,55],propertynam:46,propertysourc:55,protect:[29,30,34,46,55],protocol:4,prototyp:37,provid:[5,15,22,32,36,37,46,47,51,58],proxi:46,pseudo:[37,38,44],publish:[3,58],pull:2,purchas:23,purg:5,purpos:46,push:[2,36,37,38],put:[3,24,46],py:1,python2:9,python3:[1,9],python:[1,6],queri:4,question:58,queue:[31,38],quick:16,quickli:4,quit:[0,5,11,12,30,31,34,37,44,46,47,58],r:[15,45],r_x86_64_tpoff32:1,race:[5,29],radic:37,rais:38,rang:31,rapidli:9,ratio:31,ration:31,raw:31,re:[41,44],reach:[25,46],read:[25,31,38],readi:[1,3],realiti:9,realli:[3,9,38],reason:[0,5,9,22,25,38,44,58],rebuilt:[32,41],receiv:[37,38],recogn:37,recommend:[5,8,24,33,37,38,46,47],recompil:1,recurs:[42,46],recycl:[5,22,24,31,33,46,48],redirect:47,refactor:[41,42],refer:[4,11,22,23,24,28,29,33,34,37,45,46,47,48,51,52,54,58],referenc:[31,32],reflect:[24,46],refus:4,regard:[2,4],regardless:[24,29],regist:[12,22,24,25,32,37,38,47,51,58],registercustomobject:[42,46],registr:[25,46,58],regular:[16,29,46],reject:[22,24,42],rel:9,relai:32,relat:37,relationship:46,releas:[1,3,5,9,16,23,25,31,58],reli:[15,30,31,55],reload:28,reloc:1,remain:37,remot:4,remov:[9,41,42],renam:41,repeat:58,replac:32,report:[16,29],repositori:[2,15],repres:[5,12,31,37,46,58],req:44,request:4,requir:[1,8,12,24,32,33,34,37,38,44],reset:[24,33],resetcontext:[5,24,29,41],resetisol:[5,29,41],resolv:[22,32,44,46,58],resourc:[3,5,12,25,29,32,34,38,46,48,51,52,55],resourcenam:32,respons:[4,32,37],rest:4,restart:[2,58],restor:[28,37],result:[4,5,24,29,38,46,48,52],resume_the_event_loop:44,retir:23,reus:[7,12],review:[37,38],revisit:9,reviv:[9,16],revok:42,rich:58,richer:58,rid:58,right:4,risk:[24,28],roi:9,role:58,root:[2,19,31,32,46],root_path_to_javet:1,root_path_to_node_j:1,root_path_to_v8:1,rossum:9,rough:37,routin:[18,21,32],rule:31,run:[2,5,29,31,32,33,34,46,54],runifwaitingfordebugg:4,runtim:[4,5,15,24,25,28,29,32,34,42,44,46,47,48,51,52,53,58],runtimealreadyclos:25,runtimealreadyregist:25,runtimeclosefailur:25,runtimeleakagedetect:25,runtimenotregist:25,s:[0,2,5,9,11,22,24,25,29,31,32,33,37,38,44,46,53,58],safe:[5,22,29,37,46],safeti:37,sai:[9,46],same:[5,24,29,31,32,37,38,46,58],samevalu:40,sampl:[5,31,32,37,44,46],satisfi:9,save:44,scan:37,scanner:52,scenario:[24,29,31,40,58],scene:[5,12,22],schedul:31,school:5,scope:[12,31,37],scratch:[0,6,11],screenshot:4,script:[1,3,5,9,12,24,32,34,41,47,52,54],scriptfil:32,scriptpath:32,scriptstr:32,sdk:[1,3,30,55],seamlessli:44,second:[1,4,34,37],section:37,secur:[5,12,32,54,58],see:[22,53],segfault:[22,58],select:[15,37],semi:37,send:[4,31,44,46],sensit:[24,29,31,40,58],sentenc:[37,58],separ:[5,12,33,46],seriou:[9,11],serious:[9,33],serv:16,server:[4,46,50],serverup:44,session:9,set:[1,4,5,7,9,12,28,30,31,32,36,38,41,44,45,46,51],setallowev:55,setasynccallstackdepth:4,setautosendgcnotif:[31,55],setblackboxpattern:4,setconvert:[45,46],setdefaultengineguardtimeoutmilli:55,setengineguardcheckintervalmilli:55,setextractfunctionsourcecod:46,setfunct:[40,41],setinterv:[14,54],setjavetlogg:[30,55],setjoin:46,setjsruntimetyp:[32,53,55],setlibraryreload:28,setmemoryusagethresholdratio:[31,41],setmodul:32,setnam:[46,51],setpauseonexcept:4,setpooldaemoncheckintervalmilli:55,setpoolidletimeoutsecond:55,setpoolmaxs:55,setpoolmins:55,setpoolshutdowntimeoutsecond:55,setposit:37,setpromiserejectcallback:38,setprototyp:42,setproxymapen:46,setrequirerootdirectori:32,setresetenginetimeoutsecond:55,setresourcenam:32,setskipfunctioninobject:46,setsourcecod:[37,41],setstringvalu:37,setter:[37,42,46,51,58],settimeout:[14,54,58],setutil:46,setv8moduleresolv:32,setv8runtim:37,setvalu:[37,46,51],setweak:[24,31],sh:[3,32],share:[1,5,29,32,37,38,44,58],shell:[6,49,56],ship:4,should:[34,46],show:[4,5,31,37,38,46],showcas:4,shut:58,side:[5,31],sign:31,signatur:[25,37,46],signific:31,significantli:25,similar:[24,46,47],simpl:[30,31,32,44,46,53],simpler:32,simpli:37,simplifi:[5,37],simul:[14,32,54,58],sinc:9,singl:[5,9,29,33,37,44],sit:9,situat:37,size:[2,5,25,31,46],sjtucaocao:[1,2,23],skip:[42,46],slave:15,sleep:[34,44],sleep_a_whil:44,slf4j:30,slight:29,slightli:33,slow:[33,46],slowli:11,smart:[31,46],smartli:46,smooth:58,smoother:31,smoothli:[12,46],snapshot:15,snippet:[31,46],so:[1,2,3,5,7,9,12,14,15,22,24,28,29,30,31,32,37,38,44,46,54,55,58],softwar:15,solut:[1,11,46],solvabl:9,some:[4,5,9,12,14,15,16,19,22,33,38,47,54,58],someon:[9,16,32],someth:[9,37],sometim:[11,31,37,38,46],somewher:32,soon:23,sourc:[1,4,25,29,32,34,45,46,47,48,51,52,54,58],sourcecod:37,space:31,spawn:47,special:46,specif:[31,38],specifi:[37,58],spend:9,split:46,spring:[12,23,40,49,56],sqlite3:32,src:3,stack:46,stackoverflowerror:46,stage:24,stai:[44,58],standard:22,star:23,start:[5,11,34,37,44,46,58],startposit:37,startswith:46,state:[4,37],staticclassen:42,staticecho:37,statu:[15,34],step:[9,12,22,28,31,32,37,46,48,51,52],stick:9,still:[9,16,34,37,58],stop:[1,3,9],storag:2,store:[5,31,32],stori:37,str:[37,46],strictequ:40,string:[5,30,32,38,40,44,46,48,51,52,54],stringjoin:46,stringutil:46,stringvalu:37,structur:[25,42],studio:[1,3,6],style:35,subclass:[24,46],substanti:46,substr:46,success:58,successfulli:[0,4],sudo:[15,32],suffer:9,suit:7,suitabl:51,summari:5,support:[2,5,8,9,17,18,23,25,28,31,32,34,36,37,41,42,46,50,53,58],suppos:[9,28],suppresswarn:46,sure:[1,2,3,9,31,32,44,46,54],surpris:9,surround:29,symbol:[16,19,25,32,42],symbol_level:1,sync:5,synchron:58,system:[5,8,11,23,25,30,32,44,45,48,51,52],system_temporary_directori:5,t:[2,4,5,9,16,22,23,25,29,30,31,32,34,37,46,52,53,55,58],take:[2,5,9,11,16,22,28,32,37,41,44,47,52,58],target:[3,4,7,46,58],target_cpu:1,task:[31,38,41],team:9,technic:[16,53],tediou:[5,12,58],tell:[4,22,31,32,51],temporarili:9,term:[5,34,37],termin:[23,25,26],terminateexecut:[34,40,58],test:[2,3,5,6,9,15,23,29,32,33,37,38,40,44,50,54],testexpress:44,testfrommodul:32,testintercept:51,testinterceptor:51,testlogg:30,testpojo:46,testv8valuedataview:31,testv8valuetypedarrai:31,than:[11,33,34,37,46,54,58],thank:23,thei:[5,9,16,24,25,28,32,38,46,53],them:[3,4,31,37,46],there_are_more_tasks_in_task_queu:44,thi:[1,3,4,5,9,11,12,15,19,22,23,28,29,31,32,38,44,45,46,51,53,58],thin:1,thing:[12,31,32,46],think:[9,11,13,18],thisobject:37,thisobjectrequir:[37,42],those:[1,4,5,12,22,31,32],though:[8,25,47,58],thought:[9,11],thread:[5,9,25,31,33,34,38,41,42,47,58],threshold:31,through:32,throwabl:[30,52],thrown:[29,34],till:34,time:[9,16,28,32,46,47],timeout:[34,38],timestamp:7,timeunit:[34,44],tini:46,tip:4,tl:9,tmp:46,toarrai:46,toclon:37,todo:[23,26],tofil:44,togeth:[4,44],tojsonstr:37,tolowercas:46,tom:46,tomap:46,too:[9,16,32],toobject:46,took:58,tool:[6,15,20,23,40],toolchain:15,top:[12,32,58],topath:[32,46],topic:[38,46],tostr:[32,36,37,45,46,52,54],touch:[29,46],tov8valu:46,tp:[9,33],track:[5,31],trade:5,transpar:[46,58],treat:31,tri:[5,9,19],trick:44,tricki:37,trigger:[29,31,37],troubleshoot:[18,23],turn:[1,4,5,31,41],tutori:23,tweak:46,two:[31,46],txt:9,type:[12,25,28,29,31,33,40,41,46],typic:[5,34,37],ubuntu:[1,2,3,15,32,41,50],uint16_t:31,uint16arrai:31,uint32_t:31,uint32arrai:31,uint64_t:31,uint8_t:31,uint8arrai:31,uint8clampedarrai:31,ultim:4,unbind:[37,42,58],unbindfunct:[37,42],unbindproperti:[37,42],uncertain:24,uncertainti:9,uncheck:46,undefin:[4,32,37,46,52],under:[3,9,24,31,37],understand:9,unexpect:[9,46],unfortun:[5,9,23],unhandl:24,unhandledreject:38,uniqueid:4,unit:5,univers:41,unknown:25,unless:[16,24,31,33,58],unload:[5,23,26,58],unloadlibrari:[28,42],unlock:29,unmanag:[5,31],unoffici:9,unpack:5,unrealist:46,unregist:[47,51],unregistercustomobject:42,unregistr:25,unrel:[5,33],unrestrict:31,unsign:31,unstabl:28,until:31,untouch:37,unzip:32,up:[2,4,5,12,29,31,32,44,46],updat:[2,15,41,42],upgrad:[4,8,9,11,15,35,41,42],upon:46,url:5,us:[1,4,5,8,11,22,23,24,28,30,31,33,37,47,58],usag:[31,58],use_custom_libcxx:1,user:[22,30,32,46,47,52,55],usr:[1,15],usual:[0,32,34,37,38,44,46],util:[1,46],v0:58,v14:[23,41,42],v1:4,v2:9,v3:[8,32],v4:9,v6:9,v7:8,v8:[0,4,6,7,9,11,12,13,16,18,22,23,24,25,26,28,29,33,34,35,44,45,46,47,49,51,52,55,56],v8_enable_i18n_support:1,v8_enable_pointer_compress:1,v8_monolith:1,v8_static_librari:1,v8_use_external_startup_data:1,v8bindenabl:[37,42],v8customobject:46,v8data:58,v8function:[12,37,38,42],v8functioncallback:41,v8host:[23,28,31,32,34,41,42,44,46,48,51,52],v8locker:[24,29,40],v8modul:[32,41],v8modulereferr:32,v8notifi:31,v8properti:[12,37,41,42,58],v8runtim:[5,23,24,29,32,34,36,37,38,40,41,42,45,46,47,48,51,52,53,54],v8runtimesett:37,v8script:41,v8valu:[41,42,46,52,58],v8valuearrai:37,v8valuebuiltinobject:42,v8valuebuiltinsymbol:42,v8valuefunct:[37,41,42,44,46,54],v8valuefunctiondecim:54,v8valueinteg:[36,37],v8valueobject:[31,32,37,42,46,51,54,58],v8valueobjectdecim:54,v8valueprimit:58,v8valuepromis:[38,41,42],v8valuepromiseresolv:38,v8valueproxi:42,v8valuesharedarraybuff:42,v8valuestr:36,v8valuetemp:46,v8valueweakmap:40,v8valueweakset:40,v9:[1,23],v:[3,23],vagu:5,valid:[5,31,37],valu:[5,25,28,31,32,36,40,41,46,51],valueof:37,van:9,vararg:[37,41,46],variabl:[29,32,37,45,51],variou:[0,58],vcbuild:1,ve:[9,11],verbos:58,veri:[5,24,32,37,46,52,53],verifi:[5,32],version:[1,4,5,8,11,16,23,32,46,50,53],via:[4,5,24,31,34,37,38,44,46,51],view:40,violat:5,virtual:[32,46],visibl:[5,37],visit:[20,23,54],visual:[1,3,6],vm:[5,24],voluntarili:32,vs:[1,6,9],vulner:24,wa:[9,16,58],wai:[0,5,12,22,23,24,28,31,32,34,37,38,42,44,46,47,51,55],wait:[2,4,44],want:[5,8,9,12,22,25,29,31,46],warn:[1,30,41],watch:9,weak:5,weakmap:36,weakset:36,web:[4,24,31],websit:4,websocket:4,week:58,weight:31,welcom:[2,52],well:[9,16,22,31,46,58],were:9,what:[4,9,10,18,31,32,46,58],whatev:[5,22,29,31],when:[1,5,9,16,18,19,21,31,32,34,37,38,46,58],where:[12,13,18,32,58],wherea:31,whether:[37,42],which:[0,4,5,7,9,12,15,16,22,31,32,33,34,37,45,46,51,53,54,58],who:[9,32],whole:46,whose:24,why:[1,4,12,18,21,28,31,54],windbg:[1,3],window:[11,12,19,23,33,40,50,58],wise:[2,3,15,37],wish:[9,58],within:31,without:[1,2,4,5,22,29,37,46,58],won:[16,22,46],word:[5,31,44],work:[4,5,9,12,22,23,28,29,31,32,37,38,44,58],worker:31,workflow:2,working_directori:[32,44,54],workingdirectori:32,worri:[32,34,44,46],wors:46,would:[9,11,16],wrap:31,writabl:46,write:[11,31,46,58],written:[16,46],ws:4,wsl2:2,x64:[1,32],x86:[16,42],x86_64:[2,3,23,50],x:[2,9,23,37,39,46],xcode:[1,3],xml:9,xms64m:31,xmx64m:31,y:[15,46],ye:[4,5,15,20,22,29,32,36,37,46,50,54],year:[9,58],yet:22,you:[1,2,3,4,8,9,12,20,22,23,29,30,31,46,54,55,58],your:[4,9,15,24,28,30,55,58],z:46,zero:[5,31],zombi:31},titles:["Build Javet","Build Javet from Scratch","Build Javet with Docker","Build Javet with Pre-built Binaries","Debug with Chrome Developer Tools","Javet Design","Development","Test Javet","Development Tools","History with J2V8","Background","What is the Motivation?","How to Think in Javet?","Development","Where are ES6 API in V8 Mode?","Can Javet Support Legacy Linux?","Can Javet Support Mac?","Environment","FAQ","A dynamic link library (DLL) initialization routine failed","Can I Debug Javet in Chrome DevTools?","Troubleshooting","Why Node.js Crashes When being Closed?","Javet","Best Practices","Error Codes","Reference","API Reference","Load and Unload","Know the Lock","Logging","Memory Management","Modularization","Javet Performance","Termination","TODO List","V8 Collection","V8 Function","V8 Promise","Release Notes","Release Notes 0.7.x","Release Notes 0.8.x","Release Notes 0.9.x","Advanced","Interact with Node.js","Java and JavaScript Interop","Object Converter","Javet Engine Pool","Hello Javet","Basic","Installation","Interception","Javet Shell","Node.js Mode and V8 Mode","Polyfill","Spring Integration","Tutorial","Migration Guides","Migrate from J2V8"],titleterms:{"0":[40,41,42],"1":[4,29,30,40,41,42,44,48],"10":[16,41,42],"11":42,"12":42,"2":[4,29,30,40,41,42,44],"2019":8,"2021":16,"3":[4,8,31,40,41,42,44],"4":[4,40,41,42],"5":[41,42],"6":[41,42],"7":[40,41,42],"8":[8,41,42],"9":[40,41,42],"boolean":37,"class":45,"enum":[45,46],"final":46,"function":[12,37,41,42,46],"import":[5,37],"long":31,"null":46,"static":[45,46],"try":31,A:19,Is:44,It:46,No:16,On:32,That:44,Will:16,about:[16,34,37],advanc:43,aggress:31,alloc:1,altern:31,an:45,anonym:[42,46],api:[14,27],ar:14,architectur:5,arm64:16,arraybuff:31,aug:16,autom:9,automat:[31,34,37],await:[22,31],background:[10,22],backward:25,basic:49,befor:16,being:22,best:24,between:32,binari:3,bind:37,bindfunct:37,birth:40,bless:58,bug:40,build:[0,1,2,3,9,16],built:3,c:31,call:37,can:[15,16,20,37],caus:22,caution:32,cdt:4,central:3,challeng:31,chang:37,chrome:[4,20],circular:46,classload:42,close:22,co:53,code:[25,37,41],codestr:37,collect:36,commun:8,comparison:[29,37],compat:[25,50],configur:55,context:5,convers:[37,41,58],convert:[42,46],cppgc:1,crash:22,creat:46,cross:5,custom:[4,46],deadlineinmilli:31,deal:32,debug:[4,20,34,40],decim:54,declar:[12,41],defin:[37,46],demand:32,depend:[23,50],deploi:9,design:[5,46],detect:5,develop:[4,6,8,13],devtool:20,disabl:37,dll:19,docker:2,document:23,doe:[29,46],download:3,dsl:[23,50],dynam:[19,46],elf:32,empow:42,engin:[5,24,34,40,47],enhanc:46,environ:[1,2,3,17],error:[25,41],es6:[14,58],event:[22,41],exampl:[32,38],execut:12,executor:12,exist:53,explicit:29,fail:19,faq:18,featur:[23,46],file:46,first:41,fix:40,fly:37,foreach:41,from:[1,12,58],fs:38,functionnam:37,gap:32,gc:[31,41],github:2,go:46,goal:47,gradl:[8,23,50],groovi:[23,50],guard:40,guid:[57,58],h:1,handshak:4,hello:[23,48],highlight:[33,46],histori:9,hotfix:41,how:[12,16,28,34,37,44,46],hub:2,i:20,idlenotificationdeadlin:31,ijavetlogg:30,implement:30,implicit:29,includ:1,index:41,initi:19,inject:[30,45,55],instal:50,instanc:46,integr:55,intellij:8,interact:44,intercept:[5,12,37,41,51],interfac:[42,46],intern:[4,32],interop:45,invok:37,isol:5,issu:[9,16],j2v8:[9,58],jar:3,java:[42,45],javascript:[37,44,45],javet:[0,1,2,3,5,7,12,15,16,20,23,29,32,33,47,48,52,58],javetcallbackcontext:37,javetproxyconvert:46,jdk:8,jni:3,js:[1,3,5,8,22,24,32,41,44,48,53,54,58],jvm:31,kei:37,know:29,known:16,kotlin:[23,50],latest:9,leak:5,learn:12,legaci:15,librari:[3,19],licens:23,lifecycl:38,link:19,linux:[1,2,3,9,15,32],list:35,live:40,load:[28,32],lock:29,locker:40,log:30,logger:30,loop:41,lowmemorynotif:[22,31],lt:16,mac:[1,16,42],maco:[1,3],main:44,major:23,manag:[24,31,37],manual:[31,34,37],map:46,maven:[3,8,9,23,50],mean:29,memori:[5,31],migrat:[57,58],mismatch:37,mode:[5,14,29,32,34,48,53,54],modul:[5,32,41,42,58],modular:32,motiv:[11,47],multi:[5,42],nativ:[32,41],node:[1,3,5,8,22,24,32,41,44,48,53,54,58],noderuntim:22,note:[15,28,38,39,40,41,42,46],now:16,object:[37,46],onli:9,open:4,option:[3,8,31],os:[1,16,42,50],pass:37,passiv:31,patch:32,path:46,pattern:[45,46],perform:[29,33],platform:5,pojo:46,pojoconvert:46,polyfil:[42,54],pool:[5,24,34,47,53],possibl:44,practic:24,pre:[3,32],prepar:[1,46],primit:[5,41,58],print:48,privat:42,process:[5,42],promis:[38,42],properti:[12,37,41,42],proxi:42,python:8,quick:23,readfileasync:38,readi:46,rebuild:32,recommend:31,refer:[5,26,27,31],regist:46,registerjavamethod:58,registr:37,reject:38,releas:[39,40,41,42],repositori:9,requir:5,resolv:[38,42],resourc:[24,31,37],result:33,root:22,routin:19,run:4,runtim:31,safe:42,safeti:[5,29,46],sampl:51,scratch:1,script:4,secur:24,server:44,set:37,shell:[4,52],solut:22,sourc:[37,41],spring:55,start:23,step:[30,44],string:37,stringbuild:[45,46],structur:46,studio:8,summari:37,support:[15,16],symbol:37,system:9,termin:34,test:[7,12,51],thi:37,think:12,thread:[24,29,44],time:41,todo:35,tool:[4,8],troubleshoot:21,tutori:56,type:[5,37,58],unhandl:38,unhandledreject:22,unit:12,univers:46,unload:28,unregist:37,upload:3,usag:[36,46,47,53],user:37,usual:4,v1:42,v2:42,v8:[1,3,5,14,31,32,36,37,38,40,41,42,48,53,54,58],v8function:[51,58],v8host:53,v8locker:58,v8properti:51,v8runtim:[12,31,58],v8valu:37,v8valuearrai:36,v8valueglobalobject:12,v8valuemap:36,v8valueset:36,v9:[41,42],valu:37,version:9,virtual:5,visual:8,vs:[5,37],weak:31,what:[11,29,37],when:22,where:14,why:[9,22,25,37,58],window:[1,2,3,9,32],work:46,worker:44,x86_64:42,x:[40,41,42],ye:16}}) \ No newline at end of file diff --git a/docs/tutorial/advanced/index.html b/docs/tutorial/advanced/index.html new file mode 100644 index 000000000..ebc9092b7 --- /dev/null +++ b/docs/tutorial/advanced/index.html @@ -0,0 +1,337 @@ + + + + + + + + Advanced - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/advanced/index.rst b/docs/tutorial/advanced/index.rst new file mode 100644 index 000000000..3c893598b --- /dev/null +++ b/docs/tutorial/advanced/index.rst @@ -0,0 +1,10 @@ +======== +Advanced +======== + +.. toctree:: + :maxdepth: 1 + + object_converter + java_and_javascript_interop + interact_with_node_js diff --git a/docs/tutorial/advanced/interact_with_node_js.html b/docs/tutorial/advanced/interact_with_node_js.html new file mode 100644 index 000000000..0c4b62fd6 --- /dev/null +++ b/docs/tutorial/advanced/interact_with_node_js.html @@ -0,0 +1,486 @@ + + + + + + + + Interact with Node.js - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Interact with Node.js¶

    +
    +

    Is That Possible?¶

    +

    In native Node.js, once a JavaScript server application (e.g. express server) is up, there is no normal way of interacting with the Node.js runtime via console. The reasons are quite simple:

    +
      +
    • V8 is single-threaded.

    • +
    • Node.js event loop is dedicated to that JavaScript server application.

    • +
    +

    So, that almost closes the door to interacting with Node.js runtime from JVM. No worry, Javet is able to hijack the Node.js event loop to allow interaction from JVM. In other words, Java application can seamlessly interact with Node.js runtime as usual. That applies to all Javet API.

    +
    +
    +

    How?¶

    +
    +

    Step 1: JavaScript Server¶

    +
      +
    • Create a JavaScript server application. Here is a sample.

    • +
    +
    /*
    +npm install express body-parser cookie-parser multer --save
    +*/
    +
    +const express = require("express");
    +const app = express();
    +
    +// This is the callback function that takes calls from JVM.
    +var test = (count) => {
    +    console.log(`Call #${count}`);
    +}
    +
    +// This is the express handler.
    +app.get('/', function (req, res) {
    +res.send('Hello');
    +    console.log('GET /');
    +})
    +
    +// Start the express server.
    +const server = app.listen(8991, "0.0.0.0", () => {
    +    const host = server.address().address;
    +    const port = server.address().port;
    +    console.log(`Listening at http://${host}:${port}`);
    +});
    +
    +
    +
    +
    +

    Step 2: Worker Thread for the JavaScript Server¶

    +
      +
    • Create a worker thread hosting that JavaScript server application.

    • +
    • Call NodeRuntime.await() in that worker thread once the Node.js runtime is up.

    • +
    • Make sure that Node.js runtime is shared with the main thread.

    • +
    +
    +
    +

    Step 3: Main Thread for the Interaction¶

    +
      +
    • Start that worker thread.

    • +
    • Wait for the Node.js runtime completely initialized.

    • +
    • Perform the interaction as usual.

    • +
    +
    public class TestExpress {
    +    public static void main(String[] args) throws JavetException, InterruptedException {
    +        // Make sure node_modules and test folders stay together.
    +        File codeFile = Path.of(JavetOSUtils.WORKING_DIRECTORY)
    +                .resolve("test/test-express.js").toFile();
    +        AtomicBoolean serverUp = new AtomicBoolean(false);
    +        // Make sure Node.js runtime is shared with all threads.
    +        try (NodeRuntime nodeRuntime = V8Host.getNodeInstance().createV8Runtime()) {
    +            // Create a worker thread.
    +            Thread thread = new Thread(() -> {
    +                try {
    +                    System.out.println("Starting the server.");
    +                    nodeRuntime.getExecutor(codeFile).executeVoid();
    +                    serverUp.set(true);
    +                    System.out.println("Awaiting...");
    +                    nodeRuntime.await();
    +                } catch (JavetException e) {
    +                    e.printStackTrace();
    +                }
    +            });
    +            // Start the worker thread.
    +            thread.start();
    +            while (!serverUp.get()) {
    +                System.out.println("Waiting for server getting up.");
    +                TimeUnit.MILLISECONDS.sleep(500);
    +            }
    +            System.out.println("Server is up.");
    +            // Let's call Node.js.
    +            for (int i = 0; i < Integer.MAX_VALUE; ++i) {
    +                try (V8ValueFunction v8ValueFunction = nodeRuntime.getGlobalObject().get("test")) {
    +                    v8ValueFunction.callVoid(null, i);
    +                }
    +                TimeUnit.MILLISECONDS.sleep(1000);
    +            }
    +        }
    +    }
    +}
    +
    +
    +

    Voilà! The calls (Call #) from JVM work. And in the meanwhile, calls (GET /) to that JavaScript server also work. Here is the console output.

    +
    Waiting for server getting up.
    +Starting the server.
    +Awaiting...
    +Listening at http://0.0.0.0:8991
    +Server is up.
    +Call #0
    +Call #1
    +Call #2
    +Call #3
    +Call #4
    +GET /
    +Call #5
    +Call #6
    +Call #7
    +Call #8
    +Call #9
    +
    +
    +

    How can this work? The await() in the worker thread actually plays the following trick.

    +
    # This is the pseudo logic.
    +def await():
    +    while True:
    +        drain_the_task_queue()
    +        pause_the_event_loop()
    +        if there_are_more_tasks_in_task_queue():
    +            sleep_a_while() # This allows calls from other thread to take effect.
    +            resume_the_event_loop()
    +        else:
    +            break
    +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/interact_with_node_js.rst b/docs/tutorial/advanced/interact_with_node_js.rst similarity index 98% rename from docs/tutorial/interact_with_node_js.rst rename to docs/tutorial/advanced/interact_with_node_js.rst index 3dec5615b..a7ca858e5 100644 --- a/docs/tutorial/interact_with_node_js.rst +++ b/docs/tutorial/advanced/interact_with_node_js.rst @@ -136,5 +136,3 @@ How can this work? The ``await()`` in the worker thread actually plays the follo resume_the_event_loop() else: break - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] diff --git a/docs/tutorial/advanced/java_and_javascript_interop.html b/docs/tutorial/advanced/java_and_javascript_interop.html new file mode 100644 index 000000000..7af2cb5f0 --- /dev/null +++ b/docs/tutorial/advanced/java_and_javascript_interop.html @@ -0,0 +1,426 @@ + + + + + + + + Java and JavaScript Interop - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Java and JavaScript Interop¶

    +

    Javet allows injecting arbitrary Java objects into V8 which enables the complete interop between Java and JavaScript. To enable this feature, application just needs to call v8Runtime.setConverter(new JavetProxyConverter());. Here are 3 examples.

    +
    +

    Inject a Static Class¶

    +
    v8Runtime.getGlobalObject().set("System", System.class);
    +v8Runtime.getExecutor("function main() {\n" +
    +        // Java reference can be directly called in JavaScript.
    +        "  System.out.println('Hello from Java');\n" +
    +        // Java reference can be directly assigned to JavaScript variable.
    +        "  const println = System.out.println;\n" +
    +        // Java reference can be directly assigned to JavaScript variable.
    +        "  println('Hello from JavaScript');\n" +
    +        "}\n" +
    +        "main();").executeVoid();
    +v8Runtime.getGlobalObject().delete("System");
    +
    +/*
    + * Output:
    + *   Hello from Java
    + *   Hello from JavaScript
    + */
    +
    +
    +
    +
    +

    Inject an Enum¶

    +
    v8Runtime.getGlobalObject().set("Color", Color.class);
    +System.out.println(v8Runtime.getExecutor("Color.pink.toString();").executeString());
    +System.out.println("The enum in JavaScript is the one in Java: " +
    +        (Color.pink == (Color) v8Runtime.getExecutor("Color.pink;").executeObject()));
    +v8Runtime.getGlobalObject().delete("Color");
    +
    +/*
    + * Output:
    + *   java.awt.Color[r=255,g=175,b=175]
    + *   The enum in JavaScript is the one in Java: true
    + */
    +
    +
    +
    +
    +

    Inject a Pattern¶

    +
    Pattern pattern = Pattern.compile("^\\d+$");
    +v8Runtime.getExecutor("function main(pattern) {\n" +
    +        "  return [\n" +
    +        "    pattern.matcher('123').matches(),\n" +
    +        "    pattern.matcher('abc').matches(),\n" +
    +        "  ];\n" +
    +        "}").executeVoid();
    +System.out.println(v8Runtime.getGlobalObject().invokeObject("main", pattern).toString());
    +
    +/*
    + * Output:
    + *   [true, false]
    + */
    +
    +
    +
    +
    +

    Inject a StringBuilder¶

    +
     v8Runtime.getGlobalObject().set("StringBuilder", StringBuilder.class);
    + System.out.println(v8Runtime.getExecutor("function main() {\n" +
    +         "  return new StringBuilder('Hello').append(' from StringBuilder').toString();\n" +
    +         "}\n" +
    +         "main();").executeString());
    + v8Runtime.getGlobalObject().delete("StringBuilder");
    +
    +/*
    + * Output:
    + *   Hello from StringBuilder
    + */
    +
    +
    +

    Please refer to the source code for detail.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/java_and_javascript_interop.rst b/docs/tutorial/advanced/java_and_javascript_interop.rst similarity index 93% rename from docs/tutorial/java_and_javascript_interop.rst rename to docs/tutorial/advanced/java_and_javascript_interop.rst index ec27c70c4..d95d0a5bd 100644 --- a/docs/tutorial/java_and_javascript_interop.rst +++ b/docs/tutorial/advanced/java_and_javascript_interop.rst @@ -80,6 +80,4 @@ Inject a StringBuilder * Hello from StringBuilder */ -Please refer to `source code <../../src/test/java/com/caoccao/javet/tutorial/TestJavaAndJSInterop.java>`_ for detail. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/TestJavaAndJSInterop.java>` for detail. diff --git a/docs/tutorial/advanced/object_converter.html b/docs/tutorial/advanced/object_converter.html new file mode 100644 index 000000000..ace3424e5 --- /dev/null +++ b/docs/tutorial/advanced/object_converter.html @@ -0,0 +1,903 @@ + + + + + + + + Object Converter - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Object Converter¶

    +

    Javet has a built-in JavetObjectConverter with the following features.

    +
      +
    • It covers primitive types + Set + Map + Array.

    • +
    • It is completely open to subclass.

    • +
    • It minimizes the performance overhead.

    • +
    • It allows registering custom objects.

    • +
    +

    So, Javet doesn't natively support converting POJO objects because a POJO converter has to deal with reflection which is so slow that Javet leaves that to applications. However, if the POJO objects are owned by the application, it is possible to register custom objects with the built-in JavetObjectConverter. Otherwise, designing a POJO converter is the alternative solution.

    +

    What if the application wants to inject arbitrary Java objects? No worry, the JavetProxyConverter is designed for that purpose.

    +
    +

    Register Custom Objects¶

    +

    JavetObjectConverter exposes registerCustomObject() for alien objects which match the following conditions.

    +
      +
    • Default constructor without arguments

    • +
    • Method with signature void fromMap(Map<String, Object> map)

    • +
    • Method with signature Map<String, Object> toMap()

    • +
    +
    +

    Enhance the Custom Object¶

    +
      +
    • Create a default constructor without arguments.

    • +
    • Add a method with signature void fromMap(Map<String, Object> map)

    • +
    • Add a method with signature Map<String, Object> toMap()

    • +
    +

    Can the method names be changed? Yes, they can have arbitrary names.

    +
    public final class CustomObject {
    +    private String name;
    +    private int value;
    +
    +    public CustomObject(String name, int value) {
    +        this.name = name;
    +        this.value = value;
    +    }
    +
    +    public CustomObject() {
    +        this(null, 0);
    +    }
    +
    +    public void fromMap(Map<String, Object> map) {
    +        setName((String) map.get("name"));
    +        setValue((Integer) map.get("value"));
    +    }
    +
    +    public Map<String, Object> toMap() {
    +        return new HashMap<String, Object>() {
    +            {
    +                put("name", getName());
    +                put("value", getValue());
    +            }
    +        };
    +    }
    +
    +    // getters and setters
    +}
    +
    +
    +
    +
    +

    Register the Custom Object¶

    +

    As the default converter is JavetObjectConverter, just follow the code snippet below to register a custom object.

    +
    JavetObjectConverter converter = (JavetObjectConverter)v8Runtime.getConverter();
    +converter.registerCustomObject(CustomObject.class);
    +
    +
    +

    If the method names are different from the default ones, just provide the names upon registration as the following.

    +
    converter.registerCustomObject(CustomObject.class, "customFromMap", "customToMap");
    +
    +
    +
    +
    +

    Usage¶

    +

    After the registration is completed, there is no additional steps any more. Just follow the regular pattern.

    +
    CustomObject[] customObjects = new CustomObject[]{
    +        new CustomObject("x", 1),
    +        new CustomObject("y", 2),
    +};
    +v8Runtime.getGlobalObject().set("a", customObjects);
    +assertEquals(2, v8Runtime.getExecutor("a.length").executeInteger());
    +List<CustomObject> v8CustomObjects = v8Runtime.getGlobalObject().getObject("a");
    +assertNotNull(v8CustomObjects);
    +assertEquals(2, v8CustomObjects.size());
    +for (int i = 0; i < customObjects.length; i++) {
    +    assertEquals(customObjects[i].getName(), v8Runtime.getExecutor("a[" + i + "].name").executeString());
    +    assertEquals(customObjects[i].getValue(), v8Runtime.getExecutor("a[" + i + "].value").executeInteger());
    +    assertEquals(customObjects[i].getName(), v8CustomObjects.get(i).getName());
    +    assertEquals(customObjects[i].getValue(), v8CustomObjects.get(i).getValue());
    +}
    +
    +
    +
    +
    +

    Highlights¶

    +
      +
    • PROS: This is a built-in feature so there is no need to deal with a POJO converter.

    • +
    • CONS: This is a little bit intrusive to the custom objects.

    • +
    +
    +
    +

    How does It Work?¶

    +

    As V8 supports private properties, JavetObjectConverter sets the custom object class name to the V8 object in toMap() and gets the name from the V8 object in fromMap(). So it is the V8 object that carries the type information all the time and JavetObjectConverter is free from memorizing the complicated relationship between the Java objects and V8 objects.

    +
    +
    +
    +

    Design a POJO Converter¶

    +

    A POJO converter usually is designed for the Java objects that are now owned by the application. So, it has to deal with reflection heavily. The following sample code runs in JDK 11. It's easy to tweak few API for JDK 8.

    +
    +

    Define POJO Object¶

    +

    Let's say you have a Pojo that allows you to define a name-value pair.

    +
    public class Pojo {
    +    private String name;
    +    private String value;
    +
    +    public Pojo() {
    +        this(null, null);
    +    }
    +
    +    public Pojo(String name, String value) {
    +        this.name = name;
    +        this.value = value;
    +    }
    +
    +    public String getName() {
    +        return name;
    +    }
    +
    +    public void setName(String name) {
    +        this.name = name;
    +    }
    +
    +    public String getValue() {
    +        return value;
    +    }
    +
    +    public void setValue(String value) {
    +        this.value = value;
    +    }
    +}
    +
    +
    +
    +
    +

    Create PojoConverter¶

    +

    Then, create a generic PojoConverter.

    +
      +
    • It is generic enough to cover all kinds of Pojo objects in a recursive way.

    • +
    • There is no need to deal with primitive types because the parent converter handles that.

    • +
    • Always override the methods with depth as argument for circular structure detection.

    • +
    • Always increment the depth in recursive call.

    • +
    +
    @SuppressWarnings("unchecked")
    +public class PojoConverter extends JavetObjectConverter {
    +    public static final String METHOD_PREFIX_GET = "get";
    +    public static final String METHOD_PREFIX_IS = "is";
    +    protected static final Set<String> EXCLUDED_METHODS;
    +
    +    static {
    +        EXCLUDED_METHODS = new HashSet<>();
    +        for (Method method : Object.class.getMethods()) {
    +            if (method.getParameterCount() == 0) {
    +                String methodName = method.getName();
    +                if (methodName.startsWith(METHOD_PREFIX_IS) || methodName.startsWith(METHOD_PREFIX_GET)) {
    +                    EXCLUDED_METHODS.add(methodName);
    +                }
    +            }
    +        }
    +    }
    +
    +    @Override
    +    protected V8Value toV8Value(
    +            V8Runtime v8Runtime, Object object, final int depth) throws JavetException {
    +        V8Value v8Value = super.toV8Value(v8Runtime, object, depth);
    +        if (v8Value != null && !(v8Value.isUndefined())) {
    +            return v8Value;
    +        }
    +        Class objectClass = object.getClass();
    +        V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject();
    +        for (Method method : objectClass.getMethods()) {
    +            if (method.getParameterCount() == 0 && method.canAccess(object)) {
    +                String methodName = method.getName();
    +                String propertyName = null;
    +                if (methodName.startsWith(METHOD_PREFIX_IS) && !EXCLUDED_METHODS.contains(methodName)
    +                        && methodName.length() > METHOD_PREFIX_IS.length()) {
    +                    propertyName = methodName.substring(METHOD_PREFIX_IS.length(), METHOD_PREFIX_IS.length() + 1).toLowerCase(Locale.ROOT)
    +                            + methodName.substring(METHOD_PREFIX_IS.length() + 1);
    +                } else if (methodName.startsWith(METHOD_PREFIX_GET) && !EXCLUDED_METHODS.contains(methodName)
    +                        && methodName.length() > METHOD_PREFIX_GET.length()) {
    +                    propertyName = methodName.substring(METHOD_PREFIX_GET.length(), METHOD_PREFIX_GET.length() + 1).toLowerCase(Locale.ROOT)
    +                            + methodName.substring(METHOD_PREFIX_GET.length() + 1);
    +                }
    +                if (propertyName != null) {
    +                    try (V8Value v8ValueTemp = toV8Value(v8Runtime, method.invoke(object), depth + 1)) {
    +                        v8ValueObject.set(propertyName, v8ValueTemp);
    +                    } catch (Exception e) {
    +                        e.printStackTrace();
    +                    }
    +                }
    +            }
    +        }
    +        v8Value = v8ValueObject;
    +        return v8Runtime.decorateV8Value(v8Value);
    +    }
    +}
    +
    +
    +
    +
    +

    Ready! Go!¶

    +

    Just write few lines of code to interact with Javet.

    +
    public class TestPojo {
    +    public static void main(String[] args) throws JavetException {
    +        Pojo[] pojoArray = new Pojo[]{
    +                new Pojo("Tom", "CEO"),
    +                new Pojo("Jerry", "CFO")};
    +        try (V8Runtime v8Runtime = V8Host.getNodeInstance().createV8Runtime()) {
    +            v8Runtime.setConverter(new PojoConverter());
    +            v8Runtime.getGlobalObject().set("pojoArray", pojoArray);
    +            v8Runtime.getExecutor("console.log(pojoArray);").executeVoid();
    +        }
    +    }
    +}
    +
    +
    +

    The console output is:

    +
    [ { name: 'Tom', value: 'CEO' }, { name: 'Jerry', value: 'CFO' } ]
    +
    +
    +

    This process is transparent and fully automated once the converter is set to V8Runtime.

    +
    +
    +
    +

    Universal Converter¶

    +

    Can I inject arbitrary Java objects and call all the API in JavaScript? Yes, JavetProxyConverter is designed for that. In general, the user experience is very much close to the one provided by GraalJS. As JavetProxyConverter opens almost the whole JVM to V8, it is very dangerous to allow end users to touch that V8 runtime, so JavetProxyConverter is not enabled by default. Here are the steps on how to enable that.

    +
    +

    Preparation¶

    +
    // Step 1: Create an instance of JavetProxyConverter.
    +JavetProxyConverter javetProxyConverter = new JavetProxyConverter();
    +// Step 2: Set the V8Runtime converter to JavetProxyConverter.
    +v8Runtime.setConverter(javetProxyConverter);
    +// Please feel free to inject arbitrary Java objects.
    +
    +
    +
    +
    +

    Instance: File¶

    +
    File file = new File("/tmp/i-am-not-accessible");
    +v8Runtime.getGlobalObject().set("file", file);
    +assertEquals(file, v8Runtime.getGlobalObject().getObject("file"));
    +assertEquals(file.exists(), v8Runtime.getExecutor("file.exists()").executeBoolean());
    +assertEquals(file.isFile(), v8Runtime.getExecutor("file.isFile()").executeBoolean());
    +assertEquals(file.isDirectory(), v8Runtime.getExecutor("file.isDirectory()").executeBoolean());
    +assertEquals(file.canRead(), v8Runtime.getExecutor("file.canRead()").executeBoolean());
    +assertEquals(file.canWrite(), v8Runtime.getExecutor("file.canWrite()").executeBoolean());
    +assertEquals(file.canExecute(), v8Runtime.getExecutor("file.canExecute()").executeBoolean());
    +v8Runtime.getGlobalObject().delete("file");
    +v8Runtime.lowMemoryNotification();
    +
    +
    +
    +
    +

    Instance: Map¶

    +
    javetProxyConverter.getConfig().setProxyMapEnabled(true);
    +Map<String, Object> map = new HashMap<String, Object>() {{
    +    put("x", 1);
    +    put("y", "2");
    +}};
    +v8Runtime.getGlobalObject().set("map", map);
    +assertTrue(map == v8Runtime.getGlobalObject().getObject("map"));
    +assertEquals(1, v8Runtime.getExecutor("map['x']").executeInteger());
    +assertEquals("2", v8Runtime.getExecutor("map['y']").executeString());
    +assertEquals(1, v8Runtime.getExecutor("map.x").executeInteger());
    +assertEquals("2", v8Runtime.getExecutor("map.y").executeString());
    +assertEquals("3", v8Runtime.getExecutor("map['z'] = '3'; map.z;").executeString());
    +assertEquals("3", map.get("z"));
    +assertEquals("4", v8Runtime.getExecutor("map.z = '4'; map.z;").executeString());
    +assertEquals("4", map.get("z"));
    +v8Runtime.getGlobalObject().delete("map");
    +v8Runtime.lowMemoryNotification();
    +javetProxyConverter.getConfig().setProxyMapEnabled(false);
    +
    +
    +
    +
    +

    Instance: Path¶

    +
    Path path = new File("/tmp/i-am-not-accessible").toPath();
    +v8Runtime.getGlobalObject().set("path", path);
    +assertEquals(path, v8Runtime.getGlobalObject().getObject("path"));
    +assertEquals(path.toString(), v8Runtime.getExecutor("path.toString()").executeString());
    +Path newPath = v8Runtime.toObject(v8Runtime.getExecutor("path.resolve('abc')").execute(), true);
    +assertNotNull(newPath);
    +assertEquals(path.resolve("abc").toString(), newPath.toString());
    +assertEquals(path.resolve("abc").toString(), v8Runtime.getExecutor("path.resolve('abc').toString()").executeString());
    +v8Runtime.getGlobalObject().delete("path");
    +v8Runtime.lowMemoryNotification();
    +
    +
    +
    +
    +

    Static: StringBuilder¶

    +
    v8Runtime.getGlobalObject().set("StringBuilder", StringBuilder.class);
    +assertEquals("abc def", v8Runtime.getExecutor(
    +        "function main() {\n" +
    +                "  return new StringBuilder().append('abc').append(' ').append('def').toString();\n" +
    +                "}\n" +
    +                "main();").executeString());
    +v8Runtime.getGlobalObject().delete("StringBuilder");
    +v8Runtime.lowMemoryNotification();
    +
    +
    +
    +
    +

    Static: Pattern¶

    +
    v8Runtime.getGlobalObject().set("Pattern", Pattern.class);
    +assertTrue(v8Runtime.getExecutor("let p = Pattern.compile('^\\\\d+$'); p;").executeObject() instanceof Pattern);
    +assertTrue(v8Runtime.getExecutor("p.matcher('123').matches();").executeBoolean());
    +assertFalse(v8Runtime.getExecutor("p.matcher('a123').matches();").executeBoolean());
    +v8Runtime.getGlobalObject().delete("Pattern");
    +v8Runtime.getExecutor("p = undefined;").executeVoid();
    +v8Runtime.lowMemoryNotification();
    +
    +
    +
    +
    +

    Static: Enum¶

    +

    Static class usually does not have an instance. The universal proxy based converter is smart enough to handle that.

    +
    v8Runtime.getGlobalObject().set("JavetErrorType", JavetErrorType.class);
    +assertEquals(JavetErrorType.Converter, v8Runtime.getExecutor("JavetErrorType.Converter").executeObject());
    +assertThrows(
    +        JavetExecutionException.class,
    +        () -> v8Runtime.getExecutor("JavetErrorType.Converter = 1;").executeVoid(),
    +        "Public final field should not be writable.");
    +v8Runtime.getGlobalObject().delete("JavetErrorType");
    +v8Runtime.getGlobalObject().set("Converter", JavetErrorType.Converter);
    +assertEquals(JavetErrorType.Converter, v8Runtime.getGlobalObject().getObject("Converter"));
    +v8Runtime.getGlobalObject().delete("Converter");
    +v8Runtime.lowMemoryNotification();
    +
    +
    +
    +
    +

    Static: Interface¶

    +

    Sometimes an interface or annotation class can be injected for enabling Java reflection in V8.

    +
    v8Runtime.getGlobalObject().set("AutoCloseable", AutoCloseable.class);
    +v8Runtime.getGlobalObject().set("IJavetClosable", IJavetClosable.class);
    +assertTrue(AutoCloseable.class.isAssignableFrom(IJavetClosable.class));
    +assertTrue(v8Runtime.getExecutor("AutoCloseable.isAssignableFrom(IJavetClosable);").executeBoolean());
    +assertEquals(AutoCloseable.class, v8Runtime.getExecutor("AutoCloseable").executeObject());
    +assertEquals(IJavetClosable.class, v8Runtime.getExecutor("IJavetClosable").executeObject());
    +v8Runtime.getGlobalObject().delete("AutoCloseable");
    +v8Runtime.getGlobalObject().delete("IJavetClosable");
    +v8Runtime.lowMemoryNotification();
    +
    +
    +
    +
    +

    Dynamic: Anonymous Function¶

    +

    This feature is quite special as it allows implementing Java interfaces in JavaScript via anonymous functions, also known as lambda expressions.

    +
      +
    1. Define a simple interface IStringJoiner for joining two strings.

    2. +
    +
    interface IStringJoiner extends AutoCloseable {
    +    String join(String a, String b);
    +}
    +
    +
    +
      +
    1. Define a simple class StringJoiner which holds the interface IStringJoiner.

    2. +
    +
    public class StringJoiner implements AutoCloseable {
    +    private IStringJoiner joiner;
    +
    +    public StringJoiner() {
    +        joiner = null;
    +    }
    +
    +    @Override
    +    public void close() throws Exception {
    +        if (joiner != null) {
    +            joiner.close();
    +            joiner = null;
    +        }
    +    }
    +
    +    public IStringJoiner getJoiner() {
    +        return joiner;
    +    }
    +
    +    public void setJoiner(IStringJoiner joiner) {
    +        this.joiner = joiner;
    +    }
    +}
    +
    +
    +
      +
    1. Inject the implementation from JavaScript.

    2. +
    +
    try (StringJoiner stringJoiner = new StringJoiner()) {
    +    v8Runtime.getGlobalObject().set("stringJoiner", stringJoiner);
    +    v8Runtime.getExecutor("stringJoiner.setJoiner((a, b) => a + ',' + b);").executeVoid();
    +    IStringJoiner joiner = stringJoiner.getJoiner();
    +    assertEquals("a,b", joiner.join("a", "b"));
    +    assertEquals("a,b,c", joiner.join(joiner.join("a", "b"), "c"));
    +    v8Runtime.getGlobalObject().delete("stringJoiner");
    +}
    +v8Runtime.lowMemoryNotification();
    +
    +
    +

    Voilà! It works.

    +

    Note: The JavaScript implementation is backed up by V8ValueFunction which is an orphan object. After its internal V8Runtime is closed, it will no longer callable. It's recommended to have the interface implement AutoClosable as the sample shows so that the orphan V8ValueFunction can be recycled explicitly. If you don't own the interface, Javet will force the recycle of the orphan V8ValueFunction when the V8Runtime is being closed. Be careful, if you keep the application running for long while without recycling them in time, OutOfMemoryError may occur.

    +
    +
    +

    Dynamic: Anonymous Object¶

    +

    This feature is similar to the dynamic anonymous function, but is an enhanced version because it allows implementing all methods exposed by the Java interface.

    +
      +
    1. Define a simple interface IStringUtils for joining two strings.

    2. +
    +
    interface IStringUtils extends AutoCloseable {
    +    String hello();
    +    String join(String separator, String... strings);
    +    List<String> split(String separator, String string);
    +}
    +
    +
    +
      +
    1. Define a simple class StringUtils which holds the interface IStringUtils.

    2. +
    +
    public class StringUtils implements AutoCloseable {
    +    private IStringUtils utils;
    +
    +    public StringUtils() {
    +        utils = null;
    +    }
    +
    +    @Override
    +    public void close() throws Exception {
    +        if (utils != null) {
    +            utils.close();
    +            utils = null;
    +        }
    +    }
    +
    +    public IStringUtils getUtils() {
    +        return utils;
    +    }
    +
    +    public void setUtils(IStringUtils utils) {
    +        this.utils = utils;
    +    }
    +}
    +
    +
    +
      +
    1. Inject the implementation from JavaScript.

    2. +
    +
    try (StringUtils stringUtils = new StringUtils()) {
    +    v8Runtime.getGlobalObject().set("stringUtils", stringUtils);
    +    v8Runtime.getExecutor(
    +            "stringUtils.setUtils({\n" +
    +            "  hello: () => 'hello',\n" +
    +            "  join: (separator, ...strings) => [...strings].join(separator),\n" +
    +            "  split: (separator, str) => str.split(separator),\n" +
    +            "});"
    +    ).executeVoid();
    +    IStringUtils utils = stringUtils.getUtils();
    +    assertEquals("hello", utils.hello());
    +    assertEquals("a,b,c", utils.join(",", "a", "b", "c"));
    +    assertArrayEquals(
    +            new String[]{"a", "b", "c"},
    +            utils.split(",", "a,b,c").toArray(new String[0]));
    +    v8Runtime.getGlobalObject().delete("stringUtils");
    +}
    +v8Runtime.lowMemoryNotification();
    +
    +
    +

    Voilà aussi! It works again.

    +

    Note: The JavaScript implementation is backed up by V8ValueObject which is an orphan object. After its internal V8Runtime is closed, it will no longer callable. It's recommended to have the interface implement AutoClosable as the sample shows so that the orphan V8ValueObject can be recycled explicitly. If you don't own the interface, Javet will force the recycle of the orphan V8ValueObject when the V8Runtime is being closed. Be careful, if you keep the application running for long while without recycling them in time, OutOfMemoryError may occur.

    +
    +
    +

    Features¶

    +
      +
    • Any Java objects generated inside V8 are automatically handled by the converter.

    • +
    • Getters and setters (get, is, set and put) are smartly handled.

    • +
    • Overloaded methods and varargs methods are identified well.

    • +
    • Primitive types, Set, Map, List, Array are not handled. Map is special because it can be enabled.

    • +
    • Java interfaces can be implemented by anonymous functions in JavaScript.

    • +
    +
    +
    +

    How does JavetProxyConverter Work?¶

    +

    JavetProxyConverter creates a JavaScript proxy per Java object. For now, the proxy intercepts get, has and set to achieve the complete virtualization of Java objects in JavaScript runtime.

    +
    +
    +

    How to Customize JavetProxyConverter?¶

    +

    It is recommended to subclass JavetProxyConverter and override few internal API to achieve complete customization.

    +
    +
    +
    +

    Null Safety¶

    +

    What if the object converter meets null or undefined when target type is primitive? This is a quite famous topic in Java because converting null to primitive type results in java.lang.NullPointerException. Luckily, Javet object converter is null safe by injecting default primitive values to JavetConverterConfig and these default primitive values can be overridden.

    +
    +
    +

    Functions and Objects¶

    +

    There are few challenges in the object conversion.

    +
      +
    • V8 functions cannot be easily represented by Java objects.

    • +
    • V8 objects and maps cannot be easily differentiated in Java.

    • +
    • Sometimes unexpected functions from object conversion may break applications.

    • +
    +

    So, Javet introduced IJavetEntityFunction and IJavetEntityMap so that V8 functions and V8 maps can be precisely represented in Java.

    +

    Also, JavetConverterConfig exposes setSkipFunctionInObject(boolean) and setExtractFunctionSourceCode(boolean) to give application the opportunity to skip functions in objects or extract source code of functions.

    +

    If the source code is provided to a user defined function, Javet object converter will inject that function from the source code automatically. That makes sure Java object from V8 object can be smoothly converted back to V8 object at both property and function levels.

    +
    +
    +

    Circular Structure¶

    +

    It is inefficient and inconvenient for Javet to substantially detect circular structure during object conversion. Instead, Javet converter keeps increasing the depth of recursion and throws JavetConverterException when maximum depth is reach. Maximum depth can be changed before object conversion is started. This is a cheap operation with high performance.

    +

    Please avoid setting maximum depth to an unrealistic number because JVM will throw StackOverflowError which brings considerable performance overhead. The thing worse than that is there will be memory leak because resource recycling logic written in finally block sometimes won't be called when stack overflow occurs. Attackers may easily drain the server resource in minutes by sending tiny circular structure data.

    +
    +
    +

    Final Note¶

    +

    The built-in converter supports bi-directional conversion. The sample above shows the way of how to convert Java objects to V8 values. The opposite way follows the same pattern.

    +

    Please refer to source code for detail.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/object_converter.rst b/docs/tutorial/advanced/object_converter.rst similarity index 81% rename from docs/tutorial/object_converter.rst rename to docs/tutorial/advanced/object_converter.rst index 2c413a4a6..4db272593 100644 --- a/docs/tutorial/object_converter.rst +++ b/docs/tutorial/advanced/object_converter.rst @@ -7,13 +7,116 @@ Javet has a built-in ``JavetObjectConverter`` with the following features. * It covers primitive types + Set + Map + Array. * It is completely open to subclass. * It minimizes the performance overhead. +* It allows registering custom objects. -So, Javet doesn't natively support converting POJO objects because a POJO converter has to deal with reflection which is so slow that Javet leaves that to applications. +So, Javet doesn't natively support converting POJO objects because a POJO converter has to deal with reflection which is so slow that Javet leaves that to applications. However, if the POJO objects are owned by the application, it is possible to register custom objects with the built-in ``JavetObjectConverter``. Otherwise, designing a POJO converter is the alternative solution. + +What if the application wants to inject arbitrary Java objects? No worry, the ``JavetProxyConverter`` is designed for that purpose. + +Register Custom Objects +======================= + +``JavetObjectConverter`` exposes ``registerCustomObject()`` for alien objects which match the following conditions. + +* Default constructor without arguments +* Method with signature ``void fromMap(Map map)`` +* Method with signature ``Map toMap()`` + +Enhance the Custom Object +------------------------- + +* Create a default constructor without arguments. +* Add a method with signature ``void fromMap(Map map)`` +* Add a method with signature ``Map toMap()`` + +Can the method names be changed? Yes, they can have arbitrary names. + +.. code-block:: java + + public final class CustomObject { + private String name; + private int value; + + public CustomObject(String name, int value) { + this.name = name; + this.value = value; + } + + public CustomObject() { + this(null, 0); + } + + public void fromMap(Map map) { + setName((String) map.get("name")); + setValue((Integer) map.get("value")); + } + + public Map toMap() { + return new HashMap() { + { + put("name", getName()); + put("value", getValue()); + } + }; + } + + // getters and setters + } + +Register the Custom Object +-------------------------- + +As the default converter is ``JavetObjectConverter``, just follow the code snippet below to register a custom object. + +.. code-block:: java + + JavetObjectConverter converter = (JavetObjectConverter)v8Runtime.getConverter(); + converter.registerCustomObject(CustomObject.class); + +If the method names are different from the default ones, just provide the names upon registration as the following. + +.. code-block:: java + + converter.registerCustomObject(CustomObject.class, "customFromMap", "customToMap"); + +Usage +----- + +After the registration is completed, there is no additional steps any more. Just follow the regular pattern. + +.. code-block:: java + + CustomObject[] customObjects = new CustomObject[]{ + new CustomObject("x", 1), + new CustomObject("y", 2), + }; + v8Runtime.getGlobalObject().set("a", customObjects); + assertEquals(2, v8Runtime.getExecutor("a.length").executeInteger()); + List v8CustomObjects = v8Runtime.getGlobalObject().getObject("a"); + assertNotNull(v8CustomObjects); + assertEquals(2, v8CustomObjects.size()); + for (int i = 0; i < customObjects.length; i++) { + assertEquals(customObjects[i].getName(), v8Runtime.getExecutor("a[" + i + "].name").executeString()); + assertEquals(customObjects[i].getValue(), v8Runtime.getExecutor("a[" + i + "].value").executeInteger()); + assertEquals(customObjects[i].getName(), v8CustomObjects.get(i).getName()); + assertEquals(customObjects[i].getValue(), v8CustomObjects.get(i).getValue()); + } + +Highlights +---------- + +* PROS: This is a built-in feature so there is no need to deal with a POJO converter. +* CONS: This is a little bit intrusive to the custom objects. + +How does It Work? +----------------- + +As V8 supports private properties, ``JavetObjectConverter`` sets the custom object class name to the V8 object in ``toMap()`` and gets the name from the V8 object in ``fromMap()``. So it is the V8 object that carries the type information all the time and ``JavetObjectConverter`` is free from memorizing the complicated relationship between the Java objects and V8 objects. Design a POJO Converter ======================= -The following sample code runs in JDK 11. It's easy to tweak few API for JDK 8. +A POJO converter usually is designed for the Java objects that are now owned by the application. So, it has to deal with reflection heavily. The following sample code runs in JDK 11. It's easy to tweak few API for JDK 8. Define POJO Object ------------------ @@ -140,7 +243,7 @@ Just write few lines of code to interact with Javet. The console output is: -.. code-block:: json +.. code-block:: js [ { name: 'Tom', value: 'CEO' }, { name: 'Jerry', value: 'CFO' } ] @@ -462,6 +565,4 @@ Final Note The built-in converter supports bi-directional conversion. The sample above shows the way of how to convert Java objects to V8 values. The opposite way follows the same pattern. -Please refer to `source code <../../src/test/java/com/caoccao/javet/interop/converters/TestJavetCustomConverter.java>`_ for detail. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] +Please refer to :extsource3:`source code <../../../src/test/java/com/caoccao/javet/interop/converters/TestJavetCustomConverter.java>` for detail. diff --git a/docs/tutorial/basic/engine_pool.html b/docs/tutorial/basic/engine_pool.html new file mode 100644 index 000000000..8815a325c --- /dev/null +++ b/docs/tutorial/basic/engine_pool.html @@ -0,0 +1,394 @@ + + + + + + + + Javet Engine Pool - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Javet Engine Pool¶

    +
    +

    Motivation¶

    +
      +
    • It takes quite some time to spawn a V8Runtime, especially in Node.js mode.

    • +
    • It takes a lot of time to initialize a V8Runtime to prepare for script execution.

    • +
    • V8Runtime is not recommended to be used in multi-threaded environments. (Though Javet allows it to be used that way.)

    • +
    +
    +
    +

    Goals¶

    +
      +
    • Provide a basic user experience similar to a database connection pool.

    • +
    • Minimize the performance overhead of V8Runtime creation and initialization.

    • +
    • Free applications from explicitly closing V8Runtime from time to time.

    • +
    • Allow easy extension.

    • +
    +
    +
    +

    Usage¶

    +
    // Create a Javet engine pool.
    +try (IJavetEnginePool<V8Runtime> javetEnginePool = new JavetEnginePool<>()) {
    +    // Get a Javet engine from the pool.
    +    try (IJavetEngine<V8Runtime> javetEngine = javetEnginePool.getEngine()) {
    +        // Get a V8 runtime from the engine.
    +        V8Runtime v8Runtime = javetEngine.getV8Runtime();
    +        // Create a Javet console interceptor.
    +        JavetStandardConsoleInterceptor javetConsoleInterceptor =
    +                new JavetStandardConsoleInterceptor(v8Runtime);
    +        // Register the Javet console to V8 global object.
    +        javetConsoleInterceptor.register(v8Runtime.getGlobalObject());
    +        // V8 console log is redirected to JVM console log.
    +        v8Runtime.getExecutor("console.log('Hello Javet from Pool');").executeVoid();
    +        // Unregister the Javet console to V8 global object.
    +        javetConsoleInterceptor.unregister(v8Runtime.getGlobalObject());
    +        // close() is not necessary because the Javet engine pool handles that.
    +        v8Runtime.lowMemoryNotification();
    +        // Force V8 to GC.
    +    }
    +}
    +
    +
    +

    Please refer to the source code for more detail.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/engine_pool.rst b/docs/tutorial/basic/engine_pool.rst similarity index 62% rename from docs/tutorial/engine_pool.rst rename to docs/tutorial/basic/engine_pool.rst index 154a534b2..749d9d29f 100644 --- a/docs/tutorial/engine_pool.rst +++ b/docs/tutorial/basic/engine_pool.rst @@ -2,6 +2,24 @@ Javet Engine Pool ================= +Motivation +========== + +* It takes quite some time to spawn a ``V8Runtime``, especially in Node.js mode. +* It takes a lot of time to initialize a ``V8Runtime`` to prepare for script execution. +* ``V8Runtime`` is not recommended to be used in multi-threaded environments. (Though Javet allows it to be used that way.) + +Goals +===== + +* Provide a basic user experience similar to a database connection pool. +* Minimize the performance overhead of ``V8Runtime`` creation and initialization. +* Free applications from explicitly closing ``V8Runtime`` from time to time. +* Allow easy extension. + +Usage +===== + .. code-block:: java // Create a Javet engine pool. @@ -25,6 +43,4 @@ Javet Engine Pool } } -Please refer to `source code <../../src/test/java/com/caoccao/javet/tutorial/HelloJavet.java>`_ for more detail. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/HelloJavet.java>` for more detail. diff --git a/docs/tutorial/basic/hello_javet.html b/docs/tutorial/basic/hello_javet.html new file mode 100644 index 000000000..ae977e119 --- /dev/null +++ b/docs/tutorial/basic/hello_javet.html @@ -0,0 +1,373 @@ + + + + + + + + Hello Javet - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Hello Javet¶

    + + +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/hello_javet.rst b/docs/tutorial/basic/hello_javet.rst similarity index 86% rename from docs/tutorial/hello_javet.rst rename to docs/tutorial/basic/hello_javet.rst index 643a56028..e0b213764 100644 --- a/docs/tutorial/hello_javet.rst +++ b/docs/tutorial/basic/hello_javet.rst @@ -26,6 +26,4 @@ Print **1 + 1** in Node.js Mode // Step 3: Resource is recycled automatically at the end of the try-with-resource block. } -Please refer to `source code <../../src/test/java/com/caoccao/javet/tutorial/HelloJavet.java>`_ for more detail. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/HelloJavet.java>` for more detail. diff --git a/docs/tutorial/basic/index.html b/docs/tutorial/basic/index.html new file mode 100644 index 000000000..3f388d8ae --- /dev/null +++ b/docs/tutorial/basic/index.html @@ -0,0 +1,342 @@ + + + + + + + + Basic - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/basic/index.rst b/docs/tutorial/basic/index.rst new file mode 100644 index 000000000..ea2320a2c --- /dev/null +++ b/docs/tutorial/basic/index.rst @@ -0,0 +1,15 @@ +===== +Basic +===== + +.. toctree:: + :maxdepth: 1 + + installation + hello_javet + engine_pool + interception + javet_shell + node_js_mode_and_v8_mode + spring_integration + polyfill diff --git a/docs/tutorial/basic/installation.html b/docs/tutorial/basic/installation.html new file mode 100644 index 000000000..3ee8c4a58 --- /dev/null +++ b/docs/tutorial/basic/installation.html @@ -0,0 +1,433 @@ + + + + + + + + Installation - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Installation¶

    +
    +

    Dependency¶

    +
    +

    Maven¶

    +
    <!-- Linux or Windows -->
    +<dependency>
    +    <groupId>com.caoccao.javet</groupId>
    +    <artifactId>javet</artifactId>
    +    <version>0.9.12</version>
    +</dependency>
    +
    +<!-- Mac OS (x86_64 Only) -->
    +<dependency>
    +    <groupId>com.caoccao.javet</groupId>
    +    <artifactId>javet-macos</artifactId>
    +    <version>0.9.12</version>
    +</dependency>
    +
    +
    +
    +
    +

    Gradle Kotlin DSL¶

    +
    implementation("com.caoccao.javet:javet:0.9.12") // Linux or Windows
    +implementation("com.caoccao.javet:javet-macos:0.9.12") // Mac OS (x86_64 Only)
    +
    +
    +
    +
    +

    Gradle Groovy DSL¶

    +
    implementation 'com.caoccao.javet:javet:0.9.12' // Linux or Windows
    +implementation 'com.caoccao.javet:javet-macos:0.9.12' // Mac OS (x86_64 Only)
    +
    +
    +
    +
    +
    +

    OS Compatibility¶

    +
    ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    OS

    Compatible

    Windows 10

    Yes

    Windows 7

    Yes

    Windows Server

    Not Tested

    Ubuntu 20.04

    Yes

    Ubuntu 18.04

    Yes (Private Build)

    Ubuntu 16.04

    Yes (Private Build)

    Other Linux Distributions

    Not Tested

    MacOS x86_64

    Yes

    MacOS arm64

    No (Can Javet Support Mac?)

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/installation.rst b/docs/tutorial/basic/installation.rst similarity index 74% rename from docs/tutorial/installation.rst rename to docs/tutorial/basic/installation.rst index 8ede56a61..e75b3fb42 100644 --- a/docs/tutorial/installation.rst +++ b/docs/tutorial/basic/installation.rst @@ -1,6 +1,6 @@ -================== -Javet Installation -================== +============ +Installation +============ Dependency ========== @@ -14,14 +14,14 @@ Maven com.caoccao.javet javet - 0.9.11 + 0.9.12 com.caoccao.javet javet-macos - 0.9.11 + 0.9.12 Gradle Kotlin DSL @@ -29,16 +29,16 @@ Gradle Kotlin DSL .. code-block:: kotlin - implementation("com.caoccao.javet:javet:0.9.11") // Linux or Windows - implementation("com.caoccao.javet:javet-macos:0.9.11") // Mac OS (x86_64 Only) + implementation("com.caoccao.javet:javet:0.9.12") // Linux or Windows + implementation("com.caoccao.javet:javet-macos:0.9.12") // Mac OS (x86_64 Only) Gradle Groovy DSL ----------------- .. code-block:: groovy - implementation 'com.caoccao.javet:javet:0.9.11' // Linux or Windows - implementation 'com.caoccao.javet:javet-macos:0.9.11' // Mac OS (x86_64 Only) + implementation 'com.caoccao.javet:javet:0.9.12' // Linux or Windows + implementation 'com.caoccao.javet:javet-macos:0.9.12' // Mac OS (x86_64 Only) OS Compatibility ================ @@ -54,7 +54,5 @@ Ubuntu 18.04 Yes (`Private Build `_) Other Linux Distributions Not Tested MacOS x86_64 Yes -MacOS arm64 No (`Can Javet Support Mac? <../faq/can_javet_support_mac.rst>`_) +MacOS arm64 No (:doc:`../../faq/environment/can_javet_support_mac`) =========================== ======================================================================================================================= - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] diff --git a/docs/tutorial/basic/interception.html b/docs/tutorial/basic/interception.html new file mode 100644 index 000000000..a5806e0e0 --- /dev/null +++ b/docs/tutorial/basic/interception.html @@ -0,0 +1,454 @@ + + + + + + + + Interception - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Interception¶

    +

    Javet provides @V8Property and @V8Function which allow Java applications to intercept JavaScript properties and functions in an automatic way as following.

    +
      +
    • Decorate a Java class with @V8Property or @V8Function.

    • +
    • Bind an instance of that Java class to a V8 value object.

    • +
    • Call the properties or functions of that V8 value object in JavaScript.

    • +
    • The calls are intercepted by that instance of the Java class.

    • +
    +
    +

    Sample¶

    +
    +

    @V8Property and @V8Function¶

    +

    @V8Property is for registering getters and setters. Javet is good at guessing the property name, e.g. getName => name, setValue => value.

    +

    @V8Function is for registering functions. By default, the Java function name is identical to the JavaScript function name, e.g. increaseAndGet => increaseAndGet, add => add.

    +

    If the default name is not suitable, please tell Javet which one to bind via @V8Property(name = "...") and @V8Function(name = "...").

    +
    public class TestInterception {
    +    private String name;
    +    private int value;
    +
    +    @V8Property
    +    public String getName() {
    +        return name;
    +    }
    +
    +    @V8Property
    +    public void setName(String name) {
    +        this.name = name;
    +    }
    +
    +    @V8Property
    +    public int getValue() {
    +        return value;
    +    }
    +
    +    @V8Property
    +    public void setValue(int value) {
    +        this.value = value;
    +    }
    +
    +    @V8Function
    +    public int increaseAndGet() {
    +        return ++value;
    +    }
    +
    +    @V8Function
    +    public int add(int delta) {
    +        value += delta;
    +        return value;
    +    }
    +}
    +
    +
    +
    +
    +

    Test¶

    +
    // Step 1: Create a V8 runtime from V8 host in try-with-resource.
    +try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) {
    +    // Step 2: Register console.
    +    JavetStandardConsoleInterceptor javetStandardConsoleInterceptor = new JavetStandardConsoleInterceptor(v8Runtime);
    +    javetStandardConsoleInterceptor.register(v8Runtime.getGlobalObject());
    +    // Step 3: Create an interceptor.
    +    TestInterception testInterceptor = new TestInterception();
    +    // Step 4: Bind the interceptor to a variable.
    +    try (V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject()) {
    +        v8Runtime.getGlobalObject().set("a", v8ValueObject);
    +        v8ValueObject.bind(testInterceptor);
    +    }
    +
    +    // Test property name
    +    v8Runtime.getExecutor("console.log(`a.name is initially ${a.name}.`);").executeVoid(); // null
    +    // a.name setter => setName(String name)
    +    v8Runtime.getExecutor("a.name = 'Javet';").executeVoid();
    +    // name is changed
    +    System.out.println("Interceptor name is " + testInterceptor.getName() + "."); // Javet
    +    // a.name getter => getName()
    +    v8Runtime.getExecutor("console.log(`a.name is now ${a.name}.`);").executeVoid(); // Javet
    +
    +    // Test property value
    +    v8Runtime.getExecutor("console.log(`a.value is initially ${a.value}.`);").executeVoid(); // 0
    +    // a.value setter => setValue(String value)
    +    v8Runtime.getExecutor("a.value = 123;").executeVoid();
    +    // value is changed
    +    System.out.println("Interceptor value is " + testInterceptor.getValue() + "."); // 123
    +    // a.value getter => getValue()
    +    v8Runtime.getExecutor("console.log(`a.value is now ${a.value}.`);").executeVoid(); // 123
    +
    +    // Test functions
    +    v8Runtime.getExecutor("console.log(`a.increaseAndGet() is ${a.increaseAndGet()}.`);").executeVoid(); // 124
    +    v8Runtime.getExecutor("console.log(`a.add(76) is ${a.add(76)}.`);").executeVoid(); // 200
    +
    +    // Step 5: Delete the interceptor.
    +    v8Runtime.getGlobalObject().delete("a");
    +    // Step 6: Unregister console.
    +    javetStandardConsoleInterceptor.unregister(v8Runtime.getGlobalObject());
    +    // Step 7: Notify V8 to perform GC. (Optional)
    +    v8Runtime.lowMemoryNotification();
    +}
    +
    +
    +

    Please refer to the source code for more detail.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/interception.rst b/docs/tutorial/basic/interception.rst similarity index 94% rename from docs/tutorial/interception.rst rename to docs/tutorial/basic/interception.rst index 383eb7fa8..5d0919f1f 100644 --- a/docs/tutorial/interception.rst +++ b/docs/tutorial/basic/interception.rst @@ -12,8 +12,8 @@ Javet provides ``@V8Property`` and ``@V8Function`` which allow Java applications Sample ====== -``@V8Property`` and ``@V8Function`` ------------------------------------ +@V8Property and @V8Function +--------------------------- ``@V8Property`` is for registering getters and setters. Javet is good at guessing the property name, e.g. getName => name, setValue => value. @@ -107,6 +107,4 @@ Test v8Runtime.lowMemoryNotification(); } -Please refer to `source code <../../src/test/java/com/caoccao/javet/tutorial/TestInterception.java>`_ for more detail. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/TestInterception.java>` for more detail. diff --git a/docs/tutorial/basic/javet_shell.html b/docs/tutorial/basic/javet_shell.html new file mode 100644 index 000000000..cf9ac9374 --- /dev/null +++ b/docs/tutorial/basic/javet_shell.html @@ -0,0 +1,369 @@ + + + + + + + + Javet Shell - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Javet Shell¶

    +

    It is very easy to create a node flavored interactive shell application with a few lines of code.

    +
    // Step 1: Create a V8 runtime from V8 host in try resource.
    +try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) {
    +    System.out.println("Welcome to CDT Shell!");
    +    System.out.println("Input the script or '.exit' to exit.");
    +    // Step 2: Create a scanner to take console input line by line.
    +    try (Scanner scanner = new Scanner(System.in)) {
    +        // Step 3: Create an infinite loop.
    +        while (true) {
    +            System.out.print("> ");
    +            String command = scanner.nextLine();
    +            // Step 4: If the command is ".exit", exit the loop.
    +            if (".exit".equals(command)) {
    +                break;
    +            }
    +            // Step 5: Execute the command and capture the result.
    +            try (V8Value v8Value = v8Runtime.getExecutor(command).execute()) {
    +                if (v8Value != null) {
    +                    // Step 6: Print the result as string.
    +                    System.out.println(v8Value.toString());
    +                }
    +            } catch (Throwable t) {
    +                System.err.println(t.getMessage());
    +            }
    +        }
    +    }
    +}
    +
    +
    +

    The user experience is very much like the one in node.

    +
    > let a = 3
    +undefined
    +> let b = 4
    +undefined
    +> a + b
    +7
    +
    +
    +

    Please refer to the source code for more detail.

    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/javet_shell.rst b/docs/tutorial/basic/javet_shell.rst similarity index 89% rename from docs/tutorial/javet_shell.rst rename to docs/tutorial/basic/javet_shell.rst index f00ca6b85..4fa51120c 100644 --- a/docs/tutorial/javet_shell.rst +++ b/docs/tutorial/basic/javet_shell.rst @@ -44,6 +44,4 @@ The user experience is very much like the one in node. > a + b 7 -Please refer to `source code <../../src/test/java/com/caoccao/javet/tutorial/cdt/CDTShell.java>`_ for more detail. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/cdt/CDTShell.java>` for more detail. diff --git a/docs/tutorial/basic/node_js_mode_and_v8_mode.html b/docs/tutorial/basic/node_js_mode_and_v8_mode.html new file mode 100644 index 000000000..d661681d0 --- /dev/null +++ b/docs/tutorial/basic/node_js_mode_and_v8_mode.html @@ -0,0 +1,402 @@ + + + + + + + + Node.js Mode and V8 Mode - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Node.js Mode and V8 Mode¶

    +
    +

    Co-existence¶

    +

    Javet support both Node.js mode and V8 mode both of which can co-exist in one JVM. This is an awesome feature with the following highlights.

    +
      +
    • Latest V8 features are available in V8 mode.

    • +
    • Node.js ecosystem is available in Node.js mode.

    • +
    • There are 2 versions of V8 runtime in 1 JVM and they don't see each other.

    • +
    +
    +
    +

    Usage¶

    +

    It's very simple to get into Node.js mode or V8 mode. E.g.

    +
    +

    V8Host¶

    +
    // Node.js Mode
    +try (V8Runtime v8Runtime = V8Host.getNodeInstance().createV8Runtime()) {
    +    // ...
    +}
    +
    +// V8 Mode
    +try (V8Runtime v8Runtime = V8Host.getV8Instance().createV8Runtime()) {
    +    // ...
    +}
    +
    +
    +
    +
    +

    Pool¶

    +
    // Node.js Mode
    +try (JavetEnginePool<NodeRuntime> javetEnginePool = new JavetEnginePool<NodeRuntime>()) {
    +    javetEnginePool.getConfig().setJSRuntimeType(JSRuntimeType.Node);
    +    try (IJavetEngine<NodeRuntime> javetEngine = javetEnginePool.getEngine()) {
    +        // ...
    +    }
    +}
    +
    +// V8 Mode
    +try (JavetEnginePool<V8Runtime> javetEnginePool = new JavetEnginePoo<V8Runtime>l()) {
    +    javetEnginePool.getConfig().setJSRuntimeType(JSRuntimeType.V8); // Optional, because it defaults to V8.
    +    try (IJavetEngine<V8Runtime> javetEngine = javetEnginePool.getEngine()) {
    +        // ...
    +    }
    +}
    +
    +
    +

    Note: The default mode in pool is V8 mode. More technical detail is available at Javet Design.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/node_js_mode_and_v8_mode.rst b/docs/tutorial/basic/node_js_mode_and_v8_mode.rst similarity index 92% rename from docs/tutorial/node_js_mode_and_v8_mode.rst rename to docs/tutorial/basic/node_js_mode_and_v8_mode.rst index 7e2997051..8c5f05236 100644 --- a/docs/tutorial/node_js_mode_and_v8_mode.rst +++ b/docs/tutorial/basic/node_js_mode_and_v8_mode.rst @@ -52,6 +52,4 @@ Pool } } -Note: The default mode in pool is V8 mode. More technical detail is available at `here <../development/design.rst>`_. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] +Note: The default mode in pool is V8 mode. More technical detail is available at :doc:`../../development/design`. diff --git a/docs/tutorial/basic/polyfill.html b/docs/tutorial/basic/polyfill.html new file mode 100644 index 000000000..8448cc411 --- /dev/null +++ b/docs/tutorial/basic/polyfill.html @@ -0,0 +1,402 @@ + + + + + + + + Polyfill - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Polyfill¶

    +
    +

    Node.js Mode¶

    +

    Yes, you can polyfill Javet with Node.js modules.

    +
    +

    decimal.js¶

    +
    public void loadJS() throws JavetException {
    +    File decimalJSFile = new File(
    +            JavetOSUtils.WORKING_DIRECTORY,
    +            "scripts/node/node_modules/decimal.js/decimal.js");
    +    if (decimalJSFile.exists() && decimalJSFile.canRead()) {
    +        getLogger().logInfo("Loading {0}.", decimalJSFile.getAbsolutePath());
    +        V8Runtime v8Runtime = iJavetEngine.getV8Runtime();
    +        v8Runtime.getExecutor(decimalJSFile).executeVoid();
    +    } else {
    +        getLogger().logError("{0} is not found.", decimalJSFile.getAbsolutePath());
    +        getLogger().logError("Please make sure Node.js is installed, then visit script/node directory and run npm install.");
    +    }
    +}
    +
    +public void test() throws JavetException {
    +    V8Runtime v8Runtime = iJavetEngine.getV8Runtime();
    +    getLogger().logInfo("1.23 + 2.34 = {0}", v8Runtime.getExecutor(
    +            "const a = new Decimal(1.23);" +
    +                    "const b = new Decimal(2.34);" +
    +                    "a.add(b).toString();").executeString());
    +    try (V8ValueFunction v8ValueFunctionDecimal = v8Runtime.getGlobalObject().get("Decimal")) {
    +        try (V8ValueObject v8ValueObjectDecimal = v8ValueFunctionDecimal.callAsConstructor("123.45")) {
    +            getLogger().logInfo(v8ValueObjectDecimal.toString());
    +            if (v8ValueObjectDecimal.hasOwnProperty("constructor")) {
    +                try (V8ValueFunction v8ValueFunction = v8ValueObjectDecimal.get("constructor")) {
    +                    String name = v8ValueFunction.getString("name");
    +                    if ("Decimal".equals(name)) {
    +                        BigDecimal bigDecimal = new BigDecimal(v8ValueObjectDecimal.toString());
    +                        getLogger().logInfo("BigDecimal: {0}", bigDecimal.toString());
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    +
    +
    +

    Please refer to the source code for more detail.

    +
    +
    +
    +

    V8 Mode¶

    +

    Polyfilling V8 mode is at another project Javenode which aims at simulating Node.js with Java in Javet V8 mode. Why? Because Javet V8 mode is much more secure than the Node.js mode, but lacks of some basic features, e.g. setTimeout, setInterval, etc. So, these must-have API can be found in Javenode.

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/polyfill.rst b/docs/tutorial/basic/polyfill.rst similarity index 93% rename from docs/tutorial/polyfill.rst rename to docs/tutorial/basic/polyfill.rst index 4b787ccd6..8e86c1612 100644 --- a/docs/tutorial/polyfill.rst +++ b/docs/tutorial/basic/polyfill.rst @@ -48,11 +48,9 @@ decimal.js } } -Please refer to `source code <../../src/test/java/com/caoccao/javet/tutorial/DecimalJavetInV8Mode.java>`_ for more detail. +Please refer to the :extsource3:`source code <../../../src/test/java/com/caoccao/javet/tutorial/DecimalJavetInV8Mode.java>` for more detail. V8 Mode ======= Polyfilling V8 mode is at another project `Javenode `_ which aims at simulating Node.js with Java in Javet V8 mode. Why? Because Javet V8 mode is much more secure than the Node.js mode, but lacks of some basic features, e.g. setTimeout, setInterval, etc. So, these must-have API can be found in Javenode. - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] diff --git a/docs/tutorial/basic/spring_integration.html b/docs/tutorial/basic/spring_integration.html new file mode 100644 index 000000000..40ab17ea7 --- /dev/null +++ b/docs/tutorial/basic/spring_integration.html @@ -0,0 +1,408 @@ + + + + + + + + Spring Integration - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Spring Integration¶

    +

    As Javet is a fundamental SDK, it doesn't rely on Spring Framework so that Javet users don't get dependency hell. But, Javet can be integrated with Spring easily.

    +
    +

    Configuration¶

    +
      +
    • Create a Spring configuration.

    • +
    • Declare IJavetEnginePool as @Bean.

    • +
    +
    @Configuration
    +@PropertySource("classpath:javet-engine.properties")
    +@ConfigurationProperties(prefix = "javet.engine")
    +public class MyJavetEngineConfig {
    +
    +    @Bean(name = "JavetEnginePoolNode")
    +    public IJavetEnginePool getJavetEnginePoolNode() {
    +        JavetEngineConfig javetEngineConfigNode = new JavetEngineConfig();
    +        javetEngineConfigNode.setAllowEval(...);
    +        javetEngineConfigNode.setAutoSendGCNotification(...);
    +        javetEngineConfigNode.setDefaultEngineGuardTimeoutMillis(...);
    +        javetEngineConfigNode.setEngineGuardCheckIntervalMillis(...);
    +        javetEngineConfigNode.setPoolDaemonCheckIntervalMillis(...);
    +        javetEngineConfigNode.setPoolIdleTimeoutSeconds(...);
    +        javetEngineConfigNode.setPoolMinSize(...);
    +        javetEngineConfigNode.setPoolMaxSize(...);
    +        javetEngineConfigNode.setPoolShutdownTimeoutSeconds(...);
    +        javetEngineConfigNode.setResetEngineTimeoutSeconds(...);
    +        javetEngineConfigNode.setJavetLogger(new MyJavetLogger(MyJavetLogger.class.getName()));
    +        javetEngineConfigNode.setJSRuntimeType(JSRuntimeType.Node);
    +        return new JavetEnginePool<>(javetEngineConfigNode);
    +    }
    +
    +    @Bean(name = "JavetEnginePoolV8")
    +    public IJavetEnginePool getJavetEnginePoolV8() {
    +        JavetEngineConfig javetEngineConfigV8 = new JavetEngineConfig();
    +        javetEngineConfigV8.setAllowEval(...);
    +        javetEngineConfigV8.setAutoSendGCNotification(...);
    +        javetEngineConfigV8.setDefaultEngineGuardTimeoutMillis(...);
    +        javetEngineConfigV8.setEngineGuardCheckIntervalMillis(...);
    +        javetEngineConfigV8.setPoolDaemonCheckIntervalMillis(...);
    +        javetEngineConfigV8.setPoolIdleTimeoutSeconds(...);
    +        javetEngineConfigV8.setPoolMinSize(...);
    +        javetEngineConfigV8.setPoolMaxSize(...);
    +        javetEngineConfigV8.setPoolShutdownTimeoutSeconds(...);
    +        javetEngineConfigV8.setResetEngineTimeoutSeconds(...);
    +        javetEngineConfigV8.setJavetLogger(new MyJavetLogger(MyJavetLogger.class.getName()));
    +        javetEngineConfigV8.setJSRuntimeType(JSRuntimeType.V8);
    +        return new JavetEnginePool<>(javetEngineConfigV8);
    +    }
    +
    +
    +
    +
    +

    Injection¶

    +

    You may easily inject your engine pool in the Spring way.

    +
    @Resource
    +protected IJavetEnginePool javetEnginePool;
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/spring_integration.rst b/docs/tutorial/basic/spring_integration.rst similarity index 94% rename from docs/tutorial/spring_integration.rst rename to docs/tutorial/basic/spring_integration.rst index 341ce7848..2b9cdbca7 100644 --- a/docs/tutorial/spring_integration.rst +++ b/docs/tutorial/basic/spring_integration.rst @@ -28,7 +28,7 @@ Configuration javetEngineConfigNode.setPoolIdleTimeoutSeconds(...); javetEngineConfigNode.setPoolMinSize(...); javetEngineConfigNode.setPoolMaxSize(...); - javetEngineConfigNode.setPoolMaxSize(...); + javetEngineConfigNode.setPoolShutdownTimeoutSeconds(...); javetEngineConfigNode.setResetEngineTimeoutSeconds(...); javetEngineConfigNode.setJavetLogger(new MyJavetLogger(MyJavetLogger.class.getName())); javetEngineConfigNode.setJSRuntimeType(JSRuntimeType.Node); @@ -46,7 +46,7 @@ Configuration javetEngineConfigV8.setPoolIdleTimeoutSeconds(...); javetEngineConfigV8.setPoolMinSize(...); javetEngineConfigV8.setPoolMaxSize(...); - javetEngineConfigV8.setPoolMaxSize(...); + javetEngineConfigV8.setPoolShutdownTimeoutSeconds(...); javetEngineConfigV8.setResetEngineTimeoutSeconds(...); javetEngineConfigV8.setJavetLogger(new MyJavetLogger(MyJavetLogger.class.getName())); javetEngineConfigV8.setJSRuntimeType(JSRuntimeType.V8); @@ -62,5 +62,3 @@ You may easily inject your engine pool in the Spring way. @Resource protected IJavetEnginePool javetEnginePool; - -[`Home <../../README.rst>`_] [`Javet Tutorial `_] diff --git a/docs/tutorial/index.html b/docs/tutorial/index.html new file mode 100644 index 000000000..cfd05faff --- /dev/null +++ b/docs/tutorial/index.html @@ -0,0 +1,355 @@ + + + + + + + + Tutorial - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/index.rst b/docs/tutorial/index.rst index ff312e4d4..6535b252a 100644 --- a/docs/tutorial/index.rst +++ b/docs/tutorial/index.rst @@ -2,25 +2,9 @@ Tutorial ======== -Basic -===== +.. toctree:: + :maxdepth: 2 -* `Installation `_ -* `Hello Javet `_ -* `Engine Pool `_ -* `Interception `_ -* `Javet Shell `_ -* `Node.js Mode and V8 Mode `_ -* `Spring Integration `_ -* `Polyfill `_ - -Advanced -======== - -* `Object Converter `_ -* `Java and JavaScript Interop `_ -* `Interact with Node.js `_ - -Complete tutorial is available at `here <../../src/test/java/com/caoccao/javet/tutorial>`_. - -[`Home <../../README.rst>`_] + basic/index + advanced/index + migration_guides/index diff --git a/docs/tutorial/migration_guides/index.html b/docs/tutorial/migration_guides/index.html new file mode 100644 index 000000000..b687dfc40 --- /dev/null +++ b/docs/tutorial/migration_guides/index.html @@ -0,0 +1,335 @@ + + + + + + + + Migration Guides - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/migration_guides/index.rst b/docs/tutorial/migration_guides/index.rst new file mode 100644 index 000000000..719198d9d --- /dev/null +++ b/docs/tutorial/migration_guides/index.rst @@ -0,0 +1,8 @@ +================ +Migration Guides +================ + +.. toctree:: + :maxdepth: 1 + + migrate_from_j2v8 diff --git a/docs/tutorial/migration_guides/migrate_from_j2v8.html b/docs/tutorial/migration_guides/migrate_from_j2v8.html new file mode 100644 index 000000000..ef695ea10 --- /dev/null +++ b/docs/tutorial/migration_guides/migrate_from_j2v8.html @@ -0,0 +1,435 @@ + + + + + + + + Migrate from J2V8 - Javet 0.9.12 documentation + + + + + + + + + + + + + + + + Contents + + + + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    Migrate from J2V8¶

    +

    How to migrate from J2V8 to Javet is a frequently asked question, especially when people are evaluating Javet. I created Javet in Jan, 2021 for various reasons (What is the Motivation?, History with J2V8). After the first release v0.7.0 was published, I started migrating from J2V8 to Javet. It was quite smooth, though it took a week.

    +
    +

    Why Migrate from J2V8 to Javet?¶

    +
      +
    • Its Linux, Mac OS and Windows releases have been abandoned for years.

    • +
    • Its type hierarchy is inconsistent because primitive types are out of the hierarchy so that tedious if-else sentences have to be repeated all over the code base.

    • +
    • Its function registration API is kind of verbose.

    • +
    • Segfaults take place so frequently and don't get maintainers' attention for years.

    • +
    • Its locking mechanism heavily increases mental pressure in the code base.

    • +
    • Its V8 runtime is not multi-threaded friendly unless application adds a synchronous layer on top of it.

    • +
    +
    +
    +

    Migration Guides¶

    +
    +

    V8 ⟶ V8Runtime¶

    +
      +
    • V8 in J2V8 is V8Runtime in Javet.

    • +
    • V8 in J2V8 carries 2 roles: 1 as the V8 runtime and 1 as the global object (globalThis or global). In Javet, V8Runtime no longer inherits from V8Value so that it literally represents the V8 runtime. V8Runtime.getGlobalObject() is dedicated to the global object.

    • +
    • V8Runtime has much richer API than V8 has. E.g. compileV8Module(), lowMemoryNotification(), terminateExecution().

    • +
    +
    +
    +

    Primitive Types¶

    +
      +
    • Primitive types in Javet inherit from V8ValuePrimitive ⟶ V8Value ⟶ V8Data.

    • +
    • The Javet type hierarchy is consistent so that V8Value in all supported API can represent all V8 types. This is hard in J2V8 because Object has to be used to represent all types, however, by using Object the type check during compilation doesn't work at all and that is a rich source of runtime bugs or even segfaults.

    • +
    +
    +
    +

    registerJavaMethod() ⟶ @V8Function¶

    +
      +
    • It is quite painful to register many functions in J2V8. Javet makes that a declarative one instead of the imperative one. Just decorate the target function with @V8Function, then call V8ValueObject.bind(javaObject) to bind that Java object, it's done.

    • +
    • In addition, Javet provides @V8Property which allows registering getters and setters in the same manner. That feature has never been delivered by J2V8.

    • +
    • Javet also allows unbinding the registration. Just call V8ValueObject.unbind(javaObject).

    • +
    +

    Please refer to V8 Function for more details.

    +
    +
    +

    V8Locker¶

    +
      +
    • Javet introduced Implicit Mode which allows applications to eliminate V8Locker from the code base and still be able to share the same V8Runtime among multiple threads, because Javet does the synchronization automatically. That frees application developers from the tedious acquire() and release() calls, and gets the rid of the runtime exceptions caused by multiple threads.

    • +
    • Javet also has Explicit Mode for performance sensitive scenarios.

    • +
    +

    Please refer to Know the Lock for more details.

    +
    +
    +

    Type Conversion¶

    +
      +
    • Javet has built-in JavetObjectConverter which covers the majority cases on type conversion so that the arguments of Javet API can be of any type and the converter just does the conversion transparently. That frees application developers from writing tedious type conversion code everywhere.

    • +
    • Javet also provides JavetProxyConverter which allows injecting arbitrary Java objects in V8 and polyfilling Java interfaces with JavaScript functions or objects. Especially the polyfilling feature implies hotfixing business logic without restarting the JVM.

    • +
    +

    Please refer to Object Converter for more details.

    +
    +
    +

    Node.js and V8¶

    +
      +
    • Javet provides both Node.js mode and V8 mode for various usages. Each mode stays at a dedicated classloader so that both modes don't cross each other, and are completely isolated. If the application only uses one mode, it doesn't need to pay extra amount of memory for the other mode because the other mode is not loaded at all. Of course, both modes can be unloaded as well without shutting down the JVM.

    • +
    • In Node.js mode, all node modules can be directly used including the native modules. Please refer to Modularization for more detail.

    • +
    • In V8 mode, it is much more secure than the Node.js mode is, but lacks of some basic ES API, e.g. setTimeout(). Project Javenode is the one that aims at simulating Node.js with Java in Javet V8 mode.

    • +
    +

    Please refer to Javet Design for more details.

    +
    +
    +

    ES6 Module¶

    +
      +
    • Javet supports import { *** } from '***.js' and exposes module resolve event for applications to specify where to locate the modules.

    • +
    +

    Please refer to Modularization for more detail.

    +
    +
    +
    +

    Blessing¶

    +

    In case this migration guide couldn't cover all your use cases, please contact the maintainer at discord. Wish you a successful migration!

    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/tutorial/migration_guides/migrate_from_j2v8.rst b/docs/tutorial/migration_guides/migrate_from_j2v8.rst new file mode 100644 index 000000000..6be6232b5 --- /dev/null +++ b/docs/tutorial/migration_guides/migrate_from_j2v8.rst @@ -0,0 +1,77 @@ +================= +Migrate from J2V8 +================= + +How to migrate from J2V8 to Javet is a frequently asked question, especially when people are evaluating Javet. I created Javet in Jan, 2021 for various reasons (:doc:`../../faq/background/what_is_the_motivation`, :doc:`../../faq/background/history_with_j2v8`). After the first release v0.7.0 was published, I started migrating from J2V8 to Javet. It was quite smooth, though it took a week. + +Why Migrate from J2V8 to Javet? +=============================== + +* Its Linux, Mac OS and Windows releases have been abandoned for years. +* Its type hierarchy is inconsistent because primitive types are out of the hierarchy so that tedious ``if-else`` sentences have to be repeated all over the code base. +* Its function registration API is kind of verbose. +* Segfaults take place so frequently and don't get maintainers' attention for years. +* Its locking mechanism heavily increases mental pressure in the code base. +* Its V8 runtime is not multi-threaded friendly unless application adds a synchronous layer on top of it. + +Migration Guides +================ + +V8 ⟶ V8Runtime +--------------- + +* ``V8`` in J2V8 is ``V8Runtime`` in Javet. +* ``V8`` in J2V8 carries 2 roles: 1 as the V8 runtime and 1 as the global object (``globalThis`` or ``global``). In Javet, ``V8Runtime`` no longer inherits from ``V8Value`` so that it literally represents the V8 runtime. ``V8Runtime.getGlobalObject()`` is dedicated to the global object. +* ``V8Runtime`` has much richer API than ``V8`` has. E.g. ``compileV8Module()``, ``lowMemoryNotification()``, ``terminateExecution()``. + +Primitive Types +--------------- + +* Primitive types in Javet inherit from ``V8ValuePrimitive`` ⟶ ``V8Value`` ⟶ ``V8Data``. +* The Javet type hierarchy is consistent so that ``V8Value`` in all supported API can represent all V8 types. This is hard in J2V8 because ``Object`` has to be used to represent all types, however, by using ``Object`` the type check during compilation doesn't work at all and that is a rich source of runtime bugs or even segfaults. + +registerJavaMethod() ⟶ @V8Function +----------------------------------- + +* It is quite painful to register many functions in J2V8. Javet makes that a declarative one instead of the imperative one. Just decorate the target function with ``@V8Function``, then call ``V8ValueObject.bind(javaObject)`` to bind that Java object, it's done. +* In addition, Javet provides ``@V8Property`` which allows registering getters and setters in the same manner. That feature has never been delivered by J2V8. +* Javet also allows unbinding the registration. Just call ``V8ValueObject.unbind(javaObject)``. + +Please refer to :doc:`../../reference/v8_function` for more details. + +V8Locker +-------- + +* Javet introduced **Implicit Mode** which allows applications to eliminate ``V8Locker`` from the code base and still be able to share the same ``V8Runtime`` among multiple threads, because Javet does the synchronization automatically. That frees application developers from the tedious ``acquire()`` and ``release()`` calls, and gets the rid of the runtime exceptions caused by multiple threads. +* Javet also has **Explicit Mode** for performance sensitive scenarios. + +Please refer to :doc:`../../reference/lock` for more details. + +Type Conversion +--------------- + +* Javet has built-in ``JavetObjectConverter`` which covers the majority cases on type conversion so that the arguments of Javet API can be of any type and the converter just does the conversion transparently. That frees application developers from writing tedious type conversion code everywhere. +* Javet also provides ``JavetProxyConverter`` which allows injecting arbitrary Java objects in V8 and polyfilling Java interfaces with JavaScript functions or objects. Especially the polyfilling feature implies hotfixing business logic without restarting the JVM. + +Please refer to :doc:`../advanced/object_converter` for more details. + +Node.js and V8 +-------------- + +* Javet provides both Node.js mode and V8 mode for various usages. Each mode stays at a dedicated classloader so that both modes don't cross each other, and are completely isolated. If the application only uses one mode, it doesn't need to pay extra amount of memory for the other mode because the other mode is not loaded at all. Of course, both modes can be unloaded as well without shutting down the JVM. +* In Node.js mode, all node modules can be directly used including the native modules. Please refer to :doc:`../../reference/modularization` for more detail. +* In V8 mode, it is much more secure than the Node.js mode is, but lacks of some basic ES API, e.g. ``setTimeout()``. Project `Javenode `_ is the one that aims at simulating Node.js with Java in Javet V8 mode. + +Please refer to :doc:`../../development/design` for more details. + +ES6 Module +---------- + +* Javet supports ``import { *** } from '***.js'`` and exposes module resolve event for applications to specify where to locate the modules. + +Please refer to :doc:`../../reference/modularization` for more detail. + +Blessing +======== + +In case this migration guide couldn't cover all your use cases, please contact the maintainer at `discord `_. Wish you a successful migration! diff --git a/pom.xml b/pom.xml index bba95bb9d..575d63c47 100644 --- a/pom.xml +++ b/pom.xml @@ -3,9 +3,9 @@ com.caoccao.javet javet - 0.9.11 + 0.9.12 javet - Javet is Java + V8 (JAVa + V + EighT). It is a way of embedding V8 in Java. + Javet is Java + V8 (JAVa + V + EighT). It is an awesome way of embedding V8 in Java. https://github.com/caoccao/Javet @@ -28,7 +28,7 @@ scm:git:git://github.com/caoccao/Javet.git scm:git:git@github.com:caoccao/caoccao.git https://github.com/caoccao/Javet - javet-0.9.11 + javet-0.9.12 diff --git a/scripts/node/javet-rebuild/rebuild.cmd b/scripts/node/javet-rebuild/rebuild.cmd index e94bda923..c1fca8123 100644 --- a/scripts/node/javet-rebuild/rebuild.cmd +++ b/scripts/node/javet-rebuild/rebuild.cmd @@ -1,5 +1,5 @@ @echo off -SET NODE_LIB_FILE="..\..\..\..\..\..\build\libs\libjavet-node-windows-x86_64.v.0.9.11.lib" +SET NODE_LIB_FILE="..\..\..\..\..\..\build\libs\libjavet-node-windows-x86_64.v.0.9.12.lib" cd %NODE_MODULE_ROOT% call node-gyp clean call node-gyp configure --module_name=%NODE_MODULE_NAME% --module_path=%NODE_MODULE_PATH% --node_lib_file=%NODE_LIB_FILE% diff --git a/scripts/node/javet-rebuild/rebuild.sh b/scripts/node/javet-rebuild/rebuild.sh index bd0883266..9ba202986 100755 --- a/scripts/node/javet-rebuild/rebuild.sh +++ b/scripts/node/javet-rebuild/rebuild.sh @@ -1 +1 @@ -patchelf --add-needed libjavet-node-linux-x86_64.v.0.9.11.so ${NODE_MODULE_FILE} +patchelf --add-needed libjavet-node-linux-x86_64.v.0.9.12.so ${NODE_MODULE_FILE} diff --git a/scripts/python/change_javet_version.py b/scripts/python/change_javet_version.py index 895f21a55..5c1997b31 100644 --- a/scripts/python/change_javet_version.py +++ b/scripts/python/change_javet_version.py @@ -40,6 +40,9 @@ def update(self): self._update( 'build.gradle.kts', '\n', re.compile(r'^version = "(?P\d+\.\d+\.\d+)"$')) + self._update( + 'docs/conf.py', '\n', + re.compile(r'release\s*=\s*\'(?P\d+\.\d+\.\d+)\'$')) self._update( 'docs/tutorial/installation.rst', '\n', re.compile(r'^ (?P\d+\.\d+\.\d+)$'), @@ -110,7 +113,7 @@ def _update(self, relative_file_path: str, line_separator: str, *patterns: list) logging.info(' Updated.') def main(): - change_javet_version = ChangeJavetVersion('0.9.11') + change_javet_version = ChangeJavetVersion('0.9.12') change_javet_version.update() return 0 diff --git a/src/main/java/com/caoccao/javet/annotations/CheckReturnValue.java b/src/main/java/com/caoccao/javet/annotations/CheckReturnValue.java index 09840cc91..779ee06d6 100644 --- a/src/main/java/com/caoccao/javet/annotations/CheckReturnValue.java +++ b/src/main/java/com/caoccao/javet/annotations/CheckReturnValue.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.caoccao.javet.annotations; import java.lang.annotation.*; @@ -10,6 +26,6 @@ */ @Documented @Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE, ElementType.PACKAGE}) -@Retention(RetentionPolicy.RUNTIME) +@Retention(RetentionPolicy.SOURCE) public @interface CheckReturnValue { } diff --git a/src/main/java/com/caoccao/javet/annotations/V8Property.java b/src/main/java/com/caoccao/javet/annotations/V8Property.java index 8e98bb82c..09d885cc8 100644 --- a/src/main/java/com/caoccao/javet/annotations/V8Property.java +++ b/src/main/java/com/caoccao/javet/annotations/V8Property.java @@ -17,6 +17,8 @@ package com.caoccao.javet.annotations; +import com.caoccao.javet.enums.V8ValueSymbolType; + import java.lang.annotation.*; /** @@ -37,12 +39,12 @@ String name() default ""; /** - * Symbol boolean. + * Symbol V8 value symbol type. * - * @return the boolean + * @return the V8 value symbol type * @since 0.9.11 */ - boolean symbol() default false; + V8ValueSymbolType symbolType() default V8ValueSymbolType.None; /** * This object required. diff --git a/src/main/java/com/caoccao/javet/annotations/package-info.java b/src/main/java/com/caoccao/javet/annotations/package-info.java new file mode 100644 index 000000000..88affd660 --- /dev/null +++ b/src/main/java/com/caoccao/javet/annotations/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Annotations classes for declarative coding and IDE intellisense. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.annotations; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/entities/JavetEntityFunction.java b/src/main/java/com/caoccao/javet/entities/JavetEntityFunction.java index 3cd0b408c..073415fe6 100644 --- a/src/main/java/com/caoccao/javet/entities/JavetEntityFunction.java +++ b/src/main/java/com/caoccao/javet/entities/JavetEntityFunction.java @@ -21,7 +21,8 @@ import com.caoccao.javet.interfaces.IJavetEntityFunction; /** - * The type Javet entity function. + * The type Javet entity function is for converting JS function + * to or from Java object. * * @since 0.9.4 */ diff --git a/src/main/java/com/caoccao/javet/entities/JavetEntityMap.java b/src/main/java/com/caoccao/javet/entities/JavetEntityMap.java index 768f324ac..a8a679e44 100644 --- a/src/main/java/com/caoccao/javet/entities/JavetEntityMap.java +++ b/src/main/java/com/caoccao/javet/entities/JavetEntityMap.java @@ -23,7 +23,8 @@ import java.util.Map; /** - * The type Javet entity map. + * The type Javet entity map is for converting JS map + * to or from Java map. * * @since 0.7.2 */ diff --git a/src/main/java/com/caoccao/javet/entities/JavetEntitySymbol.java b/src/main/java/com/caoccao/javet/entities/JavetEntitySymbol.java index 173446728..800df0623 100644 --- a/src/main/java/com/caoccao/javet/entities/JavetEntitySymbol.java +++ b/src/main/java/com/caoccao/javet/entities/JavetEntitySymbol.java @@ -20,7 +20,8 @@ import java.util.Objects; /** - * The type Javet entity symbol. + * The type Javet entity symbol is for converting JS symbol + * to or from Java symbol. * * @since 0.9.11 */ diff --git a/src/main/java/com/caoccao/javet/entities/package-info.java b/src/main/java/com/caoccao/javet/entities/package-info.java new file mode 100644 index 000000000..8d8848522 --- /dev/null +++ b/src/main/java/com/caoccao/javet/entities/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Built-in entities for default object conversion. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.entities; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/enums/JavetErrorType.java b/src/main/java/com/caoccao/javet/enums/JavetErrorType.java index a9aa067ea..e9b9f354b 100644 --- a/src/main/java/com/caoccao/javet/enums/JavetErrorType.java +++ b/src/main/java/com/caoccao/javet/enums/JavetErrorType.java @@ -18,7 +18,7 @@ package com.caoccao.javet.enums; /** - * The enum Javet error type. + * The enum Javet error type is for categorizing the errors. * * @since 0.8.5 */ diff --git a/src/main/java/com/caoccao/javet/enums/JavetPromiseRejectEvent.java b/src/main/java/com/caoccao/javet/enums/JavetPromiseRejectEvent.java index 7eafd4676..f1132f711 100644 --- a/src/main/java/com/caoccao/javet/enums/JavetPromiseRejectEvent.java +++ b/src/main/java/com/caoccao/javet/enums/JavetPromiseRejectEvent.java @@ -17,10 +17,25 @@ package com.caoccao.javet.enums; +/** + * The enum Javet promise reject event represents the corresponding event in V8. + */ public enum JavetPromiseRejectEvent { + /** + * PromiseRejectWithNoHandler. + */ PromiseRejectWithNoHandler(0, "PromiseRejectWithNoHandler"), + /** + * PromiseHandlerAddedAfterReject. + */ PromiseHandlerAddedAfterReject(1, "PromiseHandlerAddedAfterReject"), + /** + * PromiseResolveAfterResolved. + */ PromiseResolveAfterResolved(2, "PromiseResolveAfterResolved"), + /** + * PromiseRejectAfterResolved. + */ PromiseRejectAfterResolved(3, "PromiseRejectAfterResolved"); private static final JavetPromiseRejectEvent[] EVENTS = new JavetPromiseRejectEvent[]{ @@ -37,17 +52,33 @@ public enum JavetPromiseRejectEvent { this.name = name; } - public static JavetPromiseRejectEvent parse(int event) { - if (event >= 0 && event < EVENTS.length) { - return EVENTS[event]; + /** + * Parse javet promise reject event by code. + * + * @param code the event code + * @return the javet promise reject event + */ + public static JavetPromiseRejectEvent parse(int code) { + if (code >= 0 && code < EVENTS.length) { + return EVENTS[code]; } return null; } + /** + * Gets event code. + * + * @return the event code + */ public int getCode() { return code; } + /** + * Gets event name. + * + * @return the event name + */ public String getName() { return name; } diff --git a/src/main/java/com/caoccao/javet/enums/V8ValueReferenceType.java b/src/main/java/com/caoccao/javet/enums/V8ValueReferenceType.java index dcf1d4a03..6d3592947 100644 --- a/src/main/java/com/caoccao/javet/enums/V8ValueReferenceType.java +++ b/src/main/java/com/caoccao/javet/enums/V8ValueReferenceType.java @@ -17,6 +17,8 @@ package com.caoccao.javet.enums; +import java.util.stream.Stream; + public enum V8ValueReferenceType { Invalid(0, "Invalid"), Object(1, "Object"), @@ -38,24 +40,23 @@ public enum V8ValueReferenceType { Module(21, "Module"), DataView(30, "DataView"), ArrayBuffer(31, "ArrayBuffer"), - Int8Array(32, "Int8Array"), // -128 to 127 1 8-bit two's complement signed integer byte int8_t - Uint8Array(33, "Uint8Array"), // 0 to 255 1 8-bit unsigned integer octet uint8_t - Uint8ClampedArray(34, "Uint8ClampedArray"), // 0 to 255 1 8-bit unsigned integer (clamped) octet uint8_t - Int16Array(35, "Int16Array"), // -32768 to 32767 2 16-bit two's complement signed integer short int16_t - Uint16Array(36, "Uint16Array"), // 0 to 65535 2 16-bit unsigned integer unsigned short uint16_t - Int32Array(37, "Int32Array"), // -2147483648 to 2147483647 4 32-bit two's complement signed integer long int32_t - Uint32Array(38, "Uint32Array"), // 0 to 4294967295 4 32-bit unsigned integer unsigned long uint32_t - Float32Array(39, "Float32Array"), // 1.2×10^-38 to 3.4×10^38 4 32-bit IEEE floating point number (7 significant digits e.g., 1.234567) unrestricted float float - Float64Array(40, "Float64Array"), // 5.0×10^-324 to 1.8×10^308 8 64-bit IEEE floating point number (16 significant digits e.g., 1.23456789012345) unrestricted double double - BigInt64Array(41, "BigInt64Array"), // -2^63 to 2^63-1 8 64-bit two's complement signed integer bigint int64_t (signed long long) - BigUint64Array(42, "BigUint64Array"); // 0 to 2^64-1 8 64-bit unsigned integer bigint uint64_t (unsigned long long) + SharedArrayBuffer(32, "SharedArrayBuffer"), + Int8Array(33, "Int8Array"), // -128 to 127 1 8-bit two's complement signed integer byte int8_t + Uint8Array(34, "Uint8Array"), // 0 to 255 1 8-bit unsigned integer octet uint8_t + Uint8ClampedArray(35, "Uint8ClampedArray"), // 0 to 255 1 8-bit unsigned integer (clamped) octet uint8_t + Int16Array(36, "Int16Array"), // -32768 to 32767 2 16-bit two's complement signed integer short int16_t + Uint16Array(37, "Uint16Array"), // 0 to 65535 2 16-bit unsigned integer unsigned short uint16_t + Int32Array(38, "Int32Array"), // -2147483648 to 2147483647 4 32-bit two's complement signed integer long int32_t + Uint32Array(39, "Uint32Array"), // 0 to 4294967295 4 32-bit unsigned integer unsigned long uint32_t + Float32Array(40, "Float32Array"), // 1.2×10^-38 to 3.4×10^38 4 32-bit IEEE floating point number (7 significant digits e.g., 1.234567) unrestricted float float + Float64Array(41, "Float64Array"), // 5.0×10^-324 to 1.8×10^308 8 64-bit IEEE floating point number (16 significant digits e.g., 1.23456789012345) unrestricted double double + BigInt64Array(42, "BigInt64Array"), // -2^63 to 2^63-1 8 64-bit two's complement signed integer bigint int64_t (signed long long) + BigUint64Array(43, "BigUint64Array"); // 0 to 2^64-1 8 64-bit unsigned integer bigint uint64_t (unsigned long long) - private static final V8ValueReferenceType[] ALL_TYPES = new V8ValueReferenceType[43]; + private static final V8ValueReferenceType[] ALL_TYPES = new V8ValueReferenceType[44]; static { - for (V8ValueReferenceType type : values()) { - ALL_TYPES[type.getId()] = type; - } + Stream.of(values()).forEach(t -> ALL_TYPES[t.getId()] = t); } private final int id; diff --git a/src/main/java/com/caoccao/javet/enums/V8ValueSymbolType.java b/src/main/java/com/caoccao/javet/enums/V8ValueSymbolType.java new file mode 100644 index 000000000..c2fc61776 --- /dev/null +++ b/src/main/java/com/caoccao/javet/enums/V8ValueSymbolType.java @@ -0,0 +1,7 @@ +package com.caoccao.javet.enums; + +public enum V8ValueSymbolType { + None, + BuiltIn, + Custom, +} diff --git a/src/main/java/com/caoccao/javet/enums/package-info.java b/src/main/java/com/caoccao/javet/enums/package-info.java new file mode 100644 index 000000000..cdf1a1066 --- /dev/null +++ b/src/main/java/com/caoccao/javet/enums/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Enums for various API. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.enums; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/exceptions/JavetError.java b/src/main/java/com/caoccao/javet/exceptions/JavetError.java index 5eca06a36..4186ac891 100644 --- a/src/main/java/com/caoccao/javet/exceptions/JavetError.java +++ b/src/main/java/com/caoccao/javet/exceptions/JavetError.java @@ -44,6 +44,7 @@ public class JavetError { public static final String PARAMETER_OS = "OS"; public static final String PARAMETER_FEATURE = "feature"; + public static final String PARAMETER_SYMBOL = "symbol"; public static final String PARAMETER_COUNT = "count"; public static final String PARAMETER_CONTINUABLE = "continuable"; @@ -90,6 +91,8 @@ public class JavetError { 501, JavetErrorType.Converter, "Failed to convert values with error message ${message}"); public static final JavetError ConverterCircularStructure = new JavetError( 502, JavetErrorType.Converter, "Circular structure is detected with max depth ${maxDepth} reached"); + public static final JavetError ConverterSymbolNotBuiltIn = new JavetError( + 503, JavetErrorType.Converter, "${symbol} is not a built-in symbol"); public static final JavetError ModuleNameEmpty = new JavetError( 601, JavetErrorType.Module, "Module name is empty"); diff --git a/src/main/java/com/caoccao/javet/exceptions/package-info.java b/src/main/java/com/caoccao/javet/exceptions/package-info.java new file mode 100644 index 000000000..355cf89de --- /dev/null +++ b/src/main/java/com/caoccao/javet/exceptions/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Exceptions and errors for error handling. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.exceptions; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.java b/src/main/java/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.java index 33b61e406..b50431b89 100644 --- a/src/main/java/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.java +++ b/src/main/java/com/caoccao/javet/interception/logging/BaseJavetConsoleInterceptor.java @@ -205,12 +205,12 @@ public boolean register(IV8ValueObject... iV8ValueObjects) throws JavetException } /** - * Register. + * Register a JS function by name. * * @param iV8ValueObject the V8 value object - * @param jsFunctionName the js function name - * @param javaFunctionName the java function name - * @throws JavetException the javet exception + * @param jsFunctionName the JS function name + * @param javaFunctionName the Java function name + * @throws JavetException the Javet exception * @since 0.7.0 */ protected void register(IV8ValueObject iV8ValueObject, String jsFunctionName, String javaFunctionName) diff --git a/src/main/java/com/caoccao/javet/interception/logging/package-info.java b/src/main/java/com/caoccao/javet/interception/logging/package-info.java new file mode 100644 index 000000000..785bff276 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interception/logging/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Built-in interceptors for JS logging function console.log(), etc... + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interception.logging; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interception/package-info.java b/src/main/java/com/caoccao/javet/interception/package-info.java new file mode 100644 index 000000000..d18320118 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interception/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Built-in interceptors. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interception; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interfaces/IJavetInterceptor.java b/src/main/java/com/caoccao/javet/interfaces/IJavetInterceptor.java index fb182c203..a32d1127f 100644 --- a/src/main/java/com/caoccao/javet/interfaces/IJavetInterceptor.java +++ b/src/main/java/com/caoccao/javet/interfaces/IJavetInterceptor.java @@ -27,20 +27,20 @@ */ public interface IJavetInterceptor { /** - * Register boolean. + * Register the interceptor to the given V8 value object. * * @param iV8ValueObjects the V8 value objects - * @return the boolean + * @return true: success, false: failure * @throws JavetException the javet exception * @since 0.7.0 */ boolean register(IV8ValueObject... iV8ValueObjects) throws JavetException; /** - * Unregister boolean. + * Unregister the interceptor from the given V8 value object. * * @param iV8ValueObjects the V8 value objects - * @return the boolean + * @return true: success, false: failure * @throws JavetException the javet exception * @since 0.7.0 */ diff --git a/src/main/java/com/caoccao/javet/interfaces/IJavetSupplier.java b/src/main/java/com/caoccao/javet/interfaces/IJavetSupplier.java new file mode 100644 index 000000000..f9f6545e8 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interfaces/IJavetSupplier.java @@ -0,0 +1,25 @@ +/* + * Copyright 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.caoccao.javet.interfaces; + +import com.caoccao.javet.exceptions.JavetException; + +@FunctionalInterface +public interface IJavetSupplier { + T get() throws JavetException, E; +} diff --git a/src/main/java/com/caoccao/javet/interfaces/package-info.java b/src/main/java/com/caoccao/javet/interfaces/package-info.java new file mode 100644 index 000000000..8bf480ef7 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interfaces/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Interfaces required by various internal and external API. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interfaces; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interop/IV8Native.java b/src/main/java/com/caoccao/javet/interop/IV8Native.java index 6f51d47a4..d6ea15742 100644 --- a/src/main/java/com/caoccao/javet/interop/IV8Native.java +++ b/src/main/java/com/caoccao/javet/interop/IV8Native.java @@ -52,6 +52,8 @@ Object compile( boolean delete(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, Object key); + boolean deletePrivateProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, String key); + boolean equals(long v8RuntimeHandle, long v8ValueHandle1, long v8ValueHandle2); Object execute( @@ -77,6 +79,8 @@ Object execute( Object getOwnPropertyNames(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType); + Object getPrivateProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, String propertyName); + Object getProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, Object key); Object getPropertyNames(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType); @@ -93,6 +97,8 @@ Object execute( boolean hasOwnProperty(long v8RuntimeHandle, long v8ValueHandle, int type, Object key); + boolean hasPrivateProperty(long v8RuntimeHandle, long v8ValueHandle, int type, String propertyName); + void idleNotificationDeadline(long v8RuntimeHandle, long deadlineInMillis); Object invoke( @@ -181,6 +187,8 @@ boolean setAccessor( */ void setFlags(String flags); + boolean setPrivateProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, String key, Object value); + boolean setProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, Object key, Object value); boolean setPrototype(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, long v8ValueHandlePrototype); diff --git a/src/main/java/com/caoccao/javet/interop/JavetLibLoader.java b/src/main/java/com/caoccao/javet/interop/JavetLibLoader.java index 51a14f6fd..f4d48a1bb 100644 --- a/src/main/java/com/caoccao/javet/interop/JavetLibLoader.java +++ b/src/main/java/com/caoccao/javet/interop/JavetLibLoader.java @@ -33,7 +33,7 @@ import java.util.Objects; public final class JavetLibLoader { - static final String LIB_VERSION = "0.9.11"; + static final String LIB_VERSION = "0.9.12"; private static final int BUFFER_LENGTH = 4096; private static final String CHMOD = "chmod"; private static final String LIB_FILE_EXTENSION_LINUX = "so"; diff --git a/src/main/java/com/caoccao/javet/interop/V8Native.java b/src/main/java/com/caoccao/javet/interop/V8Native.java index 551ebbf62..e7ad609b2 100644 --- a/src/main/java/com/caoccao/javet/interop/V8Native.java +++ b/src/main/java/com/caoccao/javet/interop/V8Native.java @@ -23,9 +23,9 @@ *

    * Guidelines: * 1. Please keep V8Native as small, simple as possible so that the C++ implementation is minimized. - * 2. Please make sure V8Native doesn't not reference any other types so that JNI code generation is quick and clean. + * 2. Please make sure V8Native does not reference any other types so that JNI code generation is quick and clean. * 3. Please keep the methods in ascending order so that the generated .h file keeps the same order. - * 4. Please don't not inject any other non-public native code. + * 4. Please do not inject any other non-public native code. */ class V8Native implements IV8Native { V8Native() { @@ -80,6 +80,9 @@ public native Object compile( @Override public native boolean delete(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, Object key); + @Override + public native boolean deletePrivateProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, String key); + @Override public native boolean equals(long v8RuntimeHandle, long v8ValueHandle1, long v8ValueHandle2); @@ -116,6 +119,10 @@ public native Object execute( @Override public native Object getOwnPropertyNames(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType); + @Override + public native Object getPrivateProperty( + long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, String propertyName); + @Override public native Object getProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, Object key); @@ -140,6 +147,9 @@ public native Object execute( @Override public native boolean hasOwnProperty(long v8RuntimeHandle, long v8ValueHandle, int type, Object key); + @Override + public native boolean hasPrivateProperty(long v8RuntimeHandle, long v8ValueHandle, int type, String propertyName); + @Override public native void idleNotificationDeadline(long v8RuntimeHandle, long deadlineInMillis); @@ -264,6 +274,10 @@ public native boolean setAccessor( @Override public native void setFlags(String flags); + @Override + public native boolean setPrivateProperty( + long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, String key, Object value); + @Override public native boolean setProperty(long v8RuntimeHandle, long v8ValueHandle, int v8ValueType, Object key, Object value); diff --git a/src/main/java/com/caoccao/javet/interop/V8Runtime.java b/src/main/java/com/caoccao/javet/interop/V8Runtime.java index c1de0bc4c..0b518ad2e 100644 --- a/src/main/java/com/caoccao/javet/interop/V8Runtime.java +++ b/src/main/java/com/caoccao/javet/interop/V8Runtime.java @@ -17,6 +17,7 @@ package com.caoccao.javet.interop; +import com.caoccao.javet.annotations.CheckReturnValue; import com.caoccao.javet.enums.*; import com.caoccao.javet.exceptions.JavetError; import com.caoccao.javet.exceptions.JavetException; @@ -45,7 +46,9 @@ import java.text.MessageFormat; import java.time.ZonedDateTime; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.IntStream; @SuppressWarnings("unchecked") @@ -64,6 +67,7 @@ public class V8Runtime implements IJavetClosable, IV8Creatable, IV8Convertible { protected V8ValueLong[] cachedV8ValueLongs; protected V8ValueNull cachedV8ValueNull; protected V8ValueUndefined cachedV8ValueUndefined; + protected ReadWriteLock callbackContextLock; /** * The Callback context map. *

    @@ -81,9 +85,11 @@ public class V8Runtime implements IJavetClosable, IV8Creatable, IV8Convertible { protected IJavetLogger logger; protected boolean pooled; protected IJavetPromiseRejectCallback promiseRejectCallback; + protected ReadWriteLock referenceLock; protected Map referenceMap; protected V8Host v8Host; protected V8Inspector v8Inspector; + protected ReadWriteLock v8ModuleLock; protected Map v8ModuleMap; protected IV8ModuleResolver v8ModuleResolver; protected IV8Native v8Native; @@ -91,20 +97,23 @@ public class V8Runtime implements IJavetClosable, IV8Creatable, IV8Convertible { V8Runtime(V8Host v8Host, long handle, boolean pooled, IV8Native v8Native, String globalName) { assert handle != 0; bindingContextWeakHashMap = Collections.synchronizedMap(new WeakHashMap<>()); - callbackContextMap = new ConcurrentHashMap<>(); + callbackContextLock = new ReentrantReadWriteLock(); + callbackContextMap = new HashMap<>(); converter = DEFAULT_CONVERTER; gcScheduled = false; this.globalName = globalName; this.handle = handle; logger = new JavetDefaultLogger(getClass().getName()); - v8ModuleMap = Collections.synchronizedMap(new HashMap<>()); this.pooled = pooled; promiseRejectCallback = new JavetPromiseRejectCallback(logger); - referenceMap = new ConcurrentHashMap<>(); + referenceLock = new ReentrantReadWriteLock(); + referenceMap = new HashMap<>(); this.v8Host = v8Host; + v8Inspector = null; this.v8Native = v8Native; + v8ModuleLock = new ReentrantReadWriteLock(); + v8ModuleMap = new HashMap<>(); v8ModuleResolver = null; - v8Inspector = null; initializeV8ValueCache(); } @@ -114,11 +123,23 @@ public void add(IV8ValueSet iV8ValueKeySet, V8Value value) throws JavetException } public void addReference(IV8ValueReference iV8ValueReference) { - referenceMap.put(iV8ValueReference.getHandle(), iV8ValueReference); + Lock readLock = referenceLock.readLock(); + try { + readLock.lock(); + referenceMap.put(iV8ValueReference.getHandle(), iV8ValueReference); + } finally { + readLock.unlock(); + } } public void addV8Module(IV8Module iV8Module) { - v8ModuleMap.put(iV8Module.getResourceName(), iV8Module); + Lock readLock = v8ModuleLock.readLock(); + try { + readLock.lock(); + v8ModuleMap.put(iV8Module.getResourceName(), iV8Module); + } finally { + readLock.unlock(); + } } public void allowEval(boolean allow) { @@ -129,6 +150,7 @@ public void await() { v8Native.await(handle); } + @CheckReturnValue public T call( IV8ValueObject iV8ValueObject, IV8ValueObject receiver, boolean returnResult, V8Value... v8Values) throws JavetException { @@ -137,6 +159,7 @@ public T call( handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), receiver, returnResult, v8Values)); } + @CheckReturnValue public T callAsConstructor( IV8ValueObject iV8ValueObject, V8Value... v8Values) throws JavetException { decorateV8Values(v8Values); @@ -149,6 +172,7 @@ public void clearWeak(IV8ValueReference iV8ValueReference) throws JavetException v8Native.clearWeak(handle, iV8ValueReference.getHandle(), iV8ValueReference.getType().getId()); } + @CheckReturnValue public T cloneV8Value(IV8ValueReference iV8ValueReference) throws JavetException { return decorateV8Value((T) v8Native.cloneV8Value( handle, iV8ValueReference.getHandle(), iV8ValueReference.getType().getId())); @@ -168,6 +192,7 @@ public void close(boolean forceClose) throws JavetException { } } + @CheckReturnValue public V8Script compileScript(String scriptString, V8ScriptOrigin v8ScriptOrigin, boolean resultRequired) throws JavetException { v8ScriptOrigin.setModule(false); @@ -177,6 +202,7 @@ public V8Script compileScript(String scriptString, V8ScriptOrigin v8ScriptOrigin v8ScriptOrigin.getScriptId(), v8ScriptOrigin.isWasm(), v8ScriptOrigin.isModule())); } + @CheckReturnValue public V8Module compileV8Module(String scriptString, V8ScriptOrigin v8ScriptOrigin, boolean resultRequired) throws JavetException { v8ScriptOrigin.setModule(true); @@ -197,16 +223,24 @@ public V8Module compileV8Module(String scriptString, V8ScriptOrigin v8ScriptOrig } public boolean containsV8Module(String resourceName) { - return v8ModuleMap.containsKey(resourceName); + Lock readLock = v8ModuleLock.readLock(); + try { + readLock.lock(); + return v8ModuleMap.containsKey(resourceName); + } finally { + readLock.unlock(); + } } @Override + @CheckReturnValue public V8ValueArray createV8ValueArray() throws JavetException { return decorateV8Value((V8ValueArray) v8Native.createV8Value( handle, V8ValueReferenceType.Array.getId(), null)); } @Override + @CheckReturnValue public V8ValueArrayBuffer createV8ValueArrayBuffer(int length) throws JavetException { return decorateV8Value((V8ValueArrayBuffer) v8Native.createV8Value( handle, V8ValueReferenceType.ArrayBuffer.getId(), createV8ValueInteger(length))); @@ -221,6 +255,7 @@ public V8ValueBoolean createV8ValueBoolean(boolean booleanValue) throws JavetExc } @Override + @CheckReturnValue public V8ValueDataView createV8ValueDataView(V8ValueArrayBuffer v8ValueArrayBuffer) throws JavetException { Objects.requireNonNull(v8ValueArrayBuffer); try (V8ValueFunction v8ValueFunction = getGlobalObject().get(PROPERTY_DATA_VIEW)) { @@ -234,15 +269,23 @@ public V8ValueDouble createV8ValueDouble(double doubleValue) throws JavetExcepti } @Override + @CheckReturnValue public V8ValueFunction createV8ValueFunction(JavetCallbackContext javetCallbackContext) throws JavetException { Objects.requireNonNull(javetCallbackContext); V8ValueFunction v8ValueFunction = decorateV8Value((V8ValueFunction) v8Native.createV8Value( handle, V8ValueReferenceType.Function.getId(), javetCallbackContext)); - callbackContextMap.put(javetCallbackContext.getHandle(), javetCallbackContext); + Lock writeLock = callbackContextLock.writeLock(); + try { + writeLock.lock(); + callbackContextMap.put(javetCallbackContext.getHandle(), javetCallbackContext); + } finally { + writeLock.unlock(); + } return v8ValueFunction; } @Override + @CheckReturnValue public V8ValueFunction createV8ValueFunction(String codeString) throws JavetException { return getExecutor(codeString).execute(); } @@ -256,6 +299,7 @@ public V8ValueInteger createV8ValueInteger(int integerValue) throws JavetExcepti } @Override + @CheckReturnValue public V8ValueLong createV8ValueLong(long longValue) throws JavetException { if (longValue >= V8_VALUE_NUMBER_LOWER_BOUND && longValue < V8_VALUE_NUMBER_UPPER_BOUND) { return cachedV8ValueLongs[(int) longValue - V8_VALUE_NUMBER_LOWER_BOUND]; @@ -264,6 +308,7 @@ public V8ValueLong createV8ValueLong(long longValue) throws JavetException { } @Override + @CheckReturnValue public V8ValueMap createV8ValueMap() throws JavetException { return decorateV8Value((V8ValueMap) v8Native.createV8Value( handle, V8ValueReferenceType.Map.getId(), null)); @@ -275,24 +320,28 @@ public V8ValueNull createV8ValueNull() { } @Override + @CheckReturnValue public V8ValueObject createV8ValueObject() throws JavetException { return decorateV8Value((V8ValueObject) v8Native.createV8Value( handle, V8ValueReferenceType.Object.getId(), null)); } @Override + @CheckReturnValue public V8ValuePromise createV8ValuePromise() throws JavetException { return decorateV8Value((V8ValuePromise) v8Native.createV8Value( handle, V8ValueReferenceType.Promise.getId(), null)); } @Override + @CheckReturnValue public V8ValueProxy createV8ValueProxy(V8ValueObject v8ValueObject) throws JavetException { return decorateV8Value((V8ValueProxy) v8Native.createV8Value( handle, V8ValueReferenceType.Proxy.getId(), v8ValueObject)); } @Override + @CheckReturnValue public V8ValueSet createV8ValueSet() throws JavetException { return decorateV8Value((V8ValueSet) v8Native.createV8Value( handle, V8ValueReferenceType.Set.getId(), null)); @@ -304,6 +353,7 @@ public V8ValueString createV8ValueString(String str) throws JavetException { } @Override + @CheckReturnValue public V8ValueSymbol createV8ValueSymbol(String description, boolean global) throws JavetException { Objects.requireNonNull(description); assert description.length() > 0; @@ -318,6 +368,7 @@ public V8ValueSymbol createV8ValueSymbol(String description, boolean global) thr } @Override + @CheckReturnValue public V8ValueTypedArray createV8ValueTypedArray(V8ValueReferenceType type, int length) throws JavetException { try (V8ValueFunction v8ValueFunction = getGlobalObject().get(type.getName())) { return v8ValueFunction.callAsConstructor(length); @@ -339,6 +390,7 @@ public V8ValueZonedDateTime createV8ValueZonedDateTime(ZonedDateTime zonedDateTi return decorateV8Value(new V8ValueZonedDateTime(zonedDateTime)); } + @CheckReturnValue public T decorateV8Value(T v8Value) throws JavetException { if (v8Value != null) { if (v8Value.getV8Runtime() == null) { @@ -366,11 +418,17 @@ public boolean delete(IV8ValueObject iV8ValueObject, V8Value key) throws JavetEx return v8Native.delete(handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), key); } + public boolean deletePrivateProperty(IV8ValueObject iV8ValueObject, String propertyName) throws JavetException { + return v8Native.deletePrivateProperty( + handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), propertyName); + } + public boolean equals(IV8ValueReference iV8ValueReference1, IV8ValueReference iV8ValueReference2) throws JavetException { return v8Native.equals(handle, iV8ValueReference1.getHandle(), iV8ValueReference2.getHandle()); } + @CheckReturnValue public T execute( String scriptString, V8ScriptOrigin v8ScriptOrigin, boolean resultRequired) throws JavetException { return decorateV8Value((T) v8Native.execute( @@ -379,6 +437,7 @@ public T execute( v8ScriptOrigin.getScriptId(), v8ScriptOrigin.isWasm(), v8ScriptOrigin.isModule())); } + @CheckReturnValue public T get( IV8ValueObject iV8ValueObject, V8Value key) throws JavetException { return decorateV8Value((T) v8Native.get( @@ -390,11 +449,23 @@ public Map, BindingContext> getBindingContextWeakHashMap() { } public JavetCallbackContext getCallbackContext(long handle) { - return callbackContextMap.get(handle); + Lock readLock = callbackContextLock.readLock(); + try { + readLock.lock(); + return callbackContextMap.get(handle); + } finally { + readLock.unlock(); + } } public int getCallbackContextCount() { - return callbackContextMap.size(); + Lock readLock = callbackContextLock.readLock(); + try { + readLock.lock(); + return callbackContextMap.size(); + } finally { + readLock.unlock(); + } } public IJavetConverter getConverter() { @@ -430,6 +501,7 @@ public int getIdentityHash(IV8ValueReference iV8ValueReference) throws JavetExce return v8Native.getIdentityHash(handle, iV8ValueReference.getHandle(), iV8ValueReference.getType().getId()); } + @CheckReturnValue public IV8ValueArray getInternalProperties(IV8ValueFunction iV8ValueFunction) throws JavetException { return decorateV8Value((V8ValueArray) v8Native.getInternalProperties( handle, iV8ValueFunction.getHandle(), iV8ValueFunction.getType().getId())); @@ -461,16 +533,25 @@ public IJavetLogger getLogger() { return logger; } + @CheckReturnValue public IV8ValueArray getOwnPropertyNames( IV8ValueObject iV8ValueObject) throws JavetException { return decorateV8Value((V8ValueArray) v8Native.getOwnPropertyNames( handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId())); } + @CheckReturnValue + public T getPrivateProperty(IV8ValueObject iV8ValueObject, String propertyName) + throws JavetException { + return decorateV8Value((T) v8Native.getPrivateProperty( + handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), propertyName)); + } + public IJavetPromiseRejectCallback getPromiseRejectCallback() { return promiseRejectCallback; } + @CheckReturnValue public T getProperty( IV8ValueObject iV8ValueObject, V8Value key) throws JavetException { decorateV8Value(key); @@ -478,19 +559,27 @@ public T getProperty( handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), key)); } + @CheckReturnValue public IV8ValueArray getPropertyNames( IV8ValueObject iV8ValueObject) throws JavetException { return decorateV8Value((V8ValueArray) v8Native.getPropertyNames( handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId())); } + @CheckReturnValue public T getPrototype(IV8ValueObject iV8ValueObject) throws JavetException { return decorateV8Value((T) v8Native.getPrototype( handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId())); } public int getReferenceCount() { - return referenceMap.size(); + Lock readLock = referenceLock.readLock(); + try { + readLock.lock(); + return referenceMap.size(); + } finally { + readLock.unlock(); + } } public int getSize(IV8ValueKeyContainer iV8ValueKeyContainer) throws JavetException { @@ -513,22 +602,39 @@ public V8Inspector getV8Inspector(String name) { return v8Inspector; } + @CheckReturnValue public V8Locker getV8Locker() throws JavetException { return new V8Locker(this, v8Native); } + @CheckReturnValue public IV8Module getV8Module(String resourceName, IV8Module v8ModuleReferrer) throws JavetException { - decorateV8Value(v8ModuleReferrer); - if (containsV8Module(resourceName)) { - return v8ModuleMap.get(resourceName); - } else if (v8ModuleResolver != null) { - return v8ModuleResolver.resolve(this, resourceName, v8ModuleReferrer); + if (resourceName != null && resourceName.length() > 0) { + decorateV8Value(v8ModuleReferrer); + Lock readLock = v8ModuleLock.readLock(); + try { + readLock.lock(); + if (v8ModuleMap.containsKey(resourceName)) { + return v8ModuleMap.get(resourceName); + } + } finally { + readLock.unlock(); + } + if (v8ModuleResolver != null) { + return v8ModuleResolver.resolve(this, resourceName, v8ModuleReferrer); + } } return null; } public int getV8ModuleCount() { - return v8ModuleMap.size(); + Lock readLock = v8ModuleLock.readLock(); + try { + readLock.lock(); + return v8ModuleMap.size(); + } finally { + readLock.unlock(); + } } public IV8ModuleResolver getV8ModuleResolver() { @@ -549,6 +655,11 @@ public boolean hasOwnProperty(IV8ValueObject iV8ValueObject, V8Value key) throws return v8Native.hasOwnProperty(handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), key); } + public boolean hasPrivateProperty(IV8ValueObject iV8ValueObject, String propertyName) throws JavetException { + return v8Native.hasPrivateProperty( + handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), propertyName); + } + /** * Idle notification deadline. *

    @@ -584,6 +695,7 @@ protected void initializeV8ValueCache() { } } + @CheckReturnValue public T invoke( IV8ValueObject iV8ValueObject, String functionName, boolean returnResult, V8Value... v8Values) throws JavetException { @@ -626,16 +738,20 @@ public void lowMemoryNotification() { } } + @CheckReturnValue public T moduleEvaluate( IV8Module iV8Module, boolean resultRequired) throws JavetException { return decorateV8Value((T) v8Native.moduleEvaluate( handle, iV8Module.getHandle(), iV8Module.getType().getId(), resultRequired)); } + @CheckReturnValue public V8ValueError moduleGetException(IV8Module iV8Module) throws JavetException { - return decorateV8Value((V8ValueError) v8Native.moduleGetException(handle, iV8Module.getHandle(), iV8Module.getType().getId())); + return decorateV8Value((V8ValueError) v8Native.moduleGetException( + handle, iV8Module.getHandle(), iV8Module.getType().getId())); } + @CheckReturnValue public V8ValueObject moduleGetNamespace(IV8Module iV8Module) throws JavetException { return decorateV8Value((V8ValueObject) v8Native.moduleGetNamespace( handle, iV8Module.getHandle(), iV8Module.getType().getId())); @@ -656,17 +772,20 @@ public boolean moduleInstantiate(IV8Module iV8Module) throws JavetException { return v8Native.moduleInstantiate(handle, iV8Module.getHandle(), iV8Module.getType().getId()); } + @CheckReturnValue public T promiseCatch( IV8ValuePromise iV8ValuePromise, IV8ValueFunction functionHandle) throws JavetException { return decorateV8Value((T) v8Native.promiseCatch( handle, iV8ValuePromise.getHandle(), iV8ValuePromise.getType().getId(), functionHandle.getHandle())); } + @CheckReturnValue public V8ValuePromise promiseGetPromise(V8ValuePromise v8ValuePromise) throws JavetException { return decorateV8Value((V8ValuePromise) v8Native.promiseGetPromise( handle, v8ValuePromise.getHandle(), v8ValuePromise.getType().getId())); } + @CheckReturnValue public T promiseGetResult(IV8ValuePromise iV8ValuePromise) throws JavetException { return decorateV8Value((T) v8Native.promiseGetResult( handle, iV8ValuePromise.getHandle(), iV8ValuePromise.getType().getId())); @@ -694,6 +813,7 @@ public boolean promiseResolve(V8ValuePromise v8ValuePromise, V8Value v8Value) { handle, v8ValuePromise.getHandle(), v8ValuePromise.getType().getId(), v8Value); } + @CheckReturnValue public T promiseThen( IV8ValuePromise iV8ValuePromise, IV8ValueFunction functionFulfilledHandle, IV8ValueFunction functionRejectedHandle) throws JavetException { @@ -703,11 +823,13 @@ public T promiseThen( functionRejectedHandle == null ? 0L : functionRejectedHandle.getHandle())); } + @CheckReturnValue public V8ValueObject proxyGetHandler(IV8ValueProxy iV8ValueProxy) throws JavetException { return decorateV8Value((V8ValueObject) v8Native.proxyGetHandler( handle, iV8ValueProxy.getHandle(), iV8ValueProxy.getType().getId())); } + @CheckReturnValue public V8ValueObject proxyGetTarget(IV8ValueProxy iV8ValueProxy) throws JavetException { return decorateV8Value((V8ValueObject) v8Native.proxyGetTarget( handle, iV8ValueProxy.getHandle(), iV8ValueProxy.getType().getId())); @@ -740,18 +862,30 @@ protected void removeAllReferences() throws JavetException { } public void removeCallbackContext(long handle) { - callbackContextMap.remove(handle); + Lock writeLock = callbackContextLock.writeLock(); + try { + writeLock.lock(); + callbackContextMap.remove(handle); + } finally { + writeLock.unlock(); + } } protected void removeCallbackContexts() { - if (!callbackContextMap.isEmpty()) { - final int callbackContextCount = callbackContextMap.size(); - for (long handle : callbackContextMap.keySet()) { - removeJNIGlobalRef(handle); + Lock writeLock = callbackContextLock.writeLock(); + try { + writeLock.lock(); + if (!callbackContextMap.isEmpty()) { + final int callbackContextCount = callbackContextMap.size(); + for (long handle : callbackContextMap.keySet()) { + removeJNIGlobalRef(handle); + } + logger.logWarn("{0} V8 callback context object(s) not recycled.", + Integer.toString(callbackContextCount)); + callbackContextMap.clear(); } - logger.logWarn("{0} V8 callback context object(s) not recycled.", - Integer.toString(callbackContextCount)); - callbackContextMap.clear(); + } finally { + writeLock.unlock(); } } @@ -764,7 +898,9 @@ public void removeJNIGlobalRef(long handle) { @SuppressWarnings("RedundantThrows") public void removeReference(IV8ValueReference iV8ValueReference) throws JavetException { final long referenceHandle = iV8ValueReference.getHandle(); - synchronized (referenceMap) { + Lock writeLock = referenceLock.writeLock(); + try { + writeLock.lock(); if (referenceMap.containsKey(referenceHandle)) { final int referenceType = iV8ValueReference.getType().getId(); if (referenceType == V8ValueReferenceType.Module.getId()) { @@ -773,6 +909,8 @@ public void removeReference(IV8ValueReference iV8ValueReference) throws JavetExc v8Native.removeReferenceHandle(referenceHandle, referenceType); referenceMap.remove(referenceHandle); } + } finally { + writeLock.unlock(); } if (gcScheduled) { lowMemoryNotification(); @@ -781,36 +919,49 @@ public void removeReference(IV8ValueReference iV8ValueReference) throws JavetExc } protected void removeReferences() throws JavetException { - if (!referenceMap.isEmpty()) { - final int referenceCount = getReferenceCount(); - final int v8ModuleCount = getV8ModuleCount(); - int weakReferenceCount = 0; - for (IV8ValueReference iV8ValueReference : new ArrayList<>(referenceMap.values())) { - if (iV8ValueReference instanceof IV8ValueObject) { - IV8ValueObject iV8ValueObject = (IV8ValueObject) iV8ValueReference; - if (iV8ValueObject.isWeak()) { - ++weakReferenceCount; + Lock writeLock = referenceLock.writeLock(); + try { + writeLock.lock(); + if (!referenceMap.isEmpty()) { + final int referenceCount = getReferenceCount(); + final int v8ModuleCount = getV8ModuleCount(); + int weakReferenceCount = 0; + for (IV8ValueReference iV8ValueReference : new ArrayList<>(referenceMap.values())) { + if (iV8ValueReference instanceof IV8ValueObject) { + IV8ValueObject iV8ValueObject = (IV8ValueObject) iV8ValueReference; + if (iV8ValueObject.isWeak()) { + ++weakReferenceCount; + } } + iV8ValueReference.close(true); } - iV8ValueReference.close(true); - } - if (v8ModuleCount + weakReferenceCount < referenceCount) { - logger.logWarn("{0} V8 object(s) not recycled, {1} weak, {2} module(s).", - Integer.toString(referenceCount), - Integer.toString(weakReferenceCount), - Integer.toString(v8ModuleCount)); - } else { - logger.logDebug("{0} V8 object(s) not recycled, {1} weak, {2} module(s).", - Integer.toString(referenceCount), - Integer.toString(weakReferenceCount), - Integer.toString(v8ModuleCount)); + if (v8ModuleCount + weakReferenceCount < referenceCount) { + logger.logWarn("{0} V8 object(s) not recycled, {1} weak, {2} module(s).", + Integer.toString(referenceCount), + Integer.toString(weakReferenceCount), + Integer.toString(v8ModuleCount)); + } else { + logger.logDebug("{0} V8 object(s) not recycled, {1} weak, {2} module(s).", + Integer.toString(referenceCount), + Integer.toString(weakReferenceCount), + Integer.toString(v8ModuleCount)); + } + referenceMap.clear(); } - referenceMap.clear(); + } finally { + writeLock.unlock(); } } public void removeV8Module(String resourceName, boolean forceClose) throws JavetException { - IV8Module iV8Module = v8ModuleMap.remove(resourceName); + IV8Module iV8Module; + Lock writeLock = v8ModuleLock.writeLock(); + try { + writeLock.lock(); + iV8Module = v8ModuleMap.remove(resourceName); + } finally { + writeLock.unlock(); + } if (forceClose && iV8Module != null) { iV8Module.close(true); } @@ -833,15 +984,21 @@ public void removeV8Modules() throws JavetException { } public void removeV8Modules(boolean forceClose) throws JavetException { - if (!v8ModuleMap.isEmpty()) { - logger.logWarn("{0} V8 module(s) not recycled.", Integer.toString(v8ModuleMap.size())); - for (IV8Module iV8Module : v8ModuleMap.values()) { - logger.logWarn(" V8 module: {0}", iV8Module.getResourceName()); - if (forceClose) { - iV8Module.close(true); + Lock writeLock = v8ModuleLock.writeLock(); + try { + writeLock.lock(); + if (!v8ModuleMap.isEmpty()) { + logger.logWarn("{0} V8 module(s) not recycled.", Integer.toString(v8ModuleMap.size())); + for (IV8Module iV8Module : v8ModuleMap.values()) { + logger.logWarn(" V8 module: {0}", iV8Module.getResourceName()); + if (forceClose) { + iV8Module.close(true); + } } + v8ModuleMap.clear(); } - v8ModuleMap.clear(); + } finally { + writeLock.unlock(); } } @@ -888,6 +1045,7 @@ public boolean sameValue(IV8ValueObject iV8ValueObject1, IV8ValueObject iV8Value return v8Native.sameValue(handle, iV8ValueObject1.getHandle(), iV8ValueObject2.getHandle()); } + @CheckReturnValue public T scriptRun( IV8Script iV8Script, boolean resultRequired) throws JavetException { return decorateV8Value((T) v8Native.scriptRun( @@ -908,11 +1066,17 @@ public boolean setAccessor( assert (propertyName instanceof V8ValueString || propertyName instanceof V8ValueSymbol); boolean isAccessorSet = v8Native.setAccessor(handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), propertyName, javetCallbackContextGetter, javetCallbackContextSetter); - if (javetCallbackContextGetter != null && javetCallbackContextGetter.isValid()) { - callbackContextMap.put(javetCallbackContextGetter.getHandle(), javetCallbackContextGetter); - } - if (javetCallbackContextSetter != null && javetCallbackContextSetter.isValid()) { - callbackContextMap.put(javetCallbackContextSetter.getHandle(), javetCallbackContextSetter); + Lock writeLock = callbackContextLock.writeLock(); + try { + writeLock.lock(); + if (javetCallbackContextGetter != null && javetCallbackContextGetter.isValid()) { + callbackContextMap.put(javetCallbackContextGetter.getHandle(), javetCallbackContextGetter); + } + if (javetCallbackContextSetter != null && javetCallbackContextSetter.isValid()) { + callbackContextMap.put(javetCallbackContextSetter.getHandle(), javetCallbackContextSetter); + } + } finally { + writeLock.unlock(); } return isAccessorSet; } @@ -934,6 +1098,13 @@ public void setLogger(IJavetLogger logger) { this.logger = logger; } + public boolean setPrivateProperty(IV8ValueObject iV8ValueObject, String propertyName, V8Value propertyValue) + throws JavetException { + decorateV8Value(propertyValue); + return v8Native.setPrivateProperty( + handle, iV8ValueObject.getHandle(), iV8ValueObject.getType().getId(), propertyName, propertyValue); + } + public void setPromiseRejectCallback(IJavetPromiseRejectCallback promiseRejectCallback) { Objects.requireNonNull(promiseRejectCallback); this.promiseRejectCallback = promiseRejectCallback; @@ -996,6 +1167,7 @@ public String toString(IV8ValueReference iV8ValueReference) throws JavetExceptio } @Override + @CheckReturnValue public V toV8Value(T object) throws JavetException { return converter.toV8Value(this, object); } diff --git a/src/main/java/com/caoccao/javet/interop/binding/MethodDescriptor.java b/src/main/java/com/caoccao/javet/interop/binding/MethodDescriptor.java index 4ad9ec6af..f4a20f91b 100644 --- a/src/main/java/com/caoccao/javet/interop/binding/MethodDescriptor.java +++ b/src/main/java/com/caoccao/javet/interop/binding/MethodDescriptor.java @@ -17,6 +17,8 @@ package com.caoccao.javet.interop.binding; +import com.caoccao.javet.enums.V8ValueSymbolType; + import java.lang.reflect.Method; /** @@ -32,11 +34,11 @@ public class MethodDescriptor { */ protected Method method; /** - * The Symbol. + * The Symbol type. * * @since 0.9.11 */ - protected boolean symbol; + protected V8ValueSymbolType symbolType; /** * The This object required. * @@ -52,7 +54,7 @@ public class MethodDescriptor { * @since 0.9.2 */ public MethodDescriptor(Method method, boolean thisObjectRequired) { - this(method, thisObjectRequired, false); + this(method, thisObjectRequired, V8ValueSymbolType.None); } /** @@ -60,12 +62,12 @@ public MethodDescriptor(Method method, boolean thisObjectRequired) { * * @param method the method * @param thisObjectRequired the this object required - * @param symbol the symbol + * @param symbolType the symbol type * @since 0.9.11 */ - public MethodDescriptor(Method method, boolean thisObjectRequired, boolean symbol) { + public MethodDescriptor(Method method, boolean thisObjectRequired, V8ValueSymbolType symbolType) { this.method = method; - this.symbol = symbol; + this.symbolType = symbolType; this.thisObjectRequired = thisObjectRequired; } @@ -80,13 +82,13 @@ public Method getMethod() { } /** - * Is symbol. + * Gets symbol type. * - * @return the boolean + * @return the symbol type * @since 0.9.11 */ - public boolean isSymbol() { - return symbol; + public V8ValueSymbolType getSymbolType() { + return symbolType; } /** diff --git a/src/main/java/com/caoccao/javet/interop/binding/package-info.java b/src/main/java/com/caoccao/javet/interop/binding/package-info.java new file mode 100644 index 000000000..1ba16e812 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interop/binding/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Callback data structure for binding context and method descriptor. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interop.binding; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interop/callback/package-info.java b/src/main/java/com/caoccao/javet/interop/callback/package-info.java new file mode 100644 index 000000000..a1dc2fef3 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interop/callback/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Callback bridge between JVM and C++ via JNI. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interop.callback; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interop/converters/JavetObjectConverter.java b/src/main/java/com/caoccao/javet/interop/converters/JavetObjectConverter.java index 337c13834..c057f78d4 100644 --- a/src/main/java/com/caoccao/javet/interop/converters/JavetObjectConverter.java +++ b/src/main/java/com/caoccao/javet/interop/converters/JavetObjectConverter.java @@ -32,7 +32,13 @@ import com.caoccao.javet.values.V8Value; import com.caoccao.javet.values.reference.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * The type Javet object converter. @@ -43,24 +49,71 @@ public class JavetObjectConverter extends JavetPrimitiveConverter { /** - * The constant PROPERTY_CONSTRUCTOR. + * The constant EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR. * - * @since 0.7.2 + * @since 0.9.12 + */ + protected static final int EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR = 0; + /** + * The constant EXECUTABLE_INDEX_FROM_MAP. + * + * @since 0.9.12 + */ + protected static final int EXECUTABLE_INDEX_FROM_MAP = 1; + /** + * The constant EXECUTABLE_INDEX_TO_MAP. + * + * @since 0.9.12 + */ + protected static final int EXECUTABLE_INDEX_TO_MAP = 2; + /** + * The constant METHOD_NAME_FROM_MAP. + * + * @since 0.9.12 + */ + protected static final String METHOD_NAME_FROM_MAP = "fromMap"; + /** + * The constant METHOD_NAME_TO_MAP. + * + * @since 0.9.12 + */ + protected static final String METHOD_NAME_TO_MAP = "toMap"; + /** + * The constant PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME. + * + * @since 0.9.6 + */ + protected static final String PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME = "JavetObjectConverter#customObjectClassName"; + /** + * The constant PRIVATE_PROPERTY_PROXY_TARGET. + * + * @since 0.9.6 */ - protected static final String PROPERTY_CONSTRUCTOR = "constructor"; + protected static final String PRIVATE_PROPERTY_PROXY_TARGET = "Javet#proxyTarget"; /** * The constant PROPERTY_NAME. * * @since 0.7.2 */ protected static final String PROPERTY_NAME = "name"; - /** - * The constant PROXY_TARGET. + * The constant PUBLIC_PROPERTY_CONSTRUCTOR. * - * @since 0.9.6 + * @since 0.7.2 */ - protected static final String PROXY_TARGET = "target"; + protected static final String PUBLIC_PROPERTY_CONSTRUCTOR = "constructor"; + /** + * The Custom object lock. + * + * @since 0.9.12 + */ + protected ReentrantReadWriteLock customObjectLock; + /** + * The Custom object map. + * + * @since 0.9.12 + */ + protected Map customObjectMap; /** * Instantiates a new Javet object converter. @@ -69,6 +122,8 @@ public class JavetObjectConverter extends JavetPrimitiveConverter { */ public JavetObjectConverter() { super(); + customObjectLock = new ReentrantReadWriteLock(); + customObjectMap = new HashMap<>(); } /** @@ -91,6 +146,66 @@ protected Map createEntityMap() { return new JavetEntityMap(); } + /** + * Register custom object. + * + * @param customObjectClass the custom object class + * @return true : success, false: failure + * @since 0.9.12 + */ + public boolean registerCustomObject(Class customObjectClass) { + return registerCustomObject(customObjectClass, METHOD_NAME_FROM_MAP, METHOD_NAME_TO_MAP); + } + + /** + * Register custom object. + * + * @param customObjectClass the custom object class + * @param methodNameFromMap the method name from map + * @param methodNameToMap the method name to map + * @return true : success, false: failure + * @since 0.9.12 + */ + public boolean registerCustomObject(Class customObjectClass, String methodNameFromMap, String methodNameToMap) { + if (customObjectClass == null + || methodNameFromMap == null || methodNameToMap == null + || methodNameFromMap.length() == 0 || methodNameToMap.length() == 0 + || methodNameFromMap.equals(methodNameToMap)) { + return false; + } + Lock readLock = customObjectLock.readLock(); + try { + readLock.lock(); + if (customObjectMap.containsKey(customObjectClass)) { + return false; + } + } finally { + readLock.unlock(); + } + try { + Constructor defaultConstructor = customObjectClass.getConstructor(); + Method methodFromMap = customObjectClass.getMethod(methodNameFromMap, Map.class); + if (Modifier.isStatic(methodFromMap.getModifiers())) { + return false; + } + Method methodToMap = customObjectClass.getMethod(methodNameToMap); + if (Modifier.isStatic(methodToMap.getModifiers())) { + return false; + } + Executable[] executables = new Executable[]{defaultConstructor, methodFromMap, methodToMap}; + Lock writeLock = customObjectLock.writeLock(); + try { + writeLock.lock(); + customObjectMap.put(customObjectClass.getName(), executables); + } finally { + writeLock.unlock(); + } + } catch (Throwable t) { + // Do nothing. + } + return false; + } + @Override protected Object toObject(V8Value v8Value, final int depth) throws JavetException { Object returnObject = super.toObject(v8Value, depth); @@ -160,7 +275,7 @@ protected Object toObject(V8Value v8Value, final int depth) throws JavetExceptio if (v8Value instanceof V8ValueProxy) { V8ValueProxy v8ValueProxy = (V8ValueProxy) v8Value; try (IV8ValueObject iV8ValueObjectHandler = v8ValueProxy.getHandler()) { - Long handle = iV8ValueObjectHandler.getLong(PROXY_TARGET); + Long handle = iV8ValueObjectHandler.getPrivatePropertyLong(PRIVATE_PROPERTY_PROXY_TARGET); if (handle != null) { JavetCallbackContext javetCallbackContext = v8ValueProxy.getV8Runtime().getCallbackContext(handle); if (javetCallbackContext != null) { @@ -178,8 +293,8 @@ protected Object toObject(V8Value v8Value, final int depth) throws JavetExceptio Map map = new HashMap<>(); v8ValueObject.forEach((V8Value key, V8Value value) -> { String keyString = key.toString(); - if (PROPERTY_CONSTRUCTOR.equals(keyString)) { - map.put(PROPERTY_CONSTRUCTOR, ((V8ValueObject) value).getString(PROPERTY_NAME)); + if (PUBLIC_PROPERTY_CONSTRUCTOR.equals(keyString)) { + map.put(PUBLIC_PROPERTY_CONSTRUCTOR, ((V8ValueObject) value).getString(PROPERTY_NAME)); } else { Object object = toObject(value, depth + 1); if (!(config.isSkipFunctionInObject() && object instanceof JavetEntityFunction)) { @@ -187,6 +302,35 @@ protected Object toObject(V8Value v8Value, final int depth) throws JavetExceptio } } }); + if (!customObjectMap.isEmpty() + && v8ValueObject.hasPrivateProperty(PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME)) { + String customObjectClassName = + v8ValueObject.getPrivatePropertyString(PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME); + Lock readLock = customObjectLock.readLock(); + Constructor defaultConstructor = null; + Method methodFromMap = null; + try { + readLock.lock(); + Executable[] executables = customObjectMap.get(customObjectClassName); + if (executables != null) { + defaultConstructor = (Constructor) executables[EXECUTABLE_INDEX_DEFAULT_CONSTRUCTOR]; + methodFromMap = (Method) executables[EXECUTABLE_INDEX_FROM_MAP]; + } + } catch (Throwable t) { + // Do nothing + } finally { + readLock.unlock(); + } + if (defaultConstructor != null) { + try { + Object customObject = defaultConstructor.newInstance(); + methodFromMap.invoke(customObject, map); + return customObject; + } catch (Throwable t) { + // Do nothing + } + } + } return map; } return v8Value; @@ -218,7 +362,7 @@ protected T toV8Value( new JavetUniversalProxyHandler<>(v8Runtime, (Map) object); List javetCallbackContexts = iV8ValueObjectHandler.bind(javetUniversalProxyHandler); - iV8ValueObjectHandler.set(PROXY_TARGET, javetCallbackContexts.get(0).getHandle()); + iV8ValueObjectHandler.setPrivateProperty(PRIVATE_PROPERTY_PROXY_TARGET, javetCallbackContexts.get(0).getHandle()); } v8Value = v8ValueProxy; } else { @@ -240,7 +384,7 @@ protected T toV8Value( new JavetUniversalProxyHandler<>(v8Runtime, (Set) object); List javetCallbackContexts = iV8ValueObjectHandler.bind(javetUniversalProxyHandler); - iV8ValueObjectHandler.set(PROXY_TARGET, javetCallbackContexts.get(0).getHandle()); + iV8ValueObjectHandler.setPrivateProperty(PRIVATE_PROPERTY_PROXY_TARGET, javetCallbackContexts.get(0).getHandle()); } v8Value = v8ValueProxy; } else { @@ -329,7 +473,49 @@ protected T toV8Value( } } v8Value = v8ValueArray; + } else if (!customObjectMap.isEmpty()) { + String customObjectClassName = object.getClass().getName(); + Lock readLock = customObjectLock.readLock(); + Method methodToMap = null; + try { + readLock.lock(); + Executable[] executables = customObjectMap.get(customObjectClassName); + if (executables != null) { + methodToMap = (Method) executables[EXECUTABLE_INDEX_TO_MAP]; + } + } finally { + readLock.unlock(); + } + if (methodToMap != null) { + try { + Map map = (Map) methodToMap.invoke(object); + v8Value = toV8Value(v8Runtime, map); + ((V8ValueObject) v8Value).setPrivateProperty( + PRIVATE_PROPERTY_CUSTOM_OBJECT_CLASS_NAME, customObjectClassName); + } catch (Throwable t) { + } + } } return (T) v8Runtime.decorateV8Value(v8Value); } + + /** + * Unregister custom object. + * + * @param customObjectClass the custom object class + * @return true : success, false: failure + * @since 0.9.12 + */ + public boolean unregisterCustomObject(Class customObjectClass) { + if (customObjectClass == null) { + return false; + } + Lock writeLock = customObjectLock.writeLock(); + try { + writeLock.lock(); + return customObjectMap.remove(customObjectClass) != null; + } finally { + writeLock.unlock(); + } + } } diff --git a/src/main/java/com/caoccao/javet/interop/converters/JavetProxyConverter.java b/src/main/java/com/caoccao/javet/interop/converters/JavetProxyConverter.java index b7205d076..b563f67f7 100644 --- a/src/main/java/com/caoccao/javet/interop/converters/JavetProxyConverter.java +++ b/src/main/java/com/caoccao/javet/interop/converters/JavetProxyConverter.java @@ -80,7 +80,7 @@ protected T toV8Value( JavetUniversalProxyHandler javetUniversalProxyHandler = new JavetUniversalProxyHandler<>(v8Runtime, object); List javetCallbackContexts = iV8ValueObjectHandler.bind(javetUniversalProxyHandler); - iV8ValueObjectHandler.set(PROXY_TARGET, javetCallbackContexts.get(0).getHandle()); + iV8ValueObjectHandler.setPrivateProperty(PRIVATE_PROPERTY_PROXY_TARGET, javetCallbackContexts.get(0).getHandle()); } v8Value = v8ValueProxy; return (T) v8Runtime.decorateV8Value(v8Value); diff --git a/src/main/java/com/caoccao/javet/interop/converters/package-info.java b/src/main/java/com/caoccao/javet/interop/converters/package-info.java new file mode 100644 index 000000000..c39fc9a05 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interop/converters/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Built-in converters, interface and config. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interop.converters; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interop/engine/package-info.java b/src/main/java/com/caoccao/javet/interop/engine/package-info.java new file mode 100644 index 000000000..ca9ccc3b6 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interop/engine/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Engine pool, config and guard. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interop.engine; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interop/executors/package-info.java b/src/main/java/com/caoccao/javet/interop/executors/package-info.java new file mode 100644 index 000000000..0cd6df65b --- /dev/null +++ b/src/main/java/com/caoccao/javet/interop/executors/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Executors and interface. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interop.executors; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interop/package-info.java b/src/main/java/com/caoccao/javet/interop/package-info.java new file mode 100644 index 000000000..48c06d8d6 --- /dev/null +++ b/src/main/java/com/caoccao/javet/interop/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Interoperation between JVM and C++ via JNI. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interop; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/interop/proxy/package-info.java b/src/main/java/com/caoccao/javet/interop/proxy/package-info.java new file mode 100644 index 000000000..fe66d863e --- /dev/null +++ b/src/main/java/com/caoccao/javet/interop/proxy/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Dynamic proxy handlers for polyfilling Java interfaces with JS functions or objects. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.interop.proxy; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/node/modules/package-info.java b/src/main/java/com/caoccao/javet/node/modules/package-info.java new file mode 100644 index 000000000..af209a21e --- /dev/null +++ b/src/main/java/com/caoccao/javet/node/modules/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Reference classes for Node.js built-in modules. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.node.modules; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/utils/package-info.java b/src/main/java/com/caoccao/javet/utils/package-info.java new file mode 100644 index 000000000..fec80a012 --- /dev/null +++ b/src/main/java/com/caoccao/javet/utils/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Built-in utilities. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.utils; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/utils/receivers/package-info.java b/src/main/java/com/caoccao/javet/utils/receivers/package-info.java new file mode 100644 index 000000000..15edfacff --- /dev/null +++ b/src/main/java/com/caoccao/javet/utils/receivers/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Built-in callback receivers. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.utils.receivers; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/values/package-info.java b/src/main/java/com/caoccao/javet/values/package-info.java new file mode 100644 index 000000000..c788d59ac --- /dev/null +++ b/src/main/java/com/caoccao/javet/values/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes for V8 values. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.values; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/values/primitive/package-info.java b/src/main/java/com/caoccao/javet/values/primitive/package-info.java new file mode 100644 index 000000000..34afea0d2 --- /dev/null +++ b/src/main/java/com/caoccao/javet/values/primitive/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes for V8 primitive values. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.values.primitive; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/values/reference/IV8ValueObject.java b/src/main/java/com/caoccao/javet/values/reference/IV8ValueObject.java index 429812a1a..66ef80ff3 100644 --- a/src/main/java/com/caoccao/javet/values/reference/IV8ValueObject.java +++ b/src/main/java/com/caoccao/javet/values/reference/IV8ValueObject.java @@ -32,6 +32,7 @@ import java.time.ZonedDateTime; import java.util.List; +import java.util.Objects; /** * The interface V8 value object. @@ -80,6 +81,8 @@ public interface IV8ValueObject extends IV8ValueReference { * @since 0.8.9 */ default boolean bindFunction(String functionName, String codeString) throws JavetException { + Objects.requireNonNull(functionName); + Objects.requireNonNull(codeString); try (V8ValueFunction v8ValueFunction = getV8Runtime().createV8ValueFunction(codeString)) { return set(functionName, v8ValueFunction); } @@ -114,6 +117,7 @@ default boolean bindProperty( String propertyName, JavetCallbackContext javetCallbackContextGetter, JavetCallbackContext javetCallbackContextSetter) throws JavetException { + Objects.requireNonNull(propertyName); return bindProperty( getV8Runtime().createV8ValueString(propertyName), javetCallbackContextGetter, @@ -201,6 +205,16 @@ default boolean deleteNull() throws JavetException { return delete(getV8Runtime().createV8ValueNull()); } + /** + * Delete private property boolean. + * + * @param propertyName the property name + * @return the boolean + * @throws JavetException the javet exception + * @since 0.9.12 + */ + boolean deletePrivateProperty(String propertyName) throws JavetException; + /** * Delete undefined boolean. * @@ -417,6 +431,167 @@ default > R getPrimitive(Object key) throws Jav return null; } + /** + * Gets private property. + * + * @param the type parameter + * @param propertyName the property name + * @return the private property + * @throws JavetException the javet exception + * @since 0.9.12 + */ + @CheckReturnValue + T getPrivateProperty(String propertyName) throws JavetException; + + /** + * Gets private property boolean. + * + * @param propertyName the property name + * @return the private property boolean + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default Boolean getPrivatePropertyBoolean(String propertyName) throws JavetException { + return getPrivatePropertyPrimitive(propertyName); + } + + /** + * Gets private property double. + * + * @param propertyName the property name + * @return the private property double + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default Double getPrivatePropertyDouble(String propertyName) throws JavetException { + return getPrivatePropertyPrimitive(propertyName); + } + + /** + * Gets private property float. + * + * @param propertyName the property name + * @return the private property float + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default Float getPrivatePropertyFloat(String propertyName) throws JavetException { + Double result = getPrivatePropertyDouble(propertyName); + return result == null ? null : result.floatValue(); + } + + /** + * Gets private property integer. + * + * @param propertyName the property name + * @return the private property integer + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default Integer getPrivatePropertyInteger(String propertyName) throws JavetException { + return getPrivatePropertyPrimitive(propertyName); + } + + /** + * Gets private property long. + * + * @param propertyName the property name + * @return the private property long + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default Long getPrivatePropertyLong(String propertyName) throws JavetException { + return getPrivatePropertyPrimitive(propertyName); + } + + /** + * Gets private property null. + * + * @param propertyName the property name + * @return the private property null + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default V8ValueNull getPrivatePropertyNull(String propertyName) throws JavetException { + return getPrivateProperty(propertyName); + } + + /** + * Gets private property object. + * + * @param the type parameter + * @param propertyName the property name + * @return the private property object + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default T getPrivatePropertyObject(String propertyName) throws JavetException { + try { + return getV8Runtime().toObject(getPrivateProperty(propertyName), true); + } catch (JavetException e) { + throw e; + } catch (Throwable t) { + return null; + } + } + + /** + * Gets private property primitive. + * + * @param the type parameter + * @param the type parameter + * @param propertyName the property name + * @return the private property primitive + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default > R getPrivatePropertyPrimitive(String propertyName) + throws JavetException { + try (V8Value v8Value = getPrivateProperty(propertyName)) { + return ((T) v8Value).getValue(); + } catch (JavetException e) { + throw e; + } catch (Throwable ignored) { + } + return null; + } + + /** + * Gets private property string. + * + * @param propertyName the property name + * @return the private property string + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default String getPrivatePropertyString(String propertyName) throws JavetException { + return getPrivatePropertyPrimitive(propertyName); + } + + /** + * Gets private property undefined. + * + * @param propertyName the property name + * @return the private property undefined + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default V8ValueUndefined getPrivatePropertyUndefined(String propertyName) throws JavetException { + return getPrivateProperty(propertyName); + } + + /** + * Gets private property zoned date time. + * + * @param propertyName the property name + * @return the private property zoned date time + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default ZonedDateTime getPrivatePropertyZonedDateTime(String propertyName) throws JavetException { + return getPrivatePropertyPrimitive(propertyName); + } + /** * Gets property. * @@ -434,9 +609,10 @@ default > R getPrimitive(Object key) throws Jav * * @param key the key * @return the property boolean + * @throws JavetException the javet exception * @since 0.7.0 */ - default Boolean getPropertyBoolean(Object key) { + default Boolean getPropertyBoolean(Object key) throws JavetException { return getPropertyPrimitive(key); } @@ -445,9 +621,10 @@ default Boolean getPropertyBoolean(Object key) { * * @param key the key * @return the property double + * @throws JavetException the javet exception * @since 0.7.0 */ - default Double getPropertyDouble(Object key) { + default Double getPropertyDouble(Object key) throws JavetException { return getPropertyPrimitive(key); } @@ -456,9 +633,10 @@ default Double getPropertyDouble(Object key) { * * @param key the key * @return the property float + * @throws JavetException the javet exception * @since 0.7.0 */ - default Float getPropertyFloat(Object key) { + default Float getPropertyFloat(Object key) throws JavetException { Double result = getPropertyDouble(key); return result == null ? null : result.floatValue(); } @@ -468,9 +646,10 @@ default Float getPropertyFloat(Object key) { * * @param key the key * @return the property integer + * @throws JavetException the javet exception * @since 0.7.0 */ - default Integer getPropertyInteger(Object key) { + default Integer getPropertyInteger(Object key) throws JavetException { return getPropertyPrimitive(key); } @@ -479,9 +658,10 @@ default Integer getPropertyInteger(Object key) { * * @param key the key * @return the property long + * @throws JavetException the javet exception * @since 0.7.0 */ - default Long getPropertyLong(Object key) { + default Long getPropertyLong(Object key) throws JavetException { return getPropertyPrimitive(key); } @@ -520,11 +700,14 @@ default T getPropertyObject(Object key) throws JavetException { * @param the type parameter * @param key the key * @return the property primitive + * @throws JavetException the javet exception * @since 0.7.0 */ - default > R getPropertyPrimitive(Object key) { + default > R getPropertyPrimitive(Object key) throws JavetException { try (V8Value v8Value = getProperty(key)) { return ((T) v8Value).getValue(); + } catch (JavetException e) { + throw e; } catch (Throwable ignored) { } return null; @@ -535,9 +718,10 @@ default > R getPropertyPrimitive(Object key) { * * @param key the key * @return the property string + * @throws JavetException the javet exception * @since 0.7.0 */ - default String getPropertyString(Object key) { + default String getPropertyString(Object key) throws JavetException { return getPropertyPrimitive(key); } @@ -546,9 +730,10 @@ default String getPropertyString(Object key) { * * @param key the key * @return the property zoned date time + * @throws JavetException the javet exception * @since 0.7.0 */ - default ZonedDateTime getPropertyZonedDateTime(Object key) { + default ZonedDateTime getPropertyZonedDateTime(Object key) throws JavetException { return getPropertyPrimitive(key); } @@ -630,6 +815,16 @@ default boolean hasNull() throws JavetException { */ boolean hasOwnProperty(Object key) throws JavetException; + /** + * Has private property boolean. + * + * @param propertyName the property name + * @return the boolean + * @throws JavetException the javet exception + * @since 0.9.12 + */ + boolean hasPrivateProperty(String propertyName) throws JavetException; + /** * Has undefined property key. * @@ -872,6 +1067,41 @@ default boolean setNull(Object key) throws JavetException { return set(key, getV8Runtime().createV8ValueNull()); } + /** + * Sets private property. + * + * @param propertyName the property name + * @param propertyValue the property value + * @return true : set, false: not set + * @throws JavetException the javet exception + * @since 0.9.12 + */ + boolean setPrivateProperty(String propertyName, Object propertyValue) throws JavetException; + + /** + * Sets private property null. + * + * @param propertyKey the property key + * @return true : set, false: not set + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default boolean setPrivatePropertyNull(String propertyKey) throws JavetException { + return setPrivateProperty(propertyKey, getV8Runtime().createV8ValueNull()); + } + + /** + * Sets private property undefined. + * + * @param propertyKey the property key + * @return true : set, false: not set + * @throws JavetException the javet exception + * @since 0.9.12 + */ + default boolean setPrivatePropertyUndefined(String propertyKey) throws JavetException { + return setPrivateProperty(propertyKey, getV8Runtime().createV8ValueUndefined()); + } + /** * Sets property. * @@ -887,7 +1117,7 @@ default boolean setNull(Object key) throws JavetException { * Sets property null. * * @param key the key - * @return the property null + * @return true : set, false: not set * @throws JavetException the javet exception * @since 0.7.0 */ @@ -978,6 +1208,7 @@ default boolean setUndefined(Object key) throws JavetException { * @since 0.9.11 */ default boolean unbindProperty(String propertyName) throws JavetException { + Objects.requireNonNull(propertyName); return unbindProperty(getV8Runtime().createV8ValueString(propertyName)); } diff --git a/src/main/java/com/caoccao/javet/values/reference/V8ValueObject.java b/src/main/java/com/caoccao/javet/values/reference/V8ValueObject.java index e3b395572..f18912fb8 100644 --- a/src/main/java/com/caoccao/javet/values/reference/V8ValueObject.java +++ b/src/main/java/com/caoccao/javet/values/reference/V8ValueObject.java @@ -19,6 +19,7 @@ import com.caoccao.javet.annotations.*; import com.caoccao.javet.enums.V8ValueReferenceType; +import com.caoccao.javet.enums.V8ValueSymbolType; import com.caoccao.javet.exceptions.JavetError; import com.caoccao.javet.exceptions.JavetException; import com.caoccao.javet.interfaces.IJavetBiConsumer; @@ -33,6 +34,7 @@ import com.caoccao.javet.values.V8Value; import com.caoccao.javet.values.primitive.V8ValueString; import com.caoccao.javet.values.reference.builtin.V8ValueBuiltInJson; +import com.caoccao.javet.values.reference.builtin.V8ValueBuiltInSymbol; import com.caoccao.javet.values.virtual.V8VirtualValue; import com.caoccao.javet.values.virtual.V8VirtualValueList; @@ -103,10 +105,20 @@ public List bind(Object callbackReceiver) throws JavetExce setterMethodDescriptor.getMethod(), setterMethodDescriptor.isThisObjectRequired()); javetCallbackContexts.add(javetCallbackContextSetter); } - if (getterMethodDescriptor.isSymbol()) { + if (getterMethodDescriptor.getSymbolType() == V8ValueSymbolType.Custom) { try (V8ValueSymbol v8ValueSymbol = v8Runtime.createV8ValueSymbol(propertyName, true)) { bindProperty(v8ValueSymbol, javetCallbackContextGetter, javetCallbackContextSetter); } + } else if (getterMethodDescriptor.getSymbolType() == V8ValueSymbolType.BuiltIn) { + try (V8ValueBuiltInSymbol v8ValueBuiltInSymbol = v8Runtime.getGlobalObject().getBuiltInSymbol(); + V8ValueSymbol v8ValueSymbol = v8ValueBuiltInSymbol.getBuiltInSymbol(propertyName)) { + if (v8ValueSymbol == null) { + throw new JavetException( + JavetError.ConverterSymbolNotBuiltIn, + SimpleMap.of(JavetError.PARAMETER_SYMBOL, propertyName)); + } + bindProperty(v8ValueSymbol, javetCallbackContextGetter, javetCallbackContextSetter); + } } else { bindProperty(propertyName, javetCallbackContextGetter, javetCallbackContextSetter); } @@ -151,6 +163,8 @@ public List bind(Object callbackReceiver) throws JavetExce @Override public boolean bindFunction(String functionName, JavetCallbackContext javetCallbackContext) throws JavetException { + Objects.requireNonNull(functionName); + Objects.requireNonNull(javetCallbackContext); try (V8ValueFunction v8ValueFunction = getV8Runtime().createV8ValueFunction(javetCallbackContext)) { return set(functionName, v8ValueFunction); } @@ -161,6 +175,7 @@ public boolean bindProperty( V8ValueString propertyName, JavetCallbackContext javetCallbackContextGetter, JavetCallbackContext javetCallbackContextSetter) throws JavetException { + Objects.requireNonNull(propertyName); Objects.requireNonNull(javetCallbackContextGetter); checkV8Runtime(); return v8Runtime.setAccessor( @@ -172,6 +187,7 @@ public boolean bindProperty( V8ValueSymbol propertyName, JavetCallbackContext javetCallbackContextGetter, JavetCallbackContext javetCallbackContextSetter) throws JavetException { + Objects.requireNonNull(propertyName); Objects.requireNonNull(javetCallbackContextGetter); checkV8Runtime(); return v8Runtime.setAccessor( @@ -180,12 +196,20 @@ public boolean bindProperty( @Override public boolean delete(Object key) throws JavetException { + Objects.requireNonNull(key); checkV8Runtime(); try (V8VirtualValue virtualKey = new V8VirtualValue(v8Runtime, key)) { return v8Runtime.delete(this, virtualKey.get()); } } + @Override + public boolean deletePrivateProperty(String propertyName) throws JavetException { + Objects.requireNonNull(propertyName); + checkV8Runtime(); + return v8Runtime.deletePrivateProperty(this, propertyName); + } + @Override public int forEach( IJavetUniConsumer consumer) throws JavetException, E { @@ -233,6 +257,7 @@ public int for @Override @CheckReturnValue public T get(Object key) throws JavetException { + Objects.requireNonNull(key); checkV8Runtime(); try (V8VirtualValue virtualKey = new V8VirtualValue(v8Runtime, key)) { return v8Runtime.get(this, virtualKey.get()); @@ -240,6 +265,7 @@ public T get(Object key) throws JavetException { } protected BindingContext getBindingContext(Class callbackReceiverClass) throws JavetException { + Objects.requireNonNull(callbackReceiverClass); Map, BindingContext> bindingContextWeakHashMap = v8Runtime.getBindingContextWeakHashMap(); BindingContext bindingContext = bindingContextWeakHashMap.get(callbackReceiverClass); if (bindingContext == null) { @@ -272,14 +298,14 @@ protected BindingContext getBindingContext(Class callbackReceiverClass) throw if (!propertyGetterMap.containsKey(propertyName)) { propertyGetterMap.put( propertyName, - new MethodDescriptor(method, v8Property.thisObjectRequired(), v8Property.symbol())); + new MethodDescriptor(method, v8Property.thisObjectRequired(), v8Property.symbolType())); } } else if (method.getParameterCount() == expectedSetterParameterCount) { // Duplicated property name will be dropped. if (!propertySetterMap.containsKey(propertyName)) { propertySetterMap.put( propertyName, - new MethodDescriptor(method, v8Property.thisObjectRequired(), v8Property.symbol())); + new MethodDescriptor(method, v8Property.thisObjectRequired(), v8Property.symbolType())); } } else { throw new JavetException(JavetError.CallbackSignatureParameterSizeMismatch, @@ -353,9 +379,17 @@ public IV8ValueArray getOwnPropertyNames() throws JavetException { return v8Runtime.getOwnPropertyNames(this); } + @Override + public T getPrivateProperty(String propertyName) throws JavetException { + Objects.requireNonNull(propertyName); + checkV8Runtime(); + return v8Runtime.getPrivateProperty(this, propertyName); + } + @Override @CheckReturnValue public T getProperty(Object key) throws JavetException { + Objects.requireNonNull(key); checkV8Runtime(); try (V8VirtualValue virtualKey = new V8VirtualValue(v8Runtime, key)) { return v8Runtime.getProperty(this, virtualKey.get()); @@ -381,6 +415,7 @@ public V8ValueReferenceType getType() { @Override public boolean has(Object value) throws JavetException { + Objects.requireNonNull(value); checkV8Runtime(); try (V8VirtualValue virtualValue = new V8VirtualValue(v8Runtime, value)) { return v8Runtime.has(this, virtualValue.get()); @@ -389,16 +424,25 @@ public boolean has(Object value) throws JavetException { @Override public boolean hasOwnProperty(Object key) throws JavetException { + Objects.requireNonNull(key); checkV8Runtime(); try (V8VirtualValue virtualKey = new V8VirtualValue(v8Runtime, key)) { return v8Runtime.hasOwnProperty(this, virtualKey.get()); } } + @Override + public boolean hasPrivateProperty(String propertyName) throws JavetException { + Objects.requireNonNull(propertyName); + checkV8Runtime(); + return v8Runtime.hasPrivateProperty(this, Objects.requireNonNull(propertyName)); + } + @Override @CheckReturnValue public T invokeExtended(String functionName, boolean returnResult, Object... objects) throws JavetException { + Objects.requireNonNull(functionName); checkV8Runtime(); try (V8VirtualValueList virtualValueList = new V8VirtualValueList(v8Runtime, objects)) { return v8Runtime.invoke(this, functionName, returnResult, virtualValueList.get()); @@ -409,8 +453,8 @@ public T invokeExtended(String functionName, boolean returnR @CheckReturnValue public T invokeExtended(String functionName, boolean returnResult, V8Value... v8Values) throws JavetException { + Objects.requireNonNull(functionName); checkV8Runtime(); - v8Runtime.decorateV8Values(v8Values); return v8Runtime.invoke(this, functionName, returnResult, v8Values); } @@ -431,6 +475,7 @@ public boolean sameValue(V8Value v8Value) throws JavetException { @Override public boolean set(Object key, Object value) throws JavetException { + Objects.requireNonNull(key); checkV8Runtime(); try (V8VirtualValue virtualKey = new V8VirtualValue(v8Runtime, key); V8VirtualValue virtualValue = new V8VirtualValue(v8Runtime, value)) { @@ -438,8 +483,18 @@ public boolean set(Object key, Object value) throws JavetException { } } + @Override + public boolean setPrivateProperty(String propertyName, Object propertyValue) throws JavetException { + Objects.requireNonNull(propertyName); + checkV8Runtime(); + try (V8VirtualValue virtualValue = new V8VirtualValue(v8Runtime, propertyValue)) { + return v8Runtime.setPrivateProperty(this, propertyName, virtualValue.get()); + } + } + @Override public boolean setProperty(Object key, Object value) throws JavetException { + Objects.requireNonNull(key); checkV8Runtime(); try (V8VirtualValue virtualKey = new V8VirtualValue(v8Runtime, key); V8VirtualValue virtualValue = new V8VirtualValue(v8Runtime, value)) { @@ -449,6 +504,7 @@ public boolean setProperty(Object key, Object value) throws JavetException { @Override public boolean setPrototype(IV8ValueObject v8ValueObject) throws JavetException { + Objects.requireNonNull(v8ValueObject); return set(PROPERTY_PROTOTYPE, v8ValueObject); } @@ -507,12 +563,24 @@ public int unbind(Object callbackReceiver) throws JavetException { callbackReceiver, getterMethodDescriptor.getMethod().getName())) { continue; } - if (getterMethodDescriptor.isSymbol()) { + if (getterMethodDescriptor.getSymbolType() == V8ValueSymbolType.Custom) { try (V8ValueSymbol v8ValueSymbol = v8Runtime.createV8ValueSymbol(propertyName, true)) { if (unbindProperty(v8ValueSymbol)) { ++unbindCount; } } + } else if (getterMethodDescriptor.getSymbolType() == V8ValueSymbolType.BuiltIn) { + try (V8ValueBuiltInSymbol v8ValueBuiltInSymbol = v8Runtime.getGlobalObject().getBuiltInSymbol(); + V8ValueSymbol v8ValueSymbol = v8ValueBuiltInSymbol.getBuiltInSymbol(propertyName)) { + if (v8ValueSymbol == null) { + throw new JavetException( + JavetError.ConverterSymbolNotBuiltIn, + SimpleMap.of(JavetError.PARAMETER_SYMBOL, propertyName)); + } + if (unbindProperty(v8ValueSymbol)) { + ++unbindCount; + } + } } else { if (unbindProperty(propertyName)) { ++unbindCount; @@ -560,6 +628,7 @@ public boolean unbindFunction(String functionName) throws JavetException { @Override public boolean unbindProperty(V8ValueString propertyName) throws JavetException { + Objects.requireNonNull(propertyName); checkV8Runtime(); return v8Runtime.setAccessor( this, propertyName, null, null); @@ -567,6 +636,7 @@ public boolean unbindProperty(V8ValueString propertyName) throws JavetException @Override public boolean unbindProperty(V8ValueSymbol propertyName) throws JavetException { + Objects.requireNonNull(propertyName); checkV8Runtime(); return v8Runtime.setAccessor( this, propertyName, null, null); diff --git a/src/main/java/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.java b/src/main/java/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.java new file mode 100644 index 000000000..ee2ca1428 --- /dev/null +++ b/src/main/java/com/caoccao/javet/values/reference/V8ValueSharedArrayBuffer.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.caoccao.javet.values.reference; + +import com.caoccao.javet.enums.V8ValueReferenceType; + +import java.nio.ByteBuffer; + +public class V8ValueSharedArrayBuffer extends V8ValueArrayBuffer { + V8ValueSharedArrayBuffer(long handle, ByteBuffer byteBuffer) { + super(handle, byteBuffer); + } + + @Override + public V8ValueReferenceType getType() { + return V8ValueReferenceType.SharedArrayBuffer; + } +} diff --git a/src/main/java/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.java b/src/main/java/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.java index 00f9abf2e..f29af44a9 100644 --- a/src/main/java/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.java +++ b/src/main/java/com/caoccao/javet/values/reference/builtin/V8ValueBuiltInSymbol.java @@ -19,9 +19,13 @@ import com.caoccao.javet.annotations.CheckReturnValue; import com.caoccao.javet.exceptions.JavetException; +import com.caoccao.javet.interfaces.IJavetSupplier; import com.caoccao.javet.values.reference.V8ValueFunction; import com.caoccao.javet.values.reference.V8ValueSymbol; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unchecked") public class V8ValueBuiltInSymbol extends V8ValueFunction { @@ -40,9 +44,26 @@ public class V8ValueBuiltInSymbol extends V8ValueFunction { public static final String PROPERTY_UNSCOPABLES = "unscopables"; public static final String FUNCTION_FOR = "for"; public static final String FUNCTION_KEY_FOR = "keyFor"; + public static final String PREFIX_PROPERTY = "PROPERTY_"; + + protected Map> builtInSymbolMap; public V8ValueBuiltInSymbol(long handle) { super(handle); + builtInSymbolMap = new HashMap<>(); + builtInSymbolMap.put(PROPERTY_ASYNC_ITERATOR, this::getAsyncIterator); + builtInSymbolMap.put(PROPERTY_HAS_INSTANCE, this::getHasInstance); + builtInSymbolMap.put(PROPERTY_IS_CONCAT_SPREADABLE, this::getIsConcatSpreadable); + builtInSymbolMap.put(PROPERTY_ITERATOR, this::getIterator); + builtInSymbolMap.put(PROPERTY_MATCH, this::getMatch); + builtInSymbolMap.put(PROPERTY_MATCH_ALL, this::getMatchAll); + builtInSymbolMap.put(PROPERTY_REPLACE, this::getReplace); + builtInSymbolMap.put(PROPERTY_SEARCH, this::getSearch); + builtInSymbolMap.put(PROPERTY_SPECIES, this::getSpecies); + builtInSymbolMap.put(PROPERTY_SPLIT, this::getSplit); + builtInSymbolMap.put(PROPERTY_TO_PRIMITIVE, this::getToPrimitive); + builtInSymbolMap.put(PROPERTY_TO_STRING_TAG, this::getToStringTag); + builtInSymbolMap.put(PROPERTY_UNSCOPABLES, this::getUnscopables); } @CheckReturnValue @@ -55,6 +76,18 @@ public V8ValueSymbol getAsyncIterator() throws JavetException { return get(PROPERTY_ASYNC_ITERATOR); } + @CheckReturnValue + public V8ValueSymbol getBuiltInSymbol(String description) throws JavetException { + IJavetSupplier iJavetSupplier = builtInSymbolMap.get(description); + if (iJavetSupplier != null) { + try { + return iJavetSupplier.get(); + } catch (Throwable e) { + } + } + return null; + } + @CheckReturnValue public V8ValueSymbol getHasInstance() throws JavetException { return get(PROPERTY_HAS_INSTANCE); diff --git a/src/main/java/com/caoccao/javet/values/reference/builtin/package-info.java b/src/main/java/com/caoccao/javet/values/reference/builtin/package-info.java new file mode 100644 index 000000000..02142010f --- /dev/null +++ b/src/main/java/com/caoccao/javet/values/reference/builtin/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes for V8 built-in reference values. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.values.reference.builtin; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/values/reference/package-info.java b/src/main/java/com/caoccao/javet/values/reference/package-info.java new file mode 100644 index 000000000..7e26d4d67 --- /dev/null +++ b/src/main/java/com/caoccao/javet/values/reference/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes for V8 reference values. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.values.reference; \ No newline at end of file diff --git a/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValue.java b/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValue.java index 882923c31..a095863bb 100644 --- a/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValue.java +++ b/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValue.java @@ -23,6 +23,8 @@ import com.caoccao.javet.utils.JavetResourceUtils; import com.caoccao.javet.values.V8Value; +import java.util.Objects; + /** * The type V8 virtual value. * @@ -54,6 +56,7 @@ public class V8VirtualValue implements IJavetClosable { * @since 0.8.5 */ public V8VirtualValue(V8Runtime v8Runtime, Object object) throws JavetException { + Objects.requireNonNull(v8Runtime); if (object instanceof V8Value) { converted = false; value = (V8Value) object; diff --git a/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValueList.java b/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValueList.java index 48f0b8ca9..ca10e390d 100644 --- a/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValueList.java +++ b/src/main/java/com/caoccao/javet/values/virtual/V8VirtualValueList.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * The type V8 virtual value list. @@ -55,6 +56,7 @@ public class V8VirtualValueList implements IJavetClosable { * @since 0.8.5 */ public V8VirtualValueList(V8Runtime v8Runtime, Object... objects) throws JavetException { + Objects.requireNonNull(v8Runtime); if (objects == null || objects.length == 0) { toBeClosedValues = null; values = null; diff --git a/src/main/java/com/caoccao/javet/values/virtual/package-info.java b/src/main/java/com/caoccao/javet/values/virtual/package-info.java new file mode 100644 index 000000000..34d9bb0e4 --- /dev/null +++ b/src/main/java/com/caoccao/javet/values/virtual/package-info.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes for V8 virtual reference values. + * + * @since 0.7.0 + * @author Sam Cao + */ +package com.caoccao.javet.values.virtual; \ No newline at end of file diff --git a/src/test/java/com/caoccao/javet/interop/converters/TestJavetObjectConverter.java b/src/test/java/com/caoccao/javet/interop/converters/TestJavetObjectConverter.java index c04a92be4..aa6c469c5 100644 --- a/src/test/java/com/caoccao/javet/interop/converters/TestJavetObjectConverter.java +++ b/src/test/java/com/caoccao/javet/interop/converters/TestJavetObjectConverter.java @@ -142,6 +142,30 @@ public void testCircularStructure() throws JavetException { } } + @Test + public void testCustomObject() throws JavetException { + IJavetConverter originalConverter = v8Runtime.getConverter(); + JavetObjectConverter converter = new JavetObjectConverter(); + converter.registerCustomObject(CustomObject.class); + v8Runtime.setConverter(converter); + CustomObject[] customObjects = new CustomObject[]{ + new CustomObject("x", 1), + new CustomObject("y", 2), + }; + v8Runtime.getGlobalObject().set("a", customObjects); + assertEquals(2, v8Runtime.getExecutor("a.length").executeInteger()); + List v8CustomObjects = v8Runtime.getGlobalObject().getObject("a"); + assertNotNull(v8CustomObjects); + assertEquals(2, v8CustomObjects.size()); + for (int i = 0; i < customObjects.length; i++) { + assertEquals(customObjects[i].getName(), v8Runtime.getExecutor("a[" + i + "].name").executeString()); + assertEquals(customObjects[i].getValue(), v8Runtime.getExecutor("a[" + i + "].value").executeInteger()); + assertEquals(customObjects[i].getName(), v8CustomObjects.get(i).getName()); + assertEquals(customObjects[i].getValue(), v8CustomObjects.get(i).getValue()); + } + v8Runtime.setConverter(originalConverter); + } + @Test public void testMap() throws JavetException { IJavetConverter converter = new JavetObjectConverter(); @@ -336,4 +360,48 @@ public void testTypedArrayShortArray() throws JavetException { assertArrayEquals(shorts, newShorts); } } + + static final class CustomObject { + private String name; + private int value; + + public CustomObject(String name, int value) { + this.name = name; + this.value = value; + } + + public CustomObject() { + this(null, 0); + } + + public void fromMap(Map map) { + setName((String) map.get("name")); + setValue((Integer) map.get("value")); + } + + public String getName() { + return name; + } + + public int getValue() { + return value; + } + + public void setName(String name) { + this.name = name; + } + + public void setValue(int value) { + this.value = value; + } + + public Map toMap() { + return new HashMap() { + { + put("name", getName()); + put("value", getValue()); + } + }; + } + } } diff --git a/src/test/java/com/caoccao/javet/mock/MockAnnotationBasedCallbackReceiver.java b/src/test/java/com/caoccao/javet/mock/MockAnnotationBasedCallbackReceiver.java index f37df14e6..f0938a0ac 100644 --- a/src/test/java/com/caoccao/javet/mock/MockAnnotationBasedCallbackReceiver.java +++ b/src/test/java/com/caoccao/javet/mock/MockAnnotationBasedCallbackReceiver.java @@ -21,6 +21,7 @@ import com.caoccao.javet.annotations.V8Function; import com.caoccao.javet.annotations.V8Property; import com.caoccao.javet.annotations.V8RuntimeSetter; +import com.caoccao.javet.enums.V8ValueSymbolType; import com.caoccao.javet.exceptions.JavetException; import com.caoccao.javet.interop.V8Runtime; import com.caoccao.javet.values.reference.V8ValueArray; @@ -119,7 +120,7 @@ public String getStringValueWithThis(V8ValueObject thisObject) throws JavetExcep return thisObject.getString("stringValue"); } - @V8Property(symbol = true) + @V8Property(symbolType = V8ValueSymbolType.Custom) public String getSymbolValue() { count.incrementAndGet(); return symbolValue; @@ -214,7 +215,7 @@ public void setStringValueWithThis(V8ValueObject thisObject, String stringValue) thisObject.set("stringValue", stringValue); } - @V8Property(symbol = true) + @V8Property(symbolType = V8ValueSymbolType.Custom) public void setSymbolValue(String symbolValue) { count.incrementAndGet(); this.symbolValue = symbolValue; @@ -225,4 +226,10 @@ public void setSymbolValue(String symbolValue) { public void setV8Runtime(V8Runtime v8Runtime) { this.v8Runtime = v8Runtime; } + + @V8Property(name = "toPrimitive", symbolType = V8ValueSymbolType.BuiltIn) + public Integer toPrimitive() { + count.incrementAndGet(); + return 1000; + } } diff --git a/src/test/java/com/caoccao/javet/values/reference/TestV8ValueFunction.java b/src/test/java/com/caoccao/javet/values/reference/TestV8ValueFunction.java index 095f49022..3118b9027 100644 --- a/src/test/java/com/caoccao/javet/values/reference/TestV8ValueFunction.java +++ b/src/test/java/com/caoccao/javet/values/reference/TestV8ValueFunction.java @@ -48,7 +48,7 @@ public void testAnnotationBasedFunctions() throws JavetException { new MockAnnotationBasedCallbackReceiver(); List javetCallbackContexts = v8ValueObject.bind(mockAnnotationBasedCallbackReceiver); - assertEquals(22, javetCallbackContexts.size()); + assertEquals(23, javetCallbackContexts.size()); assertEquals(0, mockAnnotationBasedCallbackReceiver.getCount()); assertEquals("test", v8Runtime.getExecutor("a.echo('test')").executeString()); assertEquals(1, mockAnnotationBasedCallbackReceiver.getCount()); @@ -110,7 +110,7 @@ public void testAnnotationBasedFunctions() throws JavetException { assertEquals(1, v8Runtime.getExecutor("a.primitiveAddShort(1, undefined)").executeInteger()); assertEquals(String.valueOf((char) 1), v8Runtime.getExecutor("a.primitiveIncreaseChar(null)").executeString()); assertEquals(String.valueOf((char) 1), v8Runtime.getExecutor("a.primitiveIncreaseChar(undefined)").executeString()); - assertEquals(19, v8ValueObject.unbind(mockAnnotationBasedCallbackReceiver)); + assertEquals(20, v8ValueObject.unbind(mockAnnotationBasedCallbackReceiver)); try { v8Runtime.getExecutor("a.echo('test')").executeVoid(); fail("Failed to throw an exception"); @@ -129,7 +129,7 @@ public void testAnnotationBasedFunctionsAndProperties() throws JavetException { new MockAnnotationBasedCallbackReceiver(); List javetCallbackContexts = v8ValueObject.bind(mockAnnotationBasedCallbackReceiver); - assertEquals(22, javetCallbackContexts.size()); + assertEquals(23, javetCallbackContexts.size()); assertEquals(0, mockAnnotationBasedCallbackReceiver.getCount()); assertEquals(123, v8Runtime.getExecutor("a.integerValue").executeInteger()); assertEquals(1, mockAnnotationBasedCallbackReceiver.getCount()); diff --git a/src/test/java/com/caoccao/javet/values/reference/TestV8ValueObject.java b/src/test/java/com/caoccao/javet/values/reference/TestV8ValueObject.java index 280474b64..daeaf3910 100644 --- a/src/test/java/com/caoccao/javet/values/reference/TestV8ValueObject.java +++ b/src/test/java/com/caoccao/javet/values/reference/TestV8ValueObject.java @@ -45,7 +45,7 @@ public void testAnnotationBasedProperties() throws JavetException { new MockAnnotationBasedCallbackReceiver(); List javetCallbackContexts = v8ValueObject.bind(mockAnnotationBasedCallbackReceiver); - assertEquals(22, javetCallbackContexts.size()); + assertEquals(23, javetCallbackContexts.size()); assertEquals(0, mockAnnotationBasedCallbackReceiver.getCount()); assertEquals(123, v8Runtime.getExecutor("a.integerValue").executeInteger()); assertEquals(1, mockAnnotationBasedCallbackReceiver.getCount()); @@ -71,9 +71,11 @@ public void testAnnotationBasedProperties() throws JavetException { assertEquals(13, mockAnnotationBasedCallbackReceiver.getCount()); assertEquals("abc", v8Runtime.getExecutor("a[Symbol.for('symbolValue')]").executeString()); assertEquals(14, mockAnnotationBasedCallbackReceiver.getCount()); - assertEquals(19, v8ValueObject.unbind(mockAnnotationBasedCallbackReceiver)); + assertEquals(1000, v8Runtime.getExecutor("a[Symbol.toPrimitive]").executeInteger()); + assertEquals(15, mockAnnotationBasedCallbackReceiver.getCount()); + assertEquals(20, v8ValueObject.unbind(mockAnnotationBasedCallbackReceiver)); assertNull(v8Runtime.getExecutor("a['stringValue']").executeString()); - assertEquals(14, mockAnnotationBasedCallbackReceiver.getCount()); + assertEquals(15, mockAnnotationBasedCallbackReceiver.getCount()); } v8Runtime.lowMemoryNotification(); } @@ -223,7 +225,23 @@ public void testGetPropertyNames() throws JavetException { } @Test - public void testGetSetDelete() throws JavetException { + public void testGetSetDeletePrivate() throws JavetException { + try (V8ValueObject v8ValueObject = v8Runtime.createV8ValueObject()) { + assertFalse(v8ValueObject.hasPrivateProperty("x")); + assertTrue(v8ValueObject.getPrivateProperty("x").isUndefined()); + assertTrue(v8ValueObject.setPrivateProperty("x", 1)); + assertTrue(v8ValueObject.hasPrivateProperty("x")); + assertEquals(1, v8ValueObject.getPrivatePropertyInteger("x")); + try (IV8ValueArray iV8ValueArray = v8ValueObject.getOwnPropertyNames()) { + assertEquals("[]", iV8ValueArray.toJsonString()); + } + assertTrue(v8ValueObject.deletePrivateProperty("x")); + assertTrue(v8ValueObject.getPrivateProperty("x").isUndefined()); + } + } + + @Test + public void testGetSetDeletePublic() throws JavetException { try (V8ValueObject v8ValueObject = v8Runtime.getExecutor("const a = {}; a;").execute()) { assertTrue(v8ValueObject.set("a", 1)); assertTrue(v8ValueObject.set("b", "2"));