From 04dd18baa86b8691af43f3d032694c009d164704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B0=E5=86=B0=E5=86=B0?= <418776654@qq.com> Date: Thu, 19 Dec 2024 14:47:14 +0800 Subject: [PATCH 1/2] 3.6js version OHOS adaptation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 冰冰冰 <418776654@qq.com> --- .gitignore | 1 + .../js-bindings/bindings/CMakeLists.txt | 14 +- .../bindings/manual/ScriptingCore.cpp | 4 +- .../js_bindings_system_functions.cpp | 8 +- .../js-bindings/bindings/script/jsb_boot.js | 17 +- .../spidermonkey/include/ohos/js-config-32.h | 53 + .../spidermonkey/include/ohos/js-config-64.h | 53 + .../spidermonkey/include/ohos/js-config.h | 5 + .../external/spidermonkey/include/ohos/js.msg | 443 ++ .../spidermonkey/include/ohos/js/Anchor.h | 174 + .../spidermonkey/include/ohos/js/CallArgs.h | 418 ++ .../include/ohos/js/CallNonGenericMethod.h | 117 + .../include/ohos/js/CharacterEncoding.h | 226 + .../spidermonkey/include/ohos/js/Class.h | 544 ++ .../spidermonkey/include/ohos/js/Date.h | 35 + .../spidermonkey/include/ohos/js/GCAPI.h | 514 ++ .../spidermonkey/include/ohos/js/HashTable.h | 1672 ++++++ .../spidermonkey/include/ohos/js/HeapAPI.h | 317 + .../spidermonkey/include/ohos/js/Id.h | 185 + .../include/ohos/js/LegacyIntTypes.h | 59 + .../include/ohos/js/MemoryMetrics.h | 668 +++ .../include/ohos/js/OldDebugAPI.h | 385 ++ .../spidermonkey/include/ohos/js/Principals.h | 100 + .../include/ohos/js/ProfilingStack.h | 169 + .../include/ohos/js/PropertyKey.h | 95 + .../include/ohos/js/RequiredDefines.h | 34 + .../spidermonkey/include/ohos/js/RootingAPI.h | 1253 ++++ .../include/ohos/js/SliceBudget.h | 66 + .../include/ohos/js/StructuredClone.h | 245 + .../spidermonkey/include/ohos/js/TracingAPI.h | 216 + .../spidermonkey/include/ohos/js/TypeDecls.h | 81 + .../spidermonkey/include/ohos/js/UbiNode.h | 462 ++ .../include/ohos/js/UbiNodeTraverse.h | 208 + .../spidermonkey/include/ohos/js/Utility.h | 736 +++ .../spidermonkey/include/ohos/js/Value.h | 2005 +++++++ .../spidermonkey/include/ohos/js/Vector.h | 66 + .../spidermonkey/include/ohos/js/WeakMapPtr.h | 48 + .../spidermonkey/include/ohos/jsalloc.h | 88 + .../spidermonkey/include/ohos/jsapi.h | 5249 +++++++++++++++++ .../spidermonkey/include/ohos/jsbytecode.h | 14 + .../spidermonkey/include/ohos/jsclist.h | 107 + .../spidermonkey/include/ohos/jscpucfg.h | 112 + .../spidermonkey/include/ohos/jsfriendapi.h | 2561 ++++++++ .../spidermonkey/include/ohos/jsperf.h | 133 + .../spidermonkey/include/ohos/jsprf.h | 67 + .../spidermonkey/include/ohos/jsprototypes.h | 115 + .../spidermonkey/include/ohos/jsproxy.h | 563 ++ .../spidermonkey/include/ohos/jspubtd.h | 548 ++ .../spidermonkey/include/ohos/jstypes.h | 226 + .../spidermonkey/include/ohos/jsversion.h | 52 + .../spidermonkey/include/ohos/jswrapper.h | 337 ++ .../include/ohos/mozilla/Alignment.h | 139 + .../include/ohos/mozilla/AllocPolicy.h | 80 + .../spidermonkey/include/ohos/mozilla/Array.h | 55 + .../include/ohos/mozilla/ArrayUtils.h | 177 + .../include/ohos/mozilla/Assertions.h | 534 ++ .../include/ohos/mozilla/Atomics.h | 1171 ++++ .../include/ohos/mozilla/Attributes.h | 536 ++ .../include/ohos/mozilla/BinarySearch.h | 72 + .../include/ohos/mozilla/BloomFilter.h | 256 + .../include/ohos/mozilla/Casting.h | 221 + .../include/ohos/mozilla/ChaosMode.h | 41 + .../include/ohos/mozilla/Char16.h | 192 + .../include/ohos/mozilla/CheckedInt.h | 779 +++ .../include/ohos/mozilla/Compiler.h | 123 + .../include/ohos/mozilla/Compression.h | 119 + .../include/ohos/mozilla/Constants.h | 16 + .../include/ohos/mozilla/DebugOnly.h | 81 + .../include/ohos/mozilla/Decimal.h | 213 + .../include/ohos/mozilla/Endian.h | 695 +++ .../include/ohos/mozilla/EnumSet.h | 206 + .../include/ohos/mozilla/EnumeratedArray.h | 76 + .../include/ohos/mozilla/FloatingPoint.h | 413 ++ .../include/ohos/mozilla/GuardObjects.h | 153 + .../include/ohos/mozilla/HashFunctions.h | 367 ++ .../ohos/mozilla/IntegerPrintfMacros.h | 62 + .../include/ohos/mozilla/IntegerTypeTraits.h | 138 + .../include/ohos/mozilla/Likely.h | 23 + .../include/ohos/mozilla/LinkedList.h | 486 ++ .../include/ohos/mozilla/LinuxSignal.h | 48 + .../include/ohos/mozilla/MSIntTypes.h | 198 + .../include/ohos/mozilla/MacroArgs.h | 105 + .../include/ohos/mozilla/MacroForEach.h | 158 + .../include/ohos/mozilla/MathAlgorithms.h | 501 ++ .../spidermonkey/include/ohos/mozilla/Maybe.h | 182 + .../include/ohos/mozilla/MaybeOneOf.h | 144 + .../include/ohos/mozilla/MemoryChecking.h | 72 + .../include/ohos/mozilla/MemoryReporting.h | 30 + .../spidermonkey/include/ohos/mozilla/Move.h | 250 + .../include/ohos/mozilla/NullPtr.h | 112 + .../include/ohos/mozilla/NumericLimits.h | 40 + .../spidermonkey/include/ohos/mozilla/Pair.h | 184 + .../include/ohos/mozilla/PodOperations.h | 195 + .../include/ohos/mozilla/Poison.h | 62 + .../spidermonkey/include/ohos/mozilla/Range.h | 45 + .../include/ohos/mozilla/RangedPtr.h | 284 + .../include/ohos/mozilla/ReentrancyGuard.h | 57 + .../include/ohos/mozilla/RefCountType.h | 37 + .../include/ohos/mozilla/RefPtr.h | 552 ++ .../include/ohos/mozilla/RollingMean.h | 115 + .../spidermonkey/include/ohos/mozilla/SHA1.h | 63 + .../include/ohos/mozilla/Scoped.h | 308 + .../include/ohos/mozilla/SplayTree.h | 296 + .../ohos/mozilla/TaggedAnonymousMemory.h | 86 + .../include/ohos/mozilla/TemplateLib.h | 112 + .../include/ohos/mozilla/ThreadLocal.h | 151 + .../include/ohos/mozilla/ToString.h | 32 + .../include/ohos/mozilla/TypeTraits.h | 998 ++++ .../include/ohos/mozilla/TypedEnum.h | 281 + .../include/ohos/mozilla/TypedEnumBits.h | 184 + .../include/ohos/mozilla/TypedEnumInternal.h | 110 + .../spidermonkey/include/ohos/mozilla/Types.h | 134 + .../include/ohos/mozilla/UniquePtr.h | 674 +++ .../include/ohos/mozilla/Vector.h | 1280 ++++ .../include/ohos/mozilla/WeakPtr.h | 202 + .../spidermonkey/prebuilt/ohos/libjs_static.a | Bin 0 -> 5924450 bytes samples/js-tests/CMakeLists.txt | 139 +- .../js-tests/project/Classes/AppDelegate.cpp | 14 + .../js-tests/project/Classes/AppDelegate.h | 7 + samples/js-tests/project/proj.ohos/.gitignore | 13 + .../project/proj.ohos/AppScope/app.json5 | 11 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 6790 bytes .../project/proj.ohos/build-profile.json5 | 45 + .../project/proj.ohos/entry/.gitignore | 6 + .../proj.ohos/entry/build-profile.json5 | 42 + .../project/proj.ohos/entry/hvigorfile.ts | 2 + .../proj.ohos/entry/obfuscation-rules.txt | 18 + .../project/proj.ohos/entry/oh-package.json5 | 13 + .../entry/src/main/cpp/CMakeLists.txt | 148 + .../proj.ohos/entry/src/main/cpp/main.cpp | 36 + .../entry/src/main/cpp/napi_init.cpp | 54 + .../src/main/cpp/types/libentry/index.d.ts | 30 + .../main/cpp/types/libentry/oh-package.json5 | 6 + .../src/main/ets/MainAbility/MainAbility.ts | 80 + .../src/main/ets/components/CocosEditBox.ets | 82 + .../main/ets/components/CocosVideoPlayer.ets | 39 + .../src/main/ets/components/CocosWebview.ets | 43 + .../main/ets/components/TextInputDialog.ets | 33 + .../entry/src/main/ets/pages/Index.ets | 158 + .../entry/src/main/ets/workers/CocosWorker.ts | 79 + .../src/main/ets/workers/WorkerManager.ts | 34 + .../proj.ohos/entry/src/main/module.json5 | 69 + .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 20 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../resources/base/profile/main_pages.json | 5 + .../proj.ohos/hvigor/hvigor-config.json5 | 5 + .../js-tests/project/proj.ohos/hvigorfile.ts | 2 + .../libSysCapabilities/BuildProfile.ets | 17 + .../libSysCapabilities/build-profile.json5 | 28 + .../libSysCapabilities/consumer-rules.txt | 0 .../libSysCapabilities/hvigorfile.ts | 2 + .../proj.ohos/libSysCapabilities/index.ts | 15 + .../libSysCapabilities/obfuscation-rules.txt | 18 + .../libSysCapabilities/oh-package.json5 | 14 + .../src/main/ets/common/Constants.ts | 22 + .../src/main/ets/common/GlobalContext.ts | 25 + .../main/ets/components/dialog/DialogMsg.ts | 47 + .../ets/components/dialog/DialogWorker.ts | 29 + .../ets/components/editbox/CocosEditBox.ts | 111 + .../ets/components/editbox/EditBoxMsg.ets | 194 + .../ets/components/videoplayer/VideoPlayer.ts | 79 + .../components/videoplayer/VideoPlayerMsg.ets | 145 + .../main/ets/components/webview/WebView.ts | 114 + .../ets/components/webview/WebViewMsg.ets | 245 + .../src/main/ets/entity/Result.ts | 16 + .../main/ets/entity/TextInputDialogEntity.ts | 7 + .../src/main/ets/entity/WorkerMsgEntity.ts | 141 + .../src/main/ets/napi/NapiHelper.ts | 118 + .../src/main/ets/preferences/Preferences.ts | 218 + .../main/ets/system/appJump/JumpManager.ts | 19 + .../main/ets/system/appJump/JumpManagerMsg.ts | 31 + .../system/application/ApplicationManager.ts | 54 + .../src/main/ets/system/device/DeviceUtils.ts | 164 + .../ets/system/sensor/AccelerometerUtils.ts | 55 + .../src/main/ets/utils/Logger.ts | 27 + .../src/main/ets/utils/StringUtils.ts | 8 + .../src/main/ets/utils/WorkerMsgUtils.ets | 42 + .../libSysCapabilities/src/main/module.json5 | 10 + .../project/proj.ohos/oh-package.json5 | 10 + .../NetworkTest/WebSocketTest.js | 2 +- 182 files changed, 40823 insertions(+), 27 deletions(-) create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-32.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-64.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js-config.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js.msg create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Anchor.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallArgs.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallNonGenericMethod.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/CharacterEncoding.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Class.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Date.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/GCAPI.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/HashTable.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/HeapAPI.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Id.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/LegacyIntTypes.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/MemoryMetrics.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/OldDebugAPI.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Principals.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/ProfilingStack.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/PropertyKey.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/RequiredDefines.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/RootingAPI.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/SliceBudget.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/StructuredClone.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/TracingAPI.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/TypeDecls.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNode.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNodeTraverse.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Utility.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Value.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/Vector.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/js/WeakMapPtr.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsalloc.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsapi.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsbytecode.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsclist.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jscpucfg.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsfriendapi.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsperf.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsprf.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsprototypes.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsproxy.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jspubtd.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jstypes.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jsversion.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/jswrapper.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Alignment.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/AllocPolicy.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Array.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ArrayUtils.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Assertions.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Atomics.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Attributes.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BinarySearch.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BloomFilter.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Casting.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ChaosMode.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Char16.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/CheckedInt.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compiler.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compression.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Constants.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/DebugOnly.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Decimal.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Endian.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumSet.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumeratedArray.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/FloatingPoint.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/GuardObjects.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/HashFunctions.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerPrintfMacros.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerTypeTraits.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Likely.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinkedList.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinuxSignal.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MSIntTypes.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroArgs.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroForEach.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MathAlgorithms.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Maybe.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MaybeOneOf.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryChecking.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryReporting.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Move.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NullPtr.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NumericLimits.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Pair.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/PodOperations.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Poison.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Range.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RangedPtr.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ReentrancyGuard.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefCountType.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefPtr.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RollingMean.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SHA1.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Scoped.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SplayTree.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TaggedAnonymousMemory.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TemplateLib.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ThreadLocal.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ToString.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypeTraits.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnum.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumBits.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumInternal.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Types.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/UniquePtr.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Vector.h create mode 100644 frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/WeakPtr.h create mode 100644 frameworks/js-bindings/external/spidermonkey/prebuilt/ohos/libjs_static.a create mode 100644 samples/js-tests/project/proj.ohos/.gitignore create mode 100644 samples/js-tests/project/proj.ohos/AppScope/app.json5 create mode 100644 samples/js-tests/project/proj.ohos/AppScope/resources/base/element/string.json create mode 100644 samples/js-tests/project/proj.ohos/AppScope/resources/base/media/app_icon.png create mode 100644 samples/js-tests/project/proj.ohos/build-profile.json5 create mode 100644 samples/js-tests/project/proj.ohos/entry/.gitignore create mode 100644 samples/js-tests/project/proj.ohos/entry/build-profile.json5 create mode 100644 samples/js-tests/project/proj.ohos/entry/hvigorfile.ts create mode 100644 samples/js-tests/project/proj.ohos/entry/obfuscation-rules.txt create mode 100644 samples/js-tests/project/proj.ohos/entry/oh-package.json5 create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/cpp/CMakeLists.txt create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/cpp/main.cpp create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ts create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosEditBox.ets create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosVideoPlayer.ets create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/components/TextInputDialog.ets create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/pages/Index.ets create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ts create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ts create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/module.json5 create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/color.json create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/string.json create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/resources/base/media/icon.png create mode 100644 samples/js-tests/project/proj.ohos/entry/src/main/resources/base/profile/main_pages.json create mode 100644 samples/js-tests/project/proj.ohos/hvigor/hvigor-config.json5 create mode 100644 samples/js-tests/project/proj.ohos/hvigorfile.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/BuildProfile.ets create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/build-profile.json5 create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/consumer-rules.txt create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/hvigorfile.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/index.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/obfuscation-rules.txt create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/oh-package.json5 create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/Constants.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/GlobalContext.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogMsg.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogWorker.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/CocosEditBox.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/EditBoxMsg.ets create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayerMsg.ets create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/WorkerMsgEntity.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/Logger.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ts create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/WorkerMsgUtils.ets create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/module.json5 create mode 100644 samples/js-tests/project/proj.ohos/oh-package.json5 diff --git a/.gitignore b/.gitignore index df04587784..fb0ba87996 100644 --- a/.gitignore +++ b/.gitignore @@ -110,5 +110,6 @@ frameworks/js-bindings/bindings/proj.ios_mac/build/ # Ignore files copied in compilation samples/*/project/proj.android/src +frameworks/js-bindings/cocos2d-x/* *.jsc diff --git a/frameworks/js-bindings/bindings/CMakeLists.txt b/frameworks/js-bindings/bindings/CMakeLists.txt index 7b56b7535d..ba590acf1b 100644 --- a/frameworks/js-bindings/bindings/CMakeLists.txt +++ b/frameworks/js-bindings/bindings/CMakeLists.txt @@ -27,6 +27,8 @@ if(WIN32) # Win32 set(PLATFORM_FOLDER win32) elseif(APPLE)# osx or ios set(PLATFORM_FOLDER mac) +elseif(OHOS) + set(PLATFORM_FOLDER ohos) else() # Assume Linux set(PLATFORM_FOLDER linux) endif() @@ -67,7 +69,6 @@ set(JSBINDING_SRC manual/3d/jsb_cocos2dx_3d_manual.cpp ../cocos2d-x/cocos/storage/local-storage/LocalStorage.cpp ) - include_directories( auto manual @@ -89,6 +90,17 @@ include_directories( ../cocos2d-x/cocos/editor-support/cocostudio ../cocos2d-x/external/chipmunk/include/chipmunk ) +if(OHOS) + include_directories( + ../cocos2d-x/cocos + ../cocos2d-x/external/sqlite3/include + ) + add_library(sqlite3 STATIC IMPORTED) + set_target_properties(sqlite3 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../cocos2d-x/external/sqlite3/libraries/ohos/libsqlite3.a) + + add_library(js_static STATIC IMPORTED) + set_target_properties(js_static PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../external/spidermonkey/prebuilt/ohos/libjs_static.a) +endif() add_library(jsbindings STATIC ${JSBINDING_SRC} diff --git a/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp b/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp index 935d212a2d..0f00d92b14 100644 --- a/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp +++ b/frameworks/js-bindings/bindings/manual/ScriptingCore.cpp @@ -351,6 +351,8 @@ bool JSBCore_os(JSContext *cx, uint32_t argc, jsval *vp) os = JS_InternString(cx, "WP8"); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) os = JS_InternString(cx, "WINRT"); +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_OHOS) + os = JS_InternString(cx, "OHOS"); #else os = JS_InternString(cx, "Unknown"); #endif @@ -684,7 +686,7 @@ void ScriptingCore::compileScript(const char *path, JSObject* global, JSContext* op.setFileAndLine(fullPath.c_str(), 1); bool ok = false; -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID )|| (CC_TARGET_PLATFORM == CC_PLATFORM_OHOS) std::string jsFileContent = futil->getStringFromFile(fullPath); if (!jsFileContent.empty()) { diff --git a/frameworks/js-bindings/bindings/manual/localstorage/js_bindings_system_functions.cpp b/frameworks/js-bindings/bindings/manual/localstorage/js_bindings_system_functions.cpp index 6fe52144c3..8c60a09c19 100644 --- a/frameworks/js-bindings/bindings/manual/localstorage/js_bindings_system_functions.cpp +++ b/frameworks/js-bindings/bindings/manual/localstorage/js_bindings_system_functions.cpp @@ -23,7 +23,7 @@ bool JSB_localStorageGetItem(JSContext *cx, uint32_t argc, jsval *vp) { ok &= jsval_to_std_string( cx, args.get(0), &arg0 ); JSB_PRECONDITION2(ok, cx, false, "Error processing arguments"); std::string ret_val; - +#if(CC_TARGET_PLATFORM != CC_PLATFORM_OHOS) ok = localStorageGetItem(arg0, &ret_val); if (ok) { jsval ret_jsval = std_string_to_jsval(cx, ret_val); @@ -32,7 +32,11 @@ bool JSB_localStorageGetItem(JSContext *cx, uint32_t argc, jsval *vp) { else { args.rval().set(JSVAL_NULL); } - +#else + ret_val = localStorageGetItem(arg0); + jsval ret_jsval = std_string_to_jsval(cx, ret_val); + args.rval().set(ret_jsval); +#endif return true; } diff --git a/frameworks/js-bindings/bindings/script/jsb_boot.js b/frameworks/js-bindings/bindings/script/jsb_boot.js index 5c5893793c..f3aee8bf5f 100644 --- a/frameworks/js-bindings/bindings/script/jsb_boot.js +++ b/frameworks/js-bindings/bindings/script/jsb_boot.js @@ -1244,6 +1244,13 @@ cc._initSys = function(config, CONFIG_KEY){ * @type {string} */ sys.OS_WINRT = "WINRT"; + /** + * @memberof cc.sys + * @name OS_OH + * @constant + * @type {string} + */ + sys.OS_OHOS = "OHOS"; /** * @memberof cc.sys * @name OS_UNKNOWN @@ -1372,6 +1379,14 @@ cc._initSys = function(config, CONFIG_KEY){ * @type {Number} */ sys.WINRT = 14; + /** + * @memberof cc.sys + * @name OH + * @constant + * @default + * @type {Number} + */ + sys.OHOS = 15; /** * @constant * @default @@ -1454,7 +1469,7 @@ cc._initSys = function(config, CONFIG_KEY){ cc.log(str); } - locSys.isMobile = (locSys.os == locSys.OS_ANDROID || locSys.os == locSys.OS_IOS || locSys.os == locSys.OS_WP8 || locSys.os == locSys.OS_WINRT) ? true : false; + locSys.isMobile = (locSys.os == locSys.OS_OHOS ||locSys.os == locSys.OS_ANDROID || locSys.os == locSys.OS_IOS || locSys.os == locSys.OS_WP8 || locSys.os == locSys.OS_WINRT) ? true : false; locSys.language = (function(){ var language = cc.Application.getInstance().getCurrentLanguage(); diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-32.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-32.h new file mode 100644 index 0000000000..2cedc513e7 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-32.h @@ -0,0 +1,53 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sw=4 et tw=78: + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_config_h +#define js_config_h + +/* Definitions set at build time that affect SpiderMonkey's public API. + This header file is generated by the SpiderMonkey configure script, + and installed along with jsapi.h. */ + +/* Define to 1 if SpiderMonkey is in debug mode. */ +/* #undef JS_DEBUG */ + +/* Define to 1 if SpiderMonkey should not use struct types in debug builds. */ +/* #undef JS_NO_JSVAL_JSID_STRUCT_TYPES */ + +/* Define to 1 if SpiderMonkey should support multi-threaded clients. */ +/* #undef JS_THREADSAFE */ + +/* Define to 1 if SpiderMonkey should include ctypes support. */ +/* #undef JS_HAS_CTYPES */ + +/* Define to 1 if SpiderMonkey should support the ability to perform + entirely too much GC. */ +/* #undef JS_GC_ZEAL */ + +/* Define to 1 if the header is present and + useable. See jscpucfg.h. */ +#define JS_HAVE_ENDIAN_H 1 + +/* Define to 1 if the header is present and + useable. See jscpucfg.h. */ +#define JS_HAVE_MACHINE_ENDIAN_H 1 + +/* Define to 1 if the header is present and + useable. See jscpucfg.h. */ +/* #undef JS_HAVE_SYS_ISA_DEFS_H */ + +/* Define to 1 if SpiderMonkey is in NUNBOX32 mode. */ +#define JS_NUNBOX32 1 + +/* Define to 1 if SpiderMonkey is in PUNBOX64 mode. */ +/* #undef JS_PUNBOX64 */ + +/* MOZILLA JSAPI version number components */ +#define MOZJS_MAJOR_VERSION 33 +#define MOZJS_MINOR_VERSION 1 + +#endif /* js_config_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-64.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-64.h new file mode 100644 index 0000000000..b0977e896a --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config-64.h @@ -0,0 +1,53 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sw=4 et tw=78: + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_config_h +#define js_config_h + +/* Definitions set at build time that affect SpiderMonkey's public API. + This header file is generated by the SpiderMonkey configure script, + and installed along with jsapi.h. */ + +/* Define to 1 if SpiderMonkey is in debug mode. */ +/* #undef JS_DEBUG */ + +/* Define to 1 if SpiderMonkey should not use struct types in debug builds. */ +/* #undef JS_NO_JSVAL_JSID_STRUCT_TYPES */ + +/* Define to 1 if SpiderMonkey should support multi-threaded clients. */ +/* #undef JS_THREADSAFE */ + +/* Define to 1 if SpiderMonkey should include ctypes support. */ +/* #undef JS_HAS_CTYPES */ + +/* Define to 1 if SpiderMonkey should support the ability to perform + entirely too much GC. */ +/* #undef JS_GC_ZEAL */ + +/* Define to 1 if the header is present and + useable. See jscpucfg.h. */ +#define JS_HAVE_ENDIAN_H 1 + +/* Define to 1 if the header is present and + useable. See jscpucfg.h. */ +#define JS_HAVE_MACHINE_ENDIAN_H 1 + +/* Define to 1 if the header is present and + useable. See jscpucfg.h. */ +/* #undef JS_HAVE_SYS_ISA_DEFS_H */ + +/* Define to 1 if SpiderMonkey is in NUNBOX32 mode. */ +/* #undef JS_NUNBOX32 */ + +/* Define to 1 if SpiderMonkey is in PUNBOX64 mode. */ +#define JS_PUNBOX64 1 + +/* MOZILLA JSAPI version number components */ +#define MOZJS_MAJOR_VERSION 33 +#define MOZJS_MINOR_VERSION 1 + +#endif /* js_config_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config.h new file mode 100644 index 0000000000..a1ded849ae --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js-config.h @@ -0,0 +1,5 @@ +#if defined(__LP64__) && __LP64__ +#include"js-config-64.h" +#else +#include"js-config-32.h" +#endif diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js.msg b/frameworks/js-bindings/external/spidermonkey/include/ohos/js.msg new file mode 100644 index 0000000000..d342ad4506 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js.msg @@ -0,0 +1,443 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * This is the JavaScript error message file. + * + * The format for each JS error message is: + * + * MSG_DEF(, , , , + * ) + * + * where ; + * is a legal C identifer that will be used in the + * JS engine source. + * + * is an unique integral value identifying this error. + * + * is an integer literal specifying the total number of + * replaceable arguments in the following format string. + * + * is an exception index from the enum in jsexn.c; + * JSEXN_NONE for none. The given exception index will be raised by the + * engine when the corresponding error occurs. + * + * is a string literal, optionally containing sequences + * {X} where X is an integer representing the argument number that will + * be replaced with a string value when the error is reported. + * + * e.g. + * + * MSG_DEF(JSMSG_NOT_A_SUBSPECIES, 73, JSEXN_NONE, 2, + * "{0} is not a member of the {1} family") + * + * can be used: + * + * JS_ReportErrorNumber(JSMSG_NOT_A_SUBSPECIES, "Rhino", "Monkey"); + * + * to report: + * + * "Rhino is not a member of the Monkey family" + * + * When removing MSG_DEFs, convert them to JSMSG_UNUSED placeholders: + * + * MSG_DEF(JSMSG_UNUSED7, 7, 0, JSEXN_NONE, "") + * + * Before adding a new MSG_DEF at the end, look for existing JSMSG_UNUSED + * free index placeholders in the middle of the list. + */ + +MSG_DEF(JSMSG_NOT_AN_ERROR, 0, 0, JSEXN_NONE, "") +MSG_DEF(JSMSG_NOT_DEFINED, 1, 1, JSEXN_REFERENCEERR, "{0} is not defined") +MSG_DEF(JSMSG_INACTIVE, 2, 0, JSEXN_INTERNALERR, "nothing active on context") +MSG_DEF(JSMSG_MORE_ARGS_NEEDED, 3, 3, JSEXN_TYPEERR, "{0} requires more than {1} argument{2}") +MSG_DEF(JSMSG_BAD_CHAR, 4, 1, JSEXN_INTERNALERR, "invalid format character {0}") +MSG_DEF(JSMSG_BAD_TYPE, 5, 1, JSEXN_TYPEERR, "unknown type {0}") +MSG_DEF(JSMSG_ALLOC_OVERFLOW, 6, 0, JSEXN_INTERNALERR, "allocation size overflow") +MSG_DEF(JSMSG_MISSING_HEXDIGITS, 7, 0, JSEXN_SYNTAXERR, "missing hexadecimal digits after '0x'") +MSG_DEF(JSMSG_INCOMPATIBLE_PROTO, 8, 3, JSEXN_TYPEERR, "{0}.prototype.{1} called on incompatible {2}") +MSG_DEF(JSMSG_NO_CONSTRUCTOR, 9, 1, JSEXN_TYPEERR, "{0} has no constructor") +MSG_DEF(JSMSG_CANT_ALIAS, 10, 3, JSEXN_TYPEERR, "can't alias {0} to {1} in class {2}") +MSG_DEF(JSMSG_NOT_SCRIPTED_FUNCTION, 11, 1, JSEXN_TYPEERR, "{0} is not a scripted function") +MSG_DEF(JSMSG_BAD_SORT_ARG, 12, 0, JSEXN_TYPEERR, "invalid Array.prototype.sort argument") +MSG_DEF(JSMSG_BAD_ATOMIC_NUMBER, 13, 1, JSEXN_INTERNALERR, "internal error: no index for atom {0}") +MSG_DEF(JSMSG_TOO_MANY_LITERALS, 14, 0, JSEXN_INTERNALERR, "too many literals") +MSG_DEF(JSMSG_CANT_WATCH, 15, 1, JSEXN_TYPEERR, "can't watch non-native objects of class {0}") +MSG_DEF(JSMSG_STACK_UNDERFLOW, 16, 2, JSEXN_INTERNALERR, "internal error compiling {0}: stack underflow at pc {1}") +MSG_DEF(JSMSG_NEED_DIET, 17, 1, JSEXN_INTERNALERR, "{0} too large") +MSG_DEF(JSMSG_TOO_MANY_LOCAL_ROOTS, 18, 0, JSEXN_ERR, "out of local root space") +MSG_DEF(JSMSG_READ_ONLY, 19, 1, JSEXN_TYPEERR, "{0} is read-only") +MSG_DEF(JSMSG_BAD_FORMAL, 20, 0, JSEXN_SYNTAXERR, "malformed formal parameter") +MSG_DEF(JSMSG_CANT_DELETE, 21, 1, JSEXN_TYPEERR, "property {0} is non-configurable and can't be deleted") +MSG_DEF(JSMSG_NOT_FUNCTION, 22, 1, JSEXN_TYPEERR, "{0} is not a function") +MSG_DEF(JSMSG_NOT_CONSTRUCTOR, 23, 1, JSEXN_TYPEERR, "{0} is not a constructor") +MSG_DEF(JSMSG_INVALID_DATE, 24, 0, JSEXN_RANGEERR, "invalid date") +MSG_DEF(JSMSG_TOO_DEEP, 25, 1, JSEXN_INTERNALERR, "{0} nested too deeply") +MSG_DEF(JSMSG_OVER_RECURSED, 26, 0, JSEXN_INTERNALERR, "too much recursion") +MSG_DEF(JSMSG_IN_NOT_OBJECT, 27, 1, JSEXN_TYPEERR, "invalid 'in' operand {0}") +MSG_DEF(JSMSG_BAD_NEW_RESULT, 28, 1, JSEXN_TYPEERR, "invalid new expression result {0}") +MSG_DEF(JSMSG_OBJECT_ACCESS_DENIED, 29, 0, JSEXN_ERR, "Permission denied to access object") +MSG_DEF(JSMSG_PROPERTY_ACCESS_DENIED, 30, 1, JSEXN_ERR, "Permission denied to access property '{0}'") +MSG_DEF(JSMSG_BAD_INSTANCEOF_RHS, 31, 1, JSEXN_TYPEERR, "invalid 'instanceof' operand {0}") +MSG_DEF(JSMSG_BAD_BYTECODE, 32, 1, JSEXN_INTERNALERR, "unimplemented JavaScript bytecode {0}") +MSG_DEF(JSMSG_BAD_RADIX, 33, 0, JSEXN_RANGEERR, "radix must be an integer at least 2 and no greater than 36") +MSG_DEF(JSMSG_PAREN_BEFORE_LET, 34, 0, JSEXN_SYNTAXERR, "missing ( before let head") +MSG_DEF(JSMSG_CANT_CONVERT, 35, 1, JSEXN_ERR, "can't convert {0} to an integer") +MSG_DEF(JSMSG_CYCLIC_VALUE, 36, 1, JSEXN_TYPEERR, "cyclic {0} value") +MSG_DEF(JSMSG_COMPILE_EXECED_SCRIPT, 37, 0, JSEXN_TYPEERR, "can't compile over a script that is currently executing") +MSG_DEF(JSMSG_CANT_CONVERT_TO, 38, 2, JSEXN_TYPEERR, "can't convert {0} to {1}") +MSG_DEF(JSMSG_NO_PROPERTIES, 39, 1, JSEXN_TYPEERR, "{0} has no properties") +MSG_DEF(JSMSG_CANT_FIND_CLASS, 40, 1, JSEXN_TYPEERR, "can't find class id {0}") +MSG_DEF(JSMSG_DEAD_OBJECT, 41, 0, JSEXN_TYPEERR, "can't access dead object") +MSG_DEF(JSMSG_BYTECODE_TOO_BIG, 42, 2, JSEXN_INTERNALERR, "bytecode {0} too large (limit {1})") +MSG_DEF(JSMSG_UNKNOWN_FORMAT, 43, 1, JSEXN_INTERNALERR, "unknown bytecode format {0}") +MSG_DEF(JSMSG_TOO_MANY_CON_ARGS, 44, 0, JSEXN_SYNTAXERR, "too many constructor arguments") +MSG_DEF(JSMSG_TOO_MANY_FUN_ARGS, 45, 0, JSEXN_SYNTAXERR, "too many function arguments") +MSG_DEF(JSMSG_BAD_QUANTIFIER, 46, 0, JSEXN_SYNTAXERR, "invalid quantifier") +MSG_DEF(JSMSG_MIN_TOO_BIG, 47, 1, JSEXN_SYNTAXERR, "overlarge minimum {0}") +MSG_DEF(JSMSG_MAX_TOO_BIG, 48, 1, JSEXN_SYNTAXERR, "overlarge maximum {0}") +MSG_DEF(JSMSG_OUT_OF_ORDER, 49, 1, JSEXN_SYNTAXERR, "maximum {0} less than minimum") +MSG_DEF(JSMSG_BAD_DESTRUCT_DECL, 50, 0, JSEXN_SYNTAXERR, "missing = in destructuring declaration") +MSG_DEF(JSMSG_BAD_DESTRUCT_ASS, 51, 0, JSEXN_REFERENCEERR, "invalid destructuring assignment operator") +MSG_DEF(JSMSG_PAREN_AFTER_LET, 52, 0, JSEXN_SYNTAXERR, "missing ) after let head") +MSG_DEF(JSMSG_CURLY_AFTER_LET, 53, 0, JSEXN_SYNTAXERR, "missing } after let block") +MSG_DEF(JSMSG_MISSING_PAREN, 54, 0, JSEXN_SYNTAXERR, "unterminated parenthetical") +MSG_DEF(JSMSG_UNTERM_CLASS, 55, 0, JSEXN_SYNTAXERR, "unterminated character class") +MSG_DEF(JSMSG_TRAILING_SLASH, 56, 0, JSEXN_SYNTAXERR, "trailing \\ in regular expression") +MSG_DEF(JSMSG_BAD_CLASS_RANGE, 57, 0, JSEXN_SYNTAXERR, "invalid range in character class") +MSG_DEF(JSMSG_BAD_REGEXP_FLAG, 58, 1, JSEXN_SYNTAXERR, "invalid regular expression flag {0}") +MSG_DEF(JSMSG_NO_INPUT, 59, 5, JSEXN_SYNTAXERR, "no input for /{0}/{1}{2}{3}{4}") +MSG_DEF(JSMSG_CANT_OPEN, 60, 2, JSEXN_ERR, "can't open {0}: {1}") +MSG_DEF(JSMSG_TOO_MANY_FUN_APPLY_ARGS, 61, 0, JSEXN_RANGEERR, "arguments array passed to Function.prototype.apply is too large") +MSG_DEF(JSMSG_UNMATCHED_RIGHT_PAREN, 62, 0, JSEXN_SYNTAXERR, "unmatched ) in regular expression") +MSG_DEF(JSMSG_TOO_BIG_TO_ENCODE, 63, 0, JSEXN_INTERNALERR, "data are to big to encode") +MSG_DEF(JSMSG_ARG_INDEX_OUT_OF_RANGE, 64, 1, JSEXN_RANGEERR, "argument {0} accesses an index that is out of range") +MSG_DEF(JSMSG_SPREAD_TOO_LARGE, 65, 0, JSEXN_RANGEERR, "array too large due to spread operand(s)") +MSG_DEF(JSMSG_SOURCE_TOO_LONG, 66, 0, JSEXN_RANGEERR, "source is too long") +MSG_DEF(JSMSG_BAD_WEAKMAP_KEY, 67, 0, JSEXN_TYPEERR, "cannot use the given object as a weak map key") +MSG_DEF(JSMSG_BAD_SCRIPT_MAGIC, 68, 0, JSEXN_INTERNALERR, "bad script XDR magic number") +MSG_DEF(JSMSG_PAREN_BEFORE_FORMAL, 69, 0, JSEXN_SYNTAXERR, "missing ( before formal parameters") +MSG_DEF(JSMSG_MISSING_FORMAL, 70, 0, JSEXN_SYNTAXERR, "missing formal parameter") +MSG_DEF(JSMSG_PAREN_AFTER_FORMAL, 71, 0, JSEXN_SYNTAXERR, "missing ) after formal parameters") +MSG_DEF(JSMSG_CURLY_BEFORE_BODY, 72, 0, JSEXN_SYNTAXERR, "missing { before function body") +MSG_DEF(JSMSG_CURLY_AFTER_BODY, 73, 0, JSEXN_SYNTAXERR, "missing } after function body") +MSG_DEF(JSMSG_PAREN_BEFORE_COND, 74, 0, JSEXN_SYNTAXERR, "missing ( before condition") +MSG_DEF(JSMSG_PAREN_AFTER_COND, 75, 0, JSEXN_SYNTAXERR, "missing ) after condition") +MSG_DEF(JSMSG_BAD_DUP_ARGS, 76, 0, JSEXN_SYNTAXERR, "duplicate argument names not allowed in this context") +MSG_DEF(JSMSG_NAME_AFTER_DOT, 77, 0, JSEXN_SYNTAXERR, "missing name after . operator") +MSG_DEF(JSMSG_BRACKET_IN_INDEX, 78, 0, JSEXN_SYNTAXERR, "missing ] in index expression") +MSG_DEF(JSMSG_ACCESSOR_DEF_DENIED, 79, 1, JSEXN_ERR, "Permission denied to define accessor property '{0}'") +MSG_DEF(JSMSG_PAREN_BEFORE_SWITCH, 80, 0, JSEXN_SYNTAXERR, "missing ( before switch expression") +MSG_DEF(JSMSG_PAREN_AFTER_SWITCH, 81, 0, JSEXN_SYNTAXERR, "missing ) after switch expression") +MSG_DEF(JSMSG_CURLY_BEFORE_SWITCH, 82, 0, JSEXN_SYNTAXERR, "missing { before switch body") +MSG_DEF(JSMSG_COLON_AFTER_CASE, 83, 0, JSEXN_SYNTAXERR, "missing : after case label") +MSG_DEF(JSMSG_WHILE_AFTER_DO, 84, 0, JSEXN_SYNTAXERR, "missing while after do-loop body") +MSG_DEF(JSMSG_PAREN_AFTER_FOR, 85, 0, JSEXN_SYNTAXERR, "missing ( after for") +MSG_DEF(JSMSG_SEMI_AFTER_FOR_INIT, 86, 0, JSEXN_SYNTAXERR, "missing ; after for-loop initializer") +MSG_DEF(JSMSG_SEMI_AFTER_FOR_COND, 87, 0, JSEXN_SYNTAXERR, "missing ; after for-loop condition") +MSG_DEF(JSMSG_PAREN_AFTER_FOR_CTRL, 88, 0, JSEXN_SYNTAXERR, "missing ) after for-loop control") +MSG_DEF(JSMSG_CURLY_BEFORE_TRY, 89, 0, JSEXN_SYNTAXERR, "missing { before try block") +MSG_DEF(JSMSG_CURLY_AFTER_TRY, 90, 0, JSEXN_SYNTAXERR, "missing } after try block") +MSG_DEF(JSMSG_PAREN_BEFORE_CATCH, 91, 0, JSEXN_SYNTAXERR, "missing ( before catch") +MSG_DEF(JSMSG_CATCH_IDENTIFIER, 92, 0, JSEXN_SYNTAXERR, "missing identifier in catch") +MSG_DEF(JSMSG_PAREN_AFTER_CATCH, 93, 0, JSEXN_SYNTAXERR, "missing ) after catch") +MSG_DEF(JSMSG_CURLY_BEFORE_CATCH, 94, 0, JSEXN_SYNTAXERR, "missing { before catch block") +MSG_DEF(JSMSG_CURLY_AFTER_CATCH, 95, 0, JSEXN_SYNTAXERR, "missing } after catch block") +MSG_DEF(JSMSG_CURLY_BEFORE_FINALLY, 96, 0, JSEXN_SYNTAXERR, "missing { before finally block") +MSG_DEF(JSMSG_CURLY_AFTER_FINALLY, 97, 0, JSEXN_SYNTAXERR, "missing } after finally block") +MSG_DEF(JSMSG_CATCH_OR_FINALLY, 98, 0, JSEXN_SYNTAXERR, "missing catch or finally after try") +MSG_DEF(JSMSG_PAREN_BEFORE_WITH, 99, 0, JSEXN_SYNTAXERR, "missing ( before with-statement object") +MSG_DEF(JSMSG_PAREN_AFTER_WITH, 100, 0, JSEXN_SYNTAXERR, "missing ) after with-statement object") +MSG_DEF(JSMSG_CURLY_IN_COMPOUND, 101, 0, JSEXN_SYNTAXERR, "missing } in compound statement") +MSG_DEF(JSMSG_NO_VARIABLE_NAME, 102, 0, JSEXN_SYNTAXERR, "missing variable name") +MSG_DEF(JSMSG_COLON_IN_COND, 103, 0, JSEXN_SYNTAXERR, "missing : in conditional expression") +MSG_DEF(JSMSG_PAREN_AFTER_ARGS, 104, 0, JSEXN_SYNTAXERR, "missing ) after argument list") +MSG_DEF(JSMSG_BRACKET_AFTER_LIST, 105, 0, JSEXN_SYNTAXERR, "missing ] after element list") +MSG_DEF(JSMSG_COLON_AFTER_ID, 106, 0, JSEXN_SYNTAXERR, "missing : after property id") +MSG_DEF(JSMSG_CURLY_AFTER_LIST, 107, 0, JSEXN_SYNTAXERR, "missing } after property list") +MSG_DEF(JSMSG_PAREN_IN_PAREN, 108, 0, JSEXN_SYNTAXERR, "missing ) in parenthetical") +MSG_DEF(JSMSG_SEMI_BEFORE_STMNT, 109, 0, JSEXN_SYNTAXERR, "missing ; before statement") +MSG_DEF(JSMSG_NO_RETURN_VALUE, 110, 1, JSEXN_TYPEERR, "function {0} does not always return a value") +MSG_DEF(JSMSG_DUPLICATE_FORMAL, 111, 1, JSEXN_SYNTAXERR, "duplicate formal argument {0}") +MSG_DEF(JSMSG_EQUAL_AS_ASSIGN, 112, 0, JSEXN_SYNTAXERR, "test for equality (==) mistyped as assignment (=)?") +MSG_DEF(JSMSG_OPTIMIZED_CLOSURE_LEAK, 113, 0, JSEXN_INTERNALERR, "can't access optimized closure") +MSG_DEF(JSMSG_TOO_MANY_DEFAULTS, 114, 0, JSEXN_SYNTAXERR, "more than one switch default") +MSG_DEF(JSMSG_TOO_MANY_CASES, 115, 0, JSEXN_INTERNALERR, "too many switch cases") +MSG_DEF(JSMSG_BAD_SWITCH, 116, 0, JSEXN_SYNTAXERR, "invalid switch statement") +MSG_DEF(JSMSG_BAD_FOR_LEFTSIDE, 117, 0, JSEXN_SYNTAXERR, "invalid for/in left-hand side") +MSG_DEF(JSMSG_CATCH_AFTER_GENERAL, 118, 0, JSEXN_SYNTAXERR, "catch after unconditional catch") +MSG_DEF(JSMSG_CATCH_WITHOUT_TRY, 119, 0, JSEXN_SYNTAXERR, "catch without try") +MSG_DEF(JSMSG_FINALLY_WITHOUT_TRY, 120, 0, JSEXN_SYNTAXERR, "finally without try") +MSG_DEF(JSMSG_LABEL_NOT_FOUND, 121, 0, JSEXN_SYNTAXERR, "label not found") +MSG_DEF(JSMSG_TOUGH_BREAK, 122, 0, JSEXN_SYNTAXERR, "unlabeled break must be inside loop or switch") +MSG_DEF(JSMSG_BAD_CONTINUE, 123, 0, JSEXN_SYNTAXERR, "continue must be inside loop") +MSG_DEF(JSMSG_BAD_RETURN_OR_YIELD, 124, 1, JSEXN_SYNTAXERR, "{0} not in function") +MSG_DEF(JSMSG_BAD_LABEL, 125, 0, JSEXN_SYNTAXERR, "invalid label") +MSG_DEF(JSMSG_DUPLICATE_LABEL, 126, 0, JSEXN_SYNTAXERR, "duplicate label") +MSG_DEF(JSMSG_VAR_HIDES_ARG, 127, 1, JSEXN_TYPEERR, "variable {0} redeclares argument") +MSG_DEF(JSMSG_BAD_VAR_INIT, 128, 0, JSEXN_SYNTAXERR, "invalid variable initialization") +MSG_DEF(JSMSG_BAD_LEFTSIDE_OF_ASS, 129, 0, JSEXN_REFERENCEERR, "invalid assignment left-hand side") +MSG_DEF(JSMSG_BAD_OPERAND, 130, 1, JSEXN_SYNTAXERR, "invalid {0} operand") +MSG_DEF(JSMSG_BAD_PROP_ID, 131, 0, JSEXN_SYNTAXERR, "invalid property id") +MSG_DEF(JSMSG_RESERVED_ID, 132, 1, JSEXN_SYNTAXERR, "{0} is a reserved identifier") +MSG_DEF(JSMSG_SYNTAX_ERROR, 133, 0, JSEXN_SYNTAXERR, "syntax error") +MSG_DEF(JSMSG_MISSING_BINARY_DIGITS, 134, 0, JSEXN_SYNTAXERR, "missing binary digits after '0b'") +MSG_DEF(JSMSG_BAD_PROTOTYPE, 135, 1, JSEXN_TYPEERR, "'prototype' property of {0} is not an object") +MSG_DEF(JSMSG_MISSING_EXPONENT, 136, 0, JSEXN_SYNTAXERR, "missing exponent") +MSG_DEF(JSMSG_OUT_OF_MEMORY, 137, 0, JSEXN_ERR, "out of memory") +MSG_DEF(JSMSG_UNTERMINATED_STRING, 138, 0, JSEXN_SYNTAXERR, "unterminated string literal") +MSG_DEF(JSMSG_TOO_MANY_PARENS, 139, 0, JSEXN_INTERNALERR, "too many parentheses in regular expression") +MSG_DEF(JSMSG_UNTERMINATED_COMMENT, 140, 0, JSEXN_SYNTAXERR, "unterminated comment") +MSG_DEF(JSMSG_UNTERMINATED_REGEXP, 141, 0, JSEXN_SYNTAXERR, "unterminated regular expression literal") +MSG_DEF(JSMSG_BAD_CLONE_FUNOBJ_SCOPE, 142, 0, JSEXN_TYPEERR, "bad cloned function scope chain") +MSG_DEF(JSMSG_MISSING_OCTAL_DIGITS, 143, 0, JSEXN_SYNTAXERR, "missing octal digits after '0o'") +MSG_DEF(JSMSG_ILLEGAL_CHARACTER, 144, 0, JSEXN_SYNTAXERR, "illegal character") +MSG_DEF(JSMSG_BAD_OCTAL, 145, 1, JSEXN_SYNTAXERR, "{0} is not a legal ECMA-262 octal constant") +MSG_DEF(JSMSG_RESULTING_STRING_TOO_LARGE, 146, 0, JSEXN_RANGEERR, "repeat count must be less than infinity and not overflow maximum string size") +MSG_DEF(JSMSG_UNCAUGHT_EXCEPTION, 147, 1, JSEXN_INTERNALERR, "uncaught exception: {0}") +MSG_DEF(JSMSG_INVALID_BACKREF, 148, 0, JSEXN_SYNTAXERR, "non-octal digit in an escape sequence that doesn't match a back-reference") +MSG_DEF(JSMSG_BAD_BACKREF, 149, 0, JSEXN_SYNTAXERR, "back-reference exceeds number of capturing parentheses") +MSG_DEF(JSMSG_PRECISION_RANGE, 150, 1, JSEXN_RANGEERR, "precision {0} out of range") +MSG_DEF(JSMSG_BAD_GETTER_OR_SETTER, 151, 1, JSEXN_TYPEERR, "invalid {0} usage") +MSG_DEF(JSMSG_BAD_ARRAY_LENGTH, 152, 0, JSEXN_RANGEERR, "invalid array length") +MSG_DEF(JSMSG_CANT_DESCRIBE_PROPS, 153, 1, JSEXN_TYPEERR, "can't describe non-native properties of class {0}") +MSG_DEF(JSMSG_BAD_APPLY_ARGS, 154, 1, JSEXN_TYPEERR, "second argument to Function.prototype.{0} must be an array") +MSG_DEF(JSMSG_REDECLARED_VAR, 155, 2, JSEXN_TYPEERR, "redeclaration of {0} {1}") +MSG_DEF(JSMSG_UNDECLARED_VAR, 156, 1, JSEXN_REFERENCEERR, "assignment to undeclared variable {0}") +MSG_DEF(JSMSG_ANON_NO_RETURN_VALUE, 157, 0, JSEXN_TYPEERR, "anonymous function does not always return a value") +MSG_DEF(JSMSG_DEPRECATED_USAGE, 158, 1, JSEXN_REFERENCEERR, "deprecated {0} usage") +MSG_DEF(JSMSG_BAD_URI, 159, 0, JSEXN_URIERR, "malformed URI sequence") +MSG_DEF(JSMSG_GETTER_ONLY, 160, 0, JSEXN_TYPEERR, "setting a property that has only a getter") +MSG_DEF(JSMSG_IDSTART_AFTER_NUMBER, 161, 0, JSEXN_SYNTAXERR, "identifier starts immediately after numeric literal") +MSG_DEF(JSMSG_UNDEFINED_PROP, 162, 1, JSEXN_REFERENCEERR, "reference to undefined property {0}") +MSG_DEF(JSMSG_USELESS_EXPR, 163, 0, JSEXN_TYPEERR, "useless expression") +MSG_DEF(JSMSG_REDECLARED_PARAM, 164, 1, JSEXN_TYPEERR, "redeclaration of formal parameter {0}") +MSG_DEF(JSMSG_NEWREGEXP_FLAGGED, 165, 0, JSEXN_TYPEERR, "can't supply flags when constructing one RegExp from another") +MSG_DEF(JSMSG_RESERVED_SLOT_RANGE, 166, 0, JSEXN_RANGEERR, "reserved slot index out of range") +MSG_DEF(JSMSG_CANT_DECODE_PRINCIPALS, 167, 0, JSEXN_INTERNALERR, "can't decode JSPrincipals") +MSG_DEF(JSMSG_CANT_SEAL_OBJECT, 168, 1, JSEXN_ERR, "can't seal {0} objects") +MSG_DEF(JSMSG_TOO_MANY_CATCH_VARS, 169, 0, JSEXN_SYNTAXERR, "too many catch variables") +MSG_DEF(JSMSG_NEGATIVE_REPETITION_COUNT, 170, 0, JSEXN_RANGEERR, "repeat count must be non-negative") +MSG_DEF(JSMSG_INVALID_FOR_OF_INIT, 171, 0, JSEXN_SYNTAXERR, "for-of loop variable declaration may not have an initializer") +MSG_DEF(JSMSG_INVALID_MAP_ITERABLE, 172, 0, JSEXN_TYPEERR, "iterable for map should have array-like objects") +MSG_DEF(JSMSG_NOT_A_CODEPOINT, 173, 1, JSEXN_RANGEERR, "{0} is not a valid code point") +MSG_DEF(JSMSG_BRACKET_AFTER_ARRAY_COMPREHENSION, 174, 0, JSEXN_SYNTAXERR, "missing ] after array comprehension") +MSG_DEF(JSMSG_NESTING_GENERATOR, 175, 0, JSEXN_TYPEERR, "already executing generator") +MSG_DEF(JSMSG_PAREN_AFTER_FOR_OF_ITERABLE, 176, 0, JSEXN_SYNTAXERR, "missing ) after for-of iterable") +MSG_DEF(JSMSG_INVALID_NORMALIZE_FORM, 177, 0, JSEXN_RANGEERR, "form must be one of 'NFC', 'NFD', 'NFKC', or 'NFKD'") +MSG_DEF(JSMSG_NOTHING_TO_REPEAT, 178, 0, JSEXN_SYNTAXERR, "nothing to repeat") +MSG_DEF(JSMSG_INVALID_GROUP, 179, 0, JSEXN_SYNTAXERR, "invalid regexp group") +MSG_DEF(JSMSG_ESCAPE_AT_END_OF_REGEXP, 180, 0, JSEXN_SYNTAXERR, "\\ at end of pattern") +MSG_DEF(JSMSG_NUMBERS_OUT_OF_ORDER, 181, 0, JSEXN_SYNTAXERR, "numbers out of order in {} quantifier.") +MSG_DEF(JSMSG_BAD_GENERATOR_SEND, 182, 1, JSEXN_TYPEERR, "attempt to send {0} to newborn generator") +MSG_DEF(JSMSG_SC_NOT_TRANSFERABLE, 183, 0, JSEXN_TYPEERR, "invalid transferable array for structured clone") +MSG_DEF(JSMSG_SC_DUP_TRANSFERABLE, 184, 0, JSEXN_TYPEERR, "duplicate transferable for structured clone") +MSG_DEF(JSMSG_CANT_REPORT_AS_NON_EXTENSIBLE, 185, 0, JSEXN_TYPEERR, "proxy can't report an extensible object as non-extensible") +MSG_DEF(JSMSG_SYMBOL_TO_STRING, 186, 0, JSEXN_TYPEERR, "can't convert symbol to string") +MSG_DEF(JSMSG_UNUSED187, 187, 0, JSEXN_NONE, "") +MSG_DEF(JSMSG_INCOMPATIBLE_METHOD, 188, 3, JSEXN_TYPEERR, "{0} {1} called on incompatible {2}") +MSG_DEF(JSMSG_SYMBOL_TO_PRIMITIVE, 189, 0, JSEXN_TYPEERR, "can't convert symbol object to primitive") +MSG_DEF(JSMSG_UNUSED190, 190, 0, JSEXN_NONE, "") +MSG_DEF(JSMSG_BAD_INDEX, 191, 0, JSEXN_RANGEERR, "invalid or out-of-range index") +MSG_DEF(JSMSG_SELFHOSTED_TOP_LEVEL_LET,192,0, JSEXN_SYNTAXERR, "self-hosted code cannot contain top-level 'let' declarations") +MSG_DEF(JSMSG_BAD_FOR_EACH_LOOP, 193, 0, JSEXN_SYNTAXERR, "invalid for each loop") +MSG_DEF(JSMSG_OBJECT_WATCH_DEPRECATED,194, 0, JSEXN_NONE, "Object.prototype.watch and unwatch are very slow, non-standard, and deprecated; use a getter/setter instead") +MSG_DEF(JSMSG_TYPE_ERR_BAD_ARGS, 195, 0, JSEXN_TYPEERR, "invalid arguments") +MSG_DEF(JSMSG_REDECLARED_CATCH_IDENTIFIER, 196, 1, JSEXN_TYPEERR, "redeclaration of identifier '{0}' in catch") +MSG_DEF(JSMSG_INTERNAL_INTL_ERROR, 197, 0, JSEXN_ERR, "internal error while computing Intl data") +MSG_DEF(JSMSG_DEFAULT_LOCALE_ERROR, 198, 0, JSEXN_ERR, "internal error getting the default locale") +MSG_DEF(JSMSG_TOO_MANY_LOCALS, 199, 0, JSEXN_SYNTAXERR, "too many local variables") +MSG_DEF(JSMSG_ARRAY_INIT_TOO_BIG, 200, 0, JSEXN_INTERNALERR, "array initialiser too large") +MSG_DEF(JSMSG_REGEXP_TOO_COMPLEX, 201, 0, JSEXN_INTERNALERR, "regular expression too complex") +MSG_DEF(JSMSG_BUFFER_TOO_SMALL, 202, 0, JSEXN_INTERNALERR, "buffer too small") +MSG_DEF(JSMSG_BAD_SURROGATE_CHAR, 203, 1, JSEXN_TYPEERR, "bad surrogate character {0}") +MSG_DEF(JSMSG_UTF8_CHAR_TOO_LARGE, 204, 1, JSEXN_TYPEERR, "UTF-8 character {0} too large") +MSG_DEF(JSMSG_MALFORMED_UTF8_CHAR, 205, 1, JSEXN_TYPEERR, "malformed UTF-8 character sequence at offset {0}") +MSG_DEF(JSMSG_USER_DEFINED_ERROR, 206, 0, JSEXN_ERR, "JS_ReportError was called") +MSG_DEF(JSMSG_WRONG_CONSTRUCTOR, 207, 1, JSEXN_TYPEERR, "wrong constructor called for {0}") +MSG_DEF(JSMSG_BAD_GENERATOR_RETURN, 208, 1, JSEXN_TYPEERR, "generator function {0} returns a value") +MSG_DEF(JSMSG_BAD_ANON_GENERATOR_RETURN, 209, 0, JSEXN_TYPEERR, "anonymous generator function returns a value") +MSG_DEF(JSMSG_PROTO_SETTING_SLOW, 210, 0, JSEXN_NONE, "mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create") +MSG_DEF(JSMSG_IN_AFTER_FOR_NAME, 211, 0, JSEXN_SYNTAXERR, "missing 'in' or 'of' after for") +MSG_DEF(JSMSG_BAD_TRAP_RETURN_VALUE, 212, 2, JSEXN_TYPEERR,"trap {1} for {0} returned a primitive value") +MSG_DEF(JSMSG_OF_AFTER_FOR_NAME, 213, 0, JSEXN_SYNTAXERR, "missing 'of' after for") +MSG_DEF(JSMSG_BAD_GENERATOR_YIELD, 214, 1, JSEXN_TYPEERR, "yield from closing generator {0}") +MSG_DEF(JSMSG_BAD_GENERATOR_SYNTAX, 215, 1, JSEXN_SYNTAXERR, "{0} expression must be parenthesized") +MSG_DEF(JSMSG_ARRAY_COMP_LEFTSIDE, 216, 0, JSEXN_SYNTAXERR, "invalid array comprehension left-hand side") +MSG_DEF(JSMSG_LET_COMP_BINDING, 217, 0, JSEXN_SYNTAXERR, "'let' is not a valid name for a comprehension variable") +MSG_DEF(JSMSG_EMPTY_ARRAY_REDUCE, 218, 0, JSEXN_TYPEERR, "reduce of empty array with no initial value") +MSG_DEF(JSMSG_BAD_SYMBOL, 219, 1, JSEXN_TYPEERR, "{0} is not a well-known @@-symbol") +MSG_DEF(JSMSG_BAD_DELETE_OPERAND, 220, 0, JSEXN_REFERENCEERR, "invalid delete operand") +MSG_DEF(JSMSG_BAD_INCOP_OPERAND, 221, 0, JSEXN_REFERENCEERR, "invalid increment/decrement operand") +MSG_DEF(JSMSG_UNEXPECTED_TYPE, 222, 2, JSEXN_TYPEERR, "{0} is {1}") +MSG_DEF(JSMSG_LET_DECL_NOT_IN_BLOCK, 223, 0, JSEXN_SYNTAXERR, "let declaration not directly within block") +MSG_DEF(JSMSG_UNUSED224, 224, 0, JSEXN_NONE, "") +MSG_DEF(JSMSG_CANT_SET_ARRAY_ATTRS, 225, 0, JSEXN_INTERNALERR, "can't set attributes on indexed array properties") +MSG_DEF(JSMSG_EVAL_ARITY, 226, 0, JSEXN_TYPEERR, "eval accepts only one parameter") +MSG_DEF(JSMSG_MISSING_FUN_ARG, 227, 2, JSEXN_TYPEERR, "missing argument {0} when calling function {1}") +MSG_DEF(JSMSG_JSON_BAD_PARSE, 228, 3, JSEXN_SYNTAXERR, "JSON.parse: {0} at line {1} column {2} of the JSON data") +MSG_DEF(JSMSG_JSON_BAD_STRINGIFY, 229, 0, JSEXN_ERR, "JSON.stringify") +MSG_DEF(JSMSG_NOT_CALLABLE_OR_UNDEFINED, 230, 0, JSEXN_TYPEERR, "value is not a function or undefined") +MSG_DEF(JSMSG_NOT_NONNULL_OBJECT, 231, 0, JSEXN_TYPEERR, "value is not a non-null object") +MSG_DEF(JSMSG_DEPRECATED_OCTAL, 232, 0, JSEXN_SYNTAXERR, "octal literals and octal escape sequences are deprecated") +MSG_DEF(JSMSG_STRICT_CODE_WITH, 233, 0, JSEXN_SYNTAXERR, "strict mode code may not contain 'with' statements") +MSG_DEF(JSMSG_DUPLICATE_PROPERTY, 234, 1, JSEXN_SYNTAXERR, "property name {0} appears more than once in object literal") +MSG_DEF(JSMSG_DEPRECATED_DELETE_OPERAND, 235, 0, JSEXN_SYNTAXERR, "applying the 'delete' operator to an unqualified name is deprecated") +MSG_DEF(JSMSG_BAD_STRICT_ASSIGN, 236, 1, JSEXN_SYNTAXERR, "can't assign to {0} in strict mode") +MSG_DEF(JSMSG_BAD_BINDING, 237, 1, JSEXN_SYNTAXERR, "redefining {0} is deprecated") +MSG_DEF(JSMSG_INVALID_DESCRIPTOR, 238, 0, JSEXN_TYPEERR, "property descriptors must not specify a value or be writable when a getter or setter has been specified") +MSG_DEF(JSMSG_OBJECT_NOT_EXTENSIBLE, 239, 1, JSEXN_TYPEERR, "{0} is not extensible") +MSG_DEF(JSMSG_CANT_REDEFINE_PROP, 240, 1, JSEXN_TYPEERR, "can't redefine non-configurable property '{0}'") +MSG_DEF(JSMSG_CANT_APPEND_TO_ARRAY, 241, 0, JSEXN_TYPEERR, "can't add elements past the end of an array if its length property is unwritable") +MSG_DEF(JSMSG_CANT_REDEFINE_ARRAY_LENGTH,242, 0, JSEXN_TYPEERR, "can't redefine array length") +MSG_DEF(JSMSG_CANT_DEFINE_PAST_ARRAY_LENGTH,243, 0, JSEXN_TYPEERR, "can't define array index property past the end of an array with non-writable length") +MSG_DEF(JSMSG_TYPED_ARRAY_BAD_INDEX, 244, 0, JSEXN_ERR, "invalid or out-of-range index") +MSG_DEF(JSMSG_TYPED_ARRAY_NEGATIVE_ARG, 245, 1, JSEXN_ERR, "argument {0} must be >= 0") +MSG_DEF(JSMSG_TYPED_ARRAY_BAD_ARGS, 246, 0, JSEXN_ERR, "invalid arguments") +MSG_DEF(JSMSG_CSP_BLOCKED_FUNCTION, 247, 0, JSEXN_ERR, "call to Function() blocked by CSP") +MSG_DEF(JSMSG_BAD_GET_SET_FIELD, 248, 1, JSEXN_TYPEERR, "property descriptor's {0} field is neither undefined nor a function") +MSG_DEF(JSMSG_BAD_PROXY_FIX, 249, 0, JSEXN_TYPEERR, "proxy was fixed while executing the handler") +MSG_DEF(JSMSG_INVALID_EVAL_SCOPE_ARG, 250, 0, JSEXN_EVALERR, "invalid eval scope argument") +MSG_DEF(JSMSG_ACCESSOR_WRONG_ARGS, 251, 3, JSEXN_SYNTAXERR, "{0} functions must have {1} argument{2}") +MSG_DEF(JSMSG_THROW_TYPE_ERROR, 252, 0, JSEXN_TYPEERR, "'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them") +MSG_DEF(JSMSG_BAD_TOISOSTRING_PROP, 253, 0, JSEXN_TYPEERR, "toISOString property is not callable") +MSG_DEF(JSMSG_BAD_PARSE_NODE, 254, 0, JSEXN_INTERNALERR, "bad parse node") +MSG_DEF(JSMSG_NOT_EXPECTED_TYPE, 255, 3, JSEXN_TYPEERR, "{0}: expected {1}, got {2}") +MSG_DEF(JSMSG_CALLER_IS_STRICT, 256, 0, JSEXN_TYPEERR, "access to strict mode caller function is censored") +MSG_DEF(JSMSG_NEED_DEBUG_MODE, 257, 0, JSEXN_ERR, "function can be called only in debug mode") +MSG_DEF(JSMSG_STRICT_CODE_LET_EXPR_STMT, 258, 0, JSEXN_ERR, "strict mode code may not contain unparenthesized let expression statements") +MSG_DEF(JSMSG_CANT_CHANGE_EXTENSIBILITY, 259, 0, JSEXN_TYPEERR, "can't change object's extensibility") +MSG_DEF(JSMSG_SC_BAD_SERIALIZED_DATA, 260, 1, JSEXN_INTERNALERR, "bad serialized structured data ({0})") +MSG_DEF(JSMSG_SC_UNSUPPORTED_TYPE, 261, 0, JSEXN_TYPEERR, "unsupported type for structured data") +MSG_DEF(JSMSG_SC_RECURSION, 262, 0, JSEXN_INTERNALERR, "recursive object") +MSG_DEF(JSMSG_DEBUG_CANT_DEBUG_GLOBAL, 263, 0, JSEXN_ERR, "passing non-debuggable global to addDebuggee") +MSG_DEF(JSMSG_BAD_CLONE_VERSION, 264, 0, JSEXN_ERR, "unsupported structured clone version") +MSG_DEF(JSMSG_CANT_CLONE_OBJECT, 265, 0, JSEXN_TYPEERR, "can't clone object") +MSG_DEF(JSMSG_DEBUG_RESUMPTION_VALUE_DISALLOWED, 266, 0, JSEXN_TYPEERR, "resumption values are disallowed in this hook") +MSG_DEF(JSMSG_STRICT_FUNCTION_STATEMENT, 267, 0, JSEXN_SYNTAXERR, "in strict mode code, functions may be declared only at top level or immediately within another function") +MSG_DEF(JSMSG_INVALID_FOR_IN_INIT, 268, 0, JSEXN_SYNTAXERR, "for-in loop let declaration may not have an initializer") +MSG_DEF(JSMSG_CLEARED_SCOPE, 269, 0, JSEXN_TYPEERR, "attempt to run compile-and-go script on a cleared scope") +MSG_DEF(JSMSG_MALFORMED_ESCAPE, 270, 1, JSEXN_SYNTAXERR, "malformed {0} character escape sequence") +MSG_DEF(JSMSG_BAD_GENEXP_BODY, 271, 1, JSEXN_SYNTAXERR, "illegal use of {0} in generator expression") +MSG_DEF(JSMSG_YIELD_WITHOUT_OPERAND, 272, 0, JSEXN_SYNTAXERR, "yield without a value is deprecated, and illegal in ES6 (use 'yield undefined' instead)") +MSG_DEF(JSMSG_UNNAMED_FUNCTION_STMT, 273, 0, JSEXN_SYNTAXERR, "function statement requires a name") +MSG_DEF(JSMSG_CCW_REQUIRED, 274, 1, JSEXN_TYPEERR, "{0}: argument must be an object from a different compartment") +MSG_DEF(JSMSG_DEBUG_BAD_RESUMPTION, 275, 0, JSEXN_TYPEERR, "debugger resumption value must be undefined, {throw: val}, {return: val}, or null") +MSG_DEF(JSMSG_ASSIGN_FUNCTION_OR_NULL, 276, 1, JSEXN_TYPEERR, "value assigned to {0} must be a function or null") +MSG_DEF(JSMSG_DEBUG_NOT_LIVE, 277, 1, JSEXN_ERR, "{0} is not live") +MSG_DEF(JSMSG_DEBUG_OBJECT_WRONG_OWNER, 278, 0, JSEXN_TYPEERR, "Debugger.Object belongs to a different Debugger") +MSG_DEF(JSMSG_DEBUG_OBJECT_PROTO, 279, 0, JSEXN_TYPEERR, "Debugger.Object.prototype is not a valid Debugger.Object") +MSG_DEF(JSMSG_DEBUG_LOOP, 280, 0, JSEXN_TYPEERR, "cannot debug an object in same compartment as debugger or a compartment that is already debugging the debugger") +MSG_DEF(JSMSG_DEBUG_NOT_IDLE, 281, 0, JSEXN_ERR, "can't start debugging: a debuggee script is on the stack") +MSG_DEF(JSMSG_DEBUG_BAD_OFFSET, 282, 0, JSEXN_TYPEERR, "invalid script offset") +MSG_DEF(JSMSG_DEBUG_BAD_LINE, 283, 0, JSEXN_TYPEERR, "invalid line number") +MSG_DEF(JSMSG_DEBUG_NOT_DEBUGGING, 284, 0, JSEXN_ERR, "can't set breakpoint: script global is not a debuggee") +MSG_DEF(JSMSG_DEBUG_COMPARTMENT_MISMATCH, 285, 2, JSEXN_TYPEERR, "{0}: descriptor .{1} property is an object in a different compartment than the target object") +MSG_DEF(JSMSG_DEBUG_NOT_SCRIPT_FRAME, 286, 0, JSEXN_ERR, "stack frame is not running JavaScript code") +MSG_DEF(JSMSG_CANT_WATCH_PROP, 287, 0, JSEXN_TYPEERR, "properties whose names are objects can't be watched") +MSG_DEF(JSMSG_CSP_BLOCKED_EVAL, 288, 0, JSEXN_ERR, "call to eval() blocked by CSP") +MSG_DEF(JSMSG_DEBUG_NO_SCOPE_OBJECT, 289, 0, JSEXN_TYPEERR, "declarative Environments don't have binding objects") +MSG_DEF(JSMSG_EMPTY_CONSEQUENT, 290, 0, JSEXN_SYNTAXERR, "mistyped ; after conditional?") +MSG_DEF(JSMSG_NOT_ITERABLE, 291, 1, JSEXN_TYPEERR, "{0} is not iterable") +MSG_DEF(JSMSG_QUERY_LINE_WITHOUT_URL, 292, 0, JSEXN_TYPEERR, "findScripts query object has 'line' property, but no 'url' property") +MSG_DEF(JSMSG_QUERY_INNERMOST_WITHOUT_LINE_URL, 293, 0, JSEXN_TYPEERR, "findScripts query object has 'innermost' property without both 'url' and 'line' properties") +MSG_DEF(JSMSG_DEBUG_VARIABLE_NOT_FOUND, 294, 0, JSEXN_TYPEERR, "variable not found in environment") +MSG_DEF(JSMSG_PARAMETER_AFTER_REST, 295, 0, JSEXN_SYNTAXERR, "parameter after rest parameter") +MSG_DEF(JSMSG_NO_REST_NAME, 296, 0, JSEXN_SYNTAXERR, "no parameter name after ...") +MSG_DEF(JSMSG_ARGUMENTS_AND_REST, 297, 0, JSEXN_SYNTAXERR, "'arguments' object may not be used in conjunction with a rest parameter") +MSG_DEF(JSMSG_FUNCTION_ARGUMENTS_AND_REST, 298, 0, JSEXN_ERR, "the 'arguments' property of a function with a rest parameter may not be used") +MSG_DEF(JSMSG_REST_WITH_DEFAULT, 299, 0, JSEXN_SYNTAXERR, "rest parameter may not have a default") +MSG_DEF(JSMSG_NONDEFAULT_FORMAL_AFTER_DEFAULT, 300, 0, JSEXN_SYNTAXERR, "parameter(s) with default followed by parameter without default") +MSG_DEF(JSMSG_YIELD_IN_DEFAULT, 301, 0, JSEXN_SYNTAXERR, "yield in default expression") +MSG_DEF(JSMSG_INTRINSIC_NOT_DEFINED, 302, 1, JSEXN_REFERENCEERR, "no intrinsic function {0}") +MSG_DEF(JSMSG_ALREADY_HAS_PRAGMA, 303, 2, JSEXN_NONE, "{0} is being assigned a {1}, but already has one") +MSG_DEF(JSMSG_PAR_ARRAY_BAD_ARG, 304, 0, JSEXN_RANGEERR, "invalid parallel method argument") +MSG_DEF(JSMSG_REGEXP_RUNTIME_ERROR, 305, 0, JSEXN_INTERNALERR, "an error occurred while executing regular expression") +MSG_DEF(JSMSG_DEBUG_OPTIMIZED_OUT, 306, 0, JSEXN_ERR, "variable has been optimized out") +MSG_DEF(JSMSG_NEXT_RETURNED_PRIMITIVE,307, 0, JSEXN_TYPEERR, "iterator.next() returned a non-object value") +MSG_DEF(JSMSG_PAR_ARRAY_SCATTER_CONFLICT, 308, 0, JSEXN_ERR, "no conflict resolution function provided") +MSG_DEF(JSMSG_PAR_ARRAY_SCATTER_BOUNDS, 309, 0, JSEXN_ERR, "index in scatter vector out of bounds") +MSG_DEF(JSMSG_CANT_REPORT_NC_AS_NE, 310, 0, JSEXN_TYPEERR, "proxy can't report a non-configurable own property as non-existent") +MSG_DEF(JSMSG_CANT_REPORT_E_AS_NE, 311, 0, JSEXN_TYPEERR, "proxy can't report an existing own property as non-existent on a non-extensible object") +MSG_DEF(JSMSG_CANT_REPORT_NEW, 312, 0, JSEXN_TYPEERR, "proxy can't report a new property on a non-extensible object") +MSG_DEF(JSMSG_CANT_REPORT_INVALID, 313, 0, JSEXN_TYPEERR, "proxy can't report an incompatible property descriptor") +MSG_DEF(JSMSG_CANT_REPORT_NE_AS_NC, 314, 0, JSEXN_TYPEERR, "proxy can't report a non-existent property as non-configurable") +MSG_DEF(JSMSG_CANT_DEFINE_NEW, 315, 0, JSEXN_TYPEERR, "proxy can't define a new property on a non-extensible object") +MSG_DEF(JSMSG_CANT_DEFINE_INVALID, 316, 0, JSEXN_TYPEERR, "proxy can't define an incompatible property descriptor") +MSG_DEF(JSMSG_CANT_DEFINE_NE_AS_NC, 317, 0, JSEXN_TYPEERR, "proxy can't define a non-existent property as non-configurable") +MSG_DEF(JSMSG_INVALID_TRAP_RESULT, 318, 2, JSEXN_TYPEERR, "trap {1} for {0} returned an invalid result") +MSG_DEF(JSMSG_CANT_SKIP_NC, 319, 0, JSEXN_TYPEERR, "proxy can't skip a non-configurable property") +MSG_DEF(JSMSG_MUST_REPORT_SAME_VALUE, 320, 0, JSEXN_TYPEERR, "proxy must report the same value for a non-writable, non-configurable property") +MSG_DEF(JSMSG_MUST_REPORT_UNDEFINED, 321, 0, JSEXN_TYPEERR, "proxy must report undefined for a non-configurable accessor property without a getter") +MSG_DEF(JSMSG_CANT_SET_NW_NC, 322, 0, JSEXN_TYPEERR, "proxy can't successfully set a non-writable, non-configurable property") +MSG_DEF(JSMSG_CANT_SET_WO_SETTER, 323, 0, JSEXN_TYPEERR, "proxy can't succesfully set an accessor property without a setter") +MSG_DEF(JSMSG_DEBUG_BAD_REFERENT, 324, 2, JSEXN_TYPEERR, "{0} does not refer to {1}") +MSG_DEF(JSMSG_DEBUG_WRAPPER_IN_WAY, 325, 3, JSEXN_TYPEERR, "{0} is {1}{2}a global object, but a direct reference is required") +MSG_DEF(JSMSG_UNWRAP_DENIED, 326, 0, JSEXN_ERR, "permission denied to unwrap object") +MSG_DEF(JSMSG_INTL_OBJECT_NOT_INITED, 327, 3, JSEXN_TYPEERR, "Intl.{0}.prototype.{1} called on value that's not an object initialized as a {2}") +MSG_DEF(JSMSG_INVALID_LOCALES_ELEMENT,328, 0, JSEXN_TYPEERR, "invalid element in locales argument") +MSG_DEF(JSMSG_INVALID_LANGUAGE_TAG, 329, 1, JSEXN_RANGEERR, "invalid language tag: {0}") +MSG_DEF(JSMSG_INVALID_LOCALE_MATCHER, 330, 1, JSEXN_RANGEERR, "invalid locale matcher in supportedLocalesOf(): {0}") +MSG_DEF(JSMSG_INVALID_OPTION_VALUE, 331, 2, JSEXN_RANGEERR, "invalid value {1} for option {0}") +MSG_DEF(JSMSG_INVALID_DIGITS_VALUE, 332, 1, JSEXN_RANGEERR, "invalid digits value: {0}") +MSG_DEF(JSMSG_INTL_OBJECT_REINITED, 333, 0, JSEXN_TYPEERR, "can't initialize object twice as an object of an Intl constructor") +MSG_DEF(JSMSG_INVALID_CURRENCY_CODE, 334, 1, JSEXN_RANGEERR, "invalid currency code in NumberFormat(): {0}") +MSG_DEF(JSMSG_UNDEFINED_CURRENCY, 335, 0, JSEXN_TYPEERR, "undefined currency in NumberFormat() with currency style") +MSG_DEF(JSMSG_INVALID_TIME_ZONE, 336, 1, JSEXN_RANGEERR, "invalid time zone in DateTimeFormat(): {0}") +MSG_DEF(JSMSG_DATE_NOT_FINITE, 337, 0, JSEXN_RANGEERR, "date value is not finite in DateTimeFormat.format()") +MSG_DEF(JSMSG_USE_ASM_DIRECTIVE_FAIL, 338, 0, JSEXN_SYNTAXERR, "\"use asm\" is only meaningful in the Directive Prologue of a function body") +MSG_DEF(JSMSG_USE_ASM_TYPE_FAIL, 339, 1, JSEXN_TYPEERR, "asm.js type error: {0}") +MSG_DEF(JSMSG_USE_ASM_LINK_FAIL, 340, 1, JSEXN_TYPEERR, "asm.js link error: {0}") +MSG_DEF(JSMSG_USE_ASM_TYPE_OK, 341, 1, JSEXN_NONE, "Successfully compiled asm.js code ({0})") +MSG_DEF(JSMSG_BAD_ARROW_ARGS, 342, 0, JSEXN_SYNTAXERR, "invalid arrow-function arguments (parentheses around the arrow-function may help)") +MSG_DEF(JSMSG_YIELD_IN_ARROW, 343, 0, JSEXN_SYNTAXERR, "arrow function may not contain yield") +MSG_DEF(JSMSG_WRONG_VALUE, 344, 2, JSEXN_ERR, "expected {0} but found {1}") +MSG_DEF(JSMSG_PAR_ARRAY_SCATTER_BAD_TARGET, 345, 1, JSEXN_ERR, "target for index {0} is not an integer") +MSG_DEF(JSMSG_SELFHOSTED_UNBOUND_NAME,346, 0, JSEXN_TYPEERR, "self-hosted code may not contain unbound name lookups") +MSG_DEF(JSMSG_DEPRECATED_PRAGMA, 347, 1, JSEXN_NONE, "Using //@ to indicate {0} pragmas is deprecated. Use //# instead") +MSG_DEF(JSMSG_BAD_DESTRUCT_ASSIGN, 348, 1, JSEXN_SYNTAXERR, "can't assign to {0} using destructuring assignment") +MSG_DEF(JSMSG_TYPEDOBJECT_ARRAYTYPE_BAD_ARGS, 349, 0, JSEXN_ERR, "Invalid arguments") +MSG_DEF(JSMSG_TYPEDOBJECT_BINARYARRAY_BAD_INDEX, 350, 0, JSEXN_RANGEERR, "invalid or out-of-range index") +MSG_DEF(JSMSG_TYPEDOBJECT_STRUCTTYPE_BAD_ARGS, 351, 0, JSEXN_RANGEERR, "invalid field descriptor") +MSG_DEF(JSMSG_TYPEDOBJECT_NOT_BINARYSTRUCT, 352, 1, JSEXN_TYPEERR, "{0} is not a BinaryStruct") +MSG_DEF(JSMSG_TYPEDOBJECT_SUBARRAY_INTEGER_ARG, 353, 1, JSEXN_ERR, "argument {0} must be an integer") +MSG_DEF(JSMSG_TYPEDOBJECT_STRUCTTYPE_EMPTY_DESCRIPTOR, 354, 0, JSEXN_ERR, "field descriptor cannot be empty") +MSG_DEF(JSMSG_TYPEDOBJECT_STRUCTTYPE_BAD_FIELD, 355, 1, JSEXN_ERR, "field {0} is not a valid BinaryData Type descriptor") +MSG_DEF(JSMSG_GENERATOR_FINISHED, 356, 0, JSEXN_TYPEERR, "generator has already finished") +MSG_DEF(JSMSG_TYPEDOBJECT_TOO_BIG, 357, 0, JSEXN_ERR, "Type is too large to allocate") +MSG_DEF(JSMSG_TYPEDOBJECT_NOT_TYPE_OBJECT, 358, 0, JSEXN_ERR, "Expected a type object") +MSG_DEF(JSMSG_TOO_MANY_CON_SPREADARGS, 359, 0, JSEXN_RANGEERR, "too many constructor arguments") +MSG_DEF(JSMSG_TOO_MANY_FUN_SPREADARGS, 360, 0, JSEXN_RANGEERR, "too many function arguments") +MSG_DEF(JSMSG_DEBUG_NOT_DEBUGGEE, 361, 2, JSEXN_ERR, "{0} is not a debuggee {1}") +MSG_DEF(JSMSG_TYPEDOBJECT_NOT_TYPED_OBJECT, 362, 0, JSEXN_ERR, "Expected a typed object") +MSG_DEF(JSMSG_TYPEDOBJECT_NO_SUCH_PROP, 363, 1, JSEXN_TYPEERR, "No such property: {0}") +MSG_DEF(JSMSG_TYPEDOBJECT_BAD_ARGS, 364, 0, JSEXN_TYPEERR, "invalid arguments") +MSG_DEF(JSMSG_TYPEDOBJECT_HANDLE_UNATTACHED, 365, 0, JSEXN_TYPEERR, "handle unattached") +MSG_DEF(JSMSG_TYPEDOBJECT_HANDLE_BAD_TYPE, 366, 0, JSEXN_TYPEERR, "handle moved to destination of incorrect type") + +MSG_DEF(JSMSG_IMPORT_DECL_AT_TOP_LEVEL, 367, 0, JSEXN_SYNTAXERR, "import declarations may only appear at top level") +MSG_DEF(JSMSG_NO_IMPORT_NAME, 368, 0, JSEXN_SYNTAXERR, "missing import name") +MSG_DEF(JSMSG_AS_AFTER_RESERVED_WORD, 369, 1, JSEXN_SYNTAXERR, "missing keyword 'as' after reserved word '{0}'") +MSG_DEF(JSMSG_NO_BINDING_NAME, 370, 0, JSEXN_SYNTAXERR, "missing binding name") +MSG_DEF(JSMSG_RC_AFTER_IMPORT_SPEC_LIST, 371, 0, JSEXN_SYNTAXERR, "missing '}' after module specifier list") +MSG_DEF(JSMSG_FROM_AFTER_IMPORT_SPEC_SET, 372, 0, JSEXN_SYNTAXERR, "missing keyword 'from' after import specifier set") +MSG_DEF(JSMSG_DECLARATION_AFTER_IMPORT, 373, 0, JSEXN_SYNTAXERR, "missing declaration after 'import' keyword") +MSG_DEF(JSMSG_MODULE_SPEC_AFTER_FROM, 374, 0, JSEXN_SYNTAXERR, "missing module specifier after 'from' keyword") +MSG_DEF(JSMSG_MODULES_NOT_IMPLEMENTED, 375, 0, JSEXN_SYNTAXERR, "modules are not implemented yet") +MSG_DEF(JSMSG_EXPORT_DECL_AT_TOP_LEVEL, 376, 0, JSEXN_SYNTAXERR, "export declarations may only appear at top level") +MSG_DEF(JSMSG_RC_AFTER_EXPORT_SPEC_LIST, 377, 0, JSEXN_SYNTAXERR, "missing '}' after export specifier list") +MSG_DEF(JSMSG_NO_EXPORT_NAME, 378, 0, JSEXN_SYNTAXERR, "missing export name") +MSG_DEF(JSMSG_DECLARATION_AFTER_EXPORT, 379, 0, JSEXN_SYNTAXERR, "missing declaration after 'export' keyword") +MSG_DEF(JSMSG_INVALID_PROTOTYPE, 380, 0, JSEXN_TYPEERR, "prototype field is not an object") +MSG_DEF(JSMSG_TYPEDOBJECT_HANDLE_TO_UNSIZED, 381, 0, JSEXN_TYPEERR, "cannot create a handle to an unsized type") +MSG_DEF(JSMSG_SETPROTOTYPEOF_FAIL, 382, 1, JSEXN_TYPEERR, "[[SetPrototypeOf]] failed on {0}") +MSG_DEF(JSMSG_INVALID_ARG_TYPE, 383, 3, JSEXN_TYPEERR, "Invalid type: {0} can't be a{1} {2}") +MSG_DEF(JSMSG_TERMINATED, 384, 1, JSEXN_ERR, "Script terminated by timeout at:\n{0}") +MSG_DEF(JSMSG_NO_SUCH_SELF_HOSTED_PROP, 385, 1, JSEXN_ERR, "No such property on self-hosted object: {0}") +MSG_DEF(JSMSG_PROXY_EXTENSIBILITY, 386, 0, JSEXN_TYPEERR, "proxy must report same extensiblitity as target") +MSG_DEF(JSMSG_PROXY_CONSTRUCT_OBJECT, 387, 0, JSEXN_TYPEERR, "proxy [[Construct]] must return an object") +MSG_DEF(JSMSG_PROXY_GETOWN_OBJORUNDEF, 388, 0, JSEXN_TYPEERR, "proxy [[GetOwnProperty]] must return an object or undefined") +MSG_DEF(JSMSG_CANT_REPORT_C_AS_NC, 389, 0, JSEXN_TYPEERR, "proxy can't report existing configurable property as non-configurable") diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Anchor.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Anchor.h new file mode 100644 index 0000000000..d9ed3fd750 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Anchor.h @@ -0,0 +1,174 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* JS::Anchor implementation. */ + +#ifndef js_Anchor_h +#define js_Anchor_h + +#include "mozilla/Attributes.h" + +#include "js/TypeDecls.h" + +namespace JS { + +/* + * Protecting non-Value, non-JSObject *, non-JSString * values from collection + * + * Most of the time, the garbage collector's conservative stack scanner works + * behind the scenes, finding all live values and protecting them from being + * collected. However, when JSAPI client code obtains a pointer to data the + * scanner does not know about, owned by an object the scanner does know about, + * Care Must Be Taken. + * + * The scanner recognizes only a select set of types: pointers to JSObjects and + * similar things (JSFunctions, and so on), pointers to JSStrings, and Values. + * So while the scanner finds all live |JSString| pointers, it does not notice + * |jschar| pointers. + * + * So suppose we have: + * + * void f(JSString *str) { + * const jschar *ch = JS_GetStringCharsZ(str); + * ... do stuff with ch, but no uses of str ...; + * } + * + * After the call to |JS_GetStringCharsZ|, there are no further uses of + * |str|, which means that the compiler is within its rights to not store + * it anywhere. But because the stack scanner will not notice |ch|, there + * is no longer any live value in this frame that would keep the string + * alive. If |str| is the last reference to that |JSString|, and the + * collector runs while we are using |ch|, the string's array of |jschar|s + * may be freed out from under us. + * + * Note that there is only an issue when 1) we extract a thing X the scanner + * doesn't recognize from 2) a thing Y the scanner does recognize, and 3) if Y + * gets garbage-collected, then X gets freed. If we have code like this: + * + * void g(JSObject *obj) { + * JS::Value x; + * JS_GetProperty(obj, "x", &x); + * ... do stuff with x ... + * } + * + * there's no problem, because the value we've extracted, x, is a Value, a + * type that the conservative scanner recognizes. + * + * Conservative GC frees us from the obligation to explicitly root the types it + * knows about, but when we work with derived values like |ch|, we must root + * their owners, as the derived value alone won't keep them alive. + * + * A JS::Anchor is a kind of GC root that allows us to keep the owners of + * derived values like |ch| alive throughout the Anchor's lifetime. We could + * fix the above code as follows: + * + * void f(JSString *str) { + * JS::Anchor a_str(str); + * const jschar *ch = JS_GetStringCharsZ(str); + * ... do stuff with ch, but no uses of str ...; + * } + * + * This simply ensures that |str| will be live until |a_str| goes out of scope. + * As long as we don't retain a pointer to the string's characters for longer + * than that, we have avoided all garbage collection hazards. + */ +template class AnchorPermitted; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; +template<> class AnchorPermitted { }; + +template +class Anchor : AnchorPermitted +{ + public: + Anchor() { } + explicit Anchor(T t) { hold = t; } + inline ~Anchor(); + + private: + T hold; + + /* + * Rooting analysis considers use of operator= to be a use of an anchor. + * For simplicity, Anchor is treated as if it contained a GC thing, from + * construction. Thus if we had + * + * void operator=(const T &t) { hold = t; } + * + * and this code + * + * JS::Anchor anchor; + * stuff that could GC, producing |str|; + * anchor = str; + * + * the last line would be seen as a hazard, because the final = would "use" + * |anchor| that is a GC thing -- which could have been moved around by the + * GC. The workaround is to structure your code so that JS::Anchor is + * always constructed, living for however long the corresponding value must + * live. + */ + void operator=(const T &t) MOZ_DELETE; + + Anchor(const Anchor &other) MOZ_DELETE; + void operator=(const Anchor &other) MOZ_DELETE; +}; + +template +inline Anchor::~Anchor() +{ +#ifdef __GNUC__ + /* + * No code is generated for this. But because this is marked 'volatile', G++ will + * assume it has important side-effects, and won't delete it. (G++ never looks at + * the actual text and notices it's empty.) And because we have passed |hold| to + * it, GCC will keep |hold| alive until this point. + * + * The "memory" clobber operand ensures that G++ will not move prior memory + * accesses after the asm --- it's a barrier. Unfortunately, it also means that + * G++ will assume that all memory has changed after the asm, as it would for a + * call to an unknown function. I don't know of a way to avoid that consequence. + */ + asm volatile("":: "g" (hold) : "memory"); +#else + /* + * An adequate portable substitute, for non-structure types. + * + * The compiler promises that, by the end of an expression statement, the + * last-stored value to a volatile object is the same as it would be in an + * unoptimized, direct implementation (the "abstract machine" whose behavior the + * language spec describes). However, the compiler is still free to reorder + * non-volatile accesses across this store --- which is what we must prevent. So + * assigning the held value to a volatile variable, as we do here, is not enough. + * + * In our case, however, garbage collection only occurs at function calls, so it + * is sufficient to ensure that the destructor's store isn't moved earlier across + * any function calls that could collect. It is hard to imagine the compiler + * analyzing the program so thoroughly that it could prove that such motion was + * safe. In practice, compilers treat calls to the collector as opaque operations + * --- in particular, as operations which could access volatile variables, across + * which this destructor must not be moved. + * + * ("Objection, your honor! *Alleged* killer whale!") + * + * The disadvantage of this approach is that it does generate code for the store. + * We do need to use Anchors in some cases where cycles are tight. + * + * Note that there is a Anchor::~Anchor() specialization in Value.h. + */ + volatile T sink; + sink = hold; +#endif /* defined(__GNUC__) */ +} + +} // namespace JS + +#endif /* js_Anchor_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallArgs.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallArgs.h new file mode 100644 index 0000000000..3be3f1575a --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallArgs.h @@ -0,0 +1,418 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Helper classes encapsulating access to the callee, |this| value, arguments, + * and argument count for a function call. + * + * The intent of JS::CallArgs and JS::CallReceiver is that they be used to + * encapsulate access to the un-abstracted |unsigned argc, Value *vp| arguments + * to a function. It's possible (albeit deprecated) to manually index into + * |vp| to access the callee, |this|, and arguments of a function, and to set + * its return value. It's also possible to use the supported API of JS_CALLEE, + * JS_THIS, JS_ARGV, JS_RVAL and JS_SET_RVAL to the same ends. But neither API + * has the error-handling or moving-GC correctness of CallArgs or CallReceiver. + * New code should use CallArgs and CallReceiver instead whenever possible. + * + * The eventual plan is to change JSNative to take |const CallArgs&| directly, + * for automatic assertion of correct use and to make calling functions more + * efficient. Embedders should start internally switching away from using + * |argc| and |vp| directly, except to create a |CallArgs|. Then, when an + * eventual release making that change occurs, porting efforts will require + * changing methods' signatures but won't require invasive changes to the + * methods' implementations, potentially under time pressure. + */ + +#ifndef js_CallArgs_h +#define js_CallArgs_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/TypeTraits.h" + +#include "jstypes.h" + +#include "js/RootingAPI.h" +#include "js/Value.h" + +/* Typedef for native functions called by the JS VM. */ +typedef bool +(* JSNative)(JSContext *cx, unsigned argc, JS::Value *vp); + +/* Typedef for native functions that may be called in parallel. */ +typedef bool +(* JSParallelNative)(js::ForkJoinContext *cx, unsigned argc, JS::Value *vp); + +/* + * Typedef for native functions that may be called either in parallel or + * sequential execution. + */ +typedef bool +(* JSThreadSafeNative)(js::ThreadSafeContext *cx, unsigned argc, JS::Value *vp); + +/* + * Convenience wrappers for passing in ThreadSafeNative to places that expect + * a JSNative or a JSParallelNative. + */ +template +inline bool +JSNativeThreadSafeWrapper(JSContext *cx, unsigned argc, JS::Value *vp); + +template +inline bool +JSParallelNativeThreadSafeWrapper(js::ForkJoinContext *cx, unsigned argc, JS::Value *vp); + +/* + * Compute |this| for the |vp| inside a JSNative, either boxing primitives or + * replacing with the global object as necessary. + * + * This method will go away at some point: instead use |args.thisv()|. If the + * value is an object, no further work is required. If that value is |null| or + * |undefined|, use |JS_GetGlobalForObject| to compute the global object. If + * the value is some other primitive, use |JS_ValueToObject| to box it. + */ +extern JS_PUBLIC_API(JS::Value) +JS_ComputeThis(JSContext *cx, JS::Value *vp); + +namespace JS { + +extern JS_PUBLIC_DATA(const HandleValue) UndefinedHandleValue; + +/* + * JS::CallReceiver encapsulates access to the callee, |this|, and eventual + * return value for a function call. The principal way to create a + * CallReceiver is using JS::CallReceiverFromVp: + * + * static bool + * FunctionReturningThis(JSContext *cx, unsigned argc, JS::Value *vp) + * { + * JS::CallReceiver rec = JS::CallReceiverFromVp(vp); + * + * // Access to the callee must occur before accessing/setting + * // the return value. + * JSObject &callee = rec.callee(); + * rec.rval().set(JS::ObjectValue(callee)); + * + * // callee() and calleev() will now assert. + * + * // It's always fine to access thisv(). + * HandleValue thisv = rec.thisv(); + * rec.rval().set(thisv); + * + * // As the return value was last set to |this|, returns |this|. + * return true; + * } + * + * A note on JS_ComputeThis and JS_THIS_OBJECT: these methods currently aren't + * part of the CallReceiver interface. We will likely add them at some point. + * Until then, you should probably continue using |vp| directly for these two + * cases. + * + * CallReceiver is exposed publicly and used internally. Not all parts of its + * public interface are meant to be used by embedders! See inline comments to + * for details. + */ + +namespace detail { + +#ifdef JS_DEBUG +extern JS_PUBLIC_API(void) +CheckIsValidConstructible(Value v); +#endif + +enum UsedRval { IncludeUsedRval, NoUsedRval }; + +template +class MOZ_STACK_CLASS UsedRvalBase; + +template<> +class MOZ_STACK_CLASS UsedRvalBase +{ + protected: + mutable bool usedRval_; + void setUsedRval() const { usedRval_ = true; } + void clearUsedRval() const { usedRval_ = false; } +}; + +template<> +class MOZ_STACK_CLASS UsedRvalBase +{ + protected: + void setUsedRval() const {} + void clearUsedRval() const {} +}; + +template +class MOZ_STACK_CLASS CallReceiverBase : public UsedRvalBase< +#ifdef JS_DEBUG + WantUsedRval +#else + NoUsedRval +#endif + > +{ + protected: + Value *argv_; + + public: + /* + * Returns the function being called, as an object. Must not be called + * after rval() has been used! + */ + JSObject &callee() const { + MOZ_ASSERT(!this->usedRval_); + return argv_[-2].toObject(); + } + + /* + * Returns the function being called, as a value. Must not be called after + * rval() has been used! + */ + HandleValue calleev() const { + MOZ_ASSERT(!this->usedRval_); + return HandleValue::fromMarkedLocation(&argv_[-2]); + } + + /* + * Returns the |this| value passed to the function. This method must not + * be called when the function is being called as a constructor via |new|. + * The value may or may not be an object: it is the individual function's + * responsibility to box the value if needed. + */ + HandleValue thisv() const { + // Some internal code uses thisv() in constructing cases, so don't do + // this yet. + // MOZ_ASSERT(!argv_[-1].isMagic(JS_IS_CONSTRUCTING)); + return HandleValue::fromMarkedLocation(&argv_[-1]); + } + + Value computeThis(JSContext *cx) const { + if (thisv().isObject()) + return thisv(); + + return JS_ComputeThis(cx, base()); + } + + bool isConstructing() const { +#ifdef JS_DEBUG + if (this->usedRval_) + CheckIsValidConstructible(calleev()); +#endif + return argv_[-1].isMagic(); + } + + /* + * Returns the currently-set return value. The initial contents of this + * value are unspecified. Once this method has been called, callee() and + * calleev() can no longer be used. (If you're compiling against a debug + * build of SpiderMonkey, these methods will assert to aid debugging.) + * + * If the method you're implementing succeeds by returning true, you *must* + * set this. (SpiderMonkey doesn't currently assert this, but it will do + * so eventually.) You don't need to use or change this if your method + * fails. + */ + MutableHandleValue rval() const { + this->setUsedRval(); + return MutableHandleValue::fromMarkedLocation(&argv_[-2]); + } + + public: + // These methods are only intended for internal use. Embedders shouldn't + // use them! + + Value *base() const { return argv_ - 2; } + + Value *spAfterCall() const { + this->setUsedRval(); + return argv_ - 1; + } + + public: + // These methods are publicly exposed, but they are *not* to be used when + // implementing a JSNative method and encapsulating access to |vp| within + // it. You probably don't want to use these! + + void setCallee(Value aCalleev) const { + this->clearUsedRval(); + argv_[-2] = aCalleev; + } + + void setThis(Value aThisv) const { + argv_[-1] = aThisv; + } + + MutableHandleValue mutableThisv() const { + return MutableHandleValue::fromMarkedLocation(&argv_[-1]); + } +}; + +} // namespace detail + +class MOZ_STACK_CLASS CallReceiver : public detail::CallReceiverBase +{ + private: + friend CallReceiver CallReceiverFromVp(Value *vp); + friend CallReceiver CallReceiverFromArgv(Value *argv); +}; + +MOZ_ALWAYS_INLINE CallReceiver +CallReceiverFromArgv(Value *argv) +{ + CallReceiver receiver; + receiver.clearUsedRval(); + receiver.argv_ = argv; + return receiver; +} + +MOZ_ALWAYS_INLINE CallReceiver +CallReceiverFromVp(Value *vp) +{ + return CallReceiverFromArgv(vp + 2); +} + +/* + * JS::CallArgs encapsulates everything JS::CallReceiver does, plus access to + * the function call's arguments. The principal way to create a CallArgs is + * like so, using JS::CallArgsFromVp: + * + * static bool + * FunctionReturningArgcTimesArg0(JSContext *cx, unsigned argc, JS::Value *vp) + * { + * JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + * + * // Guard against no arguments or a non-numeric arg0. + * if (args.length() == 0 || !args[0].isNumber()) { + * args.rval().setInt32(0); + * return true; + * } + * + * args.rval().set(JS::NumberValue(args.length() * args[0].toNumber())); + * return true; + * } + * + * CallArgs is exposed publicly and used internally. Not all parts of its + * public interface are meant to be used by embedders! See inline comments to + * for details. + */ +namespace detail { + +template +class MOZ_STACK_CLASS CallArgsBase : + public mozilla::Conditional >::Type +{ + protected: + unsigned argc_; + + public: + /* Returns the number of arguments. */ + unsigned length() const { return argc_; } + + /* Returns the i-th zero-indexed argument. */ + MutableHandleValue operator[](unsigned i) const { + MOZ_ASSERT(i < argc_); + return MutableHandleValue::fromMarkedLocation(&this->argv_[i]); + } + + /* + * Returns the i-th zero-indexed argument, or |undefined| if there's no + * such argument. + */ + HandleValue get(unsigned i) const { + return i < length() + ? HandleValue::fromMarkedLocation(&this->argv_[i]) + : UndefinedHandleValue; + } + + /* + * Returns true if the i-th zero-indexed argument is present and is not + * |undefined|. + */ + bool hasDefined(unsigned i) const { + return i < argc_ && !this->argv_[i].isUndefined(); + } + + public: + // These methods are publicly exposed, but we're less sure of the interface + // here than we'd like (because they're hackish and drop assertions). Try + // to avoid using these if you can. + + Value *array() const { return this->argv_; } + Value *end() const { return this->argv_ + argc_; } +}; + +} // namespace detail + +class MOZ_STACK_CLASS CallArgs : public detail::CallArgsBase +{ + private: + friend CallArgs CallArgsFromVp(unsigned argc, Value *vp); + friend CallArgs CallArgsFromSp(unsigned argc, Value *sp); + + static CallArgs create(unsigned argc, Value *argv) { + CallArgs args; + args.clearUsedRval(); + args.argv_ = argv; + args.argc_ = argc; + return args; + } + +}; + +MOZ_ALWAYS_INLINE CallArgs +CallArgsFromVp(unsigned argc, Value *vp) +{ + return CallArgs::create(argc, vp + 2); +} + +// This method is only intended for internal use in SpiderMonkey. We may +// eventually move it to an internal header. Embedders should use +// JS::CallArgsFromVp! +MOZ_ALWAYS_INLINE CallArgs +CallArgsFromSp(unsigned argc, Value *sp) +{ + return CallArgs::create(argc, sp - argc); +} + +} // namespace JS + +/* + * Macros to hide interpreter stack layout details from a JSNative using its + * JS::Value *vp parameter. DO NOT USE THESE! Instead use JS::CallArgs and + * friends, above. These macros will be removed when we change JSNative to + * take a const JS::CallArgs&. + */ + +#define JS_THIS_OBJECT(cx,vp) (JS_THIS(cx,vp).toObjectOrNull()) + +/* + * Note: if this method returns null, an error has occurred and must be + * propagated or caught. + */ +MOZ_ALWAYS_INLINE JS::Value +JS_THIS(JSContext *cx, JS::Value *vp) +{ + return vp[1].isPrimitive() ? JS_ComputeThis(cx, vp) : vp[1]; +} + +/* + * |this| is passed to functions in ES5 without change. Functions themselves + * do any post-processing they desire to box |this|, compute the global object, + * &c. This macro retrieves a function's unboxed |this| value. + * + * This macro must not be used in conjunction with JS_THIS or JS_THIS_OBJECT, + * or vice versa. Either use the provided this value with this macro, or + * compute the boxed |this| value using those. JS_THIS_VALUE must not be used + * if the function is being called as a constructor. + * + * But: DO NOT USE THIS! Instead use JS::CallArgs::thisv(), above. + * + */ +#define JS_THIS_VALUE(cx,vp) ((vp)[1]) + +#endif /* js_CallArgs_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallNonGenericMethod.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallNonGenericMethod.h new file mode 100644 index 0000000000..ad9a7f708c --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CallNonGenericMethod.h @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_CallNonGenericMethod_h +#define js_CallNonGenericMethod_h + +#include "jstypes.h" + +#include "js/CallArgs.h" + +namespace JS { + +// Returns true if |v| is considered an acceptable this-value. +typedef bool (*IsAcceptableThis)(HandleValue v); + +// Implements the guts of a method; guaranteed to be provided an acceptable +// this-value, as determined by a corresponding IsAcceptableThis method. +typedef bool (*NativeImpl)(JSContext *cx, CallArgs args); + +namespace detail { + +// DON'T CALL THIS DIRECTLY. It's for use only by CallNonGenericMethod! +extern JS_PUBLIC_API(bool) +CallMethodIfWrapped(JSContext *cx, IsAcceptableThis test, NativeImpl impl, CallArgs args); + +} // namespace detail + +// Methods usually act upon |this| objects only from a single global object and +// compartment. Sometimes, however, a method must act upon |this| values from +// multiple global objects or compartments. In such cases the |this| value a +// method might see will be wrapped, such that various access to the object -- +// to its class, its private data, its reserved slots, and so on -- will not +// work properly without entering that object's compartment. This method +// implements a solution to this problem. +// +// To implement a method that accepts |this| values from multiple compartments, +// define two functions. The first function matches the IsAcceptableThis type +// and indicates whether the provided value is an acceptable |this| for the +// method; it must be a pure function only of its argument. +// +// static const JSClass AnswerClass = { ... }; +// +// static bool +// IsAnswerObject(const Value &v) +// { +// if (!v.isObject()) +// return false; +// return JS_GetClass(&v.toObject()) == &AnswerClass; +// } +// +// The second function implements the NativeImpl signature and defines the +// behavior of the method when it is provided an acceptable |this| value. +// Aside from some typing niceties -- see the CallArgs interface for details -- +// its interface is the same as that of JSNative. +// +// static bool +// answer_getAnswer_impl(JSContext *cx, JS::CallArgs args) +// { +// args.rval().setInt32(42); +// return true; +// } +// +// The implementation function is guaranteed to be called *only* with a |this| +// value which is considered acceptable. +// +// Now to implement the actual method, write a JSNative that calls the method +// declared below, passing the appropriate template and runtime arguments. +// +// static bool +// answer_getAnswer(JSContext *cx, unsigned argc, JS::Value *vp) +// { +// JS::CallArgs args = JS::CallArgsFromVp(argc, vp); +// return JS::CallNonGenericMethod(cx, args); +// } +// +// Note that, because they are used as template arguments, the predicate +// and implementation functions must have external linkage. (This is +// unfortunate, but GCC wasn't inlining things as one would hope when we +// passed them as function arguments.) +// +// JS::CallNonGenericMethod will test whether |args.thisv()| is acceptable. If +// it is, it will call the provided implementation function, which will return +// a value and indicate success. If it is not, it will attempt to unwrap +// |this| and call the implementation function on the unwrapped |this|. If +// that succeeds, all well and good. If it doesn't succeed, a TypeError will +// be thrown. +// +// Note: JS::CallNonGenericMethod will only work correctly if it's called in +// tail position in a JSNative. Do not call it from any other place. +// +template +MOZ_ALWAYS_INLINE bool +CallNonGenericMethod(JSContext *cx, CallArgs args) +{ + HandleValue thisv = args.thisv(); + if (Test(thisv)) + return Impl(cx, args); + + return detail::CallMethodIfWrapped(cx, Test, Impl, args); +} + +MOZ_ALWAYS_INLINE bool +CallNonGenericMethod(JSContext *cx, IsAcceptableThis Test, NativeImpl Impl, CallArgs args) +{ + HandleValue thisv = args.thisv(); + if (Test(thisv)) + return Impl(cx, args); + + return detail::CallMethodIfWrapped(cx, Test, Impl, args); +} + +} // namespace JS + +#endif /* js_CallNonGenericMethod_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CharacterEncoding.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CharacterEncoding.h new file mode 100644 index 0000000000..45c77761b3 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/CharacterEncoding.h @@ -0,0 +1,226 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_CharacterEncoding_h +#define js_CharacterEncoding_h + +#include "mozilla/NullPtr.h" +#include "mozilla/Range.h" + +#include "js/TypeDecls.h" +#include "js/Utility.h" + +namespace js { +struct ThreadSafeContext; +} + +class JSFlatString; + +namespace JS { + +/* + * By default, all C/C++ 1-byte-per-character strings passed into the JSAPI + * are treated as ISO/IEC 8859-1, also known as Latin-1. That is, each + * byte is treated as a 2-byte character, and there is no way to pass in a + * string containing characters beyond U+00FF. + */ +class Latin1Chars : public mozilla::Range +{ + typedef mozilla::Range Base; + + public: + Latin1Chars() : Base() {} + Latin1Chars(char *aBytes, size_t aLength) : Base(reinterpret_cast(aBytes), aLength) {} + Latin1Chars(const Latin1Char *aBytes, size_t aLength) + : Base(const_cast(aBytes), aLength) + {} + Latin1Chars(const char *aBytes, size_t aLength) + : Base(reinterpret_cast(const_cast(aBytes)), aLength) + {} +}; + +/* + * A Latin1Chars, but with \0 termination for C compatibility. + */ +class Latin1CharsZ : public mozilla::RangedPtr +{ + typedef mozilla::RangedPtr Base; + + public: + Latin1CharsZ() : Base(nullptr, 0) {} + + Latin1CharsZ(char *aBytes, size_t aLength) + : Base(reinterpret_cast(aBytes), aLength) + { + MOZ_ASSERT(aBytes[aLength] == '\0'); + } + + Latin1CharsZ(Latin1Char *aBytes, size_t aLength) + : Base(aBytes, aLength) + { + MOZ_ASSERT(aBytes[aLength] == '\0'); + } + + using Base::operator=; + + char *c_str() { return reinterpret_cast(get()); } +}; + +class UTF8Chars : public mozilla::Range +{ + typedef mozilla::Range Base; + + public: + UTF8Chars() : Base() {} + UTF8Chars(char *aBytes, size_t aLength) + : Base(reinterpret_cast(aBytes), aLength) + {} + UTF8Chars(const char *aBytes, size_t aLength) + : Base(reinterpret_cast(const_cast(aBytes)), aLength) + {} +}; + +/* + * SpiderMonkey also deals directly with UTF-8 encoded text in some places. + */ +class UTF8CharsZ : public mozilla::RangedPtr +{ + typedef mozilla::RangedPtr Base; + + public: + UTF8CharsZ() : Base(nullptr, 0) {} + + UTF8CharsZ(char *aBytes, size_t aLength) + : Base(reinterpret_cast(aBytes), aLength) + { + MOZ_ASSERT(aBytes[aLength] == '\0'); + } + + UTF8CharsZ(unsigned char *aBytes, size_t aLength) + : Base(aBytes, aLength) + { + MOZ_ASSERT(aBytes[aLength] == '\0'); + } + + using Base::operator=; + + char *c_str() { return reinterpret_cast(get()); } +}; + +/* + * SpiderMonkey uses a 2-byte character representation: it is a + * 2-byte-at-a-time view of a UTF-16 byte stream. This is similar to UCS-2, + * but unlike UCS-2, we do not strip UTF-16 extension bytes. This allows a + * sufficiently dedicated JavaScript program to be fully unicode-aware by + * manually interpreting UTF-16 extension characters embedded in the JS + * string. + */ +class TwoByteChars : public mozilla::Range +{ + typedef mozilla::Range Base; + + public: + TwoByteChars() : Base() {} + TwoByteChars(jschar *aChars, size_t aLength) : Base(aChars, aLength) {} + TwoByteChars(const jschar *aChars, size_t aLength) : Base(const_cast(aChars), aLength) {} +}; + +/* + * A TwoByteChars, but \0 terminated for compatibility with JSFlatString. + */ +class TwoByteCharsZ : public mozilla::RangedPtr +{ + typedef mozilla::RangedPtr Base; + + public: + TwoByteCharsZ() : Base(nullptr, 0) {} + + TwoByteCharsZ(jschar *chars, size_t length) + : Base(chars, length) + { + MOZ_ASSERT(chars[length] == '\0'); + } + + using Base::operator=; +}; + +typedef mozilla::RangedPtr ConstCharPtr; + +/* + * Like TwoByteChars, but the chars are const. + */ +class ConstTwoByteChars : public mozilla::RangedPtr +{ + public: + ConstTwoByteChars(const ConstTwoByteChars &s) : ConstCharPtr(s) {} + MOZ_IMPLICIT ConstTwoByteChars(const mozilla::RangedPtr &s) : ConstCharPtr(s) {} + ConstTwoByteChars(const jschar *s, size_t len) : ConstCharPtr(s, len) {} + ConstTwoByteChars(const jschar *pos, const jschar *start, size_t len) + : ConstCharPtr(pos, start, len) + {} + + using ConstCharPtr::operator=; +}; + + +/* + * Convert a 2-byte character sequence to "ISO-Latin-1". This works by + * truncating each 2-byte pair in the sequence to a 1-byte pair. If the source + * contains any UTF-16 extension characters, then this may give invalid Latin1 + * output. The returned string is zero terminated. The returned string or the + * returned string's |start()| must be freed with JS_free or js_free, + * respectively. If allocation fails, an OOM error will be set and the method + * will return a nullptr chars (which can be tested for with the ! operator). + * This method cannot trigger GC. + */ +extern Latin1CharsZ +LossyTwoByteCharsToNewLatin1CharsZ(js::ThreadSafeContext *cx, + const mozilla::Range tbchars); + +template +extern UTF8CharsZ +CharsToNewUTF8CharsZ(js::ThreadSafeContext *cx, const mozilla::Range chars); + +uint32_t +Utf8ToOneUcs4Char(const uint8_t *utf8Buffer, int utf8Length); + +/* + * Inflate bytes in UTF-8 encoding to jschars. + * - On error, returns an empty TwoByteCharsZ. + * - On success, returns a malloc'd TwoByteCharsZ, and updates |outlen| to hold + * its length; the length value excludes the trailing null. + */ +extern TwoByteCharsZ +UTF8CharsToNewTwoByteCharsZ(JSContext *cx, const UTF8Chars utf8, size_t *outlen); + +/* + * The same as UTF8CharsToNewTwoByteCharsZ(), except that any malformed UTF-8 characters + * will be replaced by \uFFFD. No exception will be thrown for malformed UTF-8 + * input. + */ +extern TwoByteCharsZ +LossyUTF8CharsToNewTwoByteCharsZ(JSContext *cx, const UTF8Chars utf8, size_t *outlen); + +/* + * Returns the length of the char buffer required to encode |s| as UTF8. + * Does not include the null-terminator. + */ +JS_PUBLIC_API(size_t) +GetDeflatedUTF8StringLength(JSFlatString *s); + +/* + * Encode |src| as UTF8. The caller must ensure |dst| has enough space. + * Does not write the null terminator. + */ +JS_PUBLIC_API(void) +DeflateStringToUTF8Buffer(JSFlatString *src, mozilla::RangedPtr dst); + +} // namespace JS + +inline void JS_free(JS::Latin1CharsZ &ptr) { js_free((void*)ptr.get()); } +inline void JS_free(JS::UTF8CharsZ &ptr) { js_free((void*)ptr.get()); } + +#endif /* js_CharacterEncoding_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Class.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Class.h new file mode 100644 index 0000000000..559cc65c85 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Class.h @@ -0,0 +1,544 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* JSClass definition and its component types, plus related interfaces. */ + +#ifndef js_Class_h +#define js_Class_h + +#include "mozilla/NullPtr.h" + +#include "jstypes.h" + +#include "js/CallArgs.h" +#include "js/Id.h" +#include "js/TypeDecls.h" + +/* + * A JSClass acts as a vtable for JS objects that allows JSAPI clients to + * control various aspects of the behavior of an object like property lookup. + * js::Class is an engine-private extension that allows more control over + * object behavior and, e.g., allows custom slow layout. + */ + +struct JSFreeOp; +struct JSFunctionSpec; + +namespace js { + +struct Class; +class FreeOp; +class PropertyName; +class Shape; + +// This is equal to JSFunction::class_. Use it in places where you don't want +// to #include jsfun.h. +extern JS_FRIEND_DATA(const js::Class* const) FunctionClassPtr; + +} // namespace js + +// JSClass operation signatures. + +// Add or get a property named by id in obj. Note the jsid id type -- id may +// be a string (Unicode property identifier) or an int (element index). The +// *vp out parameter, on success, is the new property value after the action. +typedef bool +(* JSPropertyOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleValue vp); + +// Set a property named by id in obj, treating the assignment as strict +// mode code if strict is true. Note the jsid id type -- id may be a string +// (Unicode property identifier) or an int (element index). The *vp out +// parameter, on success, is the new property value after the +// set. +typedef bool +(* JSStrictPropertyOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + bool strict, JS::MutableHandleValue vp); + +// Delete a property named by id in obj. +// +// If an error occurred, return false as per normal JSAPI error practice. +// +// If no error occurred, but the deletion attempt wasn't allowed (perhaps +// because the property was non-configurable), set *succeeded to false and +// return true. This will cause |delete obj[id]| to evaluate to false in +// non-strict mode code, and to throw a TypeError in strict mode code. +// +// If no error occurred and the deletion wasn't disallowed (this is *not* the +// same as saying that a deletion actually occurred -- deleting a non-existent +// property, or an inherited property, is allowed -- it's just pointless), +// set *succeeded to true and return true. +typedef bool +(* JSDeletePropertyOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + bool *succeeded); + +// This function type is used for callbacks that enumerate the properties of +// a JSObject. The behavior depends on the value of enum_op: +// +// JSENUMERATE_INIT +// A new, opaque iterator state should be allocated and stored in *statep. +// (You can use PRIVATE_TO_JSVAL() to tag the pointer to be stored). +// +// The number of properties that will be enumerated should be returned as +// an integer jsval in *idp, if idp is non-null, and provided the number of +// enumerable properties is known. If idp is non-null and the number of +// enumerable properties can't be computed in advance, *idp should be set +// to JSVAL_ZERO. +// +// JSENUMERATE_INIT_ALL +// Used identically to JSENUMERATE_INIT, but exposes all properties of the +// object regardless of enumerability. +// +// JSENUMERATE_NEXT +// A previously allocated opaque iterator state is passed in via statep. +// Return the next jsid in the iteration using *idp. The opaque iterator +// state pointed at by statep is destroyed and *statep is set to JSVAL_NULL +// if there are no properties left to enumerate. +// +// JSENUMERATE_DESTROY +// Destroy the opaque iterator state previously allocated in *statep by a +// call to this function when enum_op was JSENUMERATE_INIT or +// JSENUMERATE_INIT_ALL. +// +// The return value is used to indicate success, with a value of false +// indicating failure. +typedef bool +(* JSNewEnumerateOp)(JSContext *cx, JS::HandleObject obj, JSIterateOp enum_op, + JS::MutableHandleValue statep, JS::MutableHandleId idp); + +// The old-style JSClass.enumerate op should define all lazy properties not +// yet reflected in obj. +typedef bool +(* JSEnumerateOp)(JSContext *cx, JS::HandleObject obj); + +// Resolve a lazy property named by id in obj by defining it directly in obj. +// Lazy properties are those reflected from some peer native property space +// (e.g., the DOM attributes for a given node reflected as obj) on demand. +// +// JS looks for a property in an object, and if not found, tries to resolve +// the given id. If resolve succeeds, the engine looks again in case resolve +// defined obj[id]. If no such property exists directly in obj, the process +// is repeated with obj's prototype, etc. +// +// NB: JSNewResolveOp provides a cheaper way to resolve lazy properties. +typedef bool +(* JSResolveOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id); + +// Like JSResolveOp, except the *objp out parameter, on success, should be null +// to indicate that id was not resolved; and non-null, referring to obj or one +// of its prototypes, if id was resolved. The hook may assume *objp is null on +// entry. +// +// This hook instead of JSResolveOp is called via the JSClass.resolve member +// if JSCLASS_NEW_RESOLVE is set in JSClass.flags. +typedef bool +(* JSNewResolveOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleObject objp); + +// Convert obj to the given type, returning true with the resulting value in +// *vp on success, and returning false on error or exception. +typedef bool +(* JSConvertOp)(JSContext *cx, JS::HandleObject obj, JSType type, + JS::MutableHandleValue vp); + +// Finalize obj, which the garbage collector has determined to be unreachable +// from other live objects or from GC roots. Obviously, finalizers must never +// store a reference to obj. +typedef void +(* JSFinalizeOp)(JSFreeOp *fop, JSObject *obj); + +// Finalizes external strings created by JS_NewExternalString. +struct JSStringFinalizer { + void (*finalize)(const JSStringFinalizer *fin, jschar *chars); +}; + +// Check whether v is an instance of obj. Return false on error or exception, +// true on success with true in *bp if v is an instance of obj, false in +// *bp otherwise. +typedef bool +(* JSHasInstanceOp)(JSContext *cx, JS::HandleObject obj, JS::MutableHandleValue vp, + bool *bp); + +// Function type for trace operation of the class called to enumerate all +// traceable things reachable from obj's private data structure. For each such +// thing, a trace implementation must call one of the JS_Call*Tracer variants +// on the thing. +// +// JSTraceOp implementation can assume that no other threads mutates object +// state. It must not change state of the object or corresponding native +// structures. The only exception for this rule is the case when the embedding +// needs a tight integration with GC. In that case the embedding can check if +// the traversal is a part of the marking phase through calling +// JS_IsGCMarkingTracer and apply a special code like emptying caches or +// marking its native structures. +typedef void +(* JSTraceOp)(JSTracer *trc, JSObject *obj); + +// Hook that creates an iterator object for a given object. Returns the +// iterator object or null if an error or exception was thrown on cx. +typedef JSObject * +(* JSIteratorOp)(JSContext *cx, JS::HandleObject obj, bool keysonly); + +typedef JSObject * +(* JSWeakmapKeyDelegateOp)(JSObject *obj); + +/* js::Class operation signatures. */ + +namespace js { + +typedef bool +(* LookupGenericOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleObject objp, JS::MutableHandle propp); +typedef bool +(* LookupPropOp)(JSContext *cx, JS::HandleObject obj, JS::Handle name, + JS::MutableHandleObject objp, JS::MutableHandle propp); +typedef bool +(* LookupElementOp)(JSContext *cx, JS::HandleObject obj, uint32_t index, + JS::MutableHandleObject objp, JS::MutableHandle propp); +typedef bool +(* DefineGenericOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue value, + JSPropertyOp getter, JSStrictPropertyOp setter, unsigned attrs); +typedef bool +(* DefinePropOp)(JSContext *cx, JS::HandleObject obj, JS::Handle name, + JS::HandleValue value, JSPropertyOp getter, JSStrictPropertyOp setter, + unsigned attrs); +typedef bool +(* DefineElementOp)(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleValue value, + JSPropertyOp getter, JSStrictPropertyOp setter, unsigned attrs); +typedef bool +(* GenericIdOp)(JSContext *cx, JS::HandleObject obj, JS::HandleObject receiver, JS::HandleId id, + JS::MutableHandleValue vp); +typedef bool +(* PropertyIdOp)(JSContext *cx, JS::HandleObject obj, JS::HandleObject receiver, + JS::Handle name, JS::MutableHandleValue vp); +typedef bool +(* ElementIdOp)(JSContext *cx, JS::HandleObject obj, JS::HandleObject receiver, uint32_t index, + JS::MutableHandleValue vp); +typedef bool +(* StrictGenericIdOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleValue vp, bool strict); +typedef bool +(* StrictPropertyIdOp)(JSContext *cx, JS::HandleObject obj, JS::Handle name, + JS::MutableHandleValue vp, bool strict); +typedef bool +(* StrictElementIdOp)(JSContext *cx, JS::HandleObject obj, uint32_t index, + JS::MutableHandleValue vp, bool strict); +typedef bool +(* GenericAttributesOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, unsigned *attrsp); +typedef bool +(* PropertyAttributesOp)(JSContext *cx, JS::HandleObject obj, JS::Handle name, + unsigned *attrsp); +typedef bool +(* DeleteGenericOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool *succeeded); + +typedef bool +(* WatchOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject callable); + +typedef bool +(* UnwatchOp)(JSContext *cx, JS::HandleObject obj, JS::HandleId id); + +typedef bool +(* SliceOp)(JSContext *cx, JS::HandleObject obj, uint32_t begin, uint32_t end, + JS::HandleObject result); // result is actually preallocted. + +// A generic type for functions mapping an object to another object, or null +// if an error or exception was thrown on cx. +typedef JSObject * +(* ObjectOp)(JSContext *cx, JS::HandleObject obj); + +// Hook to map an object to its inner object. Infallible. +typedef JSObject * +(* InnerObjectOp)(JSObject *obj); + +typedef void +(* FinalizeOp)(FreeOp *fop, JSObject *obj); + +#define JS_CLASS_MEMBERS(FinalizeOpType) \ + const char *name; \ + uint32_t flags; \ + \ + /* Mandatory function pointer members. */ \ + JSPropertyOp addProperty; \ + JSDeletePropertyOp delProperty; \ + JSPropertyOp getProperty; \ + JSStrictPropertyOp setProperty; \ + JSEnumerateOp enumerate; \ + JSResolveOp resolve; \ + JSConvertOp convert; \ + \ + /* Optional members (may be null). */ \ + FinalizeOpType finalize; \ + JSNative call; \ + JSHasInstanceOp hasInstance; \ + JSNative construct; \ + JSTraceOp trace + +// Callback for the creation of constructor and prototype objects. +typedef JSObject *(*ClassObjectCreationOp)(JSContext *cx, JSProtoKey key); + +// Callback for custom post-processing after class initialization via ClassSpec. +typedef bool (*FinishClassInitOp)(JSContext *cx, JS::HandleObject ctor, + JS::HandleObject proto); + +struct ClassSpec +{ + ClassObjectCreationOp createConstructor; + ClassObjectCreationOp createPrototype; + const JSFunctionSpec *constructorFunctions; + const JSFunctionSpec *prototypeFunctions; + const JSPropertySpec *prototypeProperties; + FinishClassInitOp finishInit; + bool defined() const { return !!createConstructor; } +}; + +struct ClassExtension +{ + ObjectOp outerObject; + InnerObjectOp innerObject; + JSIteratorOp iteratorObject; + + /* + * isWrappedNative is true only if the class is an XPCWrappedNative. + * WeakMaps use this to override the wrapper disposal optimization. + */ + bool isWrappedNative; + + /* + * If an object is used as a key in a weakmap, it may be desirable for the + * garbage collector to keep that object around longer than it otherwise + * would. A common case is when the key is a wrapper around an object in + * another compartment, and we want to avoid collecting the wrapper (and + * removing the weakmap entry) as long as the wrapped object is alive. In + * that case, the wrapped object is returned by the wrapper's + * weakmapKeyDelegateOp hook. As long as the wrapper is used as a weakmap + * key, it will not be collected (and remain in the weakmap) until the + * wrapped object is collected. + */ + JSWeakmapKeyDelegateOp weakmapKeyDelegateOp; +}; + +#define JS_NULL_CLASS_SPEC {nullptr,nullptr,nullptr,nullptr,nullptr,nullptr} +#define JS_NULL_CLASS_EXT {nullptr,nullptr,nullptr,false,nullptr} + +struct ObjectOps +{ + LookupGenericOp lookupGeneric; + LookupPropOp lookupProperty; + LookupElementOp lookupElement; + DefineGenericOp defineGeneric; + DefinePropOp defineProperty; + DefineElementOp defineElement; + GenericIdOp getGeneric; + PropertyIdOp getProperty; + ElementIdOp getElement; + StrictGenericIdOp setGeneric; + StrictPropertyIdOp setProperty; + StrictElementIdOp setElement; + GenericAttributesOp getGenericAttributes; + GenericAttributesOp setGenericAttributes; + DeleteGenericOp deleteGeneric; + WatchOp watch; + UnwatchOp unwatch; + SliceOp slice; // Optimized slice, can be null. + JSNewEnumerateOp enumerate; + ObjectOp thisObject; +}; + +#define JS_NULL_OBJECT_OPS \ + {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, \ + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, \ + nullptr, nullptr, nullptr} + +} // namespace js + +// Classes, objects, and properties. + +typedef void (*JSClassInternal)(); + +struct JSClass { + JS_CLASS_MEMBERS(JSFinalizeOp); + + void *reserved[31]; +}; + +#define JSCLASS_HAS_PRIVATE (1<<0) // objects have private slot +#define JSCLASS_NEW_ENUMERATE (1<<1) // has JSNewEnumerateOp hook +#define JSCLASS_NEW_RESOLVE (1<<2) // has JSNewResolveOp hook +#define JSCLASS_PRIVATE_IS_NSISUPPORTS (1<<3) // private is (nsISupports *) +#define JSCLASS_IS_DOMJSCLASS (1<<4) // objects are DOM +#define JSCLASS_IMPLEMENTS_BARRIERS (1<<5) // Correctly implements GC read + // and write barriers +#define JSCLASS_EMULATES_UNDEFINED (1<<6) // objects of this class act + // like the value undefined, + // in some contexts +#define JSCLASS_USERBIT1 (1<<7) // Reserved for embeddings. + +// To reserve slots fetched and stored via JS_Get/SetReservedSlot, bitwise-or +// JSCLASS_HAS_RESERVED_SLOTS(n) into the initializer for JSClass.flags, where +// n is a constant in [1, 255]. Reserved slots are indexed from 0 to n-1. +#define JSCLASS_RESERVED_SLOTS_SHIFT 8 // room for 8 flags below */ +#define JSCLASS_RESERVED_SLOTS_WIDTH 8 // and 16 above this field */ +#define JSCLASS_RESERVED_SLOTS_MASK JS_BITMASK(JSCLASS_RESERVED_SLOTS_WIDTH) +#define JSCLASS_HAS_RESERVED_SLOTS(n) (((n) & JSCLASS_RESERVED_SLOTS_MASK) \ + << JSCLASS_RESERVED_SLOTS_SHIFT) +#define JSCLASS_RESERVED_SLOTS(clasp) (((clasp)->flags \ + >> JSCLASS_RESERVED_SLOTS_SHIFT) \ + & JSCLASS_RESERVED_SLOTS_MASK) + +#define JSCLASS_HIGH_FLAGS_SHIFT (JSCLASS_RESERVED_SLOTS_SHIFT + \ + JSCLASS_RESERVED_SLOTS_WIDTH) + +#define JSCLASS_IS_ANONYMOUS (1<<(JSCLASS_HIGH_FLAGS_SHIFT+0)) +#define JSCLASS_IS_GLOBAL (1<<(JSCLASS_HIGH_FLAGS_SHIFT+1)) +#define JSCLASS_INTERNAL_FLAG2 (1<<(JSCLASS_HIGH_FLAGS_SHIFT+2)) +#define JSCLASS_INTERNAL_FLAG3 (1<<(JSCLASS_HIGH_FLAGS_SHIFT+3)) + +#define JSCLASS_IS_PROXY (1<<(JSCLASS_HIGH_FLAGS_SHIFT+4)) + +// Bit 22 unused. + +// Reserved for embeddings. +#define JSCLASS_USERBIT2 (1<<(JSCLASS_HIGH_FLAGS_SHIFT+6)) +#define JSCLASS_USERBIT3 (1<<(JSCLASS_HIGH_FLAGS_SHIFT+7)) + +#define JSCLASS_BACKGROUND_FINALIZE (1<<(JSCLASS_HIGH_FLAGS_SHIFT+8)) + +// Bits 26 through 31 are reserved for the CACHED_PROTO_KEY mechanism, see +// below. + +// ECMA-262 requires that most constructors used internally create objects +// with "the original Foo.prototype value" as their [[Prototype]] (__proto__) +// member initial value. The "original ... value" verbiage is there because +// in ECMA-262, global properties naming class objects are read/write and +// deleteable, for the most part. +// +// Implementing this efficiently requires that global objects have classes +// with the following flags. Failure to use JSCLASS_GLOBAL_FLAGS was +// previously allowed, but is now an ES5 violation and thus unsupported. +// +// JSCLASS_GLOBAL_APPLICATION_SLOTS is the number of slots reserved at +// the beginning of every global object's slots for use by the +// application. +#define JSCLASS_GLOBAL_APPLICATION_SLOTS 3 +#define JSCLASS_GLOBAL_SLOT_COUNT (JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 3 + 30) +#define JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(n) \ + (JSCLASS_IS_GLOBAL | JSCLASS_HAS_RESERVED_SLOTS(JSCLASS_GLOBAL_SLOT_COUNT + (n))) +#define JSCLASS_GLOBAL_FLAGS \ + JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(0) +#define JSCLASS_HAS_GLOBAL_FLAG_AND_SLOTS(clasp) \ + (((clasp)->flags & JSCLASS_IS_GLOBAL) \ + && JSCLASS_RESERVED_SLOTS(clasp) >= JSCLASS_GLOBAL_SLOT_COUNT) + +// Fast access to the original value of each standard class's prototype. +#define JSCLASS_CACHED_PROTO_SHIFT (JSCLASS_HIGH_FLAGS_SHIFT + 10) +#define JSCLASS_CACHED_PROTO_WIDTH 6 +#define JSCLASS_CACHED_PROTO_MASK JS_BITMASK(JSCLASS_CACHED_PROTO_WIDTH) +#define JSCLASS_HAS_CACHED_PROTO(key) (uint32_t(key) << JSCLASS_CACHED_PROTO_SHIFT) +#define JSCLASS_CACHED_PROTO_KEY(clasp) ((JSProtoKey) \ + (((clasp)->flags \ + >> JSCLASS_CACHED_PROTO_SHIFT) \ + & JSCLASS_CACHED_PROTO_MASK)) + +// Initializer for unused members of statically initialized JSClass structs. +#define JSCLASS_NO_INTERNAL_MEMBERS {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} +#define JSCLASS_NO_OPTIONAL_MEMBERS 0,0,0,0,0,JSCLASS_NO_INTERNAL_MEMBERS + +namespace js { + +struct Class +{ + JS_CLASS_MEMBERS(FinalizeOp); + ClassSpec spec; + ClassExtension ext; + ObjectOps ops; + + /* Class is not native and its map is not a scope. */ + static const uint32_t NON_NATIVE = JSCLASS_INTERNAL_FLAG2; + + bool isNative() const { + return !(flags & NON_NATIVE); + } + + bool hasPrivate() const { + return !!(flags & JSCLASS_HAS_PRIVATE); + } + + bool emulatesUndefined() const { + return flags & JSCLASS_EMULATES_UNDEFINED; + } + + bool isJSFunction() const { + return this == js::FunctionClassPtr; + } + + bool isCallable() const { + return isJSFunction() || call; + } + + bool isProxy() const { + return flags & JSCLASS_IS_PROXY; + } + + bool isDOMClass() const { + return flags & JSCLASS_IS_DOMJSCLASS; + } + + static size_t offsetOfFlags() { return offsetof(Class, flags); } +}; + +JS_STATIC_ASSERT(offsetof(JSClass, name) == offsetof(Class, name)); +JS_STATIC_ASSERT(offsetof(JSClass, flags) == offsetof(Class, flags)); +JS_STATIC_ASSERT(offsetof(JSClass, addProperty) == offsetof(Class, addProperty)); +JS_STATIC_ASSERT(offsetof(JSClass, delProperty) == offsetof(Class, delProperty)); +JS_STATIC_ASSERT(offsetof(JSClass, getProperty) == offsetof(Class, getProperty)); +JS_STATIC_ASSERT(offsetof(JSClass, setProperty) == offsetof(Class, setProperty)); +JS_STATIC_ASSERT(offsetof(JSClass, enumerate) == offsetof(Class, enumerate)); +JS_STATIC_ASSERT(offsetof(JSClass, resolve) == offsetof(Class, resolve)); +JS_STATIC_ASSERT(offsetof(JSClass, convert) == offsetof(Class, convert)); +JS_STATIC_ASSERT(offsetof(JSClass, finalize) == offsetof(Class, finalize)); +JS_STATIC_ASSERT(offsetof(JSClass, call) == offsetof(Class, call)); +JS_STATIC_ASSERT(offsetof(JSClass, construct) == offsetof(Class, construct)); +JS_STATIC_ASSERT(offsetof(JSClass, hasInstance) == offsetof(Class, hasInstance)); +JS_STATIC_ASSERT(offsetof(JSClass, trace) == offsetof(Class, trace)); +JS_STATIC_ASSERT(sizeof(JSClass) == sizeof(Class)); + +static MOZ_ALWAYS_INLINE const JSClass * +Jsvalify(const Class *c) +{ + return (const JSClass *)c; +} + +static MOZ_ALWAYS_INLINE const Class * +Valueify(const JSClass *c) +{ + return (const Class *)c; +} + +/* + * Enumeration describing possible values of the [[Class]] internal property + * value of objects. + */ +enum ESClassValue { + ESClass_Array, ESClass_Number, ESClass_String, ESClass_Boolean, + ESClass_RegExp, ESClass_ArrayBuffer, ESClass_Date +}; + +/* + * Return whether the given object has the given [[Class]] internal property + * value. Beware, this query says nothing about the js::Class of the JSObject + * so the caller must not assume anything about obj's representation (e.g., obj + * may be a proxy). + */ +inline bool +ObjectClassIs(JSObject &obj, ESClassValue classValue, JSContext *cx); + +/* Just a helper that checks v.isObject before calling ObjectClassIs. */ +inline bool +IsObjectWithClass(const JS::Value &v, ESClassValue classValue, JSContext *cx); + +} /* namespace js */ + +#endif /* js_Class_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Date.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Date.h new file mode 100644 index 0000000000..6199f9eca5 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Date.h @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_Date_h +#define js_Date_h + +#include "jstypes.h" + +namespace JS { + +// Year is a year, month is 0-11, day is 1-based. The return value is +// a number of milliseconds since the epoch. Can return NaN. +JS_PUBLIC_API(double) +MakeDate(double year, unsigned month, unsigned day); + +// Takes an integer number of milliseconds since the epoch and returns the +// year. Can return NaN, and will do so if NaN is passed in. +JS_PUBLIC_API(double) +YearFromTime(double time); + +// Takes an integer number of milliseconds since the epoch and returns the +// month (0-11). Can return NaN, and will do so if NaN is passed in. +JS_PUBLIC_API(double) +MonthFromTime(double time); + +// Takes an integer number of milliseconds since the epoch and returns the +// day (1-based). Can return NaN, and will do so if NaN is passed in. +JS_PUBLIC_API(double) +DayFromTime(double time); + +} // namespace JS + +#endif /* js_Date_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/GCAPI.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/GCAPI.h new file mode 100644 index 0000000000..c58d62d029 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/GCAPI.h @@ -0,0 +1,514 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_GCAPI_h +#define js_GCAPI_h + +#include "mozilla/NullPtr.h" + +#include "js/HeapAPI.h" + +namespace js { +namespace gc { +class GCRuntime; +} +} + +typedef enum JSGCMode { + /* Perform only global GCs. */ + JSGC_MODE_GLOBAL = 0, + + /* Perform per-compartment GCs until too much garbage has accumulated. */ + JSGC_MODE_COMPARTMENT = 1, + + /* + * Collect in short time slices rather than all at once. Implies + * JSGC_MODE_COMPARTMENT. + */ + JSGC_MODE_INCREMENTAL = 2 +} JSGCMode; + +namespace JS { + +#define GCREASONS(D) \ + /* Reasons internal to the JS engine */ \ + D(API) \ + D(MAYBEGC) \ + D(DESTROY_RUNTIME) \ + D(DESTROY_CONTEXT) \ + D(LAST_DITCH) \ + D(TOO_MUCH_MALLOC) \ + D(ALLOC_TRIGGER) \ + D(DEBUG_GC) \ + D(TRANSPLANT) \ + D(RESET) \ + D(OUT_OF_NURSERY) \ + D(EVICT_NURSERY) \ + D(FULL_STORE_BUFFER) \ + \ + /* These are reserved for future use. */ \ + D(RESERVED0) \ + D(RESERVED1) \ + D(RESERVED2) \ + D(RESERVED3) \ + D(RESERVED4) \ + D(RESERVED5) \ + D(RESERVED6) \ + D(RESERVED7) \ + D(RESERVED8) \ + D(RESERVED9) \ + D(RESERVED10) \ + D(RESERVED11) \ + D(RESERVED12) \ + D(RESERVED13) \ + D(RESERVED14) \ + D(RESERVED15) \ + D(RESERVED16) \ + D(RESERVED17) \ + D(RESERVED18) \ + D(RESERVED19) \ + \ + /* Reasons from Firefox */ \ + D(DOM_WINDOW_UTILS) \ + D(COMPONENT_UTILS) \ + D(MEM_PRESSURE) \ + D(CC_WAITING) \ + D(CC_FORCED) \ + D(LOAD_END) \ + D(POST_COMPARTMENT) \ + D(PAGE_HIDE) \ + D(NSJSCONTEXT_DESTROY) \ + D(SET_NEW_DOCUMENT) \ + D(SET_DOC_SHELL) \ + D(DOM_UTILS) \ + D(DOM_IPC) \ + D(DOM_WORKER) \ + D(INTER_SLICE_GC) \ + D(REFRESH_FRAME) \ + D(FULL_GC_TIMER) \ + D(SHUTDOWN_CC) \ + D(FINISH_LARGE_EVALUTE) + +namespace gcreason { + +/* GCReasons will end up looking like JSGC_MAYBEGC */ +enum Reason { +#define MAKE_REASON(name) name, + GCREASONS(MAKE_REASON) +#undef MAKE_REASON + NO_REASON, + NUM_REASONS, + + /* + * For telemetry, we want to keep a fixed max bucket size over time so we + * don't have to switch histograms. 100 is conservative; as of this writing + * there are 26. But the cost of extra buckets seems to be low while the + * cost of switching histograms is high. + */ + NUM_TELEMETRY_REASONS = 100 +}; + +} /* namespace gcreason */ + +/* + * Zone GC: + * + * SpiderMonkey's GC is capable of performing a collection on an arbitrary + * subset of the zones in the system. This allows an embedding to minimize + * collection time by only collecting zones that have run code recently, + * ignoring the parts of the heap that are unlikely to have changed. + * + * When triggering a GC using one of the functions below, it is first necessary + * to select the zones to be collected. To do this, you can call + * PrepareZoneForGC on each zone, or you can call PrepareForFullGC to select + * all zones. Failing to select any zone is an error. + */ + +/* + * Schedule the given zone to be collected as part of the next GC. + */ +extern JS_FRIEND_API(void) +PrepareZoneForGC(Zone *zone); + +/* + * Schedule all zones to be collected in the next GC. + */ +extern JS_FRIEND_API(void) +PrepareForFullGC(JSRuntime *rt); + +/* + * When performing an incremental GC, the zones that were selected for the + * previous incremental slice must be selected in subsequent slices as well. + * This function selects those slices automatically. + */ +extern JS_FRIEND_API(void) +PrepareForIncrementalGC(JSRuntime *rt); + +/* + * Returns true if any zone in the system has been scheduled for GC with one of + * the functions above or by the JS engine. + */ +extern JS_FRIEND_API(bool) +IsGCScheduled(JSRuntime *rt); + +/* + * Undoes the effect of the Prepare methods above. The given zone will not be + * collected in the next GC. + */ +extern JS_FRIEND_API(void) +SkipZoneForGC(Zone *zone); + +/* + * Non-Incremental GC: + * + * The following functions perform a non-incremental GC. + */ + +/* + * Performs a non-incremental collection of all selected zones. Some objects + * that are unreachable from the program may still be alive afterwards because + * of internal references. + */ +extern JS_FRIEND_API(void) +GCForReason(JSRuntime *rt, gcreason::Reason reason); + +/* + * Perform a non-incremental collection after clearing caches and other + * temporary references to objects. This will remove all unreferenced objects + * in the system. + */ +extern JS_FRIEND_API(void) +ShrinkingGC(JSRuntime *rt, gcreason::Reason reason); + +/* + * Incremental GC: + * + * Incremental GC divides the full mark-and-sweep collection into multiple + * slices, allowing client JavaScript code to run between each slice. This + * allows interactive apps to avoid long collection pauses. Incremental GC does + * not make collection take less time, it merely spreads that time out so that + * the pauses are less noticable. + * + * For a collection to be carried out incrementally the following conditions + * must be met: + * - The collection must be run by calling JS::IncrementalGC() rather than + * JS_GC(). + * - The GC mode must have been set to JSGC_MODE_INCREMENTAL with + * JS_SetGCParameter(). + * - All native objects that have their own trace hook must indicate that they + * implement read and write barriers with the JSCLASS_IMPLEMENTS_BARRIERS + * flag. + * + * Note: Even if incremental GC is enabled and working correctly, + * non-incremental collections can still happen when low on memory. + */ + +/* + * Begin an incremental collection and perform one slice worth of work or + * perform a slice of an ongoing incremental collection. When this function + * returns, the collection is not complete. This function must be called + * repeatedly until !IsIncrementalGCInProgress(rt). + * + * Note: SpiderMonkey's GC is not realtime. Slices in practice may be longer or + * shorter than the requested interval. + */ +extern JS_FRIEND_API(void) +IncrementalGC(JSRuntime *rt, gcreason::Reason reason, int64_t millis = 0); + +/* + * If IsIncrementalGCInProgress(rt), this call finishes the ongoing collection + * by performing an arbitrarily long slice. If !IsIncrementalGCInProgress(rt), + * this is equivalent to GCForReason. When this function returns, + * IsIncrementalGCInProgress(rt) will always be false. + */ +extern JS_FRIEND_API(void) +FinishIncrementalGC(JSRuntime *rt, gcreason::Reason reason); + +enum GCProgress { + /* + * During non-incremental GC, the GC is bracketed by JSGC_CYCLE_BEGIN/END + * callbacks. During an incremental GC, the sequence of callbacks is as + * follows: + * JSGC_CYCLE_BEGIN, JSGC_SLICE_END (first slice) + * JSGC_SLICE_BEGIN, JSGC_SLICE_END (second slice) + * ... + * JSGC_SLICE_BEGIN, JSGC_CYCLE_END (last slice) + */ + + GC_CYCLE_BEGIN, + GC_SLICE_BEGIN, + GC_SLICE_END, + GC_CYCLE_END +}; + +struct JS_FRIEND_API(GCDescription) { + bool isCompartment_; + + explicit GCDescription(bool isCompartment) + : isCompartment_(isCompartment) {} + + jschar *formatMessage(JSRuntime *rt) const; + jschar *formatJSON(JSRuntime *rt, uint64_t timestamp) const; +}; + +typedef void +(* GCSliceCallback)(JSRuntime *rt, GCProgress progress, const GCDescription &desc); + +/* + * The GC slice callback is called at the beginning and end of each slice. This + * callback may be used for GC notifications as well as to perform additional + * marking. + */ +extern JS_FRIEND_API(GCSliceCallback) +SetGCSliceCallback(JSRuntime *rt, GCSliceCallback callback); + +/* + * Incremental GC defaults to enabled, but may be disabled for testing or in + * embeddings that have not yet implemented barriers on their native classes. + * There is not currently a way to re-enable incremental GC once it has been + * disabled on the runtime. + */ +extern JS_FRIEND_API(void) +DisableIncrementalGC(JSRuntime *rt); + +/* + * Returns true if incremental GC is enabled. Simply having incremental GC + * enabled is not sufficient to ensure incremental collections are happening. + * See the comment "Incremental GC" above for reasons why incremental GC may be + * suppressed. Inspection of the "nonincremental reason" field of the + * GCDescription returned by GCSliceCallback may help narrow down the cause if + * collections are not happening incrementally when expected. + */ +extern JS_FRIEND_API(bool) +IsIncrementalGCEnabled(JSRuntime *rt); + +/* + * Returns true while an incremental GC is ongoing, both when actively + * collecting and between slices. + */ +JS_FRIEND_API(bool) +IsIncrementalGCInProgress(JSRuntime *rt); + +/* + * Returns true when writes to GC things must call an incremental (pre) barrier. + * This is generally only true when running mutator code in-between GC slices. + * At other times, the barrier may be elided for performance. + */ +extern JS_FRIEND_API(bool) +IsIncrementalBarrierNeeded(JSRuntime *rt); + +extern JS_FRIEND_API(bool) +IsIncrementalBarrierNeeded(JSContext *cx); + +/* + * Notify the GC that a reference to a GC thing is about to be overwritten. + * These methods must be called if IsIncrementalBarrierNeeded. + */ +extern JS_FRIEND_API(void) +IncrementalReferenceBarrier(void *ptr, JSGCTraceKind kind); + +extern JS_FRIEND_API(void) +IncrementalValueBarrier(const Value &v); + +extern JS_FRIEND_API(void) +IncrementalObjectBarrier(JSObject *obj); + +/* + * Returns true if the most recent GC ran incrementally. + */ +extern JS_FRIEND_API(bool) +WasIncrementalGC(JSRuntime *rt); + +/* + * Generational GC: + * + * Note: Generational GC is not yet enabled by default. The following class + * is non-functional unless SpiderMonkey was configured with + * --enable-gcgenerational. + */ + +/* Ensure that generational GC is disabled within some scope. */ +class JS_FRIEND_API(AutoDisableGenerationalGC) +{ + js::gc::GCRuntime *gc; +#if defined(JSGC_GENERATIONAL) && defined(JS_GC_ZEAL) + bool restartVerifier; +#endif + + public: + explicit AutoDisableGenerationalGC(JSRuntime *rt); + ~AutoDisableGenerationalGC(); +}; + +/* + * Returns true if generational allocation and collection is currently enabled + * on the given runtime. + */ +extern JS_FRIEND_API(bool) +IsGenerationalGCEnabled(JSRuntime *rt); + +/* + * Returns the GC's "number". This does not correspond directly to the number + * of GCs that have been run, but is guaranteed to be monotonically increasing + * with GC activity. + */ +extern JS_FRIEND_API(size_t) +GetGCNumber(); + +/* + * The GC does not immediately return the unused memory freed by a collection + * back to the system incase it is needed soon afterwards. This call forces the + * GC to return this memory immediately. + */ +extern JS_FRIEND_API(void) +ShrinkGCBuffers(JSRuntime *rt); + +/* + * Assert if a GC occurs while this class is live. This class does not disable + * the static rooting hazard analysis. + */ +class JS_PUBLIC_API(AutoAssertOnGC) +{ +#ifdef DEBUG + js::gc::GCRuntime *gc; + size_t gcNumber; + + public: + AutoAssertOnGC(); + explicit AutoAssertOnGC(JSRuntime *rt); + ~AutoAssertOnGC(); + + static void VerifyIsSafeToGC(JSRuntime *rt); +#else + public: + AutoAssertOnGC() {} + explicit AutoAssertOnGC(JSRuntime *rt) {} + ~AutoAssertOnGC() {} + + static void VerifyIsSafeToGC(JSRuntime *rt) {} +#endif +}; + +/* + * Disable the static rooting hazard analysis in the live region, but assert if + * any GC occurs while this guard object is live. This is most useful to help + * the exact rooting hazard analysis in complex regions, since it cannot + * understand dataflow. + * + * Note: GC behavior is unpredictable even when deterministice and is generally + * non-deterministic in practice. The fact that this guard has not + * asserted is not a guarantee that a GC cannot happen in the guarded + * region. As a rule, anyone performing a GC unsafe action should + * understand the GC properties of all code in that region and ensure + * that the hazard analysis is correct for that code, rather than relying + * on this class. + */ +class JS_PUBLIC_API(AutoSuppressGCAnalysis) : public AutoAssertOnGC +{ + public: + AutoSuppressGCAnalysis() : AutoAssertOnGC() {} + explicit AutoSuppressGCAnalysis(JSRuntime *rt) : AutoAssertOnGC(rt) {} +}; + +/* + * Place AutoCheckCannotGC in scopes that you believe can never GC. These + * annotations will be verified both dynamically via AutoAssertOnGC, and + * statically with the rooting hazard analysis (implemented by making the + * analysis consider AutoCheckCannotGC to be a GC pointer, and therefore + * complain if it is live across a GC call.) It is useful when dealing with + * internal pointers to GC things where the GC thing itself may not be present + * for the static analysis: e.g. acquiring inline chars from a JSString* on the + * heap. + */ +class JS_PUBLIC_API(AutoCheckCannotGC) : public AutoAssertOnGC +{ + public: + AutoCheckCannotGC() : AutoAssertOnGC() {} + explicit AutoCheckCannotGC(JSRuntime *rt) : AutoAssertOnGC(rt) {} +}; + +/* + * Unsets the gray bit for anything reachable from |thing|. |kind| should not be + * JSTRACE_SHAPE. |thing| should be non-null. + */ +extern JS_FRIEND_API(bool) +UnmarkGrayGCThingRecursively(void *thing, JSGCTraceKind kind); + +/* + * This should be called when an object that is marked gray is exposed to the JS + * engine (by handing it to running JS code or writing it into live JS + * data). During incremental GC, since the gray bits haven't been computed yet, + * we conservatively mark the object black. + */ +static MOZ_ALWAYS_INLINE void +ExposeGCThingToActiveJS(void *thing, JSGCTraceKind kind) +{ + MOZ_ASSERT(kind != JSTRACE_SHAPE); + + shadow::Runtime *rt = js::gc::GetGCThingRuntime(thing); +#ifdef JSGC_GENERATIONAL + /* + * GC things residing in the nursery cannot be gray: they have no mark bits. + * All live objects in the nursery are moved to tenured at the beginning of + * each GC slice, so the gray marker never sees nursery things. + */ + if (js::gc::IsInsideNursery((js::gc::Cell *)thing)) + return; +#endif + if (IsIncrementalBarrierNeededOnGCThing(rt, thing, kind)) + IncrementalReferenceBarrier(thing, kind); + else if (GCThingIsMarkedGray(thing)) + UnmarkGrayGCThingRecursively(thing, kind); +} + +static MOZ_ALWAYS_INLINE void +ExposeObjectToActiveJS(JSObject *obj) +{ + ExposeGCThingToActiveJS(obj, JSTRACE_OBJECT); +} + +/* + * If a GC is currently marking, mark the object black. + */ +static MOZ_ALWAYS_INLINE void +MarkGCThingAsLive(JSRuntime *rt_, void *thing, JSGCTraceKind kind) +{ + shadow::Runtime *rt = shadow::Runtime::asShadowRuntime(rt_); +#ifdef JSGC_GENERATIONAL + /* + * Any object in the nursery will not be freed during any GC running at that time. + */ + if (js::gc::IsInsideNursery((js::gc::Cell *)thing)) + return; +#endif + if (IsIncrementalBarrierNeededOnGCThing(rt, thing, kind)) + IncrementalReferenceBarrier(thing, kind); +} + +static MOZ_ALWAYS_INLINE void +MarkStringAsLive(Zone *zone, JSString *string) +{ + JSRuntime *rt = JS::shadow::Zone::asShadowZone(zone)->runtimeFromMainThread(); + MarkGCThingAsLive(rt, string, JSTRACE_STRING); +} + +/* + * Internal to Firefox. + * + * Note: this is not related to the PokeGC in nsJSEnvironment. + */ +extern JS_FRIEND_API(void) +PokeGC(JSRuntime *rt); + +/* + * Internal to Firefox. + */ +extern JS_FRIEND_API(void) +NotifyDidPaint(JSRuntime *rt); + +} /* namespace JS */ + +#endif /* js_GCAPI_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/HashTable.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/HashTable.h new file mode 100644 index 0000000000..4c27308b5e --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/HashTable.h @@ -0,0 +1,1672 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_HashTable_h +#define js_HashTable_h + +#include "mozilla/Alignment.h" +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Casting.h" +#include "mozilla/DebugOnly.h" +#include "mozilla/MemoryReporting.h" +#include "mozilla/Move.h" +#include "mozilla/NullPtr.h" +#include "mozilla/PodOperations.h" +#include "mozilla/ReentrancyGuard.h" +#include "mozilla/TemplateLib.h" +#include "mozilla/TypeTraits.h" + +#include "js/Utility.h" + +namespace js { + +class TempAllocPolicy; +template struct DefaultHasher; +template class HashMapEntry; +namespace detail { + template class HashTableEntry; + template class HashTable; +} + +/*****************************************************************************/ + +// A JS-friendly, STL-like container providing a hash-based map from keys to +// values. In particular, HashMap calls constructors and destructors of all +// objects added so non-PODs may be used safely. +// +// Key/Value requirements: +// - movable, destructible, assignable +// HashPolicy requirements: +// - see Hash Policy section below +// AllocPolicy: +// - see jsalloc.h +// +// Note: +// - HashMap is not reentrant: Key/Value/HashPolicy/AllocPolicy members +// called by HashMap must not call back into the same HashMap object. +// - Due to the lack of exception handling, the user must call |init()|. +template , + class AllocPolicy = TempAllocPolicy> +class HashMap +{ + typedef HashMapEntry TableEntry; + + struct MapHashPolicy : HashPolicy + { + typedef Key KeyType; + static const Key &getKey(TableEntry &e) { return e.key(); } + static void setKey(TableEntry &e, Key &k) { HashPolicy::rekey(e.mutableKey(), k); } + }; + + typedef detail::HashTable Impl; + Impl impl; + + public: + typedef typename HashPolicy::Lookup Lookup; + typedef TableEntry Entry; + + // HashMap construction is fallible (due to OOM); thus the user must call + // init after constructing a HashMap and check the return value. + explicit HashMap(AllocPolicy a = AllocPolicy()) : impl(a) {} + bool init(uint32_t len = 16) { return impl.init(len); } + bool initialized() const { return impl.initialized(); } + + // Return whether the given lookup value is present in the map. E.g.: + // + // typedef HashMap HM; + // HM h; + // if (HM::Ptr p = h.lookup(3)) { + // const HM::Entry &e = *p; // p acts like a pointer to Entry + // assert(p->key == 3); // Entry contains the key + // char val = p->value; // and value + // } + // + // Also see the definition of Ptr in HashTable above (with T = Entry). + typedef typename Impl::Ptr Ptr; + Ptr lookup(const Lookup &l) const { return impl.lookup(l); } + + // Like lookup, but does not assert if two threads call lookup at the same + // time. Only use this method when none of the threads will modify the map. + Ptr readonlyThreadsafeLookup(const Lookup &l) const { return impl.readonlyThreadsafeLookup(l); } + + // Assuming |p.found()|, remove |*p|. + void remove(Ptr p) { impl.remove(p); } + + // Like |lookup(l)|, but on miss, |p = lookupForAdd(l)| allows efficient + // insertion of Key |k| (where |HashPolicy::match(k,l) == true|) using + // |add(p,k,v)|. After |add(p,k,v)|, |p| points to the new Entry. E.g.: + // + // typedef HashMap HM; + // HM h; + // HM::AddPtr p = h.lookupForAdd(3); + // if (!p) { + // if (!h.add(p, 3, 'a')) + // return false; + // } + // const HM::Entry &e = *p; // p acts like a pointer to Entry + // assert(p->key == 3); // Entry contains the key + // char val = p->value; // and value + // + // Also see the definition of AddPtr in HashTable above (with T = Entry). + // + // N.B. The caller must ensure that no mutating hash table operations + // occur between a pair of |lookupForAdd| and |add| calls. To avoid + // looking up the key a second time, the caller may use the more efficient + // relookupOrAdd method. This method reuses part of the hashing computation + // to more efficiently insert the key if it has not been added. For + // example, a mutation-handling version of the previous example: + // + // HM::AddPtr p = h.lookupForAdd(3); + // if (!p) { + // call_that_may_mutate_h(); + // if (!h.relookupOrAdd(p, 3, 'a')) + // return false; + // } + // const HM::Entry &e = *p; + // assert(p->key == 3); + // char val = p->value; + typedef typename Impl::AddPtr AddPtr; + AddPtr lookupForAdd(const Lookup &l) const { + return impl.lookupForAdd(l); + } + + template + bool add(AddPtr &p, KeyInput &&k, ValueInput &&v) { + Entry e(mozilla::Forward(k), mozilla::Forward(v)); + return impl.add(p, mozilla::Move(e)); + } + + template + bool add(AddPtr &p, KeyInput &&k) { + Entry e(mozilla::Forward(k), Value()); + return impl.add(p, mozilla::Move(e)); + } + + template + bool relookupOrAdd(AddPtr &p, KeyInput &&k, ValueInput &&v) { + Entry e(mozilla::Forward(k), mozilla::Forward(v)); + return impl.relookupOrAdd(p, e.key(), mozilla::Move(e)); + } + + // |all()| returns a Range containing |count()| elements. E.g.: + // + // typedef HashMap HM; + // HM h; + // for (HM::Range r = h.all(); !r.empty(); r.popFront()) + // char c = r.front().value(); + // + // Also see the definition of Range in HashTable above (with T = Entry). + typedef typename Impl::Range Range; + Range all() const { return impl.all(); } + + // Typedef for the enumeration class. An Enum may be used to examine and + // remove table entries: + // + // typedef HashMap HM; + // HM s; + // for (HM::Enum e(s); !e.empty(); e.popFront()) + // if (e.front().value() == 'l') + // e.removeFront(); + // + // Table resize may occur in Enum's destructor. Also see the definition of + // Enum in HashTable above (with T = Entry). + typedef typename Impl::Enum Enum; + + // Remove all entries. This does not shrink the table. For that consider + // using the finish() method. + void clear() { impl.clear(); } + + // Remove all the entries and release all internal buffers. The map must + // be initialized again before any use. + void finish() { impl.finish(); } + + // Does the table contain any entries? + bool empty() const { return impl.empty(); } + + // Number of live elements in the map. + uint32_t count() const { return impl.count(); } + + // Total number of allocation in the dynamic table. Note: resize will + // happen well before count() == capacity(). + size_t capacity() const { return impl.capacity(); } + + // Don't just call |impl.sizeOfExcludingThis()| because there's no + // guarantee that |impl| is the first field in HashMap. + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return impl.sizeOfExcludingThis(mallocSizeOf); + } + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return mallocSizeOf(this) + impl.sizeOfExcludingThis(mallocSizeOf); + } + + // If |generation()| is the same before and after a HashMap operation, + // pointers into the table remain valid. + uint32_t generation() const { return impl.generation(); } + + /************************************************** Shorthand operations */ + + bool has(const Lookup &l) const { + return impl.lookup(l) != nullptr; + } + + // Overwrite existing value with v. Return false on oom. + template + bool put(KeyInput &&k, ValueInput &&v) { + AddPtr p = lookupForAdd(k); + if (p) { + p->value() = mozilla::Forward(v); + return true; + } + return add(p, mozilla::Forward(k), mozilla::Forward(v)); + } + + // Like put, but assert that the given key is not already present. + template + bool putNew(KeyInput &&k, ValueInput &&v) { + Entry e(mozilla::Forward(k), mozilla::Forward(v)); + return impl.putNew(e.key(), mozilla::Move(e)); + } + + // Add (k,defaultValue) if |k| is not found. Return a false-y Ptr on oom. + Ptr lookupWithDefault(const Key &k, const Value &defaultValue) { + AddPtr p = lookupForAdd(k); + if (p) + return p; + (void)add(p, k, defaultValue); // p is left false-y on oom. + return p; + } + + // Remove if present. + void remove(const Lookup &l) { + if (Ptr p = lookup(l)) + remove(p); + } + + // Infallibly rekey one entry, if necessary. + // Requires template parameters Key and HashPolicy::Lookup to be the same type. + void rekeyIfMoved(const Key &old_key, const Key &new_key) { + if (old_key != new_key) + rekeyAs(old_key, new_key, new_key); + } + + // Infallibly rekey one entry, if present. + void rekeyAs(const Lookup &old_lookup, const Lookup &new_lookup, const Key &new_key) { + if (Ptr p = lookup(old_lookup)) + impl.rekeyAndMaybeRehash(p, new_lookup, new_key); + } + + // HashMap is movable + HashMap(HashMap &&rhs) : impl(mozilla::Move(rhs.impl)) {} + void operator=(HashMap &&rhs) { + MOZ_ASSERT(this != &rhs, "self-move assignment is prohibited"); + impl = mozilla::Move(rhs.impl); + } + + private: + // HashMap is not copyable or assignable + HashMap(const HashMap &hm) MOZ_DELETE; + HashMap &operator=(const HashMap &hm) MOZ_DELETE; + + friend class Impl::Enum; +}; + +/*****************************************************************************/ + +// A JS-friendly, STL-like container providing a hash-based set of values. In +// particular, HashSet calls constructors and destructors of all objects added +// so non-PODs may be used safely. +// +// T requirements: +// - movable, destructible, assignable +// HashPolicy requirements: +// - see Hash Policy section below +// AllocPolicy: +// - see jsalloc.h +// +// Note: +// - HashSet is not reentrant: T/HashPolicy/AllocPolicy members called by +// HashSet must not call back into the same HashSet object. +// - Due to the lack of exception handling, the user must call |init()|. +template , + class AllocPolicy = TempAllocPolicy> +class HashSet +{ + struct SetOps : HashPolicy + { + typedef T KeyType; + static const KeyType &getKey(const T &t) { return t; } + static void setKey(T &t, KeyType &k) { HashPolicy::rekey(t, k); } + }; + + typedef detail::HashTable Impl; + Impl impl; + + public: + typedef typename HashPolicy::Lookup Lookup; + typedef T Entry; + + // HashSet construction is fallible (due to OOM); thus the user must call + // init after constructing a HashSet and check the return value. + explicit HashSet(AllocPolicy a = AllocPolicy()) : impl(a) {} + bool init(uint32_t len = 16) { return impl.init(len); } + bool initialized() const { return impl.initialized(); } + + // Return whether the given lookup value is present in the map. E.g.: + // + // typedef HashSet HS; + // HS h; + // if (HS::Ptr p = h.lookup(3)) { + // assert(*p == 3); // p acts like a pointer to int + // } + // + // Also see the definition of Ptr in HashTable above. + typedef typename Impl::Ptr Ptr; + Ptr lookup(const Lookup &l) const { return impl.lookup(l); } + + // Like lookup, but does not assert if two threads call lookup at the same + // time. Only use this method when none of the threads will modify the map. + Ptr readonlyThreadsafeLookup(const Lookup &l) const { return impl.readonlyThreadsafeLookup(l); } + + // Assuming |p.found()|, remove |*p|. + void remove(Ptr p) { impl.remove(p); } + + // Like |lookup(l)|, but on miss, |p = lookupForAdd(l)| allows efficient + // insertion of T value |t| (where |HashPolicy::match(t,l) == true|) using + // |add(p,t)|. After |add(p,t)|, |p| points to the new element. E.g.: + // + // typedef HashSet HS; + // HS h; + // HS::AddPtr p = h.lookupForAdd(3); + // if (!p) { + // if (!h.add(p, 3)) + // return false; + // } + // assert(*p == 3); // p acts like a pointer to int + // + // Also see the definition of AddPtr in HashTable above. + // + // N.B. The caller must ensure that no mutating hash table operations + // occur between a pair of |lookupForAdd| and |add| calls. To avoid + // looking up the key a second time, the caller may use the more efficient + // relookupOrAdd method. This method reuses part of the hashing computation + // to more efficiently insert the key if it has not been added. For + // example, a mutation-handling version of the previous example: + // + // HS::AddPtr p = h.lookupForAdd(3); + // if (!p) { + // call_that_may_mutate_h(); + // if (!h.relookupOrAdd(p, 3, 3)) + // return false; + // } + // assert(*p == 3); + // + // Note that relookupOrAdd(p,l,t) performs Lookup using |l| and adds the + // entry |t|, where the caller ensures match(l,t). + typedef typename Impl::AddPtr AddPtr; + AddPtr lookupForAdd(const Lookup &l) const { return impl.lookupForAdd(l); } + + template + bool add(AddPtr &p, U &&u) { + return impl.add(p, mozilla::Forward(u)); + } + + template + bool relookupOrAdd(AddPtr &p, const Lookup &l, U &&u) { + return impl.relookupOrAdd(p, l, mozilla::Forward(u)); + } + + // |all()| returns a Range containing |count()| elements: + // + // typedef HashSet HS; + // HS h; + // for (HS::Range r = h.all(); !r.empty(); r.popFront()) + // int i = r.front(); + // + // Also see the definition of Range in HashTable above. + typedef typename Impl::Range Range; + Range all() const { return impl.all(); } + + // Typedef for the enumeration class. An Enum may be used to examine and + // remove table entries: + // + // typedef HashSet HS; + // HS s; + // for (HS::Enum e(s); !e.empty(); e.popFront()) + // if (e.front() == 42) + // e.removeFront(); + // + // Table resize may occur in Enum's destructor. Also see the definition of + // Enum in HashTable above. + typedef typename Impl::Enum Enum; + + // Remove all entries. This does not shrink the table. For that consider + // using the finish() method. + void clear() { impl.clear(); } + + // Remove all the entries and release all internal buffers. The set must + // be initialized again before any use. + void finish() { impl.finish(); } + + // Does the table contain any entries? + bool empty() const { return impl.empty(); } + + // Number of live elements in the map. + uint32_t count() const { return impl.count(); } + + // Total number of allocation in the dynamic table. Note: resize will + // happen well before count() == capacity(). + size_t capacity() const { return impl.capacity(); } + + // Don't just call |impl.sizeOfExcludingThis()| because there's no + // guarantee that |impl| is the first field in HashSet. + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return impl.sizeOfExcludingThis(mallocSizeOf); + } + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return mallocSizeOf(this) + impl.sizeOfExcludingThis(mallocSizeOf); + } + + // If |generation()| is the same before and after a HashSet operation, + // pointers into the table remain valid. + uint32_t generation() const { return impl.generation(); } + + /************************************************** Shorthand operations */ + + bool has(const Lookup &l) const { + return impl.lookup(l) != nullptr; + } + + // Add |u| if it is not present already. Return false on oom. + template + bool put(U &&u) { + AddPtr p = lookupForAdd(u); + return p ? true : add(p, mozilla::Forward(u)); + } + + // Like put, but assert that the given key is not already present. + template + bool putNew(U &&u) { + return impl.putNew(u, mozilla::Forward(u)); + } + + template + bool putNew(const Lookup &l, U &&u) { + return impl.putNew(l, mozilla::Forward(u)); + } + + void remove(const Lookup &l) { + if (Ptr p = lookup(l)) + remove(p); + } + + // Infallibly rekey one entry, if present. + // Requires template parameters T and HashPolicy::Lookup to be the same type. + void rekeyIfMoved(const Lookup &old_value, const T &new_value) { + if (old_value != new_value) + rekeyAs(old_value, new_value, new_value); + } + + // Infallibly rekey one entry, if present. + void rekeyAs(const Lookup &old_lookup, const Lookup &new_lookup, const T &new_value) { + if (Ptr p = lookup(old_lookup)) + impl.rekeyAndMaybeRehash(p, new_lookup, new_value); + } + + // Infallibly rekey one entry with a new key that is equivalent. + void rekeyInPlace(Ptr p, const T &new_value) + { + MOZ_ASSERT(HashPolicy::match(*p, new_value)); + impl.rekeyInPlace(p, new_value); + } + + // HashSet is movable + HashSet(HashSet &&rhs) : impl(mozilla::Move(rhs.impl)) {} + void operator=(HashSet &&rhs) { + MOZ_ASSERT(this != &rhs, "self-move assignment is prohibited"); + impl = mozilla::Move(rhs.impl); + } + + private: + // HashSet is not copyable or assignable + HashSet(const HashSet &hs) MOZ_DELETE; + HashSet &operator=(const HashSet &hs) MOZ_DELETE; + + friend class Impl::Enum; +}; + +/*****************************************************************************/ + +// Hash Policy +// +// A hash policy P for a hash table with key-type Key must provide: +// - a type |P::Lookup| to use to lookup table entries; +// - a static member function |P::hash| with signature +// +// static js::HashNumber hash(Lookup) +// +// to use to hash the lookup type; and +// - a static member function |P::match| with signature +// +// static bool match(Key, Lookup) +// +// to use to test equality of key and lookup values. +// +// Normally, Lookup = Key. In general, though, different values and types of +// values can be used to lookup and store. If a Lookup value |l| is != to the +// added Key value |k|, the user must ensure that |P::match(k,l)|. E.g.: +// +// js::HashSet::AddPtr p = h.lookup(l); +// if (!p) { +// assert(P::match(k, l)); // must hold +// h.add(p, k); +// } + +// Pointer hashing policy that strips the lowest zeroBits when calculating the +// hash to improve key distribution. +template +struct PointerHasher +{ + typedef Key Lookup; + static HashNumber hash(const Lookup &l) { + MOZ_ASSERT(!JS::IsPoisonedPtr(l)); + size_t word = reinterpret_cast(l) >> zeroBits; + JS_STATIC_ASSERT(sizeof(HashNumber) == 4); +#if JS_BITS_PER_WORD == 32 + return HashNumber(word); +#else + JS_STATIC_ASSERT(sizeof word == 8); + return HashNumber((word >> 32) ^ word); +#endif + } + static bool match(const Key &k, const Lookup &l) { + MOZ_ASSERT(!JS::IsPoisonedPtr(k)); + MOZ_ASSERT(!JS::IsPoisonedPtr(l)); + return k == l; + } + static void rekey(Key &k, const Key& newKey) { + k = newKey; + } +}; + +// Default hash policy: just use the 'lookup' value. This of course only +// works if the lookup value is integral. HashTable applies ScrambleHashCode to +// the result of the 'hash' which means that it is 'ok' if the lookup value is +// not well distributed over the HashNumber domain. +template +struct DefaultHasher +{ + typedef Key Lookup; + static HashNumber hash(const Lookup &l) { + // Hash if can implicitly cast to hash number type. + return l; + } + static bool match(const Key &k, const Lookup &l) { + // Use builtin or overloaded operator==. + return k == l; + } + static void rekey(Key &k, const Key& newKey) { + k = newKey; + } +}; + +// Specialize hashing policy for pointer types. It assumes that the type is +// at least word-aligned. For types with smaller size use PointerHasher. +template +struct DefaultHasher : PointerHasher::value> +{}; + +// For doubles, we can xor the two uint32s. +template <> +struct DefaultHasher +{ + typedef double Lookup; + static HashNumber hash(double d) { + JS_STATIC_ASSERT(sizeof(HashNumber) == 4); + uint64_t u = mozilla::BitwiseCast(d); + return HashNumber(u ^ (u >> 32)); + } + static bool match(double lhs, double rhs) { + return mozilla::BitwiseCast(lhs) == mozilla::BitwiseCast(rhs); + } +}; + +template <> +struct DefaultHasher +{ + typedef float Lookup; + static HashNumber hash(float f) { + JS_STATIC_ASSERT(sizeof(HashNumber) == 4); + return HashNumber(mozilla::BitwiseCast(f)); + } + static bool match(float lhs, float rhs) { + return mozilla::BitwiseCast(lhs) == mozilla::BitwiseCast(rhs); + } +}; + +/*****************************************************************************/ + +// Both HashMap and HashSet are implemented by a single HashTable that is even +// more heavily parameterized than the other two. This leaves HashTable gnarly +// and extremely coupled to HashMap and HashSet; thus code should not use +// HashTable directly. + +template +class HashMapEntry +{ + Key key_; + Value value_; + + template friend class detail::HashTable; + template friend class detail::HashTableEntry; + template friend class HashMap; + + Key & mutableKey() { return key_; } + + public: + template + HashMapEntry(KeyInput &&k, ValueInput &&v) + : key_(mozilla::Forward(k)), + value_(mozilla::Forward(v)) + {} + + HashMapEntry(HashMapEntry &&rhs) + : key_(mozilla::Move(rhs.key_)), + value_(mozilla::Move(rhs.value_)) + {} + + typedef Key KeyType; + typedef Value ValueType; + + const Key & key() const { return key_; } + const Value & value() const { return value_; } + Value & value() { return value_; } + + private: + HashMapEntry(const HashMapEntry &) MOZ_DELETE; + void operator=(const HashMapEntry &) MOZ_DELETE; +}; + +} // namespace js + +namespace mozilla { + +template +struct IsPod > : IsPod {}; + +template +struct IsPod > + : IntegralConstant::value && IsPod::value> +{}; + +} // namespace mozilla + +namespace js { + +namespace detail { + +template +class HashTable; + +template +class HashTableEntry +{ + template friend class HashTable; + typedef typename mozilla::RemoveConst::Type NonConstT; + + HashNumber keyHash; + mozilla::AlignedStorage2 mem; + + static const HashNumber sFreeKey = 0; + static const HashNumber sRemovedKey = 1; + static const HashNumber sCollisionBit = 1; + + static bool isLiveHash(HashNumber hash) + { + return hash > sRemovedKey; + } + + HashTableEntry(const HashTableEntry &) MOZ_DELETE; + void operator=(const HashTableEntry &) MOZ_DELETE; + ~HashTableEntry() MOZ_DELETE; + + public: + // NB: HashTableEntry is treated as a POD: no constructor or destructor calls. + + void destroyIfLive() { + if (isLive()) + mem.addr()->~T(); + } + + void destroy() { + MOZ_ASSERT(isLive()); + mem.addr()->~T(); + } + + void swap(HashTableEntry *other) { + mozilla::Swap(keyHash, other->keyHash); + mozilla::Swap(mem, other->mem); + } + + T &get() { MOZ_ASSERT(isLive()); return *mem.addr(); } + + bool isFree() const { return keyHash == sFreeKey; } + void clearLive() { MOZ_ASSERT(isLive()); keyHash = sFreeKey; mem.addr()->~T(); } + void clear() { if (isLive()) mem.addr()->~T(); keyHash = sFreeKey; } + bool isRemoved() const { return keyHash == sRemovedKey; } + void removeLive() { MOZ_ASSERT(isLive()); keyHash = sRemovedKey; mem.addr()->~T(); } + bool isLive() const { return isLiveHash(keyHash); } + void setCollision() { MOZ_ASSERT(isLive()); keyHash |= sCollisionBit; } + void setCollision(HashNumber bit) { MOZ_ASSERT(isLive()); keyHash |= bit; } + void unsetCollision() { keyHash &= ~sCollisionBit; } + bool hasCollision() const { return keyHash & sCollisionBit; } + bool matchHash(HashNumber hn) { return (keyHash & ~sCollisionBit) == hn; } + HashNumber getKeyHash() const { return keyHash & ~sCollisionBit; } + + template + void setLive(HashNumber hn, U &&u) + { + MOZ_ASSERT(!isLive()); + keyHash = hn; + new(mem.addr()) T(mozilla::Forward(u)); + MOZ_ASSERT(isLive()); + } +}; + +template +class HashTable : private AllocPolicy +{ + friend class mozilla::ReentrancyGuard; + + typedef typename mozilla::RemoveConst::Type NonConstT; + typedef typename HashPolicy::KeyType Key; + typedef typename HashPolicy::Lookup Lookup; + + public: + typedef HashTableEntry Entry; + + // A nullable pointer to a hash table element. A Ptr |p| can be tested + // either explicitly |if (p.found()) p->...| or using boolean conversion + // |if (p) p->...|. Ptr objects must not be used after any mutating hash + // table operations unless |generation()| is tested. + class Ptr + { + friend class HashTable; + typedef void (Ptr::* ConvertibleToBool)(); + void nonNull() {} + + Entry *entry_; +#ifdef DEBUG + const HashTable *table_; + uint32_t generation; +#endif + + protected: + Ptr(Entry &entry, const HashTable &tableArg) + : entry_(&entry) +#ifdef DEBUG + , table_(&tableArg) + , generation(tableArg.generation()) +#endif + {} + + public: + // Leaves Ptr uninitialized. + Ptr() { +#ifdef JS_DEBUG + entry_ = (Entry *)0xbad; +#endif + } + + bool found() const { + MOZ_ASSERT(generation == table_->generation()); + return entry_->isLive(); + } + + operator ConvertibleToBool() const { + return found() ? &Ptr::nonNull : 0; + } + + bool operator==(const Ptr &rhs) const { + MOZ_ASSERT(found() && rhs.found()); + return entry_ == rhs.entry_; + } + + bool operator!=(const Ptr &rhs) const { + MOZ_ASSERT(generation == table_->generation()); + return !(*this == rhs); + } + + T &operator*() const { + MOZ_ASSERT(generation == table_->generation()); + return entry_->get(); + } + + T *operator->() const { + MOZ_ASSERT(generation == table_->generation()); + return &entry_->get(); + } + }; + + // A Ptr that can be used to add a key after a failed lookup. + class AddPtr : public Ptr + { + friend class HashTable; + HashNumber keyHash; +#ifdef DEBUG + uint64_t mutationCount; +#endif + + AddPtr(Entry &entry, const HashTable &tableArg, HashNumber hn) + : Ptr(entry, tableArg) + , keyHash(hn) +#ifdef DEBUG + , mutationCount(tableArg.mutationCount) +#endif + {} + + public: + // Leaves AddPtr uninitialized. + AddPtr() {} + }; + + // A collection of hash table entries. The collection is enumerated by + // calling |front()| followed by |popFront()| as long as |!empty()|. As + // with Ptr/AddPtr, Range objects must not be used after any mutating hash + // table operation unless the |generation()| is tested. + class Range + { + protected: + friend class HashTable; + + Range(const HashTable &tableArg, Entry *c, Entry *e) + : cur(c) + , end(e) +#ifdef DEBUG + , table_(&tableArg) + , mutationCount(tableArg.mutationCount) + , generation(tableArg.generation()) + , validEntry(true) +#endif + { + while (cur < end && !cur->isLive()) + ++cur; + } + + Entry *cur, *end; +#ifdef DEBUG + const HashTable *table_; + uint64_t mutationCount; + uint32_t generation; + bool validEntry; +#endif + + public: + Range() + : cur(nullptr) + , end(nullptr) +#ifdef DEBUG + , table_(nullptr) + , mutationCount(0) + , generation(0) + , validEntry(false) +#endif + {} + + bool empty() const { + MOZ_ASSERT(generation == table_->generation()); + MOZ_ASSERT(mutationCount == table_->mutationCount); + return cur == end; + } + + T &front() const { + MOZ_ASSERT(validEntry); + MOZ_ASSERT(!empty()); + MOZ_ASSERT(generation == table_->generation()); + MOZ_ASSERT(mutationCount == table_->mutationCount); + return cur->get(); + } + + void popFront() { + MOZ_ASSERT(!empty()); + MOZ_ASSERT(generation == table_->generation()); + MOZ_ASSERT(mutationCount == table_->mutationCount); + while (++cur < end && !cur->isLive()) + continue; +#ifdef DEBUG + validEntry = true; +#endif + } + }; + + // A Range whose lifetime delimits a mutating enumeration of a hash table. + // Since rehashing when elements were removed during enumeration would be + // bad, it is postponed until the Enum is destructed. Since the Enum's + // destructor touches the hash table, the user must ensure that the hash + // table is still alive when the destructor runs. + class Enum : public Range + { + friend class HashTable; + + HashTable &table_; + bool rekeyed; + bool removed; + + /* Not copyable. */ + Enum(const Enum &) MOZ_DELETE; + void operator=(const Enum &) MOZ_DELETE; + + public: + template explicit + Enum(Map &map) : Range(map.all()), table_(map.impl), rekeyed(false), removed(false) {} + + // Removes the |front()| element from the table, leaving |front()| + // invalid until the next call to |popFront()|. For example: + // + // HashSet s; + // for (HashSet::Enum e(s); !e.empty(); e.popFront()) + // if (e.front() == 42) + // e.removeFront(); + void removeFront() { + table_.remove(*this->cur); + removed = true; +#ifdef DEBUG + this->validEntry = false; + this->mutationCount = table_.mutationCount; +#endif + } + + // Removes the |front()| element and re-inserts it into the table with + // a new key at the new Lookup position. |front()| is invalid after + // this operation until the next call to |popFront()|. + void rekeyFront(const Lookup &l, const Key &k) { + Ptr p(*this->cur, table_); + table_.rekeyWithoutRehash(p, l, k); + rekeyed = true; +#ifdef DEBUG + this->validEntry = false; + this->mutationCount = table_.mutationCount; +#endif + } + + void rekeyFront(const Key &k) { + rekeyFront(k, k); + } + + // Potentially rehashes the table. + ~Enum() { + if (rekeyed) { + table_.gen++; + table_.checkOverRemoved(); + } + + if (removed) + table_.compactIfUnderloaded(); + } + }; + + // HashTable is movable + HashTable(HashTable &&rhs) + : AllocPolicy(rhs) + { + mozilla::PodAssign(this, &rhs); + rhs.table = nullptr; + } + void operator=(HashTable &&rhs) { + MOZ_ASSERT(this != &rhs, "self-move assignment is prohibited"); + if (table) + destroyTable(*this, table, capacity()); + mozilla::PodAssign(this, &rhs); + rhs.table = nullptr; + } + + private: + // HashTable is not copyable or assignable + HashTable(const HashTable &) MOZ_DELETE; + void operator=(const HashTable &) MOZ_DELETE; + + private: + static const size_t CAP_BITS = 24; + + public: + Entry *table; // entry storage + uint32_t gen; // entry storage generation number + uint32_t entryCount; // number of entries in table + uint32_t removedCount:CAP_BITS; // removed entry sentinels in table + uint32_t hashShift:8; // multiplicative hash shift + +#ifdef JS_DEBUG + mozilla::DebugOnly mutationCount; + mutable mozilla::DebugOnly mEntered; + mutable struct Stats + { + uint32_t searches; // total number of table searches + uint32_t steps; // hash chain links traversed + uint32_t hits; // searches that found key + uint32_t misses; // searches that didn't find key + uint32_t addOverRemoved; // adds that recycled a removed entry + uint32_t removes; // calls to remove + uint32_t removeFrees; // calls to remove that freed the entry + uint32_t grows; // table expansions + uint32_t shrinks; // table contractions + uint32_t compresses; // table compressions + uint32_t rehashes; // tombstone decontaminations + } stats; +# define METER(x) x +#else +# define METER(x) +#endif + + // The default initial capacity is 32 (enough to hold 16 elements), but it + // can be as low as 4. + static const unsigned sMinCapacityLog2 = 2; + static const unsigned sMinCapacity = 1 << sMinCapacityLog2; + static const unsigned sMaxInit = JS_BIT(CAP_BITS - 1); + static const unsigned sMaxCapacity = JS_BIT(CAP_BITS); + static const unsigned sHashBits = mozilla::tl::BitSize::value; + + // Hash-table alpha is conceptually a fraction, but to avoid floating-point + // math we implement it as a ratio of integers. + static const uint8_t sAlphaDenominator = 4; + static const uint8_t sMinAlphaNumerator = 1; // min alpha: 1/4 + static const uint8_t sMaxAlphaNumerator = 3; // max alpha: 3/4 + + static const HashNumber sFreeKey = Entry::sFreeKey; + static const HashNumber sRemovedKey = Entry::sRemovedKey; + static const HashNumber sCollisionBit = Entry::sCollisionBit; + + void setTableSizeLog2(unsigned sizeLog2) + { + hashShift = sHashBits - sizeLog2; + } + + static bool isLiveHash(HashNumber hash) + { + return Entry::isLiveHash(hash); + } + + static HashNumber prepareHash(const Lookup& l) + { + HashNumber keyHash = ScrambleHashCode(HashPolicy::hash(l)); + + // Avoid reserved hash codes. + if (!isLiveHash(keyHash)) + keyHash -= (sRemovedKey + 1); + return keyHash & ~sCollisionBit; + } + + static Entry *createTable(AllocPolicy &alloc, uint32_t capacity) + { + static_assert(sFreeKey == 0, + "newly-calloc'd tables have to be considered empty"); + static_assert(sMaxCapacity <= SIZE_MAX / sizeof(Entry), + "would overflow allocating max number of entries"); + return static_cast(alloc.calloc_(capacity * sizeof(Entry))); + } + + static void destroyTable(AllocPolicy &alloc, Entry *oldTable, uint32_t capacity) + { + for (Entry *e = oldTable, *end = e + capacity; e < end; ++e) + e->destroyIfLive(); + alloc.free_(oldTable); + } + + public: + explicit HashTable(AllocPolicy ap) + : AllocPolicy(ap) + , table(nullptr) + , gen(0) + , entryCount(0) + , removedCount(0) + , hashShift(sHashBits) +#ifdef DEBUG + , mutationCount(0) + , mEntered(false) +#endif + {} + + MOZ_WARN_UNUSED_RESULT bool init(uint32_t length) + { + MOZ_ASSERT(!initialized()); + + // Reject all lengths whose initial computed capacity would exceed + // sMaxCapacity. Round that maximum length down to the nearest power + // of two for speedier code. + if (length > sMaxInit) { + this->reportAllocOverflow(); + return false; + } + + static_assert((sMaxInit * sAlphaDenominator) / sAlphaDenominator == sMaxInit, + "multiplication in numerator below could overflow"); + static_assert(sMaxInit * sAlphaDenominator <= UINT32_MAX - sMaxAlphaNumerator, + "numerator calculation below could potentially overflow"); + + // Compute the smallest capacity allowing |length| elements to be + // inserted without rehashing: ceil(length / max-alpha). (Ceiling + // integral division: .) + uint32_t newCapacity = + (length * sAlphaDenominator + sMaxAlphaNumerator - 1) / sMaxAlphaNumerator; + if (newCapacity < sMinCapacity) + newCapacity = sMinCapacity; + + // FIXME: use JS_CEILING_LOG2 when PGO stops crashing (bug 543034). + uint32_t roundUp = sMinCapacity, roundUpLog2 = sMinCapacityLog2; + while (roundUp < newCapacity) { + roundUp <<= 1; + ++roundUpLog2; + } + + newCapacity = roundUp; + MOZ_ASSERT(newCapacity >= length); + MOZ_ASSERT(newCapacity <= sMaxCapacity); + + table = createTable(*this, newCapacity); + if (!table) + return false; + + setTableSizeLog2(roundUpLog2); + METER(memset(&stats, 0, sizeof(stats))); + return true; + } + + bool initialized() const + { + return !!table; + } + + ~HashTable() + { + if (table) + destroyTable(*this, table, capacity()); + } + + private: + HashNumber hash1(HashNumber hash0) const + { + return hash0 >> hashShift; + } + + struct DoubleHash + { + HashNumber h2; + HashNumber sizeMask; + }; + + DoubleHash hash2(HashNumber curKeyHash) const + { + unsigned sizeLog2 = sHashBits - hashShift; + DoubleHash dh = { + ((curKeyHash << sizeLog2) >> hashShift) | 1, + (HashNumber(1) << sizeLog2) - 1 + }; + return dh; + } + + static HashNumber applyDoubleHash(HashNumber h1, const DoubleHash &dh) + { + return (h1 - dh.h2) & dh.sizeMask; + } + + bool overloaded() + { + static_assert(sMaxCapacity <= UINT32_MAX / sMaxAlphaNumerator, + "multiplication below could overflow"); + return entryCount + removedCount >= + capacity() * sMaxAlphaNumerator / sAlphaDenominator; + } + + // Would the table be underloaded if it had the given capacity and entryCount? + static bool wouldBeUnderloaded(uint32_t capacity, uint32_t entryCount) + { + static_assert(sMaxCapacity <= UINT32_MAX / sMinAlphaNumerator, + "multiplication below could overflow"); + return capacity > sMinCapacity && + entryCount <= capacity * sMinAlphaNumerator / sAlphaDenominator; + } + + bool underloaded() + { + return wouldBeUnderloaded(capacity(), entryCount); + } + + static bool match(Entry &e, const Lookup &l) + { + return HashPolicy::match(HashPolicy::getKey(e.get()), l); + } + + Entry &lookup(const Lookup &l, HashNumber keyHash, unsigned collisionBit) const + { + MOZ_ASSERT(isLiveHash(keyHash)); + MOZ_ASSERT(!(keyHash & sCollisionBit)); + MOZ_ASSERT(collisionBit == 0 || collisionBit == sCollisionBit); + MOZ_ASSERT(table); + METER(stats.searches++); + + // Compute the primary hash address. + HashNumber h1 = hash1(keyHash); + Entry *entry = &table[h1]; + + // Miss: return space for a new entry. + if (entry->isFree()) { + METER(stats.misses++); + return *entry; + } + + // Hit: return entry. + if (entry->matchHash(keyHash) && match(*entry, l)) { + METER(stats.hits++); + return *entry; + } + + // Collision: double hash. + DoubleHash dh = hash2(keyHash); + + // Save the first removed entry pointer so we can recycle later. + Entry *firstRemoved = nullptr; + + while(true) { + if (MOZ_UNLIKELY(entry->isRemoved())) { + if (!firstRemoved) + firstRemoved = entry; + } else { + entry->setCollision(collisionBit); + } + + METER(stats.steps++); + h1 = applyDoubleHash(h1, dh); + + entry = &table[h1]; + if (entry->isFree()) { + METER(stats.misses++); + return firstRemoved ? *firstRemoved : *entry; + } + + if (entry->matchHash(keyHash) && match(*entry, l)) { + METER(stats.hits++); + return *entry; + } + } + } + + // This is a copy of lookup hardcoded to the assumptions: + // 1. the lookup is a lookupForAdd + // 2. the key, whose |keyHash| has been passed is not in the table, + // 3. no entries have been removed from the table. + // This specialized search avoids the need for recovering lookup values + // from entries, which allows more flexible Lookup/Key types. + Entry &findFreeEntry(HashNumber keyHash) + { + MOZ_ASSERT(!(keyHash & sCollisionBit)); + MOZ_ASSERT(table); + METER(stats.searches++); + + // We assume 'keyHash' has already been distributed. + + // Compute the primary hash address. + HashNumber h1 = hash1(keyHash); + Entry *entry = &table[h1]; + + // Miss: return space for a new entry. + if (!entry->isLive()) { + METER(stats.misses++); + return *entry; + } + + // Collision: double hash. + DoubleHash dh = hash2(keyHash); + + while(true) { + MOZ_ASSERT(!entry->isRemoved()); + entry->setCollision(); + + METER(stats.steps++); + h1 = applyDoubleHash(h1, dh); + + entry = &table[h1]; + if (!entry->isLive()) { + METER(stats.misses++); + return *entry; + } + } + } + + enum RebuildStatus { NotOverloaded, Rehashed, RehashFailed }; + + RebuildStatus changeTableSize(int deltaLog2) + { + // Look, but don't touch, until we succeed in getting new entry store. + Entry *oldTable = table; + uint32_t oldCap = capacity(); + uint32_t newLog2 = sHashBits - hashShift + deltaLog2; + uint32_t newCapacity = JS_BIT(newLog2); + if (newCapacity > sMaxCapacity) { + this->reportAllocOverflow(); + return RehashFailed; + } + + Entry *newTable = createTable(*this, newCapacity); + if (!newTable) + return RehashFailed; + + // We can't fail from here on, so update table parameters. + setTableSizeLog2(newLog2); + removedCount = 0; + gen++; + table = newTable; + + // Copy only live entries, leaving removed ones behind. + for (Entry *src = oldTable, *end = src + oldCap; src < end; ++src) { + if (src->isLive()) { + HashNumber hn = src->getKeyHash(); + findFreeEntry(hn).setLive(hn, mozilla::Move(src->get())); + src->destroy(); + } + } + + // All entries have been destroyed, no need to destroyTable. + this->free_(oldTable); + return Rehashed; + } + + RebuildStatus checkOverloaded() + { + if (!overloaded()) + return NotOverloaded; + + // Compress if a quarter or more of all entries are removed. + int deltaLog2; + if (removedCount >= (capacity() >> 2)) { + METER(stats.compresses++); + deltaLog2 = 0; + } else { + METER(stats.grows++); + deltaLog2 = 1; + } + + return changeTableSize(deltaLog2); + } + + // Infallibly rehash the table if we are overloaded with removals. + void checkOverRemoved() + { + if (overloaded()) { + if (checkOverloaded() == RehashFailed) + rehashTableInPlace(); + } + } + + void remove(Entry &e) + { + MOZ_ASSERT(table); + METER(stats.removes++); + + if (e.hasCollision()) { + e.removeLive(); + removedCount++; + } else { + METER(stats.removeFrees++); + e.clearLive(); + } + entryCount--; +#ifdef DEBUG + mutationCount++; +#endif + } + + void checkUnderloaded() + { + if (underloaded()) { + METER(stats.shrinks++); + (void) changeTableSize(-1); + } + } + + // Resize the table down to the largest capacity which doesn't underload the + // table. Since we call checkUnderloaded() on every remove, you only need + // to call this after a bulk removal of items done without calling remove(). + void compactIfUnderloaded() + { + int32_t resizeLog2 = 0; + uint32_t newCapacity = capacity(); + while (wouldBeUnderloaded(newCapacity, entryCount)) { + newCapacity = newCapacity >> 1; + resizeLog2--; + } + + if (resizeLog2 != 0) { + changeTableSize(resizeLog2); + } + } + + // This is identical to changeTableSize(currentSize), but without requiring + // a second table. We do this by recycling the collision bits to tell us if + // the element is already inserted or still waiting to be inserted. Since + // already-inserted elements win any conflicts, we get the same table as we + // would have gotten through random insertion order. + void rehashTableInPlace() + { + METER(stats.rehashes++); + removedCount = 0; + for (size_t i = 0; i < capacity(); ++i) + table[i].unsetCollision(); + + for (size_t i = 0; i < capacity();) { + Entry *src = &table[i]; + + if (!src->isLive() || src->hasCollision()) { + ++i; + continue; + } + + HashNumber keyHash = src->getKeyHash(); + HashNumber h1 = hash1(keyHash); + DoubleHash dh = hash2(keyHash); + Entry *tgt = &table[h1]; + while (true) { + if (!tgt->hasCollision()) { + src->swap(tgt); + tgt->setCollision(); + break; + } + + h1 = applyDoubleHash(h1, dh); + tgt = &table[h1]; + } + } + + // TODO: this algorithm leaves collision bits on *all* elements, even if + // they are on no collision path. We have the option of setting the + // collision bits correctly on a subsequent pass or skipping the rehash + // unless we are totally filled with tombstones: benchmark to find out + // which approach is best. + } + + public: + void clear() + { + if (mozilla::IsPod::value) { + memset(table, 0, sizeof(*table) * capacity()); + } else { + uint32_t tableCapacity = capacity(); + for (Entry *e = table, *end = table + tableCapacity; e < end; ++e) + e->clear(); + } + removedCount = 0; + entryCount = 0; +#ifdef DEBUG + mutationCount++; +#endif + } + + void finish() + { + MOZ_ASSERT(!mEntered); + + if (!table) + return; + + destroyTable(*this, table, capacity()); + table = nullptr; + gen++; + entryCount = 0; + removedCount = 0; +#ifdef DEBUG + mutationCount++; +#endif + } + + Range all() const + { + MOZ_ASSERT(table); + return Range(*this, table, table + capacity()); + } + + bool empty() const + { + MOZ_ASSERT(table); + return !entryCount; + } + + uint32_t count() const + { + MOZ_ASSERT(table); + return entryCount; + } + + uint32_t capacity() const + { + MOZ_ASSERT(table); + return JS_BIT(sHashBits - hashShift); + } + + uint32_t generation() const + { + MOZ_ASSERT(table); + return gen; + } + + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const + { + return mallocSizeOf(table); + } + + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const + { + return mallocSizeOf(this) + sizeOfExcludingThis(mallocSizeOf); + } + + Ptr lookup(const Lookup &l) const + { + mozilla::ReentrancyGuard g(*this); + HashNumber keyHash = prepareHash(l); + return Ptr(lookup(l, keyHash, 0), *this); + } + + Ptr readonlyThreadsafeLookup(const Lookup &l) const + { + HashNumber keyHash = prepareHash(l); + return Ptr(lookup(l, keyHash, 0), *this); + } + + AddPtr lookupForAdd(const Lookup &l) const + { + mozilla::ReentrancyGuard g(*this); + HashNumber keyHash = prepareHash(l); + Entry &entry = lookup(l, keyHash, sCollisionBit); + AddPtr p(entry, *this, keyHash); + return p; + } + + template + bool add(AddPtr &p, U &&u) + { + mozilla::ReentrancyGuard g(*this); + MOZ_ASSERT(table); + MOZ_ASSERT(!p.found()); + MOZ_ASSERT(!(p.keyHash & sCollisionBit)); + + // Changing an entry from removed to live does not affect whether we + // are overloaded and can be handled separately. + if (p.entry_->isRemoved()) { + METER(stats.addOverRemoved++); + removedCount--; + p.keyHash |= sCollisionBit; + } else { + // Preserve the validity of |p.entry_|. + RebuildStatus status = checkOverloaded(); + if (status == RehashFailed) + return false; + if (status == Rehashed) + p.entry_ = &findFreeEntry(p.keyHash); + } + + p.entry_->setLive(p.keyHash, mozilla::Forward(u)); + entryCount++; +#ifdef DEBUG + mutationCount++; + p.generation = generation(); + p.mutationCount = mutationCount; +#endif + return true; + } + + // Note: |l| may be a reference to a piece of |u|, so this function + // must take care not to use |l| after moving |u|. + template + void putNewInfallible(const Lookup &l, U &&u) + { + MOZ_ASSERT(table); + + HashNumber keyHash = prepareHash(l); + Entry *entry = &findFreeEntry(keyHash); + + if (entry->isRemoved()) { + METER(stats.addOverRemoved++); + removedCount--; + keyHash |= sCollisionBit; + } + + entry->setLive(keyHash, mozilla::Forward(u)); + entryCount++; +#ifdef DEBUG + mutationCount++; +#endif + } + + // Note: |l| may be a reference to a piece of |u|, so this function + // must take care not to use |l| after moving |u|. + template + bool putNew(const Lookup &l, U &&u) + { + if (checkOverloaded() == RehashFailed) + return false; + + putNewInfallible(l, mozilla::Forward(u)); + return true; + } + + // Note: |l| may be a reference to a piece of |u|, so this function + // must take care not to use |l| after moving |u|. + template + bool relookupOrAdd(AddPtr& p, const Lookup &l, U &&u) + { +#ifdef DEBUG + p.generation = generation(); + p.mutationCount = mutationCount; +#endif + { + mozilla::ReentrancyGuard g(*this); + MOZ_ASSERT(prepareHash(l) == p.keyHash); // l has not been destroyed + p.entry_ = &lookup(l, p.keyHash, sCollisionBit); + } + return p.found() || add(p, mozilla::Forward(u)); + } + + void remove(Ptr p) + { + MOZ_ASSERT(table); + mozilla::ReentrancyGuard g(*this); + MOZ_ASSERT(p.found()); + remove(*p.entry_); + checkUnderloaded(); + } + + void rekeyWithoutRehash(Ptr p, const Lookup &l, const Key &k) + { + MOZ_ASSERT(table); + mozilla::ReentrancyGuard g(*this); + MOZ_ASSERT(p.found()); + typename HashTableEntry::NonConstT t(mozilla::Move(*p)); + HashPolicy::setKey(t, const_cast(k)); + remove(*p.entry_); + putNewInfallible(l, mozilla::Move(t)); + } + + void rekeyAndMaybeRehash(Ptr p, const Lookup &l, const Key &k) + { + rekeyWithoutRehash(p, l, k); + checkOverRemoved(); + } + + void rekeyInPlace(Ptr p, const Key &k) + { + MOZ_ASSERT(table); + mozilla::ReentrancyGuard g(*this); + MOZ_ASSERT(p.found()); + HashPolicy::rekey(const_cast(*p), const_cast(k)); + } + +#undef METER +}; + +} // namespace detail +} // namespace js + +#endif /* js_HashTable_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/HeapAPI.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/HeapAPI.h new file mode 100644 index 0000000000..bdd63c1937 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/HeapAPI.h @@ -0,0 +1,317 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_HeapAPI_h +#define js_HeapAPI_h + +#include + +#include "jspubtd.h" + +#include "js/Utility.h" + +/* These values are private to the JS engine. */ +namespace js { + +// Whether the current thread is permitted access to any part of the specified +// runtime or zone. +JS_FRIEND_API(bool) +CurrentThreadCanAccessRuntime(JSRuntime *rt); + +JS_FRIEND_API(bool) +CurrentThreadCanAccessZone(JS::Zone *zone); + +namespace gc { + +struct Cell; + +const size_t ArenaShift = 12; +const size_t ArenaSize = size_t(1) << ArenaShift; +const size_t ArenaMask = ArenaSize - 1; + +#ifdef JS_GC_SMALL_CHUNK_SIZE +const size_t ChunkShift = 18; +#else +const size_t ChunkShift = 20; +#endif +const size_t ChunkSize = size_t(1) << ChunkShift; +const size_t ChunkMask = ChunkSize - 1; + +const size_t CellShift = 3; +const size_t CellSize = size_t(1) << CellShift; +const size_t CellMask = CellSize - 1; + +/* These are magic constants derived from actual offsets in gc/Heap.h. */ +#ifdef JS_GC_SMALL_CHUNK_SIZE +const size_t ChunkMarkBitmapOffset = 258104; +const size_t ChunkMarkBitmapBits = 31744; +#else +const size_t ChunkMarkBitmapOffset = 1032352; +const size_t ChunkMarkBitmapBits = 129024; +#endif +const size_t ChunkRuntimeOffset = ChunkSize - sizeof(void*); +const size_t ChunkLocationOffset = ChunkSize - 2 * sizeof(void*) - sizeof(uint64_t); + +/* + * Live objects are marked black. How many other additional colors are available + * depends on the size of the GCThing. Objects marked gray are eligible for + * cycle collection. + */ +static const uint32_t BLACK = 0; +static const uint32_t GRAY = 1; + +/* + * The "location" field in the Chunk trailer is a bit vector indicting various + * roles of the chunk. + * + * The value 0 for the "location" field is invalid, at least one bit must be + * set. + * + * Some bits preclude others, for example, any "nursery" bit precludes any + * "tenured" or "middle generation" bit. + */ +const uintptr_t ChunkLocationBitNursery = 1; // Standard GGC nursery +const uintptr_t ChunkLocationBitTenuredHeap = 2; // Standard GGC tenured generation +const uintptr_t ChunkLocationBitPJSNewspace = 4; // The PJS generational GC's allocation space +const uintptr_t ChunkLocationBitPJSFromspace = 8; // The PJS generational GC's fromspace (during GC) + +const uintptr_t ChunkLocationAnyNursery = ChunkLocationBitNursery | + ChunkLocationBitPJSNewspace | + ChunkLocationBitPJSFromspace; + +#ifdef JS_DEBUG +/* When downcasting, ensure we are actually the right type. */ +extern JS_FRIEND_API(void) +AssertGCThingHasType(js::gc::Cell *cell, JSGCTraceKind kind); +#else +inline void +AssertGCThingHasType(js::gc::Cell *cell, JSGCTraceKind kind) {} +#endif + +} /* namespace gc */ +} /* namespace js */ + +namespace JS { +struct Zone; + +/* Default size for the generational nursery in bytes. */ +const uint32_t DefaultNurseryBytes = 16 * 1024 * 1024; + +/* Default maximum heap size in bytes to pass to JS_NewRuntime(). */ +const uint32_t DefaultHeapMaxBytes = 32 * 1024 * 1024; + +/* + * We cannot expose the class hierarchy: the implementation is hidden. Instead + * we provide cast functions with strong debug-mode assertions. + */ +static MOZ_ALWAYS_INLINE js::gc::Cell * +AsCell(JSObject *obj) +{ + js::gc::Cell *cell = reinterpret_cast(obj); + AssertGCThingHasType(cell, JSTRACE_OBJECT); + return cell; +} + +static MOZ_ALWAYS_INLINE js::gc::Cell * +AsCell(JSFunction *fun) +{ + js::gc::Cell *cell = reinterpret_cast(fun); + AssertGCThingHasType(cell, JSTRACE_OBJECT); + return cell; +} + +static MOZ_ALWAYS_INLINE js::gc::Cell * +AsCell(JSString *str) +{ + js::gc::Cell *cell = reinterpret_cast(str); + AssertGCThingHasType(cell, JSTRACE_STRING); + return cell; +} + +static MOZ_ALWAYS_INLINE js::gc::Cell * +AsCell(JSFlatString *flat) +{ + js::gc::Cell *cell = reinterpret_cast(flat); + AssertGCThingHasType(cell, JSTRACE_STRING); + return cell; +} + +static MOZ_ALWAYS_INLINE js::gc::Cell * +AsCell(JS::Symbol *sym) +{ + js::gc::Cell *cell = reinterpret_cast(sym); + AssertGCThingHasType(cell, JSTRACE_SYMBOL); + return cell; +} + +static MOZ_ALWAYS_INLINE js::gc::Cell * +AsCell(JSScript *script) +{ + js::gc::Cell *cell = reinterpret_cast(script); + AssertGCThingHasType(cell, JSTRACE_SCRIPT); + return cell; +} + +namespace shadow { + +struct ArenaHeader +{ + JS::Zone *zone; +}; + +struct Zone +{ + protected: + JSRuntime *const runtime_; + JSTracer *const barrierTracer_; // A pointer to the JSRuntime's |gcMarker|. + + public: + bool needsBarrier_; + + Zone(JSRuntime *runtime, JSTracer *barrierTracerArg) + : runtime_(runtime), + barrierTracer_(barrierTracerArg), + needsBarrier_(false) + {} + + bool needsBarrier() const { + return needsBarrier_; + } + + JSTracer *barrierTracer() { + MOZ_ASSERT(needsBarrier_); + MOZ_ASSERT(js::CurrentThreadCanAccessRuntime(runtime_)); + return barrierTracer_; + } + + JSRuntime *runtimeFromMainThread() const { + MOZ_ASSERT(js::CurrentThreadCanAccessRuntime(runtime_)); + return runtime_; + } + + // Note: Unrestricted access to the zone's runtime from an arbitrary + // thread can easily lead to races. Use this method very carefully. + JSRuntime *runtimeFromAnyThread() const { + return runtime_; + } + + static JS::shadow::Zone *asShadowZone(JS::Zone *zone) { + return reinterpret_cast(zone); + } +}; + +} /* namespace shadow */ +} /* namespace JS */ + +namespace js { +namespace gc { + +static MOZ_ALWAYS_INLINE uintptr_t * +GetGCThingMarkBitmap(const void *thing) +{ + MOZ_ASSERT(thing); + uintptr_t addr = uintptr_t(thing); + addr &= ~js::gc::ChunkMask; + addr |= js::gc::ChunkMarkBitmapOffset; + return reinterpret_cast(addr); +} + +static MOZ_ALWAYS_INLINE JS::shadow::Runtime * +GetGCThingRuntime(const void *thing) +{ + MOZ_ASSERT(thing); + uintptr_t addr = uintptr_t(thing); + addr &= ~js::gc::ChunkMask; + addr |= js::gc::ChunkRuntimeOffset; + return *reinterpret_cast(addr); +} + +static MOZ_ALWAYS_INLINE void +GetGCThingMarkWordAndMask(const void *thing, uint32_t color, + uintptr_t **wordp, uintptr_t *maskp) +{ + uintptr_t addr = uintptr_t(thing); + size_t bit = (addr & js::gc::ChunkMask) / js::gc::CellSize + color; + MOZ_ASSERT(bit < js::gc::ChunkMarkBitmapBits); + uintptr_t *bitmap = GetGCThingMarkBitmap(thing); + const uintptr_t nbits = sizeof(*bitmap) * CHAR_BIT; + *maskp = uintptr_t(1) << (bit % nbits); + *wordp = &bitmap[bit / nbits]; +} + +static MOZ_ALWAYS_INLINE JS::shadow::ArenaHeader * +GetGCThingArena(void *thing) +{ + uintptr_t addr = uintptr_t(thing); + addr &= ~js::gc::ArenaMask; + return reinterpret_cast(addr); +} + +MOZ_ALWAYS_INLINE bool +IsInsideNursery(const js::gc::Cell *cell) +{ +#ifdef JSGC_GENERATIONAL + if (!cell) + return false; + uintptr_t addr = uintptr_t(cell); + addr &= ~js::gc::ChunkMask; + addr |= js::gc::ChunkLocationOffset; + uint32_t location = *reinterpret_cast(addr); + JS_ASSERT(location != 0); + return location & ChunkLocationAnyNursery; +#else + return false; +#endif +} + +} /* namespace gc */ + +} /* namespace js */ + +namespace JS { + +static MOZ_ALWAYS_INLINE Zone * +GetGCThingZone(void *thing) +{ + MOZ_ASSERT(thing); + return js::gc::GetGCThingArena(thing)->zone; +} + +static MOZ_ALWAYS_INLINE Zone * +GetObjectZone(JSObject *obj) +{ + return GetGCThingZone(obj); +} + +static MOZ_ALWAYS_INLINE bool +GCThingIsMarkedGray(void *thing) +{ +#ifdef JSGC_GENERATIONAL + /* + * GC things residing in the nursery cannot be gray: they have no mark bits. + * All live objects in the nursery are moved to tenured at the beginning of + * each GC slice, so the gray marker never sees nursery things. + */ + if (js::gc::IsInsideNursery((js::gc::Cell *)thing)) + return false; +#endif + uintptr_t *word, mask; + js::gc::GetGCThingMarkWordAndMask(thing, js::gc::GRAY, &word, &mask); + return *word & mask; +} + +static MOZ_ALWAYS_INLINE bool +IsIncrementalBarrierNeededOnGCThing(shadow::Runtime *rt, void *thing, JSGCTraceKind kind) +{ + if (!rt->needsBarrier_) + return false; + JS::Zone *zone = GetGCThingZone(thing); + return reinterpret_cast(zone)->needsBarrier_; +} + +} /* namespace JS */ + +#endif /* js_HeapAPI_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Id.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Id.h new file mode 100644 index 0000000000..11116f2efe --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Id.h @@ -0,0 +1,185 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_Id_h +#define js_Id_h + +// A jsid is an identifier for a property or method of an object which is +// either a 31-bit signed integer, interned string or object. +// +// Also, there is an additional jsid value, JSID_VOID, which does not occur in +// JS scripts but may be used to indicate the absence of a valid jsid. A void +// jsid is not a valid id and only arises as an exceptional API return value, +// such as in JS_NextProperty. Embeddings must not pass JSID_VOID into JSAPI +// entry points expecting a jsid and do not need to handle JSID_VOID in hooks +// receiving a jsid except when explicitly noted in the API contract. +// +// A jsid is not implicitly convertible to or from a jsval; JS_ValueToId or +// JS_IdToValue must be used instead. + +#include "mozilla/NullPtr.h" + +#include "jstypes.h" + +#include "js/HeapAPI.h" +#include "js/RootingAPI.h" +#include "js/TypeDecls.h" +#include "js/Utility.h" + +struct jsid +{ + size_t asBits; + bool operator==(jsid rhs) const { return asBits == rhs.asBits; } + bool operator!=(jsid rhs) const { return asBits != rhs.asBits; } +}; +#define JSID_BITS(id) (id.asBits) + +#define JSID_TYPE_STRING 0x0 +#define JSID_TYPE_INT 0x1 +#define JSID_TYPE_VOID 0x2 +#define JSID_TYPE_SYMBOL 0x4 +#define JSID_TYPE_MASK 0x7 + +// Avoid using canonical 'id' for jsid parameters since this is a magic word in +// Objective-C++ which, apparently, wants to be able to #include jsapi.h. +#define id iden + +static MOZ_ALWAYS_INLINE bool +JSID_IS_STRING(jsid id) +{ + return (JSID_BITS(id) & JSID_TYPE_MASK) == 0; +} + +static MOZ_ALWAYS_INLINE JSString * +JSID_TO_STRING(jsid id) +{ + MOZ_ASSERT(JSID_IS_STRING(id)); + return (JSString *)JSID_BITS(id); +} + +static MOZ_ALWAYS_INLINE bool +JSID_IS_ZERO(jsid id) +{ + return JSID_BITS(id) == 0; +} + +static MOZ_ALWAYS_INLINE bool +JSID_IS_INT(jsid id) +{ + return !!(JSID_BITS(id) & JSID_TYPE_INT); +} + +static MOZ_ALWAYS_INLINE int32_t +JSID_TO_INT(jsid id) +{ + MOZ_ASSERT(JSID_IS_INT(id)); + return ((uint32_t)JSID_BITS(id)) >> 1; +} + +#define JSID_INT_MIN 0 +#define JSID_INT_MAX INT32_MAX + +static MOZ_ALWAYS_INLINE bool +INT_FITS_IN_JSID(int32_t i) +{ + return i >= 0; +} + +static MOZ_ALWAYS_INLINE jsid +INT_TO_JSID(int32_t i) +{ + jsid id; + MOZ_ASSERT(INT_FITS_IN_JSID(i)); + JSID_BITS(id) = ((i << 1) | JSID_TYPE_INT); + return id; +} + +static MOZ_ALWAYS_INLINE bool +JSID_IS_SYMBOL(jsid id) +{ + return (JSID_BITS(id) & JSID_TYPE_MASK) == JSID_TYPE_SYMBOL && + JSID_BITS(id) != JSID_TYPE_SYMBOL; +} + +static MOZ_ALWAYS_INLINE JS::Symbol * +JSID_TO_SYMBOL(jsid id) +{ + MOZ_ASSERT(JSID_IS_SYMBOL(id)); + return (JS::Symbol *)(JSID_BITS(id) & ~(size_t)JSID_TYPE_MASK); +} + +static MOZ_ALWAYS_INLINE jsid +SYMBOL_TO_JSID(JS::Symbol *sym) +{ + jsid id; + MOZ_ASSERT(sym != nullptr); + MOZ_ASSERT((size_t(sym) & JSID_TYPE_MASK) == 0); + JS_ASSERT(!js::gc::IsInsideNursery(JS::AsCell(sym))); + JS_ASSERT(!JS::IsPoisonedPtr(sym)); + JSID_BITS(id) = (size_t(sym) | JSID_TYPE_SYMBOL); + return id; +} + +static MOZ_ALWAYS_INLINE bool +JSID_IS_GCTHING(jsid id) +{ + return JSID_IS_STRING(id) || JSID_IS_SYMBOL(id); +} + +static MOZ_ALWAYS_INLINE void * +JSID_TO_GCTHING(jsid id) +{ + return (void *)(JSID_BITS(id) & ~(size_t)JSID_TYPE_MASK); +} + +static MOZ_ALWAYS_INLINE bool +JSID_IS_VOID(const jsid id) +{ + MOZ_ASSERT_IF(((size_t)JSID_BITS(id) & JSID_TYPE_MASK) == JSID_TYPE_VOID, + JSID_BITS(id) == JSID_TYPE_VOID); + return ((size_t)JSID_BITS(id) == JSID_TYPE_VOID); +} + +static MOZ_ALWAYS_INLINE bool +JSID_IS_EMPTY(const jsid id) +{ + return ((size_t)JSID_BITS(id) == JSID_TYPE_SYMBOL); +} + +extern JS_PUBLIC_DATA(const jsid) JSID_VOID; +extern JS_PUBLIC_DATA(const jsid) JSID_EMPTY; + +extern JS_PUBLIC_DATA(const JS::HandleId) JSID_VOIDHANDLE; +extern JS_PUBLIC_DATA(const JS::HandleId) JSID_EMPTYHANDLE; + +namespace js { + +inline bool +IsPoisonedId(jsid id) +{ + if (JSID_IS_STRING(id)) + return JS::IsPoisonedPtr(JSID_TO_STRING(id)); + if (JSID_IS_SYMBOL(id)) + return JS::IsPoisonedPtr(JSID_TO_SYMBOL(id)); + return false; +} + +template <> struct GCMethods +{ + static jsid initial() { return JSID_VOID; } + static bool poisoned(jsid id) { return IsPoisonedId(id); } + static bool needsPostBarrier(jsid id) { return false; } +#ifdef JSGC_GENERATIONAL + static void postBarrier(jsid *idp) {} + static void relocate(jsid *idp) {} +#endif +}; + +#undef id + +} + +#endif /* js_Id_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/LegacyIntTypes.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/LegacyIntTypes.h new file mode 100644 index 0000000000..2c8498c89e --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/LegacyIntTypes.h @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * This section typedefs the old 'native' types to the new types. + * These redefinitions are provided solely to allow JSAPI users to more easily + * transition to types. They are not to be used in the JSAPI, and + * new JSAPI user code should not use them. This mapping file may eventually + * be removed from SpiderMonkey, so don't depend on it in the long run. + */ + +/* + * BEWARE: Comity with other implementers of these types is not guaranteed. + * Indeed, if you use this header and third-party code defining these + * types, *expect* to encounter either compile errors or link errors, + * depending how these types are used and on the order of inclusion. + * It is safest to use only the types. + */ +#ifndef js_LegacyIntTypes_h +#define js_LegacyIntTypes_h + +#include + +#include "js-config.h" + +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; + +/* + * On AIX 4.3, sys/inttypes.h (which is included by sys/types.h, a very + * common header file) defines the types int8, int16, int32, and int64. + * So we don't define these four types here to avoid conflicts in case + * the code also includes sys/types.h. + */ +#if defined(AIX) && defined(HAVE_SYS_INTTYPES_H) +#include +#else +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; +#endif /* AIX && HAVE_SYS_INTTYPES_H */ + +typedef uint8_t JSUint8; +typedef uint16_t JSUint16; +typedef uint32_t JSUint32; +typedef uint64_t JSUint64; + +typedef int8_t JSInt8; +typedef int16_t JSInt16; +typedef int32_t JSInt32; +typedef int64_t JSInt64; + +#endif /* js_LegacyIntTypes_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/MemoryMetrics.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/MemoryMetrics.h new file mode 100644 index 0000000000..31e456baba --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/MemoryMetrics.h @@ -0,0 +1,668 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_MemoryMetrics_h +#define js_MemoryMetrics_h + +// These declarations are highly likely to change in the future. Depend on them +// at your own risk. + +#include "mozilla/MemoryReporting.h" +#include "mozilla/NullPtr.h" +#include "mozilla/PodOperations.h" + +#include + +#include "jsalloc.h" +#include "jspubtd.h" + +#include "js/HashTable.h" +#include "js/Utility.h" +#include "js/Vector.h" + +class nsISupports; // Needed for ObjectPrivateVisitor. + +namespace JS { + +struct TabSizes +{ + enum Kind { + Objects, + Strings, + Private, + Other + }; + + TabSizes() { mozilla::PodZero(this); } + + void add(Kind kind, size_t n) { + switch (kind) { + case Objects: objects += n; break; + case Strings: strings += n; break; + case Private: private_ += n; break; + case Other: other += n; break; + default: MOZ_CRASH("bad TabSizes kind"); + } + } + + size_t objects; + size_t strings; + size_t private_; + size_t other; +}; + +} // namespace JS + +namespace js { + +// In memory reporting, we have concept of "sundries", line items which are too +// small to be worth reporting individually. Under some circumstances, a memory +// reporter gets tossed into the sundries bucket if it's smaller than +// MemoryReportingSundriesThreshold() bytes. +// +// We need to define this value here, rather than in the code which actually +// generates the memory reports, because NotableStringInfo uses this value. +JS_FRIEND_API(size_t) MemoryReportingSundriesThreshold(); + +// This hash policy avoids flattening ropes (which perturbs the site being +// measured and requires a JSContext) at the expense of doing a FULL ROPE COPY +// on every hash and match! Beware. +struct InefficientNonFlatteningStringHashPolicy +{ + typedef JSString *Lookup; + static HashNumber hash(const Lookup &l); + static bool match(const JSString *const &k, const Lookup &l); +}; + +struct CStringHashPolicy +{ + typedef const char *Lookup; + static HashNumber hash(const Lookup &l); + static bool match(const char *const &k, const Lookup &l); +}; + +// This file features many classes with numerous size_t fields, and each such +// class has one or more methods that need to operate on all of these fields. +// Writing these individually is error-prone -- it's easy to add a new field +// without updating all the required methods. So we define a single macro list +// in each class to name the fields (and notable characteristics of them), and +// then use the following macros to transform those lists into the required +// methods. +// +// In some classes, one or more of the macro arguments aren't used. We use '_' +// for those. +// +#define DECL_SIZE(kind, gc, mSize) size_t mSize; +#define ZERO_SIZE(kind, gc, mSize) mSize(0), +#define COPY_OTHER_SIZE(kind, gc, mSize) mSize(other.mSize), +#define ADD_OTHER_SIZE(kind, gc, mSize) mSize += other.mSize; +#define SUB_OTHER_SIZE(kind, gc, mSize) MOZ_ASSERT(mSize >= other.mSize); \ + mSize -= other.mSize; +#define ADD_SIZE_TO_N(kind, gc, mSize) n += mSize; +#define ADD_SIZE_TO_N_IF_LIVE_GC_THING(kind, gc, mSize) n += (js::gc) ? mSize : 0; +#define ADD_TO_TAB_SIZES(kind, gc, mSize) sizes->add(JS::TabSizes::kind, mSize); + +// Used to annotate which size_t fields measure live GC things and which don't. +enum { + NotLiveGCThing = false, + IsLiveGCThing = true +}; + +} // namespace js + +namespace JS { + +// Data for tracking memory usage of things hanging off objects. +struct ObjectsExtraSizes +{ +#define FOR_EACH_SIZE(macro) \ + macro(Objects, NotLiveGCThing, mallocHeapSlots) \ + macro(Objects, NotLiveGCThing, mallocHeapElementsNonAsmJS) \ + macro(Objects, NotLiveGCThing, mallocHeapElementsAsmJS) \ + macro(Objects, NotLiveGCThing, nonHeapElementsAsmJS) \ + macro(Objects, NotLiveGCThing, nonHeapElementsMapped) \ + macro(Objects, NotLiveGCThing, nonHeapCodeAsmJS) \ + macro(Objects, NotLiveGCThing, mallocHeapAsmJSModuleData) \ + macro(Objects, NotLiveGCThing, mallocHeapArgumentsData) \ + macro(Objects, NotLiveGCThing, mallocHeapRegExpStatics) \ + macro(Objects, NotLiveGCThing, mallocHeapPropertyIteratorData) \ + macro(Objects, NotLiveGCThing, mallocHeapCtypesData) + + ObjectsExtraSizes() + : FOR_EACH_SIZE(ZERO_SIZE) + dummy() + {} + + void add(const ObjectsExtraSizes &other) { + FOR_EACH_SIZE(ADD_OTHER_SIZE) + } + + size_t sizeOfLiveGCThings() const { + size_t n = 0; + FOR_EACH_SIZE(ADD_SIZE_TO_N_IF_LIVE_GC_THING) + return n; + } + + void addToTabSizes(TabSizes *sizes) const { + FOR_EACH_SIZE(ADD_TO_TAB_SIZES) + } + + FOR_EACH_SIZE(DECL_SIZE) + int dummy; // present just to absorb the trailing comma from FOR_EACH_SIZE(ZERO_SIZE) + +#undef FOR_EACH_SIZE +}; + +// Data for tracking JIT-code memory usage. +struct CodeSizes +{ +#define FOR_EACH_SIZE(macro) \ + macro(_, _, ion) \ + macro(_, _, baseline) \ + macro(_, _, regexp) \ + macro(_, _, other) \ + macro(_, _, unused) + + CodeSizes() + : FOR_EACH_SIZE(ZERO_SIZE) + dummy() + {} + + FOR_EACH_SIZE(DECL_SIZE) + int dummy; // present just to absorb the trailing comma from FOR_EACH_SIZE(ZERO_SIZE) + +#undef FOR_EACH_SIZE +}; + +// Data for tracking GC memory usage. +struct GCSizes +{ +#define FOR_EACH_SIZE(macro) \ + macro(_, _, marker) \ + macro(_, _, nurseryCommitted) \ + macro(_, _, nurseryDecommitted) \ + macro(_, _, nurseryHugeSlots) \ + macro(_, _, storeBufferVals) \ + macro(_, _, storeBufferCells) \ + macro(_, _, storeBufferSlots) \ + macro(_, _, storeBufferWholeCells) \ + macro(_, _, storeBufferRelocVals) \ + macro(_, _, storeBufferRelocCells) \ + macro(_, _, storeBufferGenerics) + + GCSizes() + : FOR_EACH_SIZE(ZERO_SIZE) + dummy() + {} + + FOR_EACH_SIZE(DECL_SIZE) + int dummy; // present just to absorb the trailing comma from FOR_EACH_SIZE(ZERO_SIZE) + +#undef FOR_EACH_SIZE +}; + +// This class holds information about the memory taken up by identical copies of +// a particular string. Multiple JSStrings may have their sizes aggregated +// together into one StringInfo object. Note that two strings with identical +// chars will not be aggregated together if one is a short string and the other +// is not. +struct StringInfo +{ +#define FOR_EACH_SIZE(macro) \ + macro(Strings, IsLiveGCThing, gcHeapLatin1) \ + macro(Strings, IsLiveGCThing, gcHeapTwoByte) \ + macro(Strings, NotLiveGCThing, mallocHeapLatin1) \ + macro(Strings, NotLiveGCThing, mallocHeapTwoByte) + + StringInfo() + : FOR_EACH_SIZE(ZERO_SIZE) + numCopies(0) + {} + + void add(const StringInfo &other) { + FOR_EACH_SIZE(ADD_OTHER_SIZE); + numCopies++; + } + + void subtract(const StringInfo &other) { + FOR_EACH_SIZE(SUB_OTHER_SIZE); + numCopies--; + } + + bool isNotable() const { + static const size_t NotabilityThreshold = 16 * 1024; + size_t n = 0; + FOR_EACH_SIZE(ADD_SIZE_TO_N) + return n >= NotabilityThreshold; + } + + size_t sizeOfLiveGCThings() const { + size_t n = 0; + FOR_EACH_SIZE(ADD_SIZE_TO_N_IF_LIVE_GC_THING) + return n; + } + + void addToTabSizes(TabSizes *sizes) const { + FOR_EACH_SIZE(ADD_TO_TAB_SIZES) + } + + FOR_EACH_SIZE(DECL_SIZE) + uint32_t numCopies; // How many copies of the string have we seen? + +#undef FOR_EACH_SIZE +}; + +// Holds data about a notable string (one which, counting all duplicates, uses +// more than a certain amount of memory) so we can report it individually. +// +// The only difference between this class and StringInfo is that +// NotableStringInfo holds a copy of some or all of the string's chars. +struct NotableStringInfo : public StringInfo +{ + static const size_t MAX_SAVED_CHARS = 1024; + + NotableStringInfo(); + NotableStringInfo(JSString *str, const StringInfo &info); + NotableStringInfo(NotableStringInfo &&info); + NotableStringInfo &operator=(NotableStringInfo &&info); + + ~NotableStringInfo() { + js_free(buffer); + } + + char *buffer; + size_t length; + + private: + NotableStringInfo(const NotableStringInfo& info) MOZ_DELETE; +}; + +// This class holds information about the memory taken up by script sources +// from a particular file. +struct ScriptSourceInfo +{ +#define FOR_EACH_SIZE(macro) \ + macro(_, _, compressed) \ + macro(_, _, uncompressed) \ + macro(_, _, misc) + + ScriptSourceInfo() + : FOR_EACH_SIZE(ZERO_SIZE) + numScripts(0) + {} + + void add(const ScriptSourceInfo &other) { + FOR_EACH_SIZE(ADD_OTHER_SIZE) + numScripts++; + } + + void subtract(const ScriptSourceInfo &other) { + FOR_EACH_SIZE(SUB_OTHER_SIZE) + numScripts--; + } + + bool isNotable() const { + static const size_t NotabilityThreshold = 16 * 1024; + size_t n = 0; + FOR_EACH_SIZE(ADD_SIZE_TO_N) + return n >= NotabilityThreshold; + } + + FOR_EACH_SIZE(DECL_SIZE) + uint32_t numScripts; // How many ScriptSources come from this file? (It + // can be more than one in XML files that have + // multiple scripts in CDATA sections.) +#undef FOR_EACH_SIZE +}; + +// Holds data about a notable script source file (one whose combined +// script sources use more than a certain amount of memory) so we can report it +// individually. +// +// The only difference between this class and ScriptSourceInfo is that this +// class holds a copy of the filename. +struct NotableScriptSourceInfo : public ScriptSourceInfo +{ + NotableScriptSourceInfo(); + NotableScriptSourceInfo(const char *filename, const ScriptSourceInfo &info); + NotableScriptSourceInfo(NotableScriptSourceInfo &&info); + NotableScriptSourceInfo &operator=(NotableScriptSourceInfo &&info); + + ~NotableScriptSourceInfo() { + js_free(filename_); + } + + char *filename_; + + private: + NotableScriptSourceInfo(const NotableScriptSourceInfo& info) MOZ_DELETE; +}; + +// These measurements relate directly to the JSRuntime, and not to zones and +// compartments within it. +struct RuntimeSizes +{ +#define FOR_EACH_SIZE(macro) \ + macro(_, _, object) \ + macro(_, _, atomsTable) \ + macro(_, _, contexts) \ + macro(_, _, dtoa) \ + macro(_, _, temporary) \ + macro(_, _, interpreterStack) \ + macro(_, _, mathCache) \ + macro(_, _, uncompressedSourceCache) \ + macro(_, _, compressedSourceSet) \ + macro(_, _, scriptData) \ + + RuntimeSizes() + : FOR_EACH_SIZE(ZERO_SIZE) + scriptSourceInfo(), + code(), + gc(), + notableScriptSources() + { + allScriptSources = js_new(); + if (!allScriptSources || !allScriptSources->init()) + MOZ_CRASH("oom"); + } + + ~RuntimeSizes() { + // |allScriptSources| is usually deleted and set to nullptr before this + // destructor runs. But there are failure cases due to OOMs that may + // prevent that, so it doesn't hurt to try again here. + js_delete(allScriptSources); + } + + // The script source measurements in |scriptSourceInfo| are initially for + // all script sources. At the end, if the measurement granularity is + // FineGrained, we subtract the measurements of the notable script sources + // and move them into |notableScriptSources|. + FOR_EACH_SIZE(DECL_SIZE) + ScriptSourceInfo scriptSourceInfo; + CodeSizes code; + GCSizes gc; + + typedef js::HashMap ScriptSourcesHashMap; + + // |allScriptSources| is only used transiently. During the reporting phase + // it is filled with info about every script source in the runtime. It's + // then used to fill in |notableScriptSources| (which actually gets + // reported), and immediately discarded afterwards. + ScriptSourcesHashMap *allScriptSources; + js::Vector notableScriptSources; + +#undef FOR_EACH_SIZE +}; + +struct ZoneStats +{ +#define FOR_EACH_SIZE(macro) \ + macro(Other, IsLiveGCThing, symbolsGCHeap) \ + macro(Other, NotLiveGCThing, gcHeapArenaAdmin) \ + macro(Other, NotLiveGCThing, unusedGCThings) \ + macro(Other, IsLiveGCThing, lazyScriptsGCHeap) \ + macro(Other, NotLiveGCThing, lazyScriptsMallocHeap) \ + macro(Other, IsLiveGCThing, jitCodesGCHeap) \ + macro(Other, IsLiveGCThing, typeObjectsGCHeap) \ + macro(Other, NotLiveGCThing, typeObjectsMallocHeap) \ + macro(Other, NotLiveGCThing, typePool) \ + macro(Other, NotLiveGCThing, baselineStubsOptimized) \ + + ZoneStats() + : FOR_EACH_SIZE(ZERO_SIZE) + stringInfo(), + extra(), + allStrings(nullptr), + notableStrings(), + isTotals(true) + {} + + ZoneStats(ZoneStats &&other) + : FOR_EACH_SIZE(COPY_OTHER_SIZE) + stringInfo(mozilla::Move(other.stringInfo)), + extra(other.extra), + allStrings(other.allStrings), + notableStrings(mozilla::Move(other.notableStrings)), + isTotals(other.isTotals) + { + other.allStrings = nullptr; + MOZ_ASSERT(!other.isTotals); + } + + ~ZoneStats() { + // |allStrings| is usually deleted and set to nullptr before this + // destructor runs. But there are failure cases due to OOMs that may + // prevent that, so it doesn't hurt to try again here. + js_delete(allStrings); + } + + bool initStrings(JSRuntime *rt); + + void addSizes(const ZoneStats &other) { + MOZ_ASSERT(isTotals); + FOR_EACH_SIZE(ADD_OTHER_SIZE) + stringInfo.add(other.stringInfo); + } + + size_t sizeOfLiveGCThings() const { + MOZ_ASSERT(isTotals); + size_t n = 0; + FOR_EACH_SIZE(ADD_SIZE_TO_N_IF_LIVE_GC_THING) + n += stringInfo.sizeOfLiveGCThings(); + return n; + } + + void addToTabSizes(JS::TabSizes *sizes) const { + MOZ_ASSERT(isTotals); + FOR_EACH_SIZE(ADD_TO_TAB_SIZES) + stringInfo.addToTabSizes(sizes); + } + + // These string measurements are initially for all strings. At the end, + // if the measurement granularity is FineGrained, we subtract the + // measurements of the notable script sources and move them into + // |notableStrings|. + FOR_EACH_SIZE(DECL_SIZE) + StringInfo stringInfo; + void *extra; // This field can be used by embedders. + + typedef js::HashMap StringsHashMap; + + // |allStrings| is only used transiently. During the zone traversal it is + // filled with info about every string in the zone. It's then used to fill + // in |notableStrings| (which actually gets reported), and immediately + // discarded afterwards. + StringsHashMap *allStrings; + js::Vector notableStrings; + bool isTotals; + +#undef FOR_EACH_SIZE +}; + +struct CompartmentStats +{ +#define FOR_EACH_SIZE(macro) \ + macro(Objects, IsLiveGCThing, objectsGCHeapOrdinary) \ + macro(Objects, IsLiveGCThing, objectsGCHeapFunction) \ + macro(Objects, IsLiveGCThing, objectsGCHeapDenseArray) \ + macro(Objects, IsLiveGCThing, objectsGCHeapSlowArray) \ + macro(Objects, IsLiveGCThing, objectsGCHeapCrossCompartmentWrapper) \ + macro(Private, NotLiveGCThing, objectsPrivate) \ + macro(Other, IsLiveGCThing, shapesGCHeapTreeGlobalParented) \ + macro(Other, IsLiveGCThing, shapesGCHeapTreeNonGlobalParented) \ + macro(Other, IsLiveGCThing, shapesGCHeapDict) \ + macro(Other, IsLiveGCThing, shapesGCHeapBase) \ + macro(Other, NotLiveGCThing, shapesMallocHeapTreeTables) \ + macro(Other, NotLiveGCThing, shapesMallocHeapDictTables) \ + macro(Other, NotLiveGCThing, shapesMallocHeapTreeShapeKids) \ + macro(Other, NotLiveGCThing, shapesMallocHeapCompartmentTables) \ + macro(Other, IsLiveGCThing, scriptsGCHeap) \ + macro(Other, NotLiveGCThing, scriptsMallocHeapData) \ + macro(Other, NotLiveGCThing, baselineData) \ + macro(Other, NotLiveGCThing, baselineStubsFallback) \ + macro(Other, NotLiveGCThing, ionData) \ + macro(Other, NotLiveGCThing, typeInferenceTypeScripts) \ + macro(Other, NotLiveGCThing, typeInferenceAllocationSiteTables) \ + macro(Other, NotLiveGCThing, typeInferenceArrayTypeTables) \ + macro(Other, NotLiveGCThing, typeInferenceObjectTypeTables) \ + macro(Other, NotLiveGCThing, compartmentObject) \ + macro(Other, NotLiveGCThing, crossCompartmentWrappersTable) \ + macro(Other, NotLiveGCThing, regexpCompartment) \ + macro(Other, NotLiveGCThing, debuggeesSet) \ + macro(Other, NotLiveGCThing, savedStacksSet) + + CompartmentStats() + : FOR_EACH_SIZE(ZERO_SIZE) + objectsExtra(), + extra() + {} + + CompartmentStats(const CompartmentStats &other) + : FOR_EACH_SIZE(COPY_OTHER_SIZE) + objectsExtra(other.objectsExtra), + extra(other.extra) + {} + + void add(const CompartmentStats &other) { + FOR_EACH_SIZE(ADD_OTHER_SIZE) + objectsExtra.add(other.objectsExtra); + // Do nothing with |extra|. + } + + size_t sizeOfLiveGCThings() const { + size_t n = 0; + FOR_EACH_SIZE(ADD_SIZE_TO_N_IF_LIVE_GC_THING) + n += objectsExtra.sizeOfLiveGCThings(); + // Do nothing with |extra|. + return n; + } + + void addToTabSizes(TabSizes *sizes) const { + FOR_EACH_SIZE(ADD_TO_TAB_SIZES); + objectsExtra.addToTabSizes(sizes); + // Do nothing with |extra|. + } + + FOR_EACH_SIZE(DECL_SIZE) + ObjectsExtraSizes objectsExtra; + void *extra; // This field can be used by embedders. + +#undef FOR_EACH_SIZE +}; + +typedef js::Vector CompartmentStatsVector; +typedef js::Vector ZoneStatsVector; + +struct RuntimeStats +{ +#define FOR_EACH_SIZE(macro) \ + macro(_, _, gcHeapChunkTotal) \ + macro(_, _, gcHeapDecommittedArenas) \ + macro(_, _, gcHeapUnusedChunks) \ + macro(_, _, gcHeapUnusedArenas) \ + macro(_, _, gcHeapChunkAdmin) \ + macro(_, _, gcHeapGCThings) \ + + explicit RuntimeStats(mozilla::MallocSizeOf mallocSizeOf) + : FOR_EACH_SIZE(ZERO_SIZE) + runtime(), + cTotals(), + zTotals(), + compartmentStatsVector(), + zoneStatsVector(), + currZoneStats(nullptr), + mallocSizeOf_(mallocSizeOf) + {} + + // Here's a useful breakdown of the GC heap. + // + // - rtStats.gcHeapChunkTotal + // - decommitted bytes + // - rtStats.gcHeapDecommittedArenas (decommitted arenas in non-empty chunks) + // - unused bytes + // - rtStats.gcHeapUnusedChunks (empty chunks) + // - rtStats.gcHeapUnusedArenas (empty arenas within non-empty chunks) + // - rtStats.zTotals.unusedGCThings (empty GC thing slots within non-empty arenas) + // - used bytes + // - rtStats.gcHeapChunkAdmin + // - rtStats.zTotals.gcHeapArenaAdmin + // - rtStats.gcHeapGCThings (in-use GC things) + // == rtStats.zTotals.sizeOfLiveGCThings() + rtStats.cTotals.sizeOfLiveGCThings() + // + // It's possible that some arenas in empty chunks may be decommitted, but + // we don't count those under rtStats.gcHeapDecommittedArenas because (a) + // it's rare, and (b) this means that rtStats.gcHeapUnusedChunks is a + // multiple of the chunk size, which is good. + + FOR_EACH_SIZE(DECL_SIZE) + + RuntimeSizes runtime; + + CompartmentStats cTotals; // The sum of this runtime's compartments' measurements. + ZoneStats zTotals; // The sum of this runtime's zones' measurements. + + CompartmentStatsVector compartmentStatsVector; + ZoneStatsVector zoneStatsVector; + + ZoneStats *currZoneStats; + + mozilla::MallocSizeOf mallocSizeOf_; + + virtual void initExtraCompartmentStats(JSCompartment *c, CompartmentStats *cstats) = 0; + virtual void initExtraZoneStats(JS::Zone *zone, ZoneStats *zstats) = 0; + +#undef FOR_EACH_SIZE +}; + +class ObjectPrivateVisitor +{ + public: + // Within CollectRuntimeStats, this method is called for each JS object + // that has an nsISupports pointer. + virtual size_t sizeOfIncludingThis(nsISupports *aSupports) = 0; + + // A callback that gets a JSObject's nsISupports pointer, if it has one. + // Note: this function does *not* addref |iface|. + typedef bool(*GetISupportsFun)(JSObject *obj, nsISupports **iface); + GetISupportsFun getISupports_; + + explicit ObjectPrivateVisitor(GetISupportsFun getISupports) + : getISupports_(getISupports) + {} +}; + +extern JS_PUBLIC_API(bool) +CollectRuntimeStats(JSRuntime *rt, RuntimeStats *rtStats, ObjectPrivateVisitor *opv, bool anonymize); + +extern JS_PUBLIC_API(size_t) +SystemCompartmentCount(JSRuntime *rt); + +extern JS_PUBLIC_API(size_t) +UserCompartmentCount(JSRuntime *rt); + +extern JS_PUBLIC_API(size_t) +PeakSizeOfTemporary(const JSRuntime *rt); + +extern JS_PUBLIC_API(bool) +AddSizeOfTab(JSRuntime *rt, JS::HandleObject obj, mozilla::MallocSizeOf mallocSizeOf, + ObjectPrivateVisitor *opv, TabSizes *sizes); + +} // namespace JS + +#undef DECL_SIZE +#undef ZERO_SIZE +#undef COPY_OTHER_SIZE +#undef ADD_OTHER_SIZE +#undef SUB_OTHER_SIZE +#undef ADD_SIZE_TO_N +#undef ADD_SIZE_TO_N_IF_LIVE_GC_THING +#undef ADD_TO_TAB_SIZES + +#endif /* js_MemoryMetrics_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/OldDebugAPI.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/OldDebugAPI.h new file mode 100644 index 0000000000..7117d754d9 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/OldDebugAPI.h @@ -0,0 +1,385 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_OldDebugAPI_h +#define js_OldDebugAPI_h + +/* + * JS debugger API. + */ + +#include "mozilla/NullPtr.h" + +#include "jsapi.h" +#include "jsbytecode.h" + +#include "js/CallArgs.h" +#include "js/TypeDecls.h" + +class JSAtom; +struct JSFreeOp; + +namespace js { +class InterpreterFrame; +class FrameIter; +class ScriptSource; +} + +// Raw JSScript* because this needs to be callable from a signal handler. +extern JS_PUBLIC_API(unsigned) +JS_PCToLineNumber(JSContext *cx, JSScript *script, jsbytecode *pc); + +extern JS_PUBLIC_API(const char *) +JS_GetScriptFilename(JSScript *script); + +namespace JS { + +extern JS_PUBLIC_API(char *) +FormatStackDump(JSContext *cx, char *buf, bool showArgs, bool showLocals, bool showThisProps); + +} // namespace JS + +# ifdef JS_DEBUG +JS_FRIEND_API(void) js_DumpValue(const JS::Value &val); +JS_FRIEND_API(void) js_DumpId(jsid id); +JS_FRIEND_API(void) js_DumpInterpreterFrame(JSContext *cx, js::InterpreterFrame *start = nullptr); +# endif + +JS_FRIEND_API(void) +js_DumpBacktrace(JSContext *cx); + +typedef enum JSTrapStatus { + JSTRAP_ERROR, + JSTRAP_CONTINUE, + JSTRAP_RETURN, + JSTRAP_THROW, + JSTRAP_LIMIT +} JSTrapStatus; + +typedef JSTrapStatus +(* JSTrapHandler)(JSContext *cx, JSScript *script, jsbytecode *pc, JS::Value *rval, + JS::Value closure); + +typedef JSTrapStatus +(* JSDebuggerHandler)(JSContext *cx, JSScript *script, jsbytecode *pc, JS::Value *rval, + void *closure); + +typedef bool +(* JSWatchPointHandler)(JSContext *cx, JSObject *obj, jsid id, JS::Value old, + JS::Value *newp, void *closure); + + + +extern JS_PUBLIC_API(JSCompartment *) +JS_EnterCompartmentOfScript(JSContext *cx, JSScript *target); + +extern JS_PUBLIC_API(JSString *) +JS_DecompileScript(JSContext *cx, JS::HandleScript script, const char *name, unsigned indent); + +/* + * Currently, we only support runtime-wide debugging. In the future, we should + * be able to support compartment-wide debugging. + */ +extern JS_PUBLIC_API(void) +JS_SetRuntimeDebugMode(JSRuntime *rt, bool debug); + +/* + * Debug mode is a compartment-wide mode that enables a debugger to attach + * to and interact with running methodjit-ed frames. In particular, it causes + * every function to be compiled as if an eval was present (so eval-in-frame) + * can work, and it ensures that functions can be re-JITed for other debug + * features. In general, it is not safe to interact with frames that were live + * before debug mode was enabled. For this reason, it is also not safe to + * enable debug mode while frames are live. + */ + +/* Get current state of debugging mode. */ +extern JS_PUBLIC_API(bool) +JS_GetDebugMode(JSContext *cx); + +/* + * Turn on/off debugging mode for all compartments. This returns false if any code + * from any of the runtime's compartments is running or on the stack. + */ +JS_FRIEND_API(bool) +JS_SetDebugModeForAllCompartments(JSContext *cx, bool debug); + +/* + * Turn on/off debugging mode for a single compartment. This should only be + * used when no code from this compartment is running or on the stack in any + * thread. + */ +JS_FRIEND_API(bool) +JS_SetDebugModeForCompartment(JSContext *cx, JSCompartment *comp, bool debug); + +/* + * Turn on/off debugging mode for a context's compartment. + */ +JS_FRIEND_API(bool) +JS_SetDebugMode(JSContext *cx, bool debug); + +/* Turn on single step mode. */ +extern JS_PUBLIC_API(bool) +JS_SetSingleStepMode(JSContext *cx, JS::HandleScript script, bool singleStep); + +/* The closure argument will be marked. */ +extern JS_PUBLIC_API(bool) +JS_SetTrap(JSContext *cx, JS::HandleScript script, jsbytecode *pc, + JSTrapHandler handler, JS::HandleValue closure); + +extern JS_PUBLIC_API(void) +JS_ClearTrap(JSContext *cx, JSScript *script, jsbytecode *pc, + JSTrapHandler *handlerp, JS::Value *closurep); + +extern JS_PUBLIC_API(void) +JS_ClearScriptTraps(JSRuntime *rt, JSScript *script); + +extern JS_PUBLIC_API(void) +JS_ClearAllTrapsForCompartment(JSContext *cx); + +/************************************************************************/ + +extern JS_PUBLIC_API(bool) +JS_SetWatchPoint(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JSWatchPointHandler handler, JS::HandleObject closure); + +extern JS_PUBLIC_API(bool) +JS_ClearWatchPoint(JSContext *cx, JSObject *obj, jsid id, + JSWatchPointHandler *handlerp, JSObject **closurep); + +extern JS_PUBLIC_API(bool) +JS_ClearWatchPointsForObject(JSContext *cx, JSObject *obj); + +/************************************************************************/ + +extern JS_PUBLIC_API(jsbytecode *) +JS_LineNumberToPC(JSContext *cx, JSScript *script, unsigned lineno); + +extern JS_PUBLIC_API(jsbytecode *) +JS_EndPC(JSContext *cx, JSScript *script); + +extern JS_PUBLIC_API(bool) +JS_GetLinePCs(JSContext *cx, JSScript *script, + unsigned startLine, unsigned maxLines, + unsigned* count, unsigned** lines, jsbytecode*** pcs); + +extern JS_PUBLIC_API(unsigned) +JS_GetFunctionArgumentCount(JSContext *cx, JSFunction *fun); + +extern JS_PUBLIC_API(bool) +JS_FunctionHasLocalNames(JSContext *cx, JSFunction *fun); + +/* + * N.B. The mark is in the context temp pool and thus the caller must take care + * to call JS_ReleaseFunctionLocalNameArray in a LIFO manner (wrt to any other + * call that may use the temp pool. + */ +extern JS_PUBLIC_API(uintptr_t *) +JS_GetFunctionLocalNameArray(JSContext *cx, JSFunction *fun, void **markp); + +extern JS_PUBLIC_API(JSAtom *) +JS_LocalNameToAtom(uintptr_t w); + +extern JS_PUBLIC_API(JSString *) +JS_AtomKey(JSAtom *atom); + +extern JS_PUBLIC_API(void) +JS_ReleaseFunctionLocalNameArray(JSContext *cx, void *mark); + +extern JS_PUBLIC_API(JSScript *) +JS_GetFunctionScript(JSContext *cx, JS::HandleFunction fun); + +extern JS_PUBLIC_API(JSNative) +JS_GetFunctionNative(JSContext *cx, JSFunction *fun); + +JS_PUBLIC_API(JSFunction *) +JS_GetScriptFunction(JSContext *cx, JSScript *script); + +extern JS_PUBLIC_API(JSObject *) +JS_GetParentOrScopeChain(JSContext *cx, JSObject *obj); + +/************************************************************************/ + +/* + * This is almost JS_GetClass(obj)->name except that certain debug-only + * proxies are made transparent. In particular, this function turns the class + * of any scope (returned via JS_GetFrameScopeChain or JS_GetFrameCalleeObject) + * from "Proxy" to "Call", "Block", "With" etc. + */ +extern JS_PUBLIC_API(const char *) +JS_GetDebugClassName(JSObject *obj); + +/************************************************************************/ + +extern JS_PUBLIC_API(const jschar *) +JS_GetScriptSourceMap(JSContext *cx, JSScript *script); + +extern JS_PUBLIC_API(unsigned) +JS_GetScriptBaseLineNumber(JSContext *cx, JSScript *script); + +extern JS_PUBLIC_API(unsigned) +JS_GetScriptLineExtent(JSContext *cx, JSScript *script); + +extern JS_PUBLIC_API(JSVersion) +JS_GetScriptVersion(JSContext *cx, JSScript *script); + +extern JS_PUBLIC_API(bool) +JS_GetScriptIsSelfHosted(JSScript *script); + +/************************************************************************/ + +typedef struct JSPropertyDesc { + JS::Value id; /* primary id, atomized string, or int */ + JS::Value value; /* property value */ + uint8_t flags; /* flags, see below */ + uint8_t spare; /* unused */ + JS::Value alias; /* alias id if JSPD_ALIAS flag */ +} JSPropertyDesc; + +#define JSPD_ENUMERATE 0x01 /* visible to for/in loop */ +#define JSPD_READONLY 0x02 /* assignment is error */ +#define JSPD_PERMANENT 0x04 /* property cannot be deleted */ +#define JSPD_ALIAS 0x08 /* property has an alias id */ +#define JSPD_EXCEPTION 0x40 /* exception occurred fetching the property, */ + /* value is exception */ +#define JSPD_ERROR 0x80 /* native getter returned false without */ + /* throwing an exception */ + +typedef struct JSPropertyDescArray { + uint32_t length; /* number of elements in array */ + JSPropertyDesc *array; /* alloc'd by Get, freed by Put */ +} JSPropertyDescArray; + +typedef struct JSScopeProperty JSScopeProperty; + +extern JS_PUBLIC_API(bool) +JS_GetPropertyDescArray(JSContext *cx, JS::HandleObject obj, JSPropertyDescArray *pda); + +extern JS_PUBLIC_API(void) +JS_PutPropertyDescArray(JSContext *cx, JSPropertyDescArray *pda); + +/************************************************************************/ + +/* + * JSAbstractFramePtr is the public version of AbstractFramePtr, a pointer to a + * StackFrame or baseline JIT frame. + */ +class JS_PUBLIC_API(JSAbstractFramePtr) +{ + uintptr_t ptr_; + jsbytecode *pc_; + + protected: + JSAbstractFramePtr() + : ptr_(0), pc_(nullptr) + { } + + public: + JSAbstractFramePtr(void *raw, jsbytecode *pc); + + uintptr_t raw() const { return ptr_; } + jsbytecode *pc() const { return pc_; } + + operator bool() const { return !!ptr_; } + + JSObject *scopeChain(JSContext *cx); + JSObject *callObject(JSContext *cx); + + JSFunction *maybeFun(); + JSScript *script(); + + bool getThisValue(JSContext *cx, JS::MutableHandleValue thisv); + + bool isDebuggerFrame(); + + bool evaluateInStackFrame(JSContext *cx, + const char *bytes, unsigned length, + const char *filename, unsigned lineno, + JS::MutableHandleValue rval); + + bool evaluateUCInStackFrame(JSContext *cx, + const jschar *chars, unsigned length, + const char *filename, unsigned lineno, + JS::MutableHandleValue rval); +}; + +class JS_PUBLIC_API(JSNullFramePtr) : public JSAbstractFramePtr +{ + public: + JSNullFramePtr() + : JSAbstractFramePtr() + {} +}; + +/* + * This class does not work when IonMonkey is active. It's only used by jsd, + * which can only be used when IonMonkey is disabled. + * + * To find the calling script and line number, use JS_DescribeSciptedCaller. + * To summarize the call stack, use JS::DescribeStack. + */ +class JS_PUBLIC_API(JSBrokenFrameIterator) +{ + void *data_; + + public: + explicit JSBrokenFrameIterator(JSContext *cx); + ~JSBrokenFrameIterator(); + + bool done() const; + JSBrokenFrameIterator& operator++(); + + JSAbstractFramePtr abstractFramePtr() const; + jsbytecode *pc() const; + + bool isConstructing() const; +}; + +typedef bool +(* JSDebugErrorHook)(JSContext *cx, const char *message, JSErrorReport *report, + void *closure); + +typedef struct JSDebugHooks { + JSDebuggerHandler debuggerHandler; + void *debuggerHandlerData; +} JSDebugHooks; + +/************************************************************************/ + +extern JS_PUBLIC_API(bool) +JS_SetDebuggerHandler(JSRuntime *rt, JSDebuggerHandler hook, void *closure); + +/************************************************************************/ + +extern JS_PUBLIC_API(const JSDebugHooks *) +JS_GetGlobalDebugHooks(JSRuntime *rt); + +/** + * Add various profiling-related functions as properties of the given object. + */ +extern JS_PUBLIC_API(bool) +JS_DefineProfilingFunctions(JSContext *cx, JSObject *obj); + +/* Defined in vm/Debugger.cpp. */ +extern JS_PUBLIC_API(bool) +JS_DefineDebuggerObject(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(void) +JS_DumpPCCounts(JSContext *cx, JS::HandleScript script); + +extern JS_PUBLIC_API(void) +JS_DumpCompartmentPCCounts(JSContext *cx); + +namespace js { +extern JS_FRIEND_API(bool) +CanCallContextDebugHandler(JSContext *cx); +} + +/* Call the context debug handler on the topmost scripted frame. */ +extern JS_FRIEND_API(bool) +js_CallContextDebugHandler(JSContext *cx); + +#endif /* js_OldDebugAPI_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Principals.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Principals.h new file mode 100644 index 0000000000..78d8c7e893 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Principals.h @@ -0,0 +1,100 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* JSPrincipals and related interfaces. */ + +#ifndef js_Principals_h +#define js_Principals_h + +#include "mozilla/Atomics.h" + +#include + +#include "jspubtd.h" + +struct JSPrincipals { + /* Don't call "destroy"; use reference counting macros below. */ +#ifdef JS_THREADSAFE + mozilla::Atomic refcount; +#else + int32_t refcount; +#endif + +#ifdef JS_DEBUG + /* A helper to facilitate principals debugging. */ + uint32_t debugToken; +#endif + + void setDebugToken(uint32_t token) { +# ifdef JS_DEBUG + debugToken = token; +# endif + } + + /* + * This is not defined by the JS engine but should be provided by the + * embedding. + */ + JS_PUBLIC_API(void) dump(); +}; + +extern JS_PUBLIC_API(void) +JS_HoldPrincipals(JSPrincipals *principals); + +extern JS_PUBLIC_API(void) +JS_DropPrincipals(JSRuntime *rt, JSPrincipals *principals); + +// Return whether the first principal subsumes the second. The exact meaning of +// 'subsumes' is left up to the browser. Subsumption is checked inside the JS +// engine when determining, e.g., which stack frames to display in a backtrace. +typedef bool +(* JSSubsumesOp)(JSPrincipals *first, JSPrincipals *second); + +/* + * Used to check if a CSP instance wants to disable eval() and friends. + * See js_CheckCSPPermitsJSAction() in jsobj. + */ +typedef bool +(* JSCSPEvalChecker)(JSContext *cx); + +struct JSSecurityCallbacks { + JSCSPEvalChecker contentSecurityPolicyAllows; + JSSubsumesOp subsumes; +}; + +extern JS_PUBLIC_API(void) +JS_SetSecurityCallbacks(JSRuntime *rt, const JSSecurityCallbacks *callbacks); + +extern JS_PUBLIC_API(const JSSecurityCallbacks *) +JS_GetSecurityCallbacks(JSRuntime *rt); + +/* + * Code running with "trusted" principals will be given a deeper stack + * allocation than ordinary scripts. This allows trusted script to run after + * untrusted script has exhausted the stack. This function sets the + * runtime-wide trusted principal. + * + * This principals is not held (via JS_HoldPrincipals/JS_DropPrincipals) since + * there is no available JSContext. Instead, the caller must ensure that the + * given principals stays valid for as long as 'rt' may point to it. If the + * principals would be destroyed before 'rt', JS_SetTrustedPrincipals must be + * called again, passing nullptr for 'prin'. + */ +extern JS_PUBLIC_API(void) +JS_SetTrustedPrincipals(JSRuntime *rt, const JSPrincipals *prin); + +typedef void +(* JSDestroyPrincipalsOp)(JSPrincipals *principals); + +/* + * Initialize the callback that is called to destroy JSPrincipals instance + * when its reference counter drops to zero. The initialization can be done + * only once per JS runtime. + */ +extern JS_PUBLIC_API(void) +JS_InitDestroyPrincipalsCallback(JSRuntime *rt, JSDestroyPrincipalsOp destroyPrincipals); + +#endif /* js_Principals_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/ProfilingStack.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/ProfilingStack.h new file mode 100644 index 0000000000..e82ce1c9d8 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/ProfilingStack.h @@ -0,0 +1,169 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_ProfilingStack_h +#define js_ProfilingStack_h + +#include "mozilla/NullPtr.h" +#include "mozilla/TypedEnum.h" + +#include "jsbytecode.h" +#include "jstypes.h" + +#include "js/Utility.h" + +struct JSRuntime; + +namespace js { + +// A call stack can be specified to the JS engine such that all JS entry/exits +// to functions push/pop an entry to/from the specified stack. +// +// For more detailed information, see vm/SPSProfiler.h. +// +class ProfileEntry +{ + // All fields are marked volatile to prevent the compiler from re-ordering + // instructions. Namely this sequence: + // + // entry[size] = ...; + // size++; + // + // If the size modification were somehow reordered before the stores, then + // if a sample were taken it would be examining bogus information. + // + // A ProfileEntry represents both a C++ profile entry and a JS one. + + // Descriptive string of this entry. + const char * volatile string; + + // Stack pointer for non-JS entries, the script pointer otherwise. + void * volatile spOrScript; + + // Line number for non-JS entries, the bytecode offset otherwise. + int32_t volatile lineOrPc; + + // General purpose storage describing this frame. + uint32_t volatile flags_; + + public: + // These traits are bit masks. Make sure they're powers of 2. + enum Flags { + // Indicate whether a profile entry represents a CPP frame. If not set, + // a JS frame is assumed by default. You're not allowed to publicly + // change the frame type. Instead, call `setJsFrame` or `setCppFrame`. + IS_CPP_ENTRY = 0x01, + + // Indicate that copying the frame label is not necessary when taking a + // sample of the pseudostack. + FRAME_LABEL_COPY = 0x02, + + // Mask for removing all flags except the category information. + CATEGORY_MASK = ~IS_CPP_ENTRY & ~FRAME_LABEL_COPY + }; + + MOZ_BEGIN_NESTED_ENUM_CLASS(Category, uint32_t) + OTHER = 0x04, + CSS = 0x08, + JS = 0x10, + GC = 0x20, + CC = 0x40, + NETWORK = 0x80, + GRAPHICS = 0x100, + STORAGE = 0x200, + EVENTS = 0x400, + + FIRST = OTHER, + LAST = EVENTS + MOZ_END_NESTED_ENUM_CLASS(Category) + + // All of these methods are marked with the 'volatile' keyword because SPS's + // representation of the stack is stored such that all ProfileEntry + // instances are volatile. These methods would not be available unless they + // were marked as volatile as well. + + bool isCpp() const volatile { return hasFlag(IS_CPP_ENTRY); } + bool isJs() const volatile { return !isCpp(); } + + bool isCopyLabel() const volatile { return hasFlag(FRAME_LABEL_COPY); }; + + void setLabel(const char *aString) volatile { string = aString; } + const char *label() const volatile { return string; } + + void setJsFrame(JSScript *aScript, jsbytecode *aPc) volatile { + flags_ = 0; + spOrScript = aScript; + setPC(aPc); + } + void setCppFrame(void *aSp, uint32_t aLine) volatile { + flags_ = IS_CPP_ENTRY; + spOrScript = aSp; + lineOrPc = static_cast(aLine); + } + + void setFlag(uint32_t flag) volatile { + MOZ_ASSERT(flag != IS_CPP_ENTRY); + flags_ |= flag; + } + void unsetFlag(uint32_t flag) volatile { + MOZ_ASSERT(flag != IS_CPP_ENTRY); + flags_ &= ~flag; + } + bool hasFlag(uint32_t flag) const volatile { + return bool(flags_ & flag); + } + + uint32_t flags() const volatile { + return flags_; + } + uint32_t category() const volatile { + return flags_ & CATEGORY_MASK; + } + + void *stackAddress() const volatile { + MOZ_ASSERT(!isJs()); + return spOrScript; + } + JSScript *script() const volatile { + MOZ_ASSERT(isJs()); + return (JSScript *)spOrScript; + } + uint32_t line() const volatile { + MOZ_ASSERT(!isJs()); + return static_cast(lineOrPc); + } + + // We can't know the layout of JSScript, so look in vm/SPSProfiler.cpp. + JS_FRIEND_API(jsbytecode *) pc() const volatile; + JS_FRIEND_API(void) setPC(jsbytecode *pc) volatile; + + // The offset of a pc into a script's code can actually be 0, so to + // signify a nullptr pc, use a -1 index. This is checked against in + // pc() and setPC() to set/get the right pc. + static const int32_t NullPCOffset = -1; + + static size_t offsetOfLabel() { return offsetof(ProfileEntry, string); } + static size_t offsetOfSpOrScript() { return offsetof(ProfileEntry, spOrScript); } + static size_t offsetOfLineOrPc() { return offsetof(ProfileEntry, lineOrPc); } + static size_t offsetOfFlags() { return offsetof(ProfileEntry, flags_); } +}; + +JS_FRIEND_API(void) +SetRuntimeProfilingStack(JSRuntime *rt, ProfileEntry *stack, uint32_t *size, + uint32_t max); + +JS_FRIEND_API(void) +EnableRuntimeProfilingStack(JSRuntime *rt, bool enabled); + +JS_FRIEND_API(void) +RegisterRuntimeProfilingEventMarker(JSRuntime *rt, void (*fn)(const char *)); + +JS_FRIEND_API(jsbytecode*) +ProfilingGetPC(JSRuntime *rt, JSScript *script, void *ip); + +} // namespace js + +#endif /* js_ProfilingStack_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/PropertyKey.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/PropertyKey.h new file mode 100644 index 0000000000..1f90653b40 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/PropertyKey.h @@ -0,0 +1,95 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* JS::PropertyKey implementation. */ + +#ifndef js_PropertyKey_h +#define js_PropertyKey_h + +#include "js/TypeDecls.h" +#include "js/Value.h" + +namespace JS { + +class PropertyKey; + +namespace detail { + +extern JS_PUBLIC_API(bool) +ToPropertyKeySlow(JSContext *cx, HandleValue v, PropertyKey *key); + +} // namespace detail + +/* + * A PropertyKey is a key used to access some property on an object. It is a + * natural way to represent a property accessed using a JavaScript value. + * + * PropertyKey can represent indexes, named properties, and ES6 symbols. The + * latter aren't implemented in SpiderMonkey yet, but PropertyKey carves out + * space for them. + */ +class PropertyKey +{ + Value v; + friend JS_PUBLIC_API(bool) detail::ToPropertyKeySlow(JSContext *cx, HandleValue v, PropertyKey *key); + + public: + explicit PropertyKey(uint32_t index) : v(PrivateUint32Value(index)) {} + + /* + * An index is a string property name whose characters exactly spell out an + * unsigned 32-bit integer in decimal: "0", "1", "2", ...., "4294967294", + * "4294967295". + */ + bool isIndex(uint32_t *index) { + // The implementation here assumes that private uint32_t are stored + // using the int32_t representation. This is purely an implementation + // detail: embedders must not rely upon this! + if (!v.isInt32()) + return false; + *index = v.toPrivateUint32(); + return true; + } + + /* + * A name is a string property name which is *not* an index. Note that by + * the ECMAScript language grammar, any dotted property access |obj.prop| + * will access a named property. + */ + bool isName(JSString **str) { + uint32_t dummy; + if (isIndex(&dummy)) + return false; + *str = v.toString(); + return true; + } + + /* + * A symbol is a property name that's a Symbol, a particular kind of object + * in ES6. It is the only kind of property name that's not a string. + * + * SpiderMonkey doesn't yet implement symbols, but we're carving out API + * space for them in advance. + */ + bool isSymbol() { + return false; + } +}; + +inline bool +ToPropertyKey(JSContext *cx, HandleValue v, PropertyKey *key) +{ + if (v.isInt32() && v.toInt32() >= 0) { + *key = PropertyKey(uint32_t(v.toInt32())); + return true; + } + + return detail::ToPropertyKeySlow(cx, v, key); +} + +} // namespace JS + +#endif /* js_PropertyKey_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/RequiredDefines.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/RequiredDefines.h new file mode 100644 index 0000000000..308fd7d625 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/RequiredDefines.h @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Various #defines required to build SpiderMonkey. Embedders should add this + * file to the start of the command line via -include or a similar mechanism, + * or SpiderMonkey public headers may not work correctly. + */ + +#ifndef js_RequiredDefines_h +#define js_RequiredDefines_h + +/* + * The c99 defining the limit macros (UINT32_MAX for example), says: + * + * C++ implementations should define these macros only when + * __STDC_LIMIT_MACROS is defined before is included. + * + * The same also occurs with __STDC_CONSTANT_MACROS for the constant macros + * (INT8_C for example) used to specify a literal constant of the proper type, + * and with __STDC_FORMAT_MACROS for the format macros (PRId32 for example) used + * with the fprintf function family. + */ +#define __STDC_LIMIT_MACROS +#define __STDC_CONSTANT_MACROS +#define __STDC_FORMAT_MACROS + +/* Also define a char16_t type if not provided by the compiler. */ +#include "mozilla/Char16.h" + +#endif /* js_RequiredDefines_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/RootingAPI.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/RootingAPI.h new file mode 100644 index 0000000000..621a1e4394 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/RootingAPI.h @@ -0,0 +1,1253 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_RootingAPI_h +#define js_RootingAPI_h + +#include "mozilla/Attributes.h" +#include "mozilla/GuardObjects.h" +#include "mozilla/LinkedList.h" +#include "mozilla/NullPtr.h" +#include "mozilla/TypeTraits.h" + +#include "jspubtd.h" + +#include "js/GCAPI.h" +#include "js/HeapAPI.h" +#include "js/TypeDecls.h" +#include "js/Utility.h" + +/* + * Moving GC Stack Rooting + * + * A moving GC may change the physical location of GC allocated things, even + * when they are rooted, updating all pointers to the thing to refer to its new + * location. The GC must therefore know about all live pointers to a thing, + * not just one of them, in order to behave correctly. + * + * The |Rooted| and |Handle| classes below are used to root stack locations + * whose value may be held live across a call that can trigger GC. For a + * code fragment such as: + * + * JSObject *obj = NewObject(cx); + * DoSomething(cx); + * ... = obj->lastProperty(); + * + * If |DoSomething()| can trigger a GC, the stack location of |obj| must be + * rooted to ensure that the GC does not move the JSObject referred to by + * |obj| without updating |obj|'s location itself. This rooting must happen + * regardless of whether there are other roots which ensure that the object + * itself will not be collected. + * + * If |DoSomething()| cannot trigger a GC, and the same holds for all other + * calls made between |obj|'s definitions and its last uses, then no rooting + * is required. + * + * SpiderMonkey can trigger a GC at almost any time and in ways that are not + * always clear. For example, the following innocuous-looking actions can + * cause a GC: allocation of any new GC thing; JSObject::hasProperty; + * JS_ReportError and friends; and ToNumber, among many others. The following + * dangerous-looking actions cannot trigger a GC: js_malloc, cx->malloc_, + * rt->malloc_, and friends and JS_ReportOutOfMemory. + * + * The following family of three classes will exactly root a stack location. + * Incorrect usage of these classes will result in a compile error in almost + * all cases. Therefore, it is very hard to be incorrectly rooted if you use + * these classes exclusively. These classes are all templated on the type T of + * the value being rooted. + * + * - Rooted declares a variable of type T, whose value is always rooted. + * Rooted may be automatically coerced to a Handle, below. Rooted + * should be used whenever a local variable's value may be held live across a + * call which can trigger a GC. + * + * - Handle is a const reference to a Rooted. Functions which take GC + * things or values as arguments and need to root those arguments should + * generally use handles for those arguments and avoid any explicit rooting. + * This has two benefits. First, when several such functions call each other + * then redundant rooting of multiple copies of the GC thing can be avoided. + * Second, if the caller does not pass a rooted value a compile error will be + * generated, which is quicker and easier to fix than when relying on a + * separate rooting analysis. + * + * - MutableHandle is a non-const reference to Rooted. It is used in the + * same way as Handle and includes a |set(const T &v)| method to allow + * updating the value of the referenced Rooted. A MutableHandle can be + * created from a Rooted by using |Rooted::operator&()|. + * + * In some cases the small performance overhead of exact rooting (measured to + * be a few nanoseconds on desktop) is too much. In these cases, try the + * following: + * + * - Move all Rooted above inner loops: this allows you to re-use the root + * on each iteration of the loop. + * + * - Pass Handle through your hot call stack to avoid re-rooting costs at + * every invocation. + * + * The following diagram explains the list of supported, implicit type + * conversions between classes of this family: + * + * Rooted ----> Handle + * | ^ + * | | + * | | + * +---> MutableHandle + * (via &) + * + * All of these types have an implicit conversion to raw pointers. + */ + +namespace js { + +class ScriptSourceObject; + +template +struct GCMethods {}; + +template +class RootedBase {}; + +template +class HandleBase {}; + +template +class MutableHandleBase {}; + +template +class HeapBase {}; + +/* + * js::NullPtr acts like a nullptr pointer in contexts that require a Handle. + * + * Handle provides an implicit constructor for js::NullPtr so that, given: + * foo(Handle h); + * callers can simply write: + * foo(js::NullPtr()); + * which avoids creating a Rooted just to pass nullptr. + * + * This is the SpiderMonkey internal variant. js::NullPtr should be used in + * preference to JS::NullPtr to avoid the GOT access required for JS_PUBLIC_API + * symbols. + */ +struct NullPtr +{ + static void * const constNullValue; +}; + +namespace gc { +struct Cell; +template +struct PersistentRootedMarker; +} /* namespace gc */ + +} /* namespace js */ + +namespace JS { + +template class Rooted; +template class PersistentRooted; + +/* This is exposing internal state of the GC for inlining purposes. */ +JS_FRIEND_API(bool) isGCEnabled(); + +/* + * JS::NullPtr acts like a nullptr pointer in contexts that require a Handle. + * + * Handle provides an implicit constructor for JS::NullPtr so that, given: + * foo(Handle h); + * callers can simply write: + * foo(JS::NullPtr()); + * which avoids creating a Rooted just to pass nullptr. + */ +struct JS_PUBLIC_API(NullPtr) +{ + static void * const constNullValue; +}; + +/* + * The Heap class is a heap-stored reference to a JS GC thing. All members of + * heap classes that refer to GC things should use Heap (or possibly + * TenuredHeap, described below). + * + * Heap is an abstraction that hides some of the complexity required to + * maintain GC invariants for the contained reference. It uses operator + * overloading to provide a normal pointer interface, but notifies the GC every + * time the value it contains is updated. This is necessary for generational GC, + * which keeps track of all pointers into the nursery. + * + * Heap instances must be traced when their containing object is traced to + * keep the pointed-to GC thing alive. + * + * Heap objects should only be used on the heap. GC references stored on the + * C/C++ stack must use Rooted/Handle/MutableHandle instead. + * + * Type T must be one of: JS::Value, jsid, JSObject*, JSString*, JSScript* + */ +template +class Heap : public js::HeapBase +{ + public: + Heap() { + static_assert(sizeof(T) == sizeof(Heap), + "Heap must be binary compatible with T."); + init(js::GCMethods::initial()); + } + explicit Heap(T p) { init(p); } + + /* + * For Heap, move semantics are equivalent to copy semantics. In C++, a + * copy constructor taking const-ref is the way to get a single function + * that will be used for both lvalue and rvalue copies, so we can simply + * omit the rvalue variant. + */ + explicit Heap(const Heap &p) { init(p.ptr); } + + ~Heap() { + if (js::GCMethods::needsPostBarrier(ptr)) + relocate(); + } + + bool operator==(const Heap &other) { return ptr == other.ptr; } + bool operator!=(const Heap &other) { return ptr != other.ptr; } + + bool operator==(const T &other) const { return ptr == other; } + bool operator!=(const T &other) const { return ptr != other; } + + operator T() const { return ptr; } + T operator->() const { return ptr; } + const T *address() const { return &ptr; } + const T &get() const { return ptr; } + + T *unsafeGet() { return &ptr; } + + Heap &operator=(T p) { + set(p); + return *this; + } + + Heap &operator=(const Heap& other) { + set(other.get()); + return *this; + } + + void set(T newPtr) { + MOZ_ASSERT(!js::GCMethods::poisoned(newPtr)); + if (js::GCMethods::needsPostBarrier(newPtr)) { + ptr = newPtr; + post(); + } else if (js::GCMethods::needsPostBarrier(ptr)) { + relocate(); /* Called before overwriting ptr. */ + ptr = newPtr; + } else { + ptr = newPtr; + } + } + + /* + * Set the pointer to a value which will cause a crash if it is + * dereferenced. + */ + void setToCrashOnTouch() { + ptr = reinterpret_cast(crashOnTouchPointer); + } + + bool isSetToCrashOnTouch() { + return ptr == crashOnTouchPointer; + } + + private: + void init(T newPtr) { + MOZ_ASSERT(!js::GCMethods::poisoned(newPtr)); + ptr = newPtr; + if (js::GCMethods::needsPostBarrier(ptr)) + post(); + } + + void post() { +#ifdef JSGC_GENERATIONAL + MOZ_ASSERT(js::GCMethods::needsPostBarrier(ptr)); + js::GCMethods::postBarrier(&ptr); +#endif + } + + void relocate() { +#ifdef JSGC_GENERATIONAL + js::GCMethods::relocate(&ptr); +#endif + } + + enum { + crashOnTouchPointer = 1 + }; + + T ptr; +}; + +#ifdef JS_DEBUG +/* + * For generational GC, assert that an object is in the tenured generation as + * opposed to being in the nursery. + */ +extern JS_FRIEND_API(void) +AssertGCThingMustBeTenured(JSObject* obj); +#else +inline void +AssertGCThingMustBeTenured(JSObject *obj) {} +#endif + +/* + * The TenuredHeap class is similar to the Heap class above in that it + * encapsulates the GC concerns of an on-heap reference to a JS object. However, + * it has two important differences: + * + * 1) Pointers which are statically known to only reference "tenured" objects + * can avoid the extra overhead of SpiderMonkey's write barriers. + * + * 2) Objects in the "tenured" heap have stronger alignment restrictions than + * those in the "nursery", so it is possible to store flags in the lower + * bits of pointers known to be tenured. TenuredHeap wraps a normal tagged + * pointer with a nice API for accessing the flag bits and adds various + * assertions to ensure that it is not mis-used. + * + * GC things are said to be "tenured" when they are located in the long-lived + * heap: e.g. they have gained tenure as an object by surviving past at least + * one GC. For performance, SpiderMonkey allocates some things which are known + * to normally be long lived directly into the tenured generation; for example, + * global objects. Additionally, SpiderMonkey does not visit individual objects + * when deleting non-tenured objects, so object with finalizers are also always + * tenured; for instance, this includes most DOM objects. + * + * The considerations to keep in mind when using a TenuredHeap vs a normal + * Heap are: + * + * - It is invalid for a TenuredHeap to refer to a non-tenured thing. + * - It is however valid for a Heap to refer to a tenured thing. + * - It is not possible to store flag bits in a Heap. + */ +template +class TenuredHeap : public js::HeapBase +{ + public: + TenuredHeap() : bits(0) { + static_assert(sizeof(T) == sizeof(TenuredHeap), + "TenuredHeap must be binary compatible with T."); + } + explicit TenuredHeap(T p) : bits(0) { setPtr(p); } + explicit TenuredHeap(const TenuredHeap &p) : bits(0) { setPtr(p.getPtr()); } + + bool operator==(const TenuredHeap &other) { return bits == other.bits; } + bool operator!=(const TenuredHeap &other) { return bits != other.bits; } + + void setPtr(T newPtr) { + MOZ_ASSERT((reinterpret_cast(newPtr) & flagsMask) == 0); + MOZ_ASSERT(!js::GCMethods::poisoned(newPtr)); + if (newPtr) + AssertGCThingMustBeTenured(newPtr); + bits = (bits & flagsMask) | reinterpret_cast(newPtr); + } + + void setFlags(uintptr_t flagsToSet) { + MOZ_ASSERT((flagsToSet & ~flagsMask) == 0); + bits |= flagsToSet; + } + + void unsetFlags(uintptr_t flagsToUnset) { + MOZ_ASSERT((flagsToUnset & ~flagsMask) == 0); + bits &= ~flagsToUnset; + } + + bool hasFlag(uintptr_t flag) const { + MOZ_ASSERT((flag & ~flagsMask) == 0); + return (bits & flag) != 0; + } + + T getPtr() const { return reinterpret_cast(bits & ~flagsMask); } + uintptr_t getFlags() const { return bits & flagsMask; } + + operator T() const { return getPtr(); } + T operator->() const { return getPtr(); } + + TenuredHeap &operator=(T p) { + setPtr(p); + return *this; + } + + TenuredHeap &operator=(const TenuredHeap& other) { + bits = other.bits; + return *this; + } + + private: + enum { + maskBits = 3, + flagsMask = (1 << maskBits) - 1, + }; + + uintptr_t bits; +}; + +/* + * Reference to a T that has been rooted elsewhere. This is most useful + * as a parameter type, which guarantees that the T lvalue is properly + * rooted. See "Move GC Stack Rooting" above. + * + * If you want to add additional methods to Handle for a specific + * specialization, define a HandleBase specialization containing them. + */ +template +class MOZ_NONHEAP_CLASS Handle : public js::HandleBase +{ + friend class JS::MutableHandle; + + public: + /* Creates a handle from a handle of a type convertible to T. */ + template + Handle(Handle handle, + typename mozilla::EnableIf::value, int>::Type dummy = 0) + { + static_assert(sizeof(Handle) == sizeof(T *), + "Handle must be binary compatible with T*."); + ptr = reinterpret_cast(handle.address()); + } + + /* Create a handle for a nullptr pointer. */ + MOZ_IMPLICIT Handle(js::NullPtr) { + static_assert(mozilla::IsPointer::value, + "js::NullPtr overload not valid for non-pointer types"); + ptr = reinterpret_cast(&js::NullPtr::constNullValue); + } + + /* Create a handle for a nullptr pointer. */ + MOZ_IMPLICIT Handle(JS::NullPtr) { + static_assert(mozilla::IsPointer::value, + "JS::NullPtr overload not valid for non-pointer types"); + ptr = reinterpret_cast(&JS::NullPtr::constNullValue); + } + + MOZ_IMPLICIT Handle(MutableHandle handle) { + ptr = handle.address(); + } + + /* + * Take care when calling this method! + * + * This creates a Handle from the raw location of a T. + * + * It should be called only if the following conditions hold: + * + * 1) the location of the T is guaranteed to be marked (for some reason + * other than being a Rooted), e.g., if it is guaranteed to be reachable + * from an implicit root. + * + * 2) the contents of the location are immutable, or at least cannot change + * for the lifetime of the handle, as its users may not expect its value + * to change underneath them. + */ + static MOZ_CONSTEXPR Handle fromMarkedLocation(const T *p) { + return Handle(p, DeliberatelyChoosingThisOverload, + ImUsingThisOnlyInFromFromMarkedLocation); + } + + /* + * Construct a handle from an explicitly rooted location. This is the + * normal way to create a handle, and normally happens implicitly. + */ + template + inline + Handle(const Rooted &root, + typename mozilla::EnableIf::value, int>::Type dummy = 0); + + template + inline + Handle(const PersistentRooted &root, + typename mozilla::EnableIf::value, int>::Type dummy = 0); + + /* Construct a read only handle from a mutable handle. */ + template + inline + Handle(MutableHandle &root, + typename mozilla::EnableIf::value, int>::Type dummy = 0); + + const T *address() const { return ptr; } + const T& get() const { return *ptr; } + + /* + * Return a reference so passing a Handle to something that + * takes a |const T&| is not a GC hazard. + */ + operator const T&() const { return get(); } + T operator->() const { return get(); } + + bool operator!=(const T &other) const { return *ptr != other; } + bool operator==(const T &other) const { return *ptr == other; } + + private: + Handle() {} + + enum Disambiguator { DeliberatelyChoosingThisOverload = 42 }; + enum CallerIdentity { ImUsingThisOnlyInFromFromMarkedLocation = 17 }; + MOZ_CONSTEXPR Handle(const T *p, Disambiguator, CallerIdentity) : ptr(p) {} + + const T *ptr; + + template void operator=(S) MOZ_DELETE; + void operator=(Handle) MOZ_DELETE; +}; + +/* + * Similar to a handle, but the underlying storage can be changed. This is + * useful for outparams. + * + * If you want to add additional methods to MutableHandle for a specific + * specialization, define a MutableHandleBase specialization containing + * them. + */ +template +class MOZ_STACK_CLASS MutableHandle : public js::MutableHandleBase +{ + public: + inline MOZ_IMPLICIT MutableHandle(Rooted *root); + inline MOZ_IMPLICIT MutableHandle(PersistentRooted *root); + + private: + // Disallow true nullptr and emulated nullptr (gcc 4.4/4.5, __null, appears + // as int/long [32/64-bit]) for overloading purposes. + template + MutableHandle(N, + typename mozilla::EnableIf::value || + mozilla::IsSame::value || + mozilla::IsSame::value, + int>::Type dummy = 0) + MOZ_DELETE; + + public: + void set(T v) { + MOZ_ASSERT(!js::GCMethods::poisoned(v)); + *ptr = v; + } + + /* + * This may be called only if the location of the T is guaranteed + * to be marked (for some reason other than being a Rooted), + * e.g., if it is guaranteed to be reachable from an implicit root. + * + * Create a MutableHandle from a raw location of a T. + */ + static MutableHandle fromMarkedLocation(T *p) { + MutableHandle h; + h.ptr = p; + return h; + } + + T *address() const { return ptr; } + const T& get() const { return *ptr; } + + /* + * Return a reference so passing a MutableHandle to something that takes + * a |const T&| is not a GC hazard. + */ + operator const T&() const { return get(); } + T operator->() const { return get(); } + + private: + MutableHandle() {} + + T *ptr; + + template void operator=(S v) MOZ_DELETE; + void operator=(MutableHandle other) MOZ_DELETE; +}; + +#ifdef JSGC_GENERATIONAL +JS_FRIEND_API(void) HeapCellPostBarrier(js::gc::Cell **cellp); +JS_FRIEND_API(void) HeapCellRelocate(js::gc::Cell **cellp); +#endif + +} /* namespace JS */ + +namespace js { + +/* + * InternalHandle is a handle to an internal pointer into a gcthing. Use + * InternalHandle when you have a pointer to a direct field of a gcthing, or + * when you need a parameter type for something that *may* be a pointer to a + * direct field of a gcthing. + */ +template +class InternalHandle {}; + +template +class InternalHandle +{ + void * const *holder; + size_t offset; + + public: + /* + * Create an InternalHandle using a Handle to the gcthing containing the + * field in question, and a pointer to the field. + */ + template + InternalHandle(const JS::Handle &handle, T *field) + : holder((void**)handle.address()), offset(uintptr_t(field) - uintptr_t(handle.get())) + {} + + /* + * Create an InternalHandle to a field within a Rooted<>. + */ + template + InternalHandle(const JS::Rooted &root, T *field) + : holder((void**)root.address()), offset(uintptr_t(field) - uintptr_t(root.get())) + {} + + InternalHandle(const InternalHandle& other) + : holder(other.holder), offset(other.offset) {} + + T *get() const { return reinterpret_cast(uintptr_t(*holder) + offset); } + + const T &operator*() const { return *get(); } + T *operator->() const { return get(); } + + static InternalHandle fromMarkedLocation(T *fieldPtr) { + return InternalHandle(fieldPtr); + } + + private: + /* + * Create an InternalHandle to something that is not a pointer to a + * gcthing, and so does not need to be rooted in the first place. Use these + * InternalHandles to pass pointers into functions that also need to accept + * regular InternalHandles to gcthing fields. + * + * Make this private to prevent accidental misuse; this is only for + * fromMarkedLocation(). + */ + explicit InternalHandle(T *field) + : holder(reinterpret_cast(&js::NullPtr::constNullValue)), + offset(uintptr_t(field)) + {} + + void operator=(InternalHandle other) MOZ_DELETE; +}; + +/* + * By default, things should use the inheritance hierarchy to find their + * ThingRootKind. Some pointer types are explicitly set in jspubtd.h so that + * Rooted may be used without the class definition being available. + */ +template +struct RootKind +{ + static ThingRootKind rootKind() { return T::rootKind(); } +}; + +template +struct RootKind +{ + static ThingRootKind rootKind() { return T::rootKind(); } +}; + +template +struct GCMethods +{ + static T *initial() { return nullptr; } + static bool poisoned(T *v) { return JS::IsPoisonedPtr(v); } + static bool needsPostBarrier(T *v) { return false; } +#ifdef JSGC_GENERATIONAL + static void postBarrier(T **vp) {} + static void relocate(T **vp) {} +#endif +}; + +template <> +struct GCMethods +{ + static JSObject *initial() { return nullptr; } + static bool poisoned(JSObject *v) { return JS::IsPoisonedPtr(v); } + static bool needsPostBarrier(JSObject *v) { + return v != nullptr && gc::IsInsideNursery(reinterpret_cast(v)); + } +#ifdef JSGC_GENERATIONAL + static void postBarrier(JSObject **vp) { + JS::HeapCellPostBarrier(reinterpret_cast(vp)); + } + static void relocate(JSObject **vp) { + JS::HeapCellRelocate(reinterpret_cast(vp)); + } +#endif +}; + +template <> +struct GCMethods +{ + static JSFunction *initial() { return nullptr; } + static bool poisoned(JSFunction *v) { return JS::IsPoisonedPtr(v); } + static bool needsPostBarrier(JSFunction *v) { + return v != nullptr && gc::IsInsideNursery(reinterpret_cast(v)); + } +#ifdef JSGC_GENERATIONAL + static void postBarrier(JSFunction **vp) { + JS::HeapCellPostBarrier(reinterpret_cast(vp)); + } + static void relocate(JSFunction **vp) { + JS::HeapCellRelocate(reinterpret_cast(vp)); + } +#endif +}; + +#ifdef JS_DEBUG +/* This helper allows us to assert that Rooted is scoped within a request. */ +extern JS_PUBLIC_API(bool) +IsInRequest(JSContext *cx); +#endif + +} /* namespace js */ + +namespace JS { + +/* + * Local variable of type T whose value is always rooted. This is typically + * used for local variables, or for non-rooted values being passed to a + * function that requires a handle, e.g. Foo(Root(cx, x)). + * + * If you want to add additional methods to Rooted for a specific + * specialization, define a RootedBase specialization containing them. + */ +template +class MOZ_STACK_CLASS Rooted : public js::RootedBase +{ + /* Note: CX is a subclass of either ContextFriendFields or PerThreadDataFriendFields. */ + template + void init(CX *cx) { +#ifdef JSGC_TRACK_EXACT_ROOTS + js::ThingRootKind kind = js::RootKind::rootKind(); + this->stack = &cx->thingGCRooters[kind]; + this->prev = *stack; + *stack = reinterpret_cast*>(this); + + MOZ_ASSERT(!js::GCMethods::poisoned(ptr)); +#endif + } + + public: + explicit Rooted(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(js::GCMethods::initial()) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; +#ifdef JS_DEBUG + MOZ_ASSERT(js::IsInRequest(cx)); +#endif + init(js::ContextFriendFields::get(cx)); + } + + Rooted(JSContext *cx, T initial + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(initial) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; +#ifdef JS_DEBUG + MOZ_ASSERT(js::IsInRequest(cx)); +#endif + init(js::ContextFriendFields::get(cx)); + } + + explicit Rooted(js::ContextFriendFields *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(js::GCMethods::initial()) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + init(cx); + } + + Rooted(js::ContextFriendFields *cx, T initial + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(initial) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + init(cx); + } + + explicit Rooted(js::PerThreadDataFriendFields *pt + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(js::GCMethods::initial()) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + init(pt); + } + + Rooted(js::PerThreadDataFriendFields *pt, T initial + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(initial) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + init(pt); + } + + explicit Rooted(JSRuntime *rt + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(js::GCMethods::initial()) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + init(js::PerThreadDataFriendFields::getMainThread(rt)); + } + + Rooted(JSRuntime *rt, T initial + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(initial) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + init(js::PerThreadDataFriendFields::getMainThread(rt)); + } + + // Note that we need to let the compiler generate the default destructor in + // non-exact-rooting builds because of a bug in the instrumented PGO builds + // using MSVC, see bug 915735 for more details. +#ifdef JSGC_TRACK_EXACT_ROOTS + ~Rooted() { + MOZ_ASSERT(*stack == reinterpret_cast*>(this)); + *stack = prev; + } +#endif + +#ifdef JSGC_TRACK_EXACT_ROOTS + Rooted *previous() { return reinterpret_cast*>(prev); } +#endif + + /* + * Important: Return a reference here so passing a Rooted to + * something that takes a |const T&| is not a GC hazard. + */ + operator const T&() const { return ptr; } + T operator->() const { return ptr; } + T *address() { return &ptr; } + const T *address() const { return &ptr; } + T &get() { return ptr; } + const T &get() const { return ptr; } + + T &operator=(T value) { + MOZ_ASSERT(!js::GCMethods::poisoned(value)); + ptr = value; + return ptr; + } + + T &operator=(const Rooted &value) { + ptr = value; + return ptr; + } + + void set(T value) { + MOZ_ASSERT(!js::GCMethods::poisoned(value)); + ptr = value; + } + + bool operator!=(const T &other) const { return ptr != other; } + bool operator==(const T &other) const { return ptr == other; } + + private: +#ifdef JSGC_TRACK_EXACT_ROOTS + /* + * These need to be templated on void* to avoid aliasing issues between, for + * example, Rooted and Rooted, which use the same + * stack head pointer for different classes. + */ + Rooted **stack, *prev; +#endif + + /* + * |ptr| must be the last field in Rooted because the analysis treats all + * Rooted as Rooted during the analysis. See bug 829372. + */ + T ptr; + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER + + Rooted(const Rooted &) MOZ_DELETE; +}; + +} /* namespace JS */ + +namespace js { + +/* + * Augment the generic Rooted interface when T = JSObject* with + * class-querying and downcasting operations. + * + * Given a Rooted obj, one can view + * Handle h = obj.as(); + * as an optimization of + * Rooted rooted(cx, &obj->as()); + * Handle h = rooted; + */ +template <> +class RootedBase +{ + public: + template + JS::Handle as() const; +}; + +/* Interface substitute for Rooted which does not root the variable's memory. */ +template +class FakeRooted : public RootedBase +{ + public: + template + FakeRooted(CX *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(GCMethods::initial()) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + template + FakeRooted(CX *cx, T initial + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : ptr(initial) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + operator T() const { return ptr; } + T operator->() const { return ptr; } + T *address() { return &ptr; } + const T *address() const { return &ptr; } + T &get() { return ptr; } + const T &get() const { return ptr; } + + FakeRooted &operator=(T value) { + MOZ_ASSERT(!GCMethods::poisoned(value)); + ptr = value; + return *this; + } + + FakeRooted &operator=(const FakeRooted &other) { + MOZ_ASSERT(!GCMethods::poisoned(other.ptr)); + ptr = other.ptr; + return *this; + } + + bool operator!=(const T &other) const { return ptr != other; } + bool operator==(const T &other) const { return ptr == other; } + + private: + T ptr; + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER + + FakeRooted(const FakeRooted &) MOZ_DELETE; +}; + +/* Interface substitute for MutableHandle which is not required to point to rooted memory. */ +template +class FakeMutableHandle : public js::MutableHandleBase +{ + public: + MOZ_IMPLICIT FakeMutableHandle(T *t) { + ptr = t; + } + + MOZ_IMPLICIT FakeMutableHandle(FakeRooted *root) { + ptr = root->address(); + } + + void set(T v) { + MOZ_ASSERT(!js::GCMethods::poisoned(v)); + *ptr = v; + } + + T *address() const { return ptr; } + T get() const { return *ptr; } + + operator T() const { return get(); } + T operator->() const { return get(); } + + private: + FakeMutableHandle() {} + + T *ptr; + + template + void operator=(S v) MOZ_DELETE; + + void operator=(const FakeMutableHandle& other) MOZ_DELETE; +}; + +/* + * Types for a variable that either should or shouldn't be rooted, depending on + * the template parameter allowGC. Used for implementing functions that can + * operate on either rooted or unrooted data. + * + * The toHandle() and toMutableHandle() functions are for calling functions + * which require handle types and are only called in the CanGC case. These + * allow the calling code to type check. + */ +enum AllowGC { + NoGC = 0, + CanGC = 1 +}; +template +class MaybeRooted +{ +}; + +template class MaybeRooted +{ + public: + typedef JS::Handle HandleType; + typedef JS::Rooted RootType; + typedef JS::MutableHandle MutableHandleType; + + static inline JS::Handle toHandle(HandleType v) { + return v; + } + + static inline JS::MutableHandle toMutableHandle(MutableHandleType v) { + return v; + } +}; + +template class MaybeRooted +{ + public: + typedef T HandleType; + typedef FakeRooted RootType; + typedef FakeMutableHandle MutableHandleType; + + static JS::Handle toHandle(HandleType v) { + MOZ_CRASH("Bad conversion"); + } + + static JS::MutableHandle toMutableHandle(MutableHandleType v) { + MOZ_CRASH("Bad conversion"); + } +}; + +} /* namespace js */ + +namespace JS { + +template template +inline +Handle::Handle(const Rooted &root, + typename mozilla::EnableIf::value, int>::Type dummy) +{ + ptr = reinterpret_cast(root.address()); +} + +template template +inline +Handle::Handle(const PersistentRooted &root, + typename mozilla::EnableIf::value, int>::Type dummy) +{ + ptr = reinterpret_cast(root.address()); +} + +template template +inline +Handle::Handle(MutableHandle &root, + typename mozilla::EnableIf::value, int>::Type dummy) +{ + ptr = reinterpret_cast(root.address()); +} + +template +inline +MutableHandle::MutableHandle(Rooted *root) +{ + static_assert(sizeof(MutableHandle) == sizeof(T *), + "MutableHandle must be binary compatible with T*."); + ptr = root->address(); +} + +template +inline +MutableHandle::MutableHandle(PersistentRooted *root) +{ + static_assert(sizeof(MutableHandle) == sizeof(T *), + "MutableHandle must be binary compatible with T*."); + ptr = root->address(); +} + +/* + * A copyable, assignable global GC root type with arbitrary lifetime, an + * infallible constructor, and automatic unrooting on destruction. + * + * These roots can be used in heap-allocated data structures, so they are not + * associated with any particular JSContext or stack. They are registered with + * the JSRuntime itself, without locking, so they require a full JSContext to be + * constructed, not one of its more restricted superclasses. + * + * Note that you must not use an PersistentRooted in an object owned by a JS + * object: + * + * Whenever one object whose lifetime is decided by the GC refers to another + * such object, that edge must be traced only if the owning JS object is traced. + * This applies not only to JS objects (which obviously are managed by the GC) + * but also to C++ objects owned by JS objects. + * + * If you put a PersistentRooted in such a C++ object, that is almost certainly + * a leak. When a GC begins, the referent of the PersistentRooted is treated as + * live, unconditionally (because a PersistentRooted is a *root*), even if the + * JS object that owns it is unreachable. If there is any path from that + * referent back to the JS object, then the C++ object containing the + * PersistentRooted will not be destructed, and the whole blob of objects will + * not be freed, even if there are no references to them from the outside. + * + * In the context of Firefox, this is a severe restriction: almost everything in + * Firefox is owned by some JS object or another, so using PersistentRooted in + * such objects would introduce leaks. For these kinds of edges, Heap or + * TenuredHeap would be better types. It's up to the implementor of the type + * containing Heap or TenuredHeap members to make sure their referents get + * marked when the object itself is marked. + */ +template +class PersistentRooted : private mozilla::LinkedListElement > { + friend class mozilla::LinkedList; + friend class mozilla::LinkedListElement; + + friend struct js::gc::PersistentRootedMarker; + + void registerWithRuntime(JSRuntime *rt) { + JS::shadow::Runtime *srt = JS::shadow::Runtime::asShadowRuntime(rt); + srt->getPersistentRootedList().insertBack(this); + } + + public: + explicit PersistentRooted(JSContext *cx) : ptr(js::GCMethods::initial()) + { + registerWithRuntime(js::GetRuntime(cx)); + } + + PersistentRooted(JSContext *cx, T initial) : ptr(initial) + { + registerWithRuntime(js::GetRuntime(cx)); + } + + explicit PersistentRooted(JSRuntime *rt) : ptr(js::GCMethods::initial()) + { + registerWithRuntime(rt); + } + + PersistentRooted(JSRuntime *rt, T initial) : ptr(initial) + { + registerWithRuntime(rt); + } + + PersistentRooted(const PersistentRooted &rhs) + : mozilla::LinkedListElement >(), + ptr(rhs.ptr) + { + /* + * Copy construction takes advantage of the fact that the original + * is already inserted, and simply adds itself to whatever list the + * original was on - no JSRuntime pointer needed. + * + * This requires mutating rhs's links, but those should be 'mutable' + * anyway. C++ doesn't let us declare mutable base classes. + */ + const_cast(rhs).setNext(this); + } + + /* + * Important: Return a reference here so passing a Rooted to + * something that takes a |const T&| is not a GC hazard. + */ + operator const T&() const { return ptr; } + T operator->() const { return ptr; } + T *address() { return &ptr; } + const T *address() const { return &ptr; } + T &get() { return ptr; } + const T &get() const { return ptr; } + + T &operator=(T value) { + MOZ_ASSERT(!js::GCMethods::poisoned(value)); + ptr = value; + return ptr; + } + + T &operator=(const PersistentRooted &value) { + ptr = value; + return ptr; + } + + void set(T value) { + MOZ_ASSERT(!js::GCMethods::poisoned(value)); + ptr = value; + } + + bool operator!=(const T &other) const { return ptr != other; } + bool operator==(const T &other) const { return ptr == other; } + + private: + T ptr; +}; + +class JS_PUBLIC_API(ObjectPtr) +{ + Heap value; + + public: + ObjectPtr() : value(nullptr) {} + + explicit ObjectPtr(JSObject *obj) : value(obj) {} + + /* Always call finalize before the destructor. */ + ~ObjectPtr() { MOZ_ASSERT(!value); } + + void finalize(JSRuntime *rt) { + if (IsIncrementalBarrierNeeded(rt)) + IncrementalObjectBarrier(value); + value = nullptr; + } + + void init(JSObject *obj) { value = obj; } + + JSObject *get() const { return value; } + + void writeBarrierPre(JSRuntime *rt) { + IncrementalObjectBarrier(value); + } + + bool isAboutToBeFinalized(); + + ObjectPtr &operator=(JSObject *obj) { + IncrementalObjectBarrier(value); + value = obj; + return *this; + } + + void trace(JSTracer *trc, const char *name); + + JSObject &operator*() const { return *value; } + JSObject *operator->() const { return value; } + operator JSObject *() const { return value; } +}; + +} /* namespace JS */ + +namespace js { + +/* Base class for automatic read-only object rooting during compilation. */ +class CompilerRootNode +{ + protected: + explicit CompilerRootNode(js::gc::Cell *ptr) : next(nullptr), ptr_(ptr) {} + + public: + void **address() { return (void **)&ptr_; } + + public: + CompilerRootNode *next; + + protected: + js::gc::Cell *ptr_; +}; + +} /* namespace js */ + +#endif /* js_RootingAPI_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/SliceBudget.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/SliceBudget.h new file mode 100644 index 0000000000..7c602c5572 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/SliceBudget.h @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_SliceBudget_h +#define js_SliceBudget_h + +#include + +namespace js { + +/* + * This class records how much work has been done in a given collection slice, so that + * we can return before pausing for too long. Some slices are allowed to run for + * unlimited time, and others are bounded. To reduce the number of gettimeofday + * calls, we only check the time every 1000 operations. + */ +struct JS_PUBLIC_API(SliceBudget) +{ + int64_t deadline; /* in microseconds */ + intptr_t counter; + + static const intptr_t CounterReset = 1000; + + static const int64_t Unlimited = 0; + static int64_t TimeBudget(int64_t millis); + static int64_t WorkBudget(int64_t work); + + /* Equivalent to SliceBudget(UnlimitedBudget). */ + SliceBudget(); + + /* Instantiate as SliceBudget(Time/WorkBudget(n)). */ + explicit SliceBudget(int64_t budget); + + void reset() { + deadline = unlimitedDeadline; + counter = unlimitedStartCounter; + } + + void step(intptr_t amt = 1) { + counter -= amt; + } + + bool checkOverBudget(); + + bool isOverBudget() { + if (counter >= 0) + return false; + return checkOverBudget(); + } + + bool isUnlimited() { + return deadline == unlimitedDeadline; + } + +private: + static const int64_t unlimitedDeadline = INT64_MAX; + static const intptr_t unlimitedStartCounter = INTPTR_MAX; + +}; + +} // namespace js + +#endif /* js_SliceBudget_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/StructuredClone.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/StructuredClone.h new file mode 100644 index 0000000000..fa48ce045a --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/StructuredClone.h @@ -0,0 +1,245 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_StructuredClone_h +#define js_StructuredClone_h + +#include "mozilla/NullPtr.h" + +#include + +#include "jstypes.h" + +#include "js/RootingAPI.h" +#include "js/TypeDecls.h" +#include "js/Value.h" + +struct JSRuntime; +struct JSStructuredCloneReader; +struct JSStructuredCloneWriter; + +// API for the HTML5 internal structured cloning algorithm. + +namespace JS { +enum TransferableOwnership { + // Transferable data has not been filled in yet + SCTAG_TMO_UNFILLED = 0, + + // Structured clone buffer does not yet own the data + SCTAG_TMO_UNOWNED = 1, + + // All values at least this large are owned by the clone buffer + SCTAG_TMO_FIRST_OWNED = 2, + + // Data is a pointer that can be freed + SCTAG_TMO_ALLOC_DATA = 2, + + // Data is a SharedArrayBufferObject's buffer + SCTAG_TMO_SHARED_BUFFER = 3, + + // Data is a memory mapped pointer + SCTAG_TMO_MAPPED_DATA = 4, + + // Data is embedding-specific. The engine can free it by calling the + // freeTransfer op. The embedding can also use SCTAG_TMO_USER_MIN and + // greater, up to 32 bits, to distinguish specific ownership variants. + SCTAG_TMO_CUSTOM = 5, + + SCTAG_TMO_USER_MIN +}; +} /* namespace JS */ + +// Read structured data from the reader r. This hook is used to read a value +// previously serialized by a call to the WriteStructuredCloneOp hook. +// +// tag and data are the pair of uint32_t values from the header. The callback +// may use the JS_Read* APIs to read any other relevant parts of the object +// from the reader r. closure is any value passed to the JS_ReadStructuredClone +// function. Return the new object on success, nullptr on error/exception. +typedef JSObject *(*ReadStructuredCloneOp)(JSContext *cx, JSStructuredCloneReader *r, + uint32_t tag, uint32_t data, void *closure); + +// Structured data serialization hook. The engine can write primitive values, +// Objects, Arrays, Dates, RegExps, TypedArrays, and ArrayBuffers. Any other +// type of object requires application support. This callback must first use +// the JS_WriteUint32Pair API to write an object header, passing a value +// greater than JS_SCTAG_USER to the tag parameter. Then it can use the +// JS_Write* APIs to write any other relevant parts of the value v to the +// writer w. closure is any value passed to the JS_WriteStructuredCLone function. +// +// Return true on success, false on error/exception. +typedef bool (*WriteStructuredCloneOp)(JSContext *cx, JSStructuredCloneWriter *w, + JS::HandleObject obj, void *closure); + +// This is called when JS_WriteStructuredClone is given an invalid transferable. +// To follow HTML5, the application must throw a DATA_CLONE_ERR DOMException +// with error set to one of the JS_SCERR_* values. +typedef void (*StructuredCloneErrorOp)(JSContext *cx, uint32_t errorid); + +// This is called when JS_ReadStructuredClone receives a transferable object +// not known to the engine. If this hook does not exist or returns false, the +// JS engine calls the reportError op if set, otherwise it throws a +// DATA_CLONE_ERR DOM Exception. This method is called before any other +// callback and must return a non-null object in returnObject on success. +typedef bool (*ReadTransferStructuredCloneOp)(JSContext *cx, JSStructuredCloneReader *r, + uint32_t tag, void *content, uint64_t extraData, + void *closure, + JS::MutableHandleObject returnObject); + +// Called when JS_WriteStructuredClone receives a transferable object not +// handled by the engine. If this hook does not exist or returns false, the JS +// engine will call the reportError hook or fall back to throwing a +// DATA_CLONE_ERR DOM Exception. This method is called before any other +// callback. +// +// tag: indicates what type of transferable this is. Must be greater than +// 0xFFFF0201 (value of the internal SCTAG_TRANSFER_MAP_PENDING_ENTRY) +// +// ownership: see TransferableOwnership, above. Used to communicate any needed +// ownership info to the FreeTransferStructuredCloneOp. +// +// content, extraData: what the ReadTransferStructuredCloneOp will receive +// +typedef bool (*TransferStructuredCloneOp)(JSContext *cx, + JS::Handle obj, + void *closure, + // Output: + uint32_t *tag, + JS::TransferableOwnership *ownership, + void **content, + uint64_t *extraData); + +// Called when JS_ClearStructuredClone has to free an unknown transferable +// object. Note that it should never trigger a garbage collection (and will +// assert in a debug build if it does.) +typedef void (*FreeTransferStructuredCloneOp)(uint32_t tag, JS::TransferableOwnership ownership, + void *content, uint64_t extraData, void *closure); + +// The maximum supported structured-clone serialization format version. Note +// that this does not need to be bumped for Transferable-only changes, since +// they are never saved to persistent storage. +#define JS_STRUCTURED_CLONE_VERSION 4 + +struct JSStructuredCloneCallbacks { + ReadStructuredCloneOp read; + WriteStructuredCloneOp write; + StructuredCloneErrorOp reportError; + ReadTransferStructuredCloneOp readTransfer; + TransferStructuredCloneOp writeTransfer; + FreeTransferStructuredCloneOp freeTransfer; +}; + +// Note: if the *data contains transferable objects, it can be read only once. +JS_PUBLIC_API(bool) +JS_ReadStructuredClone(JSContext *cx, uint64_t *data, size_t nbytes, uint32_t version, + JS::MutableHandleValue vp, + const JSStructuredCloneCallbacks *optionalCallbacks, void *closure); + +// Note: On success, the caller is responsible for calling +// JS_ClearStructuredClone(*datap, nbytes, optionalCallbacks, closure). +JS_PUBLIC_API(bool) +JS_WriteStructuredClone(JSContext *cx, JS::HandleValue v, uint64_t **datap, size_t *nbytesp, + const JSStructuredCloneCallbacks *optionalCallbacks, + void *closure, JS::HandleValue transferable); + +JS_PUBLIC_API(bool) +JS_ClearStructuredClone(uint64_t *data, size_t nbytes, + const JSStructuredCloneCallbacks *optionalCallbacks, + void *closure); + +JS_PUBLIC_API(bool) +JS_StructuredCloneHasTransferables(const uint64_t *data, size_t nbytes, bool *hasTransferable); + +JS_PUBLIC_API(bool) +JS_StructuredClone(JSContext *cx, JS::HandleValue v, JS::MutableHandleValue vp, + const JSStructuredCloneCallbacks *optionalCallbacks, void *closure); + +// RAII sugar for JS_WriteStructuredClone. +class JS_PUBLIC_API(JSAutoStructuredCloneBuffer) { + uint64_t *data_; + size_t nbytes_; + uint32_t version_; + const JSStructuredCloneCallbacks *callbacks_; + void *closure_; + + public: + JSAutoStructuredCloneBuffer() + : data_(nullptr), nbytes_(0), version_(JS_STRUCTURED_CLONE_VERSION), + callbacks_(nullptr), closure_(nullptr) + {} + + JSAutoStructuredCloneBuffer(const JSStructuredCloneCallbacks *callbacks, void *closure) + : data_(nullptr), nbytes_(0), version_(JS_STRUCTURED_CLONE_VERSION), + callbacks_(callbacks), closure_(closure) + {} + + JSAutoStructuredCloneBuffer(JSAutoStructuredCloneBuffer &&other); + JSAutoStructuredCloneBuffer &operator=(JSAutoStructuredCloneBuffer &&other); + + ~JSAutoStructuredCloneBuffer() { clear(); } + + uint64_t *data() const { return data_; } + size_t nbytes() const { return nbytes_; } + + void clear(); + + // Copy some memory. It will be automatically freed by the destructor. + bool copy(const uint64_t *data, size_t nbytes, uint32_t version=JS_STRUCTURED_CLONE_VERSION); + + // Adopt some memory. It will be automatically freed by the destructor. + // data must have been allocated by the JS engine (e.g., extracted via + // JSAutoStructuredCloneBuffer::steal). + void adopt(uint64_t *data, size_t nbytes, uint32_t version=JS_STRUCTURED_CLONE_VERSION); + + // Remove the buffer so that it will not be automatically freed. + // After this, the caller is responsible for feeding the memory back to + // JSAutoStructuredCloneBuffer::adopt. + void steal(uint64_t **datap, size_t *nbytesp, uint32_t *versionp=nullptr); + + bool read(JSContext *cx, JS::MutableHandleValue vp, + const JSStructuredCloneCallbacks *optionalCallbacks=nullptr, void *closure=nullptr); + + bool write(JSContext *cx, JS::HandleValue v, + const JSStructuredCloneCallbacks *optionalCallbacks=nullptr, void *closure=nullptr); + + bool write(JSContext *cx, JS::HandleValue v, JS::HandleValue transferable, + const JSStructuredCloneCallbacks *optionalCallbacks=nullptr, void *closure=nullptr); + + private: + // Copy and assignment are not supported. + JSAutoStructuredCloneBuffer(const JSAutoStructuredCloneBuffer &other) MOZ_DELETE; + JSAutoStructuredCloneBuffer &operator=(const JSAutoStructuredCloneBuffer &other) MOZ_DELETE; +}; + +// The range of tag values the application may use for its own custom object types. +#define JS_SCTAG_USER_MIN ((uint32_t) 0xFFFF8000) +#define JS_SCTAG_USER_MAX ((uint32_t) 0xFFFFFFFF) + +#define JS_SCERR_RECURSION 0 +#define JS_SCERR_TRANSFERABLE 1 + +JS_PUBLIC_API(void) +JS_SetStructuredCloneCallbacks(JSRuntime *rt, const JSStructuredCloneCallbacks *callbacks); + +JS_PUBLIC_API(bool) +JS_ReadUint32Pair(JSStructuredCloneReader *r, uint32_t *p1, uint32_t *p2); + +JS_PUBLIC_API(bool) +JS_ReadBytes(JSStructuredCloneReader *r, void *p, size_t len); + +JS_PUBLIC_API(bool) +JS_ReadTypedArray(JSStructuredCloneReader *r, JS::MutableHandleValue vp); + +JS_PUBLIC_API(bool) +JS_WriteUint32Pair(JSStructuredCloneWriter *w, uint32_t tag, uint32_t data); + +JS_PUBLIC_API(bool) +JS_WriteBytes(JSStructuredCloneWriter *w, const void *p, size_t len); + +JS_PUBLIC_API(bool) +JS_WriteTypedArray(JSStructuredCloneWriter *w, JS::HandleValue v); + +#endif /* js_StructuredClone_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/TracingAPI.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/TracingAPI.h new file mode 100644 index 0000000000..3c7fdbe1b1 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/TracingAPI.h @@ -0,0 +1,216 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_TracingAPI_h +#define js_TracingAPI_h + +#include "mozilla/NullPtr.h" + +#include "jspubtd.h" + +class JS_PUBLIC_API(JSTracer); + +namespace JS { +template class Heap; +template class TenuredHeap; +} + +// Tracer callback, called for each traceable thing directly referenced by a +// particular object or runtime structure. It is the callback responsibility +// to ensure the traversal of the full object graph via calling eventually +// JS_TraceChildren on the passed thing. In this case the callback must be +// prepared to deal with cycles in the traversal graph. +// +// kind argument is one of JSTRACE_OBJECT, JSTRACE_STRING or a tag denoting +// internal implementation-specific traversal kind. In the latter case the only +// operations on thing that the callback can do is to call JS_TraceChildren or +// JS_GetTraceThingInfo. +// +// If eagerlyTraceWeakMaps is true, when we trace a WeakMap visit all +// of its mappings. This should be used in cases where the tracer +// wants to use the existing liveness of entries. +typedef void +(* JSTraceCallback)(JSTracer *trc, void **thingp, JSGCTraceKind kind); + +// Callback that JSTraceOp implementation can provide to return a string +// describing the reference traced with JS_CallTracer. +typedef void +(* JSTraceNamePrinter)(JSTracer *trc, char *buf, size_t bufsize); + +enum WeakMapTraceKind { + DoNotTraceWeakMaps = 0, + TraceWeakMapValues = 1, + TraceWeakMapKeysValues = 2 +}; + +class JS_PUBLIC_API(JSTracer) +{ + public: + JSTracer(JSRuntime *rt, JSTraceCallback traceCallback, + WeakMapTraceKind weakTraceKind = TraceWeakMapValues); + + // Set debugging information about a reference to a traceable thing to prepare + // for the following call to JS_CallTracer. + // + // When printer is null, arg must be const char * or char * C string naming + // the reference and index must be either (size_t)-1 indicating that the name + // alone describes the reference or it must be an index into some array vector + // that stores the reference. + // + // When printer callback is not null, the arg and index arguments are + // available to the callback as debugPrintArg_ and debugPrintIndex_ fields + // of JSTracer. + // + // The storage for name or callback's arguments needs to live only until + // the following call to JS_CallTracer returns. + void setTracingDetails(JSTraceNamePrinter printer, const void *arg, size_t index) { + debugPrinter_ = printer; + debugPrintArg_ = arg; + debugPrintIndex_ = index; + } + + void setTracingIndex(const char *name, size_t index) { + setTracingDetails(nullptr, (void *)name, index); + } + + void setTracingName(const char *name) { + setTracingDetails(nullptr, (void *)name, size_t(-1)); + } + + // Remove the currently set tracing details. + void clearTracingDetails() { + debugPrinter_ = nullptr; + debugPrintArg_ = nullptr; + } + + // Return true if tracing details are currently set. + bool hasTracingDetails() const; + + // Get the string set with the most recent call to setTracingName or return + // fallback if a name printer function has been installed. + const char *tracingName(const char *fallback) const; + + // Build a description of this edge in the heap graph. This call may invoke + // the debug printer, which may inspect arbitrary areas of the heap. + const char *getTracingEdgeName(char *buffer, size_t bufferSize); + + // Access the currently active tracing details. + JSTraceNamePrinter debugPrinter() const; + const void *debugPrintArg() const; + size_t debugPrintIndex() const; + + // Return the runtime set on the tracer. + JSRuntime *runtime() const { return runtime_; } + + // Return the weak map tracing behavior set on this tracer. + WeakMapTraceKind eagerlyTraceWeakMaps() const { return eagerlyTraceWeakMaps_; } + + // Update the trace callback. + void setTraceCallback(JSTraceCallback traceCallback); + +#ifdef JS_GC_ZEAL + // Sets the "real" location for a marked reference, when passing the address + // directly is not feasable. This address is used for matching against the + // store buffer when verifying the correctness of the entrees there. + // + // This is currently complicated by our need to nest calls for Values + // stored as keys in hash tables. + void setTracingLocation(void *location); + void unsetTracingLocation(); + void **tracingLocation(void **thingp); +#else + void setTracingLocation(void *location) {} + void unsetTracingLocation() {} + void **tracingLocation(void **thingp) { return nullptr; } +#endif + + // We expose |callback| directly so that IS_GC_MARKING_TRACER can compare + // it to GCMarker::GrayCallback. + JSTraceCallback callback; + + private: + JSRuntime *runtime_; + JSTraceNamePrinter debugPrinter_; + const void *debugPrintArg_; + size_t debugPrintIndex_; + WeakMapTraceKind eagerlyTraceWeakMaps_; +#ifdef JS_GC_ZEAL + void *realLocation_; +#endif +}; + +// The JS_Call*Tracer family of functions traces the given GC thing reference. +// This performs the tracing action configured on the given JSTracer: +// typically calling the JSTracer::callback or marking the thing as live. +// +// The argument to JS_Call*Tracer is an in-out param: when the function +// returns, the garbage collector might have moved the GC thing. In this case, +// the reference passed to JS_Call*Tracer will be updated to the object's new +// location. Callers of this method are responsible for updating any state +// that is dependent on the object's address. For example, if the object's +// address is used as a key in a hashtable, then the object must be removed +// and re-inserted with the correct hash. +// +extern JS_PUBLIC_API(void) +JS_CallValueTracer(JSTracer *trc, JS::Value *valuep, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallIdTracer(JSTracer *trc, jsid *idp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallObjectTracer(JSTracer *trc, JSObject **objp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallStringTracer(JSTracer *trc, JSString **strp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallScriptTracer(JSTracer *trc, JSScript **scriptp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallHeapValueTracer(JSTracer *trc, JS::Heap *valuep, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallHeapIdTracer(JSTracer *trc, JS::Heap *idp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallHeapObjectTracer(JSTracer *trc, JS::Heap *objp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallHeapStringTracer(JSTracer *trc, JS::Heap *strp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallHeapScriptTracer(JSTracer *trc, JS::Heap *scriptp, const char *name); + +extern JS_PUBLIC_API(void) +JS_CallHeapFunctionTracer(JSTracer *trc, JS::Heap *funp, const char *name); + +template +inline void +JS_CallHashSetObjectTracer(JSTracer *trc, HashSetEnum &e, JSObject *const &key, const char *name) +{ + JSObject *updated = key; + trc->setTracingLocation(reinterpret_cast(&const_cast(key))); + JS_CallObjectTracer(trc, &updated, name); + if (updated != key) + e.rekeyFront(key, updated); +} + +// Trace an object that is known to always be tenured. No post barriers are +// required in this case. +extern JS_PUBLIC_API(void) +JS_CallTenuredObjectTracer(JSTracer *trc, JS::TenuredHeap *objp, const char *name); + +extern JS_PUBLIC_API(void) +JS_TraceChildren(JSTracer *trc, void *thing, JSGCTraceKind kind); + +extern JS_PUBLIC_API(void) +JS_TraceRuntime(JSTracer *trc); + +extern JS_PUBLIC_API(void) +JS_GetTraceThingInfo(char *buf, size_t bufsize, JSTracer *trc, + void *thing, JSGCTraceKind kind, bool includeDetails); + +#endif /* js_TracingAPI_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/TypeDecls.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/TypeDecls.h new file mode 100644 index 0000000000..3e1e8afc66 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/TypeDecls.h @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// This file contains public type declarations that are used *frequently*. If +// it doesn't occur at least 10 times in Gecko, it probably shouldn't be in +// here. +// +// It includes only: +// - forward declarations of structs and classes; +// - typedefs; +// - enums (maybe). +// It does *not* contain any struct or class definitions. + +#ifndef js_TypeDecls_h +#define js_TypeDecls_h + +#include +#include + +#include "js-config.h" + +struct JSContext; +class JSFunction; +class JSObject; +class JSScript; +class JSString; +class JSAddonId; + +struct jsid; + +typedef char16_t jschar; + +namespace JS { + +typedef unsigned char Latin1Char; + +class Symbol; +class Value; +template class Handle; +template class MutableHandle; +template class Rooted; +template class PersistentRooted; + +typedef Handle HandleFunction; +typedef Handle HandleId; +typedef Handle HandleObject; +typedef Handle HandleScript; +typedef Handle HandleString; +typedef Handle HandleSymbol; +typedef Handle HandleValue; + +typedef MutableHandle MutableHandleFunction; +typedef MutableHandle MutableHandleId; +typedef MutableHandle MutableHandleObject; +typedef MutableHandle MutableHandleScript; +typedef MutableHandle MutableHandleString; +typedef MutableHandle MutableHandleSymbol; +typedef MutableHandle MutableHandleValue; + +typedef Rooted RootedObject; +typedef Rooted RootedFunction; +typedef Rooted RootedScript; +typedef Rooted RootedString; +typedef Rooted RootedSymbol; +typedef Rooted RootedId; +typedef Rooted RootedValue; + +typedef PersistentRooted PersistentRootedFunction; +typedef PersistentRooted PersistentRootedId; +typedef PersistentRooted PersistentRootedObject; +typedef PersistentRooted PersistentRootedScript; +typedef PersistentRooted PersistentRootedString; +typedef PersistentRooted PersistentRootedSymbol; +typedef PersistentRooted PersistentRootedValue; + +} // namespace JS + +#endif /* js_TypeDecls_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNode.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNode.h new file mode 100644 index 0000000000..d2acc2e242 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNode.h @@ -0,0 +1,462 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_UbiNode_h +#define js_UbiNode_h + +#include "mozilla/Alignment.h" +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Move.h" + +#include "jspubtd.h" + +#include "js/GCAPI.h" +#include "js/HashTable.h" +#include "js/TypeDecls.h" + +// JS::ubi::Node +// +// JS::ubi::Node is a pointer-like type designed for internal use by heap +// analysis tools. A ubi::Node can refer to: +// +// - a JS value, like a string or object; +// - an internal SpiderMonkey structure, like a shape or a scope chain object +// - an instance of some embedding-provided type: in Firefox, an XPCOM +// object, or an internal DOM node class instance +// +// A ubi::Node instance provides metadata about its referent, and can +// enumerate its referent's outgoing edges, so you can implement heap analysis +// algorithms that walk the graph - finding paths between objects, or +// computing heap dominator trees, say - using ubi::Node, while remaining +// ignorant of the details of the types you're operating on. +// +// Of course, when it comes to presenting the results in a developer-facing +// tool, you'll need to stop being ignorant of those details, because you have +// to discuss the ubi::Nodes' referents with the developer. Here, ubi::Node +// can hand you dynamically checked, properly typed pointers to the original +// objects via the as method, or generate descriptions of the referent +// itself. +// +// ubi::Node instances are lightweight (two-word) value types. Instances: +// - compare equal if and only if they refer to the same object; +// - have hash values that respect their equality relation; and +// - have serializations that are only equal if the ubi::Nodes are equal. +// +// A ubi::Node is only valid for as long as its referent is alive; if its +// referent goes away, the ubi::Node becomes a dangling pointer. A ubi::Node +// that refers to a GC-managed object is not automatically a GC root; if the +// GC frees or relocates its referent, the ubi::Node becomes invalid. A +// ubi::Node that refers to a reference-counted object does not bump the +// reference count. +// +// ubi::Node values require no supporting data structures, making them +// feasible for use in memory-constrained devices --- ideally, the memory +// requirements of the algorithm which uses them will be the limiting factor, +// not the demands of ubi::Node itself. +// +// One can construct a ubi::Node value given a pointer to a type that ubi::Node +// supports. In the other direction, one can convert a ubi::Node back to a +// pointer; these downcasts are checked dynamically. In particular, one can +// convert a 'JSRuntime *' to a ubi::Node, yielding a node with an outgoing edge +// for every root registered with the runtime; starting from this, one can walk +// the entire heap. (Of course, one could also start traversal at any other kind +// of type to which one has a pointer.) +// +// +// Extending ubi::Node To Handle Your Embedding's Types +// +// To add support for a new ubi::Node referent type R, you must define a +// specialization of the ubi::Concrete template, ubi::Concrete, which +// inherits from ubi::Base. ubi::Node itself uses the specialization for +// compile-time information (i.e. the checked conversions between R * and +// ubi::Node), and the inheritance for run-time dispatching. +// +// +// ubi::Node Exposes Implementation Details +// +// In many cases, a JavaScript developer's view of their data differs +// substantially from its actual implementation. For example, while the +// ECMAScript specification describes objects as maps from property names to +// sets of attributes (like ECMAScript's [[Value]]), in practice many objects +// have only a pointer to a shape, shared with other similar objects, and +// indexed slots that contain the [[Value]] attributes. As another example, a +// string produced by concatenating two other strings may sometimes be +// represented by a "rope", a structure that points to the two original +// strings. +// + +// We intend to use ubi::Node to write tools that report memory usage, so it's +// important that ubi::Node accurately portray how much memory nodes consume. +// Thus, for example, when data that apparently belongs to multiple nodes is +// in fact shared in a common structure, ubi::Node's graph uses a separate +// node for that shared structure, and presents edges to it from the data's +// apparent owners. For example, ubi::Node exposes SpiderMonkey objects' +// shapes and base shapes, and exposes rope string and substring structure, +// because these optimizations become visible when a tool reports how much +// memory a structure consumes. +// +// However, fine granularity is not a goal. When a particular object is the +// exclusive owner of a separate block of memory, ubi::Node may present the +// object and its block as a single node, and add their sizes together when +// reporting the node's size, as there is no meaningful loss of data in this +// case. Thus, for example, a ubi::Node referring to a JavaScript object, when +// asked for the object's size in bytes, includes the object's slot and +// element arrays' sizes in the total. There is no separate ubi::Node value +// representing the slot and element arrays, since they are owned exclusively +// by the object. +// +// +// Presenting Analysis Results To JavaScript Developers +// +// If an analysis provides its results in terms of ubi::Node values, a user +// interface presenting those results will generally need to clean them up +// before they can be understood by JavaScript developers. For example, +// JavaScript developers should not need to understand shapes, only JavaScript +// objects. Similarly, they should not need to understand the distinction +// between DOM nodes and the JavaScript shadow objects that represent them. +// +// +// Rooting Restrictions +// +// At present there is no way to root ubi::Node instances, so instances can't be +// live across any operation that might GC. Analyses using ubi::Node must either +// run to completion and convert their results to some other rootable type, or +// save their intermediate state in some rooted structure if they must GC before +// they complete. (For algorithms like path-finding and dominator tree +// computation, we implement the algorithm avoiding any operation that could +// cause a GC --- and use AutoCheckCannotGC to verify this.) +// +// If this restriction prevents us from implementing interesting tools, we may +// teach the GC how to root ubi::Nodes, fix up hash tables that use them as +// keys, etc. + + +// Forward declarations of SpiderMonkey's ubi::Node reference types. +namespace js { +class LazyScript; +class Shape; +class BaseShape; +namespace jit { +class JitCode; +} +namespace types { +struct TypeObject; +} +} + + +namespace JS { +namespace ubi { + +class Edge; +class EdgeRange; + +// The base class implemented by each ubi::Node referent type. Subclasses must +// not add data members to this class. +class Base { + friend class Node; + + // For performance's sake, we'd prefer to avoid a virtual destructor; and + // an empty constructor seems consistent with the 'lightweight value type' + // visible behavior we're trying to achieve. But if the destructor isn't + // virtual, and a subclass overrides it, the subclass's destructor will be + // ignored. Is there a way to make the compiler catch that error? + + protected: + // Space for the actual pointer. Concrete subclasses should define a + // properly typed 'get' member function to access this. + void *ptr; + + Base(void *ptr) : ptr(ptr) { } + + public: + bool operator==(const Base &rhs) const { + // Some compilers will indeed place objects of different types at + // the same address, so technically, we should include the vtable + // in this comparison. But it seems unlikely to cause problems in + // practice. + return ptr == rhs.ptr; + } + bool operator!=(const Base &rhs) const { return !(*this == rhs); } + + // Return a human-readable name for the referent's type. The result should + // be statically allocated. (You can use MOZ_UTF16("strings") for this.) + // + // This must always return Concrete::concreteTypeName; we use that + // pointer as a tag for this particular referent type. + virtual const jschar *typeName() const = 0; + + // Return the size of this node, in bytes. Include any structures that this + // node owns exclusively that are not exposed as their own ubi::Nodes. + virtual size_t size() const = 0; + + // Return an EdgeRange that initially contains all the referent's outgoing + // edges. The EdgeRange should be freed with 'js_delete'. (You could use + // ScopedDJSeletePtr to manage it.) On OOM, report an exception + // on |cx| and return nullptr. + virtual EdgeRange *edges(JSContext *cx) const = 0; + + private: + Base(const Base &rhs) MOZ_DELETE; + Base &operator=(const Base &rhs) MOZ_DELETE; +}; + +// A traits template with a specialization for each referent type that +// ubi::Node supports. The specialization must be the concrete subclass of +// Base that represents a pointer to the referent type. It must also +// include the members described here. +template +struct Concrete { + // The specific jschar array returned by Concrete::typeName. + static const jschar concreteTypeName[]; + + // Construct an instance of this concrete class in |storage| referring + // to |referent|. Implementations typically use a placement 'new'. + // + // In some cases, |referent| will contain dynamic type information that + // identifies it a some more specific subclass of |Referent|. For example, + // when |Referent| is |JSObject|, then |referent->getClass()| could tell us + // that it's actually a JSFunction. Similarly, if |Referent| is + // |nsISupports|, we would like a ubi::Node that knows its final + // implementation type. + // + // So, we delegate the actual construction to this specialization, which + // knows Referent's details. + static void construct(void *storage, Referent *referent); +}; + +// A container for a Base instance; all members simply forward to the contained instance. +// This container allows us to pass ubi::Node instances by value. +class Node { + // Storage in which we allocate Base subclasses. + mozilla::AlignedStorage2 storage; + Base *base() { return storage.addr(); } + const Base *base() const { return storage.addr(); } + + template + void construct(T *ptr) { + static_assert(sizeof(Concrete) == sizeof(*base()), + "ubi::Base specializations must be the same size as ubi::Base"); + Concrete::construct(base(), ptr); + } + + typedef void (Node::* ConvertibleToBool)(); + void nonNull() {} + + public: + Node() { construct(nullptr); } + + template + Node(T *ptr) { + construct(ptr); + } + template + Node &operator=(T *ptr) { + construct(ptr); + return *this; + } + + // We can construct and assign from rooted forms of pointers. + template + Node(const Rooted &root) { + construct(root.get()); + } + template + Node &operator=(const Rooted &root) { + construct(root.get()); + return *this; + } + + // Constructors accepting SpiderMonkey's other generic-pointer-ish types. + Node(JS::Value value); + Node(JSGCTraceKind kind, void *ptr); + + // copy construction and copy assignment just use memcpy, since we know + // instances contain nothing but a vtable pointer and a data pointer. + // + // To be completely correct, concrete classes could provide a virtual + // 'construct' member function, which we could invoke on rhs to construct an + // instance in our storage. But this is good enough; there's no need to jump + // through vtables for copying and assignment that are just going to move + // two words around. The compiler knows how to optimize memcpy. + Node(const Node &rhs) { + memcpy(storage.u.mBytes, rhs.storage.u.mBytes, sizeof(storage.u)); + } + + Node &operator=(const Node &rhs) { + memcpy(storage.u.mBytes, rhs.storage.u.mBytes, sizeof(storage.u)); + return *this; + } + + bool operator==(const Node &rhs) const { return *base() == *rhs.base(); } + bool operator!=(const Node &rhs) const { return *base() != *rhs.base(); } + + operator ConvertibleToBool() const { + return base()->ptr ? &Node::nonNull : 0; + } + + template + bool is() const { + return base()->typeName() == Concrete::concreteTypeName; + } + + template + T *as() const { + MOZ_ASSERT(is()); + return static_cast(base()->ptr); + } + + template + T *asOrNull() const { + return is() ? static_cast(base()->ptr) : nullptr; + } + + // If this node refers to something that can be represented as a + // JavaScript value that is safe to expose to JavaScript code, return that + // value. Otherwise return UndefinedValue(). JSStrings and some (but not + // all!) JSObjects can be exposed. + JS::Value exposeToJS() const; + + const jschar *typeName() const { return base()->typeName(); } + size_t size() const { return base()->size(); } + EdgeRange *edges(JSContext *cx) const { return base()->edges(cx); } + + // A hash policy for ubi::Nodes. + // This simply uses the stock PointerHasher on the ubi::Node's pointer. + // We specialize DefaultHasher below to make this the default. + class HashPolicy { + typedef js::PointerHasher::value> PtrHash; + + public: + typedef Node Lookup; + + static js::HashNumber hash(const Lookup &l) { return PtrHash::hash(l.base()->ptr); } + static bool match(const Node &k, const Lookup &l) { return k == l; } + static void rekey(Node &k, const Node &newKey) { k = newKey; } + }; +}; + + +// Edge is the abstract base class representing an outgoing edge of a node. +// Edges are owned by EdgeRanges, and need not have assignment operators or copy +// constructors. +// +// Each Edge class should inherit from this base class, overriding as +// appropriate. +class Edge { + protected: + Edge() : name(nullptr), referent() { } + virtual ~Edge() { } + + public: + // This edge's name. + // + // The storage is owned by this Edge, and will be freed when this Edge is + // destructed. + // + // (In real life we'll want a better representation for names, to avoid + // creating tons of strings when the names follow a pattern; and we'll need + // to think about lifetimes carefully to ensure traversal stays cheap.) + const jschar *name; + + // This edge's referent. + Node referent; + + private: + Edge(const Edge &) MOZ_DELETE; + Edge &operator=(const Edge &) MOZ_DELETE; +}; + + +// EdgeRange is an abstract base class for iterating over a node's outgoing +// edges. (This is modeled after js::HashTable::Range.) +// +// Concrete instances of this class need not be as lightweight as Node itself, +// since they're usually only instantiated while iterating over a particular +// object's edges. For example, a dumb implementation for JS Cells might use +// JS_TraceChildren to to get the outgoing edges, and then store them in an +// array internal to the EdgeRange. +class EdgeRange { + protected: + // The current front edge of this range, or nullptr if this range is empty. + Edge *front_; + + EdgeRange() : front_(nullptr) { } + + public: + virtual ~EdgeRange() { }; + + // True if there are no more edges in this range. + bool empty() const { return !front_; } + + // The front edge of this range. This is owned by the EdgeRange, and is + // only guaranteed to live until the next call to popFront, or until + // the EdgeRange is destructed. + const Edge &front() { return *front_; } + + // Remove the front edge from this range. This should only be called if + // !empty(). + virtual void popFront() = 0; + + private: + EdgeRange(const EdgeRange &) MOZ_DELETE; + EdgeRange &operator=(const EdgeRange &) MOZ_DELETE; +}; + + +// Concrete classes for ubi::Node referent types. + +// A reusable ubi::Concrete specialization base class for types supported by +// JS_TraceChildren. +template +class TracerConcrete : public Base { + const jschar *typeName() const MOZ_OVERRIDE { return concreteTypeName; } + size_t size() const MOZ_OVERRIDE { return 0; } // not implemented yet; bug 1011300 + EdgeRange *edges(JSContext *) const MOZ_OVERRIDE; + + TracerConcrete(Referent *ptr) : Base(ptr) { } + + public: + static const jschar concreteTypeName[]; + static void construct(void *storage, Referent *ptr) { new (storage) TracerConcrete(ptr); }; +}; + +template<> struct Concrete : TracerConcrete { }; +template<> struct Concrete : TracerConcrete { }; +template<> struct Concrete : TracerConcrete { }; +template<> struct Concrete : TracerConcrete { }; +template<> struct Concrete : TracerConcrete { }; +template<> struct Concrete : TracerConcrete { }; +template<> struct Concrete : TracerConcrete { }; +template<> struct Concrete : TracerConcrete { }; + +// The ubi::Node null pointer. Any attempt to operate on a null ubi::Node asserts. +template<> +class Concrete : public Base { + const jschar *typeName() const MOZ_OVERRIDE; + size_t size() const MOZ_OVERRIDE; + EdgeRange *edges(JSContext *cx) const MOZ_OVERRIDE; + + Concrete(void *ptr) : Base(ptr) { } + + public: + static void construct(void *storage, void *ptr) { new (storage) Concrete(ptr); } + static const jschar concreteTypeName[]; +}; + + +} // namespace ubi +} // namespace JS + +namespace js { + +// Make ubi::Node::HashPolicy the default hash policy for ubi::Node. +template<> struct DefaultHasher : JS::ubi::Node::HashPolicy { }; + +} // namespace js + +#endif // js_UbiNode_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNodeTraverse.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNodeTraverse.h new file mode 100644 index 0000000000..6072cbc489 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/UbiNodeTraverse.h @@ -0,0 +1,208 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_UbiNodeTraverse_h +#define js_UbiNodeTraverse_h + +#include "js/UbiNode.h" +#include "js/Utility.h" +#include "js/Vector.h" + +namespace JS { +namespace ubi { + +// A breadth-first traversal template for graphs of ubi::Nodes. +// +// No GC may occur while an instance of this template is live. +// +// The provided Handler type should have two members: +// +// typename NodeData; +// +// The value type of |BreadthFirst::visited|, the HashMap of +// ubi::Nodes that have been visited so far. Since the algorithm needs a +// hash table like this for its own use anyway, it is simple to let +// Handler store its own metadata about each node in the same table. +// +// For example, if you want to find a shortest path to each node from any +// traversal starting point, your |NodeData| type could record the first +// edge to reach each node, and the node from which it originates. Then, +// when the traversal is complete, you can walk backwards from any node +// to some starting point, and the path recorded will be a shortest path. +// +// This type must have a default constructor. If this type owns any other +// resources, move constructors and assignment operators are probably a +// good idea, too. +// +// bool operator() (BreadthFirst &traversal, +// Node origin, const Edge &edge, +// Handler::NodeData *referentData, bool first); +// +// The visitor function, called to report that we have traversed +// |edge| from |origin|. This is called once for each edge we traverse. +// As this is a breadth-first search, any prior calls to the visitor function +// were for origin nodes not further from the start nodes than |origin|. +// +// |traversal| is this traversal object, passed along for convenience. +// +// |referentData| is a pointer to the value of the entry in +// |traversal.visited| for |edge.referent|; the visitor function can +// store whatever metadata it likes about |edge.referent| there. +// +// |first| is true if this is the first time we have visited an edge +// leading to |edge.referent|. This could be stored in NodeData, but +// the algorithm knows whether it has just created the entry in +// |traversal.visited|, so it passes it along for convenience. +// +// The visitor function may call |traversal.stop()| if it doesn't want +// to visit any more nodes. +// +// The visitor function may consult |traversal.visited| for information +// about other nodes, but it should not add or remove entries. +// +// The visitor function should return true on success, or false if an +// error occurs. A false return value terminates the traversal +// immediately, and causes BreadthFirst::traverse to return +// false. +template +struct BreadthFirst { + + // Construct a breadth-first traversal object that reports the nodes it + // reaches to |handler|. The traversal object reports OOM on |cx|, and + // asserts that no GC happens in |cx|'s runtime during its lifetime. + // + // We do nothing with noGC, other than require it to exist, with a lifetime + // that encloses our own. + BreadthFirst(JSContext *cx, Handler &handler, const JS::AutoCheckCannotGC &noGC) + : cx(cx), visited(cx), handler(handler), pending(cx), + traversalBegun(false), stopRequested(false) + { } + + // Initialize this traversal object. Return false on OOM. + bool init() { return visited.init(); } + + // Add |node| as a starting point for the traversal. You may add + // as many starting points as you like. Return false on OOM. + bool addStart(Node node) { return pending.append(node); } + + // Traverse the graph in breadth-first order, starting at the given + // start nodes, applying |handler::operator()| for each edge traversed + // as described above. + // + // This should be called only once per instance of this class. + // + // Return false on OOM or error return from |handler::operator()|. + bool traverse() + { + MOZ_ASSERT(!traversalBegun); + traversalBegun = true; + + // While there are pending nodes, visit them, until we've found a path to the target. + while (!pending.empty()) { + Node origin = pending.front(); + pending.popFront(); + + // Get a range containing all origin's outgoing edges. + js::ScopedJSDeletePtr range(origin.edges(cx)); + if (!range) + return false; + + // Traverse each edge. + for (; !range->empty(); range->popFront()) { + MOZ_ASSERT(!stopRequested); + + const Edge &edge = range->front(); + typename NodeMap::AddPtr a = visited.lookupForAdd(edge.referent); + bool first = !a; + + if (first) { + // This is the first time we've reached |edge.referent|. + // Create an entry for it in |visited|, and arrange to + // traverse its outgoing edges later. + if (!visited.add(a, edge.referent, typename Handler::NodeData()) || + !pending.append(edge.referent)) { + return false; + } + } + + MOZ_ASSERT(a); + + // Report this edge to the visitor function. + if (!handler(*this, origin, edge, &a->value(), first)) + return false; + + if (stopRequested) + return true; + } + } + + return true; + } + + // Stop traversal, and return true from |traverse| without visiting any + // more nodes. Only |handler::operator()| should call this function; it + // may do so to stop the traversal early, without returning false and + // then making |traverse|'s caller disambiguate that result from a real + // error. + void stop() { stopRequested = true; } + + // The context with which we were constructed. + JSContext *cx; + + // A map associating each node N that we have reached with a + // Handler::NodeData, for |handler|'s use. This is public, so that + // |handler| can access it to see the traversal thus far. + typedef js::HashMap NodeMap; + NodeMap visited; + + private: + // Our handler object. + Handler &handler; + + // A queue template. Appending and popping the front are constant time. + // Wasted space is never more than some recent actual population plus the + // current population. + template + class Queue { + js::Vector head, tail; + size_t frontIndex; + public: + Queue(JSContext *cx) : head(cx), tail(cx), frontIndex(0) { } + bool empty() { return frontIndex >= head.length(); } + T &front() { + MOZ_ASSERT(!empty()); + return head[frontIndex]; + } + void popFront() { + MOZ_ASSERT(!empty()); + frontIndex++; + if (frontIndex >= head.length()) { + head.clearAndFree(); + head.swap(tail); + frontIndex = 0; + } + } + bool append(const T &elt) { + return frontIndex == 0 ? head.append(elt) : tail.append(elt); + } + }; + + // A queue of nodes that we have reached, but whose outgoing edges we + // have not yet traversed. Nodes reachable in fewer edges are enqueued + // earlier. + Queue pending; + + // True if our traverse function has been called. + bool traversalBegun; + + // True if we've been asked to stop the traversal. + bool stopRequested; +}; + +} // namespace ubi +} // namespace JS + +#endif // js_UbiNodeTraverse.h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Utility.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Utility.h new file mode 100644 index 0000000000..89c495e411 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Utility.h @@ -0,0 +1,736 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_Utility_h +#define js_Utility_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Compiler.h" +#include "mozilla/Move.h" +#include "mozilla/NullPtr.h" +#include "mozilla/Scoped.h" +#include "mozilla/TemplateLib.h" + +#include +#include + +#ifdef JS_OOM_DO_BACKTRACES +#include +#include +#endif + +#include "jstypes.h" + +/* The public JS engine namespace. */ +namespace JS {} + +/* The mozilla-shared reusable template/utility namespace. */ +namespace mozilla {} + +/* The private JS engine namespace. */ +namespace js {} + +/* + * Patterns used by SpiderMonkey to overwrite unused memory. If you are + * accessing an object with one of these pattern, you probably have a dangling + * pointer. + */ +#define JS_FRESH_NURSERY_PATTERN 0x2F +#define JS_SWEPT_NURSERY_PATTERN 0x2B +#define JS_ALLOCATED_NURSERY_PATTERN 0x2D +#define JS_FRESH_TENURED_PATTERN 0x4F +#define JS_SWEPT_TENURED_PATTERN 0x4B +#define JS_ALLOCATED_TENURED_PATTERN 0x4D +#define JS_SWEPT_CODE_PATTERN 0x3b +#define JS_SWEPT_FRAME_PATTERN 0x5b +#define JS_POISONED_FORKJOIN_CHUNK 0xBD + +#define JS_ASSERT(expr) MOZ_ASSERT(expr) +#define JS_ASSERT_IF(cond, expr) MOZ_ASSERT_IF(cond, expr) + +#define JS_STATIC_ASSERT(cond) static_assert(cond, "JS_STATIC_ASSERT") +#define JS_STATIC_ASSERT_IF(cond, expr) MOZ_STATIC_ASSERT_IF(cond, expr, "JS_STATIC_ASSERT_IF") + +extern MOZ_NORETURN JS_PUBLIC_API(void) +JS_Assert(const char *s, const char *file, int ln); + +/* + * Custom allocator support for SpiderMonkey + */ +#if defined JS_USE_CUSTOM_ALLOCATOR +# include "jscustomallocator.h" +#else +# if defined(DEBUG) || defined(JS_OOM_BREAKPOINT) +/* + * In order to test OOM conditions, when the testing function + * oomAfterAllocations COUNT is passed, we fail continuously after the NUM'th + * allocation from now. + */ +extern JS_PUBLIC_DATA(uint32_t) OOM_maxAllocations; /* set in builtin/TestingFunctions.cpp */ +extern JS_PUBLIC_DATA(uint32_t) OOM_counter; /* data race, who cares. */ + +#ifdef JS_OOM_BREAKPOINT +static MOZ_NEVER_INLINE void js_failedAllocBreakpoint() { asm(""); } +#define JS_OOM_CALL_BP_FUNC() js_failedAllocBreakpoint() +#else +#define JS_OOM_CALL_BP_FUNC() do {} while(0) +#endif + +# define JS_OOM_POSSIBLY_FAIL() \ + do \ + { \ + if (++OOM_counter > OOM_maxAllocations) { \ + JS_OOM_CALL_BP_FUNC();\ + return nullptr; \ + } \ + } while (0) + +# else +# define JS_OOM_POSSIBLY_FAIL() do {} while(0) +# endif /* DEBUG || JS_OOM_BREAKPOINT */ + +static inline void* js_malloc(size_t bytes) +{ + JS_OOM_POSSIBLY_FAIL(); + return malloc(bytes); +} + +static inline void* js_calloc(size_t bytes) +{ + JS_OOM_POSSIBLY_FAIL(); + return calloc(bytes, 1); +} + +static inline void* js_calloc(size_t nmemb, size_t size) +{ + JS_OOM_POSSIBLY_FAIL(); + return calloc(nmemb, size); +} + +static inline void* js_realloc(void* p, size_t bytes) +{ + JS_OOM_POSSIBLY_FAIL(); + return realloc(p, bytes); +} + +static inline void js_free(void* p) +{ + free(p); +} +#endif/* JS_USE_CUSTOM_ALLOCATOR */ + +#include + +/* + * Low-level memory management in SpiderMonkey: + * + * ** Do not use the standard malloc/free/realloc: SpiderMonkey allows these + * to be redefined (via JS_USE_CUSTOM_ALLOCATOR) and Gecko even #define's + * these symbols. + * + * ** Do not use the builtin C++ operator new and delete: these throw on + * error and we cannot override them not to. + * + * Allocation: + * + * - If the lifetime of the allocation is tied to the lifetime of a GC-thing + * (that is, finalizing the GC-thing will free the allocation), call one of + * the following functions: + * + * JSContext::{malloc_,realloc_,calloc_,new_} + * JSRuntime::{malloc_,realloc_,calloc_,new_} + * + * These functions accumulate the number of bytes allocated which is used as + * part of the GC-triggering heuristic. + * + * The difference between the JSContext and JSRuntime versions is that the + * cx version reports an out-of-memory error on OOM. (This follows from the + * general SpiderMonkey idiom that a JSContext-taking function reports its + * own errors.) + * + * - Otherwise, use js_malloc/js_realloc/js_calloc/js_free/js_new + * + * Deallocation: + * + * - Ordinarily, use js_free/js_delete. + * + * - For deallocations during GC finalization, use one of the following + * operations on the FreeOp provided to the finalizer: + * + * FreeOp::{free_,delete_} + * + * The advantage of these operations is that the memory is batched and freed + * on another thread. + */ + +#define JS_NEW_BODY(allocator, t, parms) \ + void *memory = allocator(sizeof(t)); \ + return memory ? new(memory) t parms : nullptr; +#define JS_MAKE_BODY(newname, T, parms) \ + T *ptr = newname parms; \ + return mozilla::UniquePtr>(ptr); + +/* + * Given a class which should provide 'new' methods, add + * JS_DECLARE_NEW_METHODS (see JSContext for a usage example). This + * adds news with up to 12 parameters. Add more versions of new below if + * you need more than 12 parameters. + * + * Note: Do not add a ; at the end of a use of JS_DECLARE_NEW_METHODS, + * or the build will break. + */ +#define JS_DECLARE_NEW_METHODS(NEWNAME, ALLOCATOR, QUALIFIERS)\ + template \ + QUALIFIERS T *NEWNAME() MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T, ())\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9, P10 &&p10) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9),\ + mozilla::Forward(p10)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9, P10 &&p10, P11 &&p11) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9),\ + mozilla::Forward(p10),\ + mozilla::Forward(p11)))\ + }\ +\ + template \ + QUALIFIERS T *NEWNAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9, P10 &&p10, P11 &&p11, P12 &&p12) MOZ_HEAP_ALLOCATOR {\ + JS_NEW_BODY(ALLOCATOR, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9),\ + mozilla::Forward(p10),\ + mozilla::Forward(p11),\ + mozilla::Forward(p12)))\ + }\ + +/* + * Given a class which should provide 'make' methods, add + * JS_DECLARE_MAKE_METHODS (see JSContext for a usage example). This method + * is functionally the same as JS_DECLARE_NEW_METHODS: it just declares methods + * that return mozilla::UniquePtr instances that will singly-manage ownership + * of the created object. This adds makes with up to 12 parameters. Add more + * versions below if you need more than 12 parameters. + * + * Note: Do not add a ; at the end of a use of JS_DECLARE_MAKE_METHODS, + * or the build will break. + */ +#define JS_DECLARE_MAKE_METHODS(MAKENAME, NEWNAME, QUALIFIERS)\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME() MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T, ())\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1)))\ + }\ +\ + template \ + QUALIFIERS \ +mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9, P10 &&p10) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9),\ + mozilla::Forward(p10)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9, P10 &&p10, P11 &&p11) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9),\ + mozilla::Forward(p10),\ + mozilla::Forward(p11)))\ + }\ +\ + template \ + QUALIFIERS \ + mozilla::UniquePtr> \ + MAKENAME(P1 &&p1, P2 &&p2, P3 &&p3, P4 &&p4, P5 &&p5, P6 &&p6, P7 &&p7, P8 &&p8, P9 &&p9, P10 &&p10, P11 &&p11, P12 &&p12) MOZ_HEAP_ALLOCATOR {\ + JS_MAKE_BODY(NEWNAME, T,\ + (mozilla::Forward(p1),\ + mozilla::Forward(p2),\ + mozilla::Forward(p3),\ + mozilla::Forward(p4),\ + mozilla::Forward(p5),\ + mozilla::Forward(p6),\ + mozilla::Forward(p7),\ + mozilla::Forward(p8),\ + mozilla::Forward(p9),\ + mozilla::Forward(p10),\ + mozilla::Forward(p11),\ + mozilla::Forward(p12)))\ + }\ + +JS_DECLARE_NEW_METHODS(js_new, js_malloc, static MOZ_ALWAYS_INLINE) + +template +static MOZ_ALWAYS_INLINE void +js_delete(T *p) +{ + if (p) { + p->~T(); + js_free(p); + } +} + +template +static MOZ_ALWAYS_INLINE void +js_delete_poison(T *p) +{ + if (p) { + p->~T(); + memset(p, 0x3B, sizeof(T)); + js_free(p); + } +} + +template +static MOZ_ALWAYS_INLINE T * +js_pod_malloc() +{ + return (T *)js_malloc(sizeof(T)); +} + +template +static MOZ_ALWAYS_INLINE T * +js_pod_calloc() +{ + return (T *)js_calloc(sizeof(T)); +} + +template +static MOZ_ALWAYS_INLINE T * +js_pod_malloc(size_t numElems) +{ + if (numElems & mozilla::tl::MulOverflowMask::value) + return nullptr; + return (T *)js_malloc(numElems * sizeof(T)); +} + +template +static MOZ_ALWAYS_INLINE T * +js_pod_calloc(size_t numElems) +{ + if (numElems & mozilla::tl::MulOverflowMask::value) + return nullptr; + return (T *)js_calloc(numElems * sizeof(T)); +} + +namespace js { + +template +struct ScopedFreePtrTraits +{ + typedef T* type; + static T* empty() { return nullptr; } + static void release(T* ptr) { js_free(ptr); } +}; +SCOPED_TEMPLATE(ScopedJSFreePtr, ScopedFreePtrTraits) + +template +struct ScopedDeletePtrTraits : public ScopedFreePtrTraits +{ + static void release(T *ptr) { js_delete(ptr); } +}; +SCOPED_TEMPLATE(ScopedJSDeletePtr, ScopedDeletePtrTraits) + +template +struct ScopedReleasePtrTraits : public ScopedFreePtrTraits +{ + static void release(T *ptr) { if (ptr) ptr->release(); } +}; +SCOPED_TEMPLATE(ScopedReleasePtr, ScopedReleasePtrTraits) + +} /* namespace js */ + +namespace JS { + +template +struct DeletePolicy +{ + void operator()(T* ptr) { + js_delete(ptr); + } +}; + +struct FreePolicy +{ + void operator()(void* ptr) { + js_free(ptr); + } +}; + +} // namespace JS + +namespace js { + +/* Integral types for all hash functions. */ +typedef uint32_t HashNumber; +const unsigned HashNumberSizeBits = 32; + +namespace detail { + +/* + * Given a raw hash code, h, return a number that can be used to select a hash + * bucket. + * + * This function aims to produce as uniform an output distribution as possible, + * especially in the most significant (leftmost) bits, even though the input + * distribution may be highly nonrandom, given the constraints that this must + * be deterministic and quick to compute. + * + * Since the leftmost bits of the result are best, the hash bucket index is + * computed by doing ScrambleHashCode(h) / (2^32/N) or the equivalent + * right-shift, not ScrambleHashCode(h) % N or the equivalent bit-mask. + * + * FIXME: OrderedHashTable uses a bit-mask; see bug 775896. + */ +inline HashNumber +ScrambleHashCode(HashNumber h) +{ + /* + * Simply returning h would not cause any hash tables to produce wrong + * answers. But it can produce pathologically bad performance: The caller + * right-shifts the result, keeping only the highest bits. The high bits of + * hash codes are very often completely entropy-free. (So are the lowest + * bits.) + * + * So we use Fibonacci hashing, as described in Knuth, The Art of Computer + * Programming, 6.4. This mixes all the bits of the input hash code h. + * + * The value of goldenRatio is taken from the hex + * expansion of the golden ratio, which starts 1.9E3779B9.... + * This value is especially good if values with consecutive hash codes + * are stored in a hash table; see Knuth for details. + */ + static const HashNumber goldenRatio = 0x9E3779B9U; + return h * goldenRatio; +} + +} /* namespace detail */ + +} /* namespace js */ + +namespace JS { + +/* + * Methods for poisoning GC heap pointer words and checking for poisoned words. + * These are in this file for use in Value methods and so forth. + * + * If the moving GC hazard analysis is in use and detects a non-rooted stack + * pointer to a GC thing, one byte of that pointer is poisoned to refer to an + * invalid location. For both 32 bit and 64 bit systems, the fourth byte of the + * pointer is overwritten, to reduce the likelihood of accidentally changing + * a live integer value. + */ + +inline void PoisonPtr(void *v) +{ +#if defined(JSGC_ROOT_ANALYSIS) && defined(JS_DEBUG) + uint8_t *ptr = (uint8_t *) v + 3; + *ptr = JS_FREE_PATTERN; +#endif +} + +template +inline bool IsPoisonedPtr(T *v) +{ +#if defined(JSGC_ROOT_ANALYSIS) && defined(JS_DEBUG) + uint32_t mask = uintptr_t(v) & 0xff000000; + return mask == uint32_t(JS_FREE_PATTERN << 24); +#else + return false; +#endif +} + +} + +/* sixgill annotation defines */ +#ifndef HAVE_STATIC_ANNOTATIONS +# define HAVE_STATIC_ANNOTATIONS +# ifdef XGILL_PLUGIN +# define STATIC_PRECONDITION(COND) __attribute__((precondition(#COND))) +# define STATIC_PRECONDITION_ASSUME(COND) __attribute__((precondition_assume(#COND))) +# define STATIC_POSTCONDITION(COND) __attribute__((postcondition(#COND))) +# define STATIC_POSTCONDITION_ASSUME(COND) __attribute__((postcondition_assume(#COND))) +# define STATIC_INVARIANT(COND) __attribute__((invariant(#COND))) +# define STATIC_INVARIANT_ASSUME(COND) __attribute__((invariant_assume(#COND))) +# define STATIC_PASTE2(X,Y) X ## Y +# define STATIC_PASTE1(X,Y) STATIC_PASTE2(X,Y) +# define STATIC_ASSERT(COND) \ + JS_BEGIN_MACRO \ + __attribute__((assert_static(#COND), unused)) \ + int STATIC_PASTE1(assert_static_, __COUNTER__); \ + JS_END_MACRO +# define STATIC_ASSUME(COND) \ + JS_BEGIN_MACRO \ + __attribute__((assume_static(#COND), unused)) \ + int STATIC_PASTE1(assume_static_, __COUNTER__); \ + JS_END_MACRO +# define STATIC_ASSERT_RUNTIME(COND) \ + JS_BEGIN_MACRO \ + __attribute__((assert_static_runtime(#COND), unused)) \ + int STATIC_PASTE1(assert_static_runtime_, __COUNTER__); \ + JS_END_MACRO +# else /* XGILL_PLUGIN */ +# define STATIC_PRECONDITION(COND) /* nothing */ +# define STATIC_PRECONDITION_ASSUME(COND) /* nothing */ +# define STATIC_POSTCONDITION(COND) /* nothing */ +# define STATIC_POSTCONDITION_ASSUME(COND) /* nothing */ +# define STATIC_INVARIANT(COND) /* nothing */ +# define STATIC_INVARIANT_ASSUME(COND) /* nothing */ +# define STATIC_ASSERT(COND) JS_BEGIN_MACRO /* nothing */ JS_END_MACRO +# define STATIC_ASSUME(COND) JS_BEGIN_MACRO /* nothing */ JS_END_MACRO +# define STATIC_ASSERT_RUNTIME(COND) JS_BEGIN_MACRO /* nothing */ JS_END_MACRO +# endif /* XGILL_PLUGIN */ +# define STATIC_SKIP_INFERENCE STATIC_INVARIANT(skip_inference()) +#endif /* HAVE_STATIC_ANNOTATIONS */ + +#endif /* js_Utility_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Value.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Value.h new file mode 100644 index 0000000000..9f7cd6ab55 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Value.h @@ -0,0 +1,2005 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* JS::Value implementation. */ + +#ifndef js_Value_h +#define js_Value_h + +#include "mozilla/Attributes.h" +#include "mozilla/FloatingPoint.h" +#include "mozilla/Likely.h" + +#include /* for std::numeric_limits */ + +#include "js-config.h" +#include "jstypes.h" + +#include "js/Anchor.h" +#include "js/GCAPI.h" +#include "js/RootingAPI.h" +#include "js/Utility.h" + +namespace JS { class Value; } + +/* JS::Value can store a full int32_t. */ +#define JSVAL_INT_BITS 32 +#define JSVAL_INT_MIN ((int32_t)0x80000000) +#define JSVAL_INT_MAX ((int32_t)0x7fffffff) + +/* + * Try to get jsvals 64-bit aligned. We could almost assert that all values are + * aligned, but MSVC and GCC occasionally break alignment. + */ +#if defined(__GNUC__) || defined(__xlc__) || defined(__xlC__) +# define JSVAL_ALIGNMENT __attribute__((aligned (8))) +#elif defined(_MSC_VER) + /* + * Structs can be aligned with MSVC, but not if they are used as parameters, + * so we just don't try to align. + */ +# define JSVAL_ALIGNMENT +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# define JSVAL_ALIGNMENT +#elif defined(__HP_cc) || defined(__HP_aCC) +# define JSVAL_ALIGNMENT +#endif + +#if defined(JS_PUNBOX64) +# define JSVAL_TAG_SHIFT 47 +#endif + +/* + * We try to use enums so that printing a jsval_layout in the debugger shows + * nice symbolic type tags, however we can only do this when we can force the + * underlying type of the enum to be the desired size. + */ +#if !defined(__SUNPRO_CC) && !defined(__xlC__) + +#if defined(_MSC_VER) +# define JS_ENUM_HEADER(id, type) enum id : type +# define JS_ENUM_FOOTER(id) +#else +# define JS_ENUM_HEADER(id, type) enum id +# define JS_ENUM_FOOTER(id) __attribute__((packed)) +#endif + +/* Remember to propagate changes to the C defines below. */ +JS_ENUM_HEADER(JSValueType, uint8_t) +{ + JSVAL_TYPE_DOUBLE = 0x00, + JSVAL_TYPE_INT32 = 0x01, + JSVAL_TYPE_UNDEFINED = 0x02, + JSVAL_TYPE_BOOLEAN = 0x03, + JSVAL_TYPE_MAGIC = 0x04, + JSVAL_TYPE_STRING = 0x05, + JSVAL_TYPE_SYMBOL = 0x06, + JSVAL_TYPE_NULL = 0x07, + JSVAL_TYPE_OBJECT = 0x08, + + /* These never appear in a jsval; they are only provided as an out-of-band value. */ + JSVAL_TYPE_UNKNOWN = 0x20, + JSVAL_TYPE_MISSING = 0x21 +} JS_ENUM_FOOTER(JSValueType); + +JS_STATIC_ASSERT(sizeof(JSValueType) == 1); + +#if defined(JS_NUNBOX32) + +/* Remember to propagate changes to the C defines below. */ +JS_ENUM_HEADER(JSValueTag, uint32_t) +{ + JSVAL_TAG_CLEAR = 0xFFFFFF80, + JSVAL_TAG_INT32 = JSVAL_TAG_CLEAR | JSVAL_TYPE_INT32, + JSVAL_TAG_UNDEFINED = JSVAL_TAG_CLEAR | JSVAL_TYPE_UNDEFINED, + JSVAL_TAG_STRING = JSVAL_TAG_CLEAR | JSVAL_TYPE_STRING, + JSVAL_TAG_SYMBOL = JSVAL_TAG_CLEAR | JSVAL_TYPE_SYMBOL, + JSVAL_TAG_BOOLEAN = JSVAL_TAG_CLEAR | JSVAL_TYPE_BOOLEAN, + JSVAL_TAG_MAGIC = JSVAL_TAG_CLEAR | JSVAL_TYPE_MAGIC, + JSVAL_TAG_NULL = JSVAL_TAG_CLEAR | JSVAL_TYPE_NULL, + JSVAL_TAG_OBJECT = JSVAL_TAG_CLEAR | JSVAL_TYPE_OBJECT +} JS_ENUM_FOOTER(JSValueTag); + +JS_STATIC_ASSERT(sizeof(JSValueTag) == 4); + +#elif defined(JS_PUNBOX64) + +/* Remember to propagate changes to the C defines below. */ +JS_ENUM_HEADER(JSValueTag, uint32_t) +{ + JSVAL_TAG_MAX_DOUBLE = 0x1FFF0, + JSVAL_TAG_INT32 = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32, + JSVAL_TAG_UNDEFINED = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_UNDEFINED, + JSVAL_TAG_STRING = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_STRING, + JSVAL_TAG_SYMBOL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_SYMBOL, + JSVAL_TAG_BOOLEAN = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN, + JSVAL_TAG_MAGIC = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_MAGIC, + JSVAL_TAG_NULL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_NULL, + JSVAL_TAG_OBJECT = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_OBJECT +} JS_ENUM_FOOTER(JSValueTag); + +JS_STATIC_ASSERT(sizeof(JSValueTag) == sizeof(uint32_t)); + +JS_ENUM_HEADER(JSValueShiftedTag, uint64_t) +{ + JSVAL_SHIFTED_TAG_MAX_DOUBLE = ((((uint64_t)JSVAL_TAG_MAX_DOUBLE) << JSVAL_TAG_SHIFT) | 0xFFFFFFFF), + JSVAL_SHIFTED_TAG_INT32 = (((uint64_t)JSVAL_TAG_INT32) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_UNDEFINED = (((uint64_t)JSVAL_TAG_UNDEFINED) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_STRING = (((uint64_t)JSVAL_TAG_STRING) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_SYMBOL = (((uint64_t)JSVAL_TAG_SYMBOL) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_BOOLEAN = (((uint64_t)JSVAL_TAG_BOOLEAN) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_MAGIC = (((uint64_t)JSVAL_TAG_MAGIC) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_NULL = (((uint64_t)JSVAL_TAG_NULL) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_OBJECT = (((uint64_t)JSVAL_TAG_OBJECT) << JSVAL_TAG_SHIFT) +} JS_ENUM_FOOTER(JSValueShiftedTag); + +JS_STATIC_ASSERT(sizeof(JSValueShiftedTag) == sizeof(uint64_t)); + +#endif + +#else /* !defined(__SUNPRO_CC) && !defined(__xlC__) */ + +typedef uint8_t JSValueType; +#define JSVAL_TYPE_DOUBLE ((uint8_t)0x00) +#define JSVAL_TYPE_INT32 ((uint8_t)0x01) +#define JSVAL_TYPE_UNDEFINED ((uint8_t)0x02) +#define JSVAL_TYPE_BOOLEAN ((uint8_t)0x03) +#define JSVAL_TYPE_MAGIC ((uint8_t)0x04) +#define JSVAL_TYPE_STRING ((uint8_t)0x05) +#define JSVAL_TYPE_SYMBOL ((uint8_t)0x06) +#define JSVAL_TYPE_NULL ((uint8_t)0x07) +#define JSVAL_TYPE_OBJECT ((uint8_t)0x08) +#define JSVAL_TYPE_UNKNOWN ((uint8_t)0x20) + +#if defined(JS_NUNBOX32) + +typedef uint32_t JSValueTag; +#define JSVAL_TAG_CLEAR ((uint32_t)(0xFFFFFF80)) +#define JSVAL_TAG_INT32 ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_INT32)) +#define JSVAL_TAG_UNDEFINED ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_UNDEFINED)) +#define JSVAL_TAG_STRING ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_STRING)) +#define JSVAL_TAG_SYMBOL ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_SYMBOL)) +#define JSVAL_TAG_BOOLEAN ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_BOOLEAN)) +#define JSVAL_TAG_MAGIC ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_MAGIC)) +#define JSVAL_TAG_NULL ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_NULL)) +#define JSVAL_TAG_OBJECT ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_OBJECT)) + +#elif defined(JS_PUNBOX64) + +typedef uint32_t JSValueTag; +#define JSVAL_TAG_MAX_DOUBLE ((uint32_t)(0x1FFF0)) +#define JSVAL_TAG_INT32 (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32) +#define JSVAL_TAG_UNDEFINED (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_UNDEFINED) +#define JSVAL_TAG_STRING (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_STRING) +#define JSVAL_TAG_SYMBOL (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_SYMBOL) +#define JSVAL_TAG_BOOLEAN (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN) +#define JSVAL_TAG_MAGIC (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_MAGIC) +#define JSVAL_TAG_NULL (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_NULL) +#define JSVAL_TAG_OBJECT (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_OBJECT) + +typedef uint64_t JSValueShiftedTag; +#define JSVAL_SHIFTED_TAG_MAX_DOUBLE ((((uint64_t)JSVAL_TAG_MAX_DOUBLE) << JSVAL_TAG_SHIFT) | 0xFFFFFFFF) +#define JSVAL_SHIFTED_TAG_INT32 (((uint64_t)JSVAL_TAG_INT32) << JSVAL_TAG_SHIFT) +#define JSVAL_SHIFTED_TAG_UNDEFINED (((uint64_t)JSVAL_TAG_UNDEFINED) << JSVAL_TAG_SHIFT) +#define JSVAL_SHIFTED_TAG_STRING (((uint64_t)JSVAL_TAG_STRING) << JSVAL_TAG_SHIFT) +#define JSVAL_SHIFTED_TAG_SYMBOL (((uint64_t)JSVAL_TAG_SYMBOL) << JSVAL_TAG_SHIFT) +#define JSVAL_SHIFTED_TAG_BOOLEAN (((uint64_t)JSVAL_TAG_BOOLEAN) << JSVAL_TAG_SHIFT) +#define JSVAL_SHIFTED_TAG_MAGIC (((uint64_t)JSVAL_TAG_MAGIC) << JSVAL_TAG_SHIFT) +#define JSVAL_SHIFTED_TAG_NULL (((uint64_t)JSVAL_TAG_NULL) << JSVAL_TAG_SHIFT) +#define JSVAL_SHIFTED_TAG_OBJECT (((uint64_t)JSVAL_TAG_OBJECT) << JSVAL_TAG_SHIFT) + +#endif /* JS_PUNBOX64 */ +#endif /* !defined(__SUNPRO_CC) && !defined(__xlC__) */ + +#if defined(JS_NUNBOX32) + +#define JSVAL_TYPE_TO_TAG(type) ((JSValueTag)(JSVAL_TAG_CLEAR | (type))) + +#define JSVAL_LOWER_INCL_TAG_OF_OBJ_OR_NULL_SET JSVAL_TAG_NULL +#define JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET JSVAL_TAG_OBJECT +#define JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET JSVAL_TAG_INT32 +#define JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET JSVAL_TAG_STRING + +#elif defined(JS_PUNBOX64) + +#define JSVAL_PAYLOAD_MASK 0x00007FFFFFFFFFFFLL +#define JSVAL_TAG_MASK 0xFFFF800000000000LL +#define JSVAL_TYPE_TO_TAG(type) ((JSValueTag)(JSVAL_TAG_MAX_DOUBLE | (type))) +#define JSVAL_TYPE_TO_SHIFTED_TAG(type) (((uint64_t)JSVAL_TYPE_TO_TAG(type)) << JSVAL_TAG_SHIFT) + +#define JSVAL_LOWER_INCL_TAG_OF_OBJ_OR_NULL_SET JSVAL_TAG_NULL +#define JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET JSVAL_TAG_OBJECT +#define JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET JSVAL_TAG_INT32 +#define JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET JSVAL_TAG_STRING + +#define JSVAL_LOWER_INCL_SHIFTED_TAG_OF_OBJ_OR_NULL_SET JSVAL_SHIFTED_TAG_NULL +#define JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_PRIMITIVE_SET JSVAL_SHIFTED_TAG_OBJECT +#define JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_NUMBER_SET JSVAL_SHIFTED_TAG_UNDEFINED +#define JSVAL_LOWER_INCL_SHIFTED_TAG_OF_GCTHING_SET JSVAL_SHIFTED_TAG_STRING + +#endif /* JS_PUNBOX64 */ + +typedef enum JSWhyMagic +{ + JS_ELEMENTS_HOLE, /* a hole in a native object's elements */ + JS_NATIVE_ENUMERATE, /* indicates that a custom enumerate hook forwarded + * to JS_EnumerateState, which really means the object can be + * enumerated like a native object. */ + JS_NO_ITER_VALUE, /* there is not a pending iterator value */ + JS_GENERATOR_CLOSING, /* exception value thrown when closing a generator */ + JS_NO_CONSTANT, /* compiler sentinel value */ + JS_THIS_POISON, /* used in debug builds to catch tracing errors */ + JS_ARG_POISON, /* used in debug builds to catch tracing errors */ + JS_SERIALIZE_NO_NODE, /* an empty subnode in the AST serializer */ + JS_LAZY_ARGUMENTS, /* lazy arguments value on the stack */ + JS_OPTIMIZED_ARGUMENTS, /* optimized-away 'arguments' value */ + JS_IS_CONSTRUCTING, /* magic value passed to natives to indicate construction */ + JS_OVERWRITTEN_CALLEE, /* arguments.callee has been overwritten */ + JS_BLOCK_NEEDS_CLONE, /* value of static block object slot */ + JS_HASH_KEY_EMPTY, /* see class js::HashableValue */ + JS_ION_ERROR, /* error while running Ion code */ + JS_ION_BAILOUT, /* missing recover instruction result */ + JS_OPTIMIZED_OUT, /* optimized out slot */ + JS_GENERIC_MAGIC /* for local use */ +} JSWhyMagic; + +#if defined(IS_LITTLE_ENDIAN) +# if defined(JS_NUNBOX32) +typedef union jsval_layout +{ + uint64_t asBits; + struct { + union { + int32_t i32; + uint32_t u32; + uint32_t boo; // Don't use |bool| -- it must be four bytes. + JSString *str; + JS::Symbol *sym; + JSObject *obj; + js::gc::Cell *cell; + void *ptr; + JSWhyMagic why; + size_t word; + uintptr_t uintptr; + } payload; + JSValueTag tag; + } s; + double asDouble; + void *asPtr; +} JSVAL_ALIGNMENT jsval_layout; +# elif defined(JS_PUNBOX64) +typedef union jsval_layout +{ + uint64_t asBits; +#if !defined(_WIN64) + /* MSVC does not pack these correctly :-( */ + struct { + uint64_t payload47 : 47; + JSValueTag tag : 17; + } debugView; +#endif + struct { + union { + int32_t i32; + uint32_t u32; + JSWhyMagic why; + } payload; + } s; + double asDouble; + void *asPtr; + size_t asWord; + uintptr_t asUIntPtr; +} JSVAL_ALIGNMENT jsval_layout; +# endif /* JS_PUNBOX64 */ +#else /* defined(IS_LITTLE_ENDIAN) */ +# if defined(JS_NUNBOX32) +typedef union jsval_layout +{ + uint64_t asBits; + struct { + JSValueTag tag; + union { + int32_t i32; + uint32_t u32; + uint32_t boo; // Don't use |bool| -- it must be four bytes. + JSString *str; + JS::Symbol *sym; + JSObject *obj; + js::gc::Cell *cell; + void *ptr; + JSWhyMagic why; + size_t word; + uintptr_t uintptr; + } payload; + } s; + double asDouble; + void *asPtr; +} JSVAL_ALIGNMENT jsval_layout; +# elif defined(JS_PUNBOX64) +typedef union jsval_layout +{ + uint64_t asBits; + struct { + JSValueTag tag : 17; + uint64_t payload47 : 47; + } debugView; + struct { + uint32_t padding; + union { + int32_t i32; + uint32_t u32; + JSWhyMagic why; + } payload; + } s; + double asDouble; + void *asPtr; + size_t asWord; + uintptr_t asUIntPtr; +} JSVAL_ALIGNMENT jsval_layout; +# endif /* JS_PUNBOX64 */ +#endif /* defined(IS_LITTLE_ENDIAN) */ + +//this is a workaround for fixing binding-generator errors +JS_STATIC_ASSERT(sizeof(jsval_layout) == 8); + +/* + * For codesize purposes on some platforms, it's important that the + * compiler know that JS::Values constructed from constant values can be + * folded to constant bit patterns at compile time, rather than + * constructed at runtime. Doing this requires a fair amount of C++11 + * features, which are not supported on all of our compilers. Set up + * some defines and helper macros in an attempt to confine the ugliness + * here, rather than scattering it all about the file. The important + * features are: + * + * - constexpr; + * - defaulted functions; + * - C99-style designated initializers. + */ +#if defined(__clang__) +# if __has_feature(cxx_constexpr) && __has_feature(cxx_defaulted_functions) +# define JS_VALUE_IS_CONSTEXPR +# endif +#elif defined(__GNUC__) +/* + * We need 4.5 for defaulted functions, 4.6 for constexpr, 4.7 because 4.6 + * doesn't understand |(X) { .field = ... }| syntax, and 4.7.3 because + * versions prior to that have bugs in the C++ front-end that cause crashes. + */ +# if MOZ_GCC_VERSION_AT_LEAST(4, 7, 3) +# define JS_VALUE_IS_CONSTEXPR +# endif +#endif + +#if defined(JS_VALUE_IS_CONSTEXPR) +# define JS_RETURN_LAYOUT_FROM_BITS(BITS) \ + return (jsval_layout) { .asBits = (BITS) } +# define JS_VALUE_CONSTEXPR MOZ_CONSTEXPR +# define JS_VALUE_CONSTEXPR_VAR MOZ_CONSTEXPR_VAR +#else +# define JS_RETURN_LAYOUT_FROM_BITS(BITS) \ + jsval_layout l; \ + l.asBits = (BITS); \ + return l; +# define JS_VALUE_CONSTEXPR +# define JS_VALUE_CONSTEXPR_VAR const +#endif + +#if defined(JS_NUNBOX32) + +/* + * N.B. GCC, in some but not all cases, chooses to emit signed comparison of + * JSValueTag even though its underlying type has been forced to be uint32_t. + * Thus, all comparisons should explicitly cast operands to uint32_t. + */ + +static inline JS_VALUE_CONSTEXPR jsval_layout +BUILD_JSVAL(JSValueTag tag, uint32_t payload) +{ + JS_RETURN_LAYOUT_FROM_BITS((((uint64_t)(uint32_t)tag) << 32) | payload); +} + +static inline bool +JSVAL_IS_DOUBLE_IMPL(jsval_layout l) +{ + return (uint32_t)l.s.tag <= (uint32_t)JSVAL_TAG_CLEAR; +} + +static inline jsval_layout +DOUBLE_TO_JSVAL_IMPL(double d) +{ + jsval_layout l; + l.asDouble = d; + MOZ_ASSERT(JSVAL_IS_DOUBLE_IMPL(l)); + return l; +} + +static inline bool +JSVAL_IS_INT32_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_INT32; +} + +static inline int32_t +JSVAL_TO_INT32_IMPL(jsval_layout l) +{ + return l.s.payload.i32; +} + +static inline JS_VALUE_CONSTEXPR jsval_layout +INT32_TO_JSVAL_IMPL(int32_t i) +{ +#if defined(JS_VALUE_IS_CONSTEXPR) + return BUILD_JSVAL(JSVAL_TAG_INT32, i); +#else + jsval_layout l; + l.s.tag = JSVAL_TAG_INT32; + l.s.payload.i32 = i; + return l; +#endif +} + +static inline bool +JSVAL_IS_NUMBER_IMPL(jsval_layout l) +{ + JSValueTag tag = l.s.tag; + MOZ_ASSERT(tag != JSVAL_TAG_CLEAR); + return (uint32_t)tag <= (uint32_t)JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET; +} + +static inline bool +JSVAL_IS_UNDEFINED_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_UNDEFINED; +} + +static inline bool +JSVAL_IS_STRING_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_STRING; +} + +static inline jsval_layout +STRING_TO_JSVAL_IMPL(JSString *str) +{ + jsval_layout l; + MOZ_ASSERT(uintptr_t(str) > 0x1000); + l.s.tag = JSVAL_TAG_STRING; + l.s.payload.str = str; + return l; +} + +static inline JSString * +JSVAL_TO_STRING_IMPL(jsval_layout l) +{ + return l.s.payload.str; +} + +static inline bool +JSVAL_IS_SYMBOL_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_SYMBOL; +} + +static inline jsval_layout +SYMBOL_TO_JSVAL_IMPL(JS::Symbol *sym) +{ + jsval_layout l; + MOZ_ASSERT(uintptr_t(sym) > 0x1000); + l.s.tag = JSVAL_TAG_SYMBOL; + l.s.payload.sym = sym; + return l; +} + +static inline JS::Symbol * +JSVAL_TO_SYMBOL_IMPL(jsval_layout l) +{ + return l.s.payload.sym; +} + +static inline bool +JSVAL_IS_BOOLEAN_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_BOOLEAN; +} + +static inline bool +JSVAL_TO_BOOLEAN_IMPL(jsval_layout l) +{ + return l.s.payload.boo; +} + +static inline jsval_layout +BOOLEAN_TO_JSVAL_IMPL(bool b) +{ + jsval_layout l; + l.s.tag = JSVAL_TAG_BOOLEAN; + l.s.payload.boo = b; + return l; +} + +static inline bool +JSVAL_IS_MAGIC_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_MAGIC; +} + +static inline bool +JSVAL_IS_OBJECT_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_OBJECT; +} + +static inline bool +JSVAL_IS_PRIMITIVE_IMPL(jsval_layout l) +{ + return (uint32_t)l.s.tag < (uint32_t)JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET; +} + +static inline bool +JSVAL_IS_OBJECT_OR_NULL_IMPL(jsval_layout l) +{ + MOZ_ASSERT((uint32_t)l.s.tag <= (uint32_t)JSVAL_TAG_OBJECT); + return (uint32_t)l.s.tag >= (uint32_t)JSVAL_LOWER_INCL_TAG_OF_OBJ_OR_NULL_SET; +} + +static inline JSObject * +JSVAL_TO_OBJECT_IMPL(jsval_layout l) +{ + return l.s.payload.obj; +} + +static inline jsval_layout +OBJECT_TO_JSVAL_IMPL(JSObject *obj) +{ + jsval_layout l; + MOZ_ASSERT(uintptr_t(obj) > 0x1000 || uintptr_t(obj) == 0x42); + l.s.tag = JSVAL_TAG_OBJECT; + l.s.payload.obj = obj; + return l; +} + +static inline bool +JSVAL_IS_NULL_IMPL(jsval_layout l) +{ + return l.s.tag == JSVAL_TAG_NULL; +} + +static inline jsval_layout +PRIVATE_PTR_TO_JSVAL_IMPL(void *ptr) +{ + jsval_layout l; + MOZ_ASSERT(((uint32_t)ptr & 1) == 0); + l.s.tag = (JSValueTag)0; + l.s.payload.ptr = ptr; + MOZ_ASSERT(JSVAL_IS_DOUBLE_IMPL(l)); + return l; +} + +static inline void * +JSVAL_TO_PRIVATE_PTR_IMPL(jsval_layout l) +{ + return l.s.payload.ptr; +} + +static inline bool +JSVAL_IS_GCTHING_IMPL(jsval_layout l) +{ + /* gcc sometimes generates signed < without explicit casts. */ + return (uint32_t)l.s.tag >= (uint32_t)JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET; +} + +static inline js::gc::Cell * +JSVAL_TO_GCTHING_IMPL(jsval_layout l) +{ + return l.s.payload.cell; +} + +static inline uint32_t +JSVAL_TRACE_KIND_IMPL(jsval_layout l) +{ + static_assert((JSVAL_TAG_STRING & 0x03) == JSTRACE_STRING, + "Value type tags must correspond with JSGCTraceKinds."); + static_assert((JSVAL_TAG_SYMBOL & 0x03) == JSTRACE_SYMBOL, + "Value type tags must correspond with JSGCTraceKinds."); + static_assert((JSVAL_TAG_OBJECT & 0x03) == JSTRACE_OBJECT, + "Value type tags must correspond with JSGCTraceKinds."); + return l.s.tag & 0x03; +} + +static inline bool +JSVAL_IS_SPECIFIC_INT32_IMPL(jsval_layout l, int32_t i32) +{ + return l.s.tag == JSVAL_TAG_INT32 && l.s.payload.i32 == i32; +} + +static inline bool +JSVAL_IS_SPECIFIC_BOOLEAN_IMPL(jsval_layout l, bool b) +{ + return (l.s.tag == JSVAL_TAG_BOOLEAN) && (l.s.payload.boo == uint32_t(b)); +} + +static inline jsval_layout +MAGIC_TO_JSVAL_IMPL(JSWhyMagic why) +{ + jsval_layout l; + l.s.tag = JSVAL_TAG_MAGIC; + l.s.payload.why = why; + return l; +} + +static inline jsval_layout +MAGIC_UINT32_TO_JSVAL_IMPL(uint32_t payload) +{ + jsval_layout l; + l.s.tag = JSVAL_TAG_MAGIC; + l.s.payload.u32 = payload; + return l; +} + +static inline bool +JSVAL_SAME_TYPE_IMPL(jsval_layout lhs, jsval_layout rhs) +{ + JSValueTag ltag = lhs.s.tag, rtag = rhs.s.tag; + return ltag == rtag || (ltag < JSVAL_TAG_CLEAR && rtag < JSVAL_TAG_CLEAR); +} + +static inline JSValueType +JSVAL_EXTRACT_NON_DOUBLE_TYPE_IMPL(jsval_layout l) +{ + uint32_t type = l.s.tag & 0xF; + MOZ_ASSERT(type > JSVAL_TYPE_DOUBLE); + return (JSValueType)type; +} + +#elif defined(JS_PUNBOX64) + +static inline JS_VALUE_CONSTEXPR jsval_layout +BUILD_JSVAL(JSValueTag tag, uint64_t payload) +{ + JS_RETURN_LAYOUT_FROM_BITS((((uint64_t)(uint32_t)tag) << JSVAL_TAG_SHIFT) | payload); +} + +static inline bool +JSVAL_IS_DOUBLE_IMPL(jsval_layout l) +{ + return l.asBits <= JSVAL_SHIFTED_TAG_MAX_DOUBLE; +} + +static inline jsval_layout +DOUBLE_TO_JSVAL_IMPL(double d) +{ + jsval_layout l; + l.asDouble = d; + MOZ_ASSERT(l.asBits <= JSVAL_SHIFTED_TAG_MAX_DOUBLE); + return l; +} + +static inline bool +JSVAL_IS_INT32_IMPL(jsval_layout l) +{ + return (uint32_t)(l.asBits >> JSVAL_TAG_SHIFT) == JSVAL_TAG_INT32; +} + +static inline int32_t +JSVAL_TO_INT32_IMPL(jsval_layout l) +{ + return (int32_t)l.asBits; +} + +static inline JS_VALUE_CONSTEXPR jsval_layout +INT32_TO_JSVAL_IMPL(int32_t i32) +{ + JS_RETURN_LAYOUT_FROM_BITS(((uint64_t)(uint32_t)i32) | JSVAL_SHIFTED_TAG_INT32); +} + +static inline bool +JSVAL_IS_NUMBER_IMPL(jsval_layout l) +{ + return l.asBits < JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_NUMBER_SET; +} + +static inline bool +JSVAL_IS_UNDEFINED_IMPL(jsval_layout l) +{ + return l.asBits == JSVAL_SHIFTED_TAG_UNDEFINED; +} + +static inline bool +JSVAL_IS_STRING_IMPL(jsval_layout l) +{ + return (uint32_t)(l.asBits >> JSVAL_TAG_SHIFT) == JSVAL_TAG_STRING; +} + +static inline jsval_layout +STRING_TO_JSVAL_IMPL(JSString *str) +{ + jsval_layout l; + uint64_t strBits = (uint64_t)str; + MOZ_ASSERT(uintptr_t(str) > 0x1000); + MOZ_ASSERT((strBits >> JSVAL_TAG_SHIFT) == 0); + l.asBits = strBits | JSVAL_SHIFTED_TAG_STRING; + return l; +} + +static inline JSString * +JSVAL_TO_STRING_IMPL(jsval_layout l) +{ + return (JSString *)(l.asBits & JSVAL_PAYLOAD_MASK); +} + +static inline bool +JSVAL_IS_SYMBOL_IMPL(jsval_layout l) +{ + return (uint32_t)(l.asBits >> JSVAL_TAG_SHIFT) == JSVAL_TAG_SYMBOL; +} + +static inline jsval_layout +SYMBOL_TO_JSVAL_IMPL(JS::Symbol *sym) +{ + jsval_layout l; + uint64_t symBits = (uint64_t)sym; + MOZ_ASSERT(uintptr_t(sym) > 0x1000); + MOZ_ASSERT((symBits >> JSVAL_TAG_SHIFT) == 0); + l.asBits = symBits | JSVAL_SHIFTED_TAG_SYMBOL; + return l; +} + +static inline JS::Symbol * +JSVAL_TO_SYMBOL_IMPL(jsval_layout l) +{ + return (JS::Symbol *)(l.asBits & JSVAL_PAYLOAD_MASK); +} + +static inline bool +JSVAL_IS_BOOLEAN_IMPL(jsval_layout l) +{ + return (uint32_t)(l.asBits >> JSVAL_TAG_SHIFT) == JSVAL_TAG_BOOLEAN; +} + +static inline bool +JSVAL_TO_BOOLEAN_IMPL(jsval_layout l) +{ + return (bool)(l.asBits & JSVAL_PAYLOAD_MASK); +} + +static inline jsval_layout +BOOLEAN_TO_JSVAL_IMPL(bool b) +{ + jsval_layout l; + l.asBits = ((uint64_t)(uint32_t)b) | JSVAL_SHIFTED_TAG_BOOLEAN; + return l; +} + +static inline bool +JSVAL_IS_MAGIC_IMPL(jsval_layout l) +{ + return (l.asBits >> JSVAL_TAG_SHIFT) == JSVAL_TAG_MAGIC; +} + +static inline bool +JSVAL_IS_PRIMITIVE_IMPL(jsval_layout l) +{ + return l.asBits < JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_PRIMITIVE_SET; +} + +static inline bool +JSVAL_IS_OBJECT_IMPL(jsval_layout l) +{ + MOZ_ASSERT((l.asBits >> JSVAL_TAG_SHIFT) <= JSVAL_TAG_OBJECT); + return l.asBits >= JSVAL_SHIFTED_TAG_OBJECT; +} + +static inline bool +JSVAL_IS_OBJECT_OR_NULL_IMPL(jsval_layout l) +{ + MOZ_ASSERT((l.asBits >> JSVAL_TAG_SHIFT) <= JSVAL_TAG_OBJECT); + return l.asBits >= JSVAL_LOWER_INCL_SHIFTED_TAG_OF_OBJ_OR_NULL_SET; +} + +static inline JSObject * +JSVAL_TO_OBJECT_IMPL(jsval_layout l) +{ + uint64_t ptrBits = l.asBits & JSVAL_PAYLOAD_MASK; + MOZ_ASSERT((ptrBits & 0x7) == 0); + return (JSObject *)ptrBits; +} + +static inline jsval_layout +OBJECT_TO_JSVAL_IMPL(JSObject *obj) +{ + jsval_layout l; + uint64_t objBits = (uint64_t)obj; + MOZ_ASSERT(uintptr_t(obj) > 0x1000 || uintptr_t(obj) == 0x42); + MOZ_ASSERT((objBits >> JSVAL_TAG_SHIFT) == 0); + l.asBits = objBits | JSVAL_SHIFTED_TAG_OBJECT; + return l; +} + +static inline bool +JSVAL_IS_NULL_IMPL(jsval_layout l) +{ + return l.asBits == JSVAL_SHIFTED_TAG_NULL; +} + +static inline bool +JSVAL_IS_GCTHING_IMPL(jsval_layout l) +{ + return l.asBits >= JSVAL_LOWER_INCL_SHIFTED_TAG_OF_GCTHING_SET; +} + +static inline js::gc::Cell * +JSVAL_TO_GCTHING_IMPL(jsval_layout l) +{ + uint64_t ptrBits = l.asBits & JSVAL_PAYLOAD_MASK; + MOZ_ASSERT((ptrBits & 0x7) == 0); + return reinterpret_cast(ptrBits); +} + +static inline uint32_t +JSVAL_TRACE_KIND_IMPL(jsval_layout l) +{ + static_assert((JSVAL_TAG_STRING & 0x03) == JSTRACE_STRING, + "Value type tags must correspond with JSGCTraceKinds."); + static_assert((JSVAL_TAG_SYMBOL & 0x03) == JSTRACE_SYMBOL, + "Value type tags must correspond with JSGCTraceKinds."); + static_assert((JSVAL_TAG_OBJECT & 0x03) == JSTRACE_OBJECT, + "Value type tags must correspond with JSGCTraceKinds."); + return (uint32_t)(l.asBits >> JSVAL_TAG_SHIFT) & 0x03; +} + +static inline jsval_layout +PRIVATE_PTR_TO_JSVAL_IMPL(void *ptr) +{ + jsval_layout l; + uint64_t ptrBits = (uint64_t)ptr; + MOZ_ASSERT((ptrBits & 1) == 0); + l.asBits = ptrBits >> 1; + MOZ_ASSERT(JSVAL_IS_DOUBLE_IMPL(l)); + return l; +} + +static inline void * +JSVAL_TO_PRIVATE_PTR_IMPL(jsval_layout l) +{ + MOZ_ASSERT((l.asBits & 0x8000000000000000LL) == 0); + return (void *)(l.asBits << 1); +} + +static inline bool +JSVAL_IS_SPECIFIC_INT32_IMPL(jsval_layout l, int32_t i32) +{ + return l.asBits == (((uint64_t)(uint32_t)i32) | JSVAL_SHIFTED_TAG_INT32); +} + +static inline bool +JSVAL_IS_SPECIFIC_BOOLEAN_IMPL(jsval_layout l, bool b) +{ + return l.asBits == (((uint64_t)(uint32_t)b) | JSVAL_SHIFTED_TAG_BOOLEAN); +} + +static inline jsval_layout +MAGIC_TO_JSVAL_IMPL(JSWhyMagic why) +{ + jsval_layout l; + l.asBits = ((uint64_t)(uint32_t)why) | JSVAL_SHIFTED_TAG_MAGIC; + return l; +} + +static inline jsval_layout +MAGIC_UINT32_TO_JSVAL_IMPL(uint32_t payload) +{ + jsval_layout l; + l.asBits = ((uint64_t)payload) | JSVAL_SHIFTED_TAG_MAGIC; + return l; +} + +static inline bool +JSVAL_SAME_TYPE_IMPL(jsval_layout lhs, jsval_layout rhs) +{ + uint64_t lbits = lhs.asBits, rbits = rhs.asBits; + return (lbits <= JSVAL_SHIFTED_TAG_MAX_DOUBLE && rbits <= JSVAL_SHIFTED_TAG_MAX_DOUBLE) || + (((lbits ^ rbits) & 0xFFFF800000000000LL) == 0); +} + +static inline JSValueType +JSVAL_EXTRACT_NON_DOUBLE_TYPE_IMPL(jsval_layout l) +{ + uint64_t type = (l.asBits >> JSVAL_TAG_SHIFT) & 0xF; + MOZ_ASSERT(type > JSVAL_TYPE_DOUBLE); + return (JSValueType)type; +} + +#endif /* JS_PUNBOX64 */ + +static inline bool +JSVAL_IS_TRACEABLE_IMPL(jsval_layout l) +{ + return JSVAL_IS_GCTHING_IMPL(l) && !JSVAL_IS_NULL_IMPL(l); +} + +static inline jsval_layout JSVAL_TO_IMPL(JS::Value v); +static inline JS_VALUE_CONSTEXPR JS::Value IMPL_TO_JSVAL(jsval_layout l); + +namespace JS { + +static inline JS_VALUE_CONSTEXPR JS::Value UndefinedValue(); + +/** + * Returns a generic quiet NaN value, with all payload bits set to zero. + * + * Among other properties, this NaN's bit pattern conforms to JS::Value's + * bit pattern restrictions. + */ +static MOZ_ALWAYS_INLINE double +GenericNaN() +{ + return mozilla::SpecificNaN(0, 0x8000000000000ULL); +} + +/* MSVC with PGO miscompiles this function. */ +#if defined(_MSC_VER) +# pragma optimize("g", off) +#endif +static inline double +CanonicalizeNaN(double d) +{ + if (MOZ_UNLIKELY(mozilla::IsNaN(d))) + return GenericNaN(); + return d; +} +#if defined(_MSC_VER) +# pragma optimize("", on) +#endif + +/* + * JS::Value is the interface for a single JavaScript Engine value. A few + * general notes on JS::Value: + * + * - JS::Value has setX() and isX() members for X in + * + * { Int32, Double, String, Symbol, Boolean, Undefined, Null, Object, Magic } + * + * JS::Value also contains toX() for each of the non-singleton types. + * + * - Magic is a singleton type whose payload contains either a JSWhyMagic "reason" for + * the magic value or a uint32_t value. By providing JSWhyMagic values when + * creating and checking for magic values, it is possible to assert, at + * runtime, that only magic values with the expected reason flow through a + * particular value. For example, if cx->exception has a magic value, the + * reason must be JS_GENERATOR_CLOSING. + * + * - The JS::Value operations are preferred. The JSVAL_* operations remain for + * compatibility; they may be removed at some point. These operations mostly + * provide similar functionality. But there are a few key differences. One + * is that JS::Value gives null a separate type. + * Also, to help prevent mistakenly boxing a nullable JSObject* as an object, + * Value::setObject takes a JSObject&. (Conversely, Value::toObject returns a + * JSObject&.) A convenience member Value::setObjectOrNull is provided. + * + * - JSVAL_VOID is the same as the singleton value of the Undefined type. + * + * - Note that JS::Value is 8 bytes on 32 and 64-bit architectures. Thus, on + * 32-bit user code should avoid copying jsval/JS::Value as much as possible, + * preferring to pass by const Value &. + */ +class Value +{ + public: + /* + * N.B. the default constructor leaves Value unitialized. Adding a default + * constructor prevents Value from being stored in a union. + */ +#if defined(JS_VALUE_IS_CONSTEXPR) + Value() = default; + Value(const Value& v) = default; +#endif + + /*** Mutators ***/ + + void setNull() { + data.asBits = BUILD_JSVAL(JSVAL_TAG_NULL, 0).asBits; + } + + void setUndefined() { + data.asBits = BUILD_JSVAL(JSVAL_TAG_UNDEFINED, 0).asBits; + } + + void setInt32(int32_t i) { + data = INT32_TO_JSVAL_IMPL(i); + } + + int32_t &getInt32Ref() { + MOZ_ASSERT(isInt32()); + return data.s.payload.i32; + } + + void setDouble(double d) { + data = DOUBLE_TO_JSVAL_IMPL(d); + } + + void setNaN() { + setDouble(GenericNaN()); + } + + double &getDoubleRef() { + MOZ_ASSERT(isDouble()); + return data.asDouble; + } + + void setString(JSString *str) { + MOZ_ASSERT(!IsPoisonedPtr(str)); + data = STRING_TO_JSVAL_IMPL(str); + } + + void setSymbol(JS::Symbol *sym) { + MOZ_ASSERT(!IsPoisonedPtr(sym)); + data = SYMBOL_TO_JSVAL_IMPL(sym); + } + + void setObject(JSObject &obj) { + MOZ_ASSERT(!IsPoisonedPtr(&obj)); + data = OBJECT_TO_JSVAL_IMPL(&obj); + } + + void setBoolean(bool b) { + data = BOOLEAN_TO_JSVAL_IMPL(b); + } + + void setMagic(JSWhyMagic why) { + data = MAGIC_TO_JSVAL_IMPL(why); + } + + void setMagicUint32(uint32_t payload) { + data = MAGIC_UINT32_TO_JSVAL_IMPL(payload); + } + + bool setNumber(uint32_t ui) { + if (ui > JSVAL_INT_MAX) { + setDouble((double)ui); + return false; + } else { + setInt32((int32_t)ui); + return true; + } + } + + bool setNumber(double d) { + int32_t i; + if (mozilla::NumberIsInt32(d, &i)) { + setInt32(i); + return true; + } + + setDouble(d); + return false; + } + + void setObjectOrNull(JSObject *arg) { + if (arg) + setObject(*arg); + else + setNull(); + } + + void swap(Value &rhs) { + uint64_t tmp = rhs.data.asBits; + rhs.data.asBits = data.asBits; + data.asBits = tmp; + } + + /*** Value type queries ***/ + + bool isUndefined() const { + return JSVAL_IS_UNDEFINED_IMPL(data); + } + + bool isNull() const { + return JSVAL_IS_NULL_IMPL(data); + } + + bool isNullOrUndefined() const { + return isNull() || isUndefined(); + } + + bool isInt32() const { + return JSVAL_IS_INT32_IMPL(data); + } + + bool isInt32(int32_t i32) const { + return JSVAL_IS_SPECIFIC_INT32_IMPL(data, i32); + } + + bool isDouble() const { + return JSVAL_IS_DOUBLE_IMPL(data); + } + + bool isNumber() const { + return JSVAL_IS_NUMBER_IMPL(data); + } + + bool isString() const { + return JSVAL_IS_STRING_IMPL(data); + } + + bool isSymbol() const { + return JSVAL_IS_SYMBOL_IMPL(data); + } + + bool isObject() const { + return JSVAL_IS_OBJECT_IMPL(data); + } + + bool isPrimitive() const { + return JSVAL_IS_PRIMITIVE_IMPL(data); + } + + bool isObjectOrNull() const { + return JSVAL_IS_OBJECT_OR_NULL_IMPL(data); + } + + bool isGCThing() const { + return JSVAL_IS_GCTHING_IMPL(data); + } + + bool isBoolean() const { + return JSVAL_IS_BOOLEAN_IMPL(data); + } + + bool isTrue() const { + return JSVAL_IS_SPECIFIC_BOOLEAN_IMPL(data, true); + } + + bool isFalse() const { + return JSVAL_IS_SPECIFIC_BOOLEAN_IMPL(data, false); + } + + bool isMagic() const { + return JSVAL_IS_MAGIC_IMPL(data); + } + + bool isMagic(JSWhyMagic why) const { + MOZ_ASSERT_IF(isMagic(), data.s.payload.why == why); + return JSVAL_IS_MAGIC_IMPL(data); + } + + bool isMarkable() const { + return JSVAL_IS_TRACEABLE_IMPL(data); + } + + JSGCTraceKind gcKind() const { + MOZ_ASSERT(isMarkable()); + return JSGCTraceKind(JSVAL_TRACE_KIND_IMPL(data)); + } + + JSWhyMagic whyMagic() const { + MOZ_ASSERT(isMagic()); + return data.s.payload.why; + } + + uint32_t magicUint32() const { + MOZ_ASSERT(isMagic()); + return data.s.payload.u32; + } + + /*** Comparison ***/ + + bool operator==(const Value &rhs) const { + return data.asBits == rhs.data.asBits; + } + + bool operator!=(const Value &rhs) const { + return data.asBits != rhs.data.asBits; + } + + friend inline bool SameType(const Value &lhs, const Value &rhs); + + /*** Extract the value's typed payload ***/ + + int32_t toInt32() const { + MOZ_ASSERT(isInt32()); + return JSVAL_TO_INT32_IMPL(data); + } + + double toDouble() const { + MOZ_ASSERT(isDouble()); + return data.asDouble; + } + + double toNumber() const { + MOZ_ASSERT(isNumber()); + return isDouble() ? toDouble() : double(toInt32()); + } + + JSString *toString() const { + MOZ_ASSERT(isString()); + return JSVAL_TO_STRING_IMPL(data); + } + + JS::Symbol *toSymbol() const { + MOZ_ASSERT(isSymbol()); + return JSVAL_TO_SYMBOL_IMPL(data); + } + + JSObject &toObject() const { + MOZ_ASSERT(isObject()); + return *JSVAL_TO_OBJECT_IMPL(data); + } + + JSObject *toObjectOrNull() const { + MOZ_ASSERT(isObjectOrNull()); + return JSVAL_TO_OBJECT_IMPL(data); + } + + js::gc::Cell *toGCThing() const { + MOZ_ASSERT(isGCThing()); + return JSVAL_TO_GCTHING_IMPL(data); + } + + bool toBoolean() const { + MOZ_ASSERT(isBoolean()); + return JSVAL_TO_BOOLEAN_IMPL(data); + } + + uint32_t payloadAsRawUint32() const { + MOZ_ASSERT(!isDouble()); + return data.s.payload.u32; + } + + uint64_t asRawBits() const { + return data.asBits; + } + + JSValueType extractNonDoubleType() const { + return JSVAL_EXTRACT_NON_DOUBLE_TYPE_IMPL(data); + } + + /* + * Private API + * + * Private setters/getters allow the caller to read/write arbitrary types + * that fit in the 64-bit payload. It is the caller's responsibility, after + * storing to a value with setPrivateX to read only using getPrivateX. + * Privates values are given a type which ensures they are not marked. + */ + + void setPrivate(void *ptr) { + data = PRIVATE_PTR_TO_JSVAL_IMPL(ptr); + } + + void *toPrivate() const { + MOZ_ASSERT(JSVAL_IS_DOUBLE_IMPL(data)); + return JSVAL_TO_PRIVATE_PTR_IMPL(data); + } + + void setPrivateUint32(uint32_t ui) { + MOZ_ASSERT(uint32_t(int32_t(ui)) == ui); + setInt32(int32_t(ui)); + } + + uint32_t toPrivateUint32() const { + return uint32_t(toInt32()); + } + + /* + * An unmarked value is just a void* cast as a Value. Thus, the Value is + * not safe for GC and must not be marked. This API avoids raw casts + * and the ensuing strict-aliasing warnings. + */ + + void setUnmarkedPtr(void *ptr) { + data.asPtr = ptr; + } + + void *toUnmarkedPtr() const { + return data.asPtr; + } + + const size_t *payloadWord() const { +#if defined(JS_NUNBOX32) + return &data.s.payload.word; +#elif defined(JS_PUNBOX64) + return &data.asWord; +#endif + } + + const uintptr_t *payloadUIntPtr() const { +#if defined(JS_NUNBOX32) + return &data.s.payload.uintptr; +#elif defined(JS_PUNBOX64) + return &data.asUIntPtr; +#endif + } + +#if !defined(_MSC_VER) && !defined(__sparc) + // Value must be POD so that MSVC will pass it by value and not in memory + // (bug 689101); the same is true for SPARC as well (bug 737344). More + // precisely, we don't want Value return values compiled as out params. + private: +#endif + + jsval_layout data; + + private: +#if defined(JS_VALUE_IS_CONSTEXPR) + MOZ_IMPLICIT JS_VALUE_CONSTEXPR Value(jsval_layout layout) : data(layout) {} +#endif + + void staticAssertions() { + JS_STATIC_ASSERT(sizeof(JSValueType) == 1); + JS_STATIC_ASSERT(sizeof(JSValueTag) == 4); + JS_STATIC_ASSERT(sizeof(JSWhyMagic) <= 4); + //this is a workaround for fixing binding-generator errors + JS_STATIC_ASSERT(sizeof(Value) == 8); + } + + friend jsval_layout (::JSVAL_TO_IMPL)(Value); + friend Value JS_VALUE_CONSTEXPR (::IMPL_TO_JSVAL)(jsval_layout l); + friend Value JS_VALUE_CONSTEXPR (JS::UndefinedValue)(); +}; + +inline bool +IsPoisonedValue(const Value &v) +{ + if (v.isString()) + return IsPoisonedPtr(v.toString()); + if (v.isSymbol()) + return IsPoisonedPtr(v.toSymbol()); + if (v.isObject()) + return IsPoisonedPtr(&v.toObject()); + return false; +} + +inline bool +IsOptimizedPlaceholderMagicValue(const Value &v) +{ + if (v.isMagic()) { + MOZ_ASSERT(v.whyMagic() == JS_OPTIMIZED_ARGUMENTS || v.whyMagic() == JS_OPTIMIZED_OUT); + return true; + } + return false; +} + +static MOZ_ALWAYS_INLINE void +ExposeValueToActiveJS(const Value &v) +{ + if (v.isMarkable()) + ExposeGCThingToActiveJS(v.toGCThing(), v.gcKind()); +} + +/************************************************************************/ + +static inline Value +NullValue() +{ + Value v; + v.setNull(); + return v; +} + +static inline JS_VALUE_CONSTEXPR Value +UndefinedValue() +{ +#if defined(JS_VALUE_IS_CONSTEXPR) + return Value(BUILD_JSVAL(JSVAL_TAG_UNDEFINED, 0)); +#else + JS::Value v; + v.setUndefined(); + return v; +#endif +} + +static inline Value +Int32Value(int32_t i32) +{ + Value v; + v.setInt32(i32); + return v; +} + +static inline Value +DoubleValue(double dbl) +{ + Value v; + v.setDouble(dbl); + return v; +} + +static inline Value +DoubleNaNValue() +{ + Value v; + v.setNaN(); + return v; +} + +static inline Value +Float32Value(float f) +{ + Value v; + v.setDouble(f); + return v; +} + +static inline Value +StringValue(JSString *str) +{ + Value v; + v.setString(str); + return v; +} + +static inline Value +SymbolValue(JS::Symbol *sym) +{ + Value v; + v.setSymbol(sym); + return v; +} + +static inline Value +BooleanValue(bool boo) +{ + Value v; + v.setBoolean(boo); + return v; +} + +static inline Value +TrueValue() +{ + Value v; + v.setBoolean(true); + return v; +} + +static inline Value +FalseValue() +{ + Value v; + v.setBoolean(false); + return v; +} + +static inline Value +ObjectValue(JSObject &obj) +{ + Value v; + v.setObject(obj); + return v; +} + +static inline Value +ObjectValueCrashOnTouch() +{ + Value v; + v.setObject(*reinterpret_cast(0x42)); + return v; +} + +static inline Value +MagicValue(JSWhyMagic why) +{ + Value v; + v.setMagic(why); + return v; +} + +static inline Value +MagicValueUint32(uint32_t payload) +{ + Value v; + v.setMagicUint32(payload); + return v; +} + +static inline Value +NumberValue(float f) +{ + Value v; + v.setNumber(f); + return v; +} + +static inline Value +NumberValue(double dbl) +{ + Value v; + v.setNumber(dbl); + return v; +} + +static inline Value +NumberValue(int8_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(uint8_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(int16_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(uint16_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(int32_t i) +{ + return Int32Value(i); +} + +static inline Value +NumberValue(uint32_t i) +{ + Value v; + v.setNumber(i); + return v; +} + +namespace detail { + +template +class MakeNumberValue +{ + public: + template + static inline Value create(const T t) + { + Value v; + if (JSVAL_INT_MIN <= t && t <= JSVAL_INT_MAX) + v.setInt32(int32_t(t)); + else + v.setDouble(double(t)); + return v; + } +}; + +template <> +class MakeNumberValue +{ + public: + template + static inline Value create(const T t) + { + Value v; + if (t <= JSVAL_INT_MAX) + v.setInt32(int32_t(t)); + else + v.setDouble(double(t)); + return v; + } +}; + +} // namespace detail + +template +static inline Value +NumberValue(const T t) +{ + MOZ_ASSERT(T(double(t)) == t, "value creation would be lossy"); + return detail::MakeNumberValue::is_signed>::create(t); +} + +static inline Value +ObjectOrNullValue(JSObject *obj) +{ + Value v; + v.setObjectOrNull(obj); + return v; +} + +static inline Value +PrivateValue(void *ptr) +{ + Value v; + v.setPrivate(ptr); + return v; +} + +static inline Value +PrivateUint32Value(uint32_t ui) +{ + Value v; + v.setPrivateUint32(ui); + return v; +} + +inline bool +SameType(const Value &lhs, const Value &rhs) +{ + return JSVAL_SAME_TYPE_IMPL(lhs.data, rhs.data); +} + +} // namespace JS + +/************************************************************************/ + +#ifdef JSGC_GENERATIONAL +namespace JS { +JS_PUBLIC_API(void) HeapValuePostBarrier(Value *valuep); +JS_PUBLIC_API(void) HeapValueRelocate(Value *valuep); +} +#endif + +namespace js { + +template <> struct GCMethods +{ + static JS::Value initial() { return JS::UndefinedValue(); } + static bool poisoned(const JS::Value &v) { return JS::IsPoisonedValue(v); } +}; + +template <> struct GCMethods +{ + static JS::Value initial() { return JS::UndefinedValue(); } + static bool poisoned(const JS::Value &v) { return JS::IsPoisonedValue(v); } + static bool needsPostBarrier(const JS::Value &v) { + return v.isObject() && gc::IsInsideNursery(reinterpret_cast(&v.toObject())); + } +#ifdef JSGC_GENERATIONAL + static void postBarrier(JS::Value *v) { JS::HeapValuePostBarrier(v); } + static void relocate(JS::Value *v) { JS::HeapValueRelocate(v); } +#endif +}; + +template class MutableValueOperations; + +/* + * A class designed for CRTP use in implementing the non-mutating parts of the + * Value interface in Value-like classes. Outer must be a class inheriting + * ValueOperations with a visible extract() method returning the + * const Value* abstracted by Outer. + */ +template +class ValueOperations +{ + friend class MutableValueOperations; + + const JS::Value * value() const { return static_cast(this)->extract(); } + + public: + bool isUndefined() const { return value()->isUndefined(); } + bool isNull() const { return value()->isNull(); } + bool isBoolean() const { return value()->isBoolean(); } + bool isTrue() const { return value()->isTrue(); } + bool isFalse() const { return value()->isFalse(); } + bool isNumber() const { return value()->isNumber(); } + bool isInt32() const { return value()->isInt32(); } + bool isDouble() const { return value()->isDouble(); } + bool isString() const { return value()->isString(); } + bool isSymbol() const { return value()->isSymbol(); } + bool isObject() const { return value()->isObject(); } + bool isMagic() const { return value()->isMagic(); } + bool isMagic(JSWhyMagic why) const { return value()->isMagic(why); } + bool isMarkable() const { return value()->isMarkable(); } + bool isPrimitive() const { return value()->isPrimitive(); } + bool isGCThing() const { return value()->isGCThing(); } + + bool isNullOrUndefined() const { return value()->isNullOrUndefined(); } + bool isObjectOrNull() const { return value()->isObjectOrNull(); } + + bool toBoolean() const { return value()->toBoolean(); } + double toNumber() const { return value()->toNumber(); } + int32_t toInt32() const { return value()->toInt32(); } + double toDouble() const { return value()->toDouble(); } + JSString *toString() const { return value()->toString(); } + JS::Symbol *toSymbol() const { return value()->toSymbol(); } + JSObject &toObject() const { return value()->toObject(); } + JSObject *toObjectOrNull() const { return value()->toObjectOrNull(); } + void *toGCThing() const { return value()->toGCThing(); } + uint64_t asRawBits() const { return value()->asRawBits(); } + + JSValueType extractNonDoubleType() const { return value()->extractNonDoubleType(); } + uint32_t toPrivateUint32() const { return value()->toPrivateUint32(); } + + JSWhyMagic whyMagic() const { return value()->whyMagic(); } + uint32_t magicUint32() const { return value()->magicUint32(); } +}; + +/* + * A class designed for CRTP use in implementing all the mutating parts of the + * Value interface in Value-like classes. Outer must be a class inheriting + * MutableValueOperations with visible extractMutable() and extract() + * methods returning the const Value* and Value* abstracted by Outer. + */ +template +class MutableValueOperations : public ValueOperations +{ + JS::Value * value() { return static_cast(this)->extractMutable(); } + + public: + void setNull() { value()->setNull(); } + void setUndefined() { value()->setUndefined(); } + void setInt32(int32_t i) { value()->setInt32(i); } + void setDouble(double d) { value()->setDouble(d); } + void setNaN() { setDouble(JS::GenericNaN()); } + void setBoolean(bool b) { value()->setBoolean(b); } + void setMagic(JSWhyMagic why) { value()->setMagic(why); } + bool setNumber(uint32_t ui) { return value()->setNumber(ui); } + bool setNumber(double d) { return value()->setNumber(d); } + void setString(JSString *str) { this->value()->setString(str); } + void setSymbol(JS::Symbol *sym) { this->value()->setSymbol(sym); } + void setObject(JSObject &obj) { this->value()->setObject(obj); } + void setObjectOrNull(JSObject *arg) { this->value()->setObjectOrNull(arg); } +}; + +/* + * Augment the generic Heap interface when T = Value with + * type-querying, value-extracting, and mutating operations. + */ +template <> +class HeapBase : public ValueOperations > +{ + typedef JS::Heap Outer; + + friend class ValueOperations; + + const JS::Value * extract() const { return static_cast(this)->address(); } + + void setBarriered(const JS::Value &v) { + static_cast *>(this)->set(v); + } + + public: + void setNull() { setBarriered(JS::NullValue()); } + void setUndefined() { setBarriered(JS::UndefinedValue()); } + void setInt32(int32_t i) { setBarriered(JS::Int32Value(i)); } + void setDouble(double d) { setBarriered(JS::DoubleValue(d)); } + void setNaN() { setDouble(JS::GenericNaN()); } + void setBoolean(bool b) { setBarriered(JS::BooleanValue(b)); } + void setMagic(JSWhyMagic why) { setBarriered(JS::MagicValue(why)); } + void setString(JSString *str) { setBarriered(JS::StringValue(str)); } + void setSymbol(JS::Symbol *sym) { setBarriered(JS::SymbolValue(sym)); } + void setObject(JSObject &obj) { setBarriered(JS::ObjectValue(obj)); } + + bool setNumber(uint32_t ui) { + if (ui > JSVAL_INT_MAX) { + setDouble((double)ui); + return false; + } else { + setInt32((int32_t)ui); + return true; + } + } + + bool setNumber(double d) { + int32_t i; + if (mozilla::NumberIsInt32(d, &i)) { + setInt32(i); + return true; + } + + setDouble(d); + return false; + } + + void setObjectOrNull(JSObject *arg) { + if (arg) + setObject(*arg); + else + setNull(); + } +}; + +/* + * Augment the generic Handle interface when T = Value with type-querying + * and value-extracting operations. + */ +template <> +class HandleBase : public ValueOperations > +{ + friend class ValueOperations >; + const JS::Value * extract() const { + return static_cast*>(this)->address(); + } +}; + +/* + * Augment the generic MutableHandle interface when T = Value with + * type-querying, value-extracting, and mutating operations. + */ +template <> +class MutableHandleBase : public MutableValueOperations > +{ + friend class ValueOperations >; + const JS::Value * extract() const { + return static_cast*>(this)->address(); + } + + friend class MutableValueOperations >; + JS::Value * extractMutable() { + return static_cast*>(this)->address(); + } +}; + +/* + * Augment the generic Rooted interface when T = Value with type-querying, + * value-extracting, and mutating operations. + */ +template <> +class RootedBase : public MutableValueOperations > +{ + friend class ValueOperations >; + const JS::Value * extract() const { + return static_cast*>(this)->address(); + } + + friend class MutableValueOperations >; + JS::Value * extractMutable() { + return static_cast*>(this)->address(); + } +}; + +} // namespace js + +inline jsval_layout +JSVAL_TO_IMPL(JS::Value v) +{ + return v.data; +} + +inline JS_VALUE_CONSTEXPR JS::Value +IMPL_TO_JSVAL(jsval_layout l) +{ +#if defined(JS_VALUE_IS_CONSTEXPR) + return JS::Value(l); +#else + JS::Value v; + v.data = l; + return v; +#endif +} + +namespace JS { + +#ifndef __GNUC__ +/* + * The default assignment operator for |struct C| has the signature: + * + * C& C::operator=(const C&) + * + * And in particular requires implicit conversion of |this| to type |C| for the + * return value. But |volatile C| cannot thus be converted to |C|, so just + * doing |sink = hold| as in the non-specialized version would fail to compile. + * Do the assignment on asBits instead, since I don't think we want to give + * jsval_layout an assignment operator returning |volatile jsval_layout|. + */ +template<> +inline Anchor::~Anchor() +{ + volatile uint64_t bits; + bits = JSVAL_TO_IMPL(hold).asBits; +} +#endif + +#ifdef JS_DEBUG +namespace detail { + +struct ValueAlignmentTester { char c; JS::Value v; }; +static_assert(sizeof(ValueAlignmentTester) == 16, + "JS::Value must be 16-byte-aligned"); + +struct LayoutAlignmentTester { char c; jsval_layout l; }; +static_assert(sizeof(LayoutAlignmentTester) == 16, + "jsval_layout must be 16-byte-aligned"); + +} // namespace detail +#endif /* JS_DEBUG */ + +} // namespace JS + +/* + * JS::Value and jsval are the same type; jsval is the old name, kept around + * for backwards compatibility along with all the JSVAL_* operations below. + * jsval_layout is an implementation detail and should not be used externally. + */ +typedef JS::Value jsval; + +static_assert(sizeof(jsval_layout) == sizeof(JS::Value), + "jsval_layout and JS::Value must have identical layouts"); + +/************************************************************************/ + +static inline JS_VALUE_CONSTEXPR jsval +INT_TO_JSVAL(int32_t i) +{ + return IMPL_TO_JSVAL(INT32_TO_JSVAL_IMPL(i)); +} + +static inline JS_VALUE_CONSTEXPR jsval +DOUBLE_TO_JSVAL(double d) +{ + /* + * This is a manually inlined version of: + * d = JS_CANONICALIZE_NAN(d); + * return IMPL_TO_JSVAL(DOUBLE_TO_JSVAL_IMPL(d)); + * because GCC from XCode 3.1.4 miscompiles the above code. + */ +#if defined(JS_VALUE_IS_CONSTEXPR) + return IMPL_TO_JSVAL(MOZ_UNLIKELY(d != d) + ? (jsval_layout) { .asBits = 0x7FF8000000000000LL } + : (jsval_layout) { .asDouble = d }); +#else + jsval_layout l; + if (MOZ_UNLIKELY(d != d)) + l.asBits = 0x7FF8000000000000LL; + else + l.asDouble = d; + return IMPL_TO_JSVAL(l); +#endif +} + +static inline JS_VALUE_CONSTEXPR jsval +UINT_TO_JSVAL(uint32_t i) +{ + return (i <= JSVAL_INT_MAX + ? INT_TO_JSVAL((int32_t)i) + : DOUBLE_TO_JSVAL((double)i)); +} + +static inline jsval +STRING_TO_JSVAL(JSString *str) +{ + return IMPL_TO_JSVAL(STRING_TO_JSVAL_IMPL(str)); +} + +static inline jsval +OBJECT_TO_JSVAL(JSObject *obj) +{ + if (obj) + return IMPL_TO_JSVAL(OBJECT_TO_JSVAL_IMPL(obj)); + return IMPL_TO_JSVAL(BUILD_JSVAL(JSVAL_TAG_NULL, 0)); +} + +static inline jsval +BOOLEAN_TO_JSVAL(bool b) +{ + return IMPL_TO_JSVAL(BOOLEAN_TO_JSVAL_IMPL(b)); +} + +/* To be GC-safe, privates are tagged as doubles. */ + +static inline jsval +PRIVATE_TO_JSVAL(void *ptr) +{ + return IMPL_TO_JSVAL(PRIVATE_PTR_TO_JSVAL_IMPL(ptr)); +} + +// JS constants. For efficiency, prefer predicates (e.g. v.isNull()) and +// constructing values from scratch (e.g. Int32Value(0)). These constants are +// stored in memory and initialized at startup, so testing against them and +// using them requires memory loads and will be correspondingly slow. +extern JS_PUBLIC_DATA(const jsval) JSVAL_NULL; +extern JS_PUBLIC_DATA(const jsval) JSVAL_ZERO; +extern JS_PUBLIC_DATA(const jsval) JSVAL_ONE; +extern JS_PUBLIC_DATA(const jsval) JSVAL_FALSE; +extern JS_PUBLIC_DATA(const jsval) JSVAL_TRUE; +extern JS_PUBLIC_DATA(const jsval) JSVAL_VOID; + +namespace JS { + +extern JS_PUBLIC_DATA(const HandleValue) NullHandleValue; +extern JS_PUBLIC_DATA(const HandleValue) UndefinedHandleValue; +extern JS_PUBLIC_DATA(const HandleValue) TrueHandleValue; +extern JS_PUBLIC_DATA(const HandleValue) FalseHandleValue; + +} + +#undef JS_VALUE_IS_CONSTEXPR +#undef JS_RETURN_LAYOUT_FROM_BITS + +#endif /* js_Value_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Vector.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Vector.h new file mode 100644 index 0000000000..a2d24b10ed --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/Vector.h @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_Vector_h +#define js_Vector_h + +#include "mozilla/Vector.h" + +/* Silence dire "bugs in previous versions of MSVC have been fixed" warnings */ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4345) +#endif + +namespace js { + +class TempAllocPolicy; + +// If we had C++11 template aliases, we could just use this: +// +// template +// using Vector = mozilla::Vector; +// +// ...and get rid of all the CRTP madness in mozilla::Vector(Base). But we +// can't because compiler support's not up to snuff. (Template aliases are in +// gcc 4.7 and clang 3.0 and are expected to be in MSVC 2013.) Instead, have a +// completely separate class inheriting from mozilla::Vector, and throw CRTP at +// the problem til things work. +// +// This workaround presents a couple issues. First, because js::Vector is a +// distinct type from mozilla::Vector, overload resolution, method calls, etc. +// are affected. *Hopefully* this won't be too bad in practice. (A bunch of +// places had to be fixed when mozilla::Vector was introduced, but it wasn't a +// crazy number.) Second, mozilla::Vector's interface has to be made subclass- +// ready via CRTP -- or rather, via mozilla::VectorBase, which basically no one +// should use. :-) Third, we have to redefine the constructors and the non- +// inherited operators. Blech. Happily there aren't too many of these, so it +// isn't the end of the world. + +template +class Vector + : public mozilla::VectorBase > +{ + typedef typename mozilla::VectorBase Base; + + public: + explicit Vector(AllocPolicy alloc = AllocPolicy()) : Base(alloc) {} + Vector(Vector &&vec) : Base(mozilla::Move(vec)) {} + Vector &operator=(Vector &&vec) { + return Base::operator=(mozilla::Move(vec)); + } +}; + +} // namespace js + +#endif /* js_Vector_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/js/WeakMapPtr.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/WeakMapPtr.h new file mode 100644 index 0000000000..f5822bef4b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/js/WeakMapPtr.h @@ -0,0 +1,48 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef js_WeakMapPtr_h +#define js_WeakMapPtr_h + +#include "jspubtd.h" + +#include "js/TypeDecls.h" + +namespace JS { + +// A wrapper around the internal C++ representation of SpiderMonkey WeakMaps, +// usable outside the engine. +// +// The supported template specializations are enumerated in WeakMapPtr.cpp. If +// you want to use this class for a different key/value combination, add it to +// the list and the compiler will generate the relevant machinery. +template +class JS_PUBLIC_API(WeakMapPtr) +{ + public: + WeakMapPtr() : ptr(nullptr) {}; + bool init(JSContext *cx); + bool initialized() { return ptr != nullptr; }; + void destroy(); + virtual ~WeakMapPtr() { MOZ_ASSERT(!initialized()); } + void trace(JSTracer *tracer); + + V lookup(const K &key); + bool put(JSContext *cx, const K &key, const V &value); + + static void keyMarkCallback(JSTracer *trc, K key, void *data); + + private: + void *ptr; + + // WeakMapPtr is neither copyable nor assignable. + WeakMapPtr(const WeakMapPtr &wmp) MOZ_DELETE; + WeakMapPtr &operator=(const WeakMapPtr &wmp) MOZ_DELETE; +}; + +} /* namespace JS */ + +#endif /* js_WeakMapPtr_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsalloc.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsalloc.h new file mode 100644 index 0000000000..a1e547cec9 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsalloc.h @@ -0,0 +1,88 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * JS allocation policies. + * + * The allocators here are for system memory with lifetimes which are not + * managed by the GC. See the comment at the top of vm/MallocProvider.h. + */ + +#ifndef jsalloc_h +#define jsalloc_h + +#include "js/TypeDecls.h" +#include "js/Utility.h" + +namespace js { + +struct ContextFriendFields; + +/* Policy for using system memory functions and doing no error reporting. */ +class SystemAllocPolicy +{ + public: + void *malloc_(size_t bytes) { return js_malloc(bytes); } + void *calloc_(size_t bytes) { return js_calloc(bytes); } + void *realloc_(void *p, size_t oldBytes, size_t bytes) { return js_realloc(p, bytes); } + void free_(void *p) { js_free(p); } + void reportAllocOverflow() const {} +}; + +/* + * Allocation policy that calls the system memory functions and reports errors + * to the context. Since the JSContext given on construction is stored for + * the lifetime of the container, this policy may only be used for containers + * whose lifetime is a shorter than the given JSContext. + * + * FIXME bug 647103 - rewrite this in terms of temporary allocation functions, + * not the system ones. + */ +class TempAllocPolicy +{ + ContextFriendFields *const cx_; + + /* + * Non-inline helper to call JSRuntime::onOutOfMemory with minimal + * code bloat. + */ + JS_FRIEND_API(void *) onOutOfMemory(void *p, size_t nbytes); + + public: + MOZ_IMPLICIT TempAllocPolicy(JSContext *cx) : cx_((ContextFriendFields *) cx) {} // :( + MOZ_IMPLICIT TempAllocPolicy(ContextFriendFields *cx) : cx_(cx) {} + + void *malloc_(size_t bytes) { + void *p = js_malloc(bytes); + if (MOZ_UNLIKELY(!p)) + p = onOutOfMemory(nullptr, bytes); + return p; + } + + void *calloc_(size_t bytes) { + void *p = js_calloc(bytes); + if (MOZ_UNLIKELY(!p)) + p = onOutOfMemory(nullptr, bytes); + return p; + } + + void *realloc_(void *p, size_t oldBytes, size_t bytes) { + void *p2 = js_realloc(p, bytes); + if (MOZ_UNLIKELY(!p2)) + p2 = onOutOfMemory(p2, bytes); + return p2; + } + + void free_(void *p) { + js_free(p); + } + + JS_FRIEND_API(void) reportAllocOverflow() const; +}; + +} /* namespace js */ + +#endif /* jsalloc_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsapi.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsapi.h new file mode 100644 index 0000000000..4b5a4ce1ff --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsapi.h @@ -0,0 +1,5249 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* JavaScript API. */ + +#ifndef jsapi_h +#define jsapi_h + +#include "mozilla/FloatingPoint.h" +#include "mozilla/MemoryReporting.h" +#include "mozilla/Range.h" +#include "mozilla/RangedPtr.h" +#include "mozilla/TypedEnum.h" + +#include +#include +#include +#include + +#include "jsalloc.h" +#include "jspubtd.h" + +#include "js/CallArgs.h" +#include "js/Class.h" +#include "js/HashTable.h" +#include "js/Id.h" +#include "js/Principals.h" +#include "js/RootingAPI.h" +#include "js/TracingAPI.h" +#include "js/Utility.h" +#include "js/Value.h" +#include "js/Vector.h" + +/************************************************************************/ + +namespace JS { + +class Latin1CharsZ; +class TwoByteChars; + +#if defined JS_THREADSAFE && defined JS_DEBUG + +class JS_PUBLIC_API(AutoCheckRequestDepth) +{ + JSContext *cx; + public: + explicit AutoCheckRequestDepth(JSContext *cx); + explicit AutoCheckRequestDepth(js::ContextFriendFields *cx); + ~AutoCheckRequestDepth(); +}; + +# define CHECK_REQUEST(cx) \ + JS::AutoCheckRequestDepth _autoCheckRequestDepth(cx) + +#else + +# define CHECK_REQUEST(cx) \ + ((void) 0) + +#endif /* JS_THREADSAFE && JS_DEBUG */ + +#ifdef JS_DEBUG +/* + * Assert that we're not doing GC on cx, that we're in a request as + * needed, and that the compartments for cx and v are correct. + * Also check that GC would be safe at this point. + */ +JS_PUBLIC_API(void) +AssertArgumentsAreSane(JSContext *cx, JS::HandleValue v); +#else +inline void AssertArgumentsAreSane(JSContext *cx, JS::HandleValue v) { + /* Do nothing */ +} +#endif /* JS_DEBUG */ + +/* AutoValueArray roots an internal fixed-size array of Values. */ +template +class AutoValueArray : public AutoGCRooter +{ + const size_t length_; + Value elements_[N]; + + public: + explicit AutoValueArray(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoGCRooter(cx, VALARRAY), length_(N) + { + /* Always initialize in case we GC before assignment. */ + mozilla::PodArrayZero(elements_); + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + unsigned length() const { return length_; } + const Value *begin() const { return elements_; } + Value *begin() { return elements_; } + + HandleValue operator[](unsigned i) const { + JS_ASSERT(i < N); + return HandleValue::fromMarkedLocation(&elements_[i]); + } + MutableHandleValue operator[](unsigned i) { + JS_ASSERT(i < N); + return MutableHandleValue::fromMarkedLocation(&elements_[i]); + } + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +template +class AutoVectorRooter : protected AutoGCRooter +{ + typedef js::Vector VectorImpl; + VectorImpl vector; + + public: + explicit AutoVectorRooter(JSContext *cx, ptrdiff_t tag + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoGCRooter(cx, tag), vector(cx) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + explicit AutoVectorRooter(js::ContextFriendFields *cx, ptrdiff_t tag + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoGCRooter(cx, tag), vector(cx) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + typedef T ElementType; + typedef typename VectorImpl::Range Range; + + size_t length() const { return vector.length(); } + bool empty() const { return vector.empty(); } + + bool append(const T &v) { return vector.append(v); } + bool append(const T *ptr, size_t len) { return vector.append(ptr, len); } + bool appendAll(const AutoVectorRooter &other) { + return vector.appendAll(other.vector); + } + + bool insert(T *p, const T &val) { return vector.insert(p, val); } + + /* For use when space has already been reserved. */ + void infallibleAppend(const T &v) { vector.infallibleAppend(v); } + + void popBack() { vector.popBack(); } + T popCopy() { return vector.popCopy(); } + + bool growBy(size_t inc) { + size_t oldLength = vector.length(); + if (!vector.growByUninitialized(inc)) + return false; + makeRangeGCSafe(oldLength); + return true; + } + + bool resize(size_t newLength) { + size_t oldLength = vector.length(); + if (newLength <= oldLength) { + vector.shrinkBy(oldLength - newLength); + return true; + } + if (!vector.growByUninitialized(newLength - oldLength)) + return false; + makeRangeGCSafe(oldLength); + return true; + } + + void clear() { vector.clear(); } + + bool reserve(size_t newLength) { + return vector.reserve(newLength); + } + + JS::MutableHandle operator[](size_t i) { + return JS::MutableHandle::fromMarkedLocation(&vector[i]); + } + JS::Handle operator[](size_t i) const { + return JS::Handle::fromMarkedLocation(&vector[i]); + } + + const T *begin() const { return vector.begin(); } + T *begin() { return vector.begin(); } + + const T *end() const { return vector.end(); } + T *end() { return vector.end(); } + + Range all() { return vector.all(); } + + const T &back() const { return vector.back(); } + + friend void AutoGCRooter::trace(JSTracer *trc); + + private: + void makeRangeGCSafe(size_t oldLength) { + T *t = vector.begin() + oldLength; + for (size_t i = oldLength; i < vector.length(); ++i, ++t) + memset(t, 0, sizeof(T)); + } + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +template +class AutoHashMapRooter : protected AutoGCRooter +{ + private: + typedef js::HashMap HashMapImpl; + + public: + explicit AutoHashMapRooter(JSContext *cx, ptrdiff_t tag + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoGCRooter(cx, tag), map(cx) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + typedef Key KeyType; + typedef Value ValueType; + typedef typename HashMapImpl::Entry Entry; + typedef typename HashMapImpl::Lookup Lookup; + typedef typename HashMapImpl::Ptr Ptr; + typedef typename HashMapImpl::AddPtr AddPtr; + + bool init(uint32_t len = 16) { + return map.init(len); + } + bool initialized() const { + return map.initialized(); + } + Ptr lookup(const Lookup &l) const { + return map.lookup(l); + } + void remove(Ptr p) { + map.remove(p); + } + AddPtr lookupForAdd(const Lookup &l) const { + return map.lookupForAdd(l); + } + + template + bool add(AddPtr &p, const KeyInput &k, const ValueInput &v) { + return map.add(p, k, v); + } + + bool add(AddPtr &p, const Key &k) { + return map.add(p, k); + } + + template + bool relookupOrAdd(AddPtr &p, const KeyInput &k, const ValueInput &v) { + return map.relookupOrAdd(p, k, v); + } + + typedef typename HashMapImpl::Range Range; + Range all() const { + return map.all(); + } + + typedef typename HashMapImpl::Enum Enum; + + void clear() { + map.clear(); + } + + void finish() { + map.finish(); + } + + bool empty() const { + return map.empty(); + } + + uint32_t count() const { + return map.count(); + } + + size_t capacity() const { + return map.capacity(); + } + + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return map.sizeOfExcludingThis(mallocSizeOf); + } + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return map.sizeOfIncludingThis(mallocSizeOf); + } + + uint32_t generation() const { + return map.generation(); + } + + /************************************************** Shorthand operations */ + + bool has(const Lookup &l) const { + return map.has(l); + } + + template + bool put(const KeyInput &k, const ValueInput &v) { + return map.put(k, v); + } + + template + bool putNew(const KeyInput &k, const ValueInput &v) { + return map.putNew(k, v); + } + + Ptr lookupWithDefault(const Key &k, const Value &defaultValue) { + return map.lookupWithDefault(k, defaultValue); + } + + void remove(const Lookup &l) { + map.remove(l); + } + + friend void AutoGCRooter::trace(JSTracer *trc); + + private: + AutoHashMapRooter(const AutoHashMapRooter &hmr) MOZ_DELETE; + AutoHashMapRooter &operator=(const AutoHashMapRooter &hmr) MOZ_DELETE; + + HashMapImpl map; + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +template +class AutoHashSetRooter : protected AutoGCRooter +{ + private: + typedef js::HashSet HashSetImpl; + + public: + explicit AutoHashSetRooter(JSContext *cx, ptrdiff_t tag + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoGCRooter(cx, tag), set(cx) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + typedef typename HashSetImpl::Lookup Lookup; + typedef typename HashSetImpl::Ptr Ptr; + typedef typename HashSetImpl::AddPtr AddPtr; + + bool init(uint32_t len = 16) { + return set.init(len); + } + bool initialized() const { + return set.initialized(); + } + Ptr lookup(const Lookup &l) const { + return set.lookup(l); + } + void remove(Ptr p) { + set.remove(p); + } + AddPtr lookupForAdd(const Lookup &l) const { + return set.lookupForAdd(l); + } + + bool add(AddPtr &p, const T &t) { + return set.add(p, t); + } + + bool relookupOrAdd(AddPtr &p, const Lookup &l, const T &t) { + return set.relookupOrAdd(p, l, t); + } + + typedef typename HashSetImpl::Range Range; + Range all() const { + return set.all(); + } + + typedef typename HashSetImpl::Enum Enum; + + void clear() { + set.clear(); + } + + void finish() { + set.finish(); + } + + bool empty() const { + return set.empty(); + } + + uint32_t count() const { + return set.count(); + } + + size_t capacity() const { + return set.capacity(); + } + + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return set.sizeOfExcludingThis(mallocSizeOf); + } + size_t sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const { + return set.sizeOfIncludingThis(mallocSizeOf); + } + + uint32_t generation() const { + return set.generation(); + } + + /************************************************** Shorthand operations */ + + bool has(const Lookup &l) const { + return set.has(l); + } + + bool put(const T &t) { + return set.put(t); + } + + bool putNew(const T &t) { + return set.putNew(t); + } + + void remove(const Lookup &l) { + set.remove(l); + } + + friend void AutoGCRooter::trace(JSTracer *trc); + + private: + AutoHashSetRooter(const AutoHashSetRooter &hmr) MOZ_DELETE; + AutoHashSetRooter &operator=(const AutoHashSetRooter &hmr) MOZ_DELETE; + + HashSetImpl set; + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +class MOZ_STACK_CLASS AutoValueVector : public AutoVectorRooter +{ + public: + explicit AutoValueVector(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoVectorRooter(cx, VALVECTOR) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +class AutoIdVector : public AutoVectorRooter +{ + public: + explicit AutoIdVector(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoVectorRooter(cx, IDVECTOR) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +class AutoObjectVector : public AutoVectorRooter +{ + public: + explicit AutoObjectVector(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoVectorRooter(cx, OBJVECTOR) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +class AutoFunctionVector : public AutoVectorRooter +{ + public: + explicit AutoFunctionVector(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoVectorRooter(cx, FUNVECTOR) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + explicit AutoFunctionVector(js::ContextFriendFields *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoVectorRooter(cx, FUNVECTOR) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +class AutoScriptVector : public AutoVectorRooter +{ + public: + explicit AutoScriptVector(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoVectorRooter(cx, SCRIPTVECTOR) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +/* + * Custom rooting behavior for internal and external clients. + */ +class JS_PUBLIC_API(CustomAutoRooter) : private AutoGCRooter +{ + public: + template + explicit CustomAutoRooter(CX *cx MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoGCRooter(cx, CUSTOM) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + friend void AutoGCRooter::trace(JSTracer *trc); + + protected: + /* Supplied by derived class to trace roots. */ + virtual void trace(JSTracer *trc) = 0; + + private: + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +/* + * RootedGeneric allows a class to instantiate its own Rooted type by + * including the method: + * + * void trace(JSTracer *trc); + * + * The trace() method must trace all of the class's fields. + */ +template +class RootedGeneric : private CustomAutoRooter +{ + public: + template + explicit RootedGeneric(CX *cx MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : CustomAutoRooter(cx) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + template + explicit RootedGeneric(CX *cx, const T& initial MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : CustomAutoRooter(cx), value(initial) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + operator const T&() const { return value; } + T operator->() const { return value; } + + private: + virtual void trace(JSTracer *trc) { value->trace(trc); } + + T value; + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +/* A handle to an array of rooted values. */ +class HandleValueArray +{ + const size_t length_; + const Value * const elements_; + + HandleValueArray(size_t len, const Value *elements) : length_(len), elements_(elements) {} + + public: + explicit HandleValueArray(const RootedValue& value) : length_(1), elements_(value.address()) {} + + MOZ_IMPLICIT HandleValueArray(const AutoValueVector& values) + : length_(values.length()), elements_(values.begin()) {} + + template + HandleValueArray(const AutoValueArray& values) : length_(N), elements_(values.begin()) {} + + /* CallArgs must already be rooted somewhere up the stack. */ + MOZ_IMPLICIT HandleValueArray(const JS::CallArgs& args) : length_(args.length()), elements_(args.array()) {} + + /* Use with care! Only call this if the data is guaranteed to be marked. */ + static HandleValueArray fromMarkedLocation(size_t len, const Value *elements) { + return HandleValueArray(len, elements); + } + + static HandleValueArray subarray(const HandleValueArray& values, size_t startIndex, size_t len) { + JS_ASSERT(startIndex + len <= values.length()); + return HandleValueArray(len, values.begin() + startIndex); + } + + static HandleValueArray empty() { + return HandleValueArray(0, nullptr); + } + + size_t length() const { return length_; } + const Value *begin() const { return elements_; } + + HandleValue operator[](size_t i) const { + JS_ASSERT(i < length_); + return HandleValue::fromMarkedLocation(&elements_[i]); + } +}; + +} /* namespace JS */ + +/************************************************************************/ + +struct JSFreeOp { + private: + JSRuntime *runtime_; + + protected: + explicit JSFreeOp(JSRuntime *rt) + : runtime_(rt) { } + + public: + JSRuntime *runtime() const { + return runtime_; + } +}; + +/* Callbacks and their arguments. */ + +/************************************************************************/ + +typedef enum JSContextOp { + JSCONTEXT_NEW, + JSCONTEXT_DESTROY +} JSContextOp; + +/* + * The possible values for contextOp when the runtime calls the callback are: + * JSCONTEXT_NEW JS_NewContext successfully created a new JSContext + * instance. The callback can initialize the instance as + * required. If the callback returns false, the instance + * will be destroyed and JS_NewContext returns null. In + * this case the callback is not called again. + * JSCONTEXT_DESTROY One of JS_DestroyContext* methods is called. The + * callback may perform its own cleanup and must always + * return true. + * Any other value For future compatibility the callback must do nothing + * and return true in this case. + */ +typedef bool +(* JSContextCallback)(JSContext *cx, unsigned contextOp, void *data); + +typedef enum JSGCStatus { + JSGC_BEGIN, + JSGC_END +} JSGCStatus; + +typedef void +(* JSGCCallback)(JSRuntime *rt, JSGCStatus status, void *data); + +typedef enum JSFinalizeStatus { + /* + * Called when preparing to sweep a group of compartments, before anything + * has been swept. The collector will not yield to the mutator before + * calling the callback with JSFINALIZE_GROUP_END status. + */ + JSFINALIZE_GROUP_START, + + /* + * Called when preparing to sweep a group of compartments. Weak references + * to unmarked things have been removed and things that are not swept + * incrementally have been finalized at this point. The collector may yield + * to the mutator after this point. + */ + JSFINALIZE_GROUP_END, + + /* + * Called at the end of collection when everything has been swept. + */ + JSFINALIZE_COLLECTION_END +} JSFinalizeStatus; + +typedef void +(* JSFinalizeCallback)(JSFreeOp *fop, JSFinalizeStatus status, bool isCompartment, void *data); + +typedef bool +(* JSInterruptCallback)(JSContext *cx); + +typedef void +(* JSErrorReporter)(JSContext *cx, const char *message, JSErrorReport *report); + +#ifdef MOZ_TRACE_JSCALLS +typedef void +(* JSFunctionCallback)(const JSFunction *fun, + const JSScript *scr, + const JSContext *cx, + int entering); +#endif + +/* + * Possible exception types. These types are part of a JSErrorFormatString + * structure. They define which error to throw in case of a runtime error. + * JSEXN_NONE marks an unthrowable error. + */ +typedef enum JSExnType { + JSEXN_NONE = -1, + JSEXN_ERR, + JSEXN_INTERNALERR, + JSEXN_EVALERR, + JSEXN_RANGEERR, + JSEXN_REFERENCEERR, + JSEXN_SYNTAXERR, + JSEXN_TYPEERR, + JSEXN_URIERR, + JSEXN_LIMIT +} JSExnType; + +typedef struct JSErrorFormatString { + /* The error format string in ASCII. */ + const char *format; + + /* The number of arguments to expand in the formatted error message. */ + uint16_t argCount; + + /* One of the JSExnType constants above. */ + int16_t exnType; +} JSErrorFormatString; + +typedef const JSErrorFormatString * +(* JSErrorCallback)(void *userRef, const unsigned errorNumber); + +typedef bool +(* JSLocaleToUpperCase)(JSContext *cx, JS::HandleString src, JS::MutableHandleValue rval); + +typedef bool +(* JSLocaleToLowerCase)(JSContext *cx, JS::HandleString src, JS::MutableHandleValue rval); + +typedef bool +(* JSLocaleCompare)(JSContext *cx, JS::HandleString src1, JS::HandleString src2, + JS::MutableHandleValue rval); + +typedef bool +(* JSLocaleToUnicode)(JSContext *cx, const char *src, JS::MutableHandleValue rval); + +/* + * Callback used to ask the embedding for the cross compartment wrapper handler + * that implements the desired prolicy for this kind of object in the + * destination compartment. |obj| is the object to be wrapped. If |existing| is + * non-nullptr, it will point to an existing wrapper object that should be + * re-used if possible. |existing| is guaranteed to be a cross-compartment + * wrapper with a lazily-defined prototype and the correct global. It is + * guaranteed not to wrap a function. + */ +typedef JSObject * +(* JSWrapObjectCallback)(JSContext *cx, JS::HandleObject existing, JS::HandleObject obj, + JS::HandleObject parent, unsigned flags); + +/* + * Callback used by the wrap hook to ask the embedding to prepare an object + * for wrapping in a context. This might include unwrapping other wrappers + * or even finding a more suitable object for the new compartment. + */ +typedef JSObject * +(* JSPreWrapCallback)(JSContext *cx, JS::HandleObject scope, JS::HandleObject obj, + unsigned flags); + +struct JSWrapObjectCallbacks +{ + JSWrapObjectCallback wrap; + JSPreWrapCallback preWrap; +}; + +typedef void +(* JSDestroyCompartmentCallback)(JSFreeOp *fop, JSCompartment *compartment); + +typedef void +(* JSZoneCallback)(JS::Zone *zone); + +typedef void +(* JSCompartmentNameCallback)(JSRuntime *rt, JSCompartment *compartment, + char *buf, size_t bufsize); + +/************************************************************************/ + +static MOZ_ALWAYS_INLINE jsval +JS_NumberValue(double d) +{ + int32_t i; + d = JS::CanonicalizeNaN(d); + if (mozilla::NumberIsInt32(d, &i)) + return INT_TO_JSVAL(i); + return DOUBLE_TO_JSVAL(d); +} + +/************************************************************************/ + +JS_PUBLIC_API(bool) +JS_StringHasBeenInterned(JSContext *cx, JSString *str); + +/* + * Only JSStrings that have been interned via the JSAPI can be turned into + * jsids by API clients. + * + * N.B. if a jsid is backed by a string which has not been interned, that + * string must be appropriately rooted to avoid being collected by the GC. + */ +JS_PUBLIC_API(jsid) +INTERNED_STRING_TO_JSID(JSContext *cx, JSString *str); + +namespace JS { + +// Container class for passing in script source buffers to the JS engine. This +// not only groups the buffer and length values, it also provides a way to +// optionally pass ownership of the buffer to the JS engine without copying. +// Rules for use: +// +// 1) The data array must be allocated with js_malloc() or js_realloc() if +// ownership is being granted to the SourceBufferHolder. +// 2) If ownership is not given to the SourceBufferHolder, then the memory +// must be kept alive until the JS compilation is complete. +// 3) Any code calling SourceBufferHolder::take() must guarantee to keep the +// memory alive until JS compilation completes. Normally only the JS +// engine should be calling take(). +// +// Example use: +// +// size_t length = 512; +// jschar* chars = static_cast(js_malloc(sizeof(jschar) * length)); +// JS::SourceBufferHolder srcBuf(chars, length, JS::SourceBufferHolder::GiveOwnership); +// JS::Compile(cx, obj, options, srcBuf); +// +class MOZ_STACK_CLASS SourceBufferHolder MOZ_FINAL +{ + public: + enum Ownership { + NoOwnership, + GiveOwnership + }; + + SourceBufferHolder(const jschar *data, size_t dataLength, Ownership ownership) + : data_(data), + length_(dataLength), + ownsChars_(ownership == GiveOwnership) + { + // Ensure that null buffers properly return an unowned, empty, + // null-terminated string. + static const jschar NullChar_ = 0; + if (!get()) { + data_ = &NullChar_; + length_ = 0; + ownsChars_ = false; + } + } + + ~SourceBufferHolder() { + if (ownsChars_) + js_free(const_cast(data_)); + } + + // Access the underlying source buffer without affecting ownership. + const jschar *get() const { return data_; } + + // Length of the source buffer in jschars (not bytes) + size_t length() const { return length_; } + + // Returns true if the SourceBufferHolder owns the buffer and will free + // it upon destruction. If true, it is legal to call take(). + bool ownsChars() const { return ownsChars_; } + + // Retrieve and take ownership of the underlying data buffer. The caller + // is now responsible for calling js_free() on the returned value, *but only + // after JS script compilation has completed*. + // + // After the buffer has been taken the SourceBufferHolder functions as if + // it had been constructed on an unowned buffer; get() and length() still + // work. In order for this to be safe the taken buffer must be kept alive + // until after JS script compilation completes as noted above. + // + // Note, it's the caller's responsibility to check ownsChars() before taking + // the buffer. Taking and then free'ing an unowned buffer will have dire + // consequences. + jschar *take() { + JS_ASSERT(ownsChars_); + ownsChars_ = false; + return const_cast(data_); + } + + private: + SourceBufferHolder(SourceBufferHolder &) MOZ_DELETE; + SourceBufferHolder &operator=(SourceBufferHolder &) MOZ_DELETE; + + const jschar *data_; + size_t length_; + bool ownsChars_; +}; + +} /* namespace JS */ + +/************************************************************************/ + +/* Property attributes, set in JSPropertySpec and passed to API functions. */ +#define JSPROP_ENUMERATE 0x01 /* property is visible to for/in loop */ +#define JSPROP_READONLY 0x02 /* not settable: assignment is no-op. + This flag is only valid when neither + JSPROP_GETTER nor JSPROP_SETTER is + set. */ +#define JSPROP_PERMANENT 0x04 /* property cannot be deleted */ +#define JSPROP_NATIVE_ACCESSORS 0x08 /* set in JSPropertyDescriptor.flags + if getters/setters are JSNatives */ +#define JSPROP_GETTER 0x10 /* property holds getter function */ +#define JSPROP_SETTER 0x20 /* property holds setter function */ +#define JSPROP_SHARED 0x40 /* don't allocate a value slot for this + property; don't copy the property on + set of the same-named property in an + object that delegates to a prototype + containing this property */ +#define JSPROP_INDEX 0x80 /* name is actually (int) index */ + +#define JSFUN_STUB_GSOPS 0x200 /* use JS_PropertyStub getter/setter + instead of defaulting to class gsops + for property holding function */ + +#define JSFUN_CONSTRUCTOR 0x400 /* native that can be called as a ctor */ + + +/* + * Specify a generic native prototype methods, i.e., methods of a class + * prototype that are exposed as static methods taking an extra leading + * argument: the generic |this| parameter. + * + * If you set this flag in a JSFunctionSpec struct's flags initializer, then + * that struct must live at least as long as the native static method object + * created due to this flag by JS_DefineFunctions or JS_InitClass. Typically + * JSFunctionSpec structs are allocated in static arrays. + */ +#define JSFUN_GENERIC_NATIVE 0x800 + +#define JSFUN_FLAGS_MASK 0xe00 /* | of all the JSFUN_* flags */ + +/* + * The first call to JS_CallOnce by any thread in a process will call 'func'. + * Later calls to JS_CallOnce with the same JSCallOnceType object will be + * suppressed. + * + * Equivalently: each distinct JSCallOnceType object will allow one JS_CallOnce + * to invoke its JSInitCallback. + */ +extern JS_PUBLIC_API(bool) +JS_CallOnce(JSCallOnceType *once, JSInitCallback func); + +/* Microseconds since the epoch, midnight, January 1, 1970 UTC. */ +extern JS_PUBLIC_API(int64_t) +JS_Now(void); + +/* Don't want to export data, so provide accessors for non-inline jsvals. */ +extern JS_PUBLIC_API(jsval) +JS_GetNaNValue(JSContext *cx); + +extern JS_PUBLIC_API(jsval) +JS_GetNegativeInfinityValue(JSContext *cx); + +extern JS_PUBLIC_API(jsval) +JS_GetPositiveInfinityValue(JSContext *cx); + +extern JS_PUBLIC_API(jsval) +JS_GetEmptyStringValue(JSContext *cx); + +extern JS_PUBLIC_API(JSString *) +JS_GetEmptyString(JSRuntime *rt); + +/* + * Format is a string of the following characters (spaces are insignificant), + * specifying the tabulated type conversions: + * + * b bool Boolean + * c uint16_t/jschar ECMA uint16_t, Unicode char + * i int32_t ECMA int32_t + * j int32_t ECMA int32_t (used to be different) + * u uint32_t ECMA uint32_t + * d double IEEE double + * I double Integral IEEE double + * S JSString * Unicode string, accessed by a JSString pointer + * W jschar * Unicode character vector, 0-terminated (W for wide) + * o JSObject * Object reference + * f JSFunction * Function private + * v jsval Argument value (no conversion) + * * N/A Skip this argument (no vararg) + * / N/A End of required arguments + * + * The variable argument list after format must consist of &b, &c, &s, e.g., + * where those variables have the types given above. For the pointer types + * char *, JSString *, and JSObject *, the pointed-at memory returned belongs + * to the JS runtime, not to the calling native code. The runtime promises + * to keep this memory valid so long as argv refers to allocated stack space + * (so long as the native function is active). + * + * Fewer arguments than format specifies may be passed only if there is a / + * in format after the last required argument specifier and argc is at least + * the number of required arguments. More arguments than format specifies + * may be passed without error; it is up to the caller to deal with trailing + * unconverted arguments. + */ +extern JS_PUBLIC_API(bool) +JS_ConvertArguments(JSContext *cx, const JS::CallArgs &args, const char *format, ...); + +#ifdef va_start +extern JS_PUBLIC_API(bool) +JS_ConvertArgumentsVA(JSContext *cx, const JS::CallArgs &args, const char *format, + va_list ap); +#endif + +extern JS_PUBLIC_API(bool) +JS_ConvertValue(JSContext *cx, JS::HandleValue v, JSType type, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_ValueToObject(JSContext *cx, JS::HandleValue v, JS::MutableHandleObject objp); + +extern JS_PUBLIC_API(JSFunction *) +JS_ValueToFunction(JSContext *cx, JS::HandleValue v); + +extern JS_PUBLIC_API(JSFunction *) +JS_ValueToConstructor(JSContext *cx, JS::HandleValue v); + +extern JS_PUBLIC_API(JSString *) +JS_ValueToSource(JSContext *cx, JS::Handle v); + +namespace js { +/* + * DO NOT CALL THIS. Use JS::ToNumber + */ +extern JS_PUBLIC_API(bool) +ToNumberSlow(JSContext *cx, JS::Value v, double *dp); + +/* + * DO NOT CALL THIS. Use JS::ToBoolean + */ +extern JS_PUBLIC_API(bool) +ToBooleanSlow(JS::HandleValue v); + +/* + * DO NOT CALL THIS. Use JS::ToString + */ +extern JS_PUBLIC_API(JSString*) +ToStringSlow(JSContext *cx, JS::HandleValue v); +} /* namespace js */ + +namespace JS { + +/* ES5 9.3 ToNumber. */ +MOZ_ALWAYS_INLINE bool +ToNumber(JSContext *cx, HandleValue v, double *out) +{ + AssertArgumentsAreSane(cx, v); + + if (v.isNumber()) { + *out = v.toNumber(); + return true; + } + return js::ToNumberSlow(cx, v, out); +} + +MOZ_ALWAYS_INLINE bool +ToBoolean(HandleValue v) +{ + if (v.isBoolean()) + return v.toBoolean(); + if (v.isInt32()) + return v.toInt32() != 0; + if (v.isNullOrUndefined()) + return false; + if (v.isDouble()) { + double d = v.toDouble(); + return !mozilla::IsNaN(d) && d != 0; + } + if (v.isSymbol()) + return true; + + /* The slow path handles strings and objects. */ + return js::ToBooleanSlow(v); +} + +MOZ_ALWAYS_INLINE JSString* +ToString(JSContext *cx, HandleValue v) +{ + if (v.isString()) + return v.toString(); + return js::ToStringSlow(cx, v); +} + +} /* namespace JS */ + +extern JS_PUBLIC_API(bool) +JS_DoubleIsInt32(double d, int32_t *ip); + +extern JS_PUBLIC_API(int32_t) +JS_DoubleToInt32(double d); + +extern JS_PUBLIC_API(uint32_t) +JS_DoubleToUint32(double d); + + +namespace js { +/* DO NOT CALL THIS. Use JS::ToUint16. */ +extern JS_PUBLIC_API(bool) +ToUint16Slow(JSContext *cx, JS::HandleValue v, uint16_t *out); + +/* DO NOT CALL THIS. Use JS::ToInt32. */ +extern JS_PUBLIC_API(bool) +ToInt32Slow(JSContext *cx, JS::HandleValue v, int32_t *out); + +/* DO NOT CALL THIS. Use JS::ToUint32. */ +extern JS_PUBLIC_API(bool) +ToUint32Slow(JSContext *cx, JS::HandleValue v, uint32_t *out); + +/* DO NOT CALL THIS. Use JS::ToInt64. */ +extern JS_PUBLIC_API(bool) +ToInt64Slow(JSContext *cx, JS::HandleValue v, int64_t *out); + +/* DO NOT CALL THIS. Use JS::ToUint64. */ +extern JS_PUBLIC_API(bool) +ToUint64Slow(JSContext *cx, JS::HandleValue v, uint64_t *out); +} /* namespace js */ + +namespace JS { + +MOZ_ALWAYS_INLINE bool +ToUint16(JSContext *cx, JS::HandleValue v, uint16_t *out) +{ + AssertArgumentsAreSane(cx, v); + + if (v.isInt32()) { + *out = uint16_t(v.toInt32()); + return true; + } + return js::ToUint16Slow(cx, v, out); +} + +MOZ_ALWAYS_INLINE bool +ToInt32(JSContext *cx, JS::HandleValue v, int32_t *out) +{ + AssertArgumentsAreSane(cx, v); + + if (v.isInt32()) { + *out = v.toInt32(); + return true; + } + return js::ToInt32Slow(cx, v, out); +} + +MOZ_ALWAYS_INLINE bool +ToUint32(JSContext *cx, JS::HandleValue v, uint32_t *out) +{ + AssertArgumentsAreSane(cx, v); + + if (v.isInt32()) { + *out = uint32_t(v.toInt32()); + return true; + } + return js::ToUint32Slow(cx, v, out); +} + +MOZ_ALWAYS_INLINE bool +ToInt64(JSContext *cx, JS::HandleValue v, int64_t *out) +{ + AssertArgumentsAreSane(cx, v); + + if (v.isInt32()) { + *out = int64_t(v.toInt32()); + return true; + } + return js::ToInt64Slow(cx, v, out); +} + +MOZ_ALWAYS_INLINE bool +ToUint64(JSContext *cx, JS::HandleValue v, uint64_t *out) +{ + AssertArgumentsAreSane(cx, v); + + if (v.isInt32()) { + /* Account for sign extension of negatives into the longer 64bit space. */ + *out = uint64_t(int64_t(v.toInt32())); + return true; + } + return js::ToUint64Slow(cx, v, out); +} + + +} /* namespace JS */ + +extern JS_PUBLIC_API(JSType) +JS_TypeOfValue(JSContext *cx, JS::Handle v); + +extern JS_PUBLIC_API(const char *) +JS_GetTypeName(JSContext *cx, JSType type); + +extern JS_PUBLIC_API(bool) +JS_StrictlyEqual(JSContext *cx, jsval v1, jsval v2, bool *equal); + +extern JS_PUBLIC_API(bool) +JS_LooselyEqual(JSContext *cx, JS::Handle v1, JS::Handle v2, bool *equal); + +extern JS_PUBLIC_API(bool) +JS_SameValue(JSContext *cx, jsval v1, jsval v2, bool *same); + +/* True iff fun is the global eval function. */ +extern JS_PUBLIC_API(bool) +JS_IsBuiltinEvalFunction(JSFunction *fun); + +/* True iff fun is the Function constructor. */ +extern JS_PUBLIC_API(bool) +JS_IsBuiltinFunctionConstructor(JSFunction *fun); + +/************************************************************************/ + +/* + * Initialization, locking, contexts, and memory allocation. + * + * It is important that the first runtime and first context be created in a + * single-threaded fashion, otherwise the behavior of the library is undefined. + * See: http://developer.mozilla.org/en/docs/Category:JSAPI_Reference + */ + +/** + * Initialize SpiderMonkey, returning true only if initialization succeeded. + * Once this method has succeeded, it is safe to call JS_NewRuntime and other + * JSAPI methods. + * + * This method must be called before any other JSAPI method is used on any + * thread. Once it has been used, it is safe to call any JSAPI method, and it + * remains safe to do so until JS_ShutDown is correctly called. + * + * It is currently not possible to initialize SpiderMonkey multiple times (that + * is, calling JS_Init/JSAPI methods/JS_ShutDown in that order, then doing so + * again). This restriction may eventually be lifted. + */ +extern JS_PUBLIC_API(bool) +JS_Init(void); + +/** + * Destroy free-standing resources allocated by SpiderMonkey, not associated + * with any runtime, context, or other structure. + * + * This method should be called after all other JSAPI data has been properly + * cleaned up: every new runtime must have been destroyed, every new context + * must have been destroyed, and so on. Calling this method before all other + * resources have been destroyed has undefined behavior. + * + * Failure to call this method, at present, has no adverse effects other than + * leaking memory. This may not always be the case; it's recommended that all + * embedders call this method when all other JSAPI operations have completed. + * + * It is currently not possible to initialize SpiderMonkey multiple times (that + * is, calling JS_Init/JSAPI methods/JS_ShutDown in that order, then doing so + * again). This restriction may eventually be lifted. + */ +extern JS_PUBLIC_API(void) +JS_ShutDown(void); + +extern JS_PUBLIC_API(JSRuntime *) +JS_NewRuntime(uint32_t maxbytes, + uint32_t maxNurseryBytes = JS::DefaultNurseryBytes, + JSRuntime *parentRuntime = nullptr); + +extern JS_PUBLIC_API(void) +JS_DestroyRuntime(JSRuntime *rt); + +// These are equivalent to ICU's |UMemAllocFn|, |UMemReallocFn|, and +// |UMemFreeFn| types. The first argument (called |context| in the ICU docs) +// will always be nullptr, and should be ignored. +typedef void *(*JS_ICUAllocFn)(const void *, size_t size); +typedef void *(*JS_ICUReallocFn)(const void *, void *p, size_t size); +typedef void (*JS_ICUFreeFn)(const void *, void *p); + +// This function can be used to track memory used by ICU. +// Do not use it unless you know what you are doing! +extern JS_PUBLIC_API(bool) +JS_SetICUMemoryFunctions(JS_ICUAllocFn allocFn, JS_ICUReallocFn reallocFn, JS_ICUFreeFn freeFn); + +JS_PUBLIC_API(void *) +JS_GetRuntimePrivate(JSRuntime *rt); + +extern JS_PUBLIC_API(JSRuntime *) +JS_GetRuntime(JSContext *cx); + +extern JS_PUBLIC_API(JSRuntime *) +JS_GetParentRuntime(JSContext *cx); + +JS_PUBLIC_API(void) +JS_SetRuntimePrivate(JSRuntime *rt, void *data); + +extern JS_PUBLIC_API(void) +JS_BeginRequest(JSContext *cx); + +extern JS_PUBLIC_API(void) +JS_EndRequest(JSContext *cx); + +extern JS_PUBLIC_API(bool) +JS_IsInRequest(JSRuntime *rt); + +namespace js { + +void +AssertHeapIsIdle(JSRuntime *rt); + +void +AssertHeapIsIdle(JSContext *cx); + +} /* namespace js */ + +class JSAutoRequest +{ + public: + explicit JSAutoRequest(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : mContext(cx) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + JS_BeginRequest(mContext); + } + ~JSAutoRequest() { + JS_EndRequest(mContext); + } + + protected: + JSContext *mContext; + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER + +#if 0 + private: + static void *operator new(size_t) CPP_THROW_NEW { return 0; }; + static void operator delete(void *, size_t) { }; +#endif +}; + +class JSAutoCheckRequest +{ + public: + explicit JSAutoCheckRequest(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + { +#if defined JS_THREADSAFE && defined JS_DEBUG + mContext = cx; + JS_ASSERT(JS_IsInRequest(JS_GetRuntime(cx))); +#endif + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + ~JSAutoCheckRequest() { +#if defined JS_THREADSAFE && defined JS_DEBUG + JS_ASSERT(JS_IsInRequest(JS_GetRuntime(mContext))); +#endif + } + + + private: +#if defined JS_THREADSAFE && defined JS_DEBUG + JSContext *mContext; +#endif + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +extern JS_PUBLIC_API(void) +JS_SetContextCallback(JSRuntime *rt, JSContextCallback cxCallback, void *data); + +extern JS_PUBLIC_API(JSContext *) +JS_NewContext(JSRuntime *rt, size_t stackChunkSize); + +extern JS_PUBLIC_API(void) +JS_DestroyContext(JSContext *cx); + +extern JS_PUBLIC_API(void) +JS_DestroyContextNoGC(JSContext *cx); + +extern JS_PUBLIC_API(void *) +JS_GetContextPrivate(JSContext *cx); + +extern JS_PUBLIC_API(void) +JS_SetContextPrivate(JSContext *cx, void *data); + +extern JS_PUBLIC_API(void *) +JS_GetSecondContextPrivate(JSContext *cx); + +extern JS_PUBLIC_API(void) +JS_SetSecondContextPrivate(JSContext *cx, void *data); + +extern JS_PUBLIC_API(JSRuntime *) +JS_GetRuntime(JSContext *cx); + +extern JS_PUBLIC_API(JSContext *) +JS_ContextIterator(JSRuntime *rt, JSContext **iterp); + +extern JS_PUBLIC_API(JSVersion) +JS_GetVersion(JSContext *cx); + +// Mutate the version on the compartment. This is generally discouraged, but +// necessary to support the version mutation in the js and xpc shell command +// set. +// +// It would be nice to put this in jsfriendapi, but the linkage requirements +// of the shells make that impossible. +JS_PUBLIC_API(void) +JS_SetVersionForCompartment(JSCompartment *compartment, JSVersion version); + +extern JS_PUBLIC_API(const char *) +JS_VersionToString(JSVersion version); + +extern JS_PUBLIC_API(JSVersion) +JS_StringToVersion(const char *string); + +namespace JS { + +class JS_PUBLIC_API(RuntimeOptions) { + public: + RuntimeOptions() + : baseline_(false), + ion_(false), + asmJS_(false), + nativeRegExp_(false), + werror_(false), + strictMode_(false), + varObjFix_(false) + { + } + + bool baseline() const { return baseline_; } + RuntimeOptions &setBaseline(bool flag) { + baseline_ = flag; + return *this; + } + RuntimeOptions &toggleBaseline() { + baseline_ = !baseline_; + return *this; + } + + bool ion() const { return ion_; } + RuntimeOptions &setIon(bool flag) { + ion_ = flag; + return *this; + } + RuntimeOptions &toggleIon() { + ion_ = !ion_; + return *this; + } + + bool asmJS() const { return asmJS_; } + RuntimeOptions &setAsmJS(bool flag) { + asmJS_ = flag; + return *this; + } + RuntimeOptions &toggleAsmJS() { + asmJS_ = !asmJS_; + return *this; + } + + bool nativeRegExp() const { return nativeRegExp_; } + RuntimeOptions &setNativeRegExp(bool flag) { + nativeRegExp_ = flag; + return *this; + } + + bool werror() const { return werror_; } + RuntimeOptions &setWerror(bool flag) { + werror_ = flag; + return *this; + } + RuntimeOptions &toggleWerror() { + werror_ = !werror_; + return *this; + } + + bool strictMode() const { return strictMode_; } + RuntimeOptions &setStrictMode(bool flag) { + strictMode_ = flag; + return *this; + } + RuntimeOptions &toggleStrictMode() { + strictMode_ = !strictMode_; + return *this; + } + + bool varObjFix() const { return varObjFix_; } + RuntimeOptions &setVarObjFix(bool flag) { + varObjFix_ = flag; + return *this; + } + RuntimeOptions &toggleVarObjFix() { + varObjFix_ = !varObjFix_; + return *this; + } + + private: + bool baseline_ : 1; + bool ion_ : 1; + bool asmJS_ : 1; + bool nativeRegExp_ : 1; + bool werror_ : 1; + bool strictMode_ : 1; + bool varObjFix_ : 1; +}; + +JS_PUBLIC_API(RuntimeOptions &) +RuntimeOptionsRef(JSRuntime *rt); + +JS_PUBLIC_API(RuntimeOptions &) +RuntimeOptionsRef(JSContext *cx); + +class JS_PUBLIC_API(ContextOptions) { + public: + ContextOptions() + : extraWarnings_(false), + privateIsNSISupports_(false), + dontReportUncaught_(false), + noDefaultCompartmentObject_(false), + noScriptRval_(false) + { + } + + bool extraWarnings() const { return extraWarnings_; } + ContextOptions &setExtraWarnings(bool flag) { + extraWarnings_ = flag; + return *this; + } + ContextOptions &toggleExtraWarnings() { + extraWarnings_ = !extraWarnings_; + return *this; + } + + bool privateIsNSISupports() const { return privateIsNSISupports_; } + ContextOptions &setPrivateIsNSISupports(bool flag) { + privateIsNSISupports_ = flag; + return *this; + } + ContextOptions &togglePrivateIsNSISupports() { + privateIsNSISupports_ = !privateIsNSISupports_; + return *this; + } + + bool dontReportUncaught() const { return dontReportUncaught_; } + ContextOptions &setDontReportUncaught(bool flag) { + dontReportUncaught_ = flag; + return *this; + } + ContextOptions &toggleDontReportUncaught() { + dontReportUncaught_ = !dontReportUncaught_; + return *this; + } + + bool noDefaultCompartmentObject() const { return noDefaultCompartmentObject_; } + ContextOptions &setNoDefaultCompartmentObject(bool flag) { + noDefaultCompartmentObject_ = flag; + return *this; + } + ContextOptions &toggleNoDefaultCompartmentObject() { + noDefaultCompartmentObject_ = !noDefaultCompartmentObject_; + return *this; + } + + bool noScriptRval() const { return noScriptRval_; } + ContextOptions &setNoScriptRval(bool flag) { + noScriptRval_ = flag; + return *this; + } + ContextOptions &toggleNoScriptRval() { + noScriptRval_ = !noScriptRval_; + return *this; + } + + private: + bool extraWarnings_ : 1; + bool privateIsNSISupports_ : 1; + bool dontReportUncaught_ : 1; + bool noDefaultCompartmentObject_ : 1; + bool noScriptRval_ : 1; +}; + +JS_PUBLIC_API(ContextOptions &) +ContextOptionsRef(JSContext *cx); + +class JS_PUBLIC_API(AutoSaveContextOptions) { + public: + explicit AutoSaveContextOptions(JSContext *cx) + : cx_(cx), + oldOptions_(ContextOptionsRef(cx_)) + { + } + + ~AutoSaveContextOptions() + { + ContextOptionsRef(cx_) = oldOptions_; + } + + private: + JSContext *cx_; + JS::ContextOptions oldOptions_; +}; + +} /* namespace JS */ + +extern JS_PUBLIC_API(const char *) +JS_GetImplementationVersion(void); + +extern JS_PUBLIC_API(void) +JS_SetDestroyCompartmentCallback(JSRuntime *rt, JSDestroyCompartmentCallback callback); + +extern JS_PUBLIC_API(void) +JS_SetDestroyZoneCallback(JSRuntime *rt, JSZoneCallback callback); + +extern JS_PUBLIC_API(void) +JS_SetSweepZoneCallback(JSRuntime *rt, JSZoneCallback callback); + +extern JS_PUBLIC_API(void) +JS_SetCompartmentNameCallback(JSRuntime *rt, JSCompartmentNameCallback callback); + +extern JS_PUBLIC_API(void) +JS_SetWrapObjectCallbacks(JSRuntime *rt, const JSWrapObjectCallbacks *callbacks); + +extern JS_PUBLIC_API(void) +JS_SetCompartmentPrivate(JSCompartment *compartment, void *data); + +extern JS_PUBLIC_API(void *) +JS_GetCompartmentPrivate(JSCompartment *compartment); + +extern JS_PUBLIC_API(void) +JS_SetZoneUserData(JS::Zone *zone, void *data); + +extern JS_PUBLIC_API(void *) +JS_GetZoneUserData(JS::Zone *zone); + +extern JS_PUBLIC_API(bool) +JS_WrapObject(JSContext *cx, JS::MutableHandleObject objp); + +extern JS_PUBLIC_API(bool) +JS_WrapValue(JSContext *cx, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(JSObject *) +JS_TransplantObject(JSContext *cx, JS::HandleObject origobj, JS::HandleObject target); + +extern JS_PUBLIC_API(bool) +JS_RefreshCrossCompartmentWrappers(JSContext *cx, JS::Handle obj); + +/* + * At any time, a JSContext has a current (possibly-nullptr) compartment. + * Compartments are described in: + * + * developer.mozilla.org/en-US/docs/SpiderMonkey/SpiderMonkey_compartments + * + * The current compartment of a context may be changed. The preferred way to do + * this is with JSAutoCompartment: + * + * void foo(JSContext *cx, JSObject *obj) { + * // in some compartment 'c' + * { + * JSAutoCompartment ac(cx, obj); // constructor enters + * // in the compartment of 'obj' + * } // destructor leaves + * // back in compartment 'c' + * } + * + * For more complicated uses that don't neatly fit in a C++ stack frame, the + * compartment can entered and left using separate function calls: + * + * void foo(JSContext *cx, JSObject *obj) { + * // in 'oldCompartment' + * JSCompartment *oldCompartment = JS_EnterCompartment(cx, obj); + * // in the compartment of 'obj' + * JS_LeaveCompartment(cx, oldCompartment); + * // back in 'oldCompartment' + * } + * + * Note: these calls must still execute in a LIFO manner w.r.t all other + * enter/leave calls on the context. Furthermore, only the return value of a + * JS_EnterCompartment call may be passed as the 'oldCompartment' argument of + * the corresponding JS_LeaveCompartment call. + */ + +class JS_PUBLIC_API(JSAutoCompartment) +{ + JSContext *cx_; + JSCompartment *oldCompartment_; + public: + JSAutoCompartment(JSContext *cx, JSObject *target); + JSAutoCompartment(JSContext *cx, JSScript *target); + ~JSAutoCompartment(); +}; + +class JS_PUBLIC_API(JSAutoNullableCompartment) +{ + JSContext *cx_; + JSCompartment *oldCompartment_; + public: + explicit JSAutoNullableCompartment(JSContext *cx, JSObject *targetOrNull); + ~JSAutoNullableCompartment(); +}; + +/* NB: This API is infallible; a nullptr return value does not indicate error. */ +extern JS_PUBLIC_API(JSCompartment *) +JS_EnterCompartment(JSContext *cx, JSObject *target); + +extern JS_PUBLIC_API(void) +JS_LeaveCompartment(JSContext *cx, JSCompartment *oldCompartment); + +typedef void (*JSIterateCompartmentCallback)(JSRuntime *rt, void *data, JSCompartment *compartment); + +/* + * This function calls |compartmentCallback| on every compartment. Beware that + * there is no guarantee that the compartment will survive after the callback + * returns. + */ +extern JS_PUBLIC_API(void) +JS_IterateCompartments(JSRuntime *rt, void *data, + JSIterateCompartmentCallback compartmentCallback); + +/* + * Initialize standard JS class constructors, prototypes, and any top-level + * functions and constants associated with the standard classes (e.g. isNaN + * for Number). + * + * NB: This sets cx's global object to obj if it was null. + */ +extern JS_PUBLIC_API(bool) +JS_InitStandardClasses(JSContext *cx, JS::Handle obj); + +/* + * Resolve id, which must contain either a string or an int, to a standard + * class name in obj if possible, defining the class's constructor and/or + * prototype and storing true in *resolved. If id does not name a standard + * class or a top-level property induced by initializing a standard class, + * store false in *resolved and just return true. Return false on error, + * as usual for bool result-typed API entry points. + * + * This API can be called directly from a global object class's resolve op, + * to define standard classes lazily. The class's enumerate op should call + * JS_EnumerateStandardClasses(cx, obj), to define eagerly during for..in + * loops any classes not yet resolved lazily. + */ +extern JS_PUBLIC_API(bool) +JS_ResolveStandardClass(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool *resolved); + +extern JS_PUBLIC_API(bool) +JS_EnumerateStandardClasses(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(bool) +JS_GetClassObject(JSContext *cx, JSProtoKey key, JS::MutableHandle objp); + +extern JS_PUBLIC_API(bool) +JS_GetClassPrototype(JSContext *cx, JSProtoKey key, JS::MutableHandle objp); + +namespace JS { + +/* + * Determine if the given object is an instance/prototype/constructor for a standard + * class. If so, return the associated JSProtoKey. If not, return JSProto_Null. + */ + +extern JS_PUBLIC_API(JSProtoKey) +IdentifyStandardInstance(JSObject *obj); + +extern JS_PUBLIC_API(JSProtoKey) +IdentifyStandardPrototype(JSObject *obj); + +extern JS_PUBLIC_API(JSProtoKey) +IdentifyStandardInstanceOrPrototype(JSObject *obj); + +extern JS_PUBLIC_API(JSProtoKey) +IdentifyStandardConstructor(JSObject *obj); + +extern JS_PUBLIC_API(void) +ProtoKeyToId(JSContext *cx, JSProtoKey key, JS::MutableHandleId idp); + +} /* namespace JS */ + +extern JS_PUBLIC_API(JSProtoKey) +JS_IdToProtoKey(JSContext *cx, JS::HandleId id); + +/* + * Returns the original value of |Function.prototype| from the global object in + * which |forObj| was created. + */ +extern JS_PUBLIC_API(JSObject *) +JS_GetFunctionPrototype(JSContext *cx, JS::HandleObject forObj); + +/* + * Returns the original value of |Object.prototype| from the global object in + * which |forObj| was created. + */ +extern JS_PUBLIC_API(JSObject *) +JS_GetObjectPrototype(JSContext *cx, JS::HandleObject forObj); + +/* + * Returns the original value of |Array.prototype| from the global object in + * which |forObj| was created. + */ +extern JS_PUBLIC_API(JSObject *) +JS_GetArrayPrototype(JSContext *cx, JS::HandleObject forObj); + +/* + * Returns the original value of |Error.prototype| from the global + * object of the current compartment of cx. + */ +extern JS_PUBLIC_API(JSObject *) +JS_GetErrorPrototype(JSContext *cx); + +extern JS_PUBLIC_API(JSObject *) +JS_GetGlobalForObject(JSContext *cx, JSObject *obj); + +extern JS_PUBLIC_API(bool) +JS_IsGlobalObject(JSObject *obj); + +/* + * May return nullptr, if |c| never had a global (e.g. the atoms compartment), + * or if |c|'s global has been collected. + */ +extern JS_PUBLIC_API(JSObject *) +JS_GetGlobalForCompartmentOrNull(JSContext *cx, JSCompartment *c); + +namespace JS { + +extern JS_PUBLIC_API(JSObject *) +CurrentGlobalOrNull(JSContext *cx); + +} + +/* + * Initialize the 'Reflect' object on a global object. + */ +extern JS_PUBLIC_API(JSObject *) +JS_InitReflect(JSContext *cx, JS::HandleObject global); + +#ifdef JS_HAS_CTYPES +/* + * Initialize the 'ctypes' object on a global variable 'obj'. The 'ctypes' + * object will be sealed. + */ +extern JS_PUBLIC_API(bool) +JS_InitCTypesClass(JSContext *cx, JS::HandleObject global); + +/* + * Convert a unicode string 'source' of length 'slen' to the platform native + * charset, returning a null-terminated string allocated with JS_malloc. On + * failure, this function should report an error. + */ +typedef char * +(* JSCTypesUnicodeToNativeFun)(JSContext *cx, const jschar *source, size_t slen); + +/* + * Set of function pointers that ctypes can use for various internal functions. + * See JS_SetCTypesCallbacks below. Providing nullptr for a function is safe, + * and will result in the applicable ctypes functionality not being available. + */ +struct JSCTypesCallbacks { + JSCTypesUnicodeToNativeFun unicodeToNative; +}; + +typedef struct JSCTypesCallbacks JSCTypesCallbacks; + +/* + * Set the callbacks on the provided 'ctypesObj' object. 'callbacks' should be a + * pointer to static data that exists for the lifetime of 'ctypesObj', but it + * may safely be altered after calling this function and without having + * to call this function again. + */ +extern JS_PUBLIC_API(void) +JS_SetCTypesCallbacks(JSObject *ctypesObj, JSCTypesCallbacks *callbacks); +#endif + +typedef bool +(* JSEnumerateDiagnosticMemoryCallback)(void *ptr, size_t length); + +/* + * Enumerate memory regions that contain diagnostic information + * intended to be included in crash report minidumps. + */ +extern JS_PUBLIC_API(void) +JS_EnumerateDiagnosticMemoryRegions(JSEnumerateDiagnosticMemoryCallback callback); + +extern JS_PUBLIC_API(void *) +JS_malloc(JSContext *cx, size_t nbytes); + +extern JS_PUBLIC_API(void *) +JS_realloc(JSContext *cx, void *p, size_t nbytes); + +/* + * A wrapper for js_free(p) that may delay js_free(p) invocation as a + * performance optimization. + * cx may be nullptr. + */ +extern JS_PUBLIC_API(void) +JS_free(JSContext *cx, void *p); + +/* + * A wrapper for js_free(p) that may delay js_free(p) invocation as a + * performance optimization as specified by the given JSFreeOp instance. + */ +extern JS_PUBLIC_API(void) +JS_freeop(JSFreeOp *fop, void *p); + +extern JS_PUBLIC_API(JSFreeOp *) +JS_GetDefaultFreeOp(JSRuntime *rt); + +extern JS_PUBLIC_API(void) +JS_updateMallocCounter(JSContext *cx, size_t nbytes); + +extern JS_PUBLIC_API(char *) +JS_strdup(JSContext *cx, const char *s); + +/* Duplicate a string. Does not report an error on failure. */ +extern JS_PUBLIC_API(char *) +JS_strdup(JSRuntime *rt, const char *s); + +namespace JS { + +/* + * A GC root is a pointer to a jsval, JSObject * or JSString * that itself + * points into the GC heap. JS_AddValueRoot takes a pointer to a jsval and + * JS_AddGCThingRoot takes a pointer to a JSObject * or JString *. + * + * Note that, since JS_Add*Root stores the address of a variable (of type + * jsval, JSString *, or JSObject *), that variable must live until + * JS_Remove*Root is called to remove that variable. For example, after: + * + * void some_function() { + * jsval v; + * JS_AddNamedValueRoot(cx, &v, "name"); + * + * the caller must perform + * + * JS_RemoveValueRoot(cx, &v); + * + * before some_function() returns. + * + * Also, use JS_AddNamed*Root(cx, &structPtr->memberObj, "structPtr->memberObj") + * in preference to JS_Add*Root(cx, &structPtr->memberObj), in order to identify + * roots by their source callsites. This way, you can find the callsite while + * debugging if you should fail to do JS_Remove*Root(cx, &structPtr->memberObj) + * before freeing structPtr's memory. + */ +extern JS_PUBLIC_API(bool) +AddValueRoot(JSContext *cx, JS::Heap *vp); + +extern JS_PUBLIC_API(bool) +AddStringRoot(JSContext *cx, JS::Heap *rp); + +extern JS_PUBLIC_API(bool) +AddObjectRoot(JSContext *cx, JS::Heap *rp); + +extern JS_PUBLIC_API(bool) +AddNamedValueRoot(JSContext *cx, JS::Heap *vp, const char *name); + +extern JS_PUBLIC_API(bool) +AddNamedValueRootRT(JSRuntime *rt, JS::Heap *vp, const char *name); + +extern JS_PUBLIC_API(bool) +AddNamedStringRoot(JSContext *cx, JS::Heap *rp, const char *name); + +extern JS_PUBLIC_API(bool) +AddNamedObjectRoot(JSContext *cx, JS::Heap *rp, const char *name); + +extern JS_PUBLIC_API(bool) +AddNamedScriptRoot(JSContext *cx, JS::Heap *rp, const char *name); + +extern JS_PUBLIC_API(void) +RemoveValueRoot(JSContext *cx, JS::Heap *vp); + +extern JS_PUBLIC_API(void) +RemoveStringRoot(JSContext *cx, JS::Heap *rp); + +extern JS_PUBLIC_API(void) +RemoveObjectRoot(JSContext *cx, JS::Heap *rp); + +extern JS_PUBLIC_API(void) +RemoveScriptRoot(JSContext *cx, JS::Heap *rp); + +extern JS_PUBLIC_API(void) +RemoveValueRootRT(JSRuntime *rt, JS::Heap *vp); + +extern JS_PUBLIC_API(void) +RemoveStringRootRT(JSRuntime *rt, JS::Heap *rp); + +extern JS_PUBLIC_API(void) +RemoveObjectRootRT(JSRuntime *rt, JS::Heap *rp); + +extern JS_PUBLIC_API(void) +RemoveScriptRootRT(JSRuntime *rt, JS::Heap *rp); + +} /* namespace JS */ + +/* + * Register externally maintained GC roots. + * + * traceOp: the trace operation. For each root the implementation should call + * JS_CallTracer whenever the root contains a traceable thing. + * data: the data argument to pass to each invocation of traceOp. + */ +extern JS_PUBLIC_API(bool) +JS_AddExtraGCRootsTracer(JSRuntime *rt, JSTraceDataOp traceOp, void *data); + +/* Undo a call to JS_AddExtraGCRootsTracer. */ +extern JS_PUBLIC_API(void) +JS_RemoveExtraGCRootsTracer(JSRuntime *rt, JSTraceDataOp traceOp, void *data); + +#ifdef JS_DEBUG + +/* + * Debug-only method to dump the object graph of heap-allocated things. + * + * fp: file for the dump output. + * start: when non-null, dump only things reachable from start + * thing. Otherwise dump all things reachable from the + * runtime roots. + * startKind: trace kind of start if start is not null. Must be + * JSTRACE_OBJECT when start is null. + * thingToFind: dump only paths in the object graph leading to thingToFind + * when non-null. + * maxDepth: the upper bound on the number of edges to descend from the + * graph roots. + * thingToIgnore: thing to ignore during the graph traversal when non-null. + */ +extern JS_PUBLIC_API(bool) +JS_DumpHeap(JSRuntime *rt, FILE *fp, void* startThing, JSGCTraceKind kind, + void *thingToFind, size_t maxDepth, void *thingToIgnore); + +#endif + +/* + * Garbage collector API. + */ +extern JS_PUBLIC_API(void) +JS_GC(JSRuntime *rt); + +extern JS_PUBLIC_API(void) +JS_MaybeGC(JSContext *cx); + +extern JS_PUBLIC_API(void) +JS_SetGCCallback(JSRuntime *rt, JSGCCallback cb, void *data); + +extern JS_PUBLIC_API(bool) +JS_AddFinalizeCallback(JSRuntime *rt, JSFinalizeCallback cb, void *data); + +extern JS_PUBLIC_API(void) +JS_RemoveFinalizeCallback(JSRuntime *rt, JSFinalizeCallback cb); + +extern JS_PUBLIC_API(bool) +JS_IsGCMarkingTracer(JSTracer *trc); + +/* For assertions only. */ +#ifdef JS_DEBUG +extern JS_PUBLIC_API(bool) +JS_IsMarkingGray(JSTracer *trc); +#endif + +/* + * JS_IsAboutToBeFinalized checks if the given object is going to be finalized + * at the end of the current GC. When called outside of the context of a GC, + * this function will return false. Typically this function is used on weak + * references, where the reference should be nulled out or destroyed if the + * given object is about to be finalized. + * + * The argument to JS_IsAboutToBeFinalized is an in-out param: when the + * function returns false, the object being referenced is still alive, but the + * garbage collector might have moved it. In this case, the reference passed + * to JS_IsAboutToBeFinalized will be updated to the object's new location. + * Callers of this method are responsible for updating any state that is + * dependent on the object's address. For example, if the object's address is + * used as a key in a hashtable, then the object must be removed and + * re-inserted with the correct hash. + */ +extern JS_PUBLIC_API(bool) +JS_IsAboutToBeFinalized(JS::Heap *objp); + +extern JS_PUBLIC_API(bool) +JS_IsAboutToBeFinalizedUnbarriered(JSObject **objp); + +typedef enum JSGCParamKey { + /* Maximum nominal heap before last ditch GC. */ + JSGC_MAX_BYTES = 0, + + /* Number of JS_malloc bytes before last ditch GC. */ + JSGC_MAX_MALLOC_BYTES = 1, + + /* Amount of bytes allocated by the GC. */ + JSGC_BYTES = 3, + + /* Number of times when GC was invoked. */ + JSGC_NUMBER = 4, + + /* Max size of the code cache in bytes. */ + JSGC_MAX_CODE_CACHE_BYTES = 5, + + /* Select GC mode. */ + JSGC_MODE = 6, + + /* Number of cached empty GC chunks. */ + JSGC_UNUSED_CHUNKS = 7, + + /* Total number of allocated GC chunks. */ + JSGC_TOTAL_CHUNKS = 8, + + /* Max milliseconds to spend in an incremental GC slice. */ + JSGC_SLICE_TIME_BUDGET = 9, + + /* Maximum size the GC mark stack can grow to. */ + JSGC_MARK_STACK_LIMIT = 10, + + /* + * GCs less than this far apart in time will be considered 'high-frequency GCs'. + * See setGCLastBytes in jsgc.cpp. + */ + JSGC_HIGH_FREQUENCY_TIME_LIMIT = 11, + + /* Start of dynamic heap growth. */ + JSGC_HIGH_FREQUENCY_LOW_LIMIT = 12, + + /* End of dynamic heap growth. */ + JSGC_HIGH_FREQUENCY_HIGH_LIMIT = 13, + + /* Upper bound of heap growth. */ + JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX = 14, + + /* Lower bound of heap growth. */ + JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN = 15, + + /* Heap growth for low frequency GCs. */ + JSGC_LOW_FREQUENCY_HEAP_GROWTH = 16, + + /* + * If false, the heap growth factor is fixed at 3. If true, it is determined + * based on whether GCs are high- or low- frequency. + */ + JSGC_DYNAMIC_HEAP_GROWTH = 17, + + /* If true, high-frequency GCs will use a longer mark slice. */ + JSGC_DYNAMIC_MARK_SLICE = 18, + + /* Lower limit after which we limit the heap growth. */ + JSGC_ALLOCATION_THRESHOLD = 19, + + /* + * We decommit memory lazily. If more than this number of megabytes is + * available to be decommitted, then JS_MaybeGC will trigger a shrinking GC + * to decommit it. + */ + JSGC_DECOMMIT_THRESHOLD = 20, + + /* + * We try to keep at least this many unused chunks in the free chunk pool at + * all times, even after a shrinking GC. + */ + JSGC_MIN_EMPTY_CHUNK_COUNT = 21, + + /* We never keep more than this many unused chunks in the free chunk pool. */ + JSGC_MAX_EMPTY_CHUNK_COUNT = 22 +} JSGCParamKey; + +extern JS_PUBLIC_API(void) +JS_SetGCParameter(JSRuntime *rt, JSGCParamKey key, uint32_t value); + +extern JS_PUBLIC_API(uint32_t) +JS_GetGCParameter(JSRuntime *rt, JSGCParamKey key); + +extern JS_PUBLIC_API(void) +JS_SetGCParameterForThread(JSContext *cx, JSGCParamKey key, uint32_t value); + +extern JS_PUBLIC_API(uint32_t) +JS_GetGCParameterForThread(JSContext *cx, JSGCParamKey key); + +extern JS_PUBLIC_API(void) +JS_SetGCParametersBasedOnAvailableMemory(JSRuntime *rt, uint32_t availMem); + +/* + * Create a new JSString whose chars member refers to external memory, i.e., + * memory requiring application-specific finalization. + */ +extern JS_PUBLIC_API(JSString *) +JS_NewExternalString(JSContext *cx, const jschar *chars, size_t length, + const JSStringFinalizer *fin); + +/* + * Return whether 'str' was created with JS_NewExternalString or + * JS_NewExternalStringWithClosure. + */ +extern JS_PUBLIC_API(bool) +JS_IsExternalString(JSString *str); + +/* + * Return the 'closure' arg passed to JS_NewExternalStringWithClosure or + * nullptr if the external string was created via JS_NewExternalString. + */ +extern JS_PUBLIC_API(const JSStringFinalizer *) +JS_GetExternalStringFinalizer(JSString *str); + +/* + * Set the size of the native stack that should not be exceed. To disable + * stack size checking pass 0. + * + * SpiderMonkey allows for a distinction between system code (such as GCs, which + * may incidentally be triggered by script but are not strictly performed on + * behalf of such script), trusted script (as determined by JS_SetTrustedPrincipals), + * and untrusted script. Each kind of code may have a different stack quota, + * allowing embedders to keep higher-priority machinery running in the face of + * scripted stack exhaustion by something else. + * + * The stack quotas for each kind of code should be monotonically descending, + * and may be specified with this function. If 0 is passed for a given kind + * of code, it defaults to the value of the next-highest-priority kind. + */ +extern JS_PUBLIC_API(void) +JS_SetNativeStackQuota(JSRuntime *cx, size_t systemCodeStackSize, + size_t trustedScriptStackSize = 0, + size_t untrustedScriptStackSize = 0); + +/************************************************************************/ + +extern JS_PUBLIC_API(int) +JS_IdArrayLength(JSContext *cx, JSIdArray *ida); + +extern JS_PUBLIC_API(jsid) +JS_IdArrayGet(JSContext *cx, JSIdArray *ida, unsigned index); + +extern JS_PUBLIC_API(void) +JS_DestroyIdArray(JSContext *cx, JSIdArray *ida); + +namespace JS { + +class AutoIdArray : private AutoGCRooter +{ + public: + AutoIdArray(JSContext *cx, JSIdArray *ida + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : AutoGCRooter(cx, IDARRAY), context(cx), idArray(ida) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + ~AutoIdArray() { + if (idArray) + JS_DestroyIdArray(context, idArray); + } + bool operator!() const { + return !idArray; + } + jsid operator[](size_t i) const { + JS_ASSERT(idArray); + return JS_IdArrayGet(context, idArray, unsigned(i)); + } + size_t length() const { + return JS_IdArrayLength(context, idArray); + } + + friend void AutoGCRooter::trace(JSTracer *trc); + + JSIdArray *steal() { + JSIdArray *copy = idArray; + idArray = nullptr; + return copy; + } + + protected: + inline void trace(JSTracer *trc); + + private: + JSContext *context; + JSIdArray *idArray; + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER + + /* No copy or assignment semantics. */ + AutoIdArray(AutoIdArray &ida) MOZ_DELETE; + void operator=(AutoIdArray &ida) MOZ_DELETE; +}; + +} /* namespace JS */ + +extern JS_PUBLIC_API(bool) +JS_ValueToId(JSContext *cx, JS::HandleValue v, JS::MutableHandleId idp); + +extern JS_PUBLIC_API(bool) +JS_StringToId(JSContext *cx, JS::HandleString s, JS::MutableHandleId idp); + +extern JS_PUBLIC_API(bool) +JS_IdToValue(JSContext *cx, jsid id, JS::MutableHandle vp); + +/* + * Invoke the [[DefaultValue]] hook (see ES5 8.6.2) with the provided hint on + * the specified object, computing a primitive default value for the object. + * The hint must be JSTYPE_STRING, JSTYPE_NUMBER, or JSTYPE_VOID (no hint). On + * success the resulting value is stored in *vp. + */ +extern JS_PUBLIC_API(bool) +JS_DefaultValue(JSContext *cx, JS::Handle obj, JSType hint, + JS::MutableHandle vp); + +extern JS_PUBLIC_API(bool) +JS_PropertyStub(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_StrictPropertyStub(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool strict, + JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_DeletePropertyStub(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + bool *succeeded); + +extern JS_PUBLIC_API(bool) +JS_EnumerateStub(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(bool) +JS_ResolveStub(JSContext *cx, JS::HandleObject obj, JS::HandleId id); + +extern JS_PUBLIC_API(bool) +JS_ConvertStub(JSContext *cx, JS::HandleObject obj, JSType type, + JS::MutableHandleValue vp); + +struct JSConstDoubleSpec { + double dval; + const char *name; + uint8_t flags; + uint8_t spare[3]; +}; + +struct JSJitInfo; + +/* + * Wrappers to replace {Strict,}PropertyOp for JSPropertySpecs. This will allow + * us to pass one JSJitInfo per function with the property spec, without + * additional field overhead. + */ +typedef struct JSStrictPropertyOpWrapper { + JSStrictPropertyOp op; + const JSJitInfo *info; +} JSStrictPropertyOpWrapper; + +typedef struct JSPropertyOpWrapper { + JSPropertyOp op; + const JSJitInfo *info; +} JSPropertyOpWrapper; + +/* + * Wrapper to do as above, but for JSNatives for JSFunctionSpecs. + */ +typedef struct JSNativeWrapper { + JSNative op; + const JSJitInfo *info; +} JSNativeWrapper; + +/* + * Macro static initializers which make it easy to pass no JSJitInfo as part of a + * JSPropertySpec or JSFunctionSpec. + */ +#define JSOP_WRAPPER(op) { {op, nullptr} } +#define JSOP_NULLWRAPPER JSOP_WRAPPER(nullptr) + +/* + * To define an array element rather than a named property member, cast the + * element's index to (const char *) and initialize name with it, and set the + * JSPROP_INDEX bit in flags. + */ +struct JSPropertySpec { + struct SelfHostedWrapper { + void *unused; + const char *funname; + }; + + const char *name; + uint8_t flags; + union { + JSPropertyOpWrapper propertyOp; + SelfHostedWrapper selfHosted; + } getter; + union { + JSStrictPropertyOpWrapper propertyOp; + SelfHostedWrapper selfHosted; + } setter; + +private: + void StaticAsserts() { + JS_STATIC_ASSERT(sizeof(SelfHostedWrapper) == sizeof(JSPropertyOpWrapper)); + JS_STATIC_ASSERT(sizeof(SelfHostedWrapper) == sizeof(JSStrictPropertyOpWrapper)); + JS_STATIC_ASSERT(offsetof(SelfHostedWrapper, funname) == + offsetof(JSPropertyOpWrapper, info)); + } +}; + +namespace JS { +namespace detail { + +/* NEVER DEFINED, DON'T USE. For use by JS_CAST_NATIVE_TO only. */ +inline int CheckIsNative(JSNative native); + +/* NEVER DEFINED, DON'T USE. For use by JS_CAST_STRING_TO only. */ +template +inline int +CheckIsCharacterLiteral(const char (&arr)[N]); + +} // namespace detail +} // namespace JS + +#define JS_CAST_NATIVE_TO(v, To) \ + (static_cast(sizeof(JS::detail::CheckIsNative(v))), \ + reinterpret_cast(v)) + +#define JS_CAST_STRING_TO(s, To) \ + (static_cast(sizeof(JS::detail::CheckIsCharacterLiteral(s))), \ + reinterpret_cast(s)) + +#define JS_CHECK_ACCESSOR_FLAGS(flags) \ + (static_cast::Type>(0), \ + (flags)) + +/* + * JSPropertySpec uses JSAPI JSPropertyOp and JSStrictPropertyOp in function + * signatures. These macros encapsulate the definition of JSNative-backed + * JSPropertySpecs, performing type-safe casts on the getter/setter functions + * and adding the necessary property flags to trigger interpretation as + * JSNatives. + */ +#define JS_PSG(name, getter, flags) \ + {name, \ + uint8_t(JS_CHECK_ACCESSOR_FLAGS(flags) | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS), \ + JSOP_WRAPPER(JS_CAST_NATIVE_TO(getter, JSPropertyOp)), \ + JSOP_NULLWRAPPER} +#define JS_PSGS(name, getter, setter, flags) \ + {name, \ + uint8_t(JS_CHECK_ACCESSOR_FLAGS(flags) | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS), \ + JSOP_WRAPPER(JS_CAST_NATIVE_TO(getter, JSPropertyOp)), \ + JSOP_WRAPPER(JS_CAST_NATIVE_TO(setter, JSStrictPropertyOp))} +#define JS_SELF_HOSTED_GET(name, getterName, flags) \ + {name, \ + uint8_t(JS_CHECK_ACCESSOR_FLAGS(flags) | JSPROP_SHARED | JSPROP_GETTER), \ + { nullptr, JS_CAST_STRING_TO(getterName, const JSJitInfo *) }, \ + JSOP_NULLWRAPPER } +#define JS_SELF_HOSTED_GETSET(name, getterName, setterName, flags) \ + {name, \ + uint8_t(JS_CHECK_ACCESSOR_FLAGS(flags) | JSPROP_SHARED | JSPROP_GETTER | JSPROP_SETTER), \ + { nullptr, JS_CAST_STRING_TO(getterName, const JSJitInfo *) }, \ + { nullptr, JS_CAST_STRING_TO(setterName, const JSJitInfo *) } } +#define JS_PS_END { nullptr, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER } + +/* + * To define a native function, set call to a JSNativeWrapper. To define a + * self-hosted function, set selfHostedName to the name of a function + * compiled during JSRuntime::initSelfHosting. + */ +struct JSFunctionSpec { + const char *name; + JSNativeWrapper call; + uint16_t nargs; + uint16_t flags; + const char *selfHostedName; +}; + +/* + * Terminating sentinel initializer to put at the end of a JSFunctionSpec array + * that's passed to JS_DefineFunctions or JS_InitClass. + */ +#define JS_FS_END JS_FS(nullptr,nullptr,0,0) + +/* + * Initializer macros for a JSFunctionSpec array element. JS_FN (whose name pays + * homage to the old JSNative/JSFastNative split) simply adds the flag + * JSFUN_STUB_GSOPS. JS_FNINFO allows the simple adding of + * JSJitInfos. JS_SELF_HOSTED_FN declares a self-hosted function. Finally + * JS_FNSPEC has slots for all the fields. + */ +#define JS_FS(name,call,nargs,flags) \ + JS_FNSPEC(name, call, nullptr, nargs, flags, nullptr) +#define JS_FN(name,call,nargs,flags) \ + JS_FNSPEC(name, call, nullptr, nargs, (flags) | JSFUN_STUB_GSOPS, nullptr) +#define JS_FNINFO(name,call,info,nargs,flags) \ + JS_FNSPEC(name, call, info, nargs, flags, nullptr) +#define JS_SELF_HOSTED_FN(name,selfHostedName,nargs,flags) \ + JS_FNSPEC(name, nullptr, nullptr, nargs, flags, selfHostedName) +#define JS_FNSPEC(name,call,info,nargs,flags,selfHostedName) \ + {name, {call, info}, nargs, flags, selfHostedName} + +extern JS_PUBLIC_API(JSObject *) +JS_InitClass(JSContext *cx, JS::HandleObject obj, JS::HandleObject parent_proto, + const JSClass *clasp, JSNative constructor, unsigned nargs, + const JSPropertySpec *ps, const JSFunctionSpec *fs, + const JSPropertySpec *static_ps, const JSFunctionSpec *static_fs); + +/* + * Set up ctor.prototype = proto and proto.constructor = ctor with the + * right property flags. + */ +extern JS_PUBLIC_API(bool) +JS_LinkConstructorAndPrototype(JSContext *cx, JS::Handle ctor, + JS::Handle proto); + +extern JS_PUBLIC_API(const JSClass *) +JS_GetClass(JSObject *obj); + +extern JS_PUBLIC_API(bool) +JS_InstanceOf(JSContext *cx, JS::Handle obj, const JSClass *clasp, JS::CallArgs *args); + +extern JS_PUBLIC_API(bool) +JS_HasInstance(JSContext *cx, JS::Handle obj, JS::Handle v, bool *bp); + +extern JS_PUBLIC_API(void *) +JS_GetPrivate(JSObject *obj); + +extern JS_PUBLIC_API(void) +JS_SetPrivate(JSObject *obj, void *data); + +extern JS_PUBLIC_API(void *) +JS_GetInstancePrivate(JSContext *cx, JS::Handle obj, const JSClass *clasp, + JS::CallArgs *args); + +extern JS_PUBLIC_API(bool) +JS_GetPrototype(JSContext *cx, JS::HandleObject obj, JS::MutableHandleObject protop); + +extern JS_PUBLIC_API(bool) +JS_SetPrototype(JSContext *cx, JS::HandleObject obj, JS::HandleObject proto); + +extern JS_PUBLIC_API(JSObject *) +JS_GetParent(JSObject *obj); + +extern JS_PUBLIC_API(bool) +JS_SetParent(JSContext *cx, JS::HandleObject obj, JS::HandleObject parent); + +extern JS_PUBLIC_API(JSObject *) +JS_GetConstructor(JSContext *cx, JS::Handle proto); + +namespace JS { + +enum ZoneSpecifier { + FreshZone = 0, + SystemZone = 1 +}; + +class JS_PUBLIC_API(CompartmentOptions) +{ + public: + class Override { + public: + Override() : mode_(Default) {} + + bool get(bool defaultValue) const { + if (mode_ == Default) + return defaultValue; + return mode_ == ForceTrue; + }; + + void set(bool overrideValue) { + mode_ = overrideValue ? ForceTrue : ForceFalse; + }; + + void reset() { + mode_ = Default; + } + + private: + enum Mode { + Default, + ForceTrue, + ForceFalse + }; + + Mode mode_; + }; + + explicit CompartmentOptions() + : version_(JSVERSION_UNKNOWN) + , invisibleToDebugger_(false) + , mergeable_(false) + , discardSource_(false) + , cloneSingletons_(false) + , traceGlobal_(nullptr) + , singletonsAsTemplates_(true) + , addonId_(nullptr) + { + zone_.spec = JS::FreshZone; + } + + JSVersion version() const { return version_; } + CompartmentOptions &setVersion(JSVersion aVersion) { + MOZ_ASSERT(aVersion != JSVERSION_UNKNOWN); + version_ = aVersion; + return *this; + } + + // Certain scopes (i.e. XBL compilation scopes) are implementation details + // of the embedding, and references to them should never leak out to script. + // This flag causes the this compartment to skip firing onNewGlobalObject + // and makes addDebuggee a no-op for this global. + bool invisibleToDebugger() const { return invisibleToDebugger_; } + CompartmentOptions &setInvisibleToDebugger(bool flag) { + invisibleToDebugger_ = flag; + return *this; + } + + // Compartments used for off-thread compilation have their contents merged + // into a target compartment when the compilation is finished. This is only + // allowed if this flag is set. The invisibleToDebugger flag must also be + // set for such compartments. + bool mergeable() const { return mergeable_; } + CompartmentOptions &setMergeable(bool flag) { + mergeable_ = flag; + return *this; + } + + // For certain globals, we know enough about the code that will run in them + // that we can discard script source entirely. + bool discardSource() const { return discardSource_; } + CompartmentOptions &setDiscardSource(bool flag) { + discardSource_ = flag; + return *this; + } + + + bool cloneSingletons() const { return cloneSingletons_; } + CompartmentOptions &setCloneSingletons(bool flag) { + cloneSingletons_ = flag; + return *this; + } + + void *zonePointer() const { + JS_ASSERT(uintptr_t(zone_.pointer) > uintptr_t(JS::SystemZone)); + return zone_.pointer; + } + ZoneSpecifier zoneSpecifier() const { return zone_.spec; } + CompartmentOptions &setZone(ZoneSpecifier spec); + CompartmentOptions &setSameZoneAs(JSObject *obj); + + void setSingletonsAsValues() { + singletonsAsTemplates_ = false; + } + bool getSingletonsAsTemplates() const { + return singletonsAsTemplates_; + }; + + // A null add-on ID means that the compartment is not associated with an + // add-on. + JSAddonId *addonIdOrNull() const { return addonId_; } + CompartmentOptions &setAddonId(JSAddonId *id) { + addonId_ = id; + return *this; + } + + CompartmentOptions &setTrace(JSTraceOp op) { + traceGlobal_ = op; + return *this; + } + JSTraceOp getTrace() const { + return traceGlobal_; + } + + private: + JSVersion version_; + bool invisibleToDebugger_; + bool mergeable_; + bool discardSource_; + bool cloneSingletons_; + union { + ZoneSpecifier spec; + void *pointer; // js::Zone* is not exposed in the API. + } zone_; + JSTraceOp traceGlobal_; + + // To XDR singletons, we need to ensure that all singletons are all used as + // templates, by making JSOP_OBJECT return a clone of the JSScript + // singleton, instead of returning the value which is baked in the JSScript. + bool singletonsAsTemplates_; + + JSAddonId *addonId_; +}; + +JS_PUBLIC_API(CompartmentOptions &) +CompartmentOptionsRef(JSCompartment *compartment); + +JS_PUBLIC_API(CompartmentOptions &) +CompartmentOptionsRef(JSObject *obj); + +JS_PUBLIC_API(CompartmentOptions &) +CompartmentOptionsRef(JSContext *cx); + +// During global creation, we fire notifications to callbacks registered +// via the Debugger API. These callbacks are arbitrary script, and can touch +// the global in arbitrary ways. When that happens, the global should not be +// in a half-baked state. But this creates a problem for consumers that need +// to set slots on the global to put it in a consistent state. +// +// This API provides a way for consumers to set slots atomically (immediately +// after the global is created), before any debugger hooks are fired. It's +// unfortunately on the clunky side, but that's the way the cookie crumbles. +// +// If callers have no additional state on the global to set up, they may pass +// |FireOnNewGlobalHook| to JS_NewGlobalObject, which causes that function to +// fire the hook as its final act before returning. Otherwise, callers should +// pass |DontFireOnNewGlobalHook|, which means that they are responsible for +// invoking JS_FireOnNewGlobalObject upon successfully creating the global. If +// an error occurs and the operation aborts, callers should skip firing the +// hook. But otherwise, callers must take care to fire the hook exactly once +// before compiling any script in the global's scope (we have assertions in +// place to enforce this). This lets us be sure that debugger clients never miss +// breakpoints. +enum OnNewGlobalHookOption { + FireOnNewGlobalHook, + DontFireOnNewGlobalHook +}; + +} /* namespace JS */ + +extern JS_PUBLIC_API(JSObject *) +JS_NewGlobalObject(JSContext *cx, const JSClass *clasp, JSPrincipals *principals, + JS::OnNewGlobalHookOption hookOption, + const JS::CompartmentOptions &options = JS::CompartmentOptions()); +/* + * Spidermonkey does not have a good way of keeping track of what compartments should be marked on + * their own. We can mark the roots unconditionally, but marking GC things only relevant in live + * compartments is hard. To mitigate this, we create a static trace hook, installed on each global + * object, from which we can be sure the compartment is relevant, and mark it. + * + * It is still possible to specify custom trace hooks for global object classes. They can be + * provided via the CompartmentOptions passed to JS_NewGlobalObject. + */ +extern JS_PUBLIC_API(void) +JS_GlobalObjectTraceHook(JSTracer *trc, JSObject *global); + +extern JS_PUBLIC_API(void) +JS_FireOnNewGlobalObject(JSContext *cx, JS::HandleObject global); + +extern JS_PUBLIC_API(JSObject *) +JS_NewObject(JSContext *cx, const JSClass *clasp, JS::Handle proto, + JS::Handle parent); + +/* Queries the [[Extensible]] property of the object. */ +extern JS_PUBLIC_API(bool) +JS_IsExtensible(JSContext *cx, JS::HandleObject obj, bool *extensible); + +extern JS_PUBLIC_API(bool) +JS_IsNative(JSObject *obj); + +extern JS_PUBLIC_API(JSRuntime *) +JS_GetObjectRuntime(JSObject *obj); + +/* + * Unlike JS_NewObject, JS_NewObjectWithGivenProto does not compute a default + * proto if proto's actual parameter value is null. + */ +extern JS_PUBLIC_API(JSObject *) +JS_NewObjectWithGivenProto(JSContext *cx, const JSClass *clasp, JS::Handle proto, + JS::Handle parent); + +/* + * Freeze obj, and all objects it refers to, recursively. This will not recurse + * through non-extensible objects, on the assumption that those are already + * deep-frozen. + */ +extern JS_PUBLIC_API(bool) +JS_DeepFreezeObject(JSContext *cx, JS::Handle obj); + +/* + * Freezes an object; see ES5's Object.freeze(obj) method. + */ +extern JS_PUBLIC_API(bool) +JS_FreezeObject(JSContext *cx, JS::Handle obj); + +extern JS_PUBLIC_API(bool) +JS_PreventExtensions(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(JSObject *) +JS_New(JSContext *cx, JS::HandleObject ctor, const JS::HandleValueArray& args); + +extern JS_PUBLIC_API(JSObject *) +JS_DefineObject(JSContext *cx, JS::HandleObject obj, const char *name, + const JSClass *clasp = nullptr, JS::HandleObject proto = JS::NullPtr(), + unsigned attrs = 0); + +extern JS_PUBLIC_API(bool) +JS_DefineConstDoubles(JSContext *cx, JS::HandleObject obj, const JSConstDoubleSpec *cds); + +extern JS_PUBLIC_API(bool) +JS_DefineProperties(JSContext *cx, JS::HandleObject obj, const JSPropertySpec *ps); + +extern JS_PUBLIC_API(bool) +JS_DefineProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::HandleValue value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::HandleObject value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::HandleString value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineProperty(JSContext *cx, JS::HandleObject obj, const char *name, int32_t value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineProperty(JSContext *cx, JS::HandleObject obj, const char *name, uint32_t value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineProperty(JSContext *cx, JS::HandleObject obj, const char *name, double value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefinePropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefinePropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefinePropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleString value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefinePropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, int32_t value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefinePropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, uint32_t value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefinePropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, double value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_AlreadyHasOwnProperty(JSContext *cx, JS::HandleObject obj, const char *name, + bool *foundp); + +extern JS_PUBLIC_API(bool) +JS_AlreadyHasOwnPropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + bool *foundp); + +extern JS_PUBLIC_API(bool) +JS_HasProperty(JSContext *cx, JS::HandleObject obj, const char *name, bool *foundp); + +extern JS_PUBLIC_API(bool) +JS_HasPropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool *foundp); + +extern JS_PUBLIC_API(bool) +JS_LookupProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_LookupPropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleValue vp); + +struct JSPropertyDescriptor { + JSObject *obj; + unsigned attrs; + JSPropertyOp getter; + JSStrictPropertyOp setter; + JS::Value value; + + JSPropertyDescriptor() + : obj(nullptr), attrs(0), getter(nullptr), setter(nullptr), value(JSVAL_VOID) + {} + + void trace(JSTracer *trc); + + static js::ThingRootKind rootKind() { return js::THING_ROOT_PROPERTY_DESCRIPTOR; } +}; + +namespace JS { + +template +class PropertyDescriptorOperations +{ + const JSPropertyDescriptor * desc() const { return static_cast(this)->extract(); } + + public: + bool isEnumerable() const { return desc()->attrs & JSPROP_ENUMERATE; } + bool isReadonly() const { return desc()->attrs & JSPROP_READONLY; } + bool isPermanent() const { return desc()->attrs & JSPROP_PERMANENT; } + bool hasNativeAccessors() const { return desc()->attrs & JSPROP_NATIVE_ACCESSORS; } + bool hasGetterObject() const { return desc()->attrs & JSPROP_GETTER; } + bool hasSetterObject() const { return desc()->attrs & JSPROP_SETTER; } + bool hasGetterOrSetterObject() const { return desc()->attrs & (JSPROP_GETTER | JSPROP_SETTER); } + bool hasGetterOrSetter() const { return desc()->getter || desc()->setter; } + bool isShared() const { return desc()->attrs & JSPROP_SHARED; } + bool isIndex() const { return desc()->attrs & JSPROP_INDEX; } + bool hasAttributes(unsigned attrs) const { return desc()->attrs & attrs; } + + JS::HandleObject object() const { + return JS::HandleObject::fromMarkedLocation(&desc()->obj); + } + unsigned attributes() const { return desc()->attrs; } + JSPropertyOp getter() const { return desc()->getter; } + JSStrictPropertyOp setter() const { return desc()->setter; } + JS::HandleObject getterObject() const { + MOZ_ASSERT(hasGetterObject()); + return JS::HandleObject::fromMarkedLocation( + reinterpret_cast(&desc()->getter)); + } + JS::HandleObject setterObject() const { + MOZ_ASSERT(hasSetterObject()); + return JS::HandleObject::fromMarkedLocation( + reinterpret_cast(&desc()->setter)); + } + JS::HandleValue value() const { + return JS::HandleValue::fromMarkedLocation(&desc()->value); + } +}; + +template +class MutablePropertyDescriptorOperations : public PropertyDescriptorOperations +{ + JSPropertyDescriptor * desc() { return static_cast(this)->extractMutable(); } + + public: + + void clear() { + object().set(nullptr); + setAttributes(0); + setGetter(nullptr); + setSetter(nullptr); + value().setUndefined(); + } + + void assign(JSPropertyDescriptor &other) { + object().set(other.obj); + setAttributes(other.attrs); + setGetter(other.getter); + setSetter(other.setter); + value().set(other.value); + } + + JS::MutableHandleObject object() { + return JS::MutableHandleObject::fromMarkedLocation(&desc()->obj); + } + unsigned &attributesRef() { return desc()->attrs; } + JSPropertyOp &getter() { return desc()->getter; } + JSStrictPropertyOp &setter() { return desc()->setter; } + JS::MutableHandleValue value() { + return JS::MutableHandleValue::fromMarkedLocation(&desc()->value); + } + + void setEnumerable() { desc()->attrs |= JSPROP_ENUMERATE; } + void setAttributes(unsigned attrs) { desc()->attrs = attrs; } + + void setGetter(JSPropertyOp op) { desc()->getter = op; } + void setSetter(JSStrictPropertyOp op) { desc()->setter = op; } + void setGetterObject(JSObject *obj) { desc()->getter = reinterpret_cast(obj); } + void setSetterObject(JSObject *obj) { desc()->setter = reinterpret_cast(obj); } + + JS::MutableHandleObject getterObject() { + MOZ_ASSERT(this->hasGetterObject()); + return JS::MutableHandleObject::fromMarkedLocation( + reinterpret_cast(&desc()->getter)); + } + JS::MutableHandleObject setterObject() { + MOZ_ASSERT(this->hasSetterObject()); + return JS::MutableHandleObject::fromMarkedLocation( + reinterpret_cast(&desc()->setter)); + } +}; + +} /* namespace JS */ + +namespace js { + +template <> +struct GCMethods { + static JSPropertyDescriptor initial() { return JSPropertyDescriptor(); } + static bool poisoned(const JSPropertyDescriptor &desc) { + return (desc.obj && JS::IsPoisonedPtr(desc.obj)) || + (desc.attrs & JSPROP_GETTER && desc.getter && JS::IsPoisonedPtr(desc.getter)) || + (desc.attrs & JSPROP_SETTER && desc.setter && JS::IsPoisonedPtr(desc.setter)) || + (desc.value.isGCThing() && JS::IsPoisonedPtr(desc.value.toGCThing())); + } +}; + +template <> +class RootedBase + : public JS::MutablePropertyDescriptorOperations > +{ + friend class JS::PropertyDescriptorOperations >; + friend class JS::MutablePropertyDescriptorOperations >; + const JSPropertyDescriptor *extract() const { + return static_cast*>(this)->address(); + } + JSPropertyDescriptor *extractMutable() { + return static_cast*>(this)->address(); + } +}; + +template <> +class HandleBase + : public JS::PropertyDescriptorOperations > +{ + friend class JS::PropertyDescriptorOperations >; + const JSPropertyDescriptor *extract() const { + return static_cast*>(this)->address(); + } +}; + +template <> +class MutableHandleBase + : public JS::MutablePropertyDescriptorOperations > +{ + friend class JS::PropertyDescriptorOperations >; + friend class JS::MutablePropertyDescriptorOperations >; + const JSPropertyDescriptor *extract() const { + return static_cast*>(this)->address(); + } + JSPropertyDescriptor *extractMutable() { + return static_cast*>(this)->address(); + } +}; + +} /* namespace js */ + +namespace JS { + +extern JS_PUBLIC_API(bool) +ParsePropertyDescriptorObject(JSContext *cx, + JS::HandleObject obj, + JS::HandleValue descriptor, + JS::MutableHandle desc); + +} // namespace JS + +extern JS_PUBLIC_API(bool) +JS_GetOwnPropertyDescriptorById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandle desc); + +extern JS_PUBLIC_API(bool) +JS_GetOwnPropertyDescriptor(JSContext *cx, JS::HandleObject obj, const char *name, + JS::MutableHandle desc); + +/* + * Like JS_GetOwnPropertyDescriptorById but will return a property on + * an object on the prototype chain (returned in desc->obj). If desc->obj is null, + * then this property was not found on the prototype chain. + */ +extern JS_PUBLIC_API(bool) +JS_GetPropertyDescriptorById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandle desc); + +extern JS_PUBLIC_API(bool) +JS_GetPropertyDescriptor(JSContext *cx, JS::HandleObject obj, const char *name, + JS::MutableHandle desc); + +extern JS_PUBLIC_API(bool) +JS_GetProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_GetPropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_ForwardGetPropertyTo(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject onBehalfOf, + JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_SetProperty(JSContext *cx, JS::HandleObject obj, const char *name, JS::HandleValue v); + +extern JS_PUBLIC_API(bool) +JS_SetPropertyById(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue v); + +extern JS_PUBLIC_API(bool) +JS_DeleteProperty(JSContext *cx, JS::HandleObject obj, const char *name); + +extern JS_PUBLIC_API(bool) +JS_DeleteProperty2(JSContext *cx, JS::HandleObject obj, const char *name, bool *succeeded); + +extern JS_PUBLIC_API(bool) +JS_DeletePropertyById(JSContext *cx, JS::HandleObject obj, jsid id); + +extern JS_PUBLIC_API(bool) +JS_DeletePropertyById2(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool *succeeded); + +extern JS_PUBLIC_API(bool) +JS_DefineUCProperty(JSContext *cx, JS::HandleObject obj, const jschar *name, size_t namelen, + JS::HandleValue value, unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineUCProperty(JSContext *cx, JS::HandleObject obj, const jschar *name, size_t namelen, + JS::HandleObject value, unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineUCProperty(JSContext *cx, JS::HandleObject obj, const jschar *name, size_t namelen, + JS::HandleString value, unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineUCProperty(JSContext *cx, JS::HandleObject obj, const jschar *name, size_t namelen, + int32_t value, unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineUCProperty(JSContext *cx, JS::HandleObject obj, const jschar *name, size_t namelen, + uint32_t value, unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineUCProperty(JSContext *cx, JS::HandleObject obj, const jschar *name, size_t namelen, + double value, unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_AlreadyHasOwnUCProperty(JSContext *cx, JS::HandleObject obj, const jschar *name, + size_t namelen, bool *foundp); + +extern JS_PUBLIC_API(bool) +JS_HasUCProperty(JSContext *cx, JS::HandleObject obj, + const jschar *name, size_t namelen, + bool *vp); + +extern JS_PUBLIC_API(bool) +JS_LookupUCProperty(JSContext *cx, JS::HandleObject obj, + const jschar *name, size_t namelen, + JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_GetUCProperty(JSContext *cx, JS::HandleObject obj, + const jschar *name, size_t namelen, + JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_SetUCProperty(JSContext *cx, JS::HandleObject obj, + const jschar *name, size_t namelen, + JS::HandleValue v); + +extern JS_PUBLIC_API(bool) +JS_DeleteUCProperty2(JSContext *cx, JS::HandleObject obj, const jschar *name, size_t namelen, + bool *succeeded); + +extern JS_PUBLIC_API(JSObject *) +JS_NewArrayObject(JSContext *cx, const JS::HandleValueArray& contents); + +extern JS_PUBLIC_API(JSObject *) +JS_NewArrayObject(JSContext *cx, size_t length); + +extern JS_PUBLIC_API(bool) +JS_IsArrayObject(JSContext *cx, JS::HandleValue value); + +extern JS_PUBLIC_API(bool) +JS_IsArrayObject(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(bool) +JS_GetArrayLength(JSContext *cx, JS::Handle obj, uint32_t *lengthp); + +extern JS_PUBLIC_API(bool) +JS_SetArrayLength(JSContext *cx, JS::Handle obj, uint32_t length); + +extern JS_PUBLIC_API(bool) +JS_DefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleValue value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleObject value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleString value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, int32_t value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, uint32_t value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_DefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, double value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +extern JS_PUBLIC_API(bool) +JS_AlreadyHasOwnElement(JSContext *cx, JS::HandleObject obj, uint32_t index, bool *foundp); + +extern JS_PUBLIC_API(bool) +JS_HasElement(JSContext *cx, JS::HandleObject obj, uint32_t index, bool *foundp); + +extern JS_PUBLIC_API(bool) +JS_LookupElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_GetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_ForwardGetElementTo(JSContext *cx, JS::HandleObject obj, uint32_t index, + JS::HandleObject onBehalfOf, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(bool) +JS_SetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleValue v); + +extern JS_PUBLIC_API(bool) +JS_SetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleObject v); + +extern JS_PUBLIC_API(bool) +JS_SetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleString v); + +extern JS_PUBLIC_API(bool) +JS_SetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, int32_t v); + +extern JS_PUBLIC_API(bool) +JS_SetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, uint32_t v); + +extern JS_PUBLIC_API(bool) +JS_SetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, double v); + +extern JS_PUBLIC_API(bool) +JS_DeleteElement(JSContext *cx, JS::HandleObject obj, uint32_t index); + +extern JS_PUBLIC_API(bool) +JS_DeleteElement2(JSContext *cx, JS::HandleObject obj, uint32_t index, bool *succeeded); + +/* + * Remove all configurable properties from the given (non-global) object and + * assign undefined to all writable data properties. + */ +JS_PUBLIC_API(void) +JS_ClearNonGlobalObject(JSContext *cx, JS::HandleObject obj); + +/* + * Assign 'undefined' to all of the object's non-reserved slots. Note: this is + * done for all slots, regardless of the associated property descriptor. + */ +JS_PUBLIC_API(void) +JS_SetAllNonReservedSlotsToUndefined(JSContext *cx, JSObject *objArg); + +/* + * Create a new array buffer with the given contents. On success, the ownership + * is transferred to the new array buffer. + */ +extern JS_PUBLIC_API(JSObject *) +JS_NewArrayBufferWithContents(JSContext *cx, size_t nbytes, void *contents); + +/* + * Steal the contents of the given array buffer. The array buffer has its + * length set to 0 and its contents array cleared. The caller takes ownership + * of the return value and must free it or transfer ownership via + * JS_NewArrayBufferWithContents when done using it. + */ +extern JS_PUBLIC_API(void *) +JS_StealArrayBufferContents(JSContext *cx, JS::HandleObject obj); + +/* + * Allocate memory that may be eventually passed to + * JS_NewArrayBufferWithContents. |maybecx| is optional; if a non-nullptr cx is + * given, it will be used for memory accounting and OOM reporting. |nbytes| is + * the number of payload bytes required. + */ +extern JS_PUBLIC_API(void *) +JS_AllocateArrayBufferContents(JSContext *maybecx, uint32_t nbytes); + +/* + * Reallocate memory allocated by JS_AllocateArrayBufferContents, growing or + * shrinking it as appropriate. If oldContents is null then this behaves like + * JS_AllocateArrayBufferContents. + */ +extern JS_PUBLIC_API(void *) +JS_ReallocateArrayBufferContents(JSContext *cx, uint32_t nbytes, void *oldContents, uint32_t oldNbytes); + +/* + * Create a new mapped array buffer with the given memory mapped contents. On success, + * the ownership is transferred to the new mapped array buffer. + */ +extern JS_PUBLIC_API(JSObject *) +JS_NewMappedArrayBufferWithContents(JSContext *cx, size_t nbytes, void *contents); + +/* + * Create memory mapped array buffer contents. + * Caller must take care of closing fd after calling this function. + */ +extern JS_PUBLIC_API(void *) +JS_CreateMappedArrayBufferContents(int fd, size_t offset, size_t length); + +/* + * Release the allocated resource of mapped array buffer contents before the + * object is created. + * If a new object has been created by JS_NewMappedArrayBufferWithContents() + * with this content, then JS_NeuterArrayBuffer() should be used instead to + * release the resource used by the object. + */ +extern JS_PUBLIC_API(void) +JS_ReleaseMappedArrayBufferContents(void *contents, size_t length); + +extern JS_PUBLIC_API(JSIdArray *) +JS_Enumerate(JSContext *cx, JS::HandleObject obj); + +/* + * Create an object to iterate over enumerable properties of obj, in arbitrary + * property definition order. NB: This differs from longstanding for..in loop + * order, which uses order of property definition in obj. + */ +extern JS_PUBLIC_API(JSObject *) +JS_NewPropertyIterator(JSContext *cx, JS::Handle obj); + +/* + * Return true on success with *idp containing the id of the next enumerable + * property to visit using iterobj, or JSID_IS_VOID if there is no such property + * left to visit. Return false on error. + */ +extern JS_PUBLIC_API(bool) +JS_NextProperty(JSContext *cx, JS::Handle iterobj, jsid *idp); + +extern JS_PUBLIC_API(jsval) +JS_GetReservedSlot(JSObject *obj, uint32_t index); + +extern JS_PUBLIC_API(void) +JS_SetReservedSlot(JSObject *obj, uint32_t index, jsval v); + +/************************************************************************/ + +/* + * Functions and scripts. + */ +extern JS_PUBLIC_API(JSFunction *) +JS_NewFunction(JSContext *cx, JSNative call, unsigned nargs, unsigned flags, + JS::Handle parent, const char *name); + +/* + * Create the function with the name given by the id. JSID_IS_STRING(id) must + * be true. + */ +extern JS_PUBLIC_API(JSFunction *) +JS_NewFunctionById(JSContext *cx, JSNative call, unsigned nargs, unsigned flags, + JS::Handle parent, JS::Handle id); + +namespace JS { + +extern JS_PUBLIC_API(JSFunction *) +GetSelfHostedFunction(JSContext *cx, const char *selfHostedName, JS::Handle id, + unsigned nargs); + +} /* namespace JS */ + +extern JS_PUBLIC_API(JSObject *) +JS_GetFunctionObject(JSFunction *fun); + +/* + * Return the function's identifier as a JSString, or null if fun is unnamed. + * The returned string lives as long as fun, so you don't need to root a saved + * reference to it if fun is well-connected or rooted, and provided you bound + * the use of the saved reference by fun's lifetime. + */ +extern JS_PUBLIC_API(JSString *) +JS_GetFunctionId(JSFunction *fun); + +/* + * Return a function's display name. This is the defined name if one was given + * where the function was defined, or it could be an inferred name by the JS + * engine in the case that the function was defined to be anonymous. This can + * still return nullptr if a useful display name could not be inferred. The + * same restrictions on rooting as those in JS_GetFunctionId apply. + */ +extern JS_PUBLIC_API(JSString *) +JS_GetFunctionDisplayId(JSFunction *fun); + +/* + * Return the arity (length) of fun. + */ +extern JS_PUBLIC_API(uint16_t) +JS_GetFunctionArity(JSFunction *fun); + +/* + * Infallible predicate to test whether obj is a function object (faster than + * comparing obj's class name to "Function", but equivalent unless someone has + * overwritten the "Function" identifier with a different constructor and then + * created instances using that constructor that might be passed in as obj). + */ +extern JS_PUBLIC_API(bool) +JS_ObjectIsFunction(JSContext *cx, JSObject *obj); + +extern JS_PUBLIC_API(bool) +JS_ObjectIsCallable(JSContext *cx, JSObject *obj); + +extern JS_PUBLIC_API(bool) +JS_IsNativeFunction(JSObject *funobj, JSNative call); + +/* Return whether the given function is a valid constructor. */ +extern JS_PUBLIC_API(bool) +JS_IsConstructor(JSFunction *fun); + +/* + * Bind the given callable to use the given object as "this". + * + * If |callable| is not callable, will throw and return nullptr. + */ +extern JS_PUBLIC_API(JSObject*) +JS_BindCallable(JSContext *cx, JS::Handle callable, JS::Handle newThis); + +extern JS_PUBLIC_API(bool) +JS_DefineFunctions(JSContext *cx, JS::Handle obj, const JSFunctionSpec *fs); + +extern JS_PUBLIC_API(JSFunction *) +JS_DefineFunction(JSContext *cx, JS::Handle obj, const char *name, JSNative call, + unsigned nargs, unsigned attrs); + +extern JS_PUBLIC_API(JSFunction *) +JS_DefineUCFunction(JSContext *cx, JS::Handle obj, + const jschar *name, size_t namelen, JSNative call, + unsigned nargs, unsigned attrs); + +extern JS_PUBLIC_API(JSFunction *) +JS_DefineFunctionById(JSContext *cx, JS::Handle obj, JS::Handle id, JSNative call, + unsigned nargs, unsigned attrs); + +/* + * Clone a top-level function into a new scope. This function will dynamically + * fail if funobj was lexically nested inside some other function. + */ +extern JS_PUBLIC_API(JSObject *) +JS_CloneFunctionObject(JSContext *cx, JS::Handle funobj, JS::Handle parent); + +/* + * Given a buffer, return false if the buffer might become a valid + * javascript statement with the addition of more lines. Otherwise return + * true. The intent is to support interactive compilation - accumulate + * lines in a buffer until JS_BufferIsCompilableUnit is true, then pass it to + * the compiler. + */ +extern JS_PUBLIC_API(bool) +JS_BufferIsCompilableUnit(JSContext *cx, JS::Handle obj, const char *utf8, + size_t length); + +/* + * |script| will always be set. On failure, it will be set to nullptr. + */ +extern JS_PUBLIC_API(bool) +JS_CompileScript(JSContext *cx, JS::HandleObject obj, + const char *ascii, size_t length, + const JS::CompileOptions &options, + JS::MutableHandleScript script); + +/* + * |script| will always be set. On failure, it will be set to nullptr. + */ +extern JS_PUBLIC_API(bool) +JS_CompileUCScript(JSContext *cx, JS::HandleObject obj, + const jschar *chars, size_t length, + const JS::CompileOptions &options, + JS::MutableHandleScript script); + +extern JS_PUBLIC_API(JSObject *) +JS_GetGlobalFromScript(JSScript *script); + +/* + * |fun| will always be set. On failure, it will be set to nullptr. + */ +extern JS_PUBLIC_API(bool) +JS_CompileFunction(JSContext *cx, JS::HandleObject obj, const char *name, + unsigned nargs, const char *const *argnames, + const char *bytes, size_t length, + const JS::CompileOptions &options, + JS::MutableHandleFunction fun); + +/* + * |fun| will always be set. On failure, it will be set to nullptr. + */ +extern JS_PUBLIC_API(bool) +JS_CompileUCFunction(JSContext *cx, JS::HandleObject obj, const char *name, + unsigned nargs, const char *const *argnames, + const jschar *chars, size_t length, + const JS::CompileOptions &options, + JS::MutableHandleFunction fun); + +namespace JS { + +/* Options for JavaScript compilation. */ + +/* + * In the most common use case, a CompileOptions instance is allocated on the + * stack, and holds non-owning references to non-POD option values: strings; + * principals; objects; and so on. The code declaring the instance guarantees + * that such option values will outlive the CompileOptions itself: objects are + * otherwise rooted; principals have had their reference counts bumped; strings + * will not be freed until the CompileOptions goes out of scope. In this + * situation, CompileOptions only refers to things others own, so it can be + * lightweight. + * + * In some cases, however, we need to hold compilation options with a + * non-stack-like lifetime. For example, JS::CompileOffThread needs to save + * compilation options where a worker thread can find them, and then return + * immediately. The worker thread will come along at some later point, and use + * the options. + * + * The compiler itself just needs to be able to access a collection of options; + * it doesn't care who owns them, or what's keeping them alive. It does its own + * addrefs/copies/tracing/etc. + * + * So, we have a class hierarchy that reflects these three use cases: + * + * - ReadOnlyCompileOptions is the common base class. It can be used by code + * that simply needs to access options set elsewhere, like the compiler. + * + * - The usual CompileOptions class must be stack-allocated, and holds + * non-owning references to the filename, element, and so on. It's derived + * from ReadOnlyCompileOptions, so the compiler can use it. + * + * - OwningCompileOptions roots / copies / reference counts of all its values, + * and unroots / frees / releases them when it is destructed. It too is + * derived from ReadOnlyCompileOptions, so the compiler accepts it. + */ + +/* + * The common base class for the CompileOptions hierarchy. + * + * Use this in code that only needs to access compilation options created + * elsewhere, like the compiler. Don't instantiate this class (the constructor + * is protected anyway); instead, create instances only of the derived classes: + * CompileOptions and OwningCompileOptions. + */ +class JS_FRIEND_API(ReadOnlyCompileOptions) +{ + friend class CompileOptions; + + protected: + JSPrincipals *originPrincipals_; + const char *filename_; + const char *introducerFilename_; + const jschar *sourceMapURL_; + + // This constructor leaves 'version' set to JSVERSION_UNKNOWN. The structure + // is unusable until that's set to something more specific; the derived + // classes' constructors take care of that, in ways appropriate to their + // purpose. + ReadOnlyCompileOptions() + : originPrincipals_(nullptr), + filename_(nullptr), + introducerFilename_(nullptr), + sourceMapURL_(nullptr), + version(JSVERSION_UNKNOWN), + versionSet(false), + utf8(false), + lineno(1), + column(0), + compileAndGo(false), + forEval(false), + defineOnScope(true), + noScriptRval(false), + selfHostingMode(false), + canLazilyParse(true), + strictOption(false), + extraWarningsOption(false), + werrorOption(false), + asmJSOption(false), + forceAsync(false), + installedFile(false), + sourceIsLazy(false), + introductionType(nullptr), + introductionLineno(0), + introductionOffset(0), + hasIntroductionInfo(false) + { } + + // Set all POD options (those not requiring reference counts, copies, + // rooting, or other hand-holding) to their values in |rhs|. + void copyPODOptions(const ReadOnlyCompileOptions &rhs); + + public: + // Read-only accessors for non-POD options. The proper way to set these + // depends on the derived type. + JSPrincipals *originPrincipals(js::ExclusiveContext *cx) const; + const char *filename() const { return filename_; } + const char *introducerFilename() const { return introducerFilename_; } + const jschar *sourceMapURL() const { return sourceMapURL_; } + virtual JSObject *element() const = 0; + virtual JSString *elementAttributeName() const = 0; + virtual JSScript *introductionScript() const = 0; + + // POD options. + JSVersion version; + bool versionSet; + bool utf8; + unsigned lineno; + unsigned column; + bool compileAndGo; + bool forEval; + bool defineOnScope; + bool noScriptRval; + bool selfHostingMode; + bool canLazilyParse; + bool strictOption; + bool extraWarningsOption; + bool werrorOption; + bool asmJSOption; + bool forceAsync; + bool installedFile; // 'true' iff pre-compiling js file in packaged app + bool sourceIsLazy; + + // |introductionType| is a statically allocated C string: + // one of "eval", "Function", or "GeneratorFunction". + const char *introductionType; + unsigned introductionLineno; + uint32_t introductionOffset; + bool hasIntroductionInfo; + + private: + static JSObject * const nullObjectPtr; + void operator=(const ReadOnlyCompileOptions &) MOZ_DELETE; +}; + +/* + * Compilation options, with dynamic lifetime. An instance of this type + * makes a copy of / holds / roots all dynamically allocated resources + * (principals; elements; strings) that it refers to. Its destructor frees + * / drops / unroots them. This is heavier than CompileOptions, below, but + * unlike CompileOptions, it can outlive any given stack frame. + * + * Note that this *roots* any JS values it refers to - they're live + * unconditionally. Thus, instances of this type can't be owned, directly + * or indirectly, by a JavaScript object: if any value that this roots ever + * comes to refer to the object that owns this, then the whole cycle, and + * anything else it entrains, will never be freed. + */ +class JS_FRIEND_API(OwningCompileOptions) : public ReadOnlyCompileOptions +{ + JSRuntime *runtime; + PersistentRootedObject elementRoot; + PersistentRootedString elementAttributeNameRoot; + PersistentRootedScript introductionScriptRoot; + + public: + // A minimal constructor, for use with OwningCompileOptions::copy. This + // leaves |this.version| set to JSVERSION_UNKNOWN; the instance + // shouldn't be used until we've set that to something real (as |copy| + // will). + explicit OwningCompileOptions(JSContext *cx); + ~OwningCompileOptions(); + + JSObject *element() const MOZ_OVERRIDE { return elementRoot; } + JSString *elementAttributeName() const MOZ_OVERRIDE { return elementAttributeNameRoot; } + JSScript *introductionScript() const MOZ_OVERRIDE { return introductionScriptRoot; } + + // Set this to a copy of |rhs|. Return false on OOM. + bool copy(JSContext *cx, const ReadOnlyCompileOptions &rhs); + + /* These setters make copies of their string arguments, and are fallible. */ + bool setFile(JSContext *cx, const char *f); + bool setFileAndLine(JSContext *cx, const char *f, unsigned l); + bool setSourceMapURL(JSContext *cx, const jschar *s); + bool setIntroducerFilename(JSContext *cx, const char *s); + + /* These setters are infallible, and can be chained. */ + OwningCompileOptions &setLine(unsigned l) { lineno = l; return *this; } + OwningCompileOptions &setElement(JSObject *e) { + elementRoot = e; + return *this; + } + OwningCompileOptions &setElementAttributeName(JSString *p) { + elementAttributeNameRoot = p; + return *this; + } + OwningCompileOptions &setIntroductionScript(JSScript *s) { + introductionScriptRoot = s; + return *this; + } + OwningCompileOptions &setOriginPrincipals(JSPrincipals *p) { + if (p) JS_HoldPrincipals(p); + if (originPrincipals_) JS_DropPrincipals(runtime, originPrincipals_); + originPrincipals_ = p; + return *this; + } + OwningCompileOptions &setVersion(JSVersion v) { + version = v; + versionSet = true; + return *this; + } + OwningCompileOptions &setUTF8(bool u) { utf8 = u; return *this; } + OwningCompileOptions &setColumn(unsigned c) { column = c; return *this; } + OwningCompileOptions &setCompileAndGo(bool cng) { compileAndGo = cng; return *this; } + OwningCompileOptions &setForEval(bool eval) { forEval = eval; return *this; } + OwningCompileOptions &setDefineOnScope(bool define) { defineOnScope = define; return *this; } + OwningCompileOptions &setNoScriptRval(bool nsr) { noScriptRval = nsr; return *this; } + OwningCompileOptions &setSelfHostingMode(bool shm) { selfHostingMode = shm; return *this; } + OwningCompileOptions &setCanLazilyParse(bool clp) { canLazilyParse = clp; return *this; } + OwningCompileOptions &setSourceIsLazy(bool l) { sourceIsLazy = l; return *this; } + OwningCompileOptions &setIntroductionType(const char *t) { introductionType = t; return *this; } + bool setIntroductionInfo(JSContext *cx, const char *introducerFn, const char *intro, + unsigned line, JSScript *script, uint32_t offset) + { + if (!setIntroducerFilename(cx, introducerFn)) + return false; + introductionType = intro; + introductionLineno = line; + introductionScriptRoot = script; + introductionOffset = offset; + hasIntroductionInfo = true; + return true; + } + + private: + void operator=(const CompileOptions &rhs) MOZ_DELETE; +}; + +/* + * Compilation options stored on the stack. An instance of this type + * simply holds references to dynamically allocated resources (element; + * filename; source map URL) that are owned by something else. If you + * create an instance of this type, it's up to you to guarantee that + * everything you store in it will outlive it. + */ +class MOZ_STACK_CLASS JS_FRIEND_API(CompileOptions) : public ReadOnlyCompileOptions +{ + RootedObject elementRoot; + RootedString elementAttributeNameRoot; + RootedScript introductionScriptRoot; + + public: + explicit CompileOptions(JSContext *cx, JSVersion version = JSVERSION_UNKNOWN); + CompileOptions(js::ContextFriendFields *cx, const ReadOnlyCompileOptions &rhs) + : ReadOnlyCompileOptions(), elementRoot(cx), elementAttributeNameRoot(cx), + introductionScriptRoot(cx) + { + copyPODOptions(rhs); + + originPrincipals_ = rhs.originPrincipals_; + filename_ = rhs.filename(); + sourceMapURL_ = rhs.sourceMapURL(); + elementRoot = rhs.element(); + elementAttributeNameRoot = rhs.elementAttributeName(); + introductionScriptRoot = rhs.introductionScript(); + } + + JSObject *element() const MOZ_OVERRIDE { return elementRoot; } + JSString *elementAttributeName() const MOZ_OVERRIDE { return elementAttributeNameRoot; } + JSScript *introductionScript() const MOZ_OVERRIDE { return introductionScriptRoot; } + + CompileOptions &setFile(const char *f) { filename_ = f; return *this; } + CompileOptions &setLine(unsigned l) { lineno = l; return *this; } + CompileOptions &setFileAndLine(const char *f, unsigned l) { + filename_ = f; lineno = l; return *this; + } + CompileOptions &setSourceMapURL(const jschar *s) { sourceMapURL_ = s; return *this; } + CompileOptions &setElement(JSObject *e) { elementRoot = e; return *this; } + CompileOptions &setElementAttributeName(JSString *p) { + elementAttributeNameRoot = p; + return *this; + } + CompileOptions &setIntroductionScript(JSScript *s) { + introductionScriptRoot = s; + return *this; + } + CompileOptions &setOriginPrincipals(JSPrincipals *p) { + originPrincipals_ = p; + return *this; + } + CompileOptions &setVersion(JSVersion v) { + version = v; + versionSet = true; + return *this; + } + CompileOptions &setUTF8(bool u) { utf8 = u; return *this; } + CompileOptions &setColumn(unsigned c) { column = c; return *this; } + CompileOptions &setCompileAndGo(bool cng) { compileAndGo = cng; return *this; } + CompileOptions &setForEval(bool eval) { forEval = eval; return *this; } + CompileOptions &setDefineOnScope(bool define) { defineOnScope = define; return *this; } + CompileOptions &setNoScriptRval(bool nsr) { noScriptRval = nsr; return *this; } + CompileOptions &setSelfHostingMode(bool shm) { selfHostingMode = shm; return *this; } + CompileOptions &setCanLazilyParse(bool clp) { canLazilyParse = clp; return *this; } + CompileOptions &setSourceIsLazy(bool l) { sourceIsLazy = l; return *this; } + CompileOptions &setIntroductionType(const char *t) { introductionType = t; return *this; } + CompileOptions &setIntroductionInfo(const char *introducerFn, const char *intro, + unsigned line, JSScript *script, uint32_t offset) + { + introducerFilename_ = introducerFn; + introductionType = intro; + introductionLineno = line; + introductionScriptRoot = script; + introductionOffset = offset; + hasIntroductionInfo = true; + return *this; + } + + private: + void operator=(const CompileOptions &rhs) MOZ_DELETE; +}; + +/* + * |script| will always be set. On failure, it will be set to nullptr. + */ +extern JS_PUBLIC_API(bool) +Compile(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + SourceBufferHolder &srcBuf, JS::MutableHandleScript script); + +extern JS_PUBLIC_API(bool) +Compile(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *bytes, size_t length, JS::MutableHandleScript script); + +extern JS_PUBLIC_API(bool) +Compile(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const jschar *chars, size_t length, JS::MutableHandleScript script); + +extern JS_PUBLIC_API(bool) +Compile(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, FILE *file, + JS::MutableHandleScript script); + +extern JS_PUBLIC_API(bool) +Compile(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, const char *filename, + JS::MutableHandleScript script); + +extern JS_PUBLIC_API(bool) +CanCompileOffThread(JSContext *cx, const ReadOnlyCompileOptions &options, size_t length); + +/* + * Off thread compilation control flow. + * + * After successfully triggering an off thread compile of a script, the + * callback will eventually be invoked with the specified data and a token + * for the compilation. The callback will be invoked while off the main thread, + * so must ensure that its operations are thread safe. Afterwards, + * FinishOffThreadScript must be invoked on the main thread to get the result + * script or nullptr. If maybecx is not specified, the resources will be freed, + * but no script will be returned. + * + * The characters passed in to CompileOffThread must remain live until the + * callback is invoked, and the resulting script will be rooted until the call + * to FinishOffThreadScript. + */ + +extern JS_PUBLIC_API(bool) +CompileOffThread(JSContext *cx, const ReadOnlyCompileOptions &options, + const jschar *chars, size_t length, + OffThreadCompileCallback callback, void *callbackData); + +extern JS_PUBLIC_API(JSScript *) +FinishOffThreadScript(JSContext *maybecx, JSRuntime *rt, void *token); + +extern JS_PUBLIC_API(bool) +CompileFunction(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *name, unsigned nargs, const char *const *argnames, + SourceBufferHolder &srcBuf, JS::MutableHandleFunction fun); + +extern JS_PUBLIC_API(bool) +CompileFunction(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *name, unsigned nargs, const char *const *argnames, + const char *bytes, size_t length, JS::MutableHandleFunction fun); + +extern JS_PUBLIC_API(bool) +CompileFunction(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *name, unsigned nargs, const char *const *argnames, + const jschar *chars, size_t length, JS::MutableHandleFunction fun); + +} /* namespace JS */ + +extern JS_PUBLIC_API(JSString *) +JS_DecompileScript(JSContext *cx, JS::Handle script, const char *name, unsigned indent); + +/* + * API extension: OR this into indent to avoid pretty-printing the decompiled + * source resulting from JS_DecompileFunction{,Body}. + */ +#define JS_DONT_PRETTY_PRINT ((unsigned)0x8000) + +extern JS_PUBLIC_API(JSString *) +JS_DecompileFunction(JSContext *cx, JS::Handle fun, unsigned indent); + +extern JS_PUBLIC_API(JSString *) +JS_DecompileFunctionBody(JSContext *cx, JS::Handle fun, unsigned indent); + +/* + * NB: JS_ExecuteScript and the JS_Evaluate*Script* quadruplets use the obj + * parameter as the initial scope chain header, the 'this' keyword value, and + * the variables object (ECMA parlance for where 'var' and 'function' bind + * names) of the execution context for script. + * + * Using obj as the variables object is problematic if obj's parent (which is + * the scope chain link; see JS_SetParent and JS_NewObject) is not null: in + * this case, variables created by 'var x = 0', e.g., go in obj, but variables + * created by assignment to an unbound id, 'x = 0', go in the last object on + * the scope chain linked by parent. + * + * ECMA calls that last scoping object the "global object", but note that many + * embeddings have several such objects. ECMA requires that "global code" be + * executed with the variables object equal to this global object. But these + * JS API entry points provide freedom to execute code against a "sub-global", + * i.e., a parented or scoped object, in which case the variables object will + * differ from the last object on the scope chain, resulting in confusing and + * non-ECMA explicit vs. implicit variable creation. + * + * Caveat embedders: unless you already depend on this buggy variables object + * binding behavior, you should call ContextOptionsRef(cx).setVarObjFix(true) + * for each context in the application, if you pass parented objects as the obj + * parameter, or may ever pass such objects in the future. + * + * Why a runtime option? The alternative is to add six or so new API entry + * points with signatures matching the following six, and that doesn't seem + * worth the code bloat cost. Such new entry points would probably have less + * obvious names, too, so would not tend to be used. The JS_SetOption call, + * OTOH, can be more easily hacked into existing code that does not depend on + * the bug; such code can continue to use the familiar JS_EvaluateScript, + * etc., entry points. + */ +extern JS_PUBLIC_API(bool) +JS_ExecuteScript(JSContext *cx, JS::HandleObject obj, JS::HandleScript script, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +JS_ExecuteScript(JSContext *cx, JS::HandleObject obj, JS::HandleScript script); + +namespace JS { + +/* + * Like the above, but handles a cross-compartment script. If the script is + * cross-compartment, it is cloned into the current compartment before executing. + */ +extern JS_PUBLIC_API(bool) +CloneAndExecuteScript(JSContext *cx, JS::Handle obj, JS::Handle script); + +} /* namespace JS */ + +extern JS_PUBLIC_API(bool) +JS_ExecuteScriptVersion(JSContext *cx, JS::HandleObject obj, JS::HandleScript script, + JS::MutableHandleValue rval, JSVersion version); + +extern JS_PUBLIC_API(bool) +JS_ExecuteScriptVersion(JSContext *cx, JS::HandleObject obj, JS::HandleScript script, + JSVersion version); + +extern JS_PUBLIC_API(bool) +JS_EvaluateScript(JSContext *cx, JS::HandleObject obj, + const char *bytes, unsigned length, + const char *filename, unsigned lineno, + JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +JS_EvaluateScript(JSContext *cx, JS::HandleObject obj, + const char *bytes, unsigned length, + const char *filename, unsigned lineno); + +extern JS_PUBLIC_API(bool) +JS_EvaluateUCScript(JSContext *cx, JS::Handle obj, + const jschar *chars, unsigned length, + const char *filename, unsigned lineno, + JS::MutableHandle rval); + +namespace JS { + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + SourceBufferHolder &srcBuf, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const jschar *chars, size_t length, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *bytes, size_t length, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *filename, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + SourceBufferHolder &srcBuf); + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const jschar *chars, size_t length); + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *bytes, size_t length); + +extern JS_PUBLIC_API(bool) +Evaluate(JSContext *cx, JS::HandleObject obj, const ReadOnlyCompileOptions &options, + const char *filename); + +} /* namespace JS */ + +extern JS_PUBLIC_API(bool) +JS_CallFunction(JSContext *cx, JS::HandleObject obj, JS::HandleFunction fun, + const JS::HandleValueArray& args, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +JS_CallFunctionName(JSContext *cx, JS::HandleObject obj, const char *name, + const JS::HandleValueArray& args, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +JS_CallFunctionValue(JSContext *cx, JS::HandleObject obj, JS::HandleValue fval, + const JS::HandleValueArray& args, JS::MutableHandleValue rval); + +namespace JS { + +static inline bool +Call(JSContext *cx, JS::HandleObject thisObj, JS::HandleFunction fun, + const JS::HandleValueArray &args, MutableHandleValue rval) +{ + return !!JS_CallFunction(cx, thisObj, fun, args, rval); +} + +static inline bool +Call(JSContext *cx, JS::HandleObject thisObj, const char *name, const JS::HandleValueArray& args, + MutableHandleValue rval) +{ + return !!JS_CallFunctionName(cx, thisObj, name, args, rval); +} + +static inline bool +Call(JSContext *cx, JS::HandleObject thisObj, JS::HandleValue fun, const JS::HandleValueArray& args, + MutableHandleValue rval) +{ + return !!JS_CallFunctionValue(cx, thisObj, fun, args, rval); +} + +extern JS_PUBLIC_API(bool) +Call(JSContext *cx, JS::HandleValue thisv, JS::HandleValue fun, const JS::HandleValueArray& args, + MutableHandleValue rval); + +static inline bool +Call(JSContext *cx, JS::HandleValue thisv, JS::HandleObject funObj, const JS::HandleValueArray& args, + MutableHandleValue rval) +{ + JS_ASSERT(funObj); + JS::RootedValue fun(cx, JS::ObjectValue(*funObj)); + return Call(cx, thisv, fun, args, rval); +} + +extern JS_PUBLIC_API(bool) +Construct(JSContext *cx, JS::HandleValue fun, + const JS::HandleValueArray& args, + MutableHandleValue rval); + +} /* namespace JS */ + +/* + * These functions allow setting an interrupt callback that will be called + * from the JS thread some time after any thread triggered the callback using + * JS_RequestInterruptCallback(rt). + * + * To schedule the GC and for other activities the engine internally triggers + * interrupt callbacks. The embedding should thus not rely on callbacks being + * triggered through the external API only. + * + * Important note: Additional callbacks can occur inside the callback handler + * if it re-enters the JS engine. The embedding must ensure that the callback + * is disconnected before attempting such re-entry. + */ +extern JS_PUBLIC_API(JSInterruptCallback) +JS_SetInterruptCallback(JSRuntime *rt, JSInterruptCallback callback); + +extern JS_PUBLIC_API(JSInterruptCallback) +JS_GetInterruptCallback(JSRuntime *rt); + +extern JS_PUBLIC_API(void) +JS_RequestInterruptCallback(JSRuntime *rt); + +extern JS_PUBLIC_API(bool) +JS_IsRunning(JSContext *cx); + +/* + * Saving and restoring frame chains. + * + * These two functions are used to set aside cx's call stack while that stack + * is inactive. After a call to JS_SaveFrameChain, it looks as if there is no + * code running on cx. Before calling JS_RestoreFrameChain, cx's call stack + * must be balanced and all nested calls to JS_SaveFrameChain must have had + * matching JS_RestoreFrameChain calls. + * + * JS_SaveFrameChain deals with cx not having any code running on it. + */ +extern JS_PUBLIC_API(bool) +JS_SaveFrameChain(JSContext *cx); + +extern JS_PUBLIC_API(void) +JS_RestoreFrameChain(JSContext *cx); + +#ifdef MOZ_TRACE_JSCALLS +/* + * The callback is expected to be quick and noninvasive. It should not + * request interrupts, turn on debugging, or produce uncaught JS + * exceptions. The state of the stack and registers in the context + * cannot be relied upon, since this callback may be invoked directly + * from either JIT. The 'entering' field means we are entering a + * function if it is positive, leaving a function if it is zero or + * negative. + */ +extern JS_PUBLIC_API(void) +JS_SetFunctionCallback(JSContext *cx, JSFunctionCallback fcb); + +extern JS_PUBLIC_API(JSFunctionCallback) +JS_GetFunctionCallback(JSContext *cx); +#endif /* MOZ_TRACE_JSCALLS */ + +/************************************************************************/ + +/* + * Strings. + * + * NB: JS_NewUCString takes ownership of bytes on success, avoiding a copy; + * but on error (signified by null return), it leaves chars owned by the + * caller. So the caller must free bytes in the error case, if it has no use + * for them. In contrast, all the JS_New*StringCopy* functions do not take + * ownership of the character memory passed to them -- they copy it. + */ +extern JS_PUBLIC_API(JSString *) +JS_NewStringCopyN(JSContext *cx, const char *s, size_t n); + +extern JS_PUBLIC_API(JSString *) +JS_NewStringCopyZ(JSContext *cx, const char *s); + +extern JS_PUBLIC_API(JSString *) +JS_InternJSString(JSContext *cx, JS::HandleString str); + +extern JS_PUBLIC_API(JSString *) +JS_InternStringN(JSContext *cx, const char *s, size_t length); + +extern JS_PUBLIC_API(JSString *) +JS_InternString(JSContext *cx, const char *s); + +extern JS_PUBLIC_API(JSString *) +JS_NewUCString(JSContext *cx, jschar *chars, size_t length); + +extern JS_PUBLIC_API(JSString *) +JS_NewUCStringCopyN(JSContext *cx, const jschar *s, size_t n); + +extern JS_PUBLIC_API(JSString *) +JS_NewUCStringCopyZ(JSContext *cx, const jschar *s); + +extern JS_PUBLIC_API(JSString *) +JS_InternUCStringN(JSContext *cx, const jschar *s, size_t length); + +extern JS_PUBLIC_API(JSString *) +JS_InternUCString(JSContext *cx, const jschar *s); + +extern JS_PUBLIC_API(bool) +JS_CompareStrings(JSContext *cx, JSString *str1, JSString *str2, int32_t *result); + +extern JS_PUBLIC_API(bool) +JS_StringEqualsAscii(JSContext *cx, JSString *str, const char *asciiBytes, bool *match); + +extern JS_PUBLIC_API(size_t) +JS_PutEscapedString(JSContext *cx, char *buffer, size_t size, JSString *str, char quote); + +extern JS_PUBLIC_API(bool) +JS_FileEscapedString(FILE *fp, JSString *str, char quote); + +/* + * Extracting string characters and length. + * + * While getting the length of a string is infallible, getting the chars can + * fail. As indicated by the lack of a JSContext parameter, there are two + * special cases where getting the chars is infallible: + * + * The first case is interned strings, i.e., strings from JS_InternString or + * JSID_TO_STRING(id), using JS_GetLatin1InternedStringChars or + * JS_GetTwoByteInternedStringChars. + * + * The second case is "flat" strings that have been explicitly prepared in a + * fallible context by JS_FlattenString. To catch errors, a separate opaque + * JSFlatString type is returned by JS_FlattenString and expected by + * JS_GetFlatStringChars. Note, though, that this is purely a syntactic + * distinction: the input and output of JS_FlattenString are the same actual + * GC-thing. If a JSString is known to be flat, JS_ASSERT_STRING_IS_FLAT can be + * used to make a debug-checked cast. Example: + * + * // in a fallible context + * JSFlatString *fstr = JS_FlattenString(cx, str); + * if (!fstr) + * return false; + * JS_ASSERT(fstr == JS_ASSERT_STRING_IS_FLAT(str)); + * + * // in an infallible context, for the same 'str' + * AutoCheckCannotGC nogc; + * const jschar *chars = JS_GetTwoByteFlatStringChars(nogc, fstr) + * JS_ASSERT(chars); + * + * Flat strings and interned strings are always null-terminated, so + * JS_FlattenString can be used to get a null-terminated string. + * + * Additionally, string characters are stored as either Latin1Char (8-bit) + * or jschar (16-bit). Clients can use JS_StringHasLatin1Chars and can then + * call either the Latin1* or TwoByte* functions. Some functions like + * JS_CopyStringChars and JS_GetStringCharAt accept both Latin1 and TwoByte + * strings. + */ + +extern JS_PUBLIC_API(size_t) +JS_GetStringLength(JSString *str); + +extern JS_PUBLIC_API(bool) +JS_StringIsFlat(JSString *str); + +/* Returns true iff the string's characters are stored as Latin1. */ +extern JS_PUBLIC_API(bool) +JS_StringHasLatin1Chars(JSString *str); + +extern JS_PUBLIC_API(const JS::Latin1Char *) +JS_GetLatin1StringCharsAndLength(JSContext *cx, const JS::AutoCheckCannotGC &nogc, JSString *str, + size_t *length); + +extern JS_PUBLIC_API(const jschar *) +JS_GetTwoByteStringCharsAndLength(JSContext *cx, const JS::AutoCheckCannotGC &nogc, JSString *str, + size_t *length); + +extern JS_PUBLIC_API(bool) +JS_GetStringCharAt(JSContext *cx, JSString *str, size_t index, jschar *res); + +extern JS_PUBLIC_API(jschar) +JS_GetFlatStringCharAt(JSFlatString *str, size_t index); + +extern JS_PUBLIC_API(const jschar *) +JS_GetTwoByteExternalStringChars(JSString *str); + +extern JS_PUBLIC_API(bool) +JS_CopyStringChars(JSContext *cx, mozilla::Range dest, JSString *str); + +extern JS_PUBLIC_API(const JS::Latin1Char *) +JS_GetLatin1InternedStringChars(const JS::AutoCheckCannotGC &nogc, JSString *str); + +extern JS_PUBLIC_API(const jschar *) +JS_GetTwoByteInternedStringChars(const JS::AutoCheckCannotGC &nogc, JSString *str); + +extern JS_PUBLIC_API(JSFlatString *) +JS_FlattenString(JSContext *cx, JSString *str); + +extern JS_PUBLIC_API(const JS::Latin1Char *) +JS_GetLatin1FlatStringChars(const JS::AutoCheckCannotGC &nogc, JSFlatString *str); + +extern JS_PUBLIC_API(const jschar *) +JS_GetTwoByteFlatStringChars(const JS::AutoCheckCannotGC &nogc, JSFlatString *str); + +static MOZ_ALWAYS_INLINE JSFlatString * +JSID_TO_FLAT_STRING(jsid id) +{ + JS_ASSERT(JSID_IS_STRING(id)); + return (JSFlatString *)(JSID_BITS(id)); +} + +static MOZ_ALWAYS_INLINE JSFlatString * +JS_ASSERT_STRING_IS_FLAT(JSString *str) +{ + JS_ASSERT(JS_StringIsFlat(str)); + return (JSFlatString *)str; +} + +static MOZ_ALWAYS_INLINE JSString * +JS_FORGET_STRING_FLATNESS(JSFlatString *fstr) +{ + return (JSString *)fstr; +} + +/* + * Additional APIs that avoid fallibility when given a flat string. + */ + +extern JS_PUBLIC_API(bool) +JS_FlatStringEqualsAscii(JSFlatString *str, const char *asciiBytes); + +extern JS_PUBLIC_API(size_t) +JS_PutEscapedFlatString(char *buffer, size_t size, JSFlatString *str, char quote); + +/* + * Create a dependent string, i.e., a string that owns no character storage, + * but that refers to a slice of another string's chars. Dependent strings + * are mutable by definition, so the thread safety comments above apply. + */ +extern JS_PUBLIC_API(JSString *) +JS_NewDependentString(JSContext *cx, JS::HandleString str, size_t start, + size_t length); + +/* + * Concatenate two strings, possibly resulting in a rope. + * See above for thread safety comments. + */ +extern JS_PUBLIC_API(JSString *) +JS_ConcatStrings(JSContext *cx, JS::HandleString left, JS::HandleString right); + +/* + * For JS_DecodeBytes, set *dstlenp to the size of the destination buffer before + * the call; on return, *dstlenp contains the number of jschars actually stored. + * To determine the necessary destination buffer size, make a sizing call that + * passes nullptr for dst. + * + * On errors, the functions report the error. In that case, *dstlenp contains + * the number of characters or bytes transferred so far. If cx is nullptr, no + * error is reported on failure, and the functions simply return false. + * + * NB: This function does not store an additional zero byte or jschar after the + * transcoded string. + */ +JS_PUBLIC_API(bool) +JS_DecodeBytes(JSContext *cx, const char *src, size_t srclen, jschar *dst, + size_t *dstlenp); + +/* + * A variation on JS_EncodeCharacters where a null terminated string is + * returned that you are expected to call JS_free on when done. + */ +JS_PUBLIC_API(char *) +JS_EncodeString(JSContext *cx, JSString *str); + +/* + * Same behavior as JS_EncodeString(), but encode into UTF-8 string + */ +JS_PUBLIC_API(char *) +JS_EncodeStringToUTF8(JSContext *cx, JS::HandleString str); + +/* + * Get number of bytes in the string encoding (without accounting for a + * terminating zero bytes. The function returns (size_t) -1 if the string + * can not be encoded into bytes and reports an error using cx accordingly. + */ +JS_PUBLIC_API(size_t) +JS_GetStringEncodingLength(JSContext *cx, JSString *str); + +/* + * Encode string into a buffer. The function does not stores an additional + * zero byte. The function returns (size_t) -1 if the string can not be + * encoded into bytes with no error reported. Otherwise it returns the number + * of bytes that are necessary to encode the string. If that exceeds the + * length parameter, the string will be cut and only length bytes will be + * written into the buffer. + */ +JS_PUBLIC_API(size_t) +JS_EncodeStringToBuffer(JSContext *cx, JSString *str, char *buffer, size_t length); + +class JSAutoByteString +{ + public: + JSAutoByteString(JSContext *cx, JSString *str + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : mBytes(JS_EncodeString(cx, str)) + { + JS_ASSERT(cx); + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + explicit JSAutoByteString(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM) + : mBytes(nullptr) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + ~JSAutoByteString() { + js_free(mBytes); + } + + /* Take ownership of the given byte array. */ + void initBytes(char *bytes) { + JS_ASSERT(!mBytes); + mBytes = bytes; + } + + char *encodeLatin1(JSContext *cx, JSString *str) { + JS_ASSERT(!mBytes); + JS_ASSERT(cx); + mBytes = JS_EncodeString(cx, str); + return mBytes; + } + + char *encodeLatin1(js::ExclusiveContext *cx, JSString *str); + + char *encodeUtf8(JSContext *cx, JS::HandleString str) { + JS_ASSERT(!mBytes); + JS_ASSERT(cx); + mBytes = JS_EncodeStringToUTF8(cx, str); + return mBytes; + } + + void clear() { + js_free(mBytes); + mBytes = nullptr; + } + + char *ptr() const { + return mBytes; + } + + bool operator!() const { + return !mBytes; + } + + size_t length() const { + if (!mBytes) + return 0; + return strlen(mBytes); + } + + private: + char *mBytes; + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER + + /* Copy and assignment are not supported. */ + JSAutoByteString(const JSAutoByteString &another); + JSAutoByteString &operator=(const JSAutoByteString &another); +}; + +namespace JS { + +extern JS_PUBLIC_API(JSAddonId *) +NewAddonId(JSContext *cx, JS::HandleString str); + +extern JS_PUBLIC_API(JSString *) +StringOfAddonId(JSAddonId *id); + +extern JS_PUBLIC_API(JSAddonId *) +AddonIdOfObject(JSObject *obj); + +} // namespace JS + +/************************************************************************/ +/* + * Symbols + */ + +namespace JS { + +/* + * Create a new Symbol with the given description. This function never returns + * a Symbol that is in the Runtime-wide symbol registry. + * + * If description is null, the new Symbol's [[Description]] attribute is + * undefined. + */ +JS_PUBLIC_API(Symbol *) +NewSymbol(JSContext *cx, HandleString description); + +/* + * Symbol.for as specified in ES6. + * + * Get a Symbol with the description 'key' from the Runtime-wide symbol registry. + * If there is not already a Symbol with that description in the registry, a new + * Symbol is created and registered. 'key' must not be null. + */ +JS_PUBLIC_API(Symbol *) +GetSymbolFor(JSContext *cx, HandleString key); + +/* + * Get the [[Description]] attribute of the given symbol. + * + * This function is infallible. If it returns null, that means the symbol's + * [[Description]] is undefined. + */ +JS_PUBLIC_API(JSString *) +GetSymbolDescription(HandleSymbol symbol); + +/* Well-known symbols. */ +MOZ_BEGIN_ENUM_CLASS(SymbolCode, uint32_t) + iterator, // well-known Symbol.iterator + InSymbolRegistry = 0xfffffffe, // created by Symbol.for() or JS::GetSymbolFor() + UniqueSymbol = 0xffffffff // created by Symbol() or JS::NewSymbol() +MOZ_END_ENUM_CLASS(SymbolCode) + +/* For use in loops that iterate over the well-known symbols. */ +const size_t WellKnownSymbolLimit = 1; + +/* + * Return the SymbolCode telling what sort of symbol `symbol` is. + * + * A symbol's SymbolCode never changes once it is created. + */ +JS_PUBLIC_API(SymbolCode) +GetSymbolCode(Handle symbol); + +/* + * Get one of the well-known symbols defined by ES6. A single set of well-known + * symbols is shared by all compartments in a JSRuntime. + * + * `which` must be in the range [0, WellKnownSymbolLimit). + */ +JS_PUBLIC_API(Symbol *) +GetWellKnownSymbol(JSContext *cx, SymbolCode which); + +} /* namespace JS */ + +/************************************************************************/ +/* + * JSON functions + */ +typedef bool (* JSONWriteCallback)(const jschar *buf, uint32_t len, void *data); + +/* + * JSON.stringify as specified by ES5. + */ +JS_PUBLIC_API(bool) +JS_Stringify(JSContext *cx, JS::MutableHandleValue value, JS::HandleObject replacer, + JS::HandleValue space, JSONWriteCallback callback, void *data); + +/* + * JSON.parse as specified by ES5. + */ +JS_PUBLIC_API(bool) +JS_ParseJSON(JSContext *cx, const jschar *chars, uint32_t len, JS::MutableHandleValue vp); + +JS_PUBLIC_API(bool) +JS_ParseJSON(JSContext *cx, JS::HandleString str, JS::MutableHandleValue vp); + +JS_PUBLIC_API(bool) +JS_ParseJSONWithReviver(JSContext *cx, const jschar *chars, uint32_t len, JS::HandleValue reviver, + JS::MutableHandleValue vp); + +JS_PUBLIC_API(bool) +JS_ParseJSONWithReviver(JSContext *cx, JS::HandleString str, JS::HandleValue reviver, + JS::MutableHandleValue vp); + +/************************************************************************/ + +/* + * The default locale for the ECMAScript Internationalization API + * (Intl.Collator, Intl.NumberFormat, Intl.DateTimeFormat). + * Note that the Internationalization API encourages clients to + * specify their own locales. + * The locale string remains owned by the caller. + */ +extern JS_PUBLIC_API(bool) +JS_SetDefaultLocale(JSRuntime *rt, const char *locale); + +/* + * Reset the default locale to OS defaults. + */ +extern JS_PUBLIC_API(void) +JS_ResetDefaultLocale(JSRuntime *rt); + +/* + * Locale specific string conversion and error message callbacks. + */ +struct JSLocaleCallbacks { + JSLocaleToUpperCase localeToUpperCase; + JSLocaleToLowerCase localeToLowerCase; + JSLocaleCompare localeCompare; // not used #if EXPOSE_INTL_API + JSLocaleToUnicode localeToUnicode; +}; + +/* + * Establish locale callbacks. The pointer must persist as long as the + * JSRuntime. Passing nullptr restores the default behaviour. + */ +extern JS_PUBLIC_API(void) +JS_SetLocaleCallbacks(JSRuntime *rt, JSLocaleCallbacks *callbacks); + +/* + * Return the address of the current locale callbacks struct, which may + * be nullptr. + */ +extern JS_PUBLIC_API(JSLocaleCallbacks *) +JS_GetLocaleCallbacks(JSRuntime *rt); + +/************************************************************************/ + +/* + * Error reporting. + */ + +/* + * Report an exception represented by the sprintf-like conversion of format + * and its arguments. This exception message string is passed to a pre-set + * JSErrorReporter function (set by JS_SetErrorReporter). + */ +extern JS_PUBLIC_API(void) +JS_ReportError(JSContext *cx, const char *format, ...); + +/* + * Use an errorNumber to retrieve the format string, args are char * + */ +extern JS_PUBLIC_API(void) +JS_ReportErrorNumber(JSContext *cx, JSErrorCallback errorCallback, + void *userRef, const unsigned errorNumber, ...); + +#ifdef va_start +extern JS_PUBLIC_API(void) +JS_ReportErrorNumberVA(JSContext *cx, JSErrorCallback errorCallback, + void *userRef, const unsigned errorNumber, va_list ap); +#endif + +/* + * Use an errorNumber to retrieve the format string, args are jschar * + */ +extern JS_PUBLIC_API(void) +JS_ReportErrorNumberUC(JSContext *cx, JSErrorCallback errorCallback, + void *userRef, const unsigned errorNumber, ...); + +extern JS_PUBLIC_API(void) +JS_ReportErrorNumberUCArray(JSContext *cx, JSErrorCallback errorCallback, + void *userRef, const unsigned errorNumber, + const jschar **args); + +/* + * As above, but report a warning instead (JSREPORT_IS_WARNING(report.flags)). + * Return true if there was no error trying to issue the warning, and if the + * warning was not converted into an error due to the JSOPTION_WERROR option + * being set, false otherwise. + */ +extern JS_PUBLIC_API(bool) +JS_ReportWarning(JSContext *cx, const char *format, ...); + +extern JS_PUBLIC_API(bool) +JS_ReportErrorFlagsAndNumber(JSContext *cx, unsigned flags, + JSErrorCallback errorCallback, void *userRef, + const unsigned errorNumber, ...); + +extern JS_PUBLIC_API(bool) +JS_ReportErrorFlagsAndNumberUC(JSContext *cx, unsigned flags, + JSErrorCallback errorCallback, void *userRef, + const unsigned errorNumber, ...); + +/* + * Complain when out of memory. + */ +extern JS_PUBLIC_API(void) +JS_ReportOutOfMemory(JSContext *cx); + +/* + * Complain when an allocation size overflows the maximum supported limit. + */ +extern JS_PUBLIC_API(void) +JS_ReportAllocationOverflow(JSContext *cx); + +struct JSErrorReport { + const char *filename; /* source file name, URL, etc., or null */ + JSPrincipals *originPrincipals; /* see 'originPrincipals' comment above */ + unsigned lineno; /* source line number */ + const char *linebuf; /* offending source line without final \n */ + const char *tokenptr; /* pointer to error token in linebuf */ + const jschar *uclinebuf; /* unicode (original) line buffer */ + const jschar *uctokenptr; /* unicode (original) token pointer */ + unsigned flags; /* error/warning, etc. */ + unsigned errorNumber; /* the error number, e.g. see js.msg */ + const jschar *ucmessage; /* the (default) error message */ + const jschar **messageArgs; /* arguments for the error message */ + int16_t exnType; /* One of the JSExnType constants */ + unsigned column; /* zero-based column index in line */ +}; + +/* + * JSErrorReport flag values. These may be freely composed. + */ +#define JSREPORT_ERROR 0x0 /* pseudo-flag for default case */ +#define JSREPORT_WARNING 0x1 /* reported via JS_ReportWarning */ +#define JSREPORT_EXCEPTION 0x2 /* exception was thrown */ +#define JSREPORT_STRICT 0x4 /* error or warning due to strict option */ + +/* + * This condition is an error in strict mode code, a warning if + * JS_HAS_STRICT_OPTION(cx), and otherwise should not be reported at + * all. We check the strictness of the context's top frame's script; + * where that isn't appropriate, the caller should do the right checks + * itself instead of using this flag. + */ +#define JSREPORT_STRICT_MODE_ERROR 0x8 + +/* + * If JSREPORT_EXCEPTION is set, then a JavaScript-catchable exception + * has been thrown for this runtime error, and the host should ignore it. + * Exception-aware hosts should also check for JS_IsExceptionPending if + * JS_ExecuteScript returns failure, and signal or propagate the exception, as + * appropriate. + */ +#define JSREPORT_IS_WARNING(flags) (((flags) & JSREPORT_WARNING) != 0) +#define JSREPORT_IS_EXCEPTION(flags) (((flags) & JSREPORT_EXCEPTION) != 0) +#define JSREPORT_IS_STRICT(flags) (((flags) & JSREPORT_STRICT) != 0) +#define JSREPORT_IS_STRICT_MODE_ERROR(flags) (((flags) & \ + JSREPORT_STRICT_MODE_ERROR) != 0) +extern JS_PUBLIC_API(JSErrorReporter) +JS_GetErrorReporter(JSContext *cx); + +extern JS_PUBLIC_API(JSErrorReporter) +JS_SetErrorReporter(JSContext *cx, JSErrorReporter er); + +namespace JS { + +extern JS_PUBLIC_API(bool) +CreateError(JSContext *cx, JSExnType type, HandleString stack, + HandleString fileName, uint32_t lineNumber, uint32_t columnNumber, + JSErrorReport *report, HandleString message, MutableHandleValue rval); + +/************************************************************************/ + +/* + * Weak Maps. + */ + +extern JS_PUBLIC_API(JSObject *) +NewWeakMapObject(JSContext *cx); + +extern JS_PUBLIC_API(bool) +IsWeakMapObject(JSObject *obj); + +extern JS_PUBLIC_API(bool) +GetWeakMapEntry(JSContext *cx, JS::HandleObject mapObj, JS::HandleObject key, + JS::MutableHandleValue val); + +extern JS_PUBLIC_API(bool) +SetWeakMapEntry(JSContext *cx, JS::HandleObject mapObj, JS::HandleObject key, + JS::HandleValue val); + +} /* namespace JS */ + +/* + * Dates. + */ + +extern JS_PUBLIC_API(JSObject *) +JS_NewDateObject(JSContext *cx, int year, int mon, int mday, int hour, int min, int sec); + +extern JS_PUBLIC_API(JSObject *) +JS_NewDateObjectMsec(JSContext *cx, double msec); + +/* + * Infallible predicate to test whether obj is a date object. + */ +extern JS_PUBLIC_API(bool) +JS_ObjectIsDate(JSContext *cx, JS::HandleObject obj); + +/* + * Clears the cache of calculated local time from each Date object. + * Call to propagate a system timezone change. + */ +extern JS_PUBLIC_API(void) +JS_ClearDateCaches(JSContext *cx); + +/************************************************************************/ + +/* + * Regular Expressions. + */ +#define JSREG_FOLD 0x01u /* fold uppercase to lowercase */ +#define JSREG_GLOB 0x02u /* global exec, creates array of matches */ +#define JSREG_MULTILINE 0x04u /* treat ^ and $ as begin and end of line */ +#define JSREG_STICKY 0x08u /* only match starting at lastIndex */ + +extern JS_PUBLIC_API(JSObject *) +JS_NewRegExpObject(JSContext *cx, JS::HandleObject obj, char *bytes, size_t length, + unsigned flags); + +extern JS_PUBLIC_API(JSObject *) +JS_NewUCRegExpObject(JSContext *cx, JS::HandleObject obj, jschar *chars, size_t length, + unsigned flags); + +extern JS_PUBLIC_API(bool) +JS_SetRegExpInput(JSContext *cx, JS::HandleObject obj, JS::HandleString input, + bool multiline); + +extern JS_PUBLIC_API(bool) +JS_ClearRegExpStatics(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(bool) +JS_ExecuteRegExp(JSContext *cx, JS::HandleObject obj, JS::HandleObject reobj, + jschar *chars, size_t length, size_t *indexp, bool test, + JS::MutableHandleValue rval); + +/* RegExp interface for clients without a global object. */ + +extern JS_PUBLIC_API(JSObject *) +JS_NewRegExpObjectNoStatics(JSContext *cx, char *bytes, size_t length, unsigned flags); + +extern JS_PUBLIC_API(JSObject *) +JS_NewUCRegExpObjectNoStatics(JSContext *cx, jschar *chars, size_t length, unsigned flags); + +extern JS_PUBLIC_API(bool) +JS_ExecuteRegExpNoStatics(JSContext *cx, JS::HandleObject reobj, jschar *chars, size_t length, + size_t *indexp, bool test, JS::MutableHandleValue rval); + +extern JS_PUBLIC_API(bool) +JS_ObjectIsRegExp(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(unsigned) +JS_GetRegExpFlags(JSContext *cx, JS::HandleObject obj); + +extern JS_PUBLIC_API(JSString *) +JS_GetRegExpSource(JSContext *cx, JS::HandleObject obj); + +/************************************************************************/ + +extern JS_PUBLIC_API(bool) +JS_IsExceptionPending(JSContext *cx); + +extern JS_PUBLIC_API(bool) +JS_GetPendingException(JSContext *cx, JS::MutableHandleValue vp); + +extern JS_PUBLIC_API(void) +JS_SetPendingException(JSContext *cx, JS::HandleValue v); + +extern JS_PUBLIC_API(void) +JS_ClearPendingException(JSContext *cx); + +extern JS_PUBLIC_API(bool) +JS_ReportPendingException(JSContext *cx); + +namespace JS { + +/* + * Save and later restore the current exception state of a given JSContext. + * This is useful for implementing behavior in C++ that's like try/catch + * or try/finally in JS. + * + * Typical usage: + * + * bool ok = JS_EvaluateScript(cx, ...); + * AutoSaveExceptionState savedExc(cx); + * ... cleanup that might re-enter JS ... + * return ok; + */ +class JS_PUBLIC_API(AutoSaveExceptionState) +{ + private: + JSContext *context; + bool wasPropagatingForcedReturn; + bool wasThrowing; + RootedValue exceptionValue; + + public: + /* + * Take a snapshot of cx's current exception state. Then clear any current + * pending exception in cx. + */ + explicit AutoSaveExceptionState(JSContext *cx); + + /* + * If neither drop() nor restore() was called, restore the exception + * state only if no exception is currently pending on cx. + */ + ~AutoSaveExceptionState(); + + /* + * Discard any stored exception state. + * If this is called, the destructor is a no-op. + */ + void drop() { + wasPropagatingForcedReturn = false; + wasThrowing = false; + exceptionValue.setUndefined(); + } + + /* + * Replace cx's exception state with the stored exception state. Then + * discard the stored exception state. If this is called, the + * destructor is a no-op. + */ + void restore(); +}; + +} /* namespace JS */ + +/* Deprecated API. Use AutoSaveExceptionState instead. */ +extern JS_PUBLIC_API(JSExceptionState *) +JS_SaveExceptionState(JSContext *cx); + +extern JS_PUBLIC_API(void) +JS_RestoreExceptionState(JSContext *cx, JSExceptionState *state); + +extern JS_PUBLIC_API(void) +JS_DropExceptionState(JSContext *cx, JSExceptionState *state); + +/* + * If the given object is an exception object, the exception will have (or be + * able to lazily create) an error report struct, and this function will return + * the address of that struct. Otherwise, it returns nullptr. The lifetime + * of the error report struct that might be returned is the same as the + * lifetime of the exception object. + */ +extern JS_PUBLIC_API(JSErrorReport *) +JS_ErrorFromException(JSContext *cx, JS::HandleObject obj); + +/* + * Throws a StopIteration exception on cx. + */ +extern JS_PUBLIC_API(bool) +JS_ThrowStopIteration(JSContext *cx); + +extern JS_PUBLIC_API(bool) +JS_IsStopIteration(jsval v); + +extern JS_PUBLIC_API(intptr_t) +JS_GetCurrentThread(); + +/* + * A JS runtime always has an "owner thread". The owner thread is set when the + * runtime is created (to the current thread) and practically all entry points + * into the JS engine check that a runtime (or anything contained in the + * runtime: context, compartment, object, etc) is only touched by its owner + * thread. Embeddings may check this invariant outside the JS engine by calling + * JS_AbortIfWrongThread (which will abort if not on the owner thread, even for + * non-debug builds). + */ + +extern JS_PUBLIC_API(void) +JS_AbortIfWrongThread(JSRuntime *rt); + +/************************************************************************/ + +/* + * A constructor can request that the JS engine create a default new 'this' + * object of the given class, using the callee to determine parentage and + * [[Prototype]]. + */ +extern JS_PUBLIC_API(JSObject *) +JS_NewObjectForConstructor(JSContext *cx, const JSClass *clasp, const JS::CallArgs& args); + +/************************************************************************/ + +#ifdef JS_GC_ZEAL +#define JS_DEFAULT_ZEAL_FREQ 100 + +extern JS_PUBLIC_API(void) +JS_SetGCZeal(JSContext *cx, uint8_t zeal, uint32_t frequency); + +extern JS_PUBLIC_API(void) +JS_ScheduleGC(JSContext *cx, uint32_t count); +#endif + +extern JS_PUBLIC_API(void) +JS_SetParallelParsingEnabled(JSRuntime *rt, bool enabled); + +extern JS_PUBLIC_API(void) +JS_SetOffthreadIonCompilationEnabled(JSRuntime *rt, bool enabled); + +#define JIT_COMPILER_OPTIONS(Register) \ + Register(BASELINE_USECOUNT_TRIGGER, "baseline.usecount.trigger") \ + Register(ION_USECOUNT_TRIGGER, "ion.usecount.trigger") \ + Register(ION_ENABLE, "ion.enable") \ + Register(BASELINE_ENABLE, "baseline.enable") \ + Register(OFFTHREAD_COMPILATION_ENABLE, "offthread-compilation.enable") \ + Register(SIGNALS_ENABLE, "signals.enable") + +typedef enum JSJitCompilerOption { +#define JIT_COMPILER_DECLARE(key, str) \ + JSJITCOMPILER_ ## key, + + JIT_COMPILER_OPTIONS(JIT_COMPILER_DECLARE) +#undef JIT_COMPILER_DECLARE + + JSJITCOMPILER_NOT_AN_OPTION +} JSJitCompilerOption; + +extern JS_PUBLIC_API(void) +JS_SetGlobalJitCompilerOption(JSRuntime *rt, JSJitCompilerOption opt, uint32_t value); +extern JS_PUBLIC_API(int) +JS_GetGlobalJitCompilerOption(JSRuntime *rt, JSJitCompilerOption opt); + +/* + * Convert a uint32_t index into a jsid. + */ +extern JS_PUBLIC_API(bool) +JS_IndexToId(JSContext *cx, uint32_t index, JS::MutableHandleId); + +/* + * Convert chars into a jsid. + * + * |chars| may not be an index. + */ +extern JS_PUBLIC_API(bool) +JS_CharsToId(JSContext* cx, JS::TwoByteChars chars, JS::MutableHandleId); + +/* + * Test if the given string is a valid ECMAScript identifier + */ +extern JS_PUBLIC_API(bool) +JS_IsIdentifier(JSContext *cx, JS::HandleString str, bool *isIdentifier); + +namespace JS { + +/* + * AutoFilename encapsulates a pointer to a C-string and keeps the C-string + * alive for as long as the associated AutoFilename object is alive. + */ +class MOZ_STACK_CLASS JS_PUBLIC_API(AutoFilename) +{ + void *scriptSource_; + + AutoFilename(const AutoFilename &) MOZ_DELETE; + void operator=(const AutoFilename &) MOZ_DELETE; + + public: + AutoFilename() : scriptSource_(nullptr) {} + ~AutoFilename() { reset(nullptr); } + + const char *get() const; + + void reset(void *newScriptSource); +}; + +/* + * Return the current filename and line number of the most currently running + * frame. Returns true if a scripted frame was found, false otherwise. + * + * If a the embedding has hidden the scripted caller for the topmost activation + * record, this will also return false. + */ +extern JS_PUBLIC_API(bool) +DescribeScriptedCaller(JSContext *cx, AutoFilename *filename = nullptr, + unsigned *lineno = nullptr); + +extern JS_PUBLIC_API(JSObject *) +GetScriptedCallerGlobal(JSContext *cx); + +/* + * Informs the JS engine that the scripted caller should be hidden. This can be + * used by the embedding to maintain an override of the scripted caller in its + * calculations, by hiding the scripted caller in the JS engine and pushing data + * onto a separate stack, which it inspects when DescribeScriptedCaller returns + * null. + * + * We maintain a counter on each activation record. Add() increments the counter + * of the topmost activation, and Remove() decrements it. The count may never + * drop below zero, and must always be exactly zero when the activation is + * popped from the stack. + */ +extern JS_PUBLIC_API(void) +HideScriptedCaller(JSContext *cx); + +extern JS_PUBLIC_API(void) +UnhideScriptedCaller(JSContext *cx); + +class AutoHideScriptedCaller +{ + public: + explicit AutoHideScriptedCaller(JSContext *cx + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : mContext(cx) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + HideScriptedCaller(mContext); + } + ~AutoHideScriptedCaller() { + UnhideScriptedCaller(mContext); + } + + protected: + JSContext *mContext; + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +} /* namespace JS */ + +/* + * Encode/Decode interpreted scripts and functions to/from memory. + */ + +extern JS_PUBLIC_API(void *) +JS_EncodeScript(JSContext *cx, JS::HandleScript script, uint32_t *lengthp); + +extern JS_PUBLIC_API(void *) +JS_EncodeInterpretedFunction(JSContext *cx, JS::HandleObject funobj, uint32_t *lengthp); + +extern JS_PUBLIC_API(JSScript *) +JS_DecodeScript(JSContext *cx, const void *data, uint32_t length, JSPrincipals *originPrincipals); + +extern JS_PUBLIC_API(JSObject *) +JS_DecodeInterpretedFunction(JSContext *cx, const void *data, uint32_t length, + JSPrincipals *originPrincipals); + +namespace JS { + +/* + * This callback represents a request by the JS engine to open for reading the + * existing cache entry for the given global and char range that may contain a + * module. If a cache entry exists, the callback shall return 'true' and return + * the size, base address and an opaque file handle as outparams. If the + * callback returns 'true', the JS engine guarantees a call to + * CloseAsmJSCacheEntryForReadOp, passing the same base address, size and + * handle. + */ +typedef bool +(* OpenAsmJSCacheEntryForReadOp)(HandleObject global, const jschar *begin, const jschar *limit, + size_t *size, const uint8_t **memory, intptr_t *handle); +typedef void +(* CloseAsmJSCacheEntryForReadOp)(size_t size, const uint8_t *memory, intptr_t handle); + +/* + * This callback represents a request by the JS engine to open for writing a + * cache entry of the given size for the given global and char range containing + * the just-compiled module. If cache entry space is available, the callback + * shall return 'true' and return the base address and an opaque file handle as + * outparams. If the callback returns 'true', the JS engine guarantees a call + * to CloseAsmJSCacheEntryForWriteOp passing the same base address, size and + * handle. + * + * If 'installed' is true, then the cache entry is associated with a permanently + * installed JS file (e.g., in a packaged webapp). This information allows the + * embedding to store the cache entry in a installed location associated with + * the principal of 'global' where it will not be evicted until the associated + * installed JS file is removed. + */ +typedef bool +(* OpenAsmJSCacheEntryForWriteOp)(HandleObject global, bool installed, + const jschar *begin, const jschar *end, + size_t size, uint8_t **memory, intptr_t *handle); +typedef void +(* CloseAsmJSCacheEntryForWriteOp)(size_t size, uint8_t *memory, intptr_t handle); + +typedef js::Vector BuildIdCharVector; + +// Return the buildId (represented as a sequence of characters) associated with +// the currently-executing build. If the JS engine is embedded such that a +// single cache entry can be observed by different compiled versions of the JS +// engine, it is critical that the buildId shall change for each new build of +// the JS engine. + +typedef bool +(* BuildIdOp)(BuildIdCharVector *buildId); + +struct AsmJSCacheOps +{ + OpenAsmJSCacheEntryForReadOp openEntryForRead; + CloseAsmJSCacheEntryForReadOp closeEntryForRead; + OpenAsmJSCacheEntryForWriteOp openEntryForWrite; + CloseAsmJSCacheEntryForWriteOp closeEntryForWrite; + BuildIdOp buildId; +}; + +extern JS_PUBLIC_API(void) +SetAsmJSCacheOps(JSRuntime *rt, const AsmJSCacheOps *callbacks); + +/* + * Convenience class for imitating a JS level for-of loop. Typical usage: + * + * ForOfIterator it(cx); + * if (!it.init(iterable)) + * return false; + * RootedValue val(cx); + * while (true) { + * bool done; + * if (!it.next(&val, &done)) + * return false; + * if (done) + * break; + * if (!DoStuff(cx, val)) + * return false; + * } + */ +class MOZ_STACK_CLASS JS_PUBLIC_API(ForOfIterator) { + protected: + JSContext *cx_; + /* + * Use the ForOfPIC on the global object (see vm/GlobalObject.h) to try + * to optimize iteration across arrays. + * + * Case 1: Regular Iteration + * iterator - pointer to the iterator object. + * index - fixed to NOT_ARRAY (== UINT32_MAX) + * + * Case 2: Optimized Array Iteration + * iterator - pointer to the array object. + * index - current position in array. + * + * The cases are distinguished by whether or not |index| is equal to NOT_ARRAY. + */ + JS::RootedObject iterator; + uint32_t index; + + static const uint32_t NOT_ARRAY = UINT32_MAX; + + ForOfIterator(const ForOfIterator &) MOZ_DELETE; + ForOfIterator &operator=(const ForOfIterator &) MOZ_DELETE; + + public: + explicit ForOfIterator(JSContext *cx) : cx_(cx), iterator(cx_), index(NOT_ARRAY) { } + + enum NonIterableBehavior { + ThrowOnNonIterable, + AllowNonIterable + }; + + /* + * Initialize the iterator. If AllowNonIterable is passed then if iterable + * does not have a callable @@iterator init() will just return true instead + * of throwing. Callers should then check valueIsIterable() before + * continuing with the iteration. + */ + bool init(JS::HandleValue iterable, + NonIterableBehavior nonIterableBehavior = ThrowOnNonIterable); + + /* + * This method assumes that |iterator| is already an iterator. It will not + * check for, and call @@iterator. Callers should make sure that the passed + * in value is in fact an iterator. + */ + bool initWithIterator(JS::HandleValue aIterator); + + /* + * Get the next value from the iterator. If false *done is true + * after this call, do not examine val. + */ + bool next(JS::MutableHandleValue val, bool *done); + + /* + * If initialized with throwOnNonCallable = false, check whether + * the value is iterable. + */ + bool valueIsIterable() const { + return iterator; + } + + private: + inline bool nextFromOptimizedArray(MutableHandleValue val, bool *done); + bool materializeArrayIterator(); +}; + + +/* + * If a large allocation fails, the JS engine may call the large-allocation- + * failure callback, if set, to allow the embedding to flush caches, possibly + * perform shrinking GCs, etc. to make some room so that the allocation will + * succeed if retried. After the callback returns, the JS engine will try to + * allocate again and may be succesful. + */ + +typedef void +(* LargeAllocationFailureCallback)(void *data); + +extern JS_PUBLIC_API(void) +SetLargeAllocationFailureCallback(JSRuntime *rt, LargeAllocationFailureCallback afc, void *data); + +/* + * Unlike the error reporter, which is only called if the exception for an OOM + * bubbles up and is not caught, the OutOfMemoryCallback is called immediately + * at the OOM site to allow the embedding to capture the current state of heap + * allocation before anything is freed. If the large-allocation-failure callback + * is called at all (not all allocation sites call the large-allocation-failure + * callback on failure), it is called before the out-of-memory callback; the + * out-of-memory callback is only called if the allocation still fails after the + * large-allocation-failure callback has returned. + */ + +typedef void +(* OutOfMemoryCallback)(JSContext *cx, void *data); + +extern JS_PUBLIC_API(void) +SetOutOfMemoryCallback(JSRuntime *rt, OutOfMemoryCallback cb, void *data); + + +/* + * Capture the current call stack as a chain of SavedFrame objects, and set + * |stackp| to the SavedFrame for the newest stack frame. If |maxFrameCount| is + * non-zero, capture at most the youngest |maxFrameCount| frames. + */ +extern JS_PUBLIC_API(bool) +CaptureCurrentStack(JSContext *cx, MutableHandleObject stackp, unsigned maxFrameCount = 0); + +} /* namespace JS */ + +#endif /* jsapi_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsbytecode.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsbytecode.h new file mode 100644 index 0000000000..8e4f4cf90b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsbytecode.h @@ -0,0 +1,14 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsbytecode_h +#define jsbytecode_h + +#include + +typedef uint8_t jsbytecode; + +#endif /* jsbytecode_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsclist.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsclist.h new file mode 100644 index 0000000000..23da9b8cd5 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsclist.h @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsclist_h +#define jsclist_h + +#include "jstypes.h" + +/* +** Circular linked list +*/ +typedef struct JSCListStr { + struct JSCListStr *next; + struct JSCListStr *prev; +} JSCList; + +/* +** Insert element "_e" into the list, before "_l". +*/ +#define JS_INSERT_BEFORE(_e,_l) \ + JS_BEGIN_MACRO \ + (_e)->next = (_l); \ + (_e)->prev = (_l)->prev; \ + (_l)->prev->next = (_e); \ + (_l)->prev = (_e); \ + JS_END_MACRO + +/* +** Insert element "_e" into the list, after "_l". +*/ +#define JS_INSERT_AFTER(_e,_l) \ + JS_BEGIN_MACRO \ + (_e)->next = (_l)->next; \ + (_e)->prev = (_l); \ + (_l)->next->prev = (_e); \ + (_l)->next = (_e); \ + JS_END_MACRO + +/* +** Return the element following element "_e" +*/ +#define JS_NEXT_LINK(_e) \ + ((_e)->next) +/* +** Return the element preceding element "_e" +*/ +#define JS_PREV_LINK(_e) \ + ((_e)->prev) + +/* +** Append an element "_e" to the end of the list "_l" +*/ +#define JS_APPEND_LINK(_e,_l) JS_INSERT_BEFORE(_e,_l) + +/* +** Insert an element "_e" at the head of the list "_l" +*/ +#define JS_INSERT_LINK(_e,_l) JS_INSERT_AFTER(_e,_l) + +/* Return the head/tail of the list */ +#define JS_LIST_HEAD(_l) (_l)->next +#define JS_LIST_TAIL(_l) (_l)->prev + +/* +** Remove the element "_e" from it's circular list. +*/ +#define JS_REMOVE_LINK(_e) \ + JS_BEGIN_MACRO \ + (_e)->prev->next = (_e)->next; \ + (_e)->next->prev = (_e)->prev; \ + JS_END_MACRO + +/* +** Remove the element "_e" from it's circular list. Also initializes the +** linkage. +*/ +#define JS_REMOVE_AND_INIT_LINK(_e) \ + JS_BEGIN_MACRO \ + (_e)->prev->next = (_e)->next; \ + (_e)->next->prev = (_e)->prev; \ + (_e)->next = (_e); \ + (_e)->prev = (_e); \ + JS_END_MACRO + +/* +** Return non-zero if the given circular list "_l" is empty, zero if the +** circular list is not empty +*/ +#define JS_CLIST_IS_EMPTY(_l) \ + ((_l)->next == (_l)) + +/* +** Initialize a circular list +*/ +#define JS_INIT_CLIST(_l) \ + JS_BEGIN_MACRO \ + (_l)->next = (_l); \ + (_l)->prev = (_l); \ + JS_END_MACRO + +#define JS_INIT_STATIC_CLIST(_l) \ + {(_l), (_l)} + +#endif /* jsclist_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jscpucfg.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jscpucfg.h new file mode 100644 index 0000000000..a7a00613bb --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jscpucfg.h @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jscpucfg_h +#define jscpucfg_h + +#define JS_HAVE_LONG_LONG + +#if defined(_WIN64) + +# if defined(_M_X64) || defined(_M_AMD64) || defined(_AMD64_) +# define IS_LITTLE_ENDIAN 1 +# undef IS_BIG_ENDIAN +# else /* !(defined(_M_X64) || defined(_M_AMD64) || defined(_AMD64_)) */ +# error "CPU type is unknown" +# endif /* !(defined(_M_X64) || defined(_M_AMD64) || defined(_AMD64_)) */ + +#elif defined(_WIN32) + +# ifdef __WATCOMC__ +# define HAVE_VA_LIST_AS_ARRAY 1 +# endif + +# define IS_LITTLE_ENDIAN 1 +# undef IS_BIG_ENDIAN + +#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__) +# if __LITTLE_ENDIAN__ +# define IS_LITTLE_ENDIAN 1 +# undef IS_BIG_ENDIAN +# elif __BIG_ENDIAN__ +# undef IS_LITTLE_ENDIAN +# define IS_BIG_ENDIAN 1 +# endif + +#elif defined(JS_HAVE_ENDIAN_H) +# include + +# if defined(__BYTE_ORDER) +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define IS_LITTLE_ENDIAN 1 +# undef IS_BIG_ENDIAN +# elif __BYTE_ORDER == __BIG_ENDIAN +# undef IS_LITTLE_ENDIAN +# define IS_BIG_ENDIAN 1 +# endif +# else /* !defined(__BYTE_ORDER) */ +# error "endian.h does not define __BYTE_ORDER. Cannot determine endianness." +# endif + +/* BSDs */ +#elif defined(JS_HAVE_MACHINE_ENDIAN_H) +# include +# include + +# if defined(_BYTE_ORDER) +# if _BYTE_ORDER == _LITTLE_ENDIAN +# define IS_LITTLE_ENDIAN 1 +# undef IS_BIG_ENDIAN +# elif _BYTE_ORDER == _BIG_ENDIAN +# undef IS_LITTLE_ENDIAN +# define IS_BIG_ENDIAN 1 +# endif +# else /* !defined(_BYTE_ORDER) */ +# error "machine/endian.h does not define _BYTE_ORDER. Cannot determine endianness." +# endif + +#elif defined(JS_HAVE_SYS_ISA_DEFS_H) +# include + +# if defined(_BIG_ENDIAN) +# undef IS_LITTLE_ENDIAN +# define IS_BIG_ENDIAN 1 +# elif defined(_LITTLE_ENDIAN) +# define IS_LITTLE_ENDIAN 1 +# undef IS_BIG_ENDIAN +# else /* !defined(_LITTLE_ENDIAN) */ +# error "sys/isa_defs.h does not define _BIG_ENDIAN or _LITTLE_ENDIAN. Cannot determine endianness." +# endif +# if !defined(JS_STACK_GROWTH_DIRECTION) +# if defined(_STACK_GROWS_UPWARD) +# define JS_STACK_GROWTH_DIRECTION (1) +# elif defined(_STACK_GROWS_DOWNWARD) +# define JS_STACK_GROWTH_DIRECTION (-1) +# endif +# endif + +#elif defined(__sparc) || defined(__sparc__) || \ + defined(_POWER) || defined(__hppa) || \ + defined(_MIPSEB) || defined(_BIG_ENDIAN) +/* IA64 running HP-UX will have _BIG_ENDIAN defined. + * IA64 running Linux will have endian.h and be handled above. + */ +# undef IS_LITTLE_ENDIAN +# define IS_BIG_ENDIAN 1 + +#else /* !defined(__sparc) && !defined(__sparc__) && ... */ +# error "Cannot determine endianness of your platform. Please add support to jscpucfg.h." +#endif + +#ifndef JS_STACK_GROWTH_DIRECTION +# ifdef __hppa +# define JS_STACK_GROWTH_DIRECTION (1) +# else +# define JS_STACK_GROWTH_DIRECTION (-1) +# endif +#endif + +#endif /* jscpucfg_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsfriendapi.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsfriendapi.h new file mode 100644 index 0000000000..674999eb62 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsfriendapi.h @@ -0,0 +1,2561 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsfriendapi_h +#define jsfriendapi_h + +#include "mozilla/Casting.h" +#include "mozilla/MemoryReporting.h" +#include "mozilla/TypedEnum.h" +#include "mozilla/UniquePtr.h" + +#include "jsapi.h" // For JSAutoByteString. See bug 1033916. +#include "jsbytecode.h" +#include "jspubtd.h" + +#include "js/CallArgs.h" +#include "js/CallNonGenericMethod.h" +#include "js/Class.h" + +/* + * This macro checks if the stack pointer has exceeded a given limit. If + * |tolerance| is non-zero, it returns true only if the stack pointer has + * exceeded the limit by more than |tolerance| bytes. The WITH_INTOLERANCE + * versions use a negative tolerance (i.e., the limit is reduced by + * |intolerance| bytes). + */ +#if JS_STACK_GROWTH_DIRECTION > 0 +# define JS_CHECK_STACK_SIZE_WITH_TOLERANCE(limit, sp, tolerance) \ + ((uintptr_t)(sp) < (limit)+(tolerance)) +# define JS_CHECK_STACK_SIZE_WITH_INTOLERANCE(limit, sp, intolerance) \ + ((uintptr_t)(sp) < (limit)-(intolerance)) +#else +# define JS_CHECK_STACK_SIZE_WITH_TOLERANCE(limit, sp, tolerance) \ + ((uintptr_t)(sp) > (limit)-(tolerance)) +# define JS_CHECK_STACK_SIZE_WITH_INTOLERANCE(limit, sp, intolerance) \ + ((uintptr_t)(sp) > (limit)+(intolerance)) +#endif + +#define JS_CHECK_STACK_SIZE(limit, lval) JS_CHECK_STACK_SIZE_WITH_TOLERANCE(limit, lval, 0) + +class JSAtom; +struct JSErrorFormatString; +class JSLinearString; +struct JSJitInfo; +struct JSErrorReport; + +namespace JS { +template +class Heap; +} /* namespace JS */ + +namespace js { +class JS_FRIEND_API(BaseProxyHandler); +} /* namespace js */ + +extern JS_FRIEND_API(void) +JS_SetGrayGCRootsTracer(JSRuntime *rt, JSTraceDataOp traceOp, void *data); + +extern JS_FRIEND_API(JSString *) +JS_GetAnonymousString(JSRuntime *rt); + +extern JS_FRIEND_API(JSObject *) +JS_FindCompilationScope(JSContext *cx, JS::HandleObject obj); + +extern JS_FRIEND_API(JSFunction *) +JS_GetObjectFunction(JSObject *obj); + +extern JS_FRIEND_API(bool) +JS_SplicePrototype(JSContext *cx, JS::HandleObject obj, JS::HandleObject proto); + +extern JS_FRIEND_API(JSObject *) +JS_NewObjectWithUniqueType(JSContext *cx, const JSClass *clasp, JS::HandleObject proto, + JS::HandleObject parent); + +extern JS_FRIEND_API(uint32_t) +JS_ObjectCountDynamicSlots(JS::HandleObject obj); + +extern JS_FRIEND_API(size_t) +JS_SetProtoCalled(JSContext *cx); + +extern JS_FRIEND_API(size_t) +JS_GetCustomIteratorCount(JSContext *cx); + +extern JS_FRIEND_API(bool) +JS_NondeterministicGetWeakMapKeys(JSContext *cx, JS::HandleObject obj, JS::MutableHandleObject ret); + +/* + * Determine whether the given object is backed by a DeadObjectProxy. + * + * Such objects hold no other objects (they have no outgoing reference edges) + * and will throw if you touch them (e.g. by reading/writing a property). + */ +extern JS_FRIEND_API(bool) +JS_IsDeadWrapper(JSObject *obj); + +/* + * Used by the cycle collector to trace through the shape and all + * shapes it reaches, marking all non-shape children found in the + * process. Uses bounded stack space. + */ +extern JS_FRIEND_API(void) +JS_TraceShapeCycleCollectorChildren(JSTracer *trc, void *shape); + +enum { + JS_TELEMETRY_GC_REASON, + JS_TELEMETRY_GC_IS_COMPARTMENTAL, + JS_TELEMETRY_GC_MS, + JS_TELEMETRY_GC_MAX_PAUSE_MS, + JS_TELEMETRY_GC_MARK_MS, + JS_TELEMETRY_GC_SWEEP_MS, + JS_TELEMETRY_GC_MARK_ROOTS_MS, + JS_TELEMETRY_GC_MARK_GRAY_MS, + JS_TELEMETRY_GC_SLICE_MS, + JS_TELEMETRY_GC_MMU_50, + JS_TELEMETRY_GC_RESET, + JS_TELEMETRY_GC_INCREMENTAL_DISABLED, + JS_TELEMETRY_GC_NON_INCREMENTAL, + JS_TELEMETRY_GC_SCC_SWEEP_TOTAL_MS, + JS_TELEMETRY_GC_SCC_SWEEP_MAX_PAUSE_MS +}; + +typedef void +(* JSAccumulateTelemetryDataCallback)(int id, uint32_t sample); + +extern JS_FRIEND_API(void) +JS_SetAccumulateTelemetryCallback(JSRuntime *rt, JSAccumulateTelemetryDataCallback callback); + +extern JS_FRIEND_API(JSPrincipals *) +JS_GetCompartmentPrincipals(JSCompartment *compartment); + +extern JS_FRIEND_API(void) +JS_SetCompartmentPrincipals(JSCompartment *compartment, JSPrincipals *principals); + +extern JS_FRIEND_API(JSPrincipals *) +JS_GetScriptPrincipals(JSScript *script); + +extern JS_FRIEND_API(JSPrincipals *) +JS_GetScriptOriginPrincipals(JSScript *script); + +/* Safe to call with input obj == nullptr. Returns non-nullptr iff obj != nullptr. */ +extern JS_FRIEND_API(JSObject *) +JS_ObjectToInnerObject(JSContext *cx, JS::HandleObject obj); + +/* Requires obj != nullptr. */ +extern JS_FRIEND_API(JSObject *) +JS_ObjectToOuterObject(JSContext *cx, JS::HandleObject obj); + +extern JS_FRIEND_API(JSObject *) +JS_CloneObject(JSContext *cx, JS::HandleObject obj, JS::HandleObject proto, + JS::HandleObject parent); + +extern JS_FRIEND_API(JSString *) +JS_BasicObjectToString(JSContext *cx, JS::HandleObject obj); + +extern JS_FRIEND_API(bool) +js_GetterOnlyPropertyStub(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool strict, + JS::MutableHandleValue vp); + +JS_FRIEND_API(void) +js_ReportOverRecursed(JSContext *maybecx); + +JS_FRIEND_API(bool) +js_ObjectClassIs(JSContext *cx, JS::HandleObject obj, js::ESClassValue classValue); + +JS_FRIEND_API(const char *) +js_ObjectClassName(JSContext *cx, JS::HandleObject obj); + +namespace js { + +JS_FRIEND_API(bool) +AddRawValueRoot(JSContext *cx, JS::Value *vp, const char *name); + +JS_FRIEND_API(void) +RemoveRawValueRoot(JSContext *cx, JS::Value *vp); + +} /* namespace js */ + +#ifdef JS_DEBUG + +/* + * Routines to print out values during debugging. These are FRIEND_API to help + * the debugger find them and to support temporarily hacking js_Dump* calls + * into other code. + */ + +extern JS_FRIEND_API(void) +js_DumpString(JSString *str); + +extern JS_FRIEND_API(void) +js_DumpAtom(JSAtom *atom); + +extern JS_FRIEND_API(void) +js_DumpObject(JSObject *obj); + +extern JS_FRIEND_API(void) +js_DumpChars(const jschar *s, size_t n); +#endif + +/* + * Copies all own properties from |obj| to |target|. |obj| must be a "native" + * object (that is to say, normal-ish - not an Array or a Proxy). + * + * This function immediately enters a compartment, and does not impose any + * restrictions on the compartment of |cx|. + */ +extern JS_FRIEND_API(bool) +JS_CopyPropertiesFrom(JSContext *cx, JS::HandleObject target, JS::HandleObject obj); + +/* + * Single-property version of the above. This function asserts that an |own| + * property of the given name exists on |obj|. + * + * On entry, |cx| must be same-compartment with |obj|. + */ +extern JS_FRIEND_API(bool) +JS_CopyPropertyFrom(JSContext *cx, JS::HandleId id, JS::HandleObject target, + JS::HandleObject obj); + +extern JS_FRIEND_API(bool) +JS_WrapPropertyDescriptor(JSContext *cx, JS::MutableHandle desc); + +extern JS_FRIEND_API(bool) +JS_WrapAutoIdVector(JSContext *cx, JS::AutoIdVector &props); + +extern JS_FRIEND_API(bool) +JS_EnumerateState(JSContext *cx, JS::HandleObject obj, JSIterateOp enum_op, + JS::MutableHandleValue statep, JS::MutableHandleId idp); + +struct JSFunctionSpecWithHelp { + const char *name; + JSNative call; + uint16_t nargs; + uint16_t flags; + const char *usage; + const char *help; +}; + +#define JS_FN_HELP(name,call,nargs,flags,usage,help) \ + {name, call, nargs, (flags) | JSPROP_ENUMERATE | JSFUN_STUB_GSOPS, usage, help} +#define JS_FS_HELP_END \ + {nullptr, nullptr, 0, 0, nullptr, nullptr} + +extern JS_FRIEND_API(bool) +JS_DefineFunctionsWithHelp(JSContext *cx, JS::HandleObject obj, const JSFunctionSpecWithHelp *fs); + +namespace js { + +/* + * Helper Macros for creating JSClasses that function as proxies. + * + * NB: The macro invocation must be surrounded by braces, so as to + * allow for potention JSClass extensions. + */ +#define PROXY_MAKE_EXT(outerObject, innerObject, iteratorObject, \ + isWrappedNative) \ + { \ + outerObject, \ + innerObject, \ + iteratorObject, \ + isWrappedNative, \ + js::proxy_WeakmapKeyDelegate \ + } + +#define PROXY_CLASS_WITH_EXT(name, extraSlots, flags, callOp, constructOp, ext) \ + { \ + name, \ + js::Class::NON_NATIVE | \ + JSCLASS_IS_PROXY | \ + JSCLASS_IMPLEMENTS_BARRIERS | \ + JSCLASS_HAS_RESERVED_SLOTS(js::PROXY_MINIMUM_SLOTS + (extraSlots)) | \ + flags, \ + JS_PropertyStub, /* addProperty */ \ + JS_DeletePropertyStub, /* delProperty */ \ + JS_PropertyStub, /* getProperty */ \ + JS_StrictPropertyStub, /* setProperty */ \ + JS_EnumerateStub, \ + JS_ResolveStub, \ + js::proxy_Convert, \ + js::proxy_Finalize, /* finalize */ \ + callOp, /* call */ \ + js::proxy_HasInstance, /* hasInstance */ \ + constructOp, /* construct */ \ + js::proxy_Trace, /* trace */ \ + JS_NULL_CLASS_SPEC, \ + ext, \ + { \ + js::proxy_LookupGeneric, \ + js::proxy_LookupProperty, \ + js::proxy_LookupElement, \ + js::proxy_DefineGeneric, \ + js::proxy_DefineProperty, \ + js::proxy_DefineElement, \ + js::proxy_GetGeneric, \ + js::proxy_GetProperty, \ + js::proxy_GetElement, \ + js::proxy_SetGeneric, \ + js::proxy_SetProperty, \ + js::proxy_SetElement, \ + js::proxy_GetGenericAttributes, \ + js::proxy_SetGenericAttributes, \ + js::proxy_DeleteGeneric, \ + js::proxy_Watch, js::proxy_Unwatch, \ + js::proxy_Slice, \ + nullptr, /* enumerate */ \ + nullptr, /* thisObject */ \ + } \ + } + +#define PROXY_CLASS_DEF(name, extraSlots, flags, callOp, constructOp) \ + PROXY_CLASS_WITH_EXT(name, extraSlots, flags, callOp, constructOp, \ + PROXY_MAKE_EXT( \ + nullptr, /* outerObject */ \ + nullptr, /* innerObject */ \ + nullptr, /* iteratorObject */ \ + false /* isWrappedNative */ \ + )) + +/* + * Proxy stubs, similar to JS_*Stub, for embedder proxy class definitions. + * + * NB: Should not be called directly. + */ + +extern JS_FRIEND_API(bool) +proxy_LookupGeneric(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleObject objp, + JS::MutableHandle propp); +extern JS_FRIEND_API(bool) +proxy_LookupProperty(JSContext *cx, JS::HandleObject obj, JS::Handle name, + JS::MutableHandleObject objp, JS::MutableHandle propp); +extern JS_FRIEND_API(bool) +proxy_LookupElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::MutableHandleObject objp, + JS::MutableHandle propp); +extern JS_FRIEND_API(bool) +proxy_DefineGeneric(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue value, + JSPropertyOp getter, JSStrictPropertyOp setter, unsigned attrs); +extern JS_FRIEND_API(bool) +proxy_DefineProperty(JSContext *cx, JS::HandleObject obj, JS::Handle name, + JS::HandleValue value, JSPropertyOp getter, JSStrictPropertyOp setter, + unsigned attrs); +extern JS_FRIEND_API(bool) +proxy_DefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleValue value, + JSPropertyOp getter, JSStrictPropertyOp setter, unsigned attrs); +extern JS_FRIEND_API(bool) +proxy_GetGeneric(JSContext *cx, JS::HandleObject obj, JS::HandleObject receiver, JS::HandleId id, + JS::MutableHandleValue vp); +extern JS_FRIEND_API(bool) +proxy_GetProperty(JSContext *cx, JS::HandleObject obj, JS::HandleObject receiver, + JS::Handle name, JS::MutableHandleValue vp); +extern JS_FRIEND_API(bool) +proxy_GetElement(JSContext *cx, JS::HandleObject obj, JS::HandleObject receiver, uint32_t index, + JS::MutableHandleValue vp); +extern JS_FRIEND_API(bool) +proxy_SetGeneric(JSContext *cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleValue bp, bool strict); +extern JS_FRIEND_API(bool) +proxy_SetProperty(JSContext *cx, JS::HandleObject obj, JS::Handle name, + JS::MutableHandleValue bp, bool strict); +extern JS_FRIEND_API(bool) +proxy_SetElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::MutableHandleValue vp, + bool strict); +extern JS_FRIEND_API(bool) +proxy_GetGenericAttributes(JSContext *cx, JS::HandleObject obj, JS::HandleId id, unsigned *attrsp); +extern JS_FRIEND_API(bool) +proxy_SetGenericAttributes(JSContext *cx, JS::HandleObject obj, JS::HandleId id, unsigned *attrsp); +extern JS_FRIEND_API(bool) +proxy_DeleteGeneric(JSContext *cx, JS::HandleObject obj, JS::HandleId id, bool *succeeded); + +extern JS_FRIEND_API(void) +proxy_Trace(JSTracer *trc, JSObject *obj); +extern JS_FRIEND_API(JSObject *) +proxy_WeakmapKeyDelegate(JSObject *obj); +extern JS_FRIEND_API(bool) +proxy_Convert(JSContext *cx, JS::HandleObject proxy, JSType hint, JS::MutableHandleValue vp); +extern JS_FRIEND_API(void) +proxy_Finalize(FreeOp *fop, JSObject *obj); +extern JS_FRIEND_API(bool) +proxy_HasInstance(JSContext *cx, JS::HandleObject proxy, JS::MutableHandleValue v, bool *bp); +extern JS_FRIEND_API(bool) +proxy_Call(JSContext *cx, unsigned argc, JS::Value *vp); +extern JS_FRIEND_API(bool) +proxy_Construct(JSContext *cx, unsigned argc, JS::Value *vp); +extern JS_FRIEND_API(JSObject *) +proxy_innerObject(JSObject *obj); +extern JS_FRIEND_API(bool) +proxy_Watch(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject callable); +extern JS_FRIEND_API(bool) +proxy_Unwatch(JSContext *cx, JS::HandleObject obj, JS::HandleId id); +extern JS_FRIEND_API(bool) +proxy_Slice(JSContext *cx, JS::HandleObject proxy, uint32_t begin, uint32_t end, + JS::HandleObject result); + +/* + * A class of objects that return source code on demand. + * + * When code is compiled with setSourceIsLazy(true), SpiderMonkey doesn't + * retain the source code (and doesn't do lazy bytecode generation). If we ever + * need the source code, say, in response to a call to Function.prototype. + * toSource or Debugger.Source.prototype.text, then we call the 'load' member + * function of the instance of this class that has hopefully been registered + * with the runtime, passing the code's URL, and hope that it will be able to + * find the source. + */ +class SourceHook { + public: + virtual ~SourceHook() { } + + /* + * Set |*src| and |*length| to refer to the source code for |filename|. + * On success, the caller owns the buffer to which |*src| points, and + * should use JS_free to free it. + */ + virtual bool load(JSContext *cx, const char *filename, jschar **src, size_t *length) = 0; +}; + +/* + * Have |rt| use |hook| to retrieve lazily-retrieved source code. See the + * comments for SourceHook. The runtime takes ownership of the hook, and + * will delete it when the runtime itself is deleted, or when a new hook is + * set. + */ +extern JS_FRIEND_API(void) +SetSourceHook(JSRuntime *rt, mozilla::UniquePtr hook); + +/* Remove |rt|'s source hook, and return it. The caller now owns the hook. */ +extern JS_FRIEND_API(mozilla::UniquePtr) +ForgetSourceHook(JSRuntime *rt); + +#ifdef NIGHTLY_BUILD +typedef void (*AssertOnScriptEntryHook)(JSContext *cx, JS::HandleScript script); + +extern JS_FRIEND_API(void) +SetAssertOnScriptEntryHook(JSRuntime *rt, AssertOnScriptEntryHook hook); +#endif + +extern JS_FRIEND_API(JS::Zone *) +GetCompartmentZone(JSCompartment *comp); + +typedef bool +(* PreserveWrapperCallback)(JSContext *cx, JSObject *obj); + +typedef enum { + CollectNurseryBeforeDump, + IgnoreNurseryObjects +} DumpHeapNurseryBehaviour; + + /* + * Dump the complete object graph of heap-allocated things. + * fp is the file for the dump output. + */ +extern JS_FRIEND_API(void) +DumpHeapComplete(JSRuntime *rt, FILE *fp, DumpHeapNurseryBehaviour nurseryBehaviour); + +#ifdef JS_OLD_GETTER_SETTER_METHODS +JS_FRIEND_API(bool) obj_defineGetter(JSContext *cx, unsigned argc, JS::Value *vp); +JS_FRIEND_API(bool) obj_defineSetter(JSContext *cx, unsigned argc, JS::Value *vp); +#endif + +extern JS_FRIEND_API(bool) +IsSystemCompartment(JSCompartment *comp); + +extern JS_FRIEND_API(bool) +IsSystemZone(JS::Zone *zone); + +extern JS_FRIEND_API(bool) +IsAtomsCompartment(JSCompartment *comp); + +/* + * Returns whether we're in a non-strict property set (in that we're in a + * non-strict script and the bytecode we're on is a property set). The return + * value does NOT indicate any sort of exception was thrown: it's just a + * boolean. + */ +extern JS_FRIEND_API(bool) +IsInNonStrictPropertySet(JSContext *cx); + +struct WeakMapTracer; + +/* + * Weak map tracer callback, called once for every binding of every + * weak map that was live at the time of the last garbage collection. + * + * m will be nullptr if the weak map is not contained in a JS Object. + */ +typedef void +(* WeakMapTraceCallback)(WeakMapTracer *trc, JSObject *m, + void *k, JSGCTraceKind kkind, + void *v, JSGCTraceKind vkind); + +struct WeakMapTracer { + JSRuntime *runtime; + WeakMapTraceCallback callback; + + WeakMapTracer(JSRuntime *rt, WeakMapTraceCallback cb) + : runtime(rt), callback(cb) {} +}; + +extern JS_FRIEND_API(void) +TraceWeakMaps(WeakMapTracer *trc); + +extern JS_FRIEND_API(bool) +AreGCGrayBitsValid(JSRuntime *rt); + +extern JS_FRIEND_API(bool) +ZoneGlobalsAreAllGray(JS::Zone *zone); + +typedef void +(*GCThingCallback)(void *closure, void *gcthing); + +extern JS_FRIEND_API(void) +VisitGrayWrapperTargets(JS::Zone *zone, GCThingCallback callback, void *closure); + +extern JS_FRIEND_API(JSObject *) +GetWeakmapKeyDelegate(JSObject *key); + +JS_FRIEND_API(JSGCTraceKind) +GCThingTraceKind(void *thing); + +/* + * Invoke cellCallback on every gray JS_OBJECT in the given zone. + */ +extern JS_FRIEND_API(void) +IterateGrayObjects(JS::Zone *zone, GCThingCallback cellCallback, void *data); + +#ifdef JS_HAS_CTYPES +extern JS_FRIEND_API(size_t) +SizeOfDataIfCDataObject(mozilla::MallocSizeOf mallocSizeOf, JSObject *obj); +#endif + +extern JS_FRIEND_API(JSCompartment *) +GetAnyCompartmentInZone(JS::Zone *zone); + +/* + * Shadow declarations of JS internal structures, for access by inline access + * functions below. Do not use these structures in any other way. When adding + * new fields for access by inline methods, make sure to add static asserts to + * the original header file to ensure that offsets are consistent. + */ +namespace shadow { + +struct TypeObject { + const Class *clasp; + JSObject *proto; +}; + +struct BaseShape { + const js::Class *clasp_; + JSObject *parent; + JSObject *_1; + JSCompartment *compartment; +}; + +class Shape { +public: + shadow::BaseShape *base; + jsid _1; + uint32_t slotInfo; + + static const uint32_t FIXED_SLOTS_SHIFT = 27; +}; + +struct Object { + shadow::Shape *shape; + shadow::TypeObject *type; + JS::Value *slots; + JS::Value *_1; + + size_t numFixedSlots() const { return shape->slotInfo >> Shape::FIXED_SLOTS_SHIFT; } + JS::Value *fixedSlots() const { + return (JS::Value *)(uintptr_t(this) + sizeof(shadow::Object)); + } + + JS::Value &slotRef(size_t slot) const { + size_t nfixed = numFixedSlots(); + if (slot < nfixed) + return fixedSlots()[slot]; + return slots[slot - nfixed]; + } + + // Reserved slots with index < MAX_FIXED_SLOTS are guaranteed to + // be fixed slots. + static const uint32_t MAX_FIXED_SLOTS = 16; +}; + +struct Function { + Object base; + uint16_t nargs; + uint16_t flags; + /* Used only for natives */ + JSNative native; + const JSJitInfo *jitinfo; + void *_1; +}; + +struct String +{ + static const uint32_t INLINE_CHARS_BIT = JS_BIT(2); + static const uint32_t LATIN1_CHARS_BIT = JS_BIT(6); + static const uint32_t ROPE_FLAGS = 0; + static const uint32_t TYPE_FLAGS_MASK = JS_BIT(6) - 1; + uint32_t flags; + uint32_t length; + union { + const JS::Latin1Char *nonInlineCharsLatin1; + const jschar *nonInlineCharsTwoByte; + JS::Latin1Char inlineStorageLatin1[1]; + jschar inlineStorageTwoByte[1]; + }; +}; + +} /* namespace shadow */ + +// This is equal to |&JSObject::class_|. Use it in places where you don't want +// to #include jsobj.h. +extern JS_FRIEND_DATA(const js::Class* const) ObjectClassPtr; + +inline const js::Class * +GetObjectClass(JSObject *obj) +{ + return reinterpret_cast(obj)->type->clasp; +} + +inline const JSClass * +GetObjectJSClass(JSObject *obj) +{ + return js::Jsvalify(GetObjectClass(obj)); +} + +JS_FRIEND_API(const Class *) +ProtoKeyToClass(JSProtoKey key); + +// Returns true if the standard class identified by |key| inherits from +// another standard class with the same js::Class. This basically means +// that the various properties described by our js::Class are intended +// to live higher up on the proto chain. +// +// In practice, this only returns true for Error subtypes. +inline bool +StandardClassIsDependent(JSProtoKey key) +{ + JSProtoKey keyFromClass = JSCLASS_CACHED_PROTO_KEY(ProtoKeyToClass(key)); + MOZ_ASSERT(keyFromClass); + return key != keyFromClass; +} + +// Returns the key for the class inherited by a given standard class (that +// is to say, the prototype of this standard class's prototype). +// +// You must be sure that this corresponds to a standard class with a cached +// JSProtoKey before calling this function. In general |key| will match the +// cached proto key, except in cases where multiple JSProtoKeys share a +// JSClass. +inline JSProtoKey +ParentKeyForStandardClass(JSProtoKey key) +{ + // [Object] has nothing to inherit from. + if (key == JSProto_Object) + return JSProto_Null; + + // If we're dependent (i.e. an Error subtype), return the key of the class + // we depend on. + if (StandardClassIsDependent(key)) + return JSCLASS_CACHED_PROTO_KEY(ProtoKeyToClass(key)); + + // Otherwise, we inherit [Object]. + return JSProto_Object; +} + +inline bool +IsInnerObject(JSObject *obj) { + return !!GetObjectClass(obj)->ext.outerObject; +} + +inline bool +IsOuterObject(JSObject *obj) { + return !!GetObjectClass(obj)->ext.innerObject; +} + +JS_FRIEND_API(bool) +IsFunctionObject(JSObject *obj); + +JS_FRIEND_API(bool) +IsScopeObject(JSObject *obj); + +JS_FRIEND_API(bool) +IsCallObject(JSObject *obj); + +inline JSObject * +GetObjectParent(JSObject *obj) +{ + JS_ASSERT(!IsScopeObject(obj)); + return reinterpret_cast(obj)->shape->base->parent; +} + +static MOZ_ALWAYS_INLINE JSCompartment * +GetObjectCompartment(JSObject *obj) +{ + return reinterpret_cast(obj)->shape->base->compartment; +} + +JS_FRIEND_API(JSObject *) +GetObjectParentMaybeScope(JSObject *obj); + +JS_FRIEND_API(JSObject *) +GetGlobalForObjectCrossCompartment(JSObject *obj); + +// Sidestep the activeContext checking implicitly performed in +// JS_SetPendingException. +JS_FRIEND_API(void) +SetPendingExceptionCrossContext(JSContext *cx, JS::HandleValue v); + +JS_FRIEND_API(void) +AssertSameCompartment(JSContext *cx, JSObject *obj); + +#ifdef JS_DEBUG +JS_FRIEND_API(void) +AssertSameCompartment(JSObject *objA, JSObject *objB); +#else +inline void AssertSameCompartment(JSObject *objA, JSObject *objB) {} +#endif + +// For legacy consumers only. This whole concept is going away soon. +JS_FRIEND_API(JSObject *) +DefaultObjectForContextOrNull(JSContext *cx); + +JS_FRIEND_API(void) +SetDefaultObjectForContext(JSContext *cx, JSObject *obj); + +JS_FRIEND_API(void) +NotifyAnimationActivity(JSObject *obj); + +/* + * Return the outermost enclosing function (script) of the scripted caller. + * This function returns nullptr in several cases: + * - no script is running on the context + * - the caller is in global or eval code + * In particular, this function will "stop" its outermost search at eval() and + * thus it will really return the outermost enclosing function *since the + * innermost eval*. + */ +JS_FRIEND_API(JSFunction *) +GetOutermostEnclosingFunctionOfScriptedCaller(JSContext *cx); + +JS_FRIEND_API(JSFunction *) +DefineFunctionWithReserved(JSContext *cx, JSObject *obj, const char *name, JSNative call, + unsigned nargs, unsigned attrs); + +JS_FRIEND_API(JSFunction *) +NewFunctionWithReserved(JSContext *cx, JSNative call, unsigned nargs, unsigned flags, + JSObject *parent, const char *name); + +JS_FRIEND_API(JSFunction *) +NewFunctionByIdWithReserved(JSContext *cx, JSNative native, unsigned nargs, unsigned flags, + JSObject *parent, jsid id); + +JS_FRIEND_API(const JS::Value &) +GetFunctionNativeReserved(JSObject *fun, size_t which); + +JS_FRIEND_API(void) +SetFunctionNativeReserved(JSObject *fun, size_t which, const JS::Value &val); + +JS_FRIEND_API(bool) +GetObjectProto(JSContext *cx, JS::HandleObject obj, JS::MutableHandleObject proto); + +JS_FRIEND_API(bool) +GetOriginalEval(JSContext *cx, JS::HandleObject scope, + JS::MutableHandleObject eval); + +inline void * +GetObjectPrivate(JSObject *obj) +{ + const shadow::Object *nobj = reinterpret_cast(obj); + void **addr = reinterpret_cast(&nobj->fixedSlots()[nobj->numFixedSlots()]); + return *addr; +} + +/* + * Get a slot that is both reserved for object's clasp *and* is fixed (fits + * within the maximum capacity for the object's fixed slots). + */ +inline const JS::Value & +GetReservedSlot(JSObject *obj, size_t slot) +{ + JS_ASSERT(slot < JSCLASS_RESERVED_SLOTS(GetObjectClass(obj))); + return reinterpret_cast(obj)->slotRef(slot); +} + +JS_FRIEND_API(void) +SetReservedSlotWithBarrier(JSObject *obj, size_t slot, const JS::Value &value); + +inline void +SetReservedSlot(JSObject *obj, size_t slot, const JS::Value &value) +{ + JS_ASSERT(slot < JSCLASS_RESERVED_SLOTS(GetObjectClass(obj))); + shadow::Object *sobj = reinterpret_cast(obj); + if (sobj->slotRef(slot).isMarkable() +#ifdef JSGC_GENERATIONAL + || value.isMarkable() +#endif + ) + { + SetReservedSlotWithBarrier(obj, slot, value); + } else { + sobj->slotRef(slot) = value; + } +} + +JS_FRIEND_API(uint32_t) +GetObjectSlotSpan(JSObject *obj); + +inline const JS::Value & +GetObjectSlot(JSObject *obj, size_t slot) +{ + JS_ASSERT(slot < GetObjectSlotSpan(obj)); + return reinterpret_cast(obj)->slotRef(slot); +} + +MOZ_ALWAYS_INLINE size_t +GetAtomLength(JSAtom *atom) +{ + return reinterpret_cast(atom)->length; +} + +static const uint32_t MaxStringLength = (1 << 28) - 1; + +MOZ_ALWAYS_INLINE size_t +GetStringLength(JSString *s) +{ + return reinterpret_cast(s)->length; +} + +MOZ_ALWAYS_INLINE size_t +GetFlatStringLength(JSFlatString *s) +{ + return reinterpret_cast(s)->length; +} + +MOZ_ALWAYS_INLINE size_t +GetLinearStringLength(JSLinearString *s) +{ + return reinterpret_cast(s)->length; +} + +MOZ_ALWAYS_INLINE bool +LinearStringHasLatin1Chars(JSLinearString *s) +{ + return reinterpret_cast(s)->flags & shadow::String::LATIN1_CHARS_BIT; +} + +MOZ_ALWAYS_INLINE bool +AtomHasLatin1Chars(JSAtom *atom) +{ + return reinterpret_cast(atom)->flags & shadow::String::LATIN1_CHARS_BIT; +} + +MOZ_ALWAYS_INLINE bool +StringHasLatin1Chars(JSString *s) +{ + return reinterpret_cast(s)->flags & shadow::String::LATIN1_CHARS_BIT; +} + +MOZ_ALWAYS_INLINE const JS::Latin1Char * +GetLatin1LinearStringChars(const JS::AutoCheckCannotGC &nogc, JSLinearString *linear) +{ + MOZ_ASSERT(LinearStringHasLatin1Chars(linear)); + + using shadow::String; + String *s = reinterpret_cast(linear); + if (s->flags & String::INLINE_CHARS_BIT) + return s->inlineStorageLatin1; + return s->nonInlineCharsLatin1; +} + +MOZ_ALWAYS_INLINE const jschar * +GetTwoByteLinearStringChars(const JS::AutoCheckCannotGC &nogc, JSLinearString *linear) +{ + MOZ_ASSERT(!LinearStringHasLatin1Chars(linear)); + + using shadow::String; + String *s = reinterpret_cast(linear); + if (s->flags & String::INLINE_CHARS_BIT) + return s->inlineStorageTwoByte; + return s->nonInlineCharsTwoByte; +} + +MOZ_ALWAYS_INLINE JSLinearString * +AtomToLinearString(JSAtom *atom) +{ + return reinterpret_cast(atom); +} + +MOZ_ALWAYS_INLINE JSLinearString * +FlatStringToLinearString(JSFlatString *s) +{ + return reinterpret_cast(s); +} + +MOZ_ALWAYS_INLINE const JS::Latin1Char * +GetLatin1AtomChars(const JS::AutoCheckCannotGC &nogc, JSAtom *atom) +{ + return GetLatin1LinearStringChars(nogc, AtomToLinearString(atom)); +} + +MOZ_ALWAYS_INLINE const jschar * +GetTwoByteAtomChars(const JS::AutoCheckCannotGC &nogc, JSAtom *atom) +{ + return GetTwoByteLinearStringChars(nogc, AtomToLinearString(atom)); +} + +JS_FRIEND_API(JSLinearString *) +StringToLinearStringSlow(JSContext *cx, JSString *str); + +MOZ_ALWAYS_INLINE JSLinearString * +StringToLinearString(JSContext *cx, JSString *str) +{ + using shadow::String; + String *s = reinterpret_cast(str); + if (MOZ_UNLIKELY((s->flags & String::TYPE_FLAGS_MASK) == String::ROPE_FLAGS)) + return StringToLinearStringSlow(cx, str); + return reinterpret_cast(str); +} + +MOZ_ALWAYS_INLINE void +CopyLinearStringChars(jschar *dest, JSLinearString *s, size_t len) +{ + JS::AutoCheckCannotGC nogc; + if (LinearStringHasLatin1Chars(s)) { + const JS::Latin1Char *src = GetLatin1LinearStringChars(nogc, s); + for (size_t i = 0; i < len; i++) + dest[i] = src[i]; + } else { + const jschar *src = GetTwoByteLinearStringChars(nogc, s); + mozilla::PodCopy(dest, src, len); + } +} + +inline bool +CopyStringChars(JSContext *cx, jschar *dest, JSString *s, size_t len) +{ + JSLinearString *linear = StringToLinearString(cx, s); + if (!linear) + return false; + + CopyLinearStringChars(dest, linear, len); + return true; +} + +inline void +CopyFlatStringChars(jschar *dest, JSFlatString *s, size_t len) +{ + CopyLinearStringChars(dest, FlatStringToLinearString(s), len); +} + +JS_FRIEND_API(bool) +GetPropertyNames(JSContext *cx, JSObject *obj, unsigned flags, JS::AutoIdVector *props); + +JS_FRIEND_API(bool) +AppendUnique(JSContext *cx, JS::AutoIdVector &base, JS::AutoIdVector &others); + +JS_FRIEND_API(bool) +GetGeneric(JSContext *cx, JSObject *obj, JSObject *receiver, jsid id, JS::Value *vp); + +JS_FRIEND_API(bool) +StringIsArrayIndex(JSLinearString *str, uint32_t *indexp); + +JS_FRIEND_API(void) +SetPreserveWrapperCallback(JSRuntime *rt, PreserveWrapperCallback callback); + +JS_FRIEND_API(bool) +IsObjectInContextCompartment(JSObject *obj, const JSContext *cx); + +/* + * NB: these flag bits are encoded into the bytecode stream in the immediate + * operand of JSOP_ITER, so don't change them without advancing vm/Xdr.h's + * XDR_BYTECODE_VERSION. + */ +#define JSITER_ENUMERATE 0x1 /* for-in compatible hidden default iterator */ +#define JSITER_FOREACH 0x2 /* get obj[key] for each property */ +#define JSITER_KEYVALUE 0x4 /* obsolete destructuring for-in wants [key, value] */ +#define JSITER_OWNONLY 0x8 /* iterate over obj's own properties only */ +#define JSITER_HIDDEN 0x10 /* also enumerate non-enumerable properties */ +#define JSITER_SYMBOLS 0x20 /* also include symbol property keys */ +#define JSITER_SYMBOLSONLY 0x40 /* exclude string property keys */ + +JS_FRIEND_API(bool) +RunningWithTrustedPrincipals(JSContext *cx); + +inline uintptr_t +GetNativeStackLimit(JSContext *cx) +{ + StackKind kind = RunningWithTrustedPrincipals(cx) ? StackForTrustedScript + : StackForUntrustedScript; + PerThreadDataFriendFields *mainThread = + PerThreadDataFriendFields::getMainThread(GetRuntime(cx)); + return mainThread->nativeStackLimit[kind]; +} + +/* + * These macros report a stack overflow and run |onerror| if we are close to + * using up the C stack. The JS_CHECK_CHROME_RECURSION variant gives us a little + * extra space so that we can ensure that crucial code is able to run. + * JS_CHECK_RECURSION_CONSERVATIVE gives us a little less space. + */ + +#define JS_CHECK_RECURSION(cx, onerror) \ + JS_BEGIN_MACRO \ + int stackDummy_; \ + if (!JS_CHECK_STACK_SIZE(js::GetNativeStackLimit(cx), &stackDummy_)) { \ + js_ReportOverRecursed(cx); \ + onerror; \ + } \ + JS_END_MACRO + +#define JS_CHECK_RECURSION_DONT_REPORT(cx, onerror) \ + JS_BEGIN_MACRO \ + int stackDummy_; \ + if (!JS_CHECK_STACK_SIZE(js::GetNativeStackLimit(cx), &stackDummy_)) { \ + onerror; \ + } \ + JS_END_MACRO + +#define JS_CHECK_RECURSION_WITH_SP_DONT_REPORT(cx, sp, onerror) \ + JS_BEGIN_MACRO \ + if (!JS_CHECK_STACK_SIZE(js::GetNativeStackLimit(cx), sp)) { \ + onerror; \ + } \ + JS_END_MACRO + +#define JS_CHECK_RECURSION_WITH_SP(cx, sp, onerror) \ + JS_BEGIN_MACRO \ + if (!JS_CHECK_STACK_SIZE(js::GetNativeStackLimit(cx), sp)) { \ + js_ReportOverRecursed(cx); \ + onerror; \ + } \ + JS_END_MACRO + +#define JS_CHECK_CHROME_RECURSION(cx, onerror) \ + JS_BEGIN_MACRO \ + int stackDummy_; \ + if (!JS_CHECK_STACK_SIZE_WITH_TOLERANCE(js::GetNativeStackLimit(cx), \ + &stackDummy_, \ + 1024 * sizeof(size_t))) \ + { \ + js_ReportOverRecursed(cx); \ + onerror; \ + } \ + JS_END_MACRO + +#define JS_CHECK_RECURSION_CONSERVATIVE(cx, onerror) \ + JS_BEGIN_MACRO \ + int stackDummy_; \ + if (!JS_CHECK_STACK_SIZE_WITH_INTOLERANCE(js::GetNativeStackLimit(cx), \ + &stackDummy_, \ + 1024 * sizeof(size_t))) \ + { \ + js_ReportOverRecursed(cx); \ + onerror; \ + } \ + JS_END_MACRO + +JS_FRIEND_API(void) +StartPCCountProfiling(JSContext *cx); + +JS_FRIEND_API(void) +StopPCCountProfiling(JSContext *cx); + +JS_FRIEND_API(void) +PurgePCCounts(JSContext *cx); + +JS_FRIEND_API(size_t) +GetPCCountScriptCount(JSContext *cx); + +JS_FRIEND_API(JSString *) +GetPCCountScriptSummary(JSContext *cx, size_t script); + +JS_FRIEND_API(JSString *) +GetPCCountScriptContents(JSContext *cx, size_t script); + +#ifdef JS_THREADSAFE +JS_FRIEND_API(bool) +ContextHasOutstandingRequests(const JSContext *cx); +#endif + +typedef void +(* ActivityCallback)(void *arg, bool active); + +/* + * Sets a callback that is run whenever the runtime goes idle - the + * last active request ceases - and begins activity - when it was + * idle and a request begins. + */ +JS_FRIEND_API(void) +SetActivityCallback(JSRuntime *rt, ActivityCallback cb, void *arg); + +extern JS_FRIEND_API(const JSStructuredCloneCallbacks *) +GetContextStructuredCloneCallbacks(JSContext *cx); + +extern JS_FRIEND_API(bool) +IsContextRunningJS(JSContext *cx); + +typedef bool +(* DOMInstanceClassHasProtoAtDepth)(const Class *instanceClass, + uint32_t protoID, uint32_t depth); +struct JSDOMCallbacks { + DOMInstanceClassHasProtoAtDepth instanceClassMatchesProto; +}; +typedef struct JSDOMCallbacks DOMCallbacks; + +extern JS_FRIEND_API(void) +SetDOMCallbacks(JSRuntime *rt, const DOMCallbacks *callbacks); + +extern JS_FRIEND_API(const DOMCallbacks *) +GetDOMCallbacks(JSRuntime *rt); + +extern JS_FRIEND_API(JSObject *) +GetTestingFunctions(JSContext *cx); + +/* + * Helper to convert FreeOp to JSFreeOp when the definition of FreeOp is not + * available and the compiler does not know that FreeOp inherits from + * JSFreeOp. + */ +inline JSFreeOp * +CastToJSFreeOp(FreeOp *fop) +{ + return reinterpret_cast(fop); +} + +/* Implemented in jsexn.cpp. */ + +/* + * Get an error type name from a JSExnType constant. + * Returns nullptr for invalid arguments and JSEXN_INTERNALERR + */ +extern JS_FRIEND_API(JSFlatString *) +GetErrorTypeName(JSRuntime *rt, int16_t exnType); + +#ifdef JS_DEBUG +extern JS_FRIEND_API(unsigned) +GetEnterCompartmentDepth(JSContext* cx); +#endif + +/* Implemented in jswrapper.cpp. */ +typedef enum NukeReferencesToWindow { + NukeWindowReferences, + DontNukeWindowReferences +} NukeReferencesToWindow; + +/* + * These filters are designed to be ephemeral stack classes, and thus don't + * do any rooting or holding of their members. + */ +struct CompartmentFilter { + virtual bool match(JSCompartment *c) const = 0; +}; + +struct AllCompartments : public CompartmentFilter { + virtual bool match(JSCompartment *c) const { return true; } +}; + +struct ContentCompartmentsOnly : public CompartmentFilter { + virtual bool match(JSCompartment *c) const { + return !IsSystemCompartment(c); + } +}; + +struct ChromeCompartmentsOnly : public CompartmentFilter { + virtual bool match(JSCompartment *c) const { + return IsSystemCompartment(c); + } +}; + +struct SingleCompartment : public CompartmentFilter { + JSCompartment *ours; + explicit SingleCompartment(JSCompartment *c) : ours(c) {} + virtual bool match(JSCompartment *c) const { return c == ours; } +}; + +struct CompartmentsWithPrincipals : public CompartmentFilter { + JSPrincipals *principals; + explicit CompartmentsWithPrincipals(JSPrincipals *p) : principals(p) {} + virtual bool match(JSCompartment *c) const { + return JS_GetCompartmentPrincipals(c) == principals; + } +}; + +extern JS_FRIEND_API(bool) +NukeCrossCompartmentWrappers(JSContext* cx, + const CompartmentFilter& sourceFilter, + const CompartmentFilter& targetFilter, + NukeReferencesToWindow nukeReferencesToWindow); + +/* Specify information about DOMProxy proxies in the DOM, for use by ICs. */ + +/* + * The DOMProxyShadowsCheck function will be called to check if the property for + * id should be gotten from the prototype, or if there is an own property that + * shadows it. + * If DoesntShadow is returned then the slot at listBaseExpandoSlot should + * either be undefined or point to an expando object that would contain the own + * property. + * If DoesntShadowUnique is returned then the slot at listBaseExpandoSlot should + * contain a private pointer to a ExpandoAndGeneration, which contains a + * JS::Value that should either be undefined or point to an expando object, and + * a uint32 value. If that value changes then the IC for getting a property will + * be invalidated. + */ + +struct ExpandoAndGeneration { + ExpandoAndGeneration() + : expando(JS::UndefinedValue()), + generation(0) + {} + + void Unlink() + { + ++generation; + expando.setUndefined(); + } + + static size_t offsetOfExpando() + { + return offsetof(ExpandoAndGeneration, expando); + } + + static size_t offsetOfGeneration() + { + return offsetof(ExpandoAndGeneration, generation); + } + + JS::Heap expando; + uint32_t generation; +}; + +typedef enum DOMProxyShadowsResult { + ShadowCheckFailed, + Shadows, + DoesntShadow, + DoesntShadowUnique +} DOMProxyShadowsResult; +typedef DOMProxyShadowsResult +(* DOMProxyShadowsCheck)(JSContext* cx, JS::HandleObject object, JS::HandleId id); +JS_FRIEND_API(void) +SetDOMProxyInformation(const void *domProxyHandlerFamily, uint32_t domProxyExpandoSlot, + DOMProxyShadowsCheck domProxyShadowsCheck); + +const void *GetDOMProxyHandlerFamily(); +uint32_t GetDOMProxyExpandoSlot(); +DOMProxyShadowsCheck GetDOMProxyShadowsCheck(); + +} /* namespace js */ + +/* Implemented in jsdate.cpp. */ + +/* + * Detect whether the internal date value is NaN. (Because failure is + * out-of-band for js_DateGet*) + */ +extern JS_FRIEND_API(bool) +js_DateIsValid(JSObject* obj); + +extern JS_FRIEND_API(double) +js_DateGetMsecSinceEpoch(JSObject *obj); + +/* Implemented in jscntxt.cpp. */ + +/* + * Report an exception, which is currently realized as a printf-style format + * string and its arguments. + */ +typedef enum JSErrNum { +#define MSG_DEF(name, number, count, exception, format) \ + name = number, +#include "js.msg" +#undef MSG_DEF + JSErr_Limit +} JSErrNum; + +extern JS_FRIEND_API(const JSErrorFormatString *) +js_GetErrorMessage(void *userRef, const unsigned errorNumber); + +namespace js { + +// AutoStableStringChars is here so we can use it in ErrorReport. It +// should get moved out of here if we can manage it. See bug 1040316. + +/* + * This class provides safe access to a string's chars across a GC. Once + * we allocate strings and chars in the nursery (bug 903519), this class + * will have to make a copy of the string's chars if they are allocated + * in the nursery, so it's best to avoid using this class unless you really + * need it. It's usually more efficient to use the latin1Chars/twoByteChars + * JSString methods and often the code can be rewritten so that only indexes + * instead of char pointers are used in parts of the code that can GC. + */ +class MOZ_STACK_CLASS AutoStableStringChars +{ + /* Ensure the string is kept alive while we're using its chars. */ + JS::RootedString s_; + union { + const jschar *twoByteChars_; + const JS::Latin1Char *latin1Chars_; + }; + enum State { Uninitialized, Latin1, TwoByte }; + State state_; + bool ownsChars_; + + public: + AutoStableStringChars(JSContext *cx) + : s_(cx), state_(Uninitialized), ownsChars_(false) + {}; + ~AutoStableStringChars(); + + bool init(JSContext *cx, JSString *s); + + /* Like init(), but Latin1 chars are inflated to TwoByte. */ + bool initTwoByte(JSContext *cx, JSString *s); + + bool isLatin1() const { return state_ == Latin1; } + bool isTwoByte() const { return state_ == TwoByte; } + + const jschar *twoByteChars() const { + MOZ_ASSERT(state_ == TwoByte); + return twoByteChars_; + } + + mozilla::Range latin1Range() const { + MOZ_ASSERT(state_ == Latin1); + return mozilla::Range(latin1Chars_, + GetStringLength(s_)); + } + + mozilla::Range twoByteRange() const { + MOZ_ASSERT(state_ == TwoByte); + return mozilla::Range(twoByteChars_, + GetStringLength(s_)); + } + + /* If we own the chars, transfer ownership to the caller. */ + bool maybeGiveOwnershipToCaller() { + MOZ_ASSERT(state_ != Uninitialized); + if (!ownsChars_) + return false; + state_ = Uninitialized; + ownsChars_ = false; + return true; + } + + private: + AutoStableStringChars(const AutoStableStringChars &other) MOZ_DELETE; + void operator=(const AutoStableStringChars &other) MOZ_DELETE; +}; + +// Creates a string of the form |ErrorType: ErrorMessage| for a JSErrorReport, +// which generally matches the toString() behavior of an ErrorObject. +extern JS_FRIEND_API(JSString *) +ErrorReportToString(JSContext *cx, JSErrorReport *reportp); + +struct MOZ_STACK_CLASS JS_FRIEND_API(ErrorReport) +{ + ErrorReport(JSContext *cx); + ~ErrorReport(); + + bool init(JSContext *cx, JS::HandleValue exn); + + JSErrorReport *report() + { + return reportp; + } + + const char *message() + { + return message_; + } + + private: + // More or less an equivalent of JS_ReportErrorNumber/js_ReportErrorNumberVA + // but fills in an ErrorReport instead of reporting it. Uses varargs to + // make it simpler to call js_ExpandErrorArguments. + void populateUncaughtExceptionReport(JSContext *cx, ...); + void populateUncaughtExceptionReportVA(JSContext *cx, va_list ap); + + // We may have a provided JSErrorReport, so need a way to represent that. + JSErrorReport *reportp; + + // And we may have a message. + const char *message_; + + // Or we may need to synthesize a JSErrorReport one of our own. + JSErrorReport ownedReport; + + // Or a message of our own. If this is non-null, we need to clean up both + // it and ownedReport. + char *ownedMessage; + + // And we have a string to maybe keep alive that has pointers into + // it from ownedReport. + JS::RootedString str; + + // And keep its chars alive too. + AutoStableStringChars strChars; + + // And we need to root our exception value. + JS::RootedObject exnObject; + + // And possibly some byte storage for our message_. + JSAutoByteString bytesStorage; + + // And for our filename. + JSAutoByteString filename; + + // True if we need to free message_ and the stuff in ownedReport + bool ownsMessageAndReport; +}; + +} /* namespace js */ + + +/* Implemented in jsclone.cpp. */ + +extern JS_FRIEND_API(uint64_t) +js_GetSCOffset(JSStructuredCloneWriter* writer); + +namespace js { +namespace Scalar { + +/* Scalar types which can appear in typed arrays and typed objects. */ +enum Type { + Int8 = 0, + Uint8, + Int16, + Uint16, + Int32, + Uint32, + Float32, + Float64, + + /* + * Special type that is a uint8_t, but assignments are clamped to [0, 256). + * Treat the raw data type as a uint8_t. + */ + Uint8Clamped, + + TypeMax +}; + +static inline size_t +byteSize(Type atype) +{ + switch (atype) { + case Int8: + case Uint8: + case Uint8Clamped: + return 1; + case Int16: + case Uint16: + return 2; + case Int32: + case Uint32: + case Float32: + return 4; + case Float64: + return 8; + default: + MOZ_CRASH("invalid scalar type"); + } +} + +} /* namespace Scalar */ +} /* namespace js */ + +/* + * Create a new typed array with nelements elements. + * + * These functions (except the WithBuffer variants) fill in the array with zeros. + */ + +extern JS_FRIEND_API(JSObject *) +JS_NewInt8Array(JSContext *cx, uint32_t nelements); +extern JS_FRIEND_API(JSObject *) +JS_NewUint8Array(JSContext *cx, uint32_t nelements); +extern JS_FRIEND_API(JSObject *) +JS_NewUint8ClampedArray(JSContext *cx, uint32_t nelements); + +extern JS_FRIEND_API(JSObject *) +JS_NewInt16Array(JSContext *cx, uint32_t nelements); +extern JS_FRIEND_API(JSObject *) +JS_NewUint16Array(JSContext *cx, uint32_t nelements); +extern JS_FRIEND_API(JSObject *) +JS_NewInt32Array(JSContext *cx, uint32_t nelements); +extern JS_FRIEND_API(JSObject *) +JS_NewUint32Array(JSContext *cx, uint32_t nelements); +extern JS_FRIEND_API(JSObject *) +JS_NewFloat32Array(JSContext *cx, uint32_t nelements); +extern JS_FRIEND_API(JSObject *) +JS_NewFloat64Array(JSContext *cx, uint32_t nelements); + +/* + * Create a new typed array and copy in values from the given object. The + * object is used as if it were an array; that is, the new array (if + * successfully created) will have length given by array.length, and its + * elements will be those specified by array[0], array[1], and so on, after + * conversion to the typed array element type. + */ + +extern JS_FRIEND_API(JSObject *) +JS_NewInt8ArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewUint8ArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewUint8ClampedArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewInt16ArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewUint16ArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewInt32ArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewUint32ArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewFloat32ArrayFromArray(JSContext *cx, JS::HandleObject array); +extern JS_FRIEND_API(JSObject *) +JS_NewFloat64ArrayFromArray(JSContext *cx, JS::HandleObject array); + +/* + * Create a new typed array using the given ArrayBuffer for storage. The + * length value is optional; if -1 is passed, enough elements to use up the + * remainder of the byte array is used as the default value. + */ + +extern JS_FRIEND_API(JSObject *) +JS_NewInt8ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewUint8ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewUint8ClampedArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewInt16ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewUint16ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewInt32ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewUint32ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewFloat32ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); +extern JS_FRIEND_API(JSObject *) +JS_NewFloat64ArrayWithBuffer(JSContext *cx, JS::HandleObject arrayBuffer, + uint32_t byteOffset, int32_t length); + +/* + * Create a new ArrayBuffer with the given byte length. + */ +extern JS_FRIEND_API(JSObject *) +JS_NewArrayBuffer(JSContext *cx, uint32_t nbytes); + +/* + * Check whether obj supports JS_GetTypedArray* APIs. Note that this may return + * false if a security wrapper is encountered that denies the unwrapping. If + * this test or one of the JS_Is*Array tests succeeds, then it is safe to call + * the various accessor JSAPI calls defined below. + */ +extern JS_FRIEND_API(bool) +JS_IsTypedArrayObject(JSObject *obj); + +/* + * Check whether obj supports JS_GetArrayBufferView* APIs. Note that this may + * return false if a security wrapper is encountered that denies the + * unwrapping. If this test or one of the more specific tests succeeds, then it + * is safe to call the various ArrayBufferView accessor JSAPI calls defined + * below. + */ +extern JS_FRIEND_API(bool) +JS_IsArrayBufferViewObject(JSObject *obj); + +/* + * Test for specific typed array types (ArrayBufferView subtypes) + */ + +extern JS_FRIEND_API(bool) +JS_IsInt8Array(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsUint8Array(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsUint8ClampedArray(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsInt16Array(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsUint16Array(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsInt32Array(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsUint32Array(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsFloat32Array(JSObject *obj); +extern JS_FRIEND_API(bool) +JS_IsFloat64Array(JSObject *obj); + +/* + * Test for specific typed array types (ArrayBufferView subtypes) and return + * the unwrapped object if so, else nullptr. Never throws. + */ + +namespace js { + +extern JS_FRIEND_API(JSObject *) +UnwrapInt8Array(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapUint8Array(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapUint8ClampedArray(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapInt16Array(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapUint16Array(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapInt32Array(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapUint32Array(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapFloat32Array(JSObject *obj); +extern JS_FRIEND_API(JSObject *) +UnwrapFloat64Array(JSObject *obj); + +extern JS_FRIEND_API(JSObject *) +UnwrapArrayBuffer(JSObject *obj); + +extern JS_FRIEND_API(JSObject *) +UnwrapArrayBufferView(JSObject *obj); + +namespace detail { + +extern JS_FRIEND_DATA(const Class* const) Int8ArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Uint8ArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Uint8ClampedArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Int16ArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Uint16ArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Int32ArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Uint32ArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Float32ArrayClassPtr; +extern JS_FRIEND_DATA(const Class* const) Float64ArrayClassPtr; + +const size_t TypedArrayLengthSlot = 1; + +} // namespace detail + +/* + * Test for specific typed array types (ArrayBufferView subtypes) and return + * the unwrapped object if so, else nullptr. Never throws. + */ + +#define JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Type, type) \ +inline void \ +Get ## Type ## ArrayLengthAndData(JSObject *obj, uint32_t *length, type **data) \ +{ \ + JS_ASSERT(GetObjectClass(obj) == detail::Type ## ArrayClassPtr); \ + const JS::Value &slot = GetReservedSlot(obj, detail::TypedArrayLengthSlot); \ + *length = mozilla::SafeCast(slot.toInt32()); \ + *data = static_cast(GetObjectPrivate(obj)); \ +} + +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Int8, int8_t) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Uint8, uint8_t) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Uint8Clamped, uint8_t) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Int16, int16_t) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Uint16, uint16_t) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Int32, int32_t) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Uint32, uint32_t) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Float32, float) +JS_DEFINE_DATA_AND_LENGTH_ACCESSOR(Float64, double) + +#undef JS_DEFINE_DATA_AND_LENGTH_ACCESSOR + +// This one isn't inlined because it's rather tricky (by dint of having to deal +// with a dozen-plus classes and varying slot layouts. +extern JS_FRIEND_API(void) +GetArrayBufferViewLengthAndData(JSObject *obj, uint32_t *length, uint8_t **data); + +// This one isn't inlined because there are a bunch of different ArrayBuffer +// classes that would have to be individually handled here. +extern JS_FRIEND_API(void) +GetArrayBufferLengthAndData(JSObject *obj, uint32_t *length, uint8_t **data); + +} // namespace js + +/* + * Unwrap Typed arrays all at once. Return nullptr without throwing if the + * object cannot be viewed as the correct typed array, or the typed array + * object on success, filling both outparameters. + */ +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsInt8Array(JSObject *obj, uint32_t *length, int8_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsUint8Array(JSObject *obj, uint32_t *length, uint8_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsUint8ClampedArray(JSObject *obj, uint32_t *length, uint8_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsInt16Array(JSObject *obj, uint32_t *length, int16_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsUint16Array(JSObject *obj, uint32_t *length, uint16_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsInt32Array(JSObject *obj, uint32_t *length, int32_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsUint32Array(JSObject *obj, uint32_t *length, uint32_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsFloat32Array(JSObject *obj, uint32_t *length, float **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsFloat64Array(JSObject *obj, uint32_t *length, double **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsArrayBufferView(JSObject *obj, uint32_t *length, uint8_t **data); +extern JS_FRIEND_API(JSObject *) +JS_GetObjectAsArrayBuffer(JSObject *obj, uint32_t *length, uint8_t **data); + +/* + * Get the type of elements in a typed array, or TypeMax if a DataView. + * + * |obj| must have passed a JS_IsArrayBufferView/JS_Is*Array test, or somehow + * be known that it would pass such a test: it is an ArrayBufferView or a + * wrapper of an ArrayBufferView, and the unwrapping will succeed. + */ +extern JS_FRIEND_API(js::Scalar::Type) +JS_GetArrayBufferViewType(JSObject *obj); + +/* + * Check whether obj supports the JS_GetArrayBuffer* APIs. Note that this may + * return false if a security wrapper is encountered that denies the + * unwrapping. If this test succeeds, then it is safe to call the various + * accessor JSAPI calls defined below. + */ +extern JS_FRIEND_API(bool) +JS_IsArrayBufferObject(JSObject *obj); + +/* + * Return the available byte length of an array buffer. + * + * |obj| must have passed a JS_IsArrayBufferObject test, or somehow be known + * that it would pass such a test: it is an ArrayBuffer or a wrapper of an + * ArrayBuffer, and the unwrapping will succeed. + */ +extern JS_FRIEND_API(uint32_t) +JS_GetArrayBufferByteLength(JSObject *obj); + +/* + * Check whether the obj is ArrayBufferObject and memory mapped. Note that this + * may return false if a security wrapper is encountered that denies the + * unwrapping. + */ +extern JS_FRIEND_API(bool) +JS_IsMappedArrayBufferObject(JSObject *obj); + +/* + * Return the number of elements in a typed array. + * + * |obj| must have passed a JS_IsTypedArrayObject/JS_Is*Array test, or somehow + * be known that it would pass such a test: it is a typed array or a wrapper of + * a typed array, and the unwrapping will succeed. + */ +extern JS_FRIEND_API(uint32_t) +JS_GetTypedArrayLength(JSObject *obj); + +/* + * Return the byte offset from the start of an array buffer to the start of a + * typed array view. + * + * |obj| must have passed a JS_IsTypedArrayObject/JS_Is*Array test, or somehow + * be known that it would pass such a test: it is a typed array or a wrapper of + * a typed array, and the unwrapping will succeed. + */ +extern JS_FRIEND_API(uint32_t) +JS_GetTypedArrayByteOffset(JSObject *obj); + +/* + * Return the byte length of a typed array. + * + * |obj| must have passed a JS_IsTypedArrayObject/JS_Is*Array test, or somehow + * be known that it would pass such a test: it is a typed array or a wrapper of + * a typed array, and the unwrapping will succeed. + */ +extern JS_FRIEND_API(uint32_t) +JS_GetTypedArrayByteLength(JSObject *obj); + +/* + * Check whether obj supports JS_ArrayBufferView* APIs. Note that this may + * return false if a security wrapper is encountered that denies the + * unwrapping. + */ +extern JS_FRIEND_API(bool) +JS_IsArrayBufferViewObject(JSObject *obj); + +/* + * More generic name for JS_GetTypedArrayByteLength to cover DataViews as well + */ +extern JS_FRIEND_API(uint32_t) +JS_GetArrayBufferViewByteLength(JSObject *obj); + +/* + * Return a pointer to the start of the data referenced by a typed array. The + * data is still owned by the typed array, and should not be modified on + * another thread. Furthermore, the pointer can become invalid on GC (if the + * data is small and fits inside the array's GC header), so callers must take + * care not to hold on across anything that could GC. + * + * |obj| must have passed a JS_Is*Array test, or somehow be known that it would + * pass such a test: it is a typed array or a wrapper of a typed array, and the + * unwrapping will succeed. + */ + +extern JS_FRIEND_API(uint8_t *) +JS_GetArrayBufferData(JSObject *obj); +extern JS_FRIEND_API(int8_t *) +JS_GetInt8ArrayData(JSObject *obj); +extern JS_FRIEND_API(uint8_t *) +JS_GetUint8ArrayData(JSObject *obj); +extern JS_FRIEND_API(uint8_t *) +JS_GetUint8ClampedArrayData(JSObject *obj); +extern JS_FRIEND_API(int16_t *) +JS_GetInt16ArrayData(JSObject *obj); +extern JS_FRIEND_API(uint16_t *) +JS_GetUint16ArrayData(JSObject *obj); +extern JS_FRIEND_API(int32_t *) +JS_GetInt32ArrayData(JSObject *obj); +extern JS_FRIEND_API(uint32_t *) +JS_GetUint32ArrayData(JSObject *obj); +extern JS_FRIEND_API(float *) +JS_GetFloat32ArrayData(JSObject *obj); +extern JS_FRIEND_API(double *) +JS_GetFloat64ArrayData(JSObject *obj); + +/* + * Stable versions of the above functions where the buffer remains valid as long + * as the object is live. + */ +extern JS_FRIEND_API(uint8_t *) +JS_GetStableArrayBufferData(JSContext *cx, JS::HandleObject obj); + +/* + * Same as above, but for any kind of ArrayBufferView. Prefer the type-specific + * versions when possible. + */ +extern JS_FRIEND_API(void *) +JS_GetArrayBufferViewData(JSObject *obj); + +/* + * Return the ArrayBuffer underlying an ArrayBufferView. If the buffer has been + * neutered, this will still return the neutered buffer. |obj| must be an + * object that would return true for JS_IsArrayBufferViewObject(). + */ +extern JS_FRIEND_API(JSObject *) +JS_GetArrayBufferViewBuffer(JSContext *cx, JS::HandleObject obj); + +typedef enum { + ChangeData, + KeepData +} NeuterDataDisposition; + +/* + * Set an ArrayBuffer's length to 0 and neuter all of its views. + * + * The |changeData| argument is a hint to inform internal behavior with respect + * to the internal pointer to the ArrayBuffer's data after being neutered. + * There is no guarantee it will be respected. But if it is respected, the + * ArrayBuffer's internal data pointer will, or will not, have changed + * accordingly. + */ +extern JS_FRIEND_API(bool) +JS_NeuterArrayBuffer(JSContext *cx, JS::HandleObject obj, + NeuterDataDisposition changeData); + +/* + * Check whether the obj is ArrayBufferObject and neutered. Note that this + * may return false if a security wrapper is encountered that denies the + * unwrapping. + */ +extern JS_FRIEND_API(bool) +JS_IsNeuteredArrayBufferObject(JSObject *obj); + +/* + * Check whether obj supports JS_GetDataView* APIs. + */ +JS_FRIEND_API(bool) +JS_IsDataViewObject(JSObject *obj); + +/* + * Return the byte offset of a data view into its array buffer. |obj| must be a + * DataView. + * + * |obj| must have passed a JS_IsDataViewObject test, or somehow be known that + * it would pass such a test: it is a data view or a wrapper of a data view, + * and the unwrapping will succeed. + */ +JS_FRIEND_API(uint32_t) +JS_GetDataViewByteOffset(JSObject *obj); + +/* + * Return the byte length of a data view. + * + * |obj| must have passed a JS_IsDataViewObject test, or somehow be known that + * it would pass such a test: it is a data view or a wrapper of a data view, + * and the unwrapping will succeed. If cx is nullptr, then DEBUG builds may be + * unable to assert when unwrapping should be disallowed. + */ +JS_FRIEND_API(uint32_t) +JS_GetDataViewByteLength(JSObject *obj); + +/* + * Return a pointer to the beginning of the data referenced by a DataView. + * + * |obj| must have passed a JS_IsDataViewObject test, or somehow be known that + * it would pass such a test: it is a data view or a wrapper of a data view, + * and the unwrapping will succeed. If cx is nullptr, then DEBUG builds may be + * unable to assert when unwrapping should be disallowed. + */ +JS_FRIEND_API(void *) +JS_GetDataViewData(JSObject *obj); + +namespace js { + +/* + * Add a watchpoint -- in the Object.prototype.watch sense -- to |obj| for the + * property |id|, using the callable object |callable| as the function to be + * called for notifications. + * + * This is an internal function exposed -- temporarily -- only so that DOM + * proxies can be watchable. Don't use it! We'll soon kill off the + * Object.prototype.{,un}watch functions, at which point this will go too. + */ +extern JS_FRIEND_API(bool) +WatchGuts(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleObject callable); + +/* + * Remove a watchpoint -- in the Object.prototype.watch sense -- from |obj| for + * the property |id|. + * + * This is an internal function exposed -- temporarily -- only so that DOM + * proxies can be watchable. Don't use it! We'll soon kill off the + * Object.prototype.{,un}watch functions, at which point this will go too. + */ +extern JS_FRIEND_API(bool) +UnwatchGuts(JSContext *cx, JS::HandleObject obj, JS::HandleId id); + +} // namespace js + +/* + * A class, expected to be passed by value, which represents the CallArgs for a + * JSJitGetterOp. + */ +class JSJitGetterCallArgs : protected JS::MutableHandleValue +{ + public: + explicit JSJitGetterCallArgs(const JS::CallArgs& args) + : JS::MutableHandleValue(args.rval()) + {} + + explicit JSJitGetterCallArgs(JS::RootedValue* rooted) + : JS::MutableHandleValue(rooted) + {} + + JS::MutableHandleValue rval() { + return *this; + } +}; + +/* + * A class, expected to be passed by value, which represents the CallArgs for a + * JSJitSetterOp. + */ +class JSJitSetterCallArgs : protected JS::MutableHandleValue +{ + public: + explicit JSJitSetterCallArgs(const JS::CallArgs& args) + : JS::MutableHandleValue(args[0]) + {} + + JS::MutableHandleValue operator[](unsigned i) { + MOZ_ASSERT(i == 0); + return *this; + } + + unsigned length() const { return 1; } + + // Add get() or maybe hasDefined() as needed +}; + +struct JSJitMethodCallArgsTraits; + +/* + * A class, expected to be passed by reference, which represents the CallArgs + * for a JSJitMethodOp. + */ +class JSJitMethodCallArgs : protected JS::detail::CallArgsBase +{ + private: + typedef JS::detail::CallArgsBase Base; + friend struct JSJitMethodCallArgsTraits; + + public: + explicit JSJitMethodCallArgs(const JS::CallArgs& args) { + argv_ = args.array(); + argc_ = args.length(); + } + + JS::MutableHandleValue rval() const { + return Base::rval(); + } + + unsigned length() const { return Base::length(); } + + JS::MutableHandleValue operator[](unsigned i) const { + return Base::operator[](i); + } + + bool hasDefined(unsigned i) const { + return Base::hasDefined(i); + } + + JSObject &callee() const { + // We can't use Base::callee() because that will try to poke at + // this->usedRval_, which we don't have. + return argv_[-2].toObject(); + } + + // Add get() as needed +}; + +struct JSJitMethodCallArgsTraits +{ + static const size_t offsetOfArgv = offsetof(JSJitMethodCallArgs, argv_); + static const size_t offsetOfArgc = offsetof(JSJitMethodCallArgs, argc_); +}; + +/* + * This struct contains metadata passed from the DOM to the JS Engine for JIT + * optimizations on DOM property accessors. Eventually, this should be made + * available to general JSAPI users, but we are not currently ready to do so. + */ +typedef bool +(* JSJitGetterOp)(JSContext *cx, JS::HandleObject thisObj, + void *specializedThis, JSJitGetterCallArgs args); +typedef bool +(* JSJitSetterOp)(JSContext *cx, JS::HandleObject thisObj, + void *specializedThis, JSJitSetterCallArgs args); +typedef bool +(* JSJitMethodOp)(JSContext *cx, JS::HandleObject thisObj, + void *specializedThis, const JSJitMethodCallArgs& args); + +struct JSJitInfo { + enum OpType { + Getter, + Setter, + Method, + ParallelNative, + StaticMethod, + // Must be last + OpTypeCount + }; + + enum ArgType { + // Basic types + String = (1 << 0), + Integer = (1 << 1), // Only 32-bit or less + Double = (1 << 2), // Maybe we want to add Float sometime too + Boolean = (1 << 3), + Object = (1 << 4), + Null = (1 << 5), + + // And derived types + Numeric = Integer | Double, + // Should "Primitive" use the WebIDL definition, which + // excludes string and null, or the typical JS one that includes them? + Primitive = Numeric | Boolean | Null | String, + ObjectOrNull = Object | Null, + Any = ObjectOrNull | Primitive, + + // Our sentinel value. + ArgTypeListEnd = (1 << 31) + }; + + static_assert(Any & String, "Any must include String."); + static_assert(Any & Integer, "Any must include Integer."); + static_assert(Any & Double, "Any must include Double."); + static_assert(Any & Boolean, "Any must include Boolean."); + static_assert(Any & Object, "Any must include Object."); + static_assert(Any & Null, "Any must include Null."); + + enum AliasSet { + // An enum that describes what this getter/setter/method aliases. This + // determines what things can be hoisted past this call, and if this + // call is movable what it can be hoisted past. + + // Alias nothing: a constant value, getting it can't affect any other + // values, nothing can affect it. + AliasNone, + + // Alias things that can modify the DOM but nothing else. Doing the + // call can't affect the behavior of any other function. + AliasDOMSets, + + // Alias the world. Calling this can change arbitrary values anywhere + // in the system. Most things fall in this bucket. + AliasEverything, + + // Must be last. + AliasSetCount + }; + + bool hasParallelNative() const + { + return type() == ParallelNative; + } + + bool needsOuterizedThisObject() const + { + return type() != Getter && type() != Setter; + } + + bool isTypedMethodJitInfo() const + { + return isTypedMethod; + } + + OpType type() const + { + return OpType(type_); + } + + AliasSet aliasSet() const + { + return AliasSet(aliasSet_); + } + + JSValueType returnType() const + { + return JSValueType(returnType_); + } + + union { + JSJitGetterOp getter; + JSJitSetterOp setter; + JSJitMethodOp method; + /* An alternative native that's safe to call in parallel mode. */ + JSParallelNative parallelNative; + /* A DOM static method, used for Promise wrappers */ + JSNative staticMethod; + }; + + uint16_t protoID; + uint16_t depth; + + // These fields are carefully packed to take up 4 bytes. If you need more + // bits for whatever reason, please see if you can steal bits from existing + // fields before adding more members to this structure. + +#define JITINFO_OP_TYPE_BITS 4 +#define JITINFO_ALIAS_SET_BITS 4 +#define JITINFO_RETURN_TYPE_BITS 8 + + // The OpType that says what sort of function we are. + uint32_t type_ : JITINFO_OP_TYPE_BITS; + + // The alias set for this op. This is a _minimal_ alias set; in + // particular for a method it does not include whatever argument + // conversions might do. That's covered by argTypes and runtime + // analysis of the actual argument types being passed in. + uint32_t aliasSet_ : JITINFO_ALIAS_SET_BITS; + + // The return type tag. Might be JSVAL_TYPE_UNKNOWN. + uint32_t returnType_ : JITINFO_RETURN_TYPE_BITS; + + static_assert(OpTypeCount <= (1 << JITINFO_OP_TYPE_BITS), + "Not enough space for OpType"); + static_assert(AliasSetCount <= (1 << JITINFO_ALIAS_SET_BITS), + "Not enough space for AliasSet"); + static_assert((sizeof(JSValueType) * 8) <= JITINFO_RETURN_TYPE_BITS, + "Not enough space for JSValueType"); + +#undef JITINFO_RETURN_TYPE_BITS +#undef JITINFO_ALIAS_SET_BITS +#undef JITINFO_OP_TYPE_BITS + + uint32_t isInfallible : 1; /* Is op fallible? False in setters. */ + uint32_t isMovable : 1; /* Is op movable? To be movable the op must + not AliasEverything, but even that might + not be enough (e.g. in cases when it can + throw). */ + // XXXbz should we have a JSValueType for the type of the member? + uint32_t isAlwaysInSlot : 1; /* True if this is a getter that can always + get the value from a slot of the "this" + object. */ + uint32_t isLazilyCachedInSlot : 1; /* True if this is a getter that can + sometimes (if the slot doesn't contain + UndefinedValue()) get the value from a + slot of the "this" object. */ + uint32_t isTypedMethod : 1; /* True if this is an instance of + JSTypedMethodJitInfo. */ + uint32_t slotIndex : 11; /* If isAlwaysInSlot or isSometimesInSlot is + true, the index of the slot to get the value + from. Otherwise 0. */ +}; + +static_assert(sizeof(JSJitInfo) == (sizeof(void*) + 2 * sizeof(uint32_t)), + "There are several thousand instances of JSJitInfo stored in " + "a binary. Please don't increase its space requirements without " + "verifying that there is no other way forward (better packing, " + "smaller datatypes for fields, subclassing, etc.)."); + +struct JSTypedMethodJitInfo +{ + // We use C-style inheritance here, rather than C++ style inheritance + // because not all compilers support brace-initialization for non-aggregate + // classes. Using C++ style inheritance and constructors instead of + // brace-initialization would also force the creation of static + // constructors (on some compilers) when JSJitInfo and JSTypedMethodJitInfo + // structures are declared. Since there can be several thousand of these + // structures present and we want to have roughly equivalent performance + // across a range of compilers, we do things manually. + JSJitInfo base; + + const JSJitInfo::ArgType* const argTypes; /* For a method, a list of sets of + types that the function + expects. This can be used, + for example, to figure out + when argument coercions can + have side-effects. */ +}; + +namespace JS { +namespace detail { + +/* NEVER DEFINED, DON'T USE. For use by JS_CAST_PARALLEL_NATIVE_TO only. */ +inline int CheckIsParallelNative(JSParallelNative parallelNative); + +} // namespace detail +} // namespace JS + +#define JS_CAST_PARALLEL_NATIVE_TO(v, To) \ + (static_cast(sizeof(JS::detail::CheckIsParallelNative(v))), \ + reinterpret_cast(v)) + +/* + * You may ask yourself: why do we define a wrapper around a wrapper here? + * The answer is that some compilers don't understand initializing a union + * as we do below with a construct like: + * + * reinterpret_cast(JSParallelNativeThreadSafeWrapper) + * + * (We need the reinterpret_cast because we must initialize the union with + * a datum of the type of the union's first member.) + * + * Presumably this has something to do with template instantiation. + * Initializing with a normal function pointer seems to work fine. Hence + * the ugliness that you see before you. + */ +#define JS_JITINFO_NATIVE_PARALLEL(infoName, parallelOp) \ + const JSJitInfo infoName = \ + {{JS_CAST_PARALLEL_NATIVE_TO(parallelOp, JSJitGetterOp)},0,0,JSJitInfo::ParallelNative,JSJitInfo::AliasEverything,JSVAL_TYPE_MISSING,false,false,false,false,false,0} + +#define JS_JITINFO_NATIVE_PARALLEL_THREADSAFE(infoName, wrapperName, serialOp) \ + bool wrapperName##_ParallelNativeThreadSafeWrapper(js::ForkJoinContext *cx, unsigned argc, \ + JS::Value *vp) \ + { \ + return JSParallelNativeThreadSafeWrapper(cx, argc, vp); \ + } \ + JS_JITINFO_NATIVE_PARALLEL(infoName, wrapperName##_ParallelNativeThreadSafeWrapper) + +static MOZ_ALWAYS_INLINE const JSJitInfo * +FUNCTION_VALUE_TO_JITINFO(const JS::Value& v) +{ + JS_ASSERT(js::GetObjectClass(&v.toObject()) == js::FunctionClassPtr); + return reinterpret_cast(&v.toObject())->jitinfo; +} + +/* Statically asserted in jsfun.h. */ +static const unsigned JS_FUNCTION_INTERPRETED_BIT = 0x1; + +static MOZ_ALWAYS_INLINE void +SET_JITINFO(JSFunction * func, const JSJitInfo *info) +{ + js::shadow::Function *fun = reinterpret_cast(func); + JS_ASSERT(!(fun->flags & JS_FUNCTION_INTERPRETED_BIT)); + fun->jitinfo = info; +} + +/* + * Engine-internal extensions of jsid. This code is here only until we + * eliminate Gecko's dependencies on it! + */ + +static MOZ_ALWAYS_INLINE jsid +JSID_FROM_BITS(size_t bits) +{ + jsid id; + JSID_BITS(id) = bits; + return id; +} + +namespace js { +namespace detail { +bool IdMatchesAtom(jsid id, JSAtom *atom); +} +} + +/* + * Must not be used on atoms that are representable as integer jsids. + * Prefer NameToId or AtomToId over this function: + * + * A PropertyName is an atom that does not contain an integer in the range + * [0, UINT32_MAX]. However, jsid can only hold an integer in the range + * [0, JSID_INT_MAX] (where JSID_INT_MAX == 2^31-1). Thus, for the range of + * integers (JSID_INT_MAX, UINT32_MAX], to represent as a jsid 'id', it must be + * the case JSID_IS_ATOM(id) and !JSID_TO_ATOM(id)->isPropertyName(). In most + * cases when creating a jsid, code does not have to care about this corner + * case because: + * + * - When given an arbitrary JSAtom*, AtomToId must be used, which checks for + * integer atoms representable as integer jsids, and does this conversion. + * + * - When given a PropertyName*, NameToId can be used which which does not need + * to do any dynamic checks. + * + * Thus, it is only the rare third case which needs this function, which + * handles any JSAtom* that is known not to be representable with an int jsid. + */ +static MOZ_ALWAYS_INLINE jsid +NON_INTEGER_ATOM_TO_JSID(JSAtom *atom) +{ + JS_ASSERT(((size_t)atom & 0x7) == 0); + jsid id = JSID_FROM_BITS((size_t)atom); + JS_ASSERT(js::detail::IdMatchesAtom(id, atom)); + return id; +} + +/* All strings stored in jsids are atomized, but are not necessarily property names. */ +static MOZ_ALWAYS_INLINE bool +JSID_IS_ATOM(jsid id) +{ + return JSID_IS_STRING(id); +} + +static MOZ_ALWAYS_INLINE bool +JSID_IS_ATOM(jsid id, JSAtom *atom) +{ + return id == JSID_FROM_BITS((size_t)atom); +} + +static MOZ_ALWAYS_INLINE JSAtom * +JSID_TO_ATOM(jsid id) +{ + return (JSAtom *)JSID_TO_STRING(id); +} + +JS_STATIC_ASSERT(sizeof(jsid) == sizeof(void*)); + +namespace js { + +static MOZ_ALWAYS_INLINE JS::Value +IdToValue(jsid id) +{ + if (JSID_IS_STRING(id)) + return JS::StringValue(JSID_TO_STRING(id)); + if (JSID_IS_INT(id)) + return JS::Int32Value(JSID_TO_INT(id)); + if (JSID_IS_SYMBOL(id)) + return JS::SymbolValue(JSID_TO_SYMBOL(id)); + JS_ASSERT(JSID_IS_VOID(id)); + return JS::UndefinedValue(); +} + +/* + * If the embedder has registered a default JSContext callback, returns the + * result of the callback. Otherwise, asserts that |rt| has exactly one + * JSContext associated with it, and returns that context. + */ +extern JS_FRIEND_API(JSContext *) +DefaultJSContext(JSRuntime *rt); + +typedef JSContext* +(* DefaultJSContextCallback)(JSRuntime *rt); + +JS_FRIEND_API(void) +SetDefaultJSContextCallback(JSRuntime *rt, DefaultJSContextCallback cb); + +/* + * To help embedders enforce their invariants, we allow them to specify in + * advance which JSContext should be passed to JSAPI calls. If this is set + * to a non-null value, the assertSameCompartment machinery does double- + * duty (in debug builds) to verify that it matches the cx being used. + */ +#ifdef DEBUG +JS_FRIEND_API(void) +Debug_SetActiveJSContext(JSRuntime *rt, JSContext *cx); +#else +inline void +Debug_SetActiveJSContext(JSRuntime *rt, JSContext *cx) {}; +#endif + + +enum CTypesActivityType { + CTYPES_CALL_BEGIN, + CTYPES_CALL_END, + CTYPES_CALLBACK_BEGIN, + CTYPES_CALLBACK_END +}; + +typedef void +(* CTypesActivityCallback)(JSContext *cx, CTypesActivityType type); + +/* + * Sets a callback that is run whenever js-ctypes is about to be used when + * calling into C. + */ +JS_FRIEND_API(void) +SetCTypesActivityCallback(JSRuntime *rt, CTypesActivityCallback cb); + +class JS_FRIEND_API(AutoCTypesActivityCallback) { + private: + JSContext *cx; + CTypesActivityCallback callback; + CTypesActivityType endType; + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER + + public: + AutoCTypesActivityCallback(JSContext *cx, CTypesActivityType beginType, + CTypesActivityType endType + MOZ_GUARD_OBJECT_NOTIFIER_PARAM); + ~AutoCTypesActivityCallback() { + DoEndCallback(); + } + void DoEndCallback() { + if (callback) { + callback(cx, endType); + callback = nullptr; + } + } +}; + +typedef bool +(* ObjectMetadataCallback)(JSContext *cx, JSObject **pmetadata); + +/* + * Specify a callback to invoke when creating each JS object in the current + * compartment, which may return a metadata object to associate with the + * object. Objects with different metadata have different shape hierarchies, + * so for efficiency, objects should generally try to share metadata objects. + */ +JS_FRIEND_API(void) +SetObjectMetadataCallback(JSContext *cx, ObjectMetadataCallback callback); + +/* Manipulate the metadata associated with an object. */ + +JS_FRIEND_API(bool) +SetObjectMetadata(JSContext *cx, JS::HandleObject obj, JS::HandleObject metadata); + +JS_FRIEND_API(JSObject *) +GetObjectMetadata(JSObject *obj); + +JS_FRIEND_API(void) +UnsafeDefineElement(JSContext *cx, JS::HandleObject obj, uint32_t index, JS::HandleValue value); + +JS_FRIEND_API(bool) +SliceSlowly(JSContext* cx, JS::HandleObject obj, JS::HandleObject receiver, + uint32_t begin, uint32_t end, JS::HandleObject result); + +/* ES5 8.12.8. */ +extern JS_FRIEND_API(bool) +DefaultValue(JSContext *cx, JS::HandleObject obj, JSType hint, JS::MutableHandleValue vp); + +/* + * Helper function. To approximate a call to the [[DefineOwnProperty]] internal + * method described in ES5, first call this, then call JS_DefinePropertyById. + * + * JS_DefinePropertyById by itself does not enforce the invariants on + * non-configurable properties when obj->isNative(). This function performs the + * relevant checks (specified in ES5 8.12.9 [[DefineOwnProperty]] steps 1-11), + * but only if obj is native. + * + * The reason for the messiness here is that ES5 uses [[DefineOwnProperty]] as + * a sort of extension point, but there is no hook in js::Class, + * js::ProxyHandler, or the JSAPI with precisely the right semantics for it. + */ +extern JS_FRIEND_API(bool) +CheckDefineProperty(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue value, + unsigned attrs, + JSPropertyOp getter = nullptr, JSStrictPropertyOp setter = nullptr); + +/* + * Helper function for HTMLDocument and HTMLFormElement. + * + * These are the only two interfaces that have [OverrideBuiltins], a named + * getter, and no named setter. They're implemented as proxies with a custom + * getOwnPropertyDescriptor() method. Unfortunately, overriding + * getOwnPropertyDescriptor() automatically affects the behavior of set(), + * which normally is just common sense but is *not* desired for these two + * interfaces. + * + * The fix is for these two interfaces to override set() to ignore the + * getOwnPropertyDescriptor() override. + * + * SetPropertyIgnoringNamedGetter is exposed to make it easier to override + * set() in this way. It carries out all the steps of BaseProxyHandler::set() + * except the initial getOwnPropertyDescriptor()/getPropertyDescriptor() calls. + * The caller must supply those results as the 'desc' and 'descIsOwn' + * parameters. + * + * Implemented in jsproxy.cpp. + */ +JS_FRIEND_API(bool) +SetPropertyIgnoringNamedGetter(JSContext *cx, const BaseProxyHandler *handler, + JS::HandleObject proxy, JS::HandleObject receiver, + JS::HandleId id, JS::MutableHandle desc, + bool descIsOwn, bool strict, JS::MutableHandleValue vp); + +JS_FRIEND_API(void) +ReportErrorWithId(JSContext *cx, const char *msg, JS::HandleId id); + +// This function is for one specific use case, please don't use this for anything else! +extern JS_FRIEND_API(bool) +ExecuteInGlobalAndReturnScope(JSContext *cx, JS::HandleObject obj, JS::HandleScript script, + JS::MutableHandleObject scope); + +} /* namespace js */ + +extern JS_FRIEND_API(bool) +js_DefineOwnProperty(JSContext *cx, JSObject *objArg, jsid idArg, + JS::Handle descriptor, bool *bp); + +extern JS_FRIEND_API(bool) +js_ReportIsNotFunction(JSContext *cx, JS::HandleValue v); + +#ifdef JSGC_GENERATIONAL +extern JS_FRIEND_API(void) +JS_StoreObjectPostBarrierCallback(JSContext* cx, + void (*callback)(JSTracer *trc, JSObject *key, void *data), + JSObject *key, void *data); + +extern JS_FRIEND_API(void) +JS_StoreStringPostBarrierCallback(JSContext* cx, + void (*callback)(JSTracer *trc, JSString *key, void *data), + JSString *key, void *data); +#else +inline void +JS_StoreObjectPostBarrierCallback(JSContext* cx, + void (*callback)(JSTracer *trc, JSObject *key, void *data), + JSObject *key, void *data) {} + +inline void +JS_StoreStringPostBarrierCallback(JSContext* cx, + void (*callback)(JSTracer *trc, JSString *key, void *data), + JSString *key, void *data) {} +#endif /* JSGC_GENERATIONAL */ + +#endif /* jsfriendapi_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsperf.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsperf.h new file mode 100644 index 0000000000..60c572f559 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsperf.h @@ -0,0 +1,133 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef perf_jsperf_h +#define perf_jsperf_h + +#include "jstypes.h" + +#include "js/TypeDecls.h" +#include "js/Utility.h" + +namespace JS { + +/* + * JS::PerfMeasurement is a generic way to access detailed performance + * measurement APIs provided by your operating system. The details of + * exactly how this works and what can be measured are highly + * system-specific, but this interface is (one hopes) implementable + * on top of all of them. + * + * To use this API, create a PerfMeasurement object, passing its + * constructor a bitmask indicating which events you are interested + * in. Thereafter, Start() zeroes all counters and starts timing; + * Stop() stops timing again; and the counters for the events you + * requested are available as data values after calling Stop(). The + * object may be reused for many measurements. + */ +class JS_FRIEND_API(PerfMeasurement) +{ + protected: + // Implementation-specific data, if any. + void* impl; + + public: + /* + * Events that may be measured. Taken directly from the list of + * "generalized hardware performance event types" in the Linux + * perf_event API, plus some of the "software events". + */ + enum EventMask { + CPU_CYCLES = 0x00000001, + INSTRUCTIONS = 0x00000002, + CACHE_REFERENCES = 0x00000004, + CACHE_MISSES = 0x00000008, + BRANCH_INSTRUCTIONS = 0x00000010, + BRANCH_MISSES = 0x00000020, + BUS_CYCLES = 0x00000040, + PAGE_FAULTS = 0x00000080, + MAJOR_PAGE_FAULTS = 0x00000100, + CONTEXT_SWITCHES = 0x00000200, + CPU_MIGRATIONS = 0x00000400, + + ALL = 0x000007ff, + NUM_MEASURABLE_EVENTS = 11 + }; + + /* + * Bitmask of events that will be measured when this object is + * active (between Start() and Stop()). This may differ from the + * bitmask passed to the constructor if the platform does not + * support measuring all of the requested events. + */ + const EventMask eventsMeasured; + + /* + * Counters for each measurable event. + * Immediately after one of these objects is created, all of the + * counters for enabled events will be zero, and all of the + * counters for disabled events will be uint64_t(-1). + */ + uint64_t cpu_cycles; + uint64_t instructions; + uint64_t cache_references; + uint64_t cache_misses; + uint64_t branch_instructions; + uint64_t branch_misses; + uint64_t bus_cycles; + uint64_t page_faults; + uint64_t major_page_faults; + uint64_t context_switches; + uint64_t cpu_migrations; + + /* + * Prepare to measure the indicated set of events. If not all of + * the requested events can be measured on the current platform, + * then the eventsMeasured bitmask will only include the subset of + * |toMeasure| corresponding to the events that can be measured. + */ + explicit PerfMeasurement(EventMask toMeasure); + + /* Done with this set of measurements, tear down OS-level state. */ + ~PerfMeasurement(); + + /* Start a measurement cycle. */ + void start(); + + /* + * End a measurement cycle, and for each enabled counter, add the + * number of measured events of that type to the appropriate + * visible variable. + */ + void stop(); + + /* Reset all enabled counters to zero. */ + void reset(); + + /* + * True if this platform supports measuring _something_, i.e. it's + * not using the stub implementation. + */ + static bool canMeasureSomething(); +}; + +/* Inject a Javascript wrapper around the above C++ class into the + * Javascript object passed as an argument (this will normally be a + * global object). The JS-visible API is identical to the C++ API. + */ +extern JS_FRIEND_API(JSObject*) + RegisterPerfMeasurement(JSContext *cx, JS::HandleObject global); + +/* + * Given a Value which contains an instance of the aforementioned + * wrapper class, extract the C++ object. Returns nullptr if the + * Value is not an instance of the wrapper. + */ +extern JS_FRIEND_API(PerfMeasurement*) + ExtractPerfMeasurement(Value wrapper); + +} // namespace JS + +#endif /* perf_jsperf_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsprf.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsprf.h new file mode 100644 index 0000000000..bfedf98ca8 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsprf.h @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsprf_h +#define jsprf_h + +/* +** API for PR printf like routines. Supports the following formats +** %d - decimal +** %u - unsigned decimal +** %x - unsigned hex +** %X - unsigned uppercase hex +** %o - unsigned octal +** %hd, %hu, %hx, %hX, %ho - 16-bit versions of above +** %ld, %lu, %lx, %lX, %lo - 32-bit versions of above +** %lld, %llu, %llx, %llX, %llo - 64 bit versions of above +** %s - ascii string +** %hs - ucs2 string +** %c - character +** %p - pointer (deals with machine dependent pointer size) +** %f - float +** %g - float +*/ + +#include + +#include "jstypes.h" + +/* +** sprintf into a fixed size buffer. Guarantees that a NUL is at the end +** of the buffer. Returns the length of the written output, NOT including +** the NUL, or (uint32_t)-1 if an error occurs. +*/ +extern JS_PUBLIC_API(uint32_t) JS_snprintf(char *out, uint32_t outlen, const char *fmt, ...); + +/* +** sprintf into a malloc'd buffer. Return a pointer to the malloc'd +** buffer on success, nullptr on failure. Call "JS_smprintf_free" to release +** the memory returned. +*/ +extern JS_PUBLIC_API(char*) JS_smprintf(const char *fmt, ...); + +/* +** Free the memory allocated, for the caller, by JS_smprintf +*/ +extern JS_PUBLIC_API(void) JS_smprintf_free(char *mem); + +/* +** "append" sprintf into a malloc'd buffer. "last" is the last value of +** the malloc'd buffer. sprintf will append data to the end of last, +** growing it as necessary using realloc. If last is nullptr, JS_sprintf_append +** will allocate the initial string. The return value is the new value of +** last for subsequent calls, or nullptr if there is a malloc failure. +*/ +extern JS_PUBLIC_API(char*) JS_sprintf_append(char *last, const char *fmt, ...); + +/* +** va_list forms of the above. +*/ +extern JS_PUBLIC_API(uint32_t) JS_vsnprintf(char *out, uint32_t outlen, const char *fmt, va_list ap); +extern JS_PUBLIC_API(char*) JS_vsmprintf(const char *fmt, va_list ap); +extern JS_PUBLIC_API(char*) JS_vsprintf_append(char *last, const char *fmt, va_list ap); + +#endif /* jsprf_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsprototypes.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsprototypes.h new file mode 100644 index 0000000000..1cb56bf8da --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsprototypes.h @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsprototypes_h +#define jsprototypes_h + +/* A higher-order macro for enumerating all JSProtoKey values. */ +/* + * Consumers define macros as follows: + * macro(name, code, init, clasp) + * name: The canonical name of the class. + * code: The enumerator code. There are part of the XDR API, and must not change. + * init: Initialization function. These are |extern "C";|, and clients should use + * |extern "C" {}| as appropriate when using this macro. + * clasp: The JSClass for this object, or "dummy" if it doesn't exist. + * + * + * Consumers wishing to iterate over all the JSProtoKey values, can use + * JS_FOR_EACH_PROTOTYPE. However, there are certain values that don't correspond + * to real constructors, like Null or constructors that are disabled via + * preprocessor directives. We still need to include these in the JSProtoKey list + * in order to maintain binary XDR compatibility, but we need to provide a tool + * to handle them differently. JS_FOR_PROTOTYPES fills this niche. + * + * Consumers pass two macros to JS_FOR_PROTOTYPES - |real| and |imaginary|. The + * former is invoked for entries that have real client-exposed constructors, and + * the latter is called for the rest. Consumers that don't care about this + * distinction can simply pass the same macro to both, which is exactly what + * JS_FOR_EACH_PROTOTYPE does. + */ + +#define CLASP(name) (&name##Class) +#define OCLASP(name) (&name##Object::class_) +#define TYPED_ARRAY_CLASP(type) (&TypedArrayObject::classes[Scalar::type]) + +#ifdef ENABLE_PARALLEL_JS +#define IF_PJS(real,imaginary) real +#else +#define IF_PJS(real,imaginary) imaginary +#endif + +#ifdef EXPOSE_INTL_API +#define IF_INTL(real,imaginary) real +#else +#define IF_INTL(real,imaginary) imaginary +#endif + +#ifdef ENABLE_BINARYDATA +#define IF_BDATA(real,imaginary) real +#else +#define IF_BDATA(real,imaginary) imaginary +#endif + +#ifdef ENABLE_SHARED_ARRAY_BUFFER +#define IF_SAB(real,imaginary) real +#else +#define IF_SAB(real,imaginary) imaginary +#endif + +#ifdef JS_HAS_SYMBOLS +#define IF_SYMBOLS(real,imaginary) real +#else +#define IF_SYMBOLS(real,imaginary) imaginary +#endif + +#define JS_FOR_PROTOTYPES(real,imaginary) \ + imaginary(Null, 0, js_InitNullClass, dummy) \ + real(Object, 1, js_InitViaClassSpec, &JSObject::class_) \ + real(Function, 2, js_InitViaClassSpec, &JSFunction::class_) \ + real(Array, 3, js_InitViaClassSpec, OCLASP(Array)) \ + real(Boolean, 4, js_InitBooleanClass, OCLASP(Boolean)) \ + real(JSON, 5, js_InitJSONClass, CLASP(JSON)) \ + real(Date, 6, js_InitViaClassSpec, OCLASP(Date)) \ + real(Math, 7, js_InitMathClass, CLASP(Math)) \ + real(Number, 8, js_InitNumberClass, OCLASP(Number)) \ + real(String, 9, js_InitStringClass, OCLASP(String)) \ + real(RegExp, 10, js_InitRegExpClass, OCLASP(RegExp)) \ + real(Error, 11, js_InitViaClassSpec, OCLASP(Error)) \ + real(InternalError, 12, js_InitViaClassSpec, OCLASP(Error)) \ + real(EvalError, 13, js_InitViaClassSpec, OCLASP(Error)) \ + real(RangeError, 14, js_InitViaClassSpec, OCLASP(Error)) \ + real(ReferenceError, 15, js_InitViaClassSpec, OCLASP(Error)) \ + real(SyntaxError, 16, js_InitViaClassSpec, OCLASP(Error)) \ + real(TypeError, 17, js_InitViaClassSpec, OCLASP(Error)) \ + real(URIError, 18, js_InitViaClassSpec, OCLASP(Error)) \ + real(Iterator, 19, js_InitIteratorClasses, OCLASP(PropertyIterator)) \ + real(StopIteration, 20, js_InitIteratorClasses, OCLASP(StopIteration)) \ + real(ArrayBuffer, 21, js_InitArrayBufferClass, &js::ArrayBufferObject::protoClass) \ + real(Int8Array, 22, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Int8)) \ + real(Uint8Array, 23, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Uint8)) \ + real(Int16Array, 24, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Int16)) \ + real(Uint16Array, 25, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Uint16)) \ + real(Int32Array, 26, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Int32)) \ + real(Uint32Array, 27, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Uint32)) \ + real(Float32Array, 28, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Float32)) \ + real(Float64Array, 29, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Float64)) \ + real(Uint8ClampedArray, 30, js_InitViaClassSpec, TYPED_ARRAY_CLASP(Uint8Clamped)) \ + real(Proxy, 31, js_InitProxyClass, &ProxyObject::uncallableClass_) \ + real(WeakMap, 32, js_InitWeakMapClass, OCLASP(WeakMap)) \ + real(Map, 33, js_InitMapClass, OCLASP(Map)) \ + real(Set, 34, js_InitSetClass, OCLASP(Set)) \ + real(DataView, 35, js_InitDataViewClass, OCLASP(DataView)) \ +IF_SYMBOLS(real,imaginary)(Symbol, 36, js_InitSymbolClass, &js::SymbolObject::class_) \ +IF_SAB(real,imaginary)(SharedArrayBuffer, 37, js_InitSharedArrayBufferClass, &js::SharedArrayBufferObject::protoClass) \ +IF_INTL(real,imaginary) (Intl, 38, js_InitIntlClass, CLASP(Intl)) \ +IF_BDATA(real,imaginary)(TypedObject, 39, js_InitTypedObjectModuleObject, OCLASP(TypedObjectModule)) \ + imaginary(GeneratorFunction, 40, js_InitIteratorClasses, dummy) \ +IF_BDATA(real,imaginary)(SIMD, 41, js_InitSIMDClass, OCLASP(SIMD)) \ + +#define JS_FOR_EACH_PROTOTYPE(macro) JS_FOR_PROTOTYPES(macro,macro) + +#endif /* jsprototypes_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsproxy.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsproxy.h new file mode 100644 index 0000000000..b4588c4c2a --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsproxy.h @@ -0,0 +1,563 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsproxy_h +#define jsproxy_h + +#include "mozilla/Maybe.h" + +#include "jsfriendapi.h" + +#include "js/CallNonGenericMethod.h" +#include "js/Class.h" + +namespace js { + +using JS::AutoIdVector; +using JS::CallArgs; +using JS::HandleId; +using JS::HandleObject; +using JS::HandleValue; +using JS::IsAcceptableThis; +using JS::MutableHandle; +using JS::MutableHandleObject; +using JS::MutableHandleValue; +using JS::NativeImpl; +using JS::PrivateValue; +using JS::Value; + +class RegExpGuard; +class JS_FRIEND_API(Wrapper); + +/* + * A proxy is a JSObject that implements generic behavior by providing custom + * implementations for each object trap. The implementation for each trap is + * provided by a C++ object stored on the proxy, known as its handler. + * + * A major use case for proxies is to forward each trap to another object, + * known as its target. The target can be an arbitrary C++ object. Not every + * proxy has the notion of a target, however. + * + * Proxy traps are grouped into fundamental and derived traps. Every proxy has + * to at least provide implementations for the fundamental traps, but the + * derived traps can be implemented in terms of the fundamental ones + * BaseProxyHandler provides implementations of the derived traps in terms of + * the (pure virtual) fundamental traps. + * + * In addition to the normal traps, there are two models for proxy prototype + * chains. First, proxies may opt to use the standard prototype mechanism used + * throughout the engine. To do so, simply pass a prototype to NewProxyObject() + * at creation time. All prototype accesses will then "just work" to treat the + * proxy as a "normal" object. Alternatively, if instead the proxy wishes to + * implement more complicated prototype semantics (if, for example, it wants to + * delegate the prototype lookup to a wrapped object), it may pass Proxy::LazyProto + * as the prototype at create time and opt in to the trapped prototype system, + * which guarantees that their trap will be called on any and every prototype + * chain access of the object. + * + * This system is implemented with two traps: {get,set}PrototypeOf. The default + * implementation of setPrototypeOf throws a TypeError. Since it is not possible + * to create an object without a sense of prototype chain, handler implementors + * must provide a getPrototypeOf trap if opting in to the dynamic prototype system. + * + * To minimize code duplication, a set of abstract proxy handler classes is + * provided, from which other handlers may inherit. These abstract classes + * are organized in the following hierarchy: + * + * BaseProxyHandler + * | + * DirectProxyHandler + * | + * Wrapper + */ + +/* + * BaseProxyHandler is the most generic kind of proxy handler. It does not make + * any assumptions about the target. Consequently, it does not provide any + * default implementation for the fundamental traps. It does, however, implement + * the derived traps in terms of the fundamental ones. This allows consumers of + * this class to define any custom behavior they want. + * + * Important: If you add a trap here, you should probably also add a Proxy::foo + * entry point with an AutoEnterPolicy. If you don't, you need an explicit + * override for the trap in SecurityWrapper. See bug 945826 comment 0. + */ +class JS_FRIEND_API(BaseProxyHandler) +{ + const void *mFamily; + + /* + * Proxy handlers can use mHasPrototype to request the following special + * treatment from the JS engine: + * + * - When mHasPrototype is true, the engine never calls these methods: + * getPropertyDescriptor, has, set, enumerate, iterate. Instead, for + * these operations, it calls the "own" traps like + * getOwnPropertyDescriptor, hasOwn, defineProperty, keys, etc., and + * consults the prototype chain if needed. + * + * - When mHasPrototype is true, the engine calls handler->get() only if + * handler->hasOwn() says an own property exists on the proxy. If not, + * it consults the prototype chain. + * + * This is useful because it frees the ProxyHandler from having to implement + * any behavior having to do with the prototype chain. + */ + bool mHasPrototype; + + /* + * All proxies indicate whether they have any sort of interesting security + * policy that might prevent the caller from doing something it wants to + * the object. In the case of wrappers, this distinction is used to + * determine whether the caller may strip off the wrapper if it so desires. + */ + bool mHasSecurityPolicy; + + public: + explicit BaseProxyHandler(const void *family, bool hasPrototype = false, + bool hasSecurityPolicy = false); + virtual ~BaseProxyHandler(); + + bool hasPrototype() const { + return mHasPrototype; + } + + bool hasSecurityPolicy() const { + return mHasSecurityPolicy; + } + + inline const void *family() const { + return mFamily; + } + static size_t offsetOfFamily() { + return offsetof(BaseProxyHandler, mFamily); + } + + virtual bool finalizeInBackground(Value priv) const { + /* + * Called on creation of a proxy to determine whether its finalize + * method can be finalized on the background thread. + */ + return true; + } + + /* Policy enforcement traps. + * + * enter() allows the policy to specify whether the caller may perform |act| + * on the proxy's |id| property. In the case when |act| is CALL, |id| is + * generally JSID_VOID. + * + * The |act| parameter to enter() specifies the action being performed. + * If |bp| is false, the trap suggests that the caller throw (though it + * may still decide to squelch the error). + * + * We make these OR-able so that assertEnteredPolicy can pass a union of them. + * For example, get{,Own}PropertyDescriptor is invoked by both calls to ::get() + * and ::set() (since we need to look up the accessor), so its + * assertEnteredPolicy would pass GET | SET. + */ + typedef uint32_t Action; + enum { + NONE = 0x00, + GET = 0x01, + SET = 0x02, + CALL = 0x04, + ENUMERATE = 0x08 + }; + + virtual bool enter(JSContext *cx, HandleObject wrapper, HandleId id, Action act, + bool *bp) const; + + /* ES5 Harmony fundamental proxy traps. */ + virtual bool preventExtensions(JSContext *cx, HandleObject proxy) const = 0; + virtual bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc) const = 0; + virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, + HandleId id, MutableHandle desc) const = 0; + virtual bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc) const = 0; + virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, + AutoIdVector &props) const = 0; + virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) const = 0; + virtual bool enumerate(JSContext *cx, HandleObject proxy, AutoIdVector &props) const = 0; + + /* ES5 Harmony derived proxy traps. */ + virtual bool has(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) const; + virtual bool hasOwn(JSContext *cx, HandleObject proxy, HandleId id, bool *bp) const; + virtual bool get(JSContext *cx, HandleObject proxy, HandleObject receiver, + HandleId id, MutableHandleValue vp) const; + virtual bool set(JSContext *cx, HandleObject proxy, HandleObject receiver, + HandleId id, bool strict, MutableHandleValue vp) const; + virtual bool keys(JSContext *cx, HandleObject proxy, AutoIdVector &props) const; + virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags, + MutableHandleValue vp) const; + + /* Spidermonkey extensions. */ + virtual bool isExtensible(JSContext *cx, HandleObject proxy, bool *extensible) const = 0; + virtual bool call(JSContext *cx, HandleObject proxy, const CallArgs &args) const; + virtual bool construct(JSContext *cx, HandleObject proxy, const CallArgs &args) const; + virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, CallArgs args) const; + virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, bool *bp) const; + virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx) const; + virtual const char *className(JSContext *cx, HandleObject proxy) const; + virtual JSString *fun_toString(JSContext *cx, HandleObject proxy, unsigned indent) const; + virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) const; + virtual bool defaultValue(JSContext *cx, HandleObject obj, JSType hint, MutableHandleValue vp) const; + virtual void finalize(JSFreeOp *fop, JSObject *proxy) const; + virtual bool getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandleObject protop) const; + virtual bool setPrototypeOf(JSContext *cx, HandleObject proxy, HandleObject proto, bool *bp) const; + + // These two hooks must be overridden, or not overridden, in tandem -- no + // overriding just one! + virtual bool watch(JSContext *cx, JS::HandleObject proxy, JS::HandleId id, + JS::HandleObject callable) const; + virtual bool unwatch(JSContext *cx, JS::HandleObject proxy, JS::HandleId id) const; + + virtual bool slice(JSContext *cx, HandleObject proxy, uint32_t begin, uint32_t end, + HandleObject result) const; + + /* See comment for weakmapKeyDelegateOp in js/Class.h. */ + virtual JSObject *weakmapKeyDelegate(JSObject *proxy) const; + virtual bool isScripted() const { return false; } +}; + +/* + * DirectProxyHandler includes a notion of a target object. All traps are + * reimplemented such that they forward their behavior to the target. This + * allows consumers of this class to forward to another object as transparently + * and efficiently as possible. + * + * Important: If you add a trap implementation here, you probably also need to + * add an override in CrossCompartmentWrapper. If you don't, you risk + * compartment mismatches. See bug 945826 comment 0. + */ +class JS_PUBLIC_API(DirectProxyHandler) : public BaseProxyHandler +{ + public: + explicit DirectProxyHandler(const void *family, bool hasPrototype = false, + bool hasSecurityPolicy = false); + + /* ES5 Harmony fundamental proxy traps. */ + virtual bool preventExtensions(JSContext *cx, HandleObject proxy) const MOZ_OVERRIDE; + virtual bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, + AutoIdVector &props) const MOZ_OVERRIDE; + virtual bool delete_(JSContext *cx, HandleObject proxy, HandleId id, + bool *bp) const MOZ_OVERRIDE; + virtual bool enumerate(JSContext *cx, HandleObject proxy, + AutoIdVector &props) const MOZ_OVERRIDE; + + /* ES5 Harmony derived proxy traps. */ + virtual bool has(JSContext *cx, HandleObject proxy, HandleId id, + bool *bp) const MOZ_OVERRIDE; + virtual bool hasOwn(JSContext *cx, HandleObject proxy, HandleId id, + bool *bp) const MOZ_OVERRIDE; + virtual bool get(JSContext *cx, HandleObject proxy, HandleObject receiver, + HandleId id, MutableHandleValue vp) const MOZ_OVERRIDE; + virtual bool set(JSContext *cx, HandleObject proxy, HandleObject receiver, + HandleId id, bool strict, MutableHandleValue vp) const MOZ_OVERRIDE; + virtual bool keys(JSContext *cx, HandleObject proxy, + AutoIdVector &props) const MOZ_OVERRIDE; + virtual bool iterate(JSContext *cx, HandleObject proxy, unsigned flags, + MutableHandleValue vp) const MOZ_OVERRIDE; + + /* Spidermonkey extensions. */ + virtual bool isExtensible(JSContext *cx, HandleObject proxy, bool *extensible) const MOZ_OVERRIDE; + virtual bool call(JSContext *cx, HandleObject proxy, const CallArgs &args) const MOZ_OVERRIDE; + virtual bool construct(JSContext *cx, HandleObject proxy, const CallArgs &args) const MOZ_OVERRIDE; + virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, + CallArgs args) const MOZ_OVERRIDE; + virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, + bool *bp) const MOZ_OVERRIDE; + virtual bool getPrototypeOf(JSContext *cx, HandleObject proxy, + MutableHandleObject protop) const MOZ_OVERRIDE; + virtual bool setPrototypeOf(JSContext *cx, HandleObject proxy, HandleObject proto, + bool *bp) const MOZ_OVERRIDE; + virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, + JSContext *cx) const MOZ_OVERRIDE; + virtual const char *className(JSContext *cx, HandleObject proxy) const MOZ_OVERRIDE; + virtual JSString *fun_toString(JSContext *cx, HandleObject proxy, + unsigned indent) const MOZ_OVERRIDE; + virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, + RegExpGuard *g) const MOZ_OVERRIDE; + virtual JSObject *weakmapKeyDelegate(JSObject *proxy) const MOZ_OVERRIDE; +}; + +/* + * Dispatch point for handlers that executes the appropriate C++ or scripted traps. + * + * Important: All proxy traps need either (a) an AutoEnterPolicy in their + * Proxy::foo entry point below or (b) an override in SecurityWrapper. See bug + * 945826 comment 0. + */ +class Proxy +{ + public: + /* ES5 Harmony fundamental proxy traps. */ + static bool preventExtensions(JSContext *cx, HandleObject proxy); + static bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc); + static bool getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandleValue vp); + static bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc); + static bool getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandleValue vp); + static bool defineProperty(JSContext *cx, HandleObject proxy, HandleId id, + MutableHandle desc); + static bool getOwnPropertyNames(JSContext *cx, HandleObject proxy, AutoIdVector &props); + static bool delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp); + static bool enumerate(JSContext *cx, HandleObject proxy, AutoIdVector &props); + + /* ES5 Harmony derived proxy traps. */ + static bool has(JSContext *cx, HandleObject proxy, HandleId id, bool *bp); + static bool hasOwn(JSContext *cx, HandleObject proxy, HandleId id, bool *bp); + static bool get(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id, + MutableHandleValue vp); + static bool set(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id, + bool strict, MutableHandleValue vp); + static bool keys(JSContext *cx, HandleObject proxy, AutoIdVector &props); + static bool iterate(JSContext *cx, HandleObject proxy, unsigned flags, MutableHandleValue vp); + + /* Spidermonkey extensions. */ + static bool isExtensible(JSContext *cx, HandleObject proxy, bool *extensible); + static bool call(JSContext *cx, HandleObject proxy, const CallArgs &args); + static bool construct(JSContext *cx, HandleObject proxy, const CallArgs &args); + static bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, CallArgs args); + static bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, bool *bp); + static bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext *cx); + static const char *className(JSContext *cx, HandleObject proxy); + static JSString *fun_toString(JSContext *cx, HandleObject proxy, unsigned indent); + static bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g); + static bool defaultValue(JSContext *cx, HandleObject obj, JSType hint, MutableHandleValue vp); + static bool getPrototypeOf(JSContext *cx, HandleObject proxy, MutableHandleObject protop); + static bool setPrototypeOf(JSContext *cx, HandleObject proxy, HandleObject proto, bool *bp); + + static bool watch(JSContext *cx, HandleObject proxy, HandleId id, HandleObject callable); + static bool unwatch(JSContext *cx, HandleObject proxy, HandleId id); + + static bool slice(JSContext *cx, HandleObject obj, uint32_t begin, uint32_t end, + HandleObject result); + + /* IC entry path for handling __noSuchMethod__ on access. */ + static bool callProp(JSContext *cx, HandleObject proxy, HandleObject reveiver, HandleId id, + MutableHandleValue vp); +}; + +// Use these in places where you don't want to #include vm/ProxyObject.h. +extern JS_FRIEND_DATA(const js::Class* const) CallableProxyClassPtr; +extern JS_FRIEND_DATA(const js::Class* const) UncallableProxyClassPtr; + +inline bool IsProxy(JSObject *obj) +{ + return GetObjectClass(obj)->isProxy(); +} + +/* + * These are part of the API. + * + * NOTE: PROXY_PRIVATE_SLOT is 0 because that way slot 0 is usable by API + * clients for both proxy and non-proxy objects. So an API client that only + * needs to store one slot's worth of data doesn't need to branch on what sort + * of object it has. + */ +const uint32_t PROXY_PRIVATE_SLOT = 0; +const uint32_t PROXY_HANDLER_SLOT = 1; +const uint32_t PROXY_EXTRA_SLOT = 2; +const uint32_t PROXY_MINIMUM_SLOTS = 4; + +inline const BaseProxyHandler * +GetProxyHandler(JSObject *obj) +{ + JS_ASSERT(IsProxy(obj)); + return (const BaseProxyHandler *) GetReservedSlot(obj, PROXY_HANDLER_SLOT).toPrivate(); +} + +inline const Value & +GetProxyPrivate(JSObject *obj) +{ + JS_ASSERT(IsProxy(obj)); + return GetReservedSlot(obj, PROXY_PRIVATE_SLOT); +} + +inline JSObject * +GetProxyTargetObject(JSObject *obj) +{ + JS_ASSERT(IsProxy(obj)); + return GetProxyPrivate(obj).toObjectOrNull(); +} + +inline const Value & +GetProxyExtra(JSObject *obj, size_t n) +{ + JS_ASSERT(IsProxy(obj)); + return GetReservedSlot(obj, PROXY_EXTRA_SLOT + n); +} + +inline void +SetProxyHandler(JSObject *obj, BaseProxyHandler *handler) +{ + JS_ASSERT(IsProxy(obj)); + SetReservedSlot(obj, PROXY_HANDLER_SLOT, PrivateValue(handler)); +} + +inline void +SetProxyExtra(JSObject *obj, size_t n, const Value &extra) +{ + JS_ASSERT(IsProxy(obj)); + JS_ASSERT(n <= 1); + SetReservedSlot(obj, PROXY_EXTRA_SLOT + n, extra); +} + +inline bool +IsScriptedProxy(JSObject *obj) +{ + return IsProxy(obj) && GetProxyHandler(obj)->isScripted(); +} + +class MOZ_STACK_CLASS ProxyOptions { + protected: + /* protected constructor for subclass */ + ProxyOptions(bool singletonArg, const Class *claspArg) + : singleton_(singletonArg), + clasp_(claspArg) + {} + + public: + ProxyOptions() : singleton_(false), + clasp_(UncallableProxyClassPtr) + {} + + bool singleton() const { return singleton_; } + ProxyOptions &setSingleton(bool flag) { + singleton_ = flag; + return *this; + } + + const Class *clasp() const { + return clasp_; + } + ProxyOptions &setClass(const Class *claspArg) { + clasp_ = claspArg; + return *this; + } + ProxyOptions &selectDefaultClass(bool callable) { + const Class *classp = callable? CallableProxyClassPtr : + UncallableProxyClassPtr; + return setClass(classp); + } + + private: + bool singleton_; + const Class *clasp_; +}; + +JS_FRIEND_API(JSObject *) +NewProxyObject(JSContext *cx, const BaseProxyHandler *handler, HandleValue priv, + JSObject *proto, JSObject *parent, const ProxyOptions &options = ProxyOptions()); + +JSObject * +RenewProxyObject(JSContext *cx, JSObject *obj, BaseProxyHandler *handler, Value priv); + +class JS_FRIEND_API(AutoEnterPolicy) +{ + public: + typedef BaseProxyHandler::Action Action; + AutoEnterPolicy(JSContext *cx, const BaseProxyHandler *handler, + HandleObject wrapper, HandleId id, Action act, bool mayThrow) +#ifdef JS_DEBUG + : context(nullptr) +#endif + { + allow = handler->hasSecurityPolicy() ? handler->enter(cx, wrapper, id, act, &rv) + : true; + recordEnter(cx, wrapper, id, act); + // We want to throw an exception if all of the following are true: + // * The policy disallowed access. + // * The policy set rv to false, indicating that we should throw. + // * The caller did not instruct us to ignore exceptions. + // * The policy did not throw itself. + if (!allow && !rv && mayThrow) + reportErrorIfExceptionIsNotPending(cx, id); + } + + virtual ~AutoEnterPolicy() { recordLeave(); } + inline bool allowed() { return allow; } + inline bool returnValue() { JS_ASSERT(!allowed()); return rv; } + + protected: + // no-op constructor for subclass + AutoEnterPolicy() +#ifdef JS_DEBUG + : context(nullptr) + , enteredAction(BaseProxyHandler::NONE) +#endif + {}; + void reportErrorIfExceptionIsNotPending(JSContext *cx, jsid id); + bool allow; + bool rv; + +#ifdef JS_DEBUG + JSContext *context; + mozilla::Maybe enteredProxy; + mozilla::Maybe enteredId; + Action enteredAction; + + // NB: We explicitly don't track the entered action here, because sometimes + // SET traps do an implicit GET during their implementation, leading to + // spurious assertions. + AutoEnterPolicy *prev; + void recordEnter(JSContext *cx, HandleObject proxy, HandleId id, Action act); + void recordLeave(); + + friend JS_FRIEND_API(void) assertEnteredPolicy(JSContext *cx, JSObject *proxy, jsid id, Action act); +#else + inline void recordEnter(JSContext *cx, JSObject *proxy, jsid id, Action act) {} + inline void recordLeave() {} +#endif + +}; + +#ifdef JS_DEBUG +class JS_FRIEND_API(AutoWaivePolicy) : public AutoEnterPolicy { +public: + AutoWaivePolicy(JSContext *cx, HandleObject proxy, HandleId id, + BaseProxyHandler::Action act) + { + allow = true; + recordEnter(cx, proxy, id, act); + } +}; +#else +class JS_FRIEND_API(AutoWaivePolicy) { + public: + AutoWaivePolicy(JSContext *cx, HandleObject proxy, HandleId id, + BaseProxyHandler::Action act) + {} +}; +#endif + +#ifdef JS_DEBUG +extern JS_FRIEND_API(void) +assertEnteredPolicy(JSContext *cx, JSObject *obj, jsid id, + BaseProxyHandler::Action act); +#else +inline void assertEnteredPolicy(JSContext *cx, JSObject *obj, jsid id, + BaseProxyHandler::Action act) +{}; +#endif + +} /* namespace js */ + +extern JS_FRIEND_API(JSObject *) +js_InitProxyClass(JSContext *cx, JS::HandleObject obj); + +#endif /* jsproxy_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jspubtd.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jspubtd.h new file mode 100644 index 0000000000..ffd75e2e5c --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jspubtd.h @@ -0,0 +1,548 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jspubtd_h +#define jspubtd_h + +/* + * JS public API typedefs. + */ + +#include "mozilla/Assertions.h" +#include "mozilla/LinkedList.h" +#include "mozilla/NullPtr.h" +#include "mozilla/PodOperations.h" + +#include "jsprototypes.h" +#include "jstypes.h" + +#include "js/TypeDecls.h" + +#if defined(JSGC_USE_EXACT_ROOTING) || defined(JS_DEBUG) +# define JSGC_TRACK_EXACT_ROOTS +#endif + +namespace JS { + +class AutoIdVector; +class CallArgs; + +template +class Rooted; + +class JS_FRIEND_API(CompileOptions); +class JS_FRIEND_API(ReadOnlyCompileOptions); +class JS_FRIEND_API(OwningCompileOptions); +class JS_PUBLIC_API(CompartmentOptions); + +struct Zone; + +} /* namespace JS */ + +namespace js { +struct ContextFriendFields; +} // namespace js + +/* + * Run-time version enumeration. For compile-time version checking, please use + * the JS_HAS_* macros in jsversion.h, or use MOZJS_MAJOR_VERSION, + * MOZJS_MINOR_VERSION, MOZJS_PATCH_VERSION, and MOZJS_ALPHA definitions. + */ +enum JSVersion { + JSVERSION_ECMA_3 = 148, + JSVERSION_1_6 = 160, + JSVERSION_1_7 = 170, + JSVERSION_1_8 = 180, + JSVERSION_ECMA_5 = 185, + JSVERSION_DEFAULT = 0, + JSVERSION_UNKNOWN = -1, + JSVERSION_LATEST = JSVERSION_ECMA_5 +}; + +/* Result of typeof operator enumeration. */ +enum JSType { + JSTYPE_VOID, /* undefined */ + JSTYPE_OBJECT, /* object */ + JSTYPE_FUNCTION, /* function */ + JSTYPE_STRING, /* string */ + JSTYPE_NUMBER, /* number */ + JSTYPE_BOOLEAN, /* boolean */ + JSTYPE_NULL, /* null */ + JSTYPE_SYMBOL, /* symbol */ + JSTYPE_LIMIT +}; + +/* Dense index into cached prototypes and class atoms for standard objects. */ +enum JSProtoKey { +#define PROTOKEY_AND_INITIALIZER(name,code,init,clasp) JSProto_##name = code, + JS_FOR_EACH_PROTOTYPE(PROTOKEY_AND_INITIALIZER) +#undef PROTOKEY_AND_INITIALIZER + JSProto_LIMIT +}; + +/* + * This enum type is used to control the behavior of a JSObject property + * iterator function that has type JSNewEnumerate. + */ +enum JSIterateOp { + /* Create new iterator state over enumerable properties. */ + JSENUMERATE_INIT, + + /* Create new iterator state over all properties. */ + JSENUMERATE_INIT_ALL, + + /* Iterate once. */ + JSENUMERATE_NEXT, + + /* Destroy iterator state. */ + JSENUMERATE_DESTROY +}; + +/* See Value::gcKind() and JSTraceCallback in Tracer.h. */ +enum JSGCTraceKind { + JSTRACE_OBJECT, + JSTRACE_STRING, + JSTRACE_SYMBOL, + JSTRACE_SCRIPT, + + /* + * Trace kinds internal to the engine. The embedding can only see them if + * it implements JSTraceCallback. + */ + JSTRACE_LAZY_SCRIPT, + JSTRACE_JITCODE, + JSTRACE_SHAPE, + JSTRACE_BASE_SHAPE, + JSTRACE_TYPE_OBJECT, + JSTRACE_LAST = JSTRACE_TYPE_OBJECT +}; + +/* Struct forward declarations. */ +struct JSClass; +struct JSCompartment; +struct JSConstDoubleSpec; +struct JSCrossCompartmentCall; +struct JSErrorReport; +struct JSExceptionState; +struct JSFunctionSpec; +struct JSIdArray; +struct JSLocaleCallbacks; +struct JSObjectMap; +struct JSPrincipals; +struct JSPropertyDescriptor; +struct JSPropertyName; +struct JSPropertySpec; +struct JSRuntime; +struct JSSecurityCallbacks; +struct JSStructuredCloneCallbacks; +struct JSStructuredCloneReader; +struct JSStructuredCloneWriter; +class JS_PUBLIC_API(JSTracer); + +class JSFlatString; + +#ifdef JS_THREADSAFE +typedef struct PRCallOnceType JSCallOnceType; +#else +typedef bool JSCallOnceType; +#endif +typedef bool (*JSInitCallback)(void); + +/* + * Generic trace operation that calls JS_CallTracer on each traceable thing + * stored in data. + */ +typedef void +(* JSTraceDataOp)(JSTracer *trc, void *data); + +void js_FinishGC(JSRuntime *rt); + +namespace js { +namespace gc { +class StoreBuffer; +void MarkPersistentRootedChains(JSTracer *); +void FinishPersistentRootedChains(JSRuntime *); +} +} + +namespace JS { + +typedef void (*OffThreadCompileCallback)(void *token, void *callbackData); + +namespace shadow { + +struct Runtime +{ + /* Restrict zone access during Minor GC. */ + bool needsBarrier_; + +#ifdef JSGC_GENERATIONAL + private: + js::gc::StoreBuffer *gcStoreBufferPtr_; +#endif + + public: + explicit Runtime( +#ifdef JSGC_GENERATIONAL + js::gc::StoreBuffer *storeBuffer +#endif + ) + : needsBarrier_(false) +#ifdef JSGC_GENERATIONAL + , gcStoreBufferPtr_(storeBuffer) +#endif + {} + + bool needsBarrier() const { + return needsBarrier_; + } + +#ifdef JSGC_GENERATIONAL + js::gc::StoreBuffer *gcStoreBufferPtr() { return gcStoreBufferPtr_; } +#endif + + static JS::shadow::Runtime *asShadowRuntime(JSRuntime *rt) { + return reinterpret_cast(rt); + } + + /* Allow inlining of PersistentRooted constructors and destructors. */ + private: + template friend class JS::PersistentRooted; + friend void js::gc::MarkPersistentRootedChains(JSTracer *); + friend void js::gc::FinishPersistentRootedChains(JSRuntime *rt); + + mozilla::LinkedList functionPersistentRooteds; + mozilla::LinkedList idPersistentRooteds; + mozilla::LinkedList objectPersistentRooteds; + mozilla::LinkedList scriptPersistentRooteds; + mozilla::LinkedList stringPersistentRooteds; + mozilla::LinkedList valuePersistentRooteds; + + /* Specializations of this return references to the appropriate list. */ + template + inline mozilla::LinkedList > &getPersistentRootedList(); +}; + +template<> +inline mozilla::LinkedList +&Runtime::getPersistentRootedList() { return functionPersistentRooteds; } + +template<> +inline mozilla::LinkedList +&Runtime::getPersistentRootedList() { return idPersistentRooteds; } + +template<> +inline mozilla::LinkedList +&Runtime::getPersistentRootedList() { return objectPersistentRooteds; } + +template<> +inline mozilla::LinkedList +&Runtime::getPersistentRootedList() { return scriptPersistentRooteds; } + +template<> +inline mozilla::LinkedList +&Runtime::getPersistentRootedList() { return stringPersistentRooteds; } + +template<> +inline mozilla::LinkedList +&Runtime::getPersistentRootedList() { return valuePersistentRooteds; } + +} /* namespace shadow */ + +class JS_PUBLIC_API(AutoGCRooter) +{ + public: + AutoGCRooter(JSContext *cx, ptrdiff_t tag); + AutoGCRooter(js::ContextFriendFields *cx, ptrdiff_t tag); + + ~AutoGCRooter() { + MOZ_ASSERT(this == *stackTop); + *stackTop = down; + } + + /* Implemented in gc/RootMarking.cpp. */ + inline void trace(JSTracer *trc); + static void traceAll(JSTracer *trc); + static void traceAllWrappers(JSTracer *trc); + + /* T must be a context type */ + template + static void traceAllInContext(T* cx, JSTracer *trc) { + for (AutoGCRooter *gcr = cx->autoGCRooters; gcr; gcr = gcr->down) + gcr->trace(trc); + } + + protected: + AutoGCRooter * const down; + + /* + * Discriminates actual subclass of this being used. If non-negative, the + * subclass roots an array of values of the length stored in this field. + * If negative, meaning is indicated by the corresponding value in the enum + * below. Any other negative value indicates some deeper problem such as + * memory corruption. + */ + ptrdiff_t tag_; + + enum { + VALARRAY = -2, /* js::AutoValueArray */ + PARSER = -3, /* js::frontend::Parser */ + SHAPEVECTOR = -4, /* js::AutoShapeVector */ + IDARRAY = -6, /* js::AutoIdArray */ + DESCVECTOR = -7, /* js::AutoPropDescVector */ + VALVECTOR = -10, /* js::AutoValueVector */ + IDVECTOR = -13, /* js::AutoIdVector */ + OBJVECTOR = -14, /* js::AutoObjectVector */ + STRINGVECTOR =-15, /* js::AutoStringVector */ + SCRIPTVECTOR =-16, /* js::AutoScriptVector */ + NAMEVECTOR = -17, /* js::AutoNameVector */ + HASHABLEVALUE=-18, /* js::HashableValue */ + IONMASM = -19, /* js::jit::MacroAssembler */ + IONALLOC = -20, /* js::jit::AutoTempAllocatorRooter */ + WRAPVECTOR = -21, /* js::AutoWrapperVector */ + WRAPPER = -22, /* js::AutoWrapperRooter */ + OBJOBJHASHMAP=-23, /* js::AutoObjectObjectHashMap */ + OBJU32HASHMAP=-24, /* js::AutoObjectUnsigned32HashMap */ + OBJHASHSET = -25, /* js::AutoObjectHashSet */ + JSONPARSER = -26, /* js::JSONParser */ + CUSTOM = -27, /* js::CustomAutoRooter */ + FUNVECTOR = -28 /* js::AutoFunctionVector */ + }; + + private: + AutoGCRooter ** const stackTop; + + /* No copy or assignment semantics. */ + AutoGCRooter(AutoGCRooter &ida) MOZ_DELETE; + void operator=(AutoGCRooter &ida) MOZ_DELETE; +}; + +} /* namespace JS */ + +namespace js { + +/* + * Parallel operations in general can have one of three states. They may + * succeed, fail, or "bail", where bail indicates that the code encountered an + * unexpected condition and should be re-run sequentially. Different + * subcategories of the "bail" state are encoded as variants of TP_RETRY_*. + */ +enum ParallelResult { TP_SUCCESS, TP_RETRY_SEQUENTIALLY, TP_RETRY_AFTER_GC, TP_FATAL }; + +struct ThreadSafeContext; +class ForkJoinContext; +class ExclusiveContext; + +class Allocator; + +enum ThingRootKind +{ + THING_ROOT_OBJECT, + THING_ROOT_SHAPE, + THING_ROOT_BASE_SHAPE, + THING_ROOT_TYPE_OBJECT, + THING_ROOT_STRING, + THING_ROOT_SYMBOL, + THING_ROOT_JIT_CODE, + THING_ROOT_SCRIPT, + THING_ROOT_LAZY_SCRIPT, + THING_ROOT_ID, + THING_ROOT_VALUE, + THING_ROOT_TYPE, + THING_ROOT_BINDINGS, + THING_ROOT_PROPERTY_DESCRIPTOR, + THING_ROOT_PROP_DESC, + THING_ROOT_LIMIT +}; + +/* + * This list enumerates the different types of conceptual stacks we have in + * SpiderMonkey. In reality, they all share the C stack, but we allow different + * stack limits depending on the type of code running. + */ +enum StackKind +{ + StackForSystemCode, // C++, such as the GC, running on behalf of the VM. + StackForTrustedScript, // Script running with trusted principals. + StackForUntrustedScript, // Script running with untrusted principals. + StackKindCount +}; + +template +struct RootKind; + +/* + * Specifically mark the ThingRootKind of externally visible types, so that + * JSAPI users may use JSRooted... types without having the class definition + * available. + */ +template +struct SpecificRootKind +{ + static ThingRootKind rootKind() { return Kind; } +}; + +template <> struct RootKind : SpecificRootKind {}; +template <> struct RootKind : SpecificRootKind {}; +template <> struct RootKind : SpecificRootKind {}; +template <> struct RootKind : SpecificRootKind {}; +template <> struct RootKind : SpecificRootKind {}; +template <> struct RootKind : SpecificRootKind {}; +template <> struct RootKind : SpecificRootKind {}; +template <> struct RootKind : SpecificRootKind {}; + +struct ContextFriendFields +{ + protected: + JSRuntime *const runtime_; + + /* The current compartment. */ + JSCompartment *compartment_; + + /* The current zone. */ + JS::Zone *zone_; + + public: + explicit ContextFriendFields(JSRuntime *rt) + : runtime_(rt), compartment_(nullptr), zone_(nullptr), autoGCRooters(nullptr) + { +#ifdef JSGC_TRACK_EXACT_ROOTS + mozilla::PodArrayZero(thingGCRooters); +#endif + } + + static const ContextFriendFields *get(const JSContext *cx) { + return reinterpret_cast(cx); + } + + static ContextFriendFields *get(JSContext *cx) { + return reinterpret_cast(cx); + } + +#ifdef JSGC_TRACK_EXACT_ROOTS + private: + /* + * Stack allocated GC roots for stack GC heap pointers, which may be + * overwritten if moved during a GC. + */ + JS::Rooted *thingGCRooters[THING_ROOT_LIMIT]; + + public: + template + inline JS::Rooted *gcRooters() { + js::ThingRootKind kind = RootKind::rootKind(); + return reinterpret_cast *>(thingGCRooters[kind]); + } + +#endif + + void checkNoGCRooters(); + + /* Stack of thread-stack-allocated GC roots. */ + JS::AutoGCRooter *autoGCRooters; + + friend JSRuntime *GetRuntime(const JSContext *cx); + friend JSCompartment *GetContextCompartment(const JSContext *cx); + friend JS::Zone *GetContextZone(const JSContext *cx); + template friend class JS::Rooted; +}; + +/* + * Inlinable accessors for JSContext. + * + * - These must not be available on the more restricted superclasses of + * JSContext, so we can't simply define them on ContextFriendFields. + * + * - They're perfectly ordinary JSContext functionality, so ought to be + * usable without resorting to jsfriendapi.h, and when JSContext is an + * incomplete type. + */ +inline JSRuntime * +GetRuntime(const JSContext *cx) +{ + return ContextFriendFields::get(cx)->runtime_; +} + +inline JSCompartment * +GetContextCompartment(const JSContext *cx) +{ + return ContextFriendFields::get(cx)->compartment_; +} + +inline JS::Zone * +GetContextZone(const JSContext *cx) +{ + return ContextFriendFields::get(cx)->zone_; +} + +class PerThreadData; + +struct PerThreadDataFriendFields +{ + private: + // Note: this type only exists to permit us to derive the offset of + // the perThread data within the real JSRuntime* type in a portable + // way. + struct RuntimeDummy : JS::shadow::Runtime + { + struct PerThreadDummy { + void *field1; + uintptr_t field2; +#ifdef JS_DEBUG + uint64_t field3; +#endif + } mainThread; + }; + + public: + + PerThreadDataFriendFields(); + +#ifdef JSGC_TRACK_EXACT_ROOTS + private: + /* + * Stack allocated GC roots for stack GC heap pointers, which may be + * overwritten if moved during a GC. + */ + JS::Rooted *thingGCRooters[THING_ROOT_LIMIT]; + + public: + template + inline JS::Rooted *gcRooters() { + js::ThingRootKind kind = RootKind::rootKind(); + return reinterpret_cast *>(thingGCRooters[kind]); + } +#endif + + /* Limit pointer for checking native stack consumption. */ + uintptr_t nativeStackLimit[StackKindCount]; + + static const size_t RuntimeMainThreadOffset = offsetof(RuntimeDummy, mainThread); + + static inline PerThreadDataFriendFields *get(js::PerThreadData *pt) { + return reinterpret_cast(pt); + } + + static inline PerThreadDataFriendFields *getMainThread(JSRuntime *rt) { + // mainThread must always appear directly after |JS::shadow::Runtime|. + // Tested by a JS_STATIC_ASSERT in |jsfriendapi.cpp| + return reinterpret_cast( + reinterpret_cast(rt) + RuntimeMainThreadOffset); + } + + static inline const PerThreadDataFriendFields *getMainThread(const JSRuntime *rt) { + // mainThread must always appear directly after |JS::shadow::Runtime|. + // Tested by a JS_STATIC_ASSERT in |jsfriendapi.cpp| + return reinterpret_cast( + reinterpret_cast(rt) + RuntimeMainThreadOffset); + } + + template friend class JS::Rooted; +}; + +} /* namespace js */ + +#endif /* jspubtd_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jstypes.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jstypes.h new file mode 100644 index 0000000000..e9927bca0d --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jstypes.h @@ -0,0 +1,226 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* +** File: jstypes.h +** Description: Definitions of NSPR's basic types +** +** Prototypes and macros used to make up for deficiencies in ANSI environments +** that we have found. +** +** Since we do not wrap and all the other standard headers, authors +** of portable code will not know in general that they need these definitions. +** Instead of requiring these authors to find the dependent uses in their code +** and take the following steps only in those C files, we take steps once here +** for all C files. +**/ + +#ifndef jstypes_h +#define jstypes_h + +#include "mozilla/Attributes.h" +#include "mozilla/Types.h" + +// jstypes.h is (or should be!) included by every file in SpiderMonkey. +// js-config.h and jsversion.h also should be included by every file. +// So include them here. +// XXX: including them in js/RequiredDefines.h should be a better option, since +// that is by definition the header file that should be included in all +// SpiderMonkey code. However, Gecko doesn't do this! See bug 909576. +#include "js-config.h" +#include "jsversion.h" + +/*********************************************************************** +** MACROS: JS_EXTERN_API +** JS_EXPORT_API +** DESCRIPTION: +** These are only for externally visible routines and globals. For +** internal routines, just use "extern" for type checking and that +** will not export internal cross-file or forward-declared symbols. +** Define a macro for declaring procedures return types. We use this to +** deal with windoze specific type hackery for DLL definitions. Use +** JS_EXTERN_API when the prototype for the method is declared. Use +** JS_EXPORT_API for the implementation of the method. +** +** Example: +** in dowhim.h +** JS_EXTERN_API( void ) DoWhatIMean( void ); +** in dowhim.c +** JS_EXPORT_API( void ) DoWhatIMean( void ) { return; } +** +** +***********************************************************************/ + +#define JS_EXTERN_API(type) extern MOZ_EXPORT type +#define JS_EXPORT_API(type) MOZ_EXPORT type +#define JS_EXPORT_DATA(type) MOZ_EXPORT type +#define JS_IMPORT_API(type) MOZ_IMPORT_API type +#define JS_IMPORT_DATA(type) MOZ_IMPORT_DATA type + +/* + * The linkage of JS API functions differs depending on whether the file is + * used within the JS library or not. Any source file within the JS + * interpreter should define EXPORT_JS_API whereas any client of the library + * should not. STATIC_JS_API is used to build JS as a static library. + */ +#if defined(STATIC_JS_API) +# define JS_PUBLIC_API(t) t +# define JS_PUBLIC_DATA(t) t +#elif defined(EXPORT_JS_API) || defined(STATIC_EXPORTABLE_JS_API) +# define JS_PUBLIC_API(t) MOZ_EXPORT t +# define JS_PUBLIC_DATA(t) MOZ_EXPORT t +#else +# define JS_PUBLIC_API(t) MOZ_IMPORT_API t +# define JS_PUBLIC_DATA(t) MOZ_IMPORT_DATA t +#endif + +#if defined(STATIC_JS_API) || defined(EXPORT_JS_API) || defined(STATIC_EXPORTABLE_JS_API) +# define JS_FRIEND_API(t) MOZ_EXPORT t +# define JS_FRIEND_DATA(t) MOZ_EXPORT t +#else +# define JS_FRIEND_API(t) MOZ_IMPORT_API t +# define JS_FRIEND_DATA(t) MOZ_IMPORT_DATA t +#endif + +#if defined(_MSC_VER) && defined(_M_IX86) +#define JS_FASTCALL __fastcall +#elif defined(__GNUC__) && defined(__i386__) +#define JS_FASTCALL __attribute__((fastcall)) +#else +#define JS_FASTCALL +#define JS_NO_FASTCALL +#endif + +/*********************************************************************** +** MACROS: JS_BEGIN_MACRO +** JS_END_MACRO +** DESCRIPTION: +** Macro body brackets so that macros with compound statement definitions +** behave syntactically more like functions when called. +***********************************************************************/ +#define JS_BEGIN_MACRO do { + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +# define JS_END_MACRO \ + } __pragma(warning(push)) __pragma(warning(disable:4127)) \ + while (0) __pragma(warning(pop)) +#else +# define JS_END_MACRO } while (0) +#endif + +/*********************************************************************** +** MACROS: JS_BIT +** JS_BITMASK +** DESCRIPTION: +** Bit masking macros. XXX n must be <= 31 to be portable +***********************************************************************/ +#define JS_BIT(n) ((uint32_t)1 << (n)) +#define JS_BITMASK(n) (JS_BIT(n) - 1) + +/*********************************************************************** +** MACROS: JS_HOWMANY +** JS_ROUNDUP +** DESCRIPTION: +** Commonly used macros for operations on compatible types. +***********************************************************************/ +#define JS_HOWMANY(x,y) (((x)+(y)-1)/(y)) +#define JS_ROUNDUP(x,y) (JS_HOWMANY(x,y)*(y)) + +#include "jscpucfg.h" + +/* + * Define JS_64BIT iff we are building in an environment with 64-bit + * addresses. + */ +#ifdef _MSC_VER +# if defined(_M_X64) || defined(_M_AMD64) +# define JS_64BIT +# endif +#elif defined(__GNUC__) +/* Additional GCC defines are when running on Solaris, AIX, and HPUX */ +# if defined(__x86_64__) || defined(__sparcv9) || \ + defined(__64BIT__) || defined(__LP64__) +# define JS_64BIT +# endif +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Sun Studio C/C++ */ +# if defined(__x86_64) || defined(__sparcv9) +# define JS_64BIT +# endif +#elif defined(__xlc__) || defined(__xlC__) /* IBM XL C/C++ */ +# if defined(__64BIT__) +# define JS_64BIT +# endif +#elif defined(__HP_cc) || defined(__HP_aCC) /* HP-UX cc/aCC */ +# if defined(__LP64__) +# define JS_64BIT +# endif +#else +# error "Implement me" +#endif + +/*********************************************************************** +** MACROS: JS_ARRAY_LENGTH +** JS_ARRAY_END +** DESCRIPTION: +** Macros to get the number of elements and the pointer to one past the +** last element of a C array. Use them like this: +** +** jschar buf[10], *s; +** JSString *str; +** ... +** for (s = buf; s != JS_ARRAY_END(buf); ++s) *s = ...; +** ... +** str = JS_NewStringCopyN(cx, buf, JS_ARRAY_LENGTH(buf)); +** ... +** +***********************************************************************/ + +#define JS_ARRAY_LENGTH(array) (sizeof (array) / sizeof (array)[0]) +#define JS_ARRAY_END(array) ((array) + JS_ARRAY_LENGTH(array)) + +#define JS_BITS_PER_BYTE 8 +#define JS_BITS_PER_BYTE_LOG2 3 + +#if defined(JS_64BIT) +# define JS_BITS_PER_WORD 64 +#else +# define JS_BITS_PER_WORD 32 +#endif + +/*********************************************************************** +** MACROS: JS_FUNC_TO_DATA_PTR +** JS_DATA_TO_FUNC_PTR +** DESCRIPTION: +** Macros to convert between function and data pointers assuming that +** they have the same size. Use them like this: +** +** JSPropertyOp nativeGetter; +** JSObject *scriptedGetter; +** ... +** scriptedGetter = JS_FUNC_TO_DATA_PTR(JSObject *, nativeGetter); +** ... +** nativeGetter = JS_DATA_TO_FUNC_PTR(JSPropertyOp, scriptedGetter); +** +***********************************************************************/ + +#ifdef __GNUC__ +# define JS_FUNC_TO_DATA_PTR(type, fun) (__extension__ (type) (size_t) (fun)) +# define JS_DATA_TO_FUNC_PTR(type, ptr) (__extension__ (type) (size_t) (ptr)) +#else +/* Use an extra (void *) cast for MSVC. */ +# define JS_FUNC_TO_DATA_PTR(type, fun) ((type) (void *) (fun)) +# define JS_DATA_TO_FUNC_PTR(type, ptr) ((type) (void *) (ptr)) +#endif + +#ifdef __GNUC__ +# define JS_EXTENSION __extension__ +# define JS_EXTENSION_(s) __extension__ ({ s; }) +#else +# define JS_EXTENSION +# define JS_EXTENSION_(s) s +#endif + +#endif /* jstypes_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jsversion.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsversion.h new file mode 100644 index 0000000000..1f31e40b5e --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jsversion.h @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jsversion_h +#define jsversion_h + +/* + * JS Capability Macros. + */ +#define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. */ +#define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ +#define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ +#define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method */ +#define JS_HAS_CATCH_GUARD 1 /* has exception handling catch guard */ +#define JS_HAS_UNEVAL 1 /* has uneval() top-level function */ +#define JS_HAS_CONST 1 /* has JS2 const as alternative var */ +#define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statement */ +#define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler */ +#define JS_HAS_FOR_EACH_IN 1 /* has for each (lhs in iterable) */ +#define JS_HAS_GENERATORS 1 /* has yield in generator function */ +#define JS_HAS_BLOCK_SCOPE 1 /* has block scope via let/arraycomp */ +#define JS_HAS_DESTRUCTURING 2 /* has [a,b] = ... or {p:a,q:b} = ... */ +#define JS_HAS_GENERATOR_EXPRS 1 /* has (expr for (lhs in iterable)) */ +#define JS_HAS_EXPR_CLOSURES 1 /* has function (formals) listexpr */ +#ifdef NIGHTLY_BUILD +#define JS_HAS_TEMPLATE_STRINGS 1 /* has template string support */ +#endif + +/* Support for JS_NewGlobalObject. */ +#define JS_HAS_NEW_GLOBAL_OBJECT 1 + +/* Support for JS_MakeSystemObject. */ +#define JS_HAS_MAKE_SYSTEM_OBJECT 1 + +/* Feature-test macro for evolving destructuring support. */ +#define JS_HAS_DESTRUCTURING_SHORTHAND (JS_HAS_DESTRUCTURING == 2) + +/* + * Feature for Object.prototype.__{define,lookup}{G,S}etter__ legacy support; + * support likely to be made opt-in at some future time. + */ +#define JS_OLD_GETTER_SETTER_METHODS 1 + +/* Support for Symbols - Nightly-only for now. */ +#ifdef NIGHTLY_BUILD +#define JS_HAS_SYMBOLS 1 +#endif + +#endif /* jsversion_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/jswrapper.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/jswrapper.h new file mode 100644 index 0000000000..a8a510c4f7 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/jswrapper.h @@ -0,0 +1,337 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jswrapper_h +#define jswrapper_h + +#include "mozilla/Attributes.h" + +#include "jsproxy.h" + +namespace js { + +class DummyFrameGuard; + +/* + * Helper for Wrapper::New default options. + * + * Callers of Wrapper::New() who wish to specify a prototype for the created + * Wrapper, *MUST* construct a WrapperOptions with a JSContext. + */ +class MOZ_STACK_CLASS WrapperOptions : public ProxyOptions { + public: + WrapperOptions() : ProxyOptions(false, nullptr), + proto_() + {} + + explicit WrapperOptions(JSContext *cx) : ProxyOptions(false, nullptr), + proto_() + { + proto_.construct(cx); + } + + inline JSObject *proto() const; + WrapperOptions &setProto(JSObject *protoArg) { + JS_ASSERT(!proto_.empty()); + proto_.ref() = protoArg; + return *this; + } + + private: + mozilla::Maybe proto_; +}; + +/* + * A wrapper is a proxy with a target object to which it generally forwards + * operations, but may restrict access to certain operations or instrument + * the trap operations in various ways. A wrapper is distinct from a Direct Proxy + * Handler in the sense that it can be "unwrapped" in C++, exposing the underlying + * object (Direct Proxy Handlers have an underlying target object, but don't + * expect to expose this object via any kind of unwrapping operation). Callers + * should be careful to avoid unwrapping security wrappers in the wrong context. + */ +class JS_FRIEND_API(Wrapper) : public DirectProxyHandler +{ + unsigned mFlags; + + public: + using BaseProxyHandler::Action; + + enum Flags { + CROSS_COMPARTMENT = 1 << 0, + LAST_USED_FLAG = CROSS_COMPARTMENT + }; + + virtual bool defaultValue(JSContext *cx, HandleObject obj, JSType hint, + MutableHandleValue vp) const MOZ_OVERRIDE; + + static JSObject *New(JSContext *cx, JSObject *obj, JSObject *parent, const Wrapper *handler, + const WrapperOptions *options = nullptr); + + static JSObject *Renew(JSContext *cx, JSObject *existing, JSObject *obj, const Wrapper *handler); + + static const Wrapper *wrapperHandler(JSObject *wrapper); + + static JSObject *wrappedObject(JSObject *wrapper); + + unsigned flags() const { + return mFlags; + } + + explicit Wrapper(unsigned flags, bool hasPrototype = false, bool hasSecurityPolicy = false); + + virtual ~Wrapper(); + + virtual bool finalizeInBackground(Value priv) const MOZ_OVERRIDE; + + static const Wrapper singleton; + static const Wrapper singletonWithPrototype; + + static JSObject *defaultProto; +}; + +inline JSObject * +WrapperOptions::proto() const +{ + return proto_.empty() ? Wrapper::defaultProto : proto_.ref(); +} + +/* Base class for all cross compartment wrapper handlers. */ +class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper +{ + public: + explicit CrossCompartmentWrapper(unsigned flags, bool hasPrototype = false, + bool hasSecurityPolicy = false); + + virtual ~CrossCompartmentWrapper(); + + /* ES5 Harmony fundamental wrapper traps. */ + virtual bool preventExtensions(JSContext *cx, HandleObject wrapper) const MOZ_OVERRIDE; + virtual bool getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool getOwnPropertyNames(JSContext *cx, HandleObject wrapper, + AutoIdVector &props) const MOZ_OVERRIDE; + virtual bool delete_(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) const MOZ_OVERRIDE; + virtual bool enumerate(JSContext *cx, HandleObject wrapper, AutoIdVector &props) const MOZ_OVERRIDE; + + /* ES5 Harmony derived wrapper traps. */ + virtual bool has(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) const MOZ_OVERRIDE; + virtual bool hasOwn(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) const MOZ_OVERRIDE; + virtual bool get(JSContext *cx, HandleObject wrapper, HandleObject receiver, + HandleId id, MutableHandleValue vp) const MOZ_OVERRIDE; + virtual bool set(JSContext *cx, HandleObject wrapper, HandleObject receiver, + HandleId id, bool strict, MutableHandleValue vp) const MOZ_OVERRIDE; + virtual bool keys(JSContext *cx, HandleObject wrapper, AutoIdVector &props) const MOZ_OVERRIDE; + virtual bool iterate(JSContext *cx, HandleObject wrapper, unsigned flags, + MutableHandleValue vp) const MOZ_OVERRIDE; + + /* Spidermonkey extensions. */ + virtual bool isExtensible(JSContext *cx, HandleObject wrapper, bool *extensible) const MOZ_OVERRIDE; + virtual bool call(JSContext *cx, HandleObject wrapper, const CallArgs &args) const MOZ_OVERRIDE; + virtual bool construct(JSContext *cx, HandleObject wrapper, const CallArgs &args) const MOZ_OVERRIDE; + virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, + CallArgs args) const MOZ_OVERRIDE; + virtual bool hasInstance(JSContext *cx, HandleObject wrapper, MutableHandleValue v, + bool *bp) const MOZ_OVERRIDE; + virtual const char *className(JSContext *cx, HandleObject proxy) const MOZ_OVERRIDE; + virtual JSString *fun_toString(JSContext *cx, HandleObject wrapper, + unsigned indent) const MOZ_OVERRIDE; + virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) const MOZ_OVERRIDE; + virtual bool defaultValue(JSContext *cx, HandleObject wrapper, JSType hint, + MutableHandleValue vp) const MOZ_OVERRIDE; + virtual bool getPrototypeOf(JSContext *cx, HandleObject proxy, + MutableHandleObject protop) const MOZ_OVERRIDE; + virtual bool setPrototypeOf(JSContext *cx, HandleObject proxy, HandleObject proto, + bool *bp) const MOZ_OVERRIDE; + + static const CrossCompartmentWrapper singleton; + static const CrossCompartmentWrapper singletonWithPrototype; +}; + +/* + * Base class for security wrappers. A security wrapper is potentially hiding + * all or part of some wrapped object thus SecurityWrapper defaults to denying + * access to the wrappee. This is the opposite of Wrapper which tries to be + * completely transparent. + * + * NB: Currently, only a few ProxyHandler operations are overridden to deny + * access, relying on derived SecurityWrapper to block access when necessary. + */ +template +class JS_FRIEND_API(SecurityWrapper) : public Base +{ + public: + explicit SecurityWrapper(unsigned flags, bool hasPrototype = false); + + virtual bool isExtensible(JSContext *cx, HandleObject wrapper, bool *extensible) const MOZ_OVERRIDE; + virtual bool preventExtensions(JSContext *cx, HandleObject wrapper) const MOZ_OVERRIDE; + virtual bool enter(JSContext *cx, HandleObject wrapper, HandleId id, Wrapper::Action act, + bool *bp) const MOZ_OVERRIDE; + virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, + CallArgs args) const MOZ_OVERRIDE; + virtual bool defaultValue(JSContext *cx, HandleObject wrapper, JSType hint, + MutableHandleValue vp) const MOZ_OVERRIDE; + virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, + JSContext *cx) const MOZ_OVERRIDE; + virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) const MOZ_OVERRIDE; + virtual bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + + virtual bool setPrototypeOf(JSContext *cx, HandleObject proxy, HandleObject proto, + bool *bp) const MOZ_OVERRIDE; + + virtual bool watch(JSContext *cx, JS::HandleObject proxy, JS::HandleId id, + JS::HandleObject callable) const MOZ_OVERRIDE; + virtual bool unwatch(JSContext *cx, JS::HandleObject proxy, JS::HandleId id) const MOZ_OVERRIDE; + + /* + * Allow our subclasses to select the superclass behavior they want without + * needing to specify an exact superclass. + */ + typedef Base Permissive; + typedef SecurityWrapper Restrictive; +}; + +typedef SecurityWrapper SameCompartmentSecurityWrapper; +typedef SecurityWrapper CrossCompartmentSecurityWrapper; + +class JS_FRIEND_API(DeadObjectProxy) : public BaseProxyHandler +{ + public: + // This variable exists solely to provide a unique address for use as an identifier. + static const char sDeadObjectFamily; + + explicit DeadObjectProxy(); + + /* ES5 Harmony fundamental wrapper traps. */ + virtual bool preventExtensions(JSContext *cx, HandleObject proxy) const MOZ_OVERRIDE; + virtual bool getPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool getOwnPropertyDescriptor(JSContext *cx, HandleObject wrapper, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, + MutableHandle desc) const MOZ_OVERRIDE; + virtual bool getOwnPropertyNames(JSContext *cx, HandleObject wrapper, + AutoIdVector &props) const MOZ_OVERRIDE; + virtual bool delete_(JSContext *cx, HandleObject wrapper, HandleId id, bool *bp) const MOZ_OVERRIDE; + virtual bool enumerate(JSContext *cx, HandleObject wrapper, AutoIdVector &props) const MOZ_OVERRIDE; + + /* Spidermonkey extensions. */ + virtual bool isExtensible(JSContext *cx, HandleObject proxy, bool *extensible) const MOZ_OVERRIDE; + virtual bool call(JSContext *cx, HandleObject proxy, const CallArgs &args) const MOZ_OVERRIDE; + virtual bool construct(JSContext *cx, HandleObject proxy, const CallArgs &args) const MOZ_OVERRIDE; + virtual bool nativeCall(JSContext *cx, IsAcceptableThis test, NativeImpl impl, + CallArgs args) const MOZ_OVERRIDE; + virtual bool hasInstance(JSContext *cx, HandleObject proxy, MutableHandleValue v, + bool *bp) const MOZ_OVERRIDE; + virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, + JSContext *cx) const MOZ_OVERRIDE; + virtual const char *className(JSContext *cx, HandleObject proxy) const MOZ_OVERRIDE; + virtual JSString *fun_toString(JSContext *cx, HandleObject proxy, unsigned indent) const MOZ_OVERRIDE; + virtual bool regexp_toShared(JSContext *cx, HandleObject proxy, RegExpGuard *g) const MOZ_OVERRIDE; + virtual bool defaultValue(JSContext *cx, HandleObject obj, JSType hint, + MutableHandleValue vp) const MOZ_OVERRIDE; + virtual bool getPrototypeOf(JSContext *cx, HandleObject proxy, + MutableHandleObject protop) const MOZ_OVERRIDE; + + static const DeadObjectProxy singleton; +}; + +extern JSObject * +TransparentObjectWrapper(JSContext *cx, HandleObject existing, HandleObject obj, + HandleObject parent, unsigned flags); + +// Proxy family for wrappers. Public so that IsWrapper() can be fully inlined by +// jsfriendapi users. +// This variable exists solely to provide a unique address for use as an identifier. +extern JS_FRIEND_DATA(const char) sWrapperFamily; + +inline bool +IsWrapper(JSObject *obj) +{ + return IsProxy(obj) && GetProxyHandler(obj)->family() == &sWrapperFamily; +} + +// Given a JSObject, returns that object stripped of wrappers. If +// stopAtOuter is true, then this returns the outer window if it was +// previously wrapped. Otherwise, this returns the first object for +// which JSObject::isWrapper returns false. +JS_FRIEND_API(JSObject *) +UncheckedUnwrap(JSObject *obj, bool stopAtOuter = true, unsigned *flagsp = nullptr); + +// Given a JSObject, returns that object stripped of wrappers. At each stage, +// the security wrapper has the opportunity to veto the unwrap. Since checked +// code should never be unwrapping outer window wrappers, we always stop at +// outer windows. +JS_FRIEND_API(JSObject *) +CheckedUnwrap(JSObject *obj, bool stopAtOuter = true); + +// Unwrap only the outermost security wrapper, with the same semantics as +// above. This is the checked version of Wrapper::wrappedObject. +JS_FRIEND_API(JSObject *) +UnwrapOneChecked(JSObject *obj, bool stopAtOuter = true); + +JS_FRIEND_API(bool) +IsCrossCompartmentWrapper(JSObject *obj); + +bool +IsDeadProxyObject(JSObject *obj); + +JSObject * +NewDeadProxyObject(JSContext *cx, JSObject *parent, + const ProxyOptions &options = ProxyOptions()); + +void +NukeCrossCompartmentWrapper(JSContext *cx, JSObject *wrapper); + +bool +RemapWrapper(JSContext *cx, JSObject *wobj, JSObject *newTarget); + +JS_FRIEND_API(bool) +RemapAllWrappersForObject(JSContext *cx, JSObject *oldTarget, + JSObject *newTarget); + +// API to recompute all cross-compartment wrappers whose source and target +// match the given filters. +JS_FRIEND_API(bool) +RecomputeWrappers(JSContext *cx, const CompartmentFilter &sourceFilter, + const CompartmentFilter &targetFilter); + +/* + * This auto class should be used around any code, such as brain transplants, + * that may touch dead zones. Brain transplants can cause problems + * because they operate on all compartments, whether live or dead. A brain + * transplant can cause a formerly dead object to be "reanimated" by causing a + * read or write barrier to be invoked on it during the transplant. In this way, + * a zone becomes a zombie, kept alive by repeatedly consuming + * (transplanted) brains. + * + * To work around this issue, we observe when mark bits are set on objects in + * dead zones. If this happens during a brain transplant, we do a full, + * non-incremental GC at the end of the brain transplant. This will clean up any + * objects that were improperly marked. + */ +struct JS_FRIEND_API(AutoMaybeTouchDeadZones) +{ + // The version that takes an object just uses it for its runtime. + explicit AutoMaybeTouchDeadZones(JSContext *cx); + explicit AutoMaybeTouchDeadZones(JSObject *obj); + ~AutoMaybeTouchDeadZones(); + + private: + JSRuntime *runtime; + unsigned markCount; + bool inIncremental; + bool manipulatingDeadZones; +}; + +} /* namespace js */ + +#endif /* jswrapper_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Alignment.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Alignment.h new file mode 100644 index 0000000000..0ac8a48779 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Alignment.h @@ -0,0 +1,139 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Functionality related to memory alignment. */ + +#ifndef mozilla_Alignment_h +#define mozilla_Alignment_h + +#include +#include + +namespace mozilla { + +/* + * This class, and the corresponding macro MOZ_ALIGNOF, figures out how many + * bytes of alignment a given type needs. + */ +template +class AlignmentFinder +{ + struct Aligner + { + char mChar; + T mT; + }; + +public: + static const size_t alignment = sizeof(Aligner) - sizeof(T); +}; + +#define MOZ_ALIGNOF(T) mozilla::AlignmentFinder::alignment + +/* + * Declare the MOZ_ALIGNED_DECL macro for declaring aligned types. + * + * For instance, + * + * MOZ_ALIGNED_DECL(char arr[2], 8); + * + * will declare a two-character array |arr| aligned to 8 bytes. + */ + +#if defined(__GNUC__) +# define MOZ_ALIGNED_DECL(_type, _align) \ + _type __attribute__((aligned(_align))) +#elif defined(_MSC_VER) +# define MOZ_ALIGNED_DECL(_type, _align) \ + __declspec(align(_align)) _type +#else +# warning "We don't know how to align variables on this compiler." +# define MOZ_ALIGNED_DECL(_type, _align) _type +#endif + +/* + * AlignedElem is a structure whose alignment is guaranteed to be at least N + * bytes. + * + * We support 1, 2, 4, 8, and 16-bit alignment. + */ +template +struct AlignedElem; + +/* + * We have to specialize this template because GCC doesn't like + * __attribute__((aligned(foo))) where foo is a template parameter. + */ + +template<> +struct AlignedElem<1> +{ + MOZ_ALIGNED_DECL(uint8_t elem, 1); +}; + +template<> +struct AlignedElem<2> +{ + MOZ_ALIGNED_DECL(uint8_t elem, 2); +}; + +template<> +struct AlignedElem<4> +{ + MOZ_ALIGNED_DECL(uint8_t elem, 4); +}; + +template<> +struct AlignedElem<8> +{ + MOZ_ALIGNED_DECL(uint8_t elem, 8); +}; + +template<> +struct AlignedElem<16> +{ + MOZ_ALIGNED_DECL(uint8_t elem, 16); +}; + +/* + * This utility pales in comparison to Boost's aligned_storage. The utility + * simply assumes that uint64_t is enough alignment for anyone. This may need + * to be extended one day... + * + * As an important side effect, pulling the storage into this template is + * enough obfuscation to confuse gcc's strict-aliasing analysis into not giving + * false negatives when we cast from the char buffer to whatever type we've + * constructed using the bytes. + */ +template +struct AlignedStorage +{ + union U + { + char mBytes[Nbytes]; + uint64_t mDummy; + } u; + + const void* addr() const { return u.mBytes; } + void* addr() { return u.mBytes; } +}; + +template +struct AlignedStorage2 +{ + union U + { + char mBytes[sizeof(T)]; + uint64_t mDummy; + } u; + + const T* addr() const { return reinterpret_cast(u.mBytes); } + T* addr() { return static_cast(static_cast(u.mBytes)); } +}; + +} /* namespace mozilla */ + +#endif /* mozilla_Alignment_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/AllocPolicy.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/AllocPolicy.h new file mode 100644 index 0000000000..357c632a02 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/AllocPolicy.h @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * An allocation policy concept, usable for structures and algorithms to + * control how memory is allocated and how failures are handled. + */ + +#ifndef mozilla_AllocPolicy_h +#define mozilla_AllocPolicy_h + +#include +#include + +namespace mozilla { + +/* + * Allocation policies are used to implement the standard allocation behaviors + * in a customizable way. Additionally, custom behaviors may be added to these + * behaviors, such as additionally reporting an error through an out-of-band + * mechanism when OOM occurs. The concept modeled here is as follows: + * + * - public copy constructor, assignment, destructor + * - void* malloc_(size_t) + * Responsible for OOM reporting when null is returned. + * - void* calloc_(size_t) + * Responsible for OOM reporting when null is returned. + * - void* realloc_(void*, size_t, size_t) + * Responsible for OOM reporting when null is returned. The *used* bytes + * of the previous buffer is passed in (rather than the old allocation + * size), in addition to the *new* allocation size requested. + * - void free_(void*) + * - void reportAllocOverflow() const + * Called on allocation overflow (that is, an allocation implicitly tried + * to allocate more than the available memory space -- think allocating an + * array of large-size objects, where N * size overflows) before null is + * returned. + * + * mfbt provides (and typically uses by default) only MallocAllocPolicy, which + * does nothing more than delegate to the malloc/alloc/free functions. + */ + +/* + * A policy that straightforwardly uses malloc/calloc/realloc/free and adds no + * extra behaviors. + */ +class MallocAllocPolicy +{ +public: + void* malloc_(size_t aBytes) + { + return malloc(aBytes); + } + + void* calloc_(size_t aBytes) + { + return calloc(aBytes, 1); + } + + void* realloc_(void* aPtr, size_t aOldBytes, size_t aBytes) + { + return realloc(aPtr, aBytes); + } + + void free_(void* aPtr) + { + free(aPtr); + } + + void reportAllocOverflow() const + { + } +}; + +} // namespace mozilla + +#endif /* mozilla_AllocPolicy_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Array.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Array.h new file mode 100644 index 0000000000..b2ab578d4b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Array.h @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A compile-time constant-length array with bounds-checking assertions. */ + +#ifndef mozilla_Array_h +#define mozilla_Array_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" + +#include + +namespace mozilla { + +template +class Array +{ + T mArr[Length]; + +public: + T& operator[](size_t aIndex) + { + MOZ_ASSERT(aIndex < Length); + return mArr[aIndex]; + } + + const T& operator[](size_t aIndex) const + { + MOZ_ASSERT(aIndex < Length); + return mArr[aIndex]; + } +}; + +template +class Array +{ +public: + T& operator[](size_t aIndex) + { + MOZ_CRASH("indexing into zero-length array"); + } + + const T& operator[](size_t aIndex) const + { + MOZ_CRASH("indexing into zero-length array"); + } +}; + +} /* namespace mozilla */ + +#endif /* mozilla_Array_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ArrayUtils.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ArrayUtils.h new file mode 100644 index 0000000000..44f5980c44 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ArrayUtils.h @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Implements various helper functions related to arrays. + */ + +#ifndef mozilla_ArrayUtils_h +#define mozilla_ArrayUtils_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" + +#include + +#ifdef __cplusplus + +#include "mozilla/Alignment.h" +#include "mozilla/Array.h" +#include "mozilla/TypeTraits.h" + +namespace mozilla { + +/* + * Safely subtract two pointers when it is known that aEnd >= aBegin. This + * avoids the common compiler bug that if (size_t(aEnd) - size_t(aBegin)) has + * the MSB set, the unsigned subtraction followed by right shift will produce + * -1, or size_t(-1), instead of the real difference. + */ +template +MOZ_ALWAYS_INLINE size_t +PointerRangeSize(T* aBegin, T* aEnd) +{ + MOZ_ASSERT(aEnd >= aBegin); + return (size_t(aEnd) - size_t(aBegin)) / sizeof(T); +} + +/* + * Compute the length of an array with constant length. (Use of this method + * with a non-array pointer will not compile.) + * + * Beware of the implicit trailing '\0' when using this with string constants. + */ +template +MOZ_CONSTEXPR size_t +ArrayLength(T (&aArr)[N]) +{ + return N; +} + +template +MOZ_CONSTEXPR size_t +ArrayLength(const Array& aArr) +{ + return N; +} + +/* + * Compute the address one past the last element of a constant-length array. + * + * Beware of the implicit trailing '\0' when using this with string constants. + */ +template +MOZ_CONSTEXPR T* +ArrayEnd(T (&aArr)[N]) +{ + return aArr + ArrayLength(aArr); +} + +template +MOZ_CONSTEXPR T* +ArrayEnd(Array& aArr) +{ + return &aArr[0] + ArrayLength(aArr); +} + +template +MOZ_CONSTEXPR const T* +ArrayEnd(const Array& aArr) +{ + return &aArr[0] + ArrayLength(aArr); +} + +namespace detail { + +template +struct AlignedChecker +{ + static void + test(Pointee* aPtr) + { + MOZ_ASSERT((uintptr_t(aPtr) % MOZ_ALIGNOF(AlignType)) == 0, + "performing a range-check with a misaligned pointer"); + } +}; + +template +struct AlignedChecker +{ + static void + test(Pointee* aPtr) + { + } +}; + +} // namespace detail + +/** + * Determines whether |aPtr| points at an object in the range [aBegin, aEnd). + * + * |aPtr| must have the same alignment as |aBegin| and |aEnd|. This usually + * should be achieved by ensuring |aPtr| points at a |U|, not just that it + * points at a |T|. + * + * It is a usage error for any argument to be misaligned. + * + * It's okay for T* to be void*, and if so U* may also be void*. In the latter + * case no argument is required to be aligned (obviously, as void* implies no + * particular alignment). + */ +template +inline typename EnableIf::value || + IsBaseOf::value || + IsVoid::value, + bool>::Type +IsInRange(T* aPtr, U* aBegin, U* aEnd) +{ + MOZ_ASSERT(aBegin <= aEnd); + detail::AlignedChecker::test(aPtr); + detail::AlignedChecker::test(aBegin); + detail::AlignedChecker::test(aEnd); + return aBegin <= static_cast(aPtr) && static_cast(aPtr) < aEnd; +} + +/** + * Convenience version of the above method when the valid range is specified as + * uintptr_t values. As above, |aPtr| must be aligned, and |aBegin| and |aEnd| + * must be aligned with respect to |T|. + */ +template +inline bool +IsInRange(T* aPtr, uintptr_t aBegin, uintptr_t aEnd) +{ + return IsInRange(aPtr, + reinterpret_cast(aBegin), reinterpret_cast(aEnd)); +} + +namespace detail { + +/* + * Helper for the MOZ_ARRAY_LENGTH() macro to make the length a typesafe + * compile-time constant even on compilers lacking constexpr support. + */ +template +char (&ArrayLengthHelper(T (&array)[N]))[N]; + +} /* namespace detail */ + +} /* namespace mozilla */ + +#endif /* __cplusplus */ + +/* + * MOZ_ARRAY_LENGTH() is an alternative to mozilla::ArrayLength() for C files + * that can't use C++ template functions and for static_assert() calls that + * can't call ArrayLength() when it is not a C++11 constexpr function. + */ +#ifdef __cplusplus +# define MOZ_ARRAY_LENGTH(array) sizeof(mozilla::detail::ArrayLengthHelper(array)) +#else +# define MOZ_ARRAY_LENGTH(array) (sizeof(array)/sizeof((array)[0])) +#endif + +#endif /* mozilla_ArrayUtils_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Assertions.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Assertions.h new file mode 100644 index 0000000000..a463b2768d --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Assertions.h @@ -0,0 +1,534 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Implementations of runtime and static assertion macros for C and C++. */ + +#ifndef mozilla_Assertions_h +#define mozilla_Assertions_h + +#if defined(MOZILLA_INTERNAL_API) && defined(__cplusplus) +#define MOZ_DUMP_ASSERTION_STACK +#endif + +#include "mozilla/Attributes.h" +#include "mozilla/Compiler.h" +#include "mozilla/Likely.h" +#include "mozilla/MacroArgs.h" +#ifdef MOZ_DUMP_ASSERTION_STACK +#include "nsTraceRefcnt.h" +#endif + +#include +#include +#include +#ifdef WIN32 + /* + * TerminateProcess and GetCurrentProcess are defined in , which + * further depends on . We hardcode these few definitions manually + * because those headers clutter the global namespace with a significant + * number of undesired macros and symbols. + */ +# ifdef __cplusplus +extern "C" { +# endif +__declspec(dllimport) int __stdcall +TerminateProcess(void* hProcess, unsigned int uExitCode); +__declspec(dllimport) void* __stdcall GetCurrentProcess(void); +# ifdef __cplusplus +} +# endif +#else +# include +#endif +#ifdef ANDROID +# include +#endif + +/* + * MOZ_STATIC_ASSERT may be used to assert a condition *at compile time* in C. + * In C++11, static_assert is provided by the compiler to the same effect. + * This can be useful when you make certain assumptions about what must hold for + * optimal, or even correct, behavior. For example, you might assert that the + * size of a struct is a multiple of the target architecture's word size: + * + * struct S { ... }; + * // C + * MOZ_STATIC_ASSERT(sizeof(S) % sizeof(size_t) == 0, + * "S should be a multiple of word size for efficiency"); + * // C++11 + * static_assert(sizeof(S) % sizeof(size_t) == 0, + * "S should be a multiple of word size for efficiency"); + * + * This macro can be used in any location where both an extern declaration and a + * typedef could be used. + */ +#ifndef __cplusplus + /* + * Some of the definitions below create an otherwise-unused typedef. This + * triggers compiler warnings with some versions of gcc, so mark the typedefs + * as permissibly-unused to disable the warnings. + */ +# if defined(__GNUC__) +# define MOZ_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +# else +# define MOZ_STATIC_ASSERT_UNUSED_ATTRIBUTE /* nothing */ +# endif +# define MOZ_STATIC_ASSERT_GLUE1(x, y) x##y +# define MOZ_STATIC_ASSERT_GLUE(x, y) MOZ_STATIC_ASSERT_GLUE1(x, y) +# if defined(__SUNPRO_CC) + /* + * The Sun Studio C++ compiler is buggy when declaring, inside a function, + * another extern'd function with an array argument whose length contains a + * sizeof, triggering the error message "sizeof expression not accepted as + * size of array parameter". This bug (6688515, not public yet) would hit + * defining moz_static_assert as a function, so we always define an extern + * array for Sun Studio. + * + * We include the line number in the symbol name in a best-effort attempt + * to avoid conflicts (see below). + */ +# define MOZ_STATIC_ASSERT(cond, reason) \ + extern char MOZ_STATIC_ASSERT_GLUE(moz_static_assert, __LINE__)[(cond) ? 1 : -1] +# elif defined(__COUNTER__) + /* + * If there was no preferred alternative, use a compiler-agnostic version. + * + * Note that the non-__COUNTER__ version has a bug in C++: it can't be used + * in both |extern "C"| and normal C++ in the same translation unit. (Alas + * |extern "C"| isn't allowed in a function.) The only affected compiler + * we really care about is gcc 4.2. For that compiler and others like it, + * we include the line number in the function name to do the best we can to + * avoid conflicts. These should be rare: a conflict would require use of + * MOZ_STATIC_ASSERT on the same line in separate files in the same + * translation unit, *and* the uses would have to be in code with + * different linkage, *and* the first observed use must be in C++-linkage + * code. + */ +# define MOZ_STATIC_ASSERT(cond, reason) \ + typedef int MOZ_STATIC_ASSERT_GLUE(moz_static_assert, __COUNTER__)[(cond) ? 1 : -1] MOZ_STATIC_ASSERT_UNUSED_ATTRIBUTE +# else +# define MOZ_STATIC_ASSERT(cond, reason) \ + extern void MOZ_STATIC_ASSERT_GLUE(moz_static_assert, __LINE__)(int arg[(cond) ? 1 : -1]) MOZ_STATIC_ASSERT_UNUSED_ATTRIBUTE +# endif + +#define MOZ_STATIC_ASSERT_IF(cond, expr, reason) MOZ_STATIC_ASSERT(!(cond) || (expr), reason) +#else +#define MOZ_STATIC_ASSERT_IF(cond, expr, reason) static_assert(!(cond) || (expr), reason) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Prints |aStr| as an assertion failure (using aFilename and aLine as the + * location of the assertion) to the standard debug-output channel. + * + * Usually you should use MOZ_ASSERT or MOZ_CRASH instead of this method. This + * method is primarily for internal use in this header, and only secondarily + * for use in implementing release-build assertions. + */ +static MOZ_ALWAYS_INLINE void +MOZ_ReportAssertionFailure(const char* aStr, const char* aFilename, int aLine) + MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS +{ +#ifdef ANDROID + __android_log_print(ANDROID_LOG_FATAL, "MOZ_Assert", + "Assertion failure: %s, at %s:%d\n", + aStr, aFilename, aLine); +#else + fprintf(stderr, "Assertion failure: %s, at %s:%d\n", aStr, aFilename, aLine); +#ifdef MOZ_DUMP_ASSERTION_STACK + nsTraceRefcnt::WalkTheStack(stderr); +#endif + fflush(stderr); +#endif +} + +static MOZ_ALWAYS_INLINE void +MOZ_ReportCrash(const char* aStr, const char* aFilename, int aLine) + MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS +{ +#ifdef ANDROID + __android_log_print(ANDROID_LOG_FATAL, "MOZ_CRASH", + "Hit MOZ_CRASH(%s) at %s:%d\n", aStr, aFilename, aLine); +#else + fprintf(stderr, "Hit MOZ_CRASH(%s) at %s:%d\n", aStr, aFilename, aLine); +#ifdef MOZ_DUMP_ASSERTION_STACK + nsTraceRefcnt::WalkTheStack(stderr); +#endif + fflush(stderr); +#endif +} + +/** + * MOZ_REALLY_CRASH is used in the implementation of MOZ_CRASH(). You should + * call MOZ_CRASH instead. + */ +#if defined(_MSC_VER) + /* + * On MSVC use the __debugbreak compiler intrinsic, which produces an inline + * (not nested in a system function) breakpoint. This distinctively invokes + * Breakpad without requiring system library symbols on all stack-processing + * machines, as a nested breakpoint would require. + * + * We use TerminateProcess with the exit code aborting would generate + * because we don't want to invoke atexit handlers, destructors, library + * unload handlers, and so on when our process might be in a compromised + * state. + * + * We don't use abort() because it'd cause Windows to annoyingly pop up the + * process error dialog multiple times. See bug 345118 and bug 426163. + * + * We follow TerminateProcess() with a call to MOZ_NoReturn() so that the + * compiler doesn't hassle us to provide a return statement after a + * MOZ_REALLY_CRASH() call. + * + * (Technically these are Windows requirements, not MSVC requirements. But + * practically you need MSVC for debugging, and we only ship builds created + * by MSVC, so doing it this way reduces complexity.) + */ + +__declspec(noreturn) __inline void MOZ_NoReturn() {} + +# ifdef __cplusplus +# define MOZ_REALLY_CRASH() \ + do { \ + ::__debugbreak(); \ + *((volatile int*) NULL) = 123; \ + ::TerminateProcess(::GetCurrentProcess(), 3); \ + ::MOZ_NoReturn(); \ + } while (0) +# else +# define MOZ_REALLY_CRASH() \ + do { \ + __debugbreak(); \ + *((volatile int*) NULL) = 123; \ + TerminateProcess(GetCurrentProcess(), 3); \ + MOZ_NoReturn(); \ + } while (0) +# endif +#else +# ifdef __cplusplus +# define MOZ_REALLY_CRASH() \ + do { \ + *((volatile int*) NULL) = 123; \ + ::abort(); \ + } while (0) +# else +# define MOZ_REALLY_CRASH() \ + do { \ + *((volatile int*) NULL) = 123; \ + abort(); \ + } while (0) +# endif +#endif + +/* + * MOZ_CRASH([explanation-string]) crashes the program, plain and simple, in a + * Breakpad-compatible way, in both debug and release builds. + * + * MOZ_CRASH is a good solution for "handling" failure cases when you're + * unwilling or unable to handle them more cleanly -- for OOM, for likely memory + * corruption, and so on. It's also a good solution if you need safe behavior + * in release builds as well as debug builds. But if the failure is one that + * should be debugged and fixed, MOZ_ASSERT is generally preferable. + * + * The optional explanation-string, if provided, must be a string literal + * explaining why we're crashing. This argument is intended for use with + * MOZ_CRASH() calls whose rationale is non-obvious; don't use it if it's + * obvious why we're crashing. + * + * If we're a DEBUG build and we crash at a MOZ_CRASH which provides an + * explanation-string, we print the string to stderr. Otherwise, we don't + * print anything; this is because we want MOZ_CRASH to be 100% safe in release + * builds, and it's hard to print to stderr safely when memory might have been + * corrupted. + */ +#ifndef DEBUG +# define MOZ_CRASH(...) MOZ_REALLY_CRASH() +#else +# define MOZ_CRASH(...) \ + do { \ + MOZ_ReportCrash("" __VA_ARGS__, __FILE__, __LINE__); \ + MOZ_REALLY_CRASH(); \ + } while (0) +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/* + * MOZ_ASSERT(expr [, explanation-string]) asserts that |expr| must be truthy in + * debug builds. If it is, execution continues. Otherwise, an error message + * including the expression and the explanation-string (if provided) is printed, + * an attempt is made to invoke any existing debugger, and execution halts. + * MOZ_ASSERT is fatal: no recovery is possible. Do not assert a condition + * which can correctly be falsy. + * + * The optional explanation-string, if provided, must be a string literal + * explaining the assertion. It is intended for use with assertions whose + * correctness or rationale is non-obvious, and for assertions where the "real" + * condition being tested is best described prosaically. Don't provide an + * explanation if it's not actually helpful. + * + * // No explanation needed: pointer arguments often must not be NULL. + * MOZ_ASSERT(arg); + * + * // An explanation can be helpful to explain exactly how we know an + * // assertion is valid. + * MOZ_ASSERT(state == WAITING_FOR_RESPONSE, + * "given that and , we must have..."); + * + * // Or it might disambiguate multiple identical (save for their location) + * // assertions of the same expression. + * MOZ_ASSERT(getSlot(PRIMITIVE_THIS_SLOT).isUndefined(), + * "we already set [[PrimitiveThis]] for this Boolean object"); + * MOZ_ASSERT(getSlot(PRIMITIVE_THIS_SLOT).isUndefined(), + * "we already set [[PrimitiveThis]] for this String object"); + * + * MOZ_ASSERT has no effect in non-debug builds. It is designed to catch bugs + * *only* during debugging, not "in the field". If you want the latter, use + * MOZ_RELEASE_ASSERT, which applies to non-debug builds as well. + */ + +/* + * Implement MOZ_VALIDATE_ASSERT_CONDITION_TYPE, which is used to guard against + * accidentally passing something unintended in lieu of an assertion condition. + */ + +#ifdef __cplusplus +# if defined(__clang__) +# define MOZ_SUPPORT_ASSERT_CONDITION_TYPE_VALIDATION +# elif defined(__GNUC__) +// B2G GCC 4.4 has insufficient decltype support. +# if MOZ_GCC_VERSION_AT_LEAST(4, 5, 0) +# define MOZ_SUPPORT_ASSERT_CONDITION_TYPE_VALIDATION +# endif +# elif defined(_MSC_VER) +// Disabled for now because of insufficient decltype support. Bug 1004028. +# endif +#endif + +#ifdef MOZ_SUPPORT_ASSERT_CONDITION_TYPE_VALIDATION +# include "mozilla/TypeTraits.h" +namespace mozilla { +namespace detail { + +template +struct IsFunction +{ + static const bool value = false; +}; + +template +struct IsFunction +{ + static const bool value = true; +}; + +template +void ValidateAssertConditionType() +{ + typedef typename RemoveReference::Type ValueT; + static_assert(!IsArray::value, + "Expected boolean assertion condition, got an array or a " + "string!"); + static_assert(!IsFunction::value, + "Expected boolean assertion condition, got a function! Did " + "you intend to call that function?"); + static_assert(!IsFloatingPoint::value, + "It's often a bad idea to assert that a floating-point number " + "is nonzero, because such assertions tend to intermittently " + "fail. Shouldn't your code gracefully handle this case instead " + "of asserting? Anyway, if you really want to do that, write an " + "explicit boolean condition, like !!x or x!=0."); +} + +} // namespace detail +} // namespace mozilla +# define MOZ_VALIDATE_ASSERT_CONDITION_TYPE(x) \ + mozilla::detail::ValidateAssertConditionType() +#else +# define MOZ_VALIDATE_ASSERT_CONDITION_TYPE(x) +#endif + +/* First the single-argument form. */ +#define MOZ_ASSERT_HELPER1(expr) \ + do { \ + MOZ_VALIDATE_ASSERT_CONDITION_TYPE(expr); \ + if (MOZ_UNLIKELY(!(expr))) { \ + MOZ_ReportAssertionFailure(#expr, __FILE__, __LINE__); \ + MOZ_REALLY_CRASH(); \ + } \ + } while (0) +/* Now the two-argument form. */ +#define MOZ_ASSERT_HELPER2(expr, explain) \ + do { \ + MOZ_VALIDATE_ASSERT_CONDITION_TYPE(expr); \ + if (MOZ_UNLIKELY(!(expr))) { \ + MOZ_ReportAssertionFailure(#expr " (" explain ")", __FILE__, __LINE__); \ + MOZ_REALLY_CRASH(); \ + } \ + } while (0) + +#define MOZ_RELEASE_ASSERT_GLUE(a, b) a b +#define MOZ_RELEASE_ASSERT(...) \ + MOZ_RELEASE_ASSERT_GLUE( \ + MOZ_PASTE_PREFIX_AND_ARG_COUNT(MOZ_ASSERT_HELPER, __VA_ARGS__), \ + (__VA_ARGS__)) + +#ifdef DEBUG +# define MOZ_ASSERT(...) MOZ_RELEASE_ASSERT(__VA_ARGS__) +#else +# define MOZ_ASSERT(...) do { } while (0) +#endif /* DEBUG */ + +/* + * MOZ_NIGHTLY_ASSERT is defined for both debug and release builds on the + * Nightly channel, but only debug builds on Aurora, Beta, and Release. + */ +#if defined(NIGHTLY_BUILD) +# define MOZ_NIGHTLY_ASSERT(...) MOZ_RELEASE_ASSERT(__VA_ARGS__) +#else +# define MOZ_NIGHTLY_ASSERT(...) MOZ_ASSERT(__VA_ARGS__) +#endif + +/* + * MOZ_ASSERT_IF(cond1, cond2) is equivalent to MOZ_ASSERT(cond2) if cond1 is + * true. + * + * MOZ_ASSERT_IF(isPrime(num), num == 2 || isOdd(num)); + * + * As with MOZ_ASSERT, MOZ_ASSERT_IF has effect only in debug builds. It is + * designed to catch bugs during debugging, not "in the field". + */ +#ifdef DEBUG +# define MOZ_ASSERT_IF(cond, expr) \ + do { \ + if (cond) { \ + MOZ_ASSERT(expr); \ + } \ + } while (0) +#else +# define MOZ_ASSERT_IF(cond, expr) do { } while (0) +#endif + +/* + * MOZ_ASSUME_UNREACHABLE_MARKER() expands to an expression which states that + * it is undefined behavior for execution to reach this point. No guarantees + * are made about what will happen if this is reached at runtime. Most code + * should use MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE because it has extra + * asserts. + */ +#if defined(__clang__) +# define MOZ_ASSUME_UNREACHABLE_MARKER() __builtin_unreachable() +#elif defined(__GNUC__) + /* + * __builtin_unreachable() was implemented in gcc 4.5. If we don't have + * that, call a noreturn function; abort() will do nicely. Qualify the call + * in C++ in case there's another abort() visible in local scope. + */ +# if MOZ_GCC_VERSION_AT_LEAST(4, 5, 0) +# define MOZ_ASSUME_UNREACHABLE_MARKER() __builtin_unreachable() +# else +# ifdef __cplusplus +# define MOZ_ASSUME_UNREACHABLE_MARKER() ::abort() +# else +# define MOZ_ASSUME_UNREACHABLE_MARKER() abort() +# endif +# endif +#elif defined(_MSC_VER) +# define MOZ_ASSUME_UNREACHABLE_MARKER() __assume(0) +#else +# ifdef __cplusplus +# define MOZ_ASSUME_UNREACHABLE_MARKER() ::abort() +# else +# define MOZ_ASSUME_UNREACHABLE_MARKER() abort() +# endif +#endif + +/* + * MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE([reason]) tells the compiler that it + * can assume that the macro call cannot be reached during execution. This lets + * the compiler generate better-optimized code under some circumstances, at the + * expense of the program's behavior being undefined if control reaches the + * MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE. + * + * In Gecko, you probably should not use this macro outside of performance- or + * size-critical code, because it's unsafe. If you don't care about code size + * or performance, you should probably use MOZ_ASSERT or MOZ_CRASH. + * + * SpiderMonkey is a different beast, and there it's acceptable to use + * MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE more widely. + * + * Note that MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE is noreturn, so it's valid + * not to return a value following a MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE + * call. + * + * Example usage: + * + * enum ValueType { + * VALUE_STRING, + * VALUE_INT, + * VALUE_FLOAT + * }; + * + * int ptrToInt(ValueType type, void* value) { + * { + * // We know for sure that type is either INT or FLOAT, and we want this + * // code to run as quickly as possible. + * switch (type) { + * case VALUE_INT: + * return *(int*) value; + * case VALUE_FLOAT: + * return (int) *(float*) value; + * default: + * MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("Unexpected ValueType"); + * } + * } + */ + +/* + * Assert in all debug builds plus the Nightly channel's release builds. Take + * this extra testing precaution because hitting MOZ_ASSUME_UNREACHABLE_MARKER + * could trigger exploitable undefined behavior. + */ +#define MOZ_ASSERT_UNREACHABLE(reason) \ + MOZ_NIGHTLY_ASSERT(false, "MOZ_ASSERT_UNREACHABLE: " reason) + +#define MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE(reason) \ + do { \ + MOZ_ASSERT_UNREACHABLE(reason); \ + MOZ_ASSUME_UNREACHABLE_MARKER(); \ + } while (0) + +/* + * TODO: Bug 990764: Audit all MOZ_ASSUME_UNREACHABLE calls and replace them + * with MOZ_ASSERT_UNREACHABLE, MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE, or + * MOZ_CRASH. For now, preserve the macro's same meaning of unreachable. + */ +#define MOZ_ASSUME_UNREACHABLE(reason) \ + MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE(reason) + +/* + * MOZ_ALWAYS_TRUE(expr) and MOZ_ALWAYS_FALSE(expr) always evaluate the provided + * expression, in debug builds and in release builds both. Then, in debug + * builds only, the value of the expression is asserted either true or false + * using MOZ_ASSERT. + */ +#ifdef DEBUG +# define MOZ_ALWAYS_TRUE(expr) MOZ_ASSERT((expr)) +# define MOZ_ALWAYS_FALSE(expr) MOZ_ASSERT(!(expr)) +#else +# define MOZ_ALWAYS_TRUE(expr) ((void)(expr)) +# define MOZ_ALWAYS_FALSE(expr) ((void)(expr)) +#endif + +#undef MOZ_DUMP_ASSERTION_STACK + +#endif /* mozilla_Assertions_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Atomics.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Atomics.h new file mode 100644 index 0000000000..71d95c61ba --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Atomics.h @@ -0,0 +1,1171 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Implements (almost always) lock-free atomic operations. The operations here + * are a subset of that which can be found in C++11's header, with a + * different API to enforce consistent memory ordering constraints. + * + * Anyone caught using |volatile| for inter-thread memory safety needs to be + * sent a copy of this header and the C++11 standard. + */ + +#ifndef mozilla_Atomics_h +#define mozilla_Atomics_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Compiler.h" +#include "mozilla/TypeTraits.h" + +#include + +/* + * Our minimum deployment target on clang/OS X is OS X 10.6, whose SDK + * does not have . So be sure to check for support + * along with C++0x support. + */ +#if defined(__clang__) || defined(__GNUC__) + /* + * Clang doesn't like from libstdc++ before 4.7 due to the + * loose typing of the atomic builtins. GCC 4.5 and 4.6 lacks inline + * definitions for unspecialized std::atomic and causes linking errors. + * Therefore, we require at least 4.7.0 for using libstdc++. + */ +# if MOZ_USING_LIBSTDCXX && MOZ_LIBSTDCXX_VERSION_AT_LEAST(4, 7, 0) +# define MOZ_HAVE_CXX11_ATOMICS +# elif MOZ_USING_LIBCXX +# define MOZ_HAVE_CXX11_ATOMICS +# endif +#elif defined(_MSC_VER) && _MSC_VER >= 1700 +# if defined(DEBUG) + /* + * Provide our own failure code since we're having trouble linking to + * std::_Debug_message (bug 982310). + */ +# define _INVALID_MEMORY_ORDER MOZ_CRASH("Invalid memory order") +# endif +# define MOZ_HAVE_CXX11_ATOMICS +#endif + +namespace mozilla { + +/** + * An enum of memory ordering possibilities for atomics. + * + * Memory ordering is the observable state of distinct values in memory. + * (It's a separate concept from atomicity, which concerns whether an + * operation can ever be observed in an intermediate state. Don't + * conflate the two!) Given a sequence of operations in source code on + * memory, it is *not* always the case that, at all times and on all + * cores, those operations will appear to have occurred in that exact + * sequence. First, the compiler might reorder that sequence, if it + * thinks another ordering will be more efficient. Second, the CPU may + * not expose so consistent a view of memory. CPUs will often perform + * their own instruction reordering, above and beyond that performed by + * the compiler. And each core has its own memory caches, and accesses + * (reads and writes both) to "memory" may only resolve to out-of-date + * cache entries -- not to the "most recently" performed operation in + * some global sense. Any access to a value that may be used by + * multiple threads, potentially across multiple cores, must therefore + * have a memory ordering imposed on it, for all code on all + * threads/cores to have a sufficiently coherent worldview. + * + * http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync and + * http://en.cppreference.com/w/cpp/atomic/memory_order go into more + * detail on all this, including examples of how each mode works. + * + * Note that for simplicity and practicality, not all of the modes in + * C++11 are supported. The missing C++11 modes are either subsumed by + * the modes we provide below, or not relevant for the CPUs we support + * in Gecko. These three modes are confusing enough as it is! + */ +enum MemoryOrdering { + /* + * Relaxed ordering is the simplest memory ordering: none at all. + * When the result of a write is observed, nothing may be inferred + * about other memory. Writes ostensibly performed "before" on the + * writing thread may not yet be visible. Writes performed "after" on + * the writing thread may already be visible, if the compiler or CPU + * reordered them. (The latter can happen if reads and/or writes get + * held up in per-processor caches.) Relaxed ordering means + * operations can always use cached values (as long as the actual + * updates to atomic values actually occur, correctly, eventually), so + * it's usually the fastest sort of atomic access. For this reason, + * *it's also the most dangerous kind of access*. + * + * Relaxed ordering is good for things like process-wide statistics + * counters that don't need to be consistent with anything else, so + * long as updates themselves are atomic. (And so long as any + * observations of that value can tolerate being out-of-date -- if you + * need some sort of up-to-date value, you need some sort of other + * synchronizing operation.) It's *not* good for locks, mutexes, + * reference counts, etc. that mediate access to other memory, or must + * be observably consistent with other memory. + * + * x86 architectures don't take advantage of the optimization + * opportunities that relaxed ordering permits. Thus it's possible + * that using relaxed ordering will "work" on x86 but fail elsewhere + * (ARM, say, which *does* implement non-sequentially-consistent + * relaxed ordering semantics). Be extra-careful using relaxed + * ordering if you can't easily test non-x86 architectures! + */ + Relaxed, + + /* + * When an atomic value is updated with ReleaseAcquire ordering, and + * that new value is observed with ReleaseAcquire ordering, prior + * writes (atomic or not) are also observable. What ReleaseAcquire + * *doesn't* give you is any observable ordering guarantees for + * ReleaseAcquire-ordered operations on different objects. For + * example, if there are two cores that each perform ReleaseAcquire + * operations on separate objects, each core may or may not observe + * the operations made by the other core. The only way the cores can + * be synchronized with ReleaseAcquire is if they both + * ReleaseAcquire-access the same object. This implies that you can't + * necessarily describe some global total ordering of ReleaseAcquire + * operations. + * + * ReleaseAcquire ordering is good for (as the name implies) atomic + * operations on values controlling ownership of things: reference + * counts, mutexes, and the like. However, if you are thinking about + * using these to implement your own locks or mutexes, you should take + * a good, hard look at actual lock or mutex primitives first. + */ + ReleaseAcquire, + + /* + * When an atomic value is updated with SequentiallyConsistent + * ordering, all writes observable when the update is observed, just + * as with ReleaseAcquire ordering. But, furthermore, a global total + * ordering of SequentiallyConsistent operations *can* be described. + * For example, if two cores perform SequentiallyConsistent operations + * on separate objects, one core will observably perform its update + * (and all previous operations will have completed), then the other + * core will observably perform its update (and all previous + * operations will have completed). (Although those previous + * operations aren't themselves ordered -- they could be intermixed, + * or ordered if they occur on atomic values with ordering + * requirements.) SequentiallyConsistent is the *simplest and safest* + * ordering of atomic operations -- it's always as if one operation + * happens, then another, then another, in some order -- and every + * core observes updates to happen in that single order. Because it + * has the most synchronization requirements, operations ordered this + * way also tend to be slowest. + * + * SequentiallyConsistent ordering can be desirable when multiple + * threads observe objects, and they all have to agree on the + * observable order of changes to them. People expect + * SequentiallyConsistent ordering, even if they shouldn't, when + * writing code, atomic or otherwise. SequentiallyConsistent is also + * the ordering of choice when designing lockless data structures. If + * you don't know what order to use, use this one. + */ + SequentiallyConsistent, +}; + +} // namespace mozilla + +// Build up the underlying intrinsics. +#ifdef MOZ_HAVE_CXX11_ATOMICS + +# include + +namespace mozilla { +namespace detail { + +/* + * We provide CompareExchangeFailureOrder to work around a bug in some + * versions of GCC's header. See bug 898491. + */ +template struct AtomicOrderConstraints; + +template<> +struct AtomicOrderConstraints +{ + static const std::memory_order AtomicRMWOrder = std::memory_order_relaxed; + static const std::memory_order LoadOrder = std::memory_order_relaxed; + static const std::memory_order StoreOrder = std::memory_order_relaxed; + static const std::memory_order CompareExchangeFailureOrder = + std::memory_order_relaxed; +}; + +template<> +struct AtomicOrderConstraints +{ + static const std::memory_order AtomicRMWOrder = std::memory_order_acq_rel; + static const std::memory_order LoadOrder = std::memory_order_acquire; + static const std::memory_order StoreOrder = std::memory_order_release; + static const std::memory_order CompareExchangeFailureOrder = + std::memory_order_acquire; +}; + +template<> +struct AtomicOrderConstraints +{ + static const std::memory_order AtomicRMWOrder = std::memory_order_seq_cst; + static const std::memory_order LoadOrder = std::memory_order_seq_cst; + static const std::memory_order StoreOrder = std::memory_order_seq_cst; + static const std::memory_order CompareExchangeFailureOrder = + std::memory_order_seq_cst; +}; + +template +struct IntrinsicBase +{ + typedef std::atomic ValueType; + typedef AtomicOrderConstraints OrderedOp; +}; + +template +struct IntrinsicMemoryOps : public IntrinsicBase +{ + typedef IntrinsicBase Base; + + static T load(const typename Base::ValueType& aPtr) + { + return aPtr.load(Base::OrderedOp::LoadOrder); + } + + static void store(typename Base::ValueType& aPtr, T aVal) + { + aPtr.store(aVal, Base::OrderedOp::StoreOrder); + } + + static T exchange(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.exchange(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static bool compareExchange(typename Base::ValueType& aPtr, + T aOldVal, T aNewVal) + { + return aPtr.compare_exchange_strong(aOldVal, aNewVal, + Base::OrderedOp::AtomicRMWOrder, + Base::OrderedOp::CompareExchangeFailureOrder); + } +}; + +template +struct IntrinsicAddSub : public IntrinsicBase +{ + typedef IntrinsicBase Base; + + static T add(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_add(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static T sub(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_sub(aVal, Base::OrderedOp::AtomicRMWOrder); + } +}; + +template +struct IntrinsicAddSub : public IntrinsicBase +{ + typedef IntrinsicBase Base; + + static T* add(typename Base::ValueType& aPtr, ptrdiff_t aVal) + { + return aPtr.fetch_add(fixupAddend(aVal), Base::OrderedOp::AtomicRMWOrder); + } + + static T* sub(typename Base::ValueType& aPtr, ptrdiff_t aVal) + { + return aPtr.fetch_sub(fixupAddend(aVal), Base::OrderedOp::AtomicRMWOrder); + } +private: + /* + * GCC 4.6's header has a bug where adding X to an + * atomic is not the same as adding X to a T*. Hence the need + * for this function to provide the correct addend. + */ + static ptrdiff_t fixupAddend(ptrdiff_t aVal) + { +#if defined(__clang__) || defined(_MSC_VER) + return aVal; +#elif defined(__GNUC__) && MOZ_GCC_VERSION_AT_LEAST(4, 6, 0) && \ + !MOZ_GCC_VERSION_AT_LEAST(4, 7, 0) + return aVal * sizeof(T); +#else + return aVal; +#endif + } +}; + +template +struct IntrinsicIncDec : public IntrinsicAddSub +{ + typedef IntrinsicBase Base; + + static T inc(typename Base::ValueType& aPtr) + { + return IntrinsicAddSub::add(aPtr, 1); + } + + static T dec(typename Base::ValueType& aPtr) + { + return IntrinsicAddSub::sub(aPtr, 1); + } +}; + +template +struct AtomicIntrinsics : public IntrinsicMemoryOps, + public IntrinsicIncDec +{ + typedef IntrinsicBase Base; + + static T or_(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_or(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static T xor_(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_xor(aVal, Base::OrderedOp::AtomicRMWOrder); + } + + static T and_(typename Base::ValueType& aPtr, T aVal) + { + return aPtr.fetch_and(aVal, Base::OrderedOp::AtomicRMWOrder); + } +}; + +template +struct AtomicIntrinsics + : public IntrinsicMemoryOps, public IntrinsicIncDec +{ +}; + +} // namespace detail +} // namespace mozilla + +#elif defined(__GNUC__) + +namespace mozilla { +namespace detail { + +/* + * The __sync_* family of intrinsics is documented here: + * + * http://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Atomic-Builtins.html + * + * While these intrinsics are deprecated in favor of the newer __atomic_* + * family of intrincs: + * + * http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/_005f_005fatomic-Builtins.html + * + * any GCC version that supports the __atomic_* intrinsics will also support + * the header and so will be handled above. We provide a version of + * atomics using the __sync_* intrinsics to support older versions of GCC. + * + * All __sync_* intrinsics that we use below act as full memory barriers, for + * both compiler and hardware reordering, except for __sync_lock_test_and_set, + * which is a only an acquire barrier. When we call __sync_lock_test_and_set, + * we add a barrier above it as appropriate. + */ + +template struct Barrier; + +/* + * Some processors (in particular, x86) don't require quite so many calls to + * __sync_sychronize as our specializations of Barrier produce. If + * performance turns out to be an issue, defining these specializations + * on a per-processor basis would be a good first tuning step. + */ + +template<> +struct Barrier +{ + static void beforeLoad() {} + static void afterLoad() {} + static void beforeStore() {} + static void afterStore() {} +}; + +template<> +struct Barrier +{ + static void beforeLoad() {} + static void afterLoad() { __sync_synchronize(); } + static void beforeStore() { __sync_synchronize(); } + static void afterStore() {} +}; + +template<> +struct Barrier +{ + static void beforeLoad() { __sync_synchronize(); } + static void afterLoad() { __sync_synchronize(); } + static void beforeStore() { __sync_synchronize(); } + static void afterStore() { __sync_synchronize(); } +}; + +template +struct IntrinsicMemoryOps +{ + static T load(const T& aPtr) + { + Barrier::beforeLoad(); + T val = aPtr; + Barrier::afterLoad(); + return val; + } + + static void store(T& aPtr, T aVal) + { + Barrier::beforeStore(); + aPtr = aVal; + Barrier::afterStore(); + } + + static T exchange(T& aPtr, T aVal) + { + // __sync_lock_test_and_set is only an acquire barrier; loads and stores + // can't be moved up from after to before it, but they can be moved down + // from before to after it. We may want a stricter ordering, so we need + // an explicit barrier. + Barrier::beforeStore(); + return __sync_lock_test_and_set(&aPtr, aVal); + } + + static bool compareExchange(T& aPtr, T aOldVal, T aNewVal) + { + return __sync_bool_compare_and_swap(&aPtr, aOldVal, aNewVal); + } +}; + +template +struct IntrinsicAddSub +{ + typedef T ValueType; + + static T add(T& aPtr, T aVal) + { + return __sync_fetch_and_add(&aPtr, aVal); + } + + static T sub(T& aPtr, T aVal) + { + return __sync_fetch_and_sub(&aPtr, aVal); + } +}; + +template +struct IntrinsicAddSub +{ + typedef T* ValueType; + + /* + * The reinterpret_casts are needed so that + * __sync_fetch_and_{add,sub} will properly type-check. + * + * Also, these functions do not provide standard semantics for + * pointer types, so we need to adjust the addend. + */ + static ValueType add(ValueType& aPtr, ptrdiff_t aVal) + { + ValueType amount = reinterpret_cast(aVal * sizeof(T)); + return __sync_fetch_and_add(&aPtr, amount); + } + + static ValueType sub(ValueType& aPtr, ptrdiff_t aVal) + { + ValueType amount = reinterpret_cast(aVal * sizeof(T)); + return __sync_fetch_and_sub(&aPtr, amount); + } +}; + +template +struct IntrinsicIncDec : public IntrinsicAddSub +{ + static T inc(T& aPtr) { return IntrinsicAddSub::add(aPtr, 1); } + static T dec(T& aPtr) { return IntrinsicAddSub::sub(aPtr, 1); } +}; + +template +struct AtomicIntrinsics : public IntrinsicMemoryOps, + public IntrinsicIncDec +{ + static T or_( T& aPtr, T aVal) { return __sync_fetch_and_or(&aPtr, aVal); } + static T xor_(T& aPtr, T aVal) { return __sync_fetch_and_xor(&aPtr, aVal); } + static T and_(T& aPtr, T aVal) { return __sync_fetch_and_and(&aPtr, aVal); } +}; + +template +struct AtomicIntrinsics : public IntrinsicMemoryOps, + public IntrinsicIncDec +{ +}; + +} // namespace detail +} // namespace mozilla + +#elif defined(_MSC_VER) + +/* + * Windows comes with a full complement of atomic operations. + * Unfortunately, most of those aren't available for Windows XP (even if + * the compiler supports intrinsics for them), which is the oldest + * version of Windows we support. Therefore, we only provide operations + * on 32-bit datatypes for 32-bit Windows versions; for 64-bit Windows + * versions, we support 64-bit datatypes as well. + */ + +# include + +# pragma intrinsic(_InterlockedExchangeAdd) +# pragma intrinsic(_InterlockedOr) +# pragma intrinsic(_InterlockedXor) +# pragma intrinsic(_InterlockedAnd) +# pragma intrinsic(_InterlockedExchange) +# pragma intrinsic(_InterlockedCompareExchange) + +namespace mozilla { +namespace detail { + +# if !defined(_M_IX86) && !defined(_M_X64) + /* + * The implementations below are optimized for x86ish systems. You + * will have to modify them if you are porting to Windows on a + * different architecture. + */ +# error "Unknown CPU type" +# endif + +/* + * The PrimitiveIntrinsics template should define |Type|, the datatype of size + * DataSize upon which we operate, and the following eight functions. + * + * static Type add(Type* aPtr, Type aVal); + * static Type sub(Type* aPtr, Type aVal); + * static Type or_(Type* aPtr, Type aVal); + * static Type xor_(Type* aPtr, Type aVal); + * static Type and_(Type* aPtr, Type aVal); + * + * These functions perform the obvious operation on the value contained in + * |*aPtr| combined with |aVal| and return the value previously stored in + * |*aPtr|. + * + * static void store(Type* aPtr, Type aVal); + * + * This function atomically stores |aVal| into |*aPtr| and must provide a full + * memory fence after the store to prevent compiler and hardware instruction + * reordering. It should also act as a compiler barrier to prevent reads and + * writes from moving to after the store. + * + * static Type exchange(Type* aPtr, Type aVal); + * + * This function atomically stores |aVal| into |*aPtr| and returns the + * previous contents of |*aPtr|; + * + * static bool compareExchange(Type* aPtr, Type aOldVal, Type aNewVal); + * + * This function atomically performs the following operation: + * + * if (*aPtr == aOldVal) { + * *aPtr = aNewVal; + * return true; + * } else { + * return false; + * } + * + */ +template struct PrimitiveIntrinsics; + +template<> +struct PrimitiveIntrinsics<4> +{ + typedef long Type; + + static Type add(Type* aPtr, Type aVal) + { + return _InterlockedExchangeAdd(aPtr, aVal); + } + + static Type sub(Type* aPtr, Type aVal) + { + /* + * _InterlockedExchangeSubtract isn't available before Windows 7, + * and we must support Windows XP. + */ + return _InterlockedExchangeAdd(aPtr, -aVal); + } + + static Type or_(Type* aPtr, Type aVal) + { + return _InterlockedOr(aPtr, aVal); + } + + static Type xor_(Type* aPtr, Type aVal) + { + return _InterlockedXor(aPtr, aVal); + } + + static Type and_(Type* aPtr, Type aVal) + { + return _InterlockedAnd(aPtr, aVal); + } + + static void store(Type* aPtr, Type aVal) + { + _InterlockedExchange(aPtr, aVal); + } + + static Type exchange(Type* aPtr, Type aVal) + { + return _InterlockedExchange(aPtr, aVal); + } + + static bool compareExchange(Type* aPtr, Type aOldVal, Type aNewVal) + { + return _InterlockedCompareExchange(aPtr, aNewVal, aOldVal) == aOldVal; + } +}; + +# if defined(_M_X64) + +# pragma intrinsic(_InterlockedExchangeAdd64) +# pragma intrinsic(_InterlockedOr64) +# pragma intrinsic(_InterlockedXor64) +# pragma intrinsic(_InterlockedAnd64) +# pragma intrinsic(_InterlockedExchange64) +# pragma intrinsic(_InterlockedCompareExchange64) + +template <> +struct PrimitiveIntrinsics<8> +{ + typedef __int64 Type; + + static Type add(Type* aPtr, Type aVal) + { + return _InterlockedExchangeAdd64(aPtr, aVal); + } + + static Type sub(Type* aPtr, Type aVal) + { + /* + * There is no _InterlockedExchangeSubtract64. + */ + return _InterlockedExchangeAdd64(aPtr, -aVal); + } + + static Type or_(Type* aPtr, Type aVal) + { + return _InterlockedOr64(aPtr, aVal); + } + + static Type xor_(Type* aPtr, Type aVal) + { + return _InterlockedXor64(aPtr, aVal); + } + + static Type and_(Type* aPtr, Type aVal) + { + return _InterlockedAnd64(aPtr, aVal); + } + + static void store(Type* aPtr, Type aVal) + { + _InterlockedExchange64(aPtr, aVal); + } + + static Type exchange(Type* aPtr, Type aVal) + { + return _InterlockedExchange64(aPtr, aVal); + } + + static bool compareExchange(Type* aPtr, Type aOldVal, Type aNewVal) + { + return _InterlockedCompareExchange64(aPtr, aNewVal, aOldVal) == aOldVal; + } +}; + +# endif + +# pragma intrinsic(_ReadWriteBarrier) + +template struct Barrier; + +/* + * We do not provide an afterStore method in Barrier, as Relaxed and + * ReleaseAcquire orderings do not require one, and the required barrier + * for SequentiallyConsistent is handled by PrimitiveIntrinsics. + */ + +template<> +struct Barrier +{ + static void beforeLoad() {} + static void afterLoad() {} + static void beforeStore() {} +}; + +template<> +struct Barrier +{ + static void beforeLoad() {} + static void afterLoad() { _ReadWriteBarrier(); } + static void beforeStore() { _ReadWriteBarrier(); } +}; + +template<> +struct Barrier +{ + static void beforeLoad() { _ReadWriteBarrier(); } + static void afterLoad() { _ReadWriteBarrier(); } + static void beforeStore() { _ReadWriteBarrier(); } +}; + +template +struct CastHelper +{ + static PrimType toPrimType(T aVal) { return static_cast(aVal); } + static T fromPrimType(PrimType aVal) { return static_cast(aVal); } +}; + +template +struct CastHelper +{ + static PrimType toPrimType(T* aVal) { return reinterpret_cast(aVal); } + static T* fromPrimType(PrimType aVal) { return reinterpret_cast(aVal); } +}; + +template +struct IntrinsicBase +{ + typedef T ValueType; + typedef PrimitiveIntrinsics Primitives; + typedef typename Primitives::Type PrimType; + static_assert(sizeof(PrimType) == sizeof(T), + "Selection of PrimitiveIntrinsics was wrong"); + typedef CastHelper Cast; +}; + +template +struct IntrinsicMemoryOps : public IntrinsicBase +{ + typedef typename IntrinsicBase::ValueType ValueType; + typedef typename IntrinsicBase::Primitives Primitives; + typedef typename IntrinsicBase::PrimType PrimType; + typedef typename IntrinsicBase::Cast Cast; + + static ValueType load(const ValueType& aPtr) + { + Barrier::beforeLoad(); + ValueType val = aPtr; + Barrier::afterLoad(); + return val; + } + + static void store(ValueType& aPtr, ValueType aVal) + { + // For SequentiallyConsistent, Primitives::store() will generate the + // proper memory fence. Everything else just needs a barrier before + // the store. + if (Order == SequentiallyConsistent) { + Primitives::store(reinterpret_cast(&aPtr), + Cast::toPrimType(aVal)); + } else { + Barrier::beforeStore(); + aPtr = aVal; + } + } + + static ValueType exchange(ValueType& aPtr, ValueType aVal) + { + PrimType oldval = + Primitives::exchange(reinterpret_cast(&aPtr), + Cast::toPrimType(aVal)); + return Cast::fromPrimType(oldval); + } + + static bool compareExchange(ValueType& aPtr, ValueType aOldVal, + ValueType aNewVal) + { + return Primitives::compareExchange(reinterpret_cast(&aPtr), + Cast::toPrimType(aOldVal), + Cast::toPrimType(aNewVal)); + } +}; + +template +struct IntrinsicApplyHelper : public IntrinsicBase +{ + typedef typename IntrinsicBase::ValueType ValueType; + typedef typename IntrinsicBase::PrimType PrimType; + typedef typename IntrinsicBase::Cast Cast; + typedef PrimType (*BinaryOp)(PrimType*, PrimType); + typedef PrimType (*UnaryOp)(PrimType*); + + static ValueType applyBinaryFunction(BinaryOp aOp, ValueType& aPtr, + ValueType aVal) + { + PrimType* primTypePtr = reinterpret_cast(&aPtr); + PrimType primTypeVal = Cast::toPrimType(aVal); + return Cast::fromPrimType(aOp(primTypePtr, primTypeVal)); + } + + static ValueType applyUnaryFunction(UnaryOp aOp, ValueType& aPtr) + { + PrimType* primTypePtr = reinterpret_cast(&aPtr); + return Cast::fromPrimType(aOp(primTypePtr)); + } +}; + +template +struct IntrinsicAddSub : public IntrinsicApplyHelper +{ + typedef typename IntrinsicApplyHelper::ValueType ValueType; + typedef typename IntrinsicBase::Primitives Primitives; + + static ValueType add(ValueType& aPtr, ValueType aVal) + { + return applyBinaryFunction(&Primitives::add, aPtr, aVal); + } + + static ValueType sub(ValueType& aPtr, ValueType aVal) + { + return applyBinaryFunction(&Primitives::sub, aPtr, aVal); + } +}; + +template +struct IntrinsicAddSub : public IntrinsicApplyHelper +{ + typedef typename IntrinsicApplyHelper::ValueType ValueType; + typedef typename IntrinsicBase::Primitives Primitives; + + static ValueType add(ValueType& aPtr, ptrdiff_t aAmount) + { + return applyBinaryFunction(&Primitives::add, aPtr, + (ValueType)(aAmount * sizeof(T))); + } + + static ValueType sub(ValueType& aPtr, ptrdiff_t aAmount) + { + return applyBinaryFunction(&Primitives::sub, aPtr, + (ValueType)(aAmount * sizeof(T))); + } +}; + +template +struct IntrinsicIncDec : public IntrinsicAddSub +{ + typedef typename IntrinsicAddSub::ValueType ValueType; + static ValueType inc(ValueType& aPtr) { return add(aPtr, 1); } + static ValueType dec(ValueType& aPtr) { return sub(aPtr, 1); } +}; + +template +struct AtomicIntrinsics : public IntrinsicMemoryOps, + public IntrinsicIncDec +{ + typedef typename IntrinsicIncDec::ValueType ValueType; + typedef typename IntrinsicBase::Primitives Primitives; + + static ValueType or_(ValueType& aPtr, T aVal) + { + return applyBinaryFunction(&Primitives::or_, aPtr, aVal); + } + + static ValueType xor_(ValueType& aPtr, T aVal) + { + return applyBinaryFunction(&Primitives::xor_, aPtr, aVal); + } + + static ValueType and_(ValueType& aPtr, T aVal) + { + return applyBinaryFunction(&Primitives::and_, aPtr, aVal); + } +}; + +template +struct AtomicIntrinsics : public IntrinsicMemoryOps, + public IntrinsicIncDec +{ + typedef typename IntrinsicMemoryOps::ValueType ValueType; + // This is required to make us be able to build with MSVC10, for unknown + // reasons. + typedef typename IntrinsicBase::Primitives Primitives; +}; + +} // namespace detail +} // namespace mozilla + +#else +# error "Atomic compiler intrinsics are not supported on your platform" +#endif + +namespace mozilla { + +namespace detail { + +template +class AtomicBase +{ + // We only support 32-bit types on 32-bit Windows, which constrains our + // implementation elsewhere. But we support pointer-sized types everywhere. + static_assert(sizeof(T) == 4 || (sizeof(uintptr_t) == 8 && sizeof(T) == 8), + "mozilla/Atomics.h only supports 32-bit and pointer-sized types"); + +protected: + typedef typename detail::AtomicIntrinsics Intrinsics; + typename Intrinsics::ValueType mValue; + +public: + MOZ_CONSTEXPR AtomicBase() : mValue() {} + explicit MOZ_CONSTEXPR AtomicBase(T aInit) : mValue(aInit) {} + + // Note: we can't provide operator T() here because Atomic inherits + // from AtomcBase with T=uint32_t and not T=bool. If we implemented + // operator T() here, it would cause errors when comparing Atomic with + // a regular bool. + + T operator=(T aVal) + { + Intrinsics::store(mValue, aVal); + return aVal; + } + + /** + * Performs an atomic swap operation. aVal is stored and the previous + * value of this variable is returned. + */ + T exchange(T aVal) + { + return Intrinsics::exchange(mValue, aVal); + } + + /** + * Performs an atomic compare-and-swap operation and returns true if it + * succeeded. This is equivalent to atomically doing + * + * if (mValue == aOldValue) { + * mValue = aNewValue; + * return true; + * } else { + * return false; + * } + */ + bool compareExchange(T aOldValue, T aNewValue) + { + return Intrinsics::compareExchange(mValue, aOldValue, aNewValue); + } + +private: + template + AtomicBase(const AtomicBase& aCopy) MOZ_DELETE; +}; + +template +class AtomicBaseIncDec : public AtomicBase +{ + typedef typename detail::AtomicBase Base; + +public: + MOZ_CONSTEXPR AtomicBaseIncDec() : Base() {} + explicit MOZ_CONSTEXPR AtomicBaseIncDec(T aInit) : Base(aInit) {} + + using Base::operator=; + + operator T() const { return Base::Intrinsics::load(Base::mValue); } + T operator++(int) { return Base::Intrinsics::inc(Base::mValue); } + T operator--(int) { return Base::Intrinsics::dec(Base::mValue); } + T operator++() { return Base::Intrinsics::inc(Base::mValue) + 1; } + T operator--() { return Base::Intrinsics::dec(Base::mValue) - 1; } + +private: + template + AtomicBaseIncDec(const AtomicBaseIncDec& aCopy) MOZ_DELETE; +}; + +} // namespace detail + +/** + * A wrapper for a type that enforces that all memory accesses are atomic. + * + * In general, where a variable |T foo| exists, |Atomic foo| can be used in + * its place. Implementations for integral and pointer types are provided + * below. + * + * Atomic accesses are sequentially consistent by default. You should + * use the default unless you are tall enough to ride the + * memory-ordering roller coaster (if you're not sure, you aren't) and + * you have a compelling reason to do otherwise. + * + * There is one exception to the case of atomic memory accesses: providing an + * initial value of the atomic value is not guaranteed to be atomic. This is a + * deliberate design choice that enables static atomic variables to be declared + * without introducing extra static constructors. + */ +template +class Atomic; + +/** + * Atomic implementation for integral types. + * + * In addition to atomic store and load operations, compound assignment and + * increment/decrement operators are implemented which perform the + * corresponding read-modify-write operation atomically. Finally, an atomic + * swap method is provided. + */ +template +class Atomic::value && + !IsSame::value>::Type> + : public detail::AtomicBaseIncDec +{ + typedef typename detail::AtomicBaseIncDec Base; + +public: + MOZ_CONSTEXPR Atomic() : Base() {} + explicit MOZ_CONSTEXPR Atomic(T aInit) : Base(aInit) {} + + using Base::operator=; + + T operator+=(T aDelta) + { + return Base::Intrinsics::add(Base::mValue, aDelta) + aDelta; + } + + T operator-=(T aDelta) + { + return Base::Intrinsics::sub(Base::mValue, aDelta) - aDelta; + } + + T operator|=(T aVal) + { + return Base::Intrinsics::or_(Base::mValue, aVal) | aVal; + } + + T operator^=(T aVal) + { + return Base::Intrinsics::xor_(Base::mValue, aVal) ^ aVal; + } + + T operator&=(T aVal) + { + return Base::Intrinsics::and_(Base::mValue, aVal) & aVal; + } + +private: + Atomic(Atomic& aOther) MOZ_DELETE; +}; + +/** + * Atomic implementation for pointer types. + * + * An atomic compare-and-swap primitive for pointer variables is provided, as + * are atomic increment and decement operators. Also provided are the compound + * assignment operators for addition and subtraction. Atomic swap (via + * exchange()) is included as well. + */ +template +class Atomic : public detail::AtomicBaseIncDec +{ + typedef typename detail::AtomicBaseIncDec Base; + +public: + MOZ_CONSTEXPR Atomic() : Base() {} + explicit MOZ_CONSTEXPR Atomic(T* aInit) : Base(aInit) {} + + using Base::operator=; + + T* operator+=(ptrdiff_t aDelta) + { + return Base::Intrinsics::add(Base::mValue, aDelta) + aDelta; + } + + T* operator-=(ptrdiff_t aDelta) + { + return Base::Intrinsics::sub(Base::mValue, aDelta) - aDelta; + } + +private: + Atomic(Atomic& aOther) MOZ_DELETE; +}; + +/** + * Atomic implementation for enum types. + * + * The atomic store and load operations and the atomic swap method is provided. + */ +template +class Atomic::value>::Type> + : public detail::AtomicBase +{ + typedef typename detail::AtomicBase Base; + +public: + MOZ_CONSTEXPR Atomic() : Base() {} + explicit MOZ_CONSTEXPR Atomic(T aInit) : Base(aInit) {} + + operator T() const { return Base::Intrinsics::load(Base::mValue); } + + using Base::operator=; + +private: + Atomic(Atomic& aOther) MOZ_DELETE; +}; + +/** + * Atomic implementation for boolean types. + * + * The atomic store and load operations and the atomic swap method is provided. + * + * Note: + * + * - sizeof(Atomic) != sizeof(bool) for some implementations of + * bool and/or some implementations of std::atomic. This is allowed in + * [atomic.types.generic]p9. + * + * - It's not obvious whether the 8-bit atomic functions on Windows are always + * inlined or not. If they are not inlined, the corresponding functions in the + * runtime library are not available on Windows XP. This is why we implement + * Atomic with an underlying type of uint32_t. + */ +template +class Atomic + : protected detail::AtomicBase +{ + typedef typename detail::AtomicBase Base; + +public: + MOZ_CONSTEXPR Atomic() : Base() {} + explicit MOZ_CONSTEXPR Atomic(bool aInit) : Base(aInit) {} + + // We provide boolean wrappers for the underlying AtomicBase methods. + operator bool() const + { + return Base::Intrinsics::load(Base::mValue); + } + + bool operator=(bool aVal) + { + return Base::operator=(aVal); + } + + bool exchange(bool aVal) + { + return Base::exchange(aVal); + } + + bool compareExchange(bool aOldValue, bool aNewValue) + { + return Base::compareExchange(aOldValue, aNewValue); + } + +private: + Atomic(Atomic& aOther) MOZ_DELETE; +}; + +} // namespace mozilla + +#endif /* mozilla_Atomics_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Attributes.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Attributes.h new file mode 100644 index 0000000000..cdce8c7717 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Attributes.h @@ -0,0 +1,536 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Implementations of various class and method modifier attributes. */ + +#ifndef mozilla_Attributes_h +#define mozilla_Attributes_h + +#include "mozilla/Compiler.h" + +/* + * MOZ_ALWAYS_INLINE is a macro which expands to tell the compiler that the + * method decorated with it must be inlined, even if the compiler thinks + * otherwise. This is only a (much) stronger version of the inline hint: + * compilers are not guaranteed to respect it (although they're much more likely + * to do so). + * + * The MOZ_ALWAYS_INLINE_EVEN_DEBUG macro is yet stronger. It tells the + * compiler to inline even in DEBUG builds. It should be used very rarely. + */ +#if defined(_MSC_VER) +# define MOZ_ALWAYS_INLINE_EVEN_DEBUG __forceinline +#elif defined(__GNUC__) +# define MOZ_ALWAYS_INLINE_EVEN_DEBUG __attribute__((always_inline)) inline +#else +# define MOZ_ALWAYS_INLINE_EVEN_DEBUG inline +#endif + +#if !defined(DEBUG) +# define MOZ_ALWAYS_INLINE MOZ_ALWAYS_INLINE_EVEN_DEBUG +#elif defined(_MSC_VER) && !defined(__cplusplus) +# define MOZ_ALWAYS_INLINE __inline +#else +# define MOZ_ALWAYS_INLINE inline +#endif + +#if defined(_MSC_VER) +/* + * g++ requires -std=c++0x or -std=gnu++0x to support C++11 functionality + * without warnings (functionality used by the macros below). These modes are + * detectable by checking whether __GXX_EXPERIMENTAL_CXX0X__ is defined or, more + * standardly, by checking whether __cplusplus has a C++11 or greater value. + * Current versions of g++ do not correctly set __cplusplus, so we check both + * for forward compatibility. + * + * Even though some versions of MSVC support explicit conversion operators, we + * don't indicate support for them here, due to + * http://stackoverflow.com/questions/20498142/visual-studio-2013-explicit-keyword-bug + */ +# if _MSC_VER >= 1800 +# define MOZ_HAVE_CXX11_DELETE +# endif +# if _MSC_VER >= 1700 +# define MOZ_HAVE_CXX11_FINAL final +# else +# if defined(__clang__) +# error Please do not try to use clang-cl with MSVC10 or below emulation! +# endif + /* MSVC <= 10 used to spell "final" as "sealed". */ +# define MOZ_HAVE_CXX11_FINAL sealed +# endif +# define MOZ_HAVE_CXX11_OVERRIDE +# define MOZ_HAVE_NEVER_INLINE __declspec(noinline) +# define MOZ_HAVE_NORETURN __declspec(noreturn) +#elif defined(__clang__) + /* + * Per Clang documentation, "Note that marketing version numbers should not + * be used to check for language features, as different vendors use different + * numbering schemes. Instead, use the feature checking macros." + */ +# ifndef __has_extension +# define __has_extension __has_feature /* compatibility, for older versions of clang */ +# endif +# if __has_extension(cxx_constexpr) +# define MOZ_HAVE_CXX11_CONSTEXPR +# endif +# if __has_extension(cxx_explicit_conversions) +# define MOZ_HAVE_EXPLICIT_CONVERSION +# endif +# if __has_extension(cxx_deleted_functions) +# define MOZ_HAVE_CXX11_DELETE +# endif +# if __has_extension(cxx_override_control) +# define MOZ_HAVE_CXX11_OVERRIDE +# define MOZ_HAVE_CXX11_FINAL final +# endif +# if __has_attribute(noinline) +# define MOZ_HAVE_NEVER_INLINE __attribute__((noinline)) +# endif +# if __has_attribute(noreturn) +# define MOZ_HAVE_NORETURN __attribute__((noreturn)) +# endif +#elif defined(__GNUC__) +# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L +# if MOZ_GCC_VERSION_AT_LEAST(4, 7, 0) +# define MOZ_HAVE_CXX11_OVERRIDE +# define MOZ_HAVE_CXX11_FINAL final +# endif +# if MOZ_GCC_VERSION_AT_LEAST(4, 6, 0) +# define MOZ_HAVE_CXX11_CONSTEXPR +# endif +# if MOZ_GCC_VERSION_AT_LEAST(4, 5, 0) +# define MOZ_HAVE_EXPLICIT_CONVERSION +# endif +# define MOZ_HAVE_CXX11_DELETE +# else + /* __final is a non-C++11 GCC synonym for 'final', per GCC r176655. */ +# if MOZ_GCC_VERSION_AT_LEAST(4, 7, 0) +# define MOZ_HAVE_CXX11_FINAL __final +# endif +# endif +# define MOZ_HAVE_NEVER_INLINE __attribute__((noinline)) +# define MOZ_HAVE_NORETURN __attribute__((noreturn)) +#endif + +/* + * When built with clang analyzer (a.k.a scan-build), define MOZ_HAVE_NORETURN + * to mark some false positives + */ +#ifdef __clang_analyzer__ +# if __has_extension(attribute_analyzer_noreturn) +# define MOZ_HAVE_ANALYZER_NORETURN __attribute__((analyzer_noreturn)) +# endif +#endif + +/* + * The MOZ_CONSTEXPR specifier declares that a C++11 compiler can evaluate a + * function at compile time. A constexpr function cannot examine any values + * except its arguments and can have no side effects except its return value. + * The MOZ_CONSTEXPR_VAR specifier tells a C++11 compiler that a variable's + * value may be computed at compile time. It should be prefered to just + * marking variables as MOZ_CONSTEXPR because if the compiler does not support + * constexpr it will fall back to making the variable const, and some compilers + * do not accept variables being marked both const and constexpr. + */ +#ifdef MOZ_HAVE_CXX11_CONSTEXPR +# define MOZ_CONSTEXPR constexpr +# define MOZ_CONSTEXPR_VAR constexpr +#else +# define MOZ_CONSTEXPR /* no support */ +# define MOZ_CONSTEXPR_VAR const +#endif + +/* + * MOZ_EXPLICIT_CONVERSION is a specifier on a type conversion + * overloaded operator that declares that a C++11 compiler should restrict + * this operator to allow only explicit type conversions, disallowing + * implicit conversions. + * + * Example: + * + * template + * class Ptr + * { + * T* mPtr; + * MOZ_EXPLICIT_CONVERSION operator bool() const + * { + * return mPtr != nullptr; + * } + * }; + * + */ +#ifdef MOZ_HAVE_EXPLICIT_CONVERSION +# define MOZ_EXPLICIT_CONVERSION explicit +#else +# define MOZ_EXPLICIT_CONVERSION /* no support */ +#endif + +/* + * MOZ_NEVER_INLINE is a macro which expands to tell the compiler that the + * method decorated with it must never be inlined, even if the compiler would + * otherwise choose to inline the method. Compilers aren't absolutely + * guaranteed to support this, but most do. + */ +#if defined(MOZ_HAVE_NEVER_INLINE) +# define MOZ_NEVER_INLINE MOZ_HAVE_NEVER_INLINE +#else +# define MOZ_NEVER_INLINE /* no support */ +#endif + +/* + * MOZ_NORETURN, specified at the start of a function declaration, indicates + * that the given function does not return. (The function definition does not + * need to be annotated.) + * + * MOZ_NORETURN void abort(const char* msg); + * + * This modifier permits the compiler to optimize code assuming a call to such a + * function will never return. It also enables the compiler to avoid spurious + * warnings about not initializing variables, or about any other seemingly-dodgy + * operations performed after the function returns. + * + * This modifier does not affect the corresponding function's linking behavior. + */ +#if defined(MOZ_HAVE_NORETURN) +# define MOZ_NORETURN MOZ_HAVE_NORETURN +#else +# define MOZ_NORETURN /* no support */ +#endif + +/* + * MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS, specified at the end of a function + * declaration, indicates that for the purposes of static analysis, this + * function does not return. (The function definition does not need to be + * annotated.) + * + * MOZ_ReportCrash(const char* s, const char* file, int ln) + * MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS + * + * Some static analyzers, like scan-build from clang, can use this information + * to eliminate false positives. From the upstream documentation of scan-build: + * "This attribute is useful for annotating assertion handlers that actually + * can return, but for the purpose of using the analyzer we want to pretend + * that such functions do not return." + * + */ +#if defined(MOZ_HAVE_ANALYZER_NORETURN) +# define MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS MOZ_HAVE_ANALYZER_NORETURN +#else +# define MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS /* no support */ +#endif + +/* + * MOZ_ASAN_BLACKLIST is a macro to tell AddressSanitizer (a compile-time + * instrumentation shipped with Clang and GCC) to not instrument the annotated + * function. Furthermore, it will prevent the compiler from inlining the + * function because inlining currently breaks the blacklisting mechanism of + * AddressSanitizer. + */ +#if defined(__has_feature) +# if __has_feature(address_sanitizer) +# define MOZ_HAVE_ASAN_BLACKLIST +# endif +#elif defined(__GNUC__) +# if defined(__SANITIZE_ADDRESS__) +# define MOZ_HAVE_ASAN_BLACKLIST +# endif +#endif + +#if defined(MOZ_HAVE_ASAN_BLACKLIST) +# define MOZ_ASAN_BLACKLIST MOZ_NEVER_INLINE __attribute__((no_sanitize_address)) +#else +# define MOZ_ASAN_BLACKLIST /* nothing */ +#endif + +/* + * MOZ_TSAN_BLACKLIST is a macro to tell ThreadSanitizer (a compile-time + * instrumentation shipped with Clang) to not instrument the annotated function. + * Furthermore, it will prevent the compiler from inlining the function because + * inlining currently breaks the blacklisting mechanism of ThreadSanitizer. + */ +#if defined(__has_feature) +# if __has_feature(thread_sanitizer) +# define MOZ_TSAN_BLACKLIST MOZ_NEVER_INLINE __attribute__((no_sanitize_thread)) +# else +# define MOZ_TSAN_BLACKLIST /* nothing */ +# endif +#else +# define MOZ_TSAN_BLACKLIST /* nothing */ +#endif + +#ifdef __cplusplus + +/* + * MOZ_DELETE, specified immediately prior to the ';' terminating an undefined- + * method declaration, attempts to delete that method from the corresponding + * class. An attempt to use the method will always produce an error *at compile + * time* (instead of sometimes as late as link time) when this macro can be + * implemented. For example, you can use MOZ_DELETE to produce classes with no + * implicit copy constructor or assignment operator: + * + * struct NonCopyable + * { + * private: + * NonCopyable(const NonCopyable& aOther) MOZ_DELETE; + * void operator=(const NonCopyable& aOther) MOZ_DELETE; + * }; + * + * If MOZ_DELETE can't be implemented for the current compiler, use of the + * annotated method will still cause an error, but the error might occur at link + * time in some cases rather than at compile time. + * + * MOZ_DELETE relies on C++11 functionality not universally implemented. As a + * backstop, method declarations using MOZ_DELETE should be private. + */ +#if defined(MOZ_HAVE_CXX11_DELETE) +# define MOZ_DELETE = delete +#else +# define MOZ_DELETE /* no support */ +#endif + +/* + * MOZ_OVERRIDE explicitly indicates that a virtual member function in a class + * overrides a member function of a base class, rather than potentially being a + * new member function. MOZ_OVERRIDE should be placed immediately before the + * ';' terminating the member function's declaration, or before '= 0;' if the + * member function is pure. If the member function is defined in the class + * definition, it should appear before the opening brace of the function body. + * + * class Base + * { + * public: + * virtual void f() = 0; + * }; + * class Derived1 : public Base + * { + * public: + * virtual void f() MOZ_OVERRIDE; + * }; + * class Derived2 : public Base + * { + * public: + * virtual void f() MOZ_OVERRIDE = 0; + * }; + * class Derived3 : public Base + * { + * public: + * virtual void f() MOZ_OVERRIDE { } + * }; + * + * In compilers supporting C++11 override controls, MOZ_OVERRIDE *requires* that + * the function marked with it override a member function of a base class: it + * is a compile error if it does not. Otherwise MOZ_OVERRIDE does not affect + * semantics and merely documents the override relationship to the reader (but + * of course must still be used correctly to not break C++11 compilers). + */ +#if defined(MOZ_HAVE_CXX11_OVERRIDE) +# define MOZ_OVERRIDE override +#else +# define MOZ_OVERRIDE /* no support */ +#endif + +/* + * MOZ_FINAL indicates that some functionality cannot be overridden through + * inheritance. It can be used to annotate either classes/structs or virtual + * member functions. + * + * To annotate a class/struct with MOZ_FINAL, place MOZ_FINAL immediately after + * the name of the class, before the list of classes from which it derives (if + * any) and before its opening brace. MOZ_FINAL must not be used to annotate + * unnamed classes or structs. (With some compilers, and with C++11 proper, the + * underlying expansion is ambiguous with specifying a class name.) + * + * class Base MOZ_FINAL + * { + * public: + * Base(); + * ~Base(); + * virtual void f() { } + * }; + * // This will be an error in some compilers: + * class Derived : public Base + * { + * public: + * ~Derived() { } + * }; + * + * One particularly common reason to specify MOZ_FINAL upon a class is to tell + * the compiler that it's not dangerous for it to have a non-virtual destructor + * yet have one or more virtual functions, silencing the warning it might emit + * in this case. Suppose Base above weren't annotated with MOZ_FINAL. Because + * ~Base() is non-virtual, an attempt to delete a Derived* through a Base* + * wouldn't call ~Derived(), so any cleanup ~Derived() might do wouldn't happen. + * (Formally C++ says behavior is undefined, but compilers will likely just call + * ~Base() and not ~Derived().) Specifying MOZ_FINAL tells the compiler that + * it's safe for the destructor to be non-virtual. + * + * In compilers implementing final controls, it is an error to inherit from a + * class annotated with MOZ_FINAL. In other compilers it serves only as + * documentation. + * + * To annotate a virtual member function with MOZ_FINAL, place MOZ_FINAL + * immediately before the ';' terminating the member function's declaration, or + * before '= 0;' if the member function is pure. If the member function is + * defined in the class definition, it should appear before the opening brace of + * the function body. (This placement is identical to that for MOZ_OVERRIDE. + * If both are used, they should appear in the order 'MOZ_FINAL MOZ_OVERRIDE' + * for consistency.) + * + * class Base + * { + * public: + * virtual void f() MOZ_FINAL; + * }; + * class Derived + * { + * public: + * // This will be an error in some compilers: + * virtual void f(); + * }; + * + * In compilers implementing final controls, it is an error for a derived class + * to override a method annotated with MOZ_FINAL. In other compilers it serves + * only as documentation. + */ +#if defined(MOZ_HAVE_CXX11_FINAL) +# define MOZ_FINAL MOZ_HAVE_CXX11_FINAL +#else +# define MOZ_FINAL /* no support */ +#endif + +/** + * MOZ_WARN_UNUSED_RESULT tells the compiler to emit a warning if a function's + * return value is not used by the caller. + * + * Place this attribute at the very beginning of a function definition. For + * example, write + * + * MOZ_WARN_UNUSED_RESULT int foo(); + * + * or + * + * MOZ_WARN_UNUSED_RESULT int foo() { return 42; } + */ +#if defined(__GNUC__) || defined(__clang__) +# define MOZ_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) +#else +# define MOZ_WARN_UNUSED_RESULT +#endif + +/* + * The following macros are attributes that support the static analysis plugin + * included with Mozilla, and will be implemented (when such support is enabled) + * as C++11 attributes. Since such attributes are legal pretty much everywhere + * and have subtly different semantics depending on their placement, the + * following is a guide on where to place the attributes. + * + * Attributes that apply to a struct or class precede the name of the class: + * (Note that this is different from the placement of MOZ_FINAL for classes!) + * + * class MOZ_CLASS_ATTRIBUTE SomeClass {}; + * + * Attributes that apply to functions follow the parentheses and const + * qualifiers but precede MOZ_FINAL, MOZ_OVERRIDE and the function body: + * + * void DeclaredFunction() MOZ_FUNCTION_ATTRIBUTE; + * void SomeFunction() MOZ_FUNCTION_ATTRIBUTE {} + * void PureFunction() const MOZ_FUNCTION_ATTRIBUTE = 0; + * void OverriddenFunction() MOZ_FUNCTION_ATTIRBUTE MOZ_OVERRIDE; + * + * Attributes that apply to variables or parameters follow the variable's name: + * + * int variable MOZ_VARIABLE_ATTRIBUTE; + * + * Attributes that apply to types follow the type name: + * + * typedef int MOZ_TYPE_ATTRIBUTE MagicInt; + * int MOZ_TYPE_ATTRIBUTE someVariable; + * int* MOZ_TYPE_ATTRIBUTE magicPtrInt; + * int MOZ_TYPE_ATTRIBUTE* ptrToMagicInt; + * + * Attributes that apply to statements precede the statement: + * + * MOZ_IF_ATTRIBUTE if (x == 0) + * MOZ_DO_ATTRIBUTE do { } while (0); + * + * Attributes that apply to labels precede the label: + * + * MOZ_LABEL_ATTRIBUTE target: + * goto target; + * MOZ_CASE_ATTRIBUTE case 5: + * MOZ_DEFAULT_ATTRIBUTE default: + * + * The static analyses that are performed by the plugin are as follows: + * + * MOZ_MUST_OVERRIDE: Applies to all C++ member functions. All immediate + * subclasses must provide an exact override of this method; if a subclass + * does not override this method, the compiler will emit an error. This + * attribute is not limited to virtual methods, so if it is applied to a + * nonvirtual method and the subclass does not provide an equivalent + * definition, the compiler will emit an error. + * MOZ_STACK_CLASS: Applies to all classes. Any class with this annotation is + * expected to live on the stack, so it is a compile-time error to use it, or + * an array of such objects, as a global or static variable, or as the type of + * a new expression (unless placement new is being used). If a member of + * another class uses this class, or if another class inherits from this + * class, then it is considered to be a stack class as well, although this + * attribute need not be provided in such cases. + * MOZ_NONHEAP_CLASS: Applies to all classes. Any class with this annotation is + * expected to live on the stack or in static storage, so it is a compile-time + * error to use it, or an array of such objects, as the type of a new + * expression (unless placement new is being used). If a member of another + * class uses this class, or if another class inherits from this class, then + * it is considered to be a non-heap class as well, although this attribute + * need not be provided in such cases. + * MOZ_HEAP_ALLOCATOR: Applies to any function. This indicates that the return + * value is allocated on the heap, and will as a result check such allocations + * during MOZ_STACK_CLASS and MOZ_NONHEAP_CLASS annotation checking. + * MOZ_IMPLICIT: Applies to constructors. Implicit conversion constructors + * are disallowed by default unless they are marked as MOZ_IMPLICIT. This + * attribute must be used for constructors which intend to provide implicit + * conversions. + */ +#ifdef MOZ_CLANG_PLUGIN +# define MOZ_MUST_OVERRIDE __attribute__((annotate("moz_must_override"))) +# define MOZ_STACK_CLASS __attribute__((annotate("moz_stack_class"))) +# define MOZ_NONHEAP_CLASS __attribute__((annotate("moz_nonheap_class"))) +# define MOZ_IMPLICIT __attribute__((annotate("moz_implicit"))) +/* + * It turns out that clang doesn't like void func() __attribute__ {} without a + * warning, so use pragmas to disable the warning. This code won't work on GCC + * anyways, so the warning is safe to ignore. + */ +# define MOZ_HEAP_ALLOCATOR \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((annotate("moz_heap_allocator"))) \ + _Pragma("clang diagnostic pop") +#else +# define MOZ_MUST_OVERRIDE /* nothing */ +# define MOZ_STACK_CLASS /* nothing */ +# define MOZ_NONHEAP_CLASS /* nothing */ +# define MOZ_IMPLICIT /* nothing */ +# define MOZ_HEAP_ALLOCATOR /* nothing */ +#endif /* MOZ_CLANG_PLUGIN */ + +/* + * MOZ_THIS_IN_INITIALIZER_LIST is used to avoid a warning when we know that + * it's safe to use 'this' in an initializer list. + */ +#ifdef _MSC_VER +# define MOZ_THIS_IN_INITIALIZER_LIST() \ + __pragma(warning(push)) \ + __pragma(warning(disable:4355)) \ + this \ + __pragma(warning(pop)) +#else +# define MOZ_THIS_IN_INITIALIZER_LIST() this +#endif + +#endif /* __cplusplus */ + +#endif /* mozilla_Attributes_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BinarySearch.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BinarySearch.h new file mode 100644 index 0000000000..c8f593d6a9 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BinarySearch.h @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_BinarySearch_h +#define mozilla_BinarySearch_h + +#include "mozilla/Assertions.h" + +#include + +namespace mozilla { + +/* + * The algorithm searches the given container |aContainer| over the sorted + * index range [aBegin, aEnd) for an index |i| where |aContainer[i] == aTarget|. + * If such an index |i| is found, BinarySearch returns |true| and the index is + * returned via the outparam |aMatchOrInsertionPoint|. If no index is found, + * BinarySearch returns |false| and the outparam returns the first index in + * [aBegin, aEnd] where |aTarget| can be inserted to maintain sorted order. + * + * Example: + * + * Vector sortedInts = ... + * + * size_t match; + * if (BinarySearch(sortedInts, 0, sortedInts.length(), 13, &match)) { + * printf("found 13 at %lu\n", match); + * } + */ + +template +bool +BinarySearch(const Container& aContainer, size_t aBegin, size_t aEnd, + T aTarget, size_t* aMatchOrInsertionPoint) +{ + MOZ_ASSERT(aBegin <= aEnd); + + size_t low = aBegin; + size_t high = aEnd; + while (low != high) { + size_t middle = low + (high - low) / 2; + + // Allow any intermediate type so long as it provides a suitable ordering + // relation. + const auto& middleValue = aContainer[middle]; + + MOZ_ASSERT(aContainer[low] <= aContainer[middle]); + MOZ_ASSERT(aContainer[middle] <= aContainer[high - 1]); + MOZ_ASSERT(aContainer[low] <= aContainer[high - 1]); + + if (aTarget == middleValue) { + *aMatchOrInsertionPoint = middle; + return true; + } + + if (aTarget < middleValue) { + high = middle; + } else { + low = middle + 1; + } + } + + *aMatchOrInsertionPoint = low; + return false; +} + +} // namespace mozilla + +#endif // mozilla_BinarySearch_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BloomFilter.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BloomFilter.h new file mode 100644 index 0000000000..6757e41181 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/BloomFilter.h @@ -0,0 +1,256 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * A counting Bloom filter implementation. This allows consumers to + * do fast probabilistic "is item X in set Y?" testing which will + * never answer "no" when the correct answer is "yes" (but might + * incorrectly answer "yes" when the correct answer is "no"). + */ + +#ifndef mozilla_BloomFilter_h +#define mozilla_BloomFilter_h + +#include "mozilla/Assertions.h" +#include "mozilla/Likely.h" + +#include +#include + +namespace mozilla { + +/* + * This class implements a counting Bloom filter as described at + * , with + * 8-bit counters. This allows quick probabilistic answers to the + * question "is object X in set Y?" where the contents of Y might not + * be time-invariant. The probabilistic nature of the test means that + * sometimes the answer will be "yes" when it should be "no". If the + * answer is "no", then X is guaranteed not to be in Y. + * + * The filter is parametrized on KeySize, which is the size of the key + * generated by each of hash functions used by the filter, in bits, + * and the type of object T being added and removed. T must implement + * a |uint32_t hash() const| method which returns a uint32_t hash key + * that will be used to generate the two separate hash functions for + * the Bloom filter. This hash key MUST be well-distributed for good + * results! KeySize is not allowed to be larger than 16. + * + * The filter uses exactly 2**KeySize bytes of memory. From now on we + * will refer to the memory used by the filter as M. + * + * The expected rate of incorrect "yes" answers depends on M and on + * the number N of objects in set Y. As long as N is small compared + * to M, the rate of such answers is expected to be approximately + * 4*(N/M)**2 for this filter. In practice, if Y has a few hundred + * elements then using a KeySize of 12 gives a reasonably low + * incorrect answer rate. A KeySize of 12 has the additional benefit + * of using exactly one page for the filter in typical hardware + * configurations. + */ + +template +class BloomFilter +{ + /* + * A counting Bloom filter with 8-bit counters. For now we assume + * that having two hash functions is enough, but we may revisit that + * decision later. + * + * The filter uses an array with 2**KeySize entries. + * + * Assuming a well-distributed hash function, a Bloom filter with + * array size M containing N elements and + * using k hash function has expected false positive rate exactly + * + * $ (1 - (1 - 1/M)^{kN})^k $ + * + * because each array slot has a + * + * $ (1 - 1/M)^{kN} $ + * + * chance of being 0, and the expected false positive rate is the + * probability that all of the k hash functions will hit a nonzero + * slot. + * + * For reasonable assumptions (M large, kN large, which should both + * hold if we're worried about false positives) about M and kN this + * becomes approximately + * + * $$ (1 - \exp(-kN/M))^k $$ + * + * For our special case of k == 2, that's $(1 - \exp(-2N/M))^2$, + * or in other words + * + * $$ N/M = -0.5 * \ln(1 - \sqrt(r)) $$ + * + * where r is the false positive rate. This can be used to compute + * the desired KeySize for a given load N and false positive rate r. + * + * If N/M is assumed small, then the false positive rate can + * further be approximated as 4*N^2/M^2. So increasing KeySize by + * 1, which doubles M, reduces the false positive rate by about a + * factor of 4, and a false positive rate of 1% corresponds to + * about M/N == 20. + * + * What this means in practice is that for a few hundred keys using a + * KeySize of 12 gives false positive rates on the order of 0.25-4%. + * + * Similarly, using a KeySize of 10 would lead to a 4% false + * positive rate for N == 100 and to quite bad false positive + * rates for larger N. + */ +public: + BloomFilter() + { + static_assert(KeySize <= kKeyShift, "KeySize too big"); + + // Should we have a custom operator new using calloc instead and + // require that we're allocated via the operator? + clear(); + } + + /* + * Clear the filter. This should be done before reusing it, because + * just removing all items doesn't clear counters that hit the upper + * bound. + */ + void clear(); + + /* + * Add an item to the filter. + */ + void add(const T* aValue); + + /* + * Remove an item from the filter. + */ + void remove(const T* aValue); + + /* + * Check whether the filter might contain an item. This can + * sometimes return true even if the item is not in the filter, + * but will never return false for items that are actually in the + * filter. + */ + bool mightContain(const T* aValue) const; + + /* + * Methods for add/remove/contain when we already have a hash computed + */ + void add(uint32_t aHash); + void remove(uint32_t aHash); + bool mightContain(uint32_t aHash) const; + +private: + static const size_t kArraySize = (1 << KeySize); + static const uint32_t kKeyMask = (1 << KeySize) - 1; + static const uint32_t kKeyShift = 16; + + static uint32_t hash1(uint32_t aHash) + { + return aHash & kKeyMask; + } + static uint32_t hash2(uint32_t aHash) + { + return (aHash >> kKeyShift) & kKeyMask; + } + + uint8_t& firstSlot(uint32_t aHash) + { + return mCounters[hash1(aHash)]; + } + uint8_t& secondSlot(uint32_t aHash) + { + return mCounters[hash2(aHash)]; + } + + const uint8_t& firstSlot(uint32_t aHash) const + { + return mCounters[hash1(aHash)]; + } + const uint8_t& secondSlot(uint32_t aHash) const + { + return mCounters[hash2(aHash)]; + } + + static bool full(const uint8_t& aSlot) { return aSlot == UINT8_MAX; } + + uint8_t mCounters[kArraySize]; +}; + +template +inline void +BloomFilter::clear() +{ + memset(mCounters, 0, kArraySize); +} + +template +inline void +BloomFilter::add(uint32_t aHash) +{ + uint8_t& slot1 = firstSlot(aHash); + if (MOZ_LIKELY(!full(slot1))) { + ++slot1; + } + uint8_t& slot2 = secondSlot(aHash); + if (MOZ_LIKELY(!full(slot2))) { + ++slot2; + } +} + +template +MOZ_ALWAYS_INLINE void +BloomFilter::add(const T* aValue) +{ + uint32_t hash = aValue->hash(); + return add(hash); +} + +template +inline void +BloomFilter::remove(uint32_t aHash) +{ + // If the slots are full, we don't know whether we bumped them to be + // there when we added or not, so just leave them full. + uint8_t& slot1 = firstSlot(aHash); + if (MOZ_LIKELY(!full(slot1))) { + --slot1; + } + uint8_t& slot2 = secondSlot(aHash); + if (MOZ_LIKELY(!full(slot2))) { + --slot2; + } +} + +template +MOZ_ALWAYS_INLINE void +BloomFilter::remove(const T* aValue) +{ + uint32_t hash = aValue->hash(); + remove(hash); +} + +template +MOZ_ALWAYS_INLINE bool +BloomFilter::mightContain(uint32_t aHash) const +{ + // Check that all the slots for this hash contain something + return firstSlot(aHash) && secondSlot(aHash); +} + +template +MOZ_ALWAYS_INLINE bool +BloomFilter::mightContain(const T* aValue) const +{ + uint32_t hash = aValue->hash(); + return mightContain(hash); +} + +} // namespace mozilla + +#endif /* mozilla_BloomFilter_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Casting.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Casting.h new file mode 100644 index 0000000000..dc449af6b6 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Casting.h @@ -0,0 +1,221 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Cast operations to supplement the built-in casting operations. */ + +#ifndef mozilla_Casting_h +#define mozilla_Casting_h + +#include "mozilla/Assertions.h" +#include "mozilla/TypeTraits.h" + +#include + +namespace mozilla { + +/** + * Return a value of type |To|, containing the underlying bit pattern of + * |aFrom|. + * + * |To| and |From| must be types of the same size; be careful of cross-platform + * size differences, or this might fail to compile on some but not all + * platforms. + */ +template +inline To +BitwiseCast(const From aFrom) +{ + static_assert(sizeof(From) == sizeof(To), + "To and From must have the same size"); + union + { + From mFrom; + To mTo; + } u; + u.mFrom = aFrom; + return u.mTo; +} + +namespace detail { + +enum ToSignedness { ToIsSigned, ToIsUnsigned }; +enum FromSignedness { FromIsSigned, FromIsUnsigned }; + +template::value ? FromIsSigned : FromIsUnsigned, + ToSignedness = IsSigned::value ? ToIsSigned : ToIsUnsigned> +struct BoundsCheckImpl; + +// Implicit conversions on operands to binary operations make this all a bit +// hard to verify. Attempt to ease the pain below by *only* comparing values +// that are obviously the same type (and will undergo no further conversions), +// even when it's not strictly necessary, for explicitness. + +enum UUComparison { FromIsBigger, FromIsNotBigger }; + +// Unsigned-to-unsigned range check + +template sizeof(To)) + ? FromIsBigger + : FromIsNotBigger> +struct UnsignedUnsignedCheck; + +template +struct UnsignedUnsignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + return aFrom <= From(To(-1)); + } +}; + +template +struct UnsignedUnsignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + return true; + } +}; + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + return UnsignedUnsignedCheck::checkBounds(aFrom); + } +}; + +// Signed-to-unsigned range check + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + if (aFrom < 0) { + return false; + } + if (sizeof(To) >= sizeof(From)) { + return true; + } + return aFrom <= From(To(-1)); + } +}; + +// Unsigned-to-signed range check + +enum USComparison { FromIsSmaller, FromIsNotSmaller }; + +template +struct UnsignedSignedCheck; + +template +struct UnsignedSignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + return true; + } +}; + +template +struct UnsignedSignedCheck +{ +public: + static bool checkBounds(const From aFrom) + { + const To MaxValue = To((1ULL << (CHAR_BIT * sizeof(To) - 1)) - 1); + return aFrom <= From(MaxValue); + } +}; + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + return UnsignedSignedCheck::checkBounds(aFrom); + } +}; + +// Signed-to-signed range check + +template +struct BoundsCheckImpl +{ +public: + static bool checkBounds(const From aFrom) + { + if (sizeof(From) <= sizeof(To)) { + return true; + } + const To MaxValue = To((1ULL << (CHAR_BIT * sizeof(To) - 1)) - 1); + const To MinValue = -MaxValue - To(1); + return From(MinValue) <= aFrom && + From(aFrom) <= From(MaxValue); + } +}; + +template::value && + IsIntegral::value> +class BoundsChecker; + +template +class BoundsChecker +{ +public: + static bool checkBounds(const From aFrom) { return true; } +}; + +template +class BoundsChecker +{ +public: + static bool checkBounds(const From aFrom) + { + return BoundsCheckImpl::checkBounds(aFrom); + } +}; + +template +inline bool +IsInBounds(const From aFrom) +{ + return BoundsChecker::checkBounds(aFrom); +} + +} // namespace detail + +/** + * Cast a value of integral type |From| to a value of integral type |To|, + * asserting that the cast will be a safe cast per C++ (that is, that |to| is in + * the range of values permitted for the type |From|). + */ +template +inline To +SafeCast(const From aFrom) +{ + MOZ_ASSERT((detail::IsInBounds(aFrom))); + return static_cast(aFrom); +} + +} // namespace mozilla + +#endif /* mozilla_Casting_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ChaosMode.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ChaosMode.h new file mode 100644 index 0000000000..ff59f2c6ec --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ChaosMode.h @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_ChaosMode_h +#define mozilla_ChaosMode_h + +#include +#include + +namespace mozilla { + +/** + * When "chaos mode" is activated, code that makes implicitly nondeterministic + * choices is encouraged to make random and extreme choices, to test more + * code paths and uncover bugs. + */ +class ChaosMode +{ +public: + static bool isActive() + { + // Flip this to true to activate chaos mode + return false; + } + + /** + * Returns a somewhat (but not uniformly) random uint32_t < aBound. + * Not to be used for anything except ChaosMode, since it's not very random. + */ + static uint32_t randomUint32LessThan(uint32_t aBound) + { + return uint32_t(rand()) % aBound; + } +}; + +} /* namespace mozilla */ + +#endif /* mozilla_ChaosMode_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Char16.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Char16.h new file mode 100644 index 0000000000..e54eb0d5c8 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Char16.h @@ -0,0 +1,192 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Implements a UTF-16 character type. */ + +#ifndef mozilla_Char16_h +#define mozilla_Char16_h + +#ifdef __cplusplus + +/* + * C++11 introduces a char16_t type and support for UTF-16 string and character + * literals. C++11's char16_t is a distinct builtin type. Technically, char16_t + * is a 16-bit code unit of a Unicode code point, not a "character". + */ + +#ifdef _MSC_VER + /* + * C++11 says char16_t is a distinct builtin type, but Windows's yvals.h + * typedefs char16_t as an unsigned short. We would like to alias char16_t + * to Windows's 16-bit wchar_t so we can declare UTF-16 literals as constant + * expressions (and pass char16_t pointers to Windows APIs). We #define + * _CHAR16T here in order to prevent yvals.h from overriding our char16_t + * typedefs, which we set to wchar_t for C++ code. + * + * In addition, #defining _CHAR16T will prevent yvals.h from defining a + * char32_t type, so we have to undo that damage here and provide our own, + * which is identical to the yvals.h type. + */ +# define MOZ_UTF16_HELPER(s) L##s +# define _CHAR16T +typedef wchar_t char16_t; +typedef unsigned int char32_t; +#else + /* C++11 has a builtin char16_t type. */ +# define MOZ_UTF16_HELPER(s) u##s + /** + * This macro is used to distinguish when char16_t would be a distinct + * typedef from wchar_t. + */ +# define MOZ_CHAR16_IS_NOT_WCHAR +# ifdef WIN32 +# define MOZ_USE_CHAR16_WRAPPER +# endif +#endif + +#ifdef MOZ_USE_CHAR16_WRAPPER +# include + /** + * Win32 API extensively uses wchar_t, which is represented by a separated + * builtin type than char16_t per spec. It's not the case for MSVC, but GCC + * follows the spec. We want to mix wchar_t and char16_t on Windows builds. + * This class is supposed to make it easier. It stores char16_t const pointer, + * but provides implicit casts for wchar_t as well. On other platforms, we + * simply use |typedef const char16_t* char16ptr_t|. Here, we want to make + * the class as similar to this typedef, including providing some casts that + * are allowed by the typedef. + */ +class char16ptr_t +{ +private: + const char16_t* mPtr; + static_assert(sizeof(char16_t) == sizeof(wchar_t), + "char16_t and wchar_t sizes differ"); + +public: + char16ptr_t(const char16_t* aPtr) : mPtr(aPtr) {} + char16ptr_t(const wchar_t* aPtr) : + mPtr(reinterpret_cast(aPtr)) + {} + + /* Without this, nullptr assignment would be ambiguous. */ + constexpr char16ptr_t(decltype(nullptr)) : mPtr(nullptr) {} + + operator const char16_t*() const + { + return mPtr; + } + operator const wchar_t*() const + { + return reinterpret_cast(mPtr); + } + operator const void*() const + { + return mPtr; + } + operator bool() const + { + return mPtr != nullptr; + } + operator std::wstring() const + { + return std::wstring(static_cast(*this)); + } + + /* Explicit cast operators to allow things like (char16_t*)str. */ + explicit operator char16_t*() const + { + return const_cast(mPtr); + } + explicit operator wchar_t*() const + { + return const_cast(static_cast(*this)); + } + + /** + * Some Windows API calls accept BYTE* but require that data actually be + * WCHAR*. Supporting this requires explicit operators to support the + * requisite explicit casts. + */ + explicit operator const char*() const + { + return reinterpret_cast(mPtr); + } + explicit operator const unsigned char*() const + { + return reinterpret_cast(mPtr); + } + explicit operator unsigned char*() const + { + return + const_cast(reinterpret_cast(mPtr)); + } + explicit operator void*() const + { + return const_cast(mPtr); + } + + /* Some operators used on pointers. */ + char16_t operator[](size_t aIndex) const + { + return mPtr[aIndex]; + } + bool operator==(const char16ptr_t& aOther) const + { + return mPtr == aOther.mPtr; + } + bool operator==(decltype(nullptr)) const + { + return mPtr == nullptr; + } + bool operator!=(const char16ptr_t& aOther) const + { + return mPtr != aOther.mPtr; + } + bool operator!=(decltype(nullptr)) const + { + return mPtr != nullptr; + } + char16ptr_t operator+(size_t aValue) const + { + return char16ptr_t(mPtr + aValue); + } + ptrdiff_t operator-(const char16ptr_t& aOther) const + { + return mPtr - aOther.mPtr; + } +}; + +inline decltype((char*)0-(char*)0) +operator-(const char16_t* aX, const char16ptr_t aY) +{ + return aX - static_cast(aY); +} + +#else + +typedef const char16_t* char16ptr_t; + +#endif + +/* + * Macro arguments used in concatenation or stringification won't be expanded. + * Therefore, in order for |MOZ_UTF16(FOO)| to work as expected (which is to + * expand |FOO| before doing whatever |MOZ_UTF16| needs to do to it) a helper + * macro, |MOZ_UTF16_HELPER| needs to be inserted in between to allow the macro + * argument to expand. See "3.10.6 Separate Expansion of Macro Arguments" of the + * CPP manual for a more accurate and precise explanation. + */ +#define MOZ_UTF16(s) MOZ_UTF16_HELPER(s) + +static_assert(sizeof(char16_t) == 2, "Is char16_t type 16 bits?"); +static_assert(char16_t(-1) > char16_t(0), "Is char16_t type unsigned?"); +static_assert(sizeof(MOZ_UTF16('A')) == 2, "Is char literal 16 bits?"); +static_assert(sizeof(MOZ_UTF16("")[0]) == 2, "Is string char 16 bits?"); + +#endif + +#endif /* mozilla_Char16_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/CheckedInt.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/CheckedInt.h new file mode 100644 index 0000000000..ad4c5fef41 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/CheckedInt.h @@ -0,0 +1,779 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Provides checked integers, detecting integer overflow and divide-by-0. */ + +#ifndef mozilla_CheckedInt_h +#define mozilla_CheckedInt_h + +#include +#include "mozilla/Assertions.h" +#include "mozilla/IntegerTypeTraits.h" + +namespace mozilla { + +template class CheckedInt; + +namespace detail { + +/* + * Step 1: manually record supported types + * + * What's nontrivial here is that there are different families of integer + * types: basic integer types and stdint types. It is merrily undefined which + * types from one family may be just typedefs for a type from another family. + * + * For example, on GCC 4.6, aside from the basic integer types, the only other + * type that isn't just a typedef for some of them, is int8_t. + */ + +struct UnsupportedType {}; + +template +struct IsSupportedPass2 +{ + static const bool value = false; +}; + +template +struct IsSupported +{ + static const bool value = IsSupportedPass2::value; +}; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + +template<> +struct IsSupported +{ static const bool value = true; }; + + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +template<> +struct IsSupportedPass2 +{ static const bool value = true; }; + +/* + * Step 2: Implement the actual validity checks. + * + * Ideas taken from IntegerLib, code different. + */ + +template +struct TwiceBiggerType +{ + typedef typename detail::StdintTypeForSizeAndSignedness< + sizeof(IntegerType) * 2, + IsSigned::value + >::Type Type; +}; + +template +struct TwiceBiggerType +{ + typedef UnsupportedType Type; +}; + +template +inline bool +HasSignBit(T aX) +{ + // In C++, right bit shifts on negative values is undefined by the standard. + // Notice that signed-to-unsigned conversions are always well-defined in the + // standard, as the value congruent modulo 2**n as expected. By contrast, + // unsigned-to-signed is only well-defined if the value is representable. + return bool(typename MakeUnsigned::Type(aX) >> + PositionOfSignBit::value); +} + +// Bitwise ops may return a larger type, so it's good to use this inline +// helper guaranteeing that the result is really of type T. +template +inline T +BinaryComplement(T aX) +{ + return ~aX; +} + +template::value, + bool IsUSigned = IsSigned::value> +struct DoesRangeContainRange +{ +}; + +template +struct DoesRangeContainRange +{ + static const bool value = sizeof(T) >= sizeof(U); +}; + +template +struct DoesRangeContainRange +{ + static const bool value = sizeof(T) > sizeof(U); +}; + +template +struct DoesRangeContainRange +{ + static const bool value = false; +}; + +template::value, + bool IsUSigned = IsSigned::value, + bool DoesTRangeContainURange = DoesRangeContainRange::value> +struct IsInRangeImpl {}; + +template +struct IsInRangeImpl +{ + static bool run(U) + { + return true; + } +}; + +template +struct IsInRangeImpl +{ + static bool run(U aX) + { + return aX <= MaxValue::value && aX >= MinValue::value; + } +}; + +template +struct IsInRangeImpl +{ + static bool run(U aX) + { + return aX <= MaxValue::value; + } +}; + +template +struct IsInRangeImpl +{ + static bool run(U aX) + { + return sizeof(T) > sizeof(U) || aX <= U(MaxValue::value); + } +}; + +template +struct IsInRangeImpl +{ + static bool run(U aX) + { + return sizeof(T) >= sizeof(U) + ? aX >= 0 + : aX >= 0 && aX <= U(MaxValue::value); + } +}; + +template +inline bool +IsInRange(U aX) +{ + return IsInRangeImpl::run(aX); +} + +template +inline bool +IsAddValid(T aX, T aY) +{ + // Addition is valid if the sign of aX+aY is equal to either that of aX or + // that of aY. Since the value of aX+aY is undefined if we have a signed + // type, we compute it using the unsigned type of the same size. Beware! + // These bitwise operations can return a larger integer type, if T was a + // small type like int8_t, so we explicitly cast to T. + + typename MakeUnsigned::Type ux = aX; + typename MakeUnsigned::Type uy = aY; + typename MakeUnsigned::Type result = ux + uy; + return IsSigned::value + ? HasSignBit(BinaryComplement(T((result ^ aX) & (result ^ aY)))) + : BinaryComplement(aX) >= aY; +} + +template +inline bool +IsSubValid(T aX, T aY) +{ + // Subtraction is valid if either aX and aY have same sign, or aX-aY and aX + // have same sign. Since the value of aX-aY is undefined if we have a signed + // type, we compute it using the unsigned type of the same size. + typename MakeUnsigned::Type ux = aX; + typename MakeUnsigned::Type uy = aY; + typename MakeUnsigned::Type result = ux - uy; + + return IsSigned::value + ? HasSignBit(BinaryComplement(T((result ^ aX) & (aX ^ aY)))) + : aX >= aY; +} + +template::value, + bool TwiceBiggerTypeIsSupported = + IsSupported::Type>::value> +struct IsMulValidImpl {}; + +template +struct IsMulValidImpl +{ + static bool run(T aX, T aY) + { + typedef typename TwiceBiggerType::Type TwiceBiggerType; + TwiceBiggerType product = TwiceBiggerType(aX) * TwiceBiggerType(aY); + return IsInRange(product); + } +}; + +template +struct IsMulValidImpl +{ + static bool run(T aX, T aY) + { + const T max = MaxValue::value; + const T min = MinValue::value; + + if (aX == 0 || aY == 0) { + return true; + } + if (aX > 0) { + return aY > 0 + ? aX <= max / aY + : aY >= min / aX; + } + + // If we reach this point, we know that aX < 0. + return aY > 0 + ? aX >= min / aY + : aY >= max / aX; + } +}; + +template +struct IsMulValidImpl +{ + static bool run(T aX, T aY) + { + return aY == 0 || aX <= MaxValue::value / aY; + } +}; + +template +inline bool +IsMulValid(T aX, T aY) +{ + return IsMulValidImpl::run(aX, aY); +} + +template +inline bool +IsDivValid(T aX, T aY) +{ + // Keep in mind that in the signed case, min/-1 is invalid because + // abs(min)>max. + return aY != 0 && + !(IsSigned::value && aX == MinValue::value && aY == T(-1)); +} + +template::value> +struct IsModValidImpl; + +template +inline bool +IsModValid(T aX, T aY) +{ + return IsModValidImpl::run(aX, aY); +} + +/* + * Mod is pretty simple. + * For now, let's just use the ANSI C definition: + * If aX or aY are negative, the results are implementation defined. + * Consider these invalid. + * Undefined for aY=0. + * The result will never exceed either aX or aY. + * + * Checking that aX>=0 is a warning when T is unsigned. + */ + +template +struct IsModValidImpl +{ + static inline bool run(T aX, T aY) + { + return aY >= 1; + } +}; + +template +struct IsModValidImpl +{ + static inline bool run(T aX, T aY) + { + if (aX < 0) { + return false; + } + return aY >= 1; + } +}; + +template::value> +struct NegateImpl; + +template +struct NegateImpl +{ + static CheckedInt negate(const CheckedInt& aVal) + { + // Handle negation separately for signed/unsigned, for simpler code and to + // avoid an MSVC warning negating an unsigned value. + return CheckedInt(0, aVal.isValid() && aVal.mValue == 0); + } +}; + +template +struct NegateImpl +{ + static CheckedInt negate(const CheckedInt& aVal) + { + // Watch out for the min-value, which (with twos-complement) can't be + // negated as -min-value is then (max-value + 1). + if (!aVal.isValid() || aVal.mValue == MinValue::value) { + return CheckedInt(aVal.mValue, false); + } + return CheckedInt(-aVal.mValue, true); + } +}; + +} // namespace detail + + +/* + * Step 3: Now define the CheckedInt class. + */ + +/** + * @class CheckedInt + * @brief Integer wrapper class checking for integer overflow and other errors + * @param T the integer type to wrap. Can be any type among the following: + * - any basic integer type such as |int| + * - any stdint type such as |int8_t| + * + * This class implements guarded integer arithmetic. Do a computation, check + * that isValid() returns true, you then have a guarantee that no problem, such + * as integer overflow, happened during this computation, and you can call + * value() to get the plain integer value. + * + * The arithmetic operators in this class are guaranteed not to raise a signal + * (e.g. in case of a division by zero). + * + * For example, suppose that you want to implement a function that computes + * (aX+aY)/aZ, that doesn't crash if aZ==0, and that reports on error (divide by + * zero or integer overflow). You could code it as follows: + @code + bool computeXPlusYOverZ(int aX, int aY, int aZ, int* aResult) + { + CheckedInt checkedResult = (CheckedInt(aX) + aY) / aZ; + if (checkedResult.isValid()) { + *aResult = checkedResult.value(); + return true; + } else { + return false; + } + } + @endcode + * + * Implicit conversion from plain integers to checked integers is allowed. The + * plain integer is checked to be in range before being casted to the + * destination type. This means that the following lines all compile, and the + * resulting CheckedInts are correctly detected as valid or invalid: + * @code + // 1 is of type int, is found to be in range for uint8_t, x is valid + CheckedInt x(1); + // -1 is of type int, is found not to be in range for uint8_t, x is invalid + CheckedInt x(-1); + // -1 is of type int, is found to be in range for int8_t, x is valid + CheckedInt x(-1); + // 1000 is of type int16_t, is found not to be in range for int8_t, + // x is invalid + CheckedInt x(int16_t(1000)); + // 3123456789 is of type uint32_t, is found not to be in range for int32_t, + // x is invalid + CheckedInt x(uint32_t(3123456789)); + * @endcode + * Implicit conversion from + * checked integers to plain integers is not allowed. As shown in the + * above example, to get the value of a checked integer as a normal integer, + * call value(). + * + * Arithmetic operations between checked and plain integers is allowed; the + * result type is the type of the checked integer. + * + * Checked integers of different types cannot be used in the same arithmetic + * expression. + * + * There are convenience typedefs for all stdint types, of the following form + * (these are just 2 examples): + @code + typedef CheckedInt CheckedInt32; + typedef CheckedInt CheckedUint16; + @endcode + */ +template +class CheckedInt +{ +protected: + T mValue; + bool mIsValid; + + template + CheckedInt(U aValue, bool aIsValid) : mValue(aValue), mIsValid(aIsValid) + { + static_assert(detail::IsSupported::value && + detail::IsSupported::value, + "This type is not supported by CheckedInt"); + } + + friend struct detail::NegateImpl; + +public: + /** + * Constructs a checked integer with given @a value. The checked integer is + * initialized as valid or invalid depending on whether the @a value + * is in range. + * + * This constructor is not explicit. Instead, the type of its argument is a + * separate template parameter, ensuring that no conversion is performed + * before this constructor is actually called. As explained in the above + * documentation for class CheckedInt, this constructor checks that its + * argument is valid. + */ + template + CheckedInt(U aValue) + : mValue(T(aValue)), + mIsValid(detail::IsInRange(aValue)) + { + static_assert(detail::IsSupported::value && + detail::IsSupported::value, + "This type is not supported by CheckedInt"); + } + + template + friend class CheckedInt; + + template + CheckedInt toChecked() const + { + CheckedInt ret(mValue); + ret.mIsValid = ret.mIsValid && mIsValid; + return ret; + } + + /** Constructs a valid checked integer with initial value 0 */ + CheckedInt() : mValue(0), mIsValid(true) + { + static_assert(detail::IsSupported::value, + "This type is not supported by CheckedInt"); + } + + /** @returns the actual value */ + T value() const + { + MOZ_ASSERT(mIsValid, "Invalid checked integer (division by zero or integer overflow)"); + return mValue; + } + + /** + * @returns true if the checked integer is valid, i.e. is not the result + * of an invalid operation or of an operation involving an invalid checked + * integer + */ + bool isValid() const + { + return mIsValid; + } + + template + friend CheckedInt operator +(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator +=(U aRhs); + + template + friend CheckedInt operator -(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator -=(U aRhs); + + template + friend CheckedInt operator *(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator *=(U aRhs); + + template + friend CheckedInt operator /(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator /=(U aRhs); + + template + friend CheckedInt operator %(const CheckedInt& aLhs, + const CheckedInt& aRhs); + template + CheckedInt& operator %=(U aRhs); + + CheckedInt operator -() const + { + return detail::NegateImpl::negate(*this); + } + + /** + * @returns true if the left and right hand sides are valid + * and have the same value. + * + * Note that these semantics are the reason why we don't offer + * a operator!=. Indeed, we'd want to have a!=b be equivalent to !(a==b) + * but that would mean that whenever a or b is invalid, a!=b + * is always true, which would be very confusing. + * + * For similar reasons, operators <, >, <=, >= would be very tricky to + * specify, so we just avoid offering them. + * + * Notice that these == semantics are made more reasonable by these facts: + * 1. a==b implies equality at the raw data level + * (the converse is false, as a==b is never true among invalids) + * 2. This is similar to the behavior of IEEE floats, where a==b + * means that a and b have the same value *and* neither is NaN. + */ + bool operator ==(const CheckedInt& aOther) const + { + return mIsValid && aOther.mIsValid && mValue == aOther.mValue; + } + + /** prefix ++ */ + CheckedInt& operator++() + { + *this += 1; + return *this; + } + + /** postfix ++ */ + CheckedInt operator++(int) + { + CheckedInt tmp = *this; + *this += 1; + return tmp; + } + + /** prefix -- */ + CheckedInt& operator--() + { + *this -= 1; + return *this; + } + + /** postfix -- */ + CheckedInt operator--(int) + { + CheckedInt tmp = *this; + *this -= 1; + return tmp; + } + +private: + /** + * The !=, <, <=, >, >= operators are disabled: + * see the comment on operator==. + */ + template bool operator !=(U aOther) const MOZ_DELETE; + template bool operator < (U aOther) const MOZ_DELETE; + template bool operator <=(U aOther) const MOZ_DELETE; + template bool operator > (U aOther) const MOZ_DELETE; + template bool operator >=(U aOther) const MOZ_DELETE; +}; + +#define MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(NAME, OP) \ + template \ + inline CheckedInt \ + operator OP(const CheckedInt &aLhs, const CheckedInt &aRhs) \ + { \ + if (!detail::Is##NAME##Valid(aLhs.mValue, aRhs.mValue)) { \ + return CheckedInt(0, false); \ + } \ + return CheckedInt(aLhs.mValue OP aRhs.mValue, \ + aLhs.mIsValid && aRhs.mIsValid); \ + } + +MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Add, +) +MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Sub, -) +MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Mul, *) +MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Div, /) +MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Mod, %) + +#undef MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR + +// Implement castToCheckedInt(x), making sure that +// - it allows x to be either a CheckedInt or any integer type +// that can be casted to T +// - if x is already a CheckedInt, we just return a reference to it, +// instead of copying it (optimization) + +namespace detail { + +template +struct CastToCheckedIntImpl +{ + typedef CheckedInt ReturnType; + static CheckedInt run(U aU) { return aU; } +}; + +template +struct CastToCheckedIntImpl > +{ + typedef const CheckedInt& ReturnType; + static const CheckedInt& run(const CheckedInt& aU) { return aU; } +}; + +} // namespace detail + +template +inline typename detail::CastToCheckedIntImpl::ReturnType +castToCheckedInt(U aU) +{ + static_assert(detail::IsSupported::value && + detail::IsSupported::value, + "This type is not supported by CheckedInt"); + return detail::CastToCheckedIntImpl::run(aU); +} + +#define MOZ_CHECKEDINT_CONVENIENCE_BINARY_OPERATORS(OP, COMPOUND_OP) \ + template \ + template \ + CheckedInt& CheckedInt::operator COMPOUND_OP(U aRhs) \ + { \ + *this = *this OP castToCheckedInt(aRhs); \ + return *this; \ + } \ + template \ + inline CheckedInt operator OP(const CheckedInt &aLhs, U aRhs) \ + { \ + return aLhs OP castToCheckedInt(aRhs); \ + } \ + template \ + inline CheckedInt operator OP(U aLhs, const CheckedInt &aRhs) \ + { \ + return castToCheckedInt(aLhs) OP aRhs; \ + } + +MOZ_CHECKEDINT_CONVENIENCE_BINARY_OPERATORS(+, +=) +MOZ_CHECKEDINT_CONVENIENCE_BINARY_OPERATORS(*, *=) +MOZ_CHECKEDINT_CONVENIENCE_BINARY_OPERATORS(-, -=) +MOZ_CHECKEDINT_CONVENIENCE_BINARY_OPERATORS(/, /=) +MOZ_CHECKEDINT_CONVENIENCE_BINARY_OPERATORS(%, %=) + +#undef MOZ_CHECKEDINT_CONVENIENCE_BINARY_OPERATORS + +template +inline bool +operator ==(const CheckedInt &aLhs, U aRhs) +{ + return aLhs == castToCheckedInt(aRhs); +} + +template +inline bool +operator ==(U aLhs, const CheckedInt &aRhs) +{ + return castToCheckedInt(aLhs) == aRhs; +} + +// Convenience typedefs. +typedef CheckedInt CheckedInt8; +typedef CheckedInt CheckedUint8; +typedef CheckedInt CheckedInt16; +typedef CheckedInt CheckedUint16; +typedef CheckedInt CheckedInt32; +typedef CheckedInt CheckedUint32; +typedef CheckedInt CheckedInt64; +typedef CheckedInt CheckedUint64; + +} // namespace mozilla + +#endif /* mozilla_CheckedInt_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compiler.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compiler.h new file mode 100644 index 0000000000..50f127da86 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compiler.h @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Various compiler checks. */ + +#ifndef mozilla_Compiler_h +#define mozilla_Compiler_h + +#define MOZ_IS_GCC 0 +#define MOS_IS_MSVC 0 + +#if !defined(__clang__) && defined(__GNUC__) + +# undef MOZ_IS_GCC +# define MOZ_IS_GCC 1 + /* + * This macro should simplify gcc version checking. For example, to check + * for gcc 4.5.1 or later, check `#if MOZ_GCC_VERSION_AT_LEAST(4, 5, 1)`. + */ +# define MOZ_GCC_VERSION_AT_LEAST(major, minor, patchlevel) \ + ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) \ + >= ((major) * 10000 + (minor) * 100 + (patchlevel))) +# if !MOZ_GCC_VERSION_AT_LEAST(4, 4, 0) +# error "mfbt (and Gecko) require at least gcc 4.4 to build." +# endif + +#elif defined(_MSC_VER) + +# undef MOZ_IS_MSVC +# define MOZ_IS_MSVC 1 + /* + * This macro should simplify MSVC version checking. For example, to check + * for VC10 or later, check `#ifdef MOZ_MSVC_VERSION_AT_LEAST(10)`. + */ +# define MOZ_MSVC_VERSION_AT_LEAST(version) \ + (version == 10 ? _MSC_VER >= 1600 : \ + (version == 11 ? _MSC_VER >= 1700 : \ + (version == 12 ? _MSC_VER >= 1800 : \ + (version == 13 ? _MSC_VER >= 1900 : \ + 0)))) +# if !MOZ_MSVC_VERSION_AT_LEAST(10) +# error "mfbt (and Gecko) require at least MSVC 2010 RTM to build." +# endif + +#endif + +/* + * The situation with standard libraries is a lot worse than with compilers, + * particularly as clang and gcc could end up using one of three or so standard + * libraries, and they may not be up-to-snuff with newer C++11 versions. To + * detect the library, we're going to include cstddef (which is a small header + * which will be transitively included by everybody else at some point) to grab + * the version macros and deduce macros from there. + */ +#ifdef __cplusplus +# include +# ifdef _STLPORT_MAJOR +# define MOZ_USING_STLPORT 1 +# define MOZ_STLPORT_VERSION_AT_LEAST(major, minor, patch) \ + (_STLPORT_VERSION >= ((major) << 8 | (minor) << 4 | (patch))) +# elif defined(_LIBCPP_VERSION) + /* + * libc++, unfortunately, doesn't appear to have useful versioning macros. + * Hopefully, the recommendations of N3694 with respect to standard libraries + * will get applied instead and we won't need to worry about version numbers + * here. + */ +# define MOZ_USING_LIBCXX 1 +# elif defined(__GLIBCXX__) +# define MOZ_USING_LIBSTDCXX 1 + /* + * libstdc++ is also annoying and doesn't give us useful versioning macros + * for the library. If we're using gcc, then assume that libstdc++ matches + * the compiler version. If we're using clang, we're going to have to fake + * major/minor combinations by looking for newly-defined config macros. + */ +# if MOZ_IS_GCC +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + MOZ_GCC_VERSION_AT_LEAST(major, minor, patch) +# elif defined(_GLIBCXX_THROW_OR_ABORT) +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + ((major) < 4 || ((major) == 4 && (minor) <= 8)) +# elif defined(_GLIBCXX_NOEXCEPT) +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + ((major) < 4 || ((major) == 4 && (minor) <= 7)) +# elif defined(_GLIBCXX_USE_DEPRECATED) +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + ((major) < 4 || ((major) == 4 && (minor) <= 6)) +# elif defined(_GLIBCXX_PSEUDO_VISIBILITY) +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + ((major) < 4 || ((major) == 4 && (minor) <= 5)) +# elif defined(_GLIBCXX_BEGIN_EXTERN_C) +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + ((major) < 4 || ((major) == 4 && (minor) <= 4)) +# elif defined(_GLIBCXX_VISIBILITY_ATTR) +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + ((major) < 4 || ((major) == 4 && (minor) <= 3)) +# elif defined(_GLIBCXX_VISIBILITY) +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) \ + ((major) < 4 || ((major) == 4 && (minor) <= 2)) +# else +# error "Your version of libstdc++ is unknown to us and is likely too old." +# endif +# endif + + // Flesh out the defines for everyone else +# ifndef MOZ_USING_STLPORT +# define MOZ_USING_STLPORT 0 +# define MOZ_STLPORT_VERSION_AT_LEAST(major, minor, patch) 0 +# endif +# ifndef MOZ_USING_LIBCXX +# define MOZ_USING_LIBCXX 0 +# endif +# ifndef MOZ_USING_LIBSTDCXX +# define MOZ_USING_LIBSTDCXX 0 +# define MOZ_LIBSTDCXX_VERSION_AT_LEAST(major, minor, patch) 0 +# endif +#endif /* __cplusplus */ + +#endif /* mozilla_Compiler_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compression.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compression.h new file mode 100644 index 0000000000..a764a1b5d5 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Compression.h @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Various simple compression/decompression functions. */ + +#ifndef mozilla_Compression_h_ +#define mozilla_Compression_h_ + +#include "mozilla/Types.h" +#include "mozilla/Assertions.h" + +namespace mozilla { +namespace Compression { + +/** + * LZ4 is a very fast byte-wise compression algorithm. + * + * Compared to Google's Snappy it is faster to compress and decompress and + * generally produces output of about the same size. + * + * Compared to zlib it compresses at about 10x the speed, decompresses at about + * 4x the speed and produces output of about 1.5x the size. + */ + +class LZ4 +{ +public: + /** + * Compresses |aInputSize| bytes from |aSource| into |aDest|. Destination + * buffer must be already allocated, and must be sized to handle worst cases + * situations (input data not compressible). Worst case size evaluation is + * provided by function maxCompressedSize() + * + * @param aInputSize is the input size. Max supported value is ~1.9GB + * @return the number of bytes written in buffer |aDest| + */ + static MFBT_API size_t + compress(const char* aSource, size_t aInputSize, char* aDest); + + /** + * Compress |aInputSize| bytes from |aSource| into an output buffer + * |aDest| of maximum size |aMaxOutputSize|. If it cannot achieve it, + * compression will stop, and result of the function will be zero, + * |aDest| will still be written to, but since the number of input + * bytes consumed is not returned the result is not usable. + * + * This function never writes outside of provided output buffer. + * + * @param aInputSize is the input size. Max supported value is ~1.9GB + * @param aMaxOutputSize is the size of the destination buffer (which must + * be already allocated) + * @return the number of bytes written in buffer |aDest| or 0 if the + * compression fails + */ + static MFBT_API size_t + compressLimitedOutput(const char* aSource, size_t aInputSize, char* aDest, + size_t aMaxOutputSize); + + /** + * If the source stream is malformed, the function will stop decoding + * and return a negative result, indicating the byte position of the + * faulty instruction + * + * This function never writes outside of provided buffers, and never + * modifies input buffer. + * + * Note: destination buffer must be already allocated, and its size must be a + * minimum of |aOutputSize| bytes. + * + * @param aOutputSize is the output size, therefore the original size + * @return the number of bytes read in the source buffer + */ + static MFBT_API bool + decompress(const char* aSource, char* aDest, size_t aOutputSize); + + /** + * If the source stream is malformed, the function will stop decoding + * and return false. + * + * This function never writes beyond aDest + aMaxOutputSize, and is + * therefore protected against malicious data packets. + * + * Note: Destination buffer must be already allocated. This version is + * slightly slower than the decompress without the aMaxOutputSize. + * + * @param aInputSize is the length of the input compressed data + * @param aMaxOutputSize is the size of the destination buffer (which must be + * already allocated) + * @param aOutputSize the actual number of bytes decoded in the destination + * buffer (necessarily <= aMaxOutputSize) + */ + static MFBT_API bool + decompress(const char* aSource, size_t aInputSize, char* aDest, + size_t aMaxOutputSize, size_t* aOutputSize); + + /* + * Provides the maximum size that LZ4 may output in a "worst case" + * scenario (input data not compressible) primarily useful for memory + * allocation of output buffer. + * note : this function is limited by "int" range (2^31-1) + * + * @param aInputSize is the input size. Max supported value is ~1.9GB + * @return maximum output size in a "worst case" scenario + */ + static inline size_t maxCompressedSize(size_t aInputSize) + { + size_t max = (aInputSize + (aInputSize / 255) + 16); + MOZ_ASSERT(max > aInputSize); + return max; + } +}; + +} /* namespace Compression */ +} /* namespace mozilla */ + +#endif /* mozilla_Compression_h_ */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Constants.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Constants.h new file mode 100644 index 0000000000..86bbb6b354 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Constants.h @@ -0,0 +1,16 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* mfbt math constants. */ + +#ifndef mozilla_Constants_h +#define mozilla_Constants_h + +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + +#endif /* mozilla_Constants_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/DebugOnly.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/DebugOnly.h new file mode 100644 index 0000000000..5d0197b194 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/DebugOnly.h @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Provides DebugOnly, a type for variables used only in debug builds (i.e. by + * assertions). + */ + +#ifndef mozilla_DebugOnly_h +#define mozilla_DebugOnly_h + +#include "mozilla/Attributes.h" + +namespace mozilla { + +/** + * DebugOnly contains a value of type T, but only in debug builds. In release + * builds, it does not contain a value. This helper is intended to be used with + * MOZ_ASSERT()-style macros, allowing one to write: + * + * DebugOnly check = func(); + * MOZ_ASSERT(check); + * + * more concisely than declaring |check| conditional on #ifdef DEBUG, but also + * without allocating storage space for |check| in release builds. + * + * DebugOnly instances can only be coerced to T in debug builds. In release + * builds they don't have a value, so type coercion is not well defined. + * + * Note that DebugOnly instances still take up one byte of space, plus padding, + * when used as members of structs. + */ +template +class DebugOnly +{ +public: +#ifdef DEBUG + T value; + + DebugOnly() { } + MOZ_IMPLICIT DebugOnly(const T& aOther) : value(aOther) { } + DebugOnly(const DebugOnly& aOther) : value(aOther.value) { } + DebugOnly& operator=(const T& aRhs) { + value = aRhs; + return *this; + } + + void operator++(int) { value++; } + void operator--(int) { value--; } + + T* operator&() { return &value; } + + operator T&() { return value; } + operator const T&() const { return value; } + + T& operator->() { return value; } + const T& operator->() const { return value; } + +#else + DebugOnly() { } + MOZ_IMPLICIT DebugOnly(const T&) { } + DebugOnly(const DebugOnly&) { } + DebugOnly& operator=(const T&) { return *this; } + void operator++(int) { } + void operator--(int) { } +#endif + + /* + * DebugOnly must always have a destructor or else it will + * generate "unused variable" warnings, exactly what it's intended + * to avoid! + */ + ~DebugOnly() {} +}; + +} + +#endif /* mozilla_DebugOnly_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Decimal.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Decimal.h new file mode 100644 index 0000000000..9f4926bd06 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Decimal.h @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Imported from: + * http://src.chromium.org/viewvc/blink/trunk/Source/core/platform/Decimal.h + * Check hg log for the svn rev of the last update from Blink core. + */ + +#ifndef Decimal_h +#define Decimal_h + +#include "mozilla/Assertions.h" +#include +#include "mozilla/Types.h" + +#include + +#ifndef ASSERT +#define DEFINED_ASSERT_FOR_DECIMAL_H 1 +#define ASSERT MOZ_ASSERT +#endif + +// To use WTF_MAKE_FAST_ALLOCATED we'd need: +// http://src.chromium.org/viewvc/blink/trunk/Source/wtf/FastMalloc.h +// Since we don't allocate Decimal objects, no need. +#define WTF_MAKE_FAST_ALLOCATED \ + void ignore_this_dummy_method() MOZ_DELETE + +namespace WebCore { + +namespace DecimalPrivate { +class SpecialValueHandler; +} + +// This class represents decimal base floating point number. +// +// FIXME: Once all C++ compiler support decimal type, we should replace this +// class to compiler supported one. See below URI for current status of decimal +// type for C++: // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1977.html +class Decimal { + WTF_MAKE_FAST_ALLOCATED; +public: + enum Sign { + Positive, + Negative, + }; + + // You should not use EncodedData other than unit testing. + class EncodedData { + // For accessing FormatClass. + friend class Decimal; + friend class DecimalPrivate::SpecialValueHandler; + public: + EncodedData(Sign, int exponent, uint64_t coefficient); + + bool operator==(const EncodedData&) const; + bool operator!=(const EncodedData& another) const { return !operator==(another); } + + uint64_t coefficient() const { return m_coefficient; } + int countDigits() const; + int exponent() const { return m_exponent; } + bool isFinite() const { return !isSpecial(); } + bool isInfinity() const { return m_formatClass == ClassInfinity; } + bool isNaN() const { return m_formatClass == ClassNaN; } + bool isSpecial() const { return m_formatClass == ClassInfinity || m_formatClass == ClassNaN; } + bool isZero() const { return m_formatClass == ClassZero; } + Sign sign() const { return m_sign; } + void setSign(Sign sign) { m_sign = sign; } + + private: + enum FormatClass { + ClassInfinity, + ClassNormal, + ClassNaN, + ClassZero, + }; + + EncodedData(Sign, FormatClass); + FormatClass formatClass() const { return m_formatClass; } + + uint64_t m_coefficient; + int16_t m_exponent; + FormatClass m_formatClass; + Sign m_sign; + }; + + MFBT_API explicit Decimal(int32_t = 0); + MFBT_API Decimal(Sign, int exponent, uint64_t coefficient); + MFBT_API Decimal(const Decimal&); + + MFBT_API Decimal& operator=(const Decimal&); + MFBT_API Decimal& operator+=(const Decimal&); + MFBT_API Decimal& operator-=(const Decimal&); + MFBT_API Decimal& operator*=(const Decimal&); + MFBT_API Decimal& operator/=(const Decimal&); + + MFBT_API Decimal operator-() const; + + MFBT_API bool operator==(const Decimal&) const; + MFBT_API bool operator!=(const Decimal&) const; + MFBT_API bool operator<(const Decimal&) const; + MFBT_API bool operator<=(const Decimal&) const; + MFBT_API bool operator>(const Decimal&) const; + MFBT_API bool operator>=(const Decimal&) const; + + MFBT_API Decimal operator+(const Decimal&) const; + MFBT_API Decimal operator-(const Decimal&) const; + MFBT_API Decimal operator*(const Decimal&) const; + MFBT_API Decimal operator/(const Decimal&) const; + + int exponent() const + { + ASSERT(isFinite()); + return m_data.exponent(); + } + + bool isFinite() const { return m_data.isFinite(); } + bool isInfinity() const { return m_data.isInfinity(); } + bool isNaN() const { return m_data.isNaN(); } + bool isNegative() const { return sign() == Negative; } + bool isPositive() const { return sign() == Positive; } + bool isSpecial() const { return m_data.isSpecial(); } + bool isZero() const { return m_data.isZero(); } + + MFBT_API Decimal abs() const; + MFBT_API Decimal ceiling() const; + MFBT_API Decimal floor() const; + MFBT_API Decimal remainder(const Decimal&) const; + MFBT_API Decimal round() const; + + MFBT_API double toDouble() const; + // Note: toString method supports infinity and nan but fromString not. + MFBT_API std::string toString() const; + MFBT_API bool toString(char* strBuf, size_t bufLength) const; + + static MFBT_API Decimal fromDouble(double); + // fromString supports following syntax EBNF: + // number ::= sign? digit+ ('.' digit*) (exponent-marker sign? digit+)? + // | sign? '.' digit+ (exponent-marker sign? digit+)? + // sign ::= '+' | '-' + // exponent-marker ::= 'e' | 'E' + // digit ::= '0' | '1' | ... | '9' + // Note: fromString doesn't support "infinity" and "nan". + static MFBT_API Decimal fromString(const std::string& aValue); + static MFBT_API Decimal infinity(Sign); + static MFBT_API Decimal nan(); + static MFBT_API Decimal zero(Sign); + + // You should not use below methods. We expose them for unit testing. + MFBT_API explicit Decimal(const EncodedData&); + const EncodedData& value() const { return m_data; } + +private: + struct AlignedOperands { + uint64_t lhsCoefficient; + uint64_t rhsCoefficient; + int exponent; + }; + + MFBT_API explicit Decimal(double); + MFBT_API Decimal compareTo(const Decimal&) const; + + static MFBT_API AlignedOperands alignOperands(const Decimal& lhs, const Decimal& rhs); + static inline Sign invertSign(Sign sign) { return sign == Negative ? Positive : Negative; } + + Sign sign() const { return m_data.sign(); } + + EncodedData m_data; +}; + +} // namespace WebCore + +namespace mozilla { + typedef WebCore::Decimal Decimal; +} + +#undef WTF_MAKE_FAST_ALLOCATED + +#ifdef DEFINED_ASSERT_FOR_DECIMAL_H +#undef DEFINED_ASSERT_FOR_DECIMAL_H +#undef ASSERT +#endif + +#endif // Decimal_h + diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Endian.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Endian.h new file mode 100644 index 0000000000..e4e1ff8549 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Endian.h @@ -0,0 +1,695 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Functions for reading and writing integers in various endiannesses. */ + +/* + * The classes LittleEndian and BigEndian expose static methods for + * reading and writing 16-, 32-, and 64-bit signed and unsigned integers + * in their respective endianness. The naming scheme is: + * + * {Little,Big}Endian::{read,write}{Uint,Int} + * + * For instance, LittleEndian::readInt32 will read a 32-bit signed + * integer from memory in little endian format. Similarly, + * BigEndian::writeUint16 will write a 16-bit unsigned integer to memory + * in big-endian format. + * + * The class NativeEndian exposes methods for conversion of existing + * data to and from the native endianness. These methods are intended + * for cases where data needs to be transferred, serialized, etc. + * swap{To,From}{Little,Big}Endian byteswap a single value if necessary. + * Bulk conversion functions are also provided which optimize the + * no-conversion-needed case: + * + * - copyAndSwap{To,From}{Little,Big}Endian; + * - swap{To,From}{Little,Big}EndianInPlace. + * + * The *From* variants are intended to be used for reading data and the + * *To* variants for writing data. + * + * Methods on NativeEndian work with integer data of any type. + * Floating-point data is not supported. + * + * For clarity in networking code, "Network" may be used as a synonym + * for "Big" in any of the above methods or class names. + * + * As an example, reading a file format header whose fields are stored + * in big-endian format might look like: + * + * class ExampleHeader + * { + * private: + * uint32_t mMagic; + * uint32_t mLength; + * uint32_t mTotalRecords; + * uint64_t mChecksum; + * + * public: + * ExampleHeader(const void* data) + * { + * const uint8_t* ptr = static_cast(data); + * mMagic = BigEndian::readUint32(ptr); ptr += sizeof(uint32_t); + * mLength = BigEndian::readUint32(ptr); ptr += sizeof(uint32_t); + * mTotalRecords = BigEndian::readUint32(ptr); ptr += sizeof(uint32_t); + * mChecksum = BigEndian::readUint64(ptr); + * } + * ... + * }; + */ + +#ifndef mozilla_Endian_h +#define mozilla_Endian_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Compiler.h" +#include "mozilla/DebugOnly.h" +#include "mozilla/TypeTraits.h" + +#include +#include + +#if defined(_MSC_VER) && _MSC_VER >= 1300 +# include +# pragma intrinsic(_byteswap_ushort) +# pragma intrinsic(_byteswap_ulong) +# pragma intrinsic(_byteswap_uint64) +#endif + +#if defined(_WIN64) +# if defined(_M_X64) || defined(_M_AMD64) || defined(_AMD64_) +# define MOZ_LITTLE_ENDIAN 1 +# else +# error "CPU type is unknown" +# endif +#elif defined(_WIN32) +# if defined(_M_IX86) +# define MOZ_LITTLE_ENDIAN 1 +# else +# error "CPU type is unknown" +# endif +#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__) +# if __LITTLE_ENDIAN__ +# define MOZ_LITTLE_ENDIAN 1 +# elif __BIG_ENDIAN__ +# define MOZ_BIG_ENDIAN 1 +# endif +#elif defined(__GNUC__) && \ + defined(__BYTE_ORDER__) && \ + defined(__ORDER_LITTLE_ENDIAN__) && \ + defined(__ORDER_BIG_ENDIAN__) + /* + * Some versions of GCC provide architecture-independent macros for + * this. Yes, there are more than two values for __BYTE_ORDER__. + */ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define MOZ_LITTLE_ENDIAN 1 +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define MOZ_BIG_ENDIAN 1 +# else +# error "Can't handle mixed-endian architectures" +# endif +/* + * We can't include useful headers like or + * here because they're not present on all platforms. Instead we have + * this big conditional that ideally will catch all the interesting + * cases. + */ +#elif defined(__sparc) || defined(__sparc__) || \ + defined(_POWER) || defined(__hppa) || \ + defined(_MIPSEB) || defined(__ARMEB__) || \ + defined(__s390__) || defined(__AARCH64EB__) || \ + (defined(__sh__) && defined(__LITTLE_ENDIAN__)) || \ + (defined(__ia64) && defined(__BIG_ENDIAN__)) +# define MOZ_BIG_ENDIAN 1 +#elif defined(__i386) || defined(__i386__) || \ + defined(__x86_64) || defined(__x86_64__) || \ + defined(_MIPSEL) || defined(__ARMEL__) || \ + defined(__alpha__) || defined(__AARCH64EL__) || \ + (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ + (defined(__ia64) && !defined(__BIG_ENDIAN__)) +# define MOZ_LITTLE_ENDIAN 1 +#endif + +#if MOZ_BIG_ENDIAN +# define MOZ_LITTLE_ENDIAN 0 +#elif MOZ_LITTLE_ENDIAN +# define MOZ_BIG_ENDIAN 0 +#else +# error "Cannot determine endianness" +#endif + +#if defined(__clang__) +# if __has_builtin(__builtin_bswap16) +# define MOZ_HAVE_BUILTIN_BYTESWAP16 __builtin_bswap16 +# endif +#elif defined(__GNUC__) +# if MOZ_GCC_VERSION_AT_LEAST(4, 8, 0) +# define MOZ_HAVE_BUILTIN_BYTESWAP16 __builtin_bswap16 +# endif +#elif defined(_MSC_VER) +# define MOZ_HAVE_BUILTIN_BYTESWAP16 _byteswap_ushort +#endif + +namespace mozilla { + +namespace detail { + +/* + * We need wrappers here because free functions with default template + * arguments and/or partial specialization of function templates are not + * supported by all the compilers we use. + */ +template +struct Swapper; + +template +struct Swapper +{ + static T swap(T aValue) + { +#if defined(MOZ_HAVE_BUILTIN_BYTESWAP16) + return MOZ_HAVE_BUILTIN_BYTESWAP16(aValue); +#else + return T(((aValue & 0x00ff) << 8) | ((aValue & 0xff00) >> 8)); +#endif + } +}; + +template +struct Swapper +{ + static T swap(T aValue) + { +#if defined(__clang__) || defined(__GNUC__) + return T(__builtin_bswap32(aValue)); +#elif defined(_MSC_VER) + return T(_byteswap_ulong(aValue)); +#else + return T(((aValue & 0x000000ffU) << 24) | + ((aValue & 0x0000ff00U) << 8) | + ((aValue & 0x00ff0000U) >> 8) | + ((aValue & 0xff000000U) >> 24)); +#endif + } +}; + +template +struct Swapper +{ + static inline T swap(T aValue) + { +#if defined(__clang__) || defined(__GNUC__) + return T(__builtin_bswap64(aValue)); +#elif defined(_MSC_VER) + return T(_byteswap_uint64(aValue)); +#else + return T(((aValue & 0x00000000000000ffULL) << 56) | + ((aValue & 0x000000000000ff00ULL) << 40) | + ((aValue & 0x0000000000ff0000ULL) << 24) | + ((aValue & 0x00000000ff000000ULL) << 8) | + ((aValue & 0x000000ff00000000ULL) >> 8) | + ((aValue & 0x0000ff0000000000ULL) >> 24) | + ((aValue & 0x00ff000000000000ULL) >> 40) | + ((aValue & 0xff00000000000000ULL) >> 56)); +#endif + } +}; + +enum Endianness { Little, Big }; + +#if MOZ_BIG_ENDIAN +# define MOZ_NATIVE_ENDIANNESS detail::Big +#else +# define MOZ_NATIVE_ENDIANNESS detail::Little +#endif + +class EndianUtils +{ + /** + * Assert that the memory regions [aDest, aDest+aCount) and + * [aSrc, aSrc+aCount] do not overlap. aCount is given in bytes. + */ + static void assertNoOverlap(const void* aDest, const void* aSrc, + size_t aCount) + { + DebugOnly byteDestPtr = static_cast(aDest); + DebugOnly byteSrcPtr = static_cast(aSrc); + MOZ_ASSERT((byteDestPtr <= byteSrcPtr && + byteDestPtr + aCount <= byteSrcPtr) || + (byteSrcPtr <= byteDestPtr && + byteSrcPtr + aCount <= byteDestPtr)); + } + + template + static void assertAligned(T* aPtr) + { + MOZ_ASSERT((uintptr_t(aPtr) % sizeof(T)) == 0, "Unaligned pointer!"); + } + +protected: + /** + * Return |aValue| converted from SourceEndian encoding to DestEndian + * encoding. + */ + template + static inline T maybeSwap(T aValue) + { + if (SourceEndian == DestEndian) { + return aValue; + } + return Swapper::swap(aValue); + } + + /** + * Convert |aCount| elements at |aPtr| from SourceEndian encoding to + * DestEndian encoding. + */ + template + static inline void maybeSwapInPlace(T* aPtr, size_t aCount) + { + assertAligned(aPtr); + + if (SourceEndian == DestEndian) { + return; + } + for (size_t i = 0; i < aCount; i++) { + aPtr[i] = Swapper::swap(aPtr[i]); + } + } + + /** + * Write |aCount| elements to the unaligned address |aDest| in DestEndian + * format, using elements found at |aSrc| in SourceEndian format. + */ + template + static void copyAndSwapTo(void* aDest, const T* aSrc, size_t aCount) + { + assertNoOverlap(aDest, aSrc, aCount * sizeof(T)); + assertAligned(aSrc); + + if (SourceEndian == DestEndian) { + memcpy(aDest, aSrc, aCount * sizeof(T)); + return; + } + + uint8_t* byteDestPtr = static_cast(aDest); + for (size_t i = 0; i < aCount; ++i) { + union + { + T mVal; + uint8_t mBuffer[sizeof(T)]; + } u; + u.mVal = maybeSwap(aSrc[i]); + memcpy(byteDestPtr, u.mBuffer, sizeof(T)); + byteDestPtr += sizeof(T); + } + } + + /** + * Write |aCount| elements to |aDest| in DestEndian format, using elements + * found at the unaligned address |aSrc| in SourceEndian format. + */ + template + static void copyAndSwapFrom(T* aDest, const void* aSrc, size_t aCount) + { + assertNoOverlap(aDest, aSrc, aCount * sizeof(T)); + assertAligned(aDest); + + if (SourceEndian == DestEndian) { + memcpy(aDest, aSrc, aCount * sizeof(T)); + return; + } + + const uint8_t* byteSrcPtr = static_cast(aSrc); + for (size_t i = 0; i < aCount; ++i) { + union + { + T mVal; + uint8_t mBuffer[sizeof(T)]; + } u; + memcpy(u.mBuffer, byteSrcPtr, sizeof(T)); + aDest[i] = maybeSwap(u.mVal); + byteSrcPtr += sizeof(T); + } + } +}; + +template +class Endian : private EndianUtils +{ +protected: + /** Read a uint16_t in ThisEndian endianness from |aPtr| and return it. */ + static MOZ_WARN_UNUSED_RESULT uint16_t readUint16(const void* aPtr) + { + return read(aPtr); + } + + /** Read a uint32_t in ThisEndian endianness from |aPtr| and return it. */ + static MOZ_WARN_UNUSED_RESULT uint32_t readUint32(const void* aPtr) + { + return read(aPtr); + } + + /** Read a uint64_t in ThisEndian endianness from |aPtr| and return it. */ + static MOZ_WARN_UNUSED_RESULT uint64_t readUint64(const void* aPtr) + { + return read(aPtr); + } + + /** Read an int16_t in ThisEndian endianness from |aPtr| and return it. */ + static MOZ_WARN_UNUSED_RESULT int16_t readInt16(const void* aPtr) + { + return read(aPtr); + } + + /** Read an int32_t in ThisEndian endianness from |aPtr| and return it. */ + static MOZ_WARN_UNUSED_RESULT int32_t readInt32(const void* aPtr) + { + return read(aPtr); + } + + /** Read an int64_t in ThisEndian endianness from |aPtr| and return it. */ + static MOZ_WARN_UNUSED_RESULT int64_t readInt64(const void* aPtr) + { + return read(aPtr); + } + + /** Write |aValue| to |aPtr| using ThisEndian endianness. */ + static void writeUint16(void* aPtr, uint16_t aValue) + { + write(aPtr, aValue); + } + + /** Write |aValue| to |aPtr| using ThisEndian endianness. */ + static void writeUint32(void* aPtr, uint32_t aValue) + { + write(aPtr, aValue); + } + + /** Write |aValue| to |aPtr| using ThisEndian endianness. */ + static void writeUint64(void* aPtr, uint64_t aValue) + { + write(aPtr, aValue); + } + + /** Write |aValue| to |aPtr| using ThisEndian endianness. */ + static void writeInt16(void* aPtr, int16_t aValue) + { + write(aPtr, aValue); + } + + /** Write |aValue| to |aPtr| using ThisEndian endianness. */ + static void writeInt32(void* aPtr, int32_t aValue) + { + write(aPtr, aValue); + } + + /** Write |aValue| to |aPtr| using ThisEndian endianness. */ + static void writeInt64(void* aPtr, int64_t aValue) + { + write(aPtr, aValue); + } + + /* + * Converts a value of type T to little-endian format. + * + * This function is intended for cases where you have data in your + * native-endian format and you need it to appear in little-endian + * format for transmission. + */ + template + MOZ_WARN_UNUSED_RESULT static T swapToLittleEndian(T aValue) + { + return maybeSwap(aValue); + } + + /* + * Copies |aCount| values of type T starting at |aSrc| to |aDest|, converting + * them to little-endian format if ThisEndian is Big. + * As with memcpy, |aDest| and |aSrc| must not overlap. + */ + template + static void copyAndSwapToLittleEndian(void* aDest, const T* aSrc, + size_t aCount) + { + copyAndSwapTo(aDest, aSrc, aCount); + } + + /* + * Likewise, but converts values in place. + */ + template + static void swapToLittleEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + /* + * Converts a value of type T to big-endian format. + */ + template + MOZ_WARN_UNUSED_RESULT static T swapToBigEndian(T aValue) + { + return maybeSwap(aValue); + } + + /* + * Copies |aCount| values of type T starting at |aSrc| to |aDest|, converting + * them to big-endian format if ThisEndian is Little. + * As with memcpy, |aDest| and |aSrc| must not overlap. + */ + template + static void copyAndSwapToBigEndian(void* aDest, const T* aSrc, + size_t aCount) + { + copyAndSwapTo(aDest, aSrc, aCount); + } + + /* + * Likewise, but converts values in place. + */ + template + static void swapToBigEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + /* + * Synonyms for the big-endian functions, for better readability + * in network code. + */ + + template + MOZ_WARN_UNUSED_RESULT static T swapToNetworkOrder(T aValue) + { + return swapToBigEndian(aValue); + } + + template + static void + copyAndSwapToNetworkOrder(void* aDest, const T* aSrc, size_t aCount) + { + copyAndSwapToBigEndian(aDest, aSrc, aCount); + } + + template + static void + swapToNetworkOrderInPlace(T* aPtr, size_t aCount) + { + swapToBigEndianInPlace(aPtr, aCount); + } + + /* + * Converts a value of type T from little-endian format. + */ + template + MOZ_WARN_UNUSED_RESULT static T swapFromLittleEndian(T aValue) + { + return maybeSwap(aValue); + } + + /* + * Copies |aCount| values of type T starting at |aSrc| to |aDest|, converting + * them to little-endian format if ThisEndian is Big. + * As with memcpy, |aDest| and |aSrc| must not overlap. + */ + template + static void copyAndSwapFromLittleEndian(T* aDest, const void* aSrc, + size_t aCount) + { + copyAndSwapFrom(aDest, aSrc, aCount); + } + + /* + * Likewise, but converts values in place. + */ + template + static void swapFromLittleEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + /* + * Converts a value of type T from big-endian format. + */ + template + MOZ_WARN_UNUSED_RESULT static T swapFromBigEndian(T aValue) + { + return maybeSwap(aValue); + } + + /* + * Copies |aCount| values of type T starting at |aSrc| to |aDest|, converting + * them to big-endian format if ThisEndian is Little. + * As with memcpy, |aDest| and |aSrc| must not overlap. + */ + template + static void copyAndSwapFromBigEndian(T* aDest, const void* aSrc, + size_t aCount) + { + copyAndSwapFrom(aDest, aSrc, aCount); + } + + /* + * Likewise, but converts values in place. + */ + template + static void swapFromBigEndianInPlace(T* aPtr, size_t aCount) + { + maybeSwapInPlace(aPtr, aCount); + } + + /* + * Synonyms for the big-endian functions, for better readability + * in network code. + */ + template + MOZ_WARN_UNUSED_RESULT static T swapFromNetworkOrder(T aValue) + { + return swapFromBigEndian(aValue); + } + + template + static void copyAndSwapFromNetworkOrder(T* aDest, const void* aSrc, + size_t aCount) + { + copyAndSwapFromBigEndian(aDest, aSrc, aCount); + } + + template + static void swapFromNetworkOrderInPlace(T* aPtr, size_t aCount) + { + swapFromBigEndianInPlace(aPtr, aCount); + } + +private: + /** + * Read a value of type T, encoded in endianness ThisEndian from |aPtr|. + * Return that value encoded in native endianness. + */ + template + static T read(const void* aPtr) + { + union + { + T mVal; + uint8_t mBuffer[sizeof(T)]; + } u; + memcpy(u.mBuffer, aPtr, sizeof(T)); + return maybeSwap(u.mVal); + } + + /** + * Write a value of type T, in native endianness, to |aPtr|, in ThisEndian + * endianness. + */ + template + static void write(void* aPtr, T aValue) + { + T tmp = maybeSwap(aValue); + memcpy(aPtr, &tmp, sizeof(T)); + } + + Endian() MOZ_DELETE; + Endian(const Endian& aTther) MOZ_DELETE; + void operator=(const Endian& aOther) MOZ_DELETE; +}; + +template +class EndianReadWrite : public Endian +{ +private: + typedef Endian super; + +public: + using super::readUint16; + using super::readUint32; + using super::readUint64; + using super::readInt16; + using super::readInt32; + using super::readInt64; + using super::writeUint16; + using super::writeUint32; + using super::writeUint64; + using super::writeInt16; + using super::writeInt32; + using super::writeInt64; +}; + +} /* namespace detail */ + +class LittleEndian MOZ_FINAL : public detail::EndianReadWrite +{}; + +class BigEndian MOZ_FINAL : public detail::EndianReadWrite +{}; + +typedef BigEndian NetworkEndian; + +class NativeEndian MOZ_FINAL : public detail::Endian +{ +private: + typedef detail::Endian super; + +public: + /* + * These functions are intended for cases where you have data in your + * native-endian format and you need the data to appear in the appropriate + * endianness for transmission, serialization, etc. + */ + using super::swapToLittleEndian; + using super::copyAndSwapToLittleEndian; + using super::swapToLittleEndianInPlace; + using super::swapToBigEndian; + using super::copyAndSwapToBigEndian; + using super::swapToBigEndianInPlace; + using super::swapToNetworkOrder; + using super::copyAndSwapToNetworkOrder; + using super::swapToNetworkOrderInPlace; + + /* + * These functions are intended for cases where you have data in the + * given endianness (e.g. reading from disk or a file-format) and you + * need the data to appear in native-endian format for processing. + */ + using super::swapFromLittleEndian; + using super::copyAndSwapFromLittleEndian; + using super::swapFromLittleEndianInPlace; + using super::swapFromBigEndian; + using super::copyAndSwapFromBigEndian; + using super::swapFromBigEndianInPlace; + using super::swapFromNetworkOrder; + using super::copyAndSwapFromNetworkOrder; + using super::swapFromNetworkOrderInPlace; +}; + +#undef MOZ_NATIVE_ENDIANNESS + +} /* namespace mozilla */ + +#endif /* mozilla_Endian_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumSet.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumSet.h new file mode 100644 index 0000000000..8c78b2b442 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumSet.h @@ -0,0 +1,206 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A set abstraction for enumeration values. */ + +#ifndef mozilla_EnumSet_h +#define mozilla_EnumSet_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" + +#include + +namespace mozilla { + +/** + * EnumSet is a set of values defined by an enumeration. It is implemented + * using a 32 bit mask for each value so it will only work for enums with an int + * representation less than 32. It works both for enum and enum class types. + */ +template +class EnumSet +{ +public: + EnumSet() + : mBitField(0) + { } + + MOZ_IMPLICIT EnumSet(T aEnum) + : mBitField(bitFor(aEnum)) + { } + + EnumSet(T aEnum1, T aEnum2) + : mBitField(bitFor(aEnum1) | + bitFor(aEnum2)) + { } + + EnumSet(T aEnum1, T aEnum2, T aEnum3) + : mBitField(bitFor(aEnum1) | + bitFor(aEnum2) | + bitFor(aEnum3)) + { } + + EnumSet(T aEnum1, T aEnum2, T aEnum3, T aEnum4) + : mBitField(bitFor(aEnum1) | + bitFor(aEnum2) | + bitFor(aEnum3) | + bitFor(aEnum4)) + { } + + EnumSet(const EnumSet& aEnumSet) + : mBitField(aEnumSet.mBitField) + { } + + /** + * Add an element + */ + void operator+=(T aEnum) + { + mBitField |= bitFor(aEnum); + } + + /** + * Add an element + */ + EnumSet operator+(T aEnum) const + { + EnumSet result(*this); + result += aEnum; + return result; + } + + /** + * Union + */ + void operator+=(const EnumSet aEnumSet) + { + mBitField |= aEnumSet.mBitField; + } + + /** + * Union + */ + EnumSet operator+(const EnumSet aEnumSet) const + { + EnumSet result(*this); + result += aEnumSet; + return result; + } + + /** + * Remove an element + */ + void operator-=(T aEnum) + { + mBitField &= ~(bitFor(aEnum)); + } + + /** + * Remove an element + */ + EnumSet operator-(T aEnum) const + { + EnumSet result(*this); + result -= aEnum; + return result; + } + + /** + * Remove a set of elements + */ + void operator-=(const EnumSet aEnumSet) + { + mBitField &= ~(aEnumSet.mBitField); + } + + /** + * Remove a set of elements + */ + EnumSet operator-(const EnumSet aEnumSet) const + { + EnumSet result(*this); + result -= aEnumSet; + return result; + } + + /** + * Intersection + */ + void operator&=(const EnumSet aEnumSet) + { + mBitField &= aEnumSet.mBitField; + } + + /** + * Intersection + */ + EnumSet operator&(const EnumSet aEnumSet) const + { + EnumSet result(*this); + result &= aEnumSet; + return result; + } + + /** + * Equality + */ + bool operator==(const EnumSet aEnumSet) const + { + return mBitField == aEnumSet.mBitField; + } + + /** + * Test is an element is contained in the set. + */ + bool contains(T aEnum) const + { + return mBitField & bitFor(aEnum); + } + + /** + * Return the number of elements in the set. + */ + uint8_t size() + { + uint8_t count = 0; + for (uint32_t bitField = mBitField; bitField; bitField >>= 1) { + if (bitField & 1) { + count++; + } + } + return count; + } + + bool isEmpty() const + { + return mBitField == 0; + } + + uint32_t serialize() const + { + return mBitField; + } + + void deserialize(uint32_t aValue) + { + mBitField = aValue; + } + +private: + static uint32_t bitFor(T aEnum) + { + uint32_t bitNumber = (uint32_t)aEnum; + MOZ_ASSERT(bitNumber < 32); + return 1U << bitNumber; + } + + uint32_t mBitField; +}; + +} // namespace mozilla + +#endif /* mozilla_EnumSet_h_*/ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumeratedArray.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumeratedArray.h new file mode 100644 index 0000000000..7e8e89275f --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/EnumeratedArray.h @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* EnumeratedArray is like Array, but indexed by a typed enum. */ + +#ifndef mozilla_EnumeratedArray_h +#define mozilla_EnumeratedArray_h + +#include "mozilla/Array.h" +#include "mozilla/TypedEnum.h" + +namespace mozilla { + +/** + * EnumeratedArray is a fixed-size array container for use when an + * array is indexed by a specific enum class, as currently implemented + * by MOZ_BEGIN_ENUM_CLASS. + * + * This provides type safety by guarding at compile time against accidentally + * indexing such arrays with unrelated values. This also removes the need + * for manual casting when using a typed enum value to index arrays. + * + * Aside from the typing of indices, EnumeratedArray is similar to Array. + * + * Example: + * + * MOZ_BEGIN_ENUM_CLASS(AnimalSpecies) + * Cow, + * Sheep, + * Count + * MOZ_END_ENUM_CLASS(AnimalSpecies) + * + * EnumeratedArray headCount; + * + * headCount[AnimalSpecies::Cow] = 17; + * headCount[AnimalSpecies::Sheep] = 30; + * + */ +template +class EnumeratedArray +{ +public: + static const size_t kSize = size_t(SizeAsEnumValue); + +private: + Array mArray; + +public: + EnumeratedArray() {} + + explicit EnumeratedArray(const EnumeratedArray& aOther) + { + for (size_t i = 0; i < kSize; i++) { + mArray[i] = aOther.mArray[i]; + } + } + + ValueType& operator[](IndexType aIndex) + { + return mArray[size_t(aIndex)]; + } + + const ValueType& operator[](IndexType aIndex) const + { + return mArray[size_t(aIndex)]; + } +}; + +} // namespace mozilla + +#endif // mozilla_EnumeratedArray_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/FloatingPoint.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/FloatingPoint.h new file mode 100644 index 0000000000..0ed567832b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/FloatingPoint.h @@ -0,0 +1,413 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Various predicates and operations on IEEE-754 floating point types. */ + +#ifndef mozilla_FloatingPoint_h +#define mozilla_FloatingPoint_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Casting.h" +#include "mozilla/MathAlgorithms.h" +#include "mozilla/Types.h" + +#include + +namespace mozilla { + +/* + * It's reasonable to ask why we have this header at all. Don't isnan, + * copysign, the built-in comparison operators, and the like solve these + * problems? Unfortunately, they don't. We've found that various compilers + * (MSVC, MSVC when compiling with PGO, and GCC on OS X, at least) miscompile + * the standard methods in various situations, so we can't use them. Some of + * these compilers even have problems compiling seemingly reasonable bitwise + * algorithms! But with some care we've found algorithms that seem to not + * trigger those compiler bugs. + * + * For the aforementioned reasons, be very wary of making changes to any of + * these algorithms. If you must make changes, keep a careful eye out for + * compiler bustage, particularly PGO-specific bustage. + */ + +struct FloatTypeTraits +{ + typedef uint32_t Bits; + + static const unsigned kExponentBias = 127; + static const unsigned kExponentShift = 23; + + static const Bits kSignBit = 0x80000000UL; + static const Bits kExponentBits = 0x7F800000UL; + static const Bits kSignificandBits = 0x007FFFFFUL; +}; + +struct DoubleTypeTraits +{ + typedef uint64_t Bits; + + static const unsigned kExponentBias = 1023; + static const unsigned kExponentShift = 52; + + static const Bits kSignBit = 0x8000000000000000ULL; + static const Bits kExponentBits = 0x7ff0000000000000ULL; + static const Bits kSignificandBits = 0x000fffffffffffffULL; +}; + +template struct SelectTrait; +template<> struct SelectTrait : public FloatTypeTraits {}; +template<> struct SelectTrait : public DoubleTypeTraits {}; + +/* + * This struct contains details regarding the encoding of floating-point + * numbers that can be useful for direct bit manipulation. As of now, the + * template parameter has to be float or double. + * + * The nested typedef |Bits| is the unsigned integral type with the same size + * as T: uint32_t for float and uint64_t for double (static assertions + * double-check these assumptions). + * + * kExponentBias is the offset that is subtracted from the exponent when + * computing the value, i.e. one plus the opposite of the mininum possible + * exponent. + * kExponentShift is the shift that one needs to apply to retrieve the + * exponent component of the value. + * + * kSignBit contains a bits mask. Bit-and-ing with this mask will result in + * obtaining the sign bit. + * kExponentBits contains the mask needed for obtaining the exponent bits and + * kSignificandBits contains the mask needed for obtaining the significand + * bits. + * + * Full details of how floating point number formats are encoded are beyond + * the scope of this comment. For more information, see + * http://en.wikipedia.org/wiki/IEEE_floating_point + * http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers + */ +template +struct FloatingPoint : public SelectTrait +{ + typedef SelectTrait Base; + typedef typename Base::Bits Bits; + + static_assert((Base::kSignBit & Base::kExponentBits) == 0, + "sign bit shouldn't overlap exponent bits"); + static_assert((Base::kSignBit & Base::kSignificandBits) == 0, + "sign bit shouldn't overlap significand bits"); + static_assert((Base::kExponentBits & Base::kSignificandBits) == 0, + "exponent bits shouldn't overlap significand bits"); + + static_assert((Base::kSignBit | Base::kExponentBits | Base::kSignificandBits) == + ~Bits(0), + "all bits accounted for"); + + /* + * These implementations assume float/double are 32/64-bit single/double + * format number types compatible with the IEEE-754 standard. C++ don't + * require this to be the case. But we required this in implementations of + * these algorithms that preceded this header, so we shouldn't break anything + * if we keep doing so. + */ + static_assert(sizeof(T) == sizeof(Bits), "Bits must be same size as T"); +}; + +/** Determines whether a double is NaN. */ +template +static MOZ_ALWAYS_INLINE bool +IsNaN(T aValue) +{ + /* + * A float/double is NaN if all exponent bits are 1 and the significand + * contains at least one non-zero bit. + */ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return (bits & Traits::kExponentBits) == Traits::kExponentBits && + (bits & Traits::kSignificandBits) != 0; +} + +/** Determines whether a float/double is +Infinity or -Infinity. */ +template +static MOZ_ALWAYS_INLINE bool +IsInfinite(T aValue) +{ + /* Infinities have all exponent bits set to 1 and an all-0 significand. */ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return (bits & ~Traits::kSignBit) == Traits::kExponentBits; +} + +/** Determines whether a float/double is not NaN or infinite. */ +template +static MOZ_ALWAYS_INLINE bool +IsFinite(T aValue) +{ + /* + * NaN and Infinities are the only non-finite floats/doubles, and both have + * all exponent bits set to 1. + */ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return (bits & Traits::kExponentBits) != Traits::kExponentBits; +} + +/** + * Determines whether a float/double is negative. It is an error to call this + * method on a float/double which is NaN. + */ +template +static MOZ_ALWAYS_INLINE bool +IsNegative(T aValue) +{ + MOZ_ASSERT(!IsNaN(aValue), "NaN does not have a sign"); + + /* The sign bit is set if the double is negative. */ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return (bits & Traits::kSignBit) != 0; +} + +/** Determines whether a float/double represents -0. */ +template +static MOZ_ALWAYS_INLINE bool +IsNegativeZero(T aValue) +{ + /* Only the sign bit is set if the value is -0. */ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return bits == Traits::kSignBit; +} + +/** + * Returns the exponent portion of the float/double. + * + * Zero is not special-cased, so ExponentComponent(0.0) is + * -int_fast16_t(Traits::kExponentBias). + */ +template +static MOZ_ALWAYS_INLINE int_fast16_t +ExponentComponent(T aValue) +{ + /* + * The exponent component of a float/double is an unsigned number, biased + * from its actual value. Subtract the bias to retrieve the actual exponent. + */ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + Bits bits = BitwiseCast(aValue); + return int_fast16_t((bits & Traits::kExponentBits) >> Traits::kExponentShift) - + int_fast16_t(Traits::kExponentBias); +} + +/** Returns +Infinity. */ +template +static MOZ_ALWAYS_INLINE T +PositiveInfinity() +{ + /* + * Positive infinity has all exponent bits set, sign bit set to 0, and no + * significand. + */ + typedef FloatingPoint Traits; + return BitwiseCast(Traits::kExponentBits); +} + +/** Returns -Infinity. */ +template +static MOZ_ALWAYS_INLINE T +NegativeInfinity() +{ + /* + * Negative infinity has all exponent bits set, sign bit set to 1, and no + * significand. + */ + typedef FloatingPoint Traits; + return BitwiseCast(Traits::kSignBit | Traits::kExponentBits); +} + + +/** Constructs a NaN value with the specified sign bit and significand bits. */ +template +static MOZ_ALWAYS_INLINE T +SpecificNaN(int signbit, typename FloatingPoint::Bits significand) +{ + typedef FloatingPoint Traits; + MOZ_ASSERT(signbit == 0 || signbit == 1); + MOZ_ASSERT((significand & ~Traits::kSignificandBits) == 0); + MOZ_ASSERT(significand & Traits::kSignificandBits); + + T t = BitwiseCast((signbit ? Traits::kSignBit : 0) | + Traits::kExponentBits | + significand); + MOZ_ASSERT(IsNaN(t)); + return t; +} + +/** Computes the smallest non-zero positive float/double value. */ +template +static MOZ_ALWAYS_INLINE T +MinNumberValue() +{ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + return BitwiseCast(Bits(1)); +} + +/** + * If aValue is equal to some int32_t value, set *aInt32 to that value and + * return true; otherwise return false. + * + * Note that negative zero is "equal" to zero here. To test whether a value can + * be losslessly converted to int32_t and back, use NumberIsInt32 instead. + */ +template +static MOZ_ALWAYS_INLINE bool +NumberEqualsInt32(T aValue, int32_t* aInt32) +{ + /* + * XXX Casting a floating-point value that doesn't truncate to int32_t, to + * int32_t, induces undefined behavior. We should definitely fix this + * (bug 744965), but as apparently it "works" in practice, it's not a + * pressing concern now. + */ + return aValue == (*aInt32 = int32_t(aValue)); +} + +/** + * If d can be converted to int32_t and back to an identical double value, + * set *aInt32 to that value and return true; otherwise return false. + * + * The difference between this and NumberEqualsInt32 is that this method returns + * false for negative zero. + */ +template +static MOZ_ALWAYS_INLINE bool +NumberIsInt32(T aValue, int32_t* aInt32) +{ + return !IsNegativeZero(aValue) && NumberEqualsInt32(aValue, aInt32); +} + +/** + * Computes a NaN value. Do not use this method if you depend upon a particular + * NaN value being returned. + */ +template +static MOZ_ALWAYS_INLINE T +UnspecifiedNaN() +{ + /* + * If we can use any quiet NaN, we might as well use the all-ones NaN, + * since it's cheap to materialize on common platforms (such as x64, where + * this value can be represented in a 32-bit signed immediate field, allowing + * it to be stored to memory in a single instruction). + */ + typedef FloatingPoint Traits; + return SpecificNaN(1, Traits::kSignificandBits); +} + +/** + * Compare two doubles for equality, *without* equating -0 to +0, and equating + * any NaN value to any other NaN value. (The normal equality operators equate + * -0 with +0, and they equate NaN to no other value.) + */ +template +static inline bool +NumbersAreIdentical(T aValue1, T aValue2) +{ + typedef FloatingPoint Traits; + typedef typename Traits::Bits Bits; + if (IsNaN(aValue1)) { + return IsNaN(aValue2); + } + return BitwiseCast(aValue1) == BitwiseCast(aValue2); +} + +namespace detail { + +template +struct FuzzyEqualsEpsilon; + +template<> +struct FuzzyEqualsEpsilon +{ + // A number near 1e-5 that is exactly representable in a float. + static float value() { return 1.0f / (1 << 17); } +}; + +template<> +struct FuzzyEqualsEpsilon +{ + // A number near 1e-12 that is exactly representable in a double. + static double value() { return 1.0 / (1LL << 40); } +}; + +} // namespace detail + +/** + * Compare two floating point values for equality, modulo rounding error. That + * is, the two values are considered equal if they are both not NaN and if they + * are less than or equal to aEpsilon apart. The default value of aEpsilon is + * near 1e-5. + * + * For most scenarios you will want to use FuzzyEqualsMultiplicative instead, + * as it is more reasonable over the entire range of floating point numbers. + * This additive version should only be used if you know the range of the + * numbers you are dealing with is bounded and stays around the same order of + * magnitude. + */ +template +static MOZ_ALWAYS_INLINE bool +FuzzyEqualsAdditive(T aValue1, T aValue2, + T aEpsilon = detail::FuzzyEqualsEpsilon::value()) +{ + static_assert(IsFloatingPoint::value, "floating point type required"); + return Abs(aValue1 - aValue2) <= aEpsilon; +} + +/** + * Compare two floating point values for equality, allowing for rounding error + * relative to the magnitude of the values. That is, the two values are + * considered equal if they are both not NaN and they are less than or equal to + * some aEpsilon apart, where the aEpsilon is scaled by the smaller of the two + * argument values. + * + * In most cases you will want to use this rather than FuzzyEqualsAdditive, as + * this function effectively masks out differences in the bottom few bits of + * the floating point numbers being compared, regardless of what order of + * magnitude those numbers are at. + */ +template +static MOZ_ALWAYS_INLINE bool +FuzzyEqualsMultiplicative(T aValue1, T aValue2, + T aEpsilon = detail::FuzzyEqualsEpsilon::value()) +{ + static_assert(IsFloatingPoint::value, "floating point type required"); + // can't use std::min because of bug 965340 + T smaller = Abs(aValue1) < Abs(aValue2) ? Abs(aValue1) : Abs(aValue2); + return Abs(aValue1 - aValue2) <= aEpsilon * smaller; +} + +/** + * Returns true if the given value can be losslessly represented as an IEEE-754 + * single format number, false otherwise. All NaN values are considered + * representable (notwithstanding that the exact bit pattern of a double format + * NaN value can't be exactly represented in single format). + * + * This function isn't inlined to avoid buggy optimizations by MSVC. + */ +MOZ_WARN_UNUSED_RESULT +extern MFBT_API bool +IsFloat32Representable(double aFloat32); + +} /* namespace mozilla */ + +#endif /* mozilla_FloatingPoint_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/GuardObjects.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/GuardObjects.h new file mode 100644 index 0000000000..2cd950f314 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/GuardObjects.h @@ -0,0 +1,153 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Implementation of macros to ensure correct use of RAII Auto* objects. */ + +#ifndef mozilla_GuardObjects_h +#define mozilla_GuardObjects_h + +#include "mozilla/Assertions.h" +#include "mozilla/NullPtr.h" +#include "mozilla/Types.h" + +#ifdef __cplusplus + +#ifdef DEBUG + +namespace mozilla { +namespace detail { + +/* + * The following classes are designed to cause assertions to detect + * inadvertent use of guard objects as temporaries. In other words, + * when we have a guard object whose only purpose is its constructor and + * destructor (and is never otherwise referenced), the intended use + * might be: + * + * AutoRestore savePainting(mIsPainting); + * + * but is is easy to accidentally write: + * + * AutoRestore(mIsPainting); + * + * which compiles just fine, but runs the destructor well before the + * intended time. + * + * They work by adding (#ifdef DEBUG) an additional parameter to the + * guard object's constructor, with a default value, so that users of + * the guard object's API do not need to do anything. The default value + * of this parameter is a temporary object. C++ (ISO/IEC 14882:1998), + * section 12.2 [class.temporary], clauses 4 and 5 seem to assume a + * guarantee that temporaries are destroyed in the reverse of their + * construction order, but I actually can't find a statement that that + * is true in the general case (beyond the two specific cases mentioned + * there). However, it seems to be true. + * + * These classes are intended to be used only via the macros immediately + * below them: + * + * MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER declares (ifdef DEBUG) a member + * variable, and should be put where a declaration of a private + * member variable would be placed. + * MOZ_GUARD_OBJECT_NOTIFIER_PARAM should be placed at the end of the + * parameters to each constructor of the guard object; it declares + * (ifdef DEBUG) an additional parameter. (But use the *_ONLY_PARAM + * variant for constructors that take no other parameters.) + * MOZ_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL should likewise be used in + * the implementation of such constructors when they are not inline. + * MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT should be used in + * the implementation of such constructors to pass the parameter to + * a base class that also uses these macros + * MOZ_GUARD_OBJECT_NOTIFIER_INIT is a statement that belongs in each + * constructor. It uses the parameter declared by + * MOZ_GUARD_OBJECT_NOTIFIER_PARAM. + * + * For more details, and examples of using these macros, see + * https://developer.mozilla.org/en/Using_RAII_classes_in_Mozilla + */ +class GuardObjectNotifier +{ +private: + bool* mStatementDone; + +public: + GuardObjectNotifier() : mStatementDone(nullptr) { } + + ~GuardObjectNotifier() { *mStatementDone = true; } + + void setStatementDone(bool* aStatementIsDone) + { + mStatementDone = aStatementIsDone; + } +}; + +class GuardObjectNotificationReceiver +{ +private: + bool mStatementDone; + +public: + GuardObjectNotificationReceiver() : mStatementDone(false) { } + + ~GuardObjectNotificationReceiver() { + /* + * Assert that the guard object was not used as a temporary. (Note that + * this assert might also fire if init is not called because the guard + * object's implementation is not using the above macros correctly.) + */ + MOZ_ASSERT(mStatementDone); + } + + void init(const GuardObjectNotifier& aConstNotifier) + { + /* + * aConstNotifier is passed as a const reference so that we can pass a + * temporary, but we really intend it as non-const. + */ + GuardObjectNotifier& notifier = + const_cast(aConstNotifier); + notifier.setStatementDone(&mStatementDone); + } +}; + +} /* namespace detail */ +} /* namespace mozilla */ + +#endif /* DEBUG */ + +#ifdef DEBUG +# define MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER \ + mozilla::detail::GuardObjectNotificationReceiver _mCheckNotUsedAsTemporary; +# define MOZ_GUARD_OBJECT_NOTIFIER_PARAM \ + , const mozilla::detail::GuardObjectNotifier& _notifier = \ + mozilla::detail::GuardObjectNotifier() +# define MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM \ + const mozilla::detail::GuardObjectNotifier& _notifier = \ + mozilla::detail::GuardObjectNotifier() +# define MOZ_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL \ + , const mozilla::detail::GuardObjectNotifier& _notifier +# define MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_IN_IMPL \ + const mozilla::detail::GuardObjectNotifier& _notifier +# define MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT \ + , _notifier +# define MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_TO_PARENT \ + _notifier +# define MOZ_GUARD_OBJECT_NOTIFIER_INIT \ + do { _mCheckNotUsedAsTemporary.init(_notifier); } while (0) +#else +# define MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +# define MOZ_GUARD_OBJECT_NOTIFIER_PARAM +# define MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM +# define MOZ_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL +# define MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_IN_IMPL +# define MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_TO_PARENT +# define MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT +# define MOZ_GUARD_OBJECT_NOTIFIER_INIT do { } while (0) +#endif + +#endif /* __cplusplus */ + +#endif /* mozilla_GuardObjects_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/HashFunctions.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/HashFunctions.h new file mode 100644 index 0000000000..8b2c172bd1 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/HashFunctions.h @@ -0,0 +1,367 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Utilities for hashing. */ + +/* + * This file exports functions for hashing data down to a 32-bit value, + * including: + * + * - HashString Hash a char* or uint16_t/wchar_t* of known or unknown + * length. + * + * - HashBytes Hash a byte array of known length. + * + * - HashGeneric Hash one or more values. Currently, we support uint32_t, + * types which can be implicitly cast to uint32_t, data + * pointers, and function pointers. + * + * - AddToHash Add one or more values to the given hash. This supports the + * same list of types as HashGeneric. + * + * + * You can chain these functions together to hash complex objects. For example: + * + * class ComplexObject + * { + * char* mStr; + * uint32_t mUint1, mUint2; + * void (*mCallbackFn)(); + * + * public: + * uint32_t hash() + * { + * uint32_t hash = HashString(mStr); + * hash = AddToHash(hash, mUint1, mUint2); + * return AddToHash(hash, mCallbackFn); + * } + * }; + * + * If you want to hash an nsAString or nsACString, use the HashString functions + * in nsHashKeys.h. + */ + +#ifndef mozilla_HashFunctions_h +#define mozilla_HashFunctions_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Char16.h" +#include "mozilla/Types.h" + +#include + +#ifdef __cplusplus +namespace mozilla { + +/** + * The golden ratio as a 32-bit fixed-point value. + */ +static const uint32_t kGoldenRatioU32 = 0x9E3779B9U; + +inline uint32_t +RotateBitsLeft32(uint32_t aValue, uint8_t aBits) +{ + MOZ_ASSERT(aBits < 32); + return (aValue << aBits) | (aValue >> (32 - aBits)); +} + +namespace detail { + +inline uint32_t +AddU32ToHash(uint32_t aHash, uint32_t aValue) +{ + /* + * This is the meat of all our hash routines. This hash function is not + * particularly sophisticated, but it seems to work well for our mostly + * plain-text inputs. Implementation notes follow. + * + * Our use of the golden ratio here is arbitrary; we could pick almost any + * number which: + * + * * is odd (because otherwise, all our hash values will be even) + * + * * has a reasonably-even mix of 1's and 0's (consider the extreme case + * where we multiply by 0x3 or 0xeffffff -- this will not produce good + * mixing across all bits of the hash). + * + * The rotation length of 5 is also arbitrary, although an odd number is again + * preferable so our hash explores the whole universe of possible rotations. + * + * Finally, we multiply by the golden ratio *after* xor'ing, not before. + * Otherwise, if |aHash| is 0 (as it often is for the beginning of a + * message), the expression + * + * (kGoldenRatioU32 * RotateBitsLeft(aHash, 5)) |xor| aValue + * + * evaluates to |aValue|. + * + * (Number-theoretic aside: Because any odd number |m| is relatively prime to + * our modulus (2^32), the list + * + * [x * m (mod 2^32) for 0 <= x < 2^32] + * + * has no duplicate elements. This means that multiplying by |m| does not + * cause us to skip any possible hash values. + * + * It's also nice if |m| has large-ish order mod 2^32 -- that is, if the + * smallest k such that m^k == 1 (mod 2^32) is large -- so we can safely + * multiply our hash value by |m| a few times without negating the + * multiplicative effect. Our golden ratio constant has order 2^29, which is + * more than enough for our purposes.) + */ + return kGoldenRatioU32 * (RotateBitsLeft32(aHash, 5) ^ aValue); +} + +/** + * AddUintptrToHash takes sizeof(uintptr_t) as a template parameter. + */ +template +inline uint32_t +AddUintptrToHash(uint32_t aHash, uintptr_t aValue); + +template<> +inline uint32_t +AddUintptrToHash<4>(uint32_t aHash, uintptr_t aValue) +{ + return AddU32ToHash(aHash, static_cast(aValue)); +} + +template<> +inline uint32_t +AddUintptrToHash<8>(uint32_t aHash, uintptr_t aValue) +{ + /* + * The static cast to uint64_t below is necessary because this function + * sometimes gets compiled on 32-bit platforms (yes, even though it's a + * template and we never call this particular override in a 32-bit build). If + * we do aValue >> 32 on a 32-bit machine, we're shifting a 32-bit uintptr_t + * right 32 bits, and the compiler throws an error. + */ + uint32_t v1 = static_cast(aValue); + uint32_t v2 = static_cast(static_cast(aValue) >> 32); + return AddU32ToHash(AddU32ToHash(aHash, v1), v2); +} + +} /* namespace detail */ + +/** + * AddToHash takes a hash and some values and returns a new hash based on the + * inputs. + * + * Currently, we support hashing uint32_t's, values which we can implicitly + * convert to uint32_t, data pointers, and function pointers. + */ +template +MOZ_WARN_UNUSED_RESULT inline uint32_t +AddToHash(uint32_t aHash, A aA) +{ + /* + * Try to convert |A| to uint32_t implicitly. If this works, great. If not, + * we'll error out. + */ + return detail::AddU32ToHash(aHash, aA); +} + +template +MOZ_WARN_UNUSED_RESULT inline uint32_t +AddToHash(uint32_t aHash, A* aA) +{ + /* + * You might think this function should just take a void*. But then we'd only + * catch data pointers and couldn't handle function pointers. + */ + + static_assert(sizeof(aA) == sizeof(uintptr_t), "Strange pointer!"); + + return detail::AddUintptrToHash(aHash, uintptr_t(aA)); +} + +template<> +MOZ_WARN_UNUSED_RESULT inline uint32_t +AddToHash(uint32_t aHash, uintptr_t aA) +{ + return detail::AddUintptrToHash(aHash, aA); +} + +template +MOZ_WARN_UNUSED_RESULT uint32_t +AddToHash(uint32_t aHash, A aA, B aB) +{ + return AddToHash(AddToHash(aHash, aA), aB); +} + +template +MOZ_WARN_UNUSED_RESULT uint32_t +AddToHash(uint32_t aHash, A aA, B aB, C aC) +{ + return AddToHash(AddToHash(aHash, aA, aB), aC); +} + +template +MOZ_WARN_UNUSED_RESULT uint32_t +AddToHash(uint32_t aHash, A aA, B aB, C aC, D aD) +{ + return AddToHash(AddToHash(aHash, aA, aB, aC), aD); +} + +template +MOZ_WARN_UNUSED_RESULT uint32_t +AddToHash(uint32_t aHash, A aA, B aB, C aC, D aD, E aE) +{ + return AddToHash(AddToHash(aHash, aA, aB, aC, aD), aE); +} + +/** + * The HashGeneric class of functions let you hash one or more values. + * + * If you want to hash together two values x and y, calling HashGeneric(x, y) is + * much better than calling AddToHash(x, y), because AddToHash(x, y) assumes + * that x has already been hashed. + */ +template +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashGeneric(A aA) +{ + return AddToHash(0, aA); +} + +template +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashGeneric(A aA, B aB) +{ + return AddToHash(0, aA, aB); +} + +template +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashGeneric(A aA, B aB, C aC) +{ + return AddToHash(0, aA, aB, aC); +} + +template +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashGeneric(A aA, B aB, C aC, D aD) +{ + return AddToHash(0, aA, aB, aC, aD); +} + +template +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashGeneric(A aA, B aB, C aC, D aD, E aE) +{ + return AddToHash(0, aA, aB, aC, aD, aE); +} + +namespace detail { + +template +uint32_t +HashUntilZero(const T* aStr) +{ + uint32_t hash = 0; + for (T c; (c = *aStr); aStr++) { + hash = AddToHash(hash, c); + } + return hash; +} + +template +uint32_t +HashKnownLength(const T* aStr, size_t aLength) +{ + uint32_t hash = 0; + for (size_t i = 0; i < aLength; i++) { + hash = AddToHash(hash, aStr[i]); + } + return hash; +} + +} /* namespace detail */ + +/** + * The HashString overloads below do just what you'd expect. + * + * If you have the string's length, you might as well call the overload which + * includes the length. It may be marginally faster. + */ +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const char* aStr) +{ + return detail::HashUntilZero(aStr); +} + +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const char* aStr, size_t aLength) +{ + return detail::HashKnownLength(aStr, aLength); +} + +MOZ_WARN_UNUSED_RESULT +inline uint32_t +HashString(const unsigned char* aStr, size_t aLength) +{ + return detail::HashKnownLength(aStr, aLength); +} + +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const uint16_t* aStr) +{ + return detail::HashUntilZero(aStr); +} + +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const uint16_t* aStr, size_t aLength) +{ + return detail::HashKnownLength(aStr, aLength); +} + +#ifdef MOZ_CHAR16_IS_NOT_WCHAR +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const char16_t* aStr) +{ + return detail::HashUntilZero(aStr); +} + +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const char16_t* aStr, size_t aLength) +{ + return detail::HashKnownLength(aStr, aLength); +} +#endif + +/* + * On Windows, wchar_t (char16_t) is not the same as uint16_t, even though it's + * the same width! + */ +#ifdef WIN32 +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const wchar_t* aStr) +{ + return detail::HashUntilZero(aStr); +} + +MOZ_WARN_UNUSED_RESULT inline uint32_t +HashString(const wchar_t* aStr, size_t aLength) +{ + return detail::HashKnownLength(aStr, aLength); +} +#endif + +/** + * Hash some number of bytes. + * + * This hash walks word-by-word, rather than byte-by-byte, so you won't get the + * same result out of HashBytes as you would out of HashString. + */ +MOZ_WARN_UNUSED_RESULT extern MFBT_API uint32_t +HashBytes(const void* bytes, size_t aLength); + +} /* namespace mozilla */ +#endif /* __cplusplus */ + +#endif /* mozilla_HashFunctions_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerPrintfMacros.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerPrintfMacros.h new file mode 100644 index 0000000000..ff2415a86f --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerPrintfMacros.h @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Implements the C99 interface, minus the SCN* format macros. */ + +#ifndef mozilla_IntegerPrintfMacros_h_ +#define mozilla_IntegerPrintfMacros_h_ + +/* + * MSVC++ doesn't include , even in versions shipping , so + * we have to reimplement it there. Note: #includes . + * + * Note that this header DOES NOT implement 's scanf macros. MSVC's + * scanf doesn't have sufficient format specifier support to implement them + * (specifically, to implement scanning into an 8-bit location). + * + * http://stackoverflow.com/questions/3036396/scanfd-char-char-as-int-format-string + * + * Moreover, scanf is a footgun: if the input number exceeds the bounds of the + * target type, behavior is undefined (in the compiler sense: that is, this code + * could overwrite your hard drive with zeroes): + * + * uint8_t u; + * sscanf("256", "%" SCNu8, &u); // BAD + * + * This header will sometimes provide SCN* macros, by dint of being implemented + * using . But for these reasons, *never* use them! + */ + +#if defined(MOZ_CUSTOM_INTTYPES_H) +# include MOZ_CUSTOM_INTTYPES_H +#elif defined(_MSC_VER) +# include "mozilla/MSIntTypes.h" +#else +# include +#endif + +/* + * Fix up Android's broken [u]intptr_t inttype macros. Android's PRI*PTR + * macros are defined as "ld", but sizeof(long) is 8 and sizeof(intptr_t) + * is 4 on 32-bit Android. TestTypeTraits.cpp asserts that these new macro + * definitions match the actual type sizes seen at compile time. + */ +#if defined(ANDROID) && !defined(__LP64__) +# undef PRIdPTR /* intptr_t */ +# define PRIdPTR "d" /* intptr_t */ +# undef PRIiPTR /* intptr_t */ +# define PRIiPTR "i" /* intptr_t */ +# undef PRIoPTR /* uintptr_t */ +# define PRIoPTR "o" /* uintptr_t */ +# undef PRIuPTR /* uintptr_t */ +# define PRIuPTR "u" /* uintptr_t */ +# undef PRIxPTR /* uintptr_t */ +# define PRIxPTR "x" /* uintptr_t */ +# undef PRIXPTR /* uintptr_t */ +# define PRIXPTR "X" /* uintptr_t */ +#endif + +#endif /* mozilla_IntegerPrintfMacros_h_ */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerTypeTraits.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerTypeTraits.h new file mode 100644 index 0000000000..9414451f91 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/IntegerTypeTraits.h @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Helpers to manipulate integer types that don't fit in TypeTraits.h */ + +#ifndef mozilla_IntegerTypeTraits_h +#define mozilla_IntegerTypeTraits_h + +#include "mozilla/TypeTraits.h" +#include + +namespace mozilla { + +namespace detail { + +/** + * StdintTypeForSizeAndSignedness returns the stdint integer type + * of given size (can be 1, 2, 4 or 8) and given signedness + * (false means unsigned, true means signed). + */ +template +struct StdintTypeForSizeAndSignedness; + +template<> +struct StdintTypeForSizeAndSignedness<1, true> +{ + typedef int8_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<1, false> +{ + typedef uint8_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<2, true> +{ + typedef int16_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<2, false> +{ + typedef uint16_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<4, true> +{ + typedef int32_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<4, false> +{ + typedef uint32_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<8, true> +{ + typedef int64_t Type; +}; + +template<> +struct StdintTypeForSizeAndSignedness<8, false> +{ + typedef uint64_t Type; +}; + +} // namespace detail + +template +struct UnsignedStdintTypeForSize + : detail::StdintTypeForSizeAndSignedness +{}; + +template +struct PositionOfSignBit +{ + static_assert(IsIntegral::value, + "PositionOfSignBit is only for integral types"); + // 8 here should be CHAR_BIT from limits.h, but the world has moved on. + static const size_t value = 8 * sizeof(IntegerType) - 1; +}; + +/** + * MinValue returns the minimum value of the given integer type as a + * compile-time constant, which std::numeric_limits::min() + * cannot do in c++98. + */ +template +struct MinValue +{ +private: + static_assert(IsIntegral::value, + "MinValue is only for integral types"); + + typedef typename MakeUnsigned::Type UnsignedIntegerType; + static const size_t PosOfSignBit = PositionOfSignBit::value; + +public: + // Bitwise ops may return a larger type, that's why we cast explicitly. + // In C++, left bit shifts on signed values is undefined by the standard + // unless the shifted value is representable. + // Notice that signed-to-unsigned conversions are always well-defined in + // the standard as the value congruent to 2**n, as expected. By contrast, + // unsigned-to-signed is only well-defined if the value is representable. + static const IntegerType value = + IsSigned::value + ? IntegerType(UnsignedIntegerType(1) << PosOfSignBit) + : IntegerType(0); +}; + +/** + * MaxValue returns the maximum value of the given integer type as a + * compile-time constant, which std::numeric_limits::max() + * cannot do in c++98. + */ +template +struct MaxValue +{ + static_assert(IsIntegral::value, + "MaxValue is only for integral types"); + + // Tricksy, but covered by the CheckedInt unit test. + // Relies on the type of MinValue::value + // being IntegerType. + static const IntegerType value = ~MinValue::value; +}; + +} // namespace mozilla + +#endif // mozilla_IntegerTypeTraits_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Likely.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Likely.h new file mode 100644 index 0000000000..4f21609295 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Likely.h @@ -0,0 +1,23 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * MOZ_LIKELY and MOZ_UNLIKELY macros to hint to the compiler how a + * boolean predicate should be branch-predicted. + */ + +#ifndef mozilla_Likely_h +#define mozilla_Likely_h + +#if defined(__clang__) || defined(__GNUC__) +# define MOZ_LIKELY(x) (__builtin_expect(!!(x), 1)) +# define MOZ_UNLIKELY(x) (__builtin_expect(!!(x), 0)) +#else +# define MOZ_LIKELY(x) (!!(x)) +# define MOZ_UNLIKELY(x) (!!(x)) +#endif + +#endif /* mozilla_Likely_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinkedList.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinkedList.h new file mode 100644 index 0000000000..693c019f92 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinkedList.h @@ -0,0 +1,486 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A type-safe doubly-linked list class. */ + +/* + * The classes LinkedList and LinkedListElement together form a + * convenient, type-safe doubly-linked list implementation. + * + * The class T which will be inserted into the linked list must inherit from + * LinkedListElement. A given object may be in only one linked list at a + * time. + * + * A LinkedListElement automatically removes itself from the list upon + * destruction, and a LinkedList will fatally assert in debug builds if it's + * non-empty when it's destructed. + * + * For example, you might use LinkedList in a simple observer list class as + * follows. + * + * class Observer : public LinkedListElement + * { + * public: + * void observe(char* aTopic) { ... } + * }; + * + * class ObserverContainer + * { + * private: + * LinkedList list; + * + * public: + * void addObserver(Observer* aObserver) + * { + * // Will assert if |aObserver| is part of another list. + * list.insertBack(aObserver); + * } + * + * void removeObserver(Observer* aObserver) + * { + * // Will assert if |aObserver| is not part of some list. + * aObserver.remove(); + * // Or, will assert if |aObserver| is not part of |list| specifically. + * // aObserver.removeFrom(list); + * } + * + * void notifyObservers(char* aTopic) + * { + * for (Observer* o = list.getFirst(); o != nullptr; o = o->getNext()) { + * o->observe(aTopic); + * } + * } + * }; + * + */ + +#ifndef mozilla_LinkedList_h +#define mozilla_LinkedList_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/MemoryReporting.h" +#include "mozilla/Move.h" +#include "mozilla/NullPtr.h" + +#ifdef __cplusplus + +namespace mozilla { + +template +class LinkedList; + +template +class LinkedListElement +{ + /* + * It's convenient that we return nullptr when getNext() or getPrevious() + * hits the end of the list, but doing so costs an extra word of storage in + * each linked list node (to keep track of whether |this| is the sentinel + * node) and a branch on this value in getNext/getPrevious. + * + * We could get rid of the extra word of storage by shoving the "is + * sentinel" bit into one of the pointers, although this would, of course, + * have performance implications of its own. + * + * But the goal here isn't to win an award for the fastest or slimmest + * linked list; rather, we want a *convenient* linked list. So we won't + * waste time guessing which micro-optimization strategy is best. + * + * + * Speaking of unnecessary work, it's worth addressing here why we wrote + * mozilla::LinkedList in the first place, instead of using stl::list. + * + * The key difference between mozilla::LinkedList and stl::list is that + * mozilla::LinkedList stores the mPrev/mNext pointers in the object itself, + * while stl::list stores the mPrev/mNext pointers in a list element which + * itself points to the object being stored. + * + * mozilla::LinkedList's approach makes it harder to store an object in more + * than one list. But the upside is that you can call next() / prev() / + * remove() directly on the object. With stl::list, you'd need to store a + * pointer to its iterator in the object in order to accomplish this. Not + * only would this waste space, but you'd have to remember to update that + * pointer every time you added or removed the object from a list. + * + * In-place, constant-time removal is a killer feature of doubly-linked + * lists, and supporting this painlessly was a key design criterion. + */ + +private: + LinkedListElement* mNext; + LinkedListElement* mPrev; + const bool mIsSentinel; + +public: + LinkedListElement() + : mNext(MOZ_THIS_IN_INITIALIZER_LIST()), + mPrev(MOZ_THIS_IN_INITIALIZER_LIST()), + mIsSentinel(false) + { } + + LinkedListElement(LinkedListElement&& other) + : mIsSentinel(other.mIsSentinel) + { + if (!other.isInList()) { + mNext = this; + mPrev = this; + return; + } + + MOZ_ASSERT(other.mNext->mPrev == &other); + MOZ_ASSERT(other.mPrev->mNext == &other); + + /* + * Initialize |this| with |other|'s mPrev/mNext pointers, and adjust those + * element to point to this one. + */ + mNext = other.mNext; + mPrev = other.mPrev; + + mNext->mPrev = this; + mPrev->mNext = this; + + /* + * Adjust |other| so it doesn't think it's in a list. This makes it + * safely destructable. + */ + other.mNext = &other; + other.mPrev = &other; + } + + ~LinkedListElement() + { + if (!mIsSentinel && isInList()) { + remove(); + } + } + + /* + * Get the next element in the list, or nullptr if this is the last element + * in the list. + */ + T* getNext() { return mNext->asT(); } + const T* getNext() const { return mNext->asT(); } + + /* + * Get the previous element in the list, or nullptr if this is the first + * element in the list. + */ + T* getPrevious() { return mPrev->asT(); } + const T* getPrevious() const { return mPrev->asT(); } + + /* + * Insert aElem after this element in the list. |this| must be part of a + * linked list when you call setNext(); otherwise, this method will assert. + */ + void setNext(T* aElem) + { + MOZ_ASSERT(isInList()); + setNextUnsafe(aElem); + } + + /* + * Insert aElem before this element in the list. |this| must be part of a + * linked list when you call setPrevious(); otherwise, this method will + * assert. + */ + void setPrevious(T* aElem) + { + MOZ_ASSERT(isInList()); + setPreviousUnsafe(aElem); + } + + /* + * Remove this element from the list which contains it. If this element is + * not currently part of a linked list, this method asserts. + */ + void remove() + { + MOZ_ASSERT(isInList()); + + mPrev->mNext = mNext; + mNext->mPrev = mPrev; + mNext = this; + mPrev = this; + } + + /* + * Identical to remove(), but also asserts in debug builds that this element + * is in aList. + */ + void removeFrom(const LinkedList& aList) + { + aList.assertContains(asT()); + remove(); + } + + /* + * Return true if |this| part is of a linked list, and false otherwise. + */ + bool isInList() const + { + MOZ_ASSERT((mNext == this) == (mPrev == this)); + return mNext != this; + } + +private: + friend class LinkedList; + + enum NodeKind { + NODE_KIND_NORMAL, + NODE_KIND_SENTINEL + }; + + explicit LinkedListElement(NodeKind nodeKind) + : mNext(MOZ_THIS_IN_INITIALIZER_LIST()), + mPrev(MOZ_THIS_IN_INITIALIZER_LIST()), + mIsSentinel(nodeKind == NODE_KIND_SENTINEL) + { } + + /* + * Return |this| cast to T* if we're a normal node, or return nullptr if + * we're a sentinel node. + */ + T* asT() + { + return mIsSentinel ? nullptr : static_cast(this); + } + const T* asT() const + { + return mIsSentinel ? nullptr : static_cast(this); + } + + /* + * Insert aElem after this element, but don't check that this element is in + * the list. This is called by LinkedList::insertFront(). + */ + void setNextUnsafe(T* aElem) + { + LinkedListElement *listElem = static_cast(aElem); + MOZ_ASSERT(!listElem->isInList()); + + listElem->mNext = this->mNext; + listElem->mPrev = this; + this->mNext->mPrev = listElem; + this->mNext = listElem; + } + + /* + * Insert aElem before this element, but don't check that this element is in + * the list. This is called by LinkedList::insertBack(). + */ + void setPreviousUnsafe(T* aElem) + { + LinkedListElement* listElem = static_cast*>(aElem); + MOZ_ASSERT(!listElem->isInList()); + + listElem->mNext = this; + listElem->mPrev = this->mPrev; + this->mPrev->mNext = listElem; + this->mPrev = listElem; + } + +private: + LinkedListElement& operator=(const LinkedListElement& aOther) MOZ_DELETE; + LinkedListElement(const LinkedListElement& aOther) MOZ_DELETE; +}; + +template +class LinkedList +{ +private: + LinkedListElement sentinel; + +public: + LinkedList() : sentinel(LinkedListElement::NODE_KIND_SENTINEL) { } + + LinkedList(LinkedList&& aOther) + : sentinel(mozilla::Move(aOther.sentinel)) + { } + + ~LinkedList() { MOZ_ASSERT(isEmpty()); } + + /* + * Add aElem to the front of the list. + */ + void insertFront(T* aElem) + { + /* Bypass setNext()'s this->isInList() assertion. */ + sentinel.setNextUnsafe(aElem); + } + + /* + * Add aElem to the back of the list. + */ + void insertBack(T* aElem) + { + sentinel.setPreviousUnsafe(aElem); + } + + /* + * Get the first element of the list, or nullptr if the list is empty. + */ + T* getFirst() { return sentinel.getNext(); } + const T* getFirst() const { return sentinel.getNext(); } + + /* + * Get the last element of the list, or nullptr if the list is empty. + */ + T* getLast() { return sentinel.getPrevious(); } + const T* getLast() const { return sentinel.getPrevious(); } + + /* + * Get and remove the first element of the list. If the list is empty, + * return nullptr. + */ + T* popFirst() + { + T* ret = sentinel.getNext(); + if (ret) { + static_cast*>(ret)->remove(); + } + return ret; + } + + /* + * Get and remove the last element of the list. If the list is empty, + * return nullptr. + */ + T* popLast() + { + T* ret = sentinel.getPrevious(); + if (ret) { + static_cast*>(ret)->remove(); + } + return ret; + } + + /* + * Return true if the list is empty, or false otherwise. + */ + bool isEmpty() const + { + return !sentinel.isInList(); + } + + /* + * Remove all the elements from the list. + * + * This runs in time linear to the list's length, because we have to mark + * each element as not in the list. + */ + void clear() + { + while (popFirst()) { + continue; + } + } + + /* + * Measures the memory consumption of the list excluding |this|. Note that + * it only measures the list elements themselves. If the list elements + * contain pointers to other memory blocks, those blocks must be measured + * separately during a subsequent iteration over the list. + */ + size_t sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const + { + size_t n = 0; + for (const T* t = getFirst(); t; t = t->getNext()) { + n += aMallocSizeOf(t); + } + return n; + } + + /* + * Like sizeOfExcludingThis(), but measures |this| as well. + */ + size_t sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const + { + return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf); + } + + /* + * In a debug build, make sure that the list is sane (no cycles, consistent + * mNext/mPrev pointers, only one sentinel). Has no effect in release builds. + */ + void debugAssertIsSane() const + { +#ifdef DEBUG + const LinkedListElement* slow; + const LinkedListElement* fast1; + const LinkedListElement* fast2; + + /* + * Check for cycles in the forward singly-linked list using the + * tortoise/hare algorithm. + */ + for (slow = sentinel.mNext, + fast1 = sentinel.mNext->mNext, + fast2 = sentinel.mNext->mNext->mNext; + slow != &sentinel && fast1 != &sentinel && fast2 != &sentinel; + slow = slow->mNext, fast1 = fast2->mNext, fast2 = fast1->mNext) { + MOZ_ASSERT(slow != fast1); + MOZ_ASSERT(slow != fast2); + } + + /* Check for cycles in the backward singly-linked list. */ + for (slow = sentinel.mPrev, + fast1 = sentinel.mPrev->mPrev, + fast2 = sentinel.mPrev->mPrev->mPrev; + slow != &sentinel && fast1 != &sentinel && fast2 != &sentinel; + slow = slow->mPrev, fast1 = fast2->mPrev, fast2 = fast1->mPrev) { + MOZ_ASSERT(slow != fast1); + MOZ_ASSERT(slow != fast2); + } + + /* + * Check that |sentinel| is the only node in the list with + * mIsSentinel == true. + */ + for (const LinkedListElement* elem = sentinel.mNext; + elem != &sentinel; + elem = elem->mNext) { + MOZ_ASSERT(!elem->mIsSentinel); + } + + /* Check that the mNext/mPrev pointers match up. */ + const LinkedListElement* prev = &sentinel; + const LinkedListElement* cur = sentinel.mNext; + do { + MOZ_ASSERT(cur->mPrev == prev); + MOZ_ASSERT(prev->mNext == cur); + + prev = cur; + cur = cur->mNext; + } while (cur != &sentinel); +#endif /* ifdef DEBUG */ + } + +private: + friend class LinkedListElement; + + void assertContains(const T* aValue) const + { +#ifdef DEBUG + for (const T* elem = getFirst(); elem; elem = elem->getNext()) { + if (elem == aValue) { + return; + } + } + MOZ_CRASH("element wasn't found in this list!"); +#endif + } + + LinkedList& operator=(const LinkedList& aOther) MOZ_DELETE; + LinkedList(const LinkedList& aOther) MOZ_DELETE; +}; + +} /* namespace mozilla */ + +#endif /* __cplusplus */ + +#endif /* mozilla_LinkedList_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinuxSignal.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinuxSignal.h new file mode 100644 index 0000000000..9b8e1bbbbe --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/LinuxSignal.h @@ -0,0 +1,48 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_LinuxSignal_h +#define mozilla_LinuxSignal_h + +namespace mozilla { + +#if defined(__arm__) + +// Some (old) Linux kernels on ARM have a bug where a signal handler +// can be called without clearing the IT bits in CPSR first. The result +// is that the first few instructions of the handler could be skipped, +// ultimately resulting in crashes. To workaround this bug, the handler +// on ARM is a trampoline that starts with enough NOP instructions, so +// that even if the IT bits are not cleared, only the NOP instructions +// will be skipped over. + +template +__attribute__((naked)) void +SignalTrampoline(int aSignal, siginfo_t* aInfo, void* aContext) +{ + asm volatile ( + "nop; nop; nop; nop" + : : : "memory"); + + // Because the assembler may generate additional insturctions below, we + // need to ensure NOPs are inserted first by separating them out above. + + asm volatile ( + "bx %0" + : + : "r"(H), "l"(aSignal), "l"(aInfo), "l"(aContext) + : "memory"); +} + +# define MOZ_SIGNAL_TRAMPOLINE(h) (mozilla::SignalTrampoline) + +#else // __arm__ + +# define MOZ_SIGNAL_TRAMPOLINE(h) (h) + +#endif // __arm__ + +} // namespace mozilla + +#endif // mozilla_LinuxSignal_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MSIntTypes.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MSIntTypes.h new file mode 100644 index 0000000000..4ce922fbc5 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MSIntTypes.h @@ -0,0 +1,198 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// DO NOT SUPPORT THE scanf MACROS! See the comment at the top of +// IntegerPrintfMacros.h. + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + + +#endif // _MSC_INTTYPES_H_ ] diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroArgs.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroArgs.h new file mode 100644 index 0000000000..c8b7338210 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroArgs.h @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Implements various macros meant to ease the use of variadic macros. + */ + +#ifndef mozilla_MacroArgs_h +#define mozilla_MacroArgs_h + +/* + * MOZ_PASTE_PREFIX_AND_ARG_COUNT(aPrefix, ...) counts the number of variadic + * arguments and prefixes it with |aPrefix|. For example: + * + * MOZ_PASTE_PREFIX_AND_ARG_COUNT(, foo, 42) expands to 2 + * MOZ_PASTE_PREFIX_AND_ARG_COUNT(A, foo, 42, bar) expands to A3 + * + * You must pass in between 1 and 50 (inclusive) variadic arguments, past + * |aPrefix|. It is not legal to do + * + * MOZ_PASTE_PREFIX_AND_ARG_COUNT(prefix) + * + * (that is, pass in 0 variadic arguments). To ensure that a compile-time + * error occurs when these constraints are violated, use the + * MOZ_STATIC_ASSERT_VALID_ARG_COUNT macro with the same variaidc arguments + * wherever this macro is used. + * + * Passing (__VA_ARGS__, ) rather than simply calling + * MOZ_MACROARGS_ARG_COUNT_HELPER2(__VA_ARGS__, ) very + * carefully tiptoes around a MSVC bug where it improperly expands __VA_ARGS__ + * as a single token in argument lists. For details, see: + * + * http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement + * http://cplusplus.co.il/2010/07/17/variadic-macro-to-count-number-of-arguments/#comment-644 + */ +#define MOZ_PASTE_PREFIX_AND_ARG_COUNT(aPrefix, ...) \ + MOZ_MACROARGS_ARG_COUNT_HELPER((__VA_ARGS__, \ + aPrefix##50, aPrefix##49, aPrefix##48, aPrefix##47, aPrefix##46, \ + aPrefix##45, aPrefix##44, aPrefix##43, aPrefix##42, aPrefix##41, \ + aPrefix##40, aPrefix##39, aPrefix##38, aPrefix##37, aPrefix##36, \ + aPrefix##35, aPrefix##34, aPrefix##33, aPrefix##32, aPrefix##31, \ + aPrefix##30, aPrefix##29, aPrefix##28, aPrefix##27, aPrefix##26, \ + aPrefix##25, aPrefix##24, aPrefix##23, aPrefix##22, aPrefix##21, \ + aPrefix##20, aPrefix##19, aPrefix##18, aPrefix##17, aPrefix##16, \ + aPrefix##15, aPrefix##14, aPrefix##13, aPrefix##12, aPrefix##11, \ + aPrefix##10, aPrefix##9, aPrefix##8, aPrefix##7, aPrefix##6, \ + aPrefix##5, aPrefix##4, aPrefix##3, aPrefix##2, aPrefix##1, aPrefix##0)) + +#define MOZ_MACROARGS_ARG_COUNT_HELPER(aArgs) \ + MOZ_MACROARGS_ARG_COUNT_HELPER2 aArgs + +#define MOZ_MACROARGS_ARG_COUNT_HELPER2( \ + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \ + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \ + a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, \ + a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, \ + a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, \ + a51, ...) a51 + +/* + * MOZ_STATIC_ASSERT_VALID_ARG_COUNT ensures that a compile-time error occurs + * when the argument count constraints of MOZ_PASTE_PREFIX_AND_ARG_COUNT are + * violated. Use this macro wherever MOZ_PASTE_PREFIX_AND_ARG_COUNT is used + * and pass it the same variadic arguments. + * + * This macro employs a few dirty tricks to function. To detect the zero + * argument case, |(__VA_ARGS__)| is stringified, sizeof-ed, and compared to + * what it should be in the absence of arguments. + * + * Detecting too many arguments is a little trickier. With a valid argument + * count and a prefix of 1, MOZ_PASTE_PREFIX_AND_ARG_COUNT expands to e.g. 14. + * With a prefix of 0.0, it expands to e.g. 0.04. If there are too many + * arguments, it expands to the first argument over the limit. If this + * exceeding argument is a number, the assertion will fail as there is no + * number than can simultaneously be both > 10 and == 0. If the exceeding + * argument is not a number, a compile-time error should still occur due to + * the operations performed on it. + */ +#define MOZ_MACROARGS_STRINGIFY_HELPER(x) #x +#define MOZ_STATIC_ASSERT_VALID_ARG_COUNT(...) \ + static_assert( \ + sizeof(MOZ_MACROARGS_STRINGIFY_HELPER((__VA_ARGS__))) != sizeof("()") && \ + (MOZ_PASTE_PREFIX_AND_ARG_COUNT(1, __VA_ARGS__)) > 10 && \ + (int)(MOZ_PASTE_PREFIX_AND_ARG_COUNT(0.0, __VA_ARGS__)) == 0, \ + "MOZ_STATIC_ASSERT_VALID_ARG_COUNT requires 1 to 50 arguments") /* ; */ + +/* + * MOZ_ARGS_AFTER_N expands to its arguments excluding the first |N| + * arguments. For example: + * + * MOZ_ARGS_AFTER_2(a, b, c, d) expands to: c, d + */ +#define MOZ_ARGS_AFTER_1(a1, ...) __VA_ARGS__ +#define MOZ_ARGS_AFTER_2(a1, a2, ...) __VA_ARGS__ + +/* + * MOZ_ARG_N expands to its |N|th argument. + */ +#define MOZ_ARG_1(a1, ...) a1 +#define MOZ_ARG_2(a1, a2, ...) a2 + +#endif /* mozilla_MacroArgs_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroForEach.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroForEach.h new file mode 100644 index 0000000000..ae1f4d0e99 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MacroForEach.h @@ -0,0 +1,158 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Implements a higher-order macro for iteratively calling another macro with + * fixed leading arguments, plus a trailing element picked from a second list + * of arguments. + */ + +#ifndef mozilla_MacroForEach_h +#define mozilla_MacroForEach_h + +#include "mozilla/MacroArgs.h" + +/* + * MOZ_FOR_EACH(aMacro, aFixedArgs, aArgs) expands to N calls to the macro + * |aMacro| where N is equal the number of items in the list |aArgs|. The + * arguments for each |aMacro| call are composed of *all* arguments in the list + * |aFixedArgs| as well as a single argument in the list |aArgs|. For example: + * + * #define MACRO_A(x) x + + * int a = MOZ_FOR_EACH(MACRO_A, (), (1, 2, 3)) 0; + * // Expands to: MACRO_A(1) MACRO_A(2) MACRO_A(3) 0; + * // And further to: 1 + 2 + 3 + 0; + * + * #define MACRO_B(k, x) (k + x) + + * int b = MOZ_FOR_EACH(MACRO_B, (5,), (1, 2)) 0; + * // Expands to: MACRO_B(5, 1) MACRO_B(5, 2) 0; + * + * #define MACRO_C(k1, k2, x) (k1 + k2 + x) + + * int c = MOZ_FOR_EACH(MACRO_C, (5, 8,), (1, 2)) 0; + * // Expands to: MACRO_B(5, 8, 1) MACRO_B(5, 8, 2) 0; + * + * If the |aFixedArgs| list is not empty, a trailing comma must be included. + * + * The |aArgs| list must be not be empty and may be up to 50 items long. Use + * MOZ_STATIC_ASSERT_VALID_ARG_COUNT to ensure that violating this constraint + * results in a compile-time error. + */ +#define MOZ_FOR_EACH_EXPAND_HELPER(...) __VA_ARGS__ +#define MOZ_FOR_EACH_GLUE(a, b) a b +#define MOZ_FOR_EACH(aMacro, aFixedArgs, aArgs) \ + MOZ_FOR_EACH_GLUE( \ + MOZ_PASTE_PREFIX_AND_ARG_COUNT(MOZ_FOR_EACH_, \ + MOZ_FOR_EACH_EXPAND_HELPER aArgs), \ + (aMacro, aFixedArgs, aArgs)) + +#define MOZ_FOR_EACH_HELPER_GLUE(a, b) a b +#define MOZ_FOR_EACH_HELPER(aMacro, aFixedArgs, aArgs) \ + MOZ_FOR_EACH_HELPER_GLUE( \ + aMacro, \ + (MOZ_FOR_EACH_EXPAND_HELPER aFixedArgs MOZ_ARG_1 aArgs)) + +#define MOZ_FOR_EACH_1(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) +#define MOZ_FOR_EACH_2(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_1(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_3(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_2(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_4(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_3(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_5(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_4(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_6(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_5(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_7(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_6(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_8(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_7(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_9(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_8(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_10(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_9(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_11(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_10(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_12(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_11(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_13(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_12(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_14(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_13(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_15(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_14(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_16(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_15(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_17(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_16(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_18(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_17(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_19(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_18(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_20(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_19(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_21(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_20(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_22(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_21(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_23(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_22(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_24(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_23(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_25(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_24(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_26(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_25(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_27(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_26(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_28(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_27(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_29(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_28(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_30(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_29(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_31(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_30(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_32(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_31(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_33(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_32(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_34(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_33(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_35(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_34(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_36(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_35(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_37(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_36(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_38(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_37(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_39(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_38(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_40(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_39(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_41(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_40(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_42(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_41(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_43(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_42(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_44(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_43(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_45(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_44(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_46(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_45(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_47(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_46(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_48(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_47(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_49(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_48(m, fa, (MOZ_ARGS_AFTER_1 a)) +#define MOZ_FOR_EACH_50(m, fa, a) \ + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_49(m, fa, (MOZ_ARGS_AFTER_1 a)) + +#endif /* mozilla_MacroForEach_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MathAlgorithms.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MathAlgorithms.h new file mode 100644 index 0000000000..cd71d19770 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MathAlgorithms.h @@ -0,0 +1,501 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* mfbt maths algorithms. */ + +#ifndef mozilla_MathAlgorithms_h +#define mozilla_MathAlgorithms_h + +#include "mozilla/Assertions.h" +#include "mozilla/TypeTraits.h" + +#include +#include +#include + +namespace mozilla { + +// Greatest Common Divisor +template +MOZ_ALWAYS_INLINE IntegerType +EuclidGCD(IntegerType aA, IntegerType aB) +{ + // Euclid's algorithm; O(N) in the worst case. (There are better + // ways, but we don't need them for the current use of this algo.) + MOZ_ASSERT(aA > IntegerType(0)); + MOZ_ASSERT(aB > IntegerType(0)); + + while (aA != aB) { + if (aA > aB) { + aA = aA - aB; + } else { + aB = aB - aA; + } + } + + return aA; +} + +// Least Common Multiple +template +MOZ_ALWAYS_INLINE IntegerType +EuclidLCM(IntegerType aA, IntegerType aB) +{ + // Divide first to reduce overflow risk. + return (aA / EuclidGCD(aA, aB)) * aB; +} + +namespace detail { + +template +struct AllowDeprecatedAbsFixed : FalseType {}; + +template<> struct AllowDeprecatedAbsFixed : TrueType {}; +template<> struct AllowDeprecatedAbsFixed : TrueType {}; + +template +struct AllowDeprecatedAbs : AllowDeprecatedAbsFixed {}; + +template<> struct AllowDeprecatedAbs : TrueType {}; +template<> struct AllowDeprecatedAbs : TrueType {}; + +} // namespace detail + +// DO NOT USE DeprecatedAbs. It exists only until its callers can be converted +// to Abs below, and it will be removed when all callers have been changed. +template +inline typename mozilla::EnableIf::value, T>::Type +DeprecatedAbs(const T aValue) +{ + // The absolute value of the smallest possible value of a signed-integer type + // won't fit in that type (on twos-complement systems -- and we're blithely + // assuming we're on such systems, for the non- types listed above), + // so assert that the input isn't that value. + // + // This is the case if: the value is non-negative; or if adding one (giving a + // value in the range [-maxvalue, 0]), then negating (giving a value in the + // range [0, maxvalue]), doesn't produce maxvalue (because in twos-complement, + // (minvalue + 1) == -maxvalue). + MOZ_ASSERT(aValue >= 0 || + -(aValue + 1) != T((1ULL << (CHAR_BIT * sizeof(T) - 1)) - 1), + "You can't negate the smallest possible negative integer!"); + return aValue >= 0 ? aValue : -aValue; +} + +namespace detail { + +// For now mozilla::Abs only takes intN_T, the signed natural types, and +// float/double/long double. Feel free to add overloads for other standard, +// signed types if you need them. + +template +struct AbsReturnTypeFixed; + +template<> struct AbsReturnTypeFixed { typedef uint8_t Type; }; +template<> struct AbsReturnTypeFixed { typedef uint16_t Type; }; +template<> struct AbsReturnTypeFixed { typedef uint32_t Type; }; +template<> struct AbsReturnTypeFixed { typedef uint64_t Type; }; + +template +struct AbsReturnType : AbsReturnTypeFixed {}; + +template<> struct AbsReturnType : + EnableIf {}; +template<> struct AbsReturnType { typedef unsigned char Type; }; +template<> struct AbsReturnType { typedef unsigned short Type; }; +template<> struct AbsReturnType { typedef unsigned int Type; }; +template<> struct AbsReturnType { typedef unsigned long Type; }; +template<> struct AbsReturnType { typedef unsigned long long Type; }; +template<> struct AbsReturnType { typedef float Type; }; +template<> struct AbsReturnType { typedef double Type; }; +template<> struct AbsReturnType { typedef long double Type; }; + +} // namespace detail + +template +inline typename detail::AbsReturnType::Type +Abs(const T aValue) +{ + typedef typename detail::AbsReturnType::Type ReturnType; + return aValue >= 0 ? ReturnType(aValue) : ~ReturnType(aValue) + 1; +} + +template<> +inline float +Abs(const float aFloat) +{ + return std::fabs(aFloat); +} + +template<> +inline double +Abs(const double aDouble) +{ + return std::fabs(aDouble); +} + +template<> +inline long double +Abs(const long double aLongDouble) +{ + return std::fabs(aLongDouble); +} + +} // namespace mozilla + +#if defined(_WIN32) && (_MSC_VER >= 1300) && \ + (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64)) +# define MOZ_BITSCAN_WINDOWS + +# include +# pragma intrinsic(_BitScanForward, _BitScanReverse) + +# if defined(_M_AMD64) || defined(_M_X64) +# define MOZ_BITSCAN_WINDOWS64 +# pragma intrinsic(_BitScanForward64, _BitScanReverse64) +# endif + +#endif + +namespace mozilla { + +namespace detail { + +#if defined(MOZ_BITSCAN_WINDOWS) + +inline uint_fast8_t +CountLeadingZeroes32(uint32_t aValue) +{ + unsigned long index; + _BitScanReverse(&index, static_cast(aValue)); + return uint_fast8_t(31 - index); +} + + +inline uint_fast8_t +CountTrailingZeroes32(uint32_t aValue) +{ + unsigned long index; + _BitScanForward(&index, static_cast(aValue)); + return uint_fast8_t(index); +} + +inline uint_fast8_t +CountPopulation32(uint32_t aValue) +{ + uint32_t x = aValue - ((aValue >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + return (((x + (x >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; +} +inline uint_fast8_t +CountPopulation64(uint64_t aValue) +{ + return uint_fast8_t(CountPopulation32(aValue & 0xffffffff) + + CountPopulation32(aValue >> 32)); +} + +inline uint_fast8_t +CountLeadingZeroes64(uint64_t aValue) +{ +#if defined(MOZ_BITSCAN_WINDOWS64) + unsigned long index; + _BitScanReverse64(&index, static_cast(aValue)); + return uint_fast8_t(63 - index); +#else + uint32_t hi = uint32_t(aValue >> 32); + if (hi != 0) { + return CountLeadingZeroes32(hi); + } + return 32u + CountLeadingZeroes32(uint32_t(aValue)); +#endif +} + +inline uint_fast8_t +CountTrailingZeroes64(uint64_t aValue) +{ +#if defined(MOZ_BITSCAN_WINDOWS64) + unsigned long index; + _BitScanForward64(&index, static_cast(aValue)); + return uint_fast8_t(index); +#else + uint32_t lo = uint32_t(aValue); + if (lo != 0) { + return CountTrailingZeroes32(lo); + } + return 32u + CountTrailingZeroes32(uint32_t(aValue >> 32)); +#endif +} + +# ifdef MOZ_HAVE_BITSCAN64 +# undef MOZ_HAVE_BITSCAN64 +# endif + +#elif defined(__clang__) || defined(__GNUC__) + +# if defined(__clang__) +# if !__has_builtin(__builtin_ctz) || !__has_builtin(__builtin_clz) +# error "A clang providing __builtin_c[lt]z is required to build" +# endif +# else + // gcc has had __builtin_clz and friends since 3.4: no need to check. +# endif + +inline uint_fast8_t +CountLeadingZeroes32(uint32_t aValue) +{ + return __builtin_clz(aValue); +} + +inline uint_fast8_t +CountTrailingZeroes32(uint32_t aValue) +{ + return __builtin_ctz(aValue); +} + +inline uint_fast8_t +CountPopulation32(uint32_t aValue) +{ + return __builtin_popcount(aValue); +} + +inline uint_fast8_t +CountPopulation64(uint64_t aValue) +{ + return __builtin_popcountll(aValue); +} + +inline uint_fast8_t +CountLeadingZeroes64(uint64_t aValue) +{ + return __builtin_clzll(aValue); +} + +inline uint_fast8_t +CountTrailingZeroes64(uint64_t aValue) +{ + return __builtin_ctzll(aValue); +} + +#else +# error "Implement these!" +inline uint_fast8_t CountLeadingZeroes32(uint32_t aValue) MOZ_DELETE; +inline uint_fast8_t CountTrailingZeroes32(uint32_t aValue) MOZ_DELETE; +inline uint_fast8_t CountPopulation32(uint32_t aValue) MOZ_DELETE; +inline uint_fast8_t CountPopulation64(uint64_t aValue) MOZ_DELETE; +inline uint_fast8_t CountLeadingZeroes64(uint64_t aValue) MOZ_DELETE; +inline uint_fast8_t CountTrailingZeroes64(uint64_t aValue) MOZ_DELETE; +#endif + +} // namespace detail + +/** + * Compute the number of high-order zero bits in the NON-ZERO number |aValue|. + * That is, looking at the bitwise representation of the number, with the + * highest- valued bits at the start, return the number of zeroes before the + * first one is observed. + * + * CountLeadingZeroes32(0xF0FF1000) is 0; + * CountLeadingZeroes32(0x7F8F0001) is 1; + * CountLeadingZeroes32(0x3FFF0100) is 2; + * CountLeadingZeroes32(0x1FF50010) is 3; and so on. + */ +inline uint_fast8_t +CountLeadingZeroes32(uint32_t aValue) +{ + MOZ_ASSERT(aValue != 0); + return detail::CountLeadingZeroes32(aValue); +} + +/** + * Compute the number of low-order zero bits in the NON-ZERO number |aValue|. + * That is, looking at the bitwise representation of the number, with the + * lowest- valued bits at the start, return the number of zeroes before the + * first one is observed. + * + * CountTrailingZeroes32(0x0100FFFF) is 0; + * CountTrailingZeroes32(0x7000FFFE) is 1; + * CountTrailingZeroes32(0x0080FFFC) is 2; + * CountTrailingZeroes32(0x0080FFF8) is 3; and so on. + */ +inline uint_fast8_t +CountTrailingZeroes32(uint32_t aValue) +{ + MOZ_ASSERT(aValue != 0); + return detail::CountTrailingZeroes32(aValue); +} + +/** + * Compute the number of one bits in the number |aValue|, + */ +inline uint_fast8_t +CountPopulation32(uint32_t aValue) +{ + return detail::CountPopulation32(aValue); +} + +/** Analogous to CoutPopulation32, but for 64-bit numbers */ +inline uint_fast8_t +CountPopulation64(uint64_t aValue) +{ + return detail::CountPopulation64(aValue); +} + +/** Analogous to CountLeadingZeroes32, but for 64-bit numbers. */ +inline uint_fast8_t +CountLeadingZeroes64(uint64_t aValue) +{ + MOZ_ASSERT(aValue != 0); + return detail::CountLeadingZeroes64(aValue); +} + +/** Analogous to CountTrailingZeroes32, but for 64-bit numbers. */ +inline uint_fast8_t +CountTrailingZeroes64(uint64_t aValue) +{ + MOZ_ASSERT(aValue != 0); + return detail::CountTrailingZeroes64(aValue); +} + +namespace detail { + +template +class CeilingLog2; + +template +class CeilingLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + // Check for <= 1 to avoid the == 0 undefined case. + return aValue <= 1 ? 0u : 32u - CountLeadingZeroes32(aValue - 1); + } +}; + +template +class CeilingLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + // Check for <= 1 to avoid the == 0 undefined case. + return aValue <= 1 ? 0 : 64 - CountLeadingZeroes64(aValue - 1); + } +}; + +} // namespace detail + +/** + * Compute the log of the least power of 2 greater than or equal to |aValue|. + * + * CeilingLog2(0..1) is 0; + * CeilingLog2(2) is 1; + * CeilingLog2(3..4) is 2; + * CeilingLog2(5..8) is 3; + * CeilingLog2(9..16) is 4; and so on. + */ +template +inline uint_fast8_t +CeilingLog2(const T aValue) +{ + return detail::CeilingLog2::compute(aValue); +} + +/** A CeilingLog2 variant that accepts only size_t. */ +inline uint_fast8_t +CeilingLog2Size(size_t aValue) +{ + return CeilingLog2(aValue); +} + +namespace detail { + +template +class FloorLog2; + +template +class FloorLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + return 31u - CountLeadingZeroes32(aValue | 1); + } +}; + +template +class FloorLog2 +{ +public: + static uint_fast8_t compute(const T aValue) + { + return 63u - CountLeadingZeroes64(aValue | 1); + } +}; + +} // namespace detail + +/** + * Compute the log of the greatest power of 2 less than or equal to |aValue|. + * + * FloorLog2(0..1) is 0; + * FloorLog2(2..3) is 1; + * FloorLog2(4..7) is 2; + * FloorLog2(8..15) is 3; and so on. + */ +template +inline uint_fast8_t +FloorLog2(const T aValue) +{ + return detail::FloorLog2::compute(aValue); +} + +/** A FloorLog2 variant that accepts only size_t. */ +inline uint_fast8_t +FloorLog2Size(size_t aValue) +{ + return FloorLog2(aValue); +} + +/* + * Compute the smallest power of 2 greater than or equal to |x|. |x| must not + * be so great that the computed value would overflow |size_t|. + */ +inline size_t +RoundUpPow2(size_t aValue) +{ + MOZ_ASSERT(aValue <= (size_t(1) << (sizeof(size_t) * CHAR_BIT - 1)), + "can't round up -- will overflow!"); + return size_t(1) << CeilingLog2(aValue); +} + +/** + * Rotates the bits of the given value left by the amount of the shift width. + */ +template +inline T +RotateLeft(const T aValue, uint_fast8_t aShift) +{ + MOZ_ASSERT(aShift < sizeof(T) * CHAR_BIT, "Shift value is too large!"); + static_assert(IsUnsigned::value, "Rotates require unsigned values"); + return (aValue << aShift) | (aValue >> (sizeof(T) * CHAR_BIT - aShift)); +} + +/** + * Rotates the bits of the given value right by the amount of the shift width. + */ +template +inline T +RotateRight(const T aValue, uint_fast8_t aShift) +{ + MOZ_ASSERT(aShift < sizeof(T) * CHAR_BIT, "Shift value is too large!"); + static_assert(IsUnsigned::value, "Rotates require unsigned values"); + return (aValue >> aShift) | (aValue << (sizeof(T) * CHAR_BIT - aShift)); +} + +} /* namespace mozilla */ + +#endif /* mozilla_MathAlgorithms_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Maybe.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Maybe.h new file mode 100644 index 0000000000..4ba88f6771 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Maybe.h @@ -0,0 +1,182 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A class for lazily constructing an object without sticking it on the heap. */ + +#ifndef mozilla_Maybe_h +#define mozilla_Maybe_h + +#include "mozilla/Alignment.h" +#include "mozilla/Assertions.h" + +// For placement new +#include + +namespace mozilla { + +/* + * Small utility for lazily constructing objects without using dynamic storage. + * When a Maybe is constructed, it is |empty()|, i.e., no value of T has + * been constructed and no T destructor will be called when the Maybe is + * destroyed. Upon calling |construct|, a T object will be constructed with the + * given arguments and that object will be destroyed when the owning Maybe + * is destroyed. + * + * N.B. GCC seems to miss some optimizations with Maybe and may generate extra + * branches/loads/stores. Use with caution on hot paths. + */ +template +class Maybe +{ + AlignedStorage2 storage; + bool constructed; + + T& asT() { return *storage.addr(); } + +public: + Maybe() { constructed = false; } + ~Maybe() { if (constructed) { asT().~T(); } } + + bool empty() const { return !constructed; } + + void construct() + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(); + constructed = true; + } + + template + void construct(const T1& aT1) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3, const T4& aT4) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3, aT4); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3, const T4& aT4, + const T5& aT5) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3, aT4, aT5); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3, const T4& aT4, + const T5& aT5, const T6& aT6) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3, aT4, aT5, aT6); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3, const T4& aT4, + const T5& aT5, const T6& aT6, const T7& aT7) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3, aT4, aT5, aT6, aT7); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3, const T4& aT4, + const T5& aT5, const T6& aT6, const T7& aT7, const T8& aT8) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3, aT4, aT5, aT6, aT7, aT8); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3, const T4& aT4, + const T5& aT5, const T6& aT6, const T7& aT7, const T8& aT8, + const T9& aT9) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3, aT4, aT5, aT6, aT7, aT8, aT9); + constructed = true; + } + + template + void construct(const T1& aT1, const T2& aT2, const T3& aT3, const T4& aT4, + const T5& aT5, const T6& aT6, const T7& aT7, const T8& aT8, + const T9& aT9, const T10& aT10) + { + MOZ_ASSERT(!constructed); + ::new (storage.addr()) T(aT1, aT2, aT3, aT4, aT5, aT6, aT7, aT8, aT9, aT10); + constructed = true; + } + + T* addr() + { + MOZ_ASSERT(constructed); + return &asT(); + } + + T& ref() + { + MOZ_ASSERT(constructed); + return asT(); + } + + const T& ref() const + { + MOZ_ASSERT(constructed); + return const_cast(this)->asT(); + } + + void destroy() + { + ref().~T(); + constructed = false; + } + + void destroyIfConstructed() + { + if (!empty()) { + destroy(); + } + } + +private: + Maybe(const Maybe& aOther) MOZ_DELETE; + const Maybe& operator=(const Maybe& aOther) MOZ_DELETE; +}; + +} // namespace mozilla + +#endif /* mozilla_Maybe_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MaybeOneOf.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MaybeOneOf.h new file mode 100644 index 0000000000..1c58f88253 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MaybeOneOf.h @@ -0,0 +1,144 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_MaybeOneOf_h +#define mozilla_MaybeOneOf_h + +#include "mozilla/Alignment.h" +#include "mozilla/Assertions.h" +#include "mozilla/Move.h" +#include "mozilla/TemplateLib.h" + +#include // For placement new + +namespace mozilla { + +/* + * MaybeOneOf is like Maybe, but it supports constructing either T1 + * or T2. When a MaybeOneOf is constructed, it is |empty()|, i.e., + * no value has been constructed and no destructor will be called when the + * MaybeOneOf is destroyed. Upon calling |construct()| or + * |construct()|, a T1 or T2 object will be constructed with the given + * arguments and that object will be destroyed when the owning MaybeOneOf is + * destroyed. + */ +template +class MaybeOneOf +{ + AlignedStorage::value> storage; + + enum State { None, SomeT1, SomeT2 } state; + template struct Type2State {}; + + template + T& as() + { + MOZ_ASSERT(state == Type2State::result); + return *(T*)storage.addr(); + } + + template + const T& as() const + { + MOZ_ASSERT(state == Type2State::result); + return *(T*)storage.addr(); + } + +public: + MaybeOneOf() : state(None) {} + ~MaybeOneOf() { destroyIfConstructed(); } + + bool empty() const { return state == None; } + + template + bool constructed() const { return state == Type2State::result; } + + template + void construct() + { + MOZ_ASSERT(state == None); + state = Type2State::result; + ::new (storage.addr()) T(); + } + + template + void construct(U&& aU) + { + MOZ_ASSERT(state == None); + state = Type2State::result; + ::new (storage.addr()) T(Move(aU)); + } + + template + void construct(const U1& aU1) + { + MOZ_ASSERT(state == None); + state = Type2State::result; + ::new (storage.addr()) T(aU1); + } + + template + void construct(const U1& aU1, const U2& aU2) + { + MOZ_ASSERT(state == None); + state = Type2State::result; + ::new (storage.addr()) T(aU1, aU2); + } + + template + T& ref() + { + return as(); + } + + template + const T& ref() const + { + return as(); + } + + void destroy() + { + MOZ_ASSERT(state == SomeT1 || state == SomeT2); + if (state == SomeT1) { + as().~T1(); + } else if (state == SomeT2) { + as().~T2(); + } + state = None; + } + + void destroyIfConstructed() + { + if (!empty()) { + destroy(); + } + } + +private: + MaybeOneOf(const MaybeOneOf& aOther) MOZ_DELETE; + const MaybeOneOf& operator=(const MaybeOneOf& aOther) MOZ_DELETE; +}; + +template +template +struct MaybeOneOf::Type2State +{ + typedef MaybeOneOf Enclosing; + static const typename Enclosing::State result = Enclosing::SomeT1; +}; + +template +template +struct MaybeOneOf::Type2State +{ + typedef MaybeOneOf Enclosing; + static const typename Enclosing::State result = Enclosing::SomeT2; +}; + +} // namespace mozilla + +#endif /* mozilla_MaybeOneOf_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryChecking.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryChecking.h new file mode 100644 index 0000000000..0642d758c0 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryChecking.h @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Provides a common interface to the ASan (AddressSanitizer) and Valgrind + * functions used to mark memory in certain ways. In detail, the following + * three macros are provided: + * + * MOZ_MAKE_MEM_NOACCESS - Mark memory as unsafe to access (e.g. freed) + * MOZ_MAKE_MEM_UNDEFINED - Mark memory as accessible, with content undefined + * MOZ_MAKE_MEM_DEFINED - Mark memory as accessible, with content defined + * + * With Valgrind in use, these directly map to the three respective Valgrind + * macros. With ASan in use, the NOACCESS macro maps to poisoning the memory, + * while the UNDEFINED/DEFINED macros unpoison memory. + * + * With no memory checker available, all macros expand to the empty statement. + */ + +#ifndef mozilla_MemoryChecking_h +#define mozilla_MemoryChecking_h + +#if defined(MOZ_VALGRIND) +#include "valgrind/memcheck.h" +#endif + +#if defined(MOZ_ASAN) || defined(MOZ_VALGRIND) +#define MOZ_HAVE_MEM_CHECKS 1 +#endif + +#if defined(MOZ_ASAN) +#include + +#include "mozilla/Types.h" + +extern "C" { +/* These definitions are usually provided through the + * sanitizer/asan_interface.h header installed by ASan. + */ +void MOZ_EXPORT __asan_poison_memory_region(void const volatile *addr, size_t size); +void MOZ_EXPORT __asan_unpoison_memory_region(void const volatile *addr, size_t size); + +#define MOZ_MAKE_MEM_NOACCESS(addr, size) \ + __asan_poison_memory_region((addr), (size)) + +#define MOZ_MAKE_MEM_UNDEFINED(addr, size) \ + __asan_unpoison_memory_region((addr), (size)) + +#define MOZ_MAKE_MEM_DEFINED(addr, size) \ + __asan_unpoison_memory_region((addr), (size)) +} +#elif defined(MOZ_VALGRIND) +#define MOZ_MAKE_MEM_NOACCESS(addr, size) \ + VALGRIND_MAKE_MEM_NOACCESS((addr), (size)) + +#define MOZ_MAKE_MEM_UNDEFINED(addr, size) \ + VALGRIND_MAKE_MEM_UNDEFINED((addr), (size)) + +#define MOZ_MAKE_MEM_DEFINED(addr, size) \ + VALGRIND_MAKE_MEM_DEFINED((addr), (size)) +#else + +#define MOZ_MAKE_MEM_NOACCESS(addr, size) do {} while (0) +#define MOZ_MAKE_MEM_UNDEFINED(addr, size) do {} while (0) +#define MOZ_MAKE_MEM_DEFINED(addr, size) do {} while (0) + +#endif + +#endif /* mozilla_MemoryChecking_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryReporting.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryReporting.h new file mode 100644 index 0000000000..d2340ecf09 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/MemoryReporting.h @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Memory reporting infrastructure. */ + +#ifndef mozilla_MemoryReporting_h +#define mozilla_MemoryReporting_h + +#include + +#ifdef __cplusplus + +namespace mozilla { + +/* + * This is for functions that are like malloc_usable_size. Such functions are + * used for measuring the size of data structures. + */ +typedef size_t (*MallocSizeOf)(const void* p); + +} /* namespace mozilla */ + +#endif /* __cplusplus */ + +typedef size_t (*MozMallocSizeOf)(const void* p); + +#endif /* mozilla_MemoryReporting_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Move.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Move.h new file mode 100644 index 0000000000..08ae86fa57 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Move.h @@ -0,0 +1,250 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* C++11-style, but C++98-usable, "move references" implementation. */ + +#ifndef mozilla_Move_h +#define mozilla_Move_h + +#include "mozilla/TypeTraits.h" + +namespace mozilla { + +/* + * "Move" References + * + * Some types can be copied much more efficiently if we know the original's + * value need not be preserved --- that is, if we are doing a "move", not a + * "copy". For example, if we have: + * + * Vector u; + * Vector v(u); + * + * the constructor for v must apply a copy constructor to each element of u --- + * taking time linear in the length of u. However, if we know we will not need u + * any more once v has been initialized, then we could initialize v very + * efficiently simply by stealing u's dynamically allocated buffer and giving it + * to v --- a constant-time operation, regardless of the size of u. + * + * Moves often appear in container implementations. For example, when we append + * to a vector, we may need to resize its buffer. This entails moving each of + * its extant elements from the old, smaller buffer to the new, larger buffer. + * But once the elements have been migrated, we're just going to throw away the + * old buffer; we don't care if they still have their values. So if the vector's + * element type can implement "move" more efficiently than "copy", the vector + * resizing should by all means use a "move" operation. Hash tables should also + * use moves when resizing their internal array as entries are added and + * removed. + * + * The details of the optimization, and whether it's worth applying, vary + * from one type to the next: copying an 'int' is as cheap as moving it, so + * there's no benefit in distinguishing 'int' moves from copies. And while + * some constructor calls for complex types are moves, many really have to + * be copies, and can't be optimized this way. So we need: + * + * 1) a way for a type (like Vector) to announce that it can be moved more + * efficiently than it can be copied, and provide an implementation of that + * move operation; and + * + * 2) a way for a particular invocation of a copy constructor to say that it's + * really a move, not a copy, and that the value of the original isn't + * important afterwards (although it must still be safe to destroy). + * + * If a constructor has a single argument of type 'T&&' (an 'rvalue reference + * to T'), that indicates that it is a 'move constructor'. That's 1). It should + * move, not copy, its argument into the object being constructed. It may leave + * the original in any safely-destructible state. + * + * If a constructor's argument is an rvalue, as in 'C(f(x))' or 'C(x + y)', as + * opposed to an lvalue, as in 'C(x)', then overload resolution will prefer the + * move constructor, if there is one. The 'mozilla::Move' function, defined in + * this file, is an identity function you can use in a constructor invocation to + * make any argument into an rvalue, like this: C(Move(x)). That's 2). (You + * could use any function that works, but 'Move' indicates your intention + * clearly.) + * + * Where we might define a copy constructor for a class C like this: + * + * C(const C& rhs) { ... copy rhs to this ... } + * + * we would declare a move constructor like this: + * + * C(C&& rhs) { .. move rhs to this ... } + * + * And where we might perform a copy like this: + * + * C c2(c1); + * + * we would perform a move like this: + * + * C c2(Move(c1)); + * + * Note that 'T&&' implicitly converts to 'T&'. So you can pass a 'T&&' to an + * ordinary copy constructor for a type that doesn't support a special move + * constructor, and you'll just get a copy. This means that templates can use + * Move whenever they know they won't use the original value any more, even if + * they're not sure whether the type at hand has a specialized move constructor. + * If it doesn't, the 'T&&' will just convert to a 'T&', and the ordinary copy + * constructor will apply. + * + * A class with a move constructor can also provide a move assignment operator. + * A generic definition would run this's destructor, and then apply the move + * constructor to *this's memory. A typical definition: + * + * C& operator=(C&& rhs) { + * MOZ_ASSERT(&rhs != this, "self-moves are prohibited"); + * this->~C(); + * new(this) C(Move(rhs)); + * return *this; + * } + * + * With that in place, one can write move assignments like this: + * + * c2 = Move(c1); + * + * This destroys c2, moves c1's value to c2, and leaves c1 in an undefined but + * destructible state. + * + * As we say, a move must leave the original in a "destructible" state. The + * original's destructor will still be called, so if a move doesn't + * actually steal all its resources, that's fine. We require only that the + * move destination must take on the original's value; and that destructing + * the original must not break the move destination. + * + * (Opinions differ on whether move assignment operators should deal with move + * assignment of an object onto itself. It seems wise to either handle that + * case, or assert that it does not occur.) + * + * Forwarding: + * + * Sometimes we want copy construction or assignment if we're passed an ordinary + * value, but move construction if passed an rvalue reference. For example, if + * our constructor takes two arguments and either could usefully be a move, it + * seems silly to write out all four combinations: + * + * C::C(X& x, Y& y) : x(x), y(y) { } + * C::C(X& x, Y&& y) : x(x), y(Move(y)) { } + * C::C(X&& x, Y& y) : x(Move(x)), y(y) { } + * C::C(X&& x, Y&& y) : x(Move(x)), y(Move(y)) { } + * + * To avoid this, C++11 has tweaks to make it possible to write what you mean. + * The four constructor overloads above can be written as one constructor + * template like so[0]: + * + * template + * C::C(XArg&& x, YArg&& y) : x(Forward(x)), y(Forward(y)) { } + * + * ("'Don't Repeat Yourself'? What's that?") + * + * This takes advantage of two new rules in C++11: + * + * - First, when a function template takes an argument that is an rvalue + * reference to a template argument (like 'XArg&& x' and 'YArg&& y' above), + * then when the argument is applied to an lvalue, the template argument + * resolves to 'T&'; and when it is applied to an rvalue, the template + * argument resolves to 'T&&'. Thus, in a call to C::C like: + * + * X foo(int); + * Y yy; + * + * C(foo(5), yy) + * + * XArg would resolve to 'X&&', and YArg would resolve to 'Y&'. + * + * - Second, Whereas C++ used to forbid references to references, C++11 defines + * 'collapsing rules': 'T& &', 'T&& &', and 'T& &&' (that is, any combination + * involving an lvalue reference) now collapse to simply 'T&'; and 'T&& &&' + * collapses to 'T&&'. + * + * Thus, in the call above, 'XArg&&' is 'X&& &&', collapsing to 'X&&'; and + * 'YArg&&' is 'Y& &&', which collapses to 'Y &'. Because the arguments are + * declared as rvalue references to template arguments, the rvalue-ness + * "shines through" where present. + * + * Then, the 'Forward' function --- you must invoke 'Forward' with its type + * argument --- returns an lvalue reference or an rvalue reference to its + * argument, depending on what T is. In our unified constructor definition, that + * means that we'll invoke either the copy or move constructors for x and y, + * depending on what we gave C's constructor. In our call, we'll move 'foo()' + * into 'x', but copy 'yy' into 'y'. + * + * This header file defines Move and Forward in the mozilla namespace. It's up + * to individual containers to annotate moves as such, by calling Move; and it's + * up to individual types to define move constructors and assignment operators + * when valuable. + * + * (C++11 says that the header file should define 'std::move' and + * 'std::forward', which are just like our 'Move' and 'Forward'; but those + * definitions aren't available in that header on all our platforms, so we + * define them ourselves here.) + * + * 0. This pattern is known as "perfect forwarding". Interestingly, it is not + * actually perfect, and it can't forward all possible argument expressions! + * There are two issues: one that's a C++11 issue, and one that's a legacy + * compiler issue. + * + * The C++11 issue is that you can't form a reference to a bit-field. As a + * workaround, assign the bit-field to a local variable and use that: + * + * // C is as above + * struct S { int x : 1; } s; + * C(s.x, 0); // BAD: s.x is a reference to a bit-field, can't form those + * int tmp = s.x; + * C(tmp, 0); // OK: tmp not a bit-field + * + * The legacy issue is that when we don't have true nullptr and must emulate + * it (gcc 4.4/4.5), forwarding |nullptr| results in an |int| or |long| + * forwarded reference. But such a reference, even if its value is a null + * pointer constant expression, is not itself a null pointer constant + * expression. This causes -Werror=conversion-null errors and pointer-to- + * integer comparison errors. Until we always have true nullptr, users of + * forwarding methods must not pass |nullptr| to them. + */ + +/** + * Identical to std::Move(); this is necessary until our stlport supports + * std::move(). + */ +template +inline typename RemoveReference::Type&& +Move(T&& aX) +{ + return static_cast::Type&&>(aX); +} + +/** + * These two overloads are identical to std::forward(); they are necessary until + * our stlport supports std::forward(). + */ +template +inline T&& +Forward(typename RemoveReference::Type& aX) +{ + return static_cast(aX); +} + +template +inline T&& +Forward(typename RemoveReference::Type&& aX) +{ + static_assert(!IsLvalueReference::value, + "misuse of Forward detected! try the other overload"); + return static_cast(aX); +} + +/** Swap |aX| and |aY| using move-construction if possible. */ +template +inline void +Swap(T& aX, T& aY) +{ + T tmp(Move(aX)); + aX = Move(aY); + aY = Move(tmp); +} + +} // namespace mozilla + +#endif /* mozilla_Move_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NullPtr.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NullPtr.h new file mode 100644 index 0000000000..5963613c4b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NullPtr.h @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Implements a workaround for compilers which do not support the C++11 nullptr + * constant. + */ + +#ifndef mozilla_NullPtr_h +#define mozilla_NullPtr_h + +#if defined(__clang__) +# if !__has_extension(cxx_nullptr) +# error "clang version natively supporting nullptr is required." +# endif +# define MOZ_HAVE_CXX11_NULLPTR +#elif defined(__GNUC__) +# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L +# include "mozilla/Compiler.h" +# if MOZ_GCC_VERSION_AT_LEAST(4, 6, 0) +# define MOZ_HAVE_CXX11_NULLPTR +# endif +# endif +#elif defined(_MSC_VER) + // The minimum supported MSVC (10, _MSC_VER 1600) supports nullptr. +# define MOZ_HAVE_CXX11_NULLPTR +#endif + +namespace mozilla { + +/** + * IsNullPointer::value is true iff T is the type of C++11's nullptr. If + * nullptr is emulated, IsNullPointer::value is false for all T. + * + * IsNullPointer is useful to give an argument the true decltype(nullptr) type. + * decltype(nullptr) doesn't work when nullptr is emulated. The simplest + * workaround is to use template overloading and SFINAE to expose an overload + * only if an argument's type is decltype(nullptr). Some examples (that assume + * namespace mozilla has been opened, for simplicity): + * + * // foo(T*), foo(stuff that converts to T*), and foo(decltype(nullptr)) + * // (only invoked if nullptr is true nullptr, otherwise foo(T*) is invoked) + * // but nothing else + * void foo(T*) { } + * template + * void foo(N, + * typename EnableIf::value, int>::Type dummy = 0) + * { } + * + * // foo(T*) *exactly* and foo(decltype(nullptr)), nothing else + * void foo(T*) { } + * template + * void foo(U, + * typename EnableIf::value, int>::Type dummy = 0) + * MOZ_DELETE; + * + * The exact details of how set up the SFINAE bits vary on a case-by-case basis. + * If you need help with this (and unless you've internalized way more sadmaking + * nullptr-emulation knowledge than you should have, you do), feel free to poke + * the person with blame on this comment with questions. :-) + * + * Ideally this would be in TypeTraits.h, but C++11 omitted std::is_null_pointer + * (fixed in C++1y), so in the interests of easing a switch to , + * this trait lives elsewhere. + */ +template +struct IsNullPointer { static const bool value = false; }; + +} // namespace mozilla + +/** + * mozilla::NullptrT is a type that's sort of like decltype(nullptr). But it + * can't be identical, because emulated nullptr doesn't have a distinct type. + * Only with gcc 4.4/4.5, emulated nullptr is __null, and decltype(__null) is + * int or long. But passing __null to an int/long parameter triggers + * -Werror=conversion-null errors with gcc 4.5, or (depending on subsequent use + * inside the overloaded function) can trigger pointer-to-integer comparison + * compiler errors. So fairly often, actually, NullptrT is *not* what you want. + * + * Instead, often you should use template-based overloading in concert with + * SFINAE to add a nullptr overload -- see the comments by IsNullPointer. + * + * So when *should* you use NullptrT? Thus far, the only truly good use seems + * to be as an argument type for operator overloads (because C++ doesn't allow + * operator= to have more than one argument, operator== to have more than two, + * &c.). But even in such cases, it really only works if there are no other + * overloads of the operator that accept a pointer type. If you want both T* + * and nullptr_t overloads, you'll have to wait til we drop gcc 4.4/4.5 support. + * (Currently b2g is the only impediment to this.) + */ +#ifdef MOZ_HAVE_CXX11_NULLPTR +// decltype does the right thing for actual nullptr. +namespace mozilla { +typedef decltype(nullptr) NullptrT; +template<> +struct IsNullPointer { static const bool value = true; }; +} +# undef MOZ_HAVE_CXX11_NULLPTR +#elif MOZ_IS_GCC +# define nullptr __null +// void* sweeps up more than just nullptr, but compilers supporting true +// nullptr are the majority now, so they should detect mistakes. If you're +// feeling paranoid, check/assert that your NullptrT equals nullptr. +namespace mozilla { typedef void* NullptrT; } +#else +# error "No compiler support for nullptr or its emulation." +#endif + +#endif /* mozilla_NullPtr_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NumericLimits.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NumericLimits.h new file mode 100644 index 0000000000..730fcb410b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/NumericLimits.h @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Compatibility with std::numeric_limits. */ + +#ifndef mozilla_NumericLimits_h +#define mozilla_NumericLimits_h + +#include "mozilla/Char16.h" + +#include +#include + +namespace mozilla { + +/** + * The NumericLimits class provides a compatibility layer with + * std::numeric_limits for char16_t, otherwise it is exactly the same as + * std::numeric_limits. Code which does not need std::numeric_limits + * should avoid using NumericLimits. + */ +template +class NumericLimits : public std::numeric_limits +{ +}; + +#ifdef MOZ_CHAR16_IS_NOT_WCHAR +template<> +class NumericLimits : public std::numeric_limits +{ + // char16_t and uint16_t numeric limits should be exactly the same. +}; +#endif + +} // namespace mozilla + +#endif /* mozilla_NumericLimits_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Pair.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Pair.h new file mode 100644 index 0000000000..e9e8a76938 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Pair.h @@ -0,0 +1,184 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A class holding a pair of objects that tries to conserve storage space. */ + +#ifndef mozilla_Pair_h +#define mozilla_Pair_h + +#include "mozilla/Attributes.h" +#include "mozilla/Move.h" +#include "mozilla/TypeTraits.h" + +namespace mozilla { + +namespace detail { + +enum StorageType { AsBase, AsMember }; + +// Optimize storage using the Empty Base Optimization -- that empty base classes +// don't take up space -- to optimize size when one or the other class is +// stateless and can be used as a base class. +// +// The extra conditions on storage for B are necessary so that PairHelper won't +// ambiguously inherit from either A or B, such that one or the other base class +// would be inaccessible. +template::value ? detail::AsBase : detail::AsMember, + detail::StorageType = + IsEmpty::value && !IsBaseOf::value && !IsBaseOf::value + ? detail::AsBase + : detail::AsMember> +struct PairHelper; + +template +struct PairHelper +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : mFirstA(Forward(aA)), + mSecondB(Forward(aB)) + {} + + A& first() { return mFirstA; } + const A& first() const { return mFirstA; } + B& second() { return mSecondB; } + const B& second() const { return mSecondB; } + + void swap(PairHelper& aOther) + { + Swap(mFirstA, aOther.mFirstA); + Swap(mSecondB, aOther.mSecondB); + } + +private: + A mFirstA; + B mSecondB; +}; + +template +struct PairHelper : private B +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : B(Forward(aB)), + mFirstA(Forward(aA)) + {} + + A& first() { return mFirstA; } + const A& first() const { return mFirstA; } + B& second() { return *this; } + const B& second() const { return *this; } + + void swap(PairHelper& aOther) + { + Swap(mFirstA, aOther.mFirstA); + Swap(static_cast(*this), static_cast(aOther)); + } + +private: + A mFirstA; +}; + +template +struct PairHelper : private A +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : A(Forward(aA)), + mSecondB(Forward(aB)) + {} + + A& first() { return *this; } + const A& first() const { return *this; } + B& second() { return mSecondB; } + const B& second() const { return mSecondB; } + + void swap(PairHelper& aOther) + { + Swap(static_cast(*this), static_cast(aOther)); + Swap(mSecondB, aOther.mSecondB); + } + +private: + B mSecondB; +}; + +template +struct PairHelper : private A, private B +{ +protected: + template + PairHelper(AArg&& aA, BArg&& aB) + : A(Forward(aA)), + B(Forward(aB)) + {} + + A& first() { return static_cast(*this); } + const A& first() const { return static_cast(*this); } + B& second() { return static_cast(*this); } + const B& second() const { return static_cast(*this); } + + void swap(PairHelper& aOther) + { + Swap(static_cast(*this), static_cast(aOther)); + Swap(static_cast(*this), static_cast(aOther)); + } +}; + +} // namespace detail + +/** + * Pair is the logical concatenation of an instance of A with an instance B. + * Space is conserved when possible. Neither A nor B may be a final class. + * + * It's typically clearer to have individual A and B member fields. Except if + * you want the space-conserving qualities of Pair, you're probably better off + * not using this! + * + * No guarantees are provided about the memory layout of A and B, the order of + * initialization or destruction of A and B, and so on. (This is approximately + * required to optimize space usage.) The first/second names are merely + * conceptual! + */ +template +struct Pair + : private detail::PairHelper +{ + typedef typename detail::PairHelper Base; + +public: + template + Pair(AArg&& aA, BArg&& aB) + : Base(Forward(aA), Forward(aB)) + {} + + /** The A instance. */ + using Base::first; + /** The B instance. */ + using Base::second; + + /** Swap this pair with another pair. */ + void swap(Pair& aOther) { Base::swap(aOther); } + +private: + Pair(const Pair&) MOZ_DELETE; +}; + +template +void +Swap(Pair& aX, Pair& aY) +{ + aX.swap(aY); +} + +} // namespace mozilla + +#endif /* mozilla_Pair_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/PodOperations.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/PodOperations.h new file mode 100644 index 0000000000..843e1311d3 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/PodOperations.h @@ -0,0 +1,195 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Operations for zeroing POD types, arrays, and so on. + * + * These operations are preferable to memset, memcmp, and the like because they + * don't require remembering to multiply by sizeof(T), array lengths, and so on + * everywhere. + */ + +#ifndef mozilla_PodOperations_h +#define mozilla_PodOperations_h + +#include "mozilla/Array.h" +#include "mozilla/ArrayUtils.h" +#include "mozilla/Attributes.h" + +#include +#include + +namespace mozilla { + +/** Set the contents of |aT| to 0. */ +template +static MOZ_ALWAYS_INLINE void +PodZero(T* aT) +{ + memset(aT, 0, sizeof(T)); +} + +/** Set the contents of |aNElem| elements starting at |aT| to 0. */ +template +static MOZ_ALWAYS_INLINE void +PodZero(T* aT, size_t aNElem) +{ + /* + * This function is often called with 'aNElem' small; we use an inline loop + * instead of calling 'memset' with a non-constant length. The compiler + * should inline the memset call with constant size, though. + */ + for (T* end = aT + aNElem; aT < end; aT++) { + memset(aT, 0, sizeof(T)); + } +} + +/* + * Arrays implicitly convert to pointers to their first element, which is + * dangerous when combined with the above PodZero definitions. Adding an + * overload for arrays is ambiguous, so we need another identifier. The + * ambiguous overload is left to catch mistaken uses of PodZero; if you get a + * compile error involving PodZero and array types, use PodArrayZero instead. + */ +template +static void PodZero(T (&aT)[N]) MOZ_DELETE; +template +static void PodZero(T (&aT)[N], size_t aNElem) MOZ_DELETE; + +/** Set the contents of the array |aT| to zero. */ +template +static MOZ_ALWAYS_INLINE void +PodArrayZero(T (&aT)[N]) +{ + memset(aT, 0, N * sizeof(T)); +} + +template +static MOZ_ALWAYS_INLINE void +PodArrayZero(Array& aArr) +{ + memset(&aArr[0], 0, N * sizeof(T)); +} + +/** + * Assign |*aSrc| to |*aDst|. The locations must not be the same and must not + * overlap. + */ +template +static MOZ_ALWAYS_INLINE void +PodAssign(T* aDst, const T* aSrc) +{ + MOZ_ASSERT(aDst != aSrc); + MOZ_ASSERT_IF(aSrc < aDst, + PointerRangeSize(aSrc, static_cast(aDst)) >= 1); + MOZ_ASSERT_IF(aDst < aSrc, + PointerRangeSize(static_cast(aDst), aSrc) >= 1); + memcpy(reinterpret_cast(aDst), reinterpret_cast(aSrc), + sizeof(T)); +} + +/** + * Copy |aNElem| T elements from |aSrc| to |aDst|. The two memory ranges must + * not overlap! + */ +template +static MOZ_ALWAYS_INLINE void +PodCopy(T* aDst, const T* aSrc, size_t aNElem) +{ + MOZ_ASSERT(aDst != aSrc); + MOZ_ASSERT_IF(aSrc < aDst, + PointerRangeSize(aSrc, static_cast(aDst)) >= aNElem); + MOZ_ASSERT_IF(aDst < aSrc, + PointerRangeSize(static_cast(aDst), aSrc) >= aNElem); + + if (aNElem < 128) { + /* + * Avoid using operator= in this loop, as it may have been + * intentionally deleted by the POD type. + */ + for (const T* srcend = aSrc + aNElem; aSrc < srcend; aSrc++, aDst++) { + PodAssign(aDst, aSrc); + } + } else { + memcpy(aDst, aSrc, aNElem * sizeof(T)); + } +} + +template +static MOZ_ALWAYS_INLINE void +PodCopy(volatile T* aDst, const volatile T* aSrc, size_t aNElem) +{ + MOZ_ASSERT(aDst != aSrc); + MOZ_ASSERT_IF(aSrc < aDst, + PointerRangeSize(aSrc, static_cast(aDst)) >= aNElem); + MOZ_ASSERT_IF(aDst < aSrc, + PointerRangeSize(static_cast(aDst), aSrc) >= aNElem); + + /* + * Volatile |aDst| requires extra work, because it's undefined behavior to + * modify volatile objects using the mem* functions. Just write out the + * loops manually, using operator= rather than memcpy for the same reason, + * and let the compiler optimize to the extent it can. + */ + for (const volatile T* srcend = aSrc + aNElem; + aSrc < srcend; + aSrc++, aDst++) { + *aDst = *aSrc; + } +} + +/* + * Copy the contents of the array |aSrc| into the array |aDst|, both of size N. + * The arrays must not overlap! + */ +template +static MOZ_ALWAYS_INLINE void +PodArrayCopy(T (&aDst)[N], const T (&aSrc)[N]) +{ + PodCopy(aDst, aSrc, N); +} + +/** + * Copy the memory for |aNElem| T elements from |aSrc| to |aDst|. If the two + * memory ranges overlap, then the effect is as if the |aNElem| elements are + * first copied from |aSrc| to a temporary array, and then from the temporary + * array to |aDst|. + */ +template +static MOZ_ALWAYS_INLINE void +PodMove(T* aDst, const T* aSrc, size_t aNElem) +{ + MOZ_ASSERT(aNElem <= SIZE_MAX / sizeof(T), + "trying to move an impossible number of elements"); + memmove(aDst, aSrc, aNElem * sizeof(T)); +} + +/** + * Determine whether the |len| elements at |one| are memory-identical to the + * |len| elements at |two|. + */ +template +static MOZ_ALWAYS_INLINE bool +PodEqual(const T* one, const T* two, size_t len) +{ + if (len < 128) { + const T* p1end = one + len; + const T* p1 = one; + const T* p2 = two; + for (; p1 < p1end; p1++, p2++) { + if (*p1 != *p2) { + return false; + } + } + return true; + } + + return !memcmp(one, two, len * sizeof(T)); +} + +} // namespace mozilla + +#endif /* mozilla_PodOperations_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Poison.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Poison.h new file mode 100644 index 0000000000..75e0f081cd --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Poison.h @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * A poison value that can be used to fill a memory space with + * an address that leads to a safe crash when dereferenced. + */ + +#ifndef mozilla_Poison_h +#define mozilla_Poison_h + +#include "mozilla/Assertions.h" +#include "mozilla/Types.h" + +#include + +MOZ_BEGIN_EXTERN_C + +extern MFBT_DATA uintptr_t gMozillaPoisonValue; + +/** + * @return the poison value. + */ +inline uintptr_t mozPoisonValue() +{ + return gMozillaPoisonValue; +} + +/** + * Overwrite the memory block of aSize bytes at aPtr with the poison value. + * aPtr MUST be aligned at a sizeof(uintptr_t) boundary. + * Only an even number of sizeof(uintptr_t) bytes are overwritten, the last + * few bytes (if any) is not overwritten. + */ +inline void mozWritePoison(void* aPtr, size_t aSize) +{ + const uintptr_t POISON = mozPoisonValue(); + char* p = (char*)aPtr; + char* limit = p + aSize; + MOZ_ASSERT((uintptr_t)aPtr % sizeof(uintptr_t) == 0, "bad alignment"); + MOZ_ASSERT(aSize >= sizeof(uintptr_t), "poisoning this object has no effect"); + for (; p < limit; p += sizeof(uintptr_t)) { + *((uintptr_t*)p) = POISON; + } +} + +/** + * Initialize the poison value. + * This should only be called once. + */ +extern MFBT_API void mozPoisonValueInit(); + +/* Values annotated by CrashReporter */ +extern MFBT_DATA uintptr_t gMozillaPoisonBase; +extern MFBT_DATA uintptr_t gMozillaPoisonSize; + +MOZ_END_EXTERN_C + +#endif /* mozilla_Poison_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Range.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Range.h new file mode 100644 index 0000000000..814a2821ad --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Range.h @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_Range_h +#define mozilla_Range_h + +#include "mozilla/NullPtr.h" +#include "mozilla/RangedPtr.h" + +#include + +namespace mozilla { + +// Range is a tuple containing a pointer and a length. +template +class Range +{ + const RangedPtr mStart; + const RangedPtr mEnd; + + typedef void (Range::* ConvertibleToBool)(); + void nonNull() {} + +public: + Range() : mStart(nullptr, 0), mEnd(nullptr, 0) {} + Range(T* aPtr, size_t aLength) + : mStart(aPtr, aPtr, aPtr + aLength), + mEnd(aPtr + aLength, aPtr, aPtr + aLength) + {} + + RangedPtr start() const { return mStart; } + RangedPtr end() const { return mEnd; } + size_t length() const { return mEnd - mStart; } + + T& operator[](size_t aOffset) const { return mStart[aOffset]; } + + operator ConvertibleToBool() const { return mStart ? &Range::nonNull : 0; } +}; + +} // namespace mozilla + +#endif /* mozilla_Range_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RangedPtr.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RangedPtr.h new file mode 100644 index 0000000000..4d94035b90 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RangedPtr.h @@ -0,0 +1,284 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Implements a smart pointer asserted to remain within a range specified at + * construction. + */ + +#ifndef mozilla_RangedPtr_h +#define mozilla_RangedPtr_h + +#include "mozilla/ArrayUtils.h" +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/NullPtr.h" + +#include + +namespace mozilla { + +/* + * RangedPtr is a smart pointer restricted to an address range specified at + * creation. The pointer (and any smart pointers derived from it) must remain + * within the range [start, end] (inclusive of end to facilitate use as + * sentinels). Dereferencing or indexing into the pointer (or pointers derived + * from it) must remain within the range [start, end). All the standard pointer + * operators are defined on it; in debug builds these operations assert that the + * range specified at construction is respected. + * + * In theory passing a smart pointer instance as an argument can be slightly + * slower than passing a T* (due to ABI requirements for passing structs versus + * passing pointers), if the method being called isn't inlined. If you are in + * extremely performance-critical code, you may want to be careful using this + * smart pointer as an argument type. + * + * RangedPtr intentionally does not implicitly convert to T*. Use get() to + * explicitly convert to T*. Keep in mind that the raw pointer of course won't + * implement bounds checking in debug builds. + */ +template +class RangedPtr +{ + T* mPtr; + +#ifdef DEBUG + T* const mRangeStart; + T* const mRangeEnd; +#endif + + typedef void (RangedPtr::* ConvertibleToBool)(); + void nonNull() {} + + void checkSanity() + { + MOZ_ASSERT(mRangeStart <= mPtr); + MOZ_ASSERT(mPtr <= mRangeEnd); + } + + /* Creates a new pointer for |aPtr|, restricted to this pointer's range. */ + RangedPtr create(T* aPtr) const + { +#ifdef DEBUG + return RangedPtr(aPtr, mRangeStart, mRangeEnd); +#else + return RangedPtr(aPtr, nullptr, size_t(0)); +#endif + } + + uintptr_t asUintptr() const { return reinterpret_cast(mPtr); } + +public: + RangedPtr(T* aPtr, T* aStart, T* aEnd) + : mPtr(aPtr) +#ifdef DEBUG + , mRangeStart(aStart), mRangeEnd(aEnd) +#endif + { + MOZ_ASSERT(mRangeStart <= mRangeEnd); + checkSanity(); + } + RangedPtr(T* aPtr, T* aStart, size_t aLength) + : mPtr(aPtr) +#ifdef DEBUG + , mRangeStart(aStart), mRangeEnd(aStart + aLength) +#endif + { + MOZ_ASSERT(aLength <= size_t(-1) / sizeof(T)); + MOZ_ASSERT(reinterpret_cast(mRangeStart) + aLength * sizeof(T) >= + reinterpret_cast(mRangeStart)); + checkSanity(); + } + + /* Equivalent to RangedPtr(aPtr, aPtr, aLength). */ + RangedPtr(T* aPtr, size_t aLength) + : mPtr(aPtr) +#ifdef DEBUG + , mRangeStart(aPtr), mRangeEnd(aPtr + aLength) +#endif + { + MOZ_ASSERT(aLength <= size_t(-1) / sizeof(T)); + MOZ_ASSERT(reinterpret_cast(mRangeStart) + aLength * sizeof(T) >= + reinterpret_cast(mRangeStart)); + checkSanity(); + } + + /* Equivalent to RangedPtr(aArr, aArr, N). */ + template + RangedPtr(T (&aArr)[N]) + : mPtr(aArr) +#ifdef DEBUG + , mRangeStart(aArr), mRangeEnd(aArr + N) +#endif + { + checkSanity(); + } + + T* get() const { return mPtr; } + + operator ConvertibleToBool() const { return mPtr ? &RangedPtr::nonNull : 0; } + + /* + * You can only assign one RangedPtr into another if the two pointers have + * the same valid range: + * + * char arr1[] = "hi"; + * char arr2[] = "bye"; + * RangedPtr p1(arr1, 2); + * p1 = RangedPtr(arr1 + 1, arr1, arr1 + 2); // works + * p1 = RangedPtr(arr2, 3); // asserts + */ + RangedPtr& operator=(const RangedPtr& aOther) + { + MOZ_ASSERT(mRangeStart == aOther.mRangeStart); + MOZ_ASSERT(mRangeEnd == aOther.mRangeEnd); + mPtr = aOther.mPtr; + checkSanity(); + return *this; + } + + RangedPtr operator+(size_t aInc) + { + MOZ_ASSERT(aInc <= size_t(-1) / sizeof(T)); + MOZ_ASSERT(asUintptr() + aInc * sizeof(T) >= asUintptr()); + return create(mPtr + aInc); + } + + RangedPtr operator-(size_t aDec) + { + MOZ_ASSERT(aDec <= size_t(-1) / sizeof(T)); + MOZ_ASSERT(asUintptr() - aDec * sizeof(T) <= asUintptr()); + return create(mPtr - aDec); + } + + /* + * You can assign a raw pointer into a RangedPtr if the raw pointer is + * within the range specified at creation. + */ + template + RangedPtr& operator=(U* aPtr) + { + *this = create(aPtr); + return *this; + } + + template + RangedPtr& operator=(const RangedPtr& aPtr) + { + MOZ_ASSERT(mRangeStart <= aPtr.mPtr); + MOZ_ASSERT(aPtr.mPtr <= mRangeEnd); + mPtr = aPtr.mPtr; + checkSanity(); + return *this; + } + + RangedPtr& operator++() + { + return (*this += 1); + } + + RangedPtr operator++(int) + { + RangedPtr rcp = *this; + ++*this; + return rcp; + } + + RangedPtr& operator--() + { + return (*this -= 1); + } + + RangedPtr operator--(int) + { + RangedPtr rcp = *this; + --*this; + return rcp; + } + + RangedPtr& operator+=(size_t aInc) + { + *this = *this + aInc; + return *this; + } + + RangedPtr& operator-=(size_t aDec) + { + *this = *this - aDec; + return *this; + } + + T& operator[](int aIndex) const + { + MOZ_ASSERT(size_t(aIndex > 0 ? aIndex : -aIndex) <= size_t(-1) / sizeof(T)); + return *create(mPtr + aIndex); + } + + T& operator*() const + { + MOZ_ASSERT(mPtr >= mRangeStart); + MOZ_ASSERT(mPtr < mRangeEnd); + return *mPtr; + } + + template + bool operator==(const RangedPtr& aOther) const + { + return mPtr == aOther.mPtr; + } + template + bool operator!=(const RangedPtr& aOther) const + { + return !(*this == aOther); + } + + template + bool operator==(const U* u) const + { + return mPtr == u; + } + template + bool operator!=(const U* u) const + { + return !(*this == u); + } + + template + bool operator<(const RangedPtr& aOther) const + { + return mPtr < aOther.mPtr; + } + template + bool operator<=(const RangedPtr& aOther) const + { + return mPtr <= aOther.mPtr; + } + + template + bool operator>(const RangedPtr& aOther) const + { + return mPtr > aOther.mPtr; + } + template + bool operator>=(const RangedPtr& aOther) const + { + return mPtr >= aOther.mPtr; + } + + size_t operator-(const RangedPtr& aOther) const + { + MOZ_ASSERT(mPtr >= aOther.mPtr); + return PointerRangeSize(aOther.mPtr, mPtr); + } + +private: + RangedPtr() MOZ_DELETE; + T* operator&() MOZ_DELETE; +}; + +} /* namespace mozilla */ + +#endif /* mozilla_RangedPtr_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ReentrancyGuard.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ReentrancyGuard.h new file mode 100644 index 0000000000..557c61015e --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ReentrancyGuard.h @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Small helper class for asserting uses of a class are non-reentrant. */ + +#ifndef mozilla_ReentrancyGuard_h +#define mozilla_ReentrancyGuard_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/GuardObjects.h" + +namespace mozilla { + +/* Useful for implementing containers that assert non-reentrancy */ +class ReentrancyGuard +{ + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +#ifdef DEBUG + bool& mEntered; +#endif + +public: + template +#ifdef DEBUG + ReentrancyGuard(T& aObj + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : mEntered(aObj.mEntered) +#else + ReentrancyGuard(T& + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) +#endif + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; +#ifdef DEBUG + MOZ_ASSERT(!mEntered); + mEntered = true; +#endif + } + ~ReentrancyGuard() + { +#ifdef DEBUG + mEntered = false; +#endif + } + +private: + ReentrancyGuard(const ReentrancyGuard&) MOZ_DELETE; + void operator=(const ReentrancyGuard&) MOZ_DELETE; +}; + +} // namespace mozilla + +#endif /* mozilla_ReentrancyGuard_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefCountType.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefCountType.h new file mode 100644 index 0000000000..e95a22a0ca --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefCountType.h @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_RefCountType_h +#define mozilla_RefCountType_h + +#include + +/** + * MozRefCountType is Mozilla's reference count type. + * + * We use the same type to represent the refcount of RefCounted objects + * as well, in order to be able to use the leak detection facilities + * that are implemented by XPCOM. + * + * Note that this type is not in the mozilla namespace so that it is + * usable for both C and C++ code. + */ +typedef uintptr_t MozRefCountType; + +/* + * This is the return type for AddRef() and Release() in nsISupports. + * IUnknown of COM returns an unsigned long from equivalent functions. + * + * The following ifdef exists to maintain binary compatibility with + * IUnknown, the base interface in Microsoft COM. + */ +#ifdef XP_WIN +typedef unsigned long MozExternalRefCountType; +#else +typedef uint32_t MozExternalRefCountType; +#endif + +#endif diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefPtr.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefPtr.h new file mode 100644 index 0000000000..4901067b4c --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RefPtr.h @@ -0,0 +1,552 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Helpers for defining and using refcounted objects. */ + +#ifndef mozilla_RefPtr_h +#define mozilla_RefPtr_h + +#include "mozilla/Assertions.h" +#include "mozilla/Atomics.h" +#include "mozilla/Attributes.h" +#include "mozilla/NullPtr.h" +#include "mozilla/RefCountType.h" +#include "mozilla/TypeTraits.h" +#if defined(MOZILLA_INTERNAL_API) +#include "nsXPCOM.h" +#endif + +#if defined(MOZILLA_INTERNAL_API) && \ + (defined(DEBUG) || defined(FORCE_BUILD_REFCNT_LOGGING)) +#define MOZ_REFCOUNTED_LEAK_CHECKING +#endif + +namespace mozilla { + +template class RefCounted; +template class RefPtr; +template class TemporaryRef; +template class OutParamRef; +template OutParamRef byRef(RefPtr&); + +/** + * RefCounted is a sort of a "mixin" for a class T. RefCounted + * manages, well, refcounting for T, and because RefCounted is + * parameterized on T, RefCounted can call T's destructor directly. + * This means T doesn't need to have a virtual dtor and so doesn't + * need a vtable. + * + * RefCounted is created with refcount == 0. Newly-allocated + * RefCounted must immediately be assigned to a RefPtr to make the + * refcount > 0. It's an error to allocate and free a bare + * RefCounted, i.e. outside of the RefPtr machinery. Attempts to + * do so will abort DEBUG builds. + * + * Live RefCounted have refcount > 0. The lifetime (refcounts) of + * live RefCounted are controlled by RefPtr and + * RefPtr. Upon a transition from refcounted==1 + * to 0, the RefCounted "dies" and is destroyed. The "destroyed" + * state is represented in DEBUG builds by refcount==0xffffdead. This + * state distinguishes use-before-ref (refcount==0) from + * use-after-destroy (refcount==0xffffdead). + * + * Note that when deriving from RefCounted or AtomicRefCounted, you + * should add MOZ_DECLARE_REFCOUNTED_TYPENAME(ClassName) to the public + * section of your class, where ClassName is the name of your class. + */ +namespace detail { +#ifdef DEBUG +const MozRefCountType DEAD = 0xffffdead; +#endif + +// When building code that gets compiled into Gecko, try to use the +// trace-refcount leak logging facilities. +#ifdef MOZ_REFCOUNTED_LEAK_CHECKING +class RefCountLogger +{ +public: + static void logAddRef(const void* aPointer, MozRefCountType aRefCount, + const char* aTypeName, uint32_t aInstanceSize) + { + MOZ_ASSERT(aRefCount != DEAD); + NS_LogAddRef(const_cast(aPointer), aRefCount, aTypeName, + aInstanceSize); + } + + static void logRelease(const void* aPointer, MozRefCountType aRefCount, + const char* aTypeName) + { + MOZ_ASSERT(aRefCount != DEAD); + NS_LogRelease(const_cast(aPointer), aRefCount, aTypeName); + } +}; +#endif + +// This is used WeakPtr.h as well as this file. +enum RefCountAtomicity +{ + AtomicRefCount, + NonAtomicRefCount +}; + +template +class RefCounted +{ + friend class RefPtr; + +protected: + RefCounted() : mRefCnt(0) {} + ~RefCounted() { MOZ_ASSERT(mRefCnt == detail::DEAD); } + +public: + // Compatibility with nsRefPtr. + void AddRef() const + { + // Note: this method must be thread safe for AtomicRefCounted. + MOZ_ASSERT(int32_t(mRefCnt) >= 0); +#ifndef MOZ_REFCOUNTED_LEAK_CHECKING + ++mRefCnt; +#else + const char* type = static_cast(this)->typeName(); + uint32_t size = static_cast(this)->typeSize(); + const void* ptr = static_cast(this); + MozRefCountType cnt = ++mRefCnt; + detail::RefCountLogger::logAddRef(ptr, cnt, type, size); +#endif + } + + void Release() const + { + // Note: this method must be thread safe for AtomicRefCounted. + MOZ_ASSERT(int32_t(mRefCnt) > 0); +#ifndef MOZ_REFCOUNTED_LEAK_CHECKING + MozRefCountType cnt = --mRefCnt; +#else + const char* type = static_cast(this)->typeName(); + const void* ptr = static_cast(this); + MozRefCountType cnt = --mRefCnt; + // Note: it's not safe to touch |this| after decrementing the refcount, + // except for below. + detail::RefCountLogger::logRelease(ptr, cnt, type); +#endif + if (0 == cnt) { + // Because we have atomically decremented the refcount above, only + // one thread can get a 0 count here, so as long as we can assume that + // everything else in the system is accessing this object through + // RefPtrs, it's safe to access |this| here. +#ifdef DEBUG + mRefCnt = detail::DEAD; +#endif + delete static_cast(this); + } + } + + // Compatibility with wtf::RefPtr. + void ref() { AddRef(); } + void deref() { Release(); } + MozRefCountType refCount() const { return mRefCnt; } + bool hasOneRef() const + { + MOZ_ASSERT(mRefCnt > 0); + return mRefCnt == 1; + } + +private: + mutable typename Conditional, + MozRefCountType>::Type mRefCnt; +}; + +#ifdef MOZ_REFCOUNTED_LEAK_CHECKING +#define MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(T) \ + virtual const char* typeName() const { return #T; } \ + virtual size_t typeSize() const { return sizeof(*this); } +#else +#define MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(T) +#endif + +// Note that this macro is expanded unconditionally because it declares only +// two small inline functions which will hopefully get eliminated by the linker +// in non-leak-checking builds. +#define MOZ_DECLARE_REFCOUNTED_TYPENAME(T) \ + const char* typeName() const { return #T; } \ + size_t typeSize() const { return sizeof(*this); } + +} // namespace detail + +template +class RefCounted : public detail::RefCounted +{ +public: + ~RefCounted() + { + static_assert(IsBaseOf::value, + "T must derive from RefCounted"); + } +}; + +namespace external { + +/** + * AtomicRefCounted is like RefCounted, with an atomically updated + * reference counter. + * + * NOTE: Please do not use this class, use NS_INLINE_DECL_THREADSAFE_REFCOUNTING + * instead. + */ +template +class AtomicRefCounted : + public mozilla::detail::RefCounted +{ +public: + ~AtomicRefCounted() + { + static_assert(IsBaseOf::value, + "T must derive from AtomicRefCounted"); + } +}; + +} // namespace external + +/** + * RefPtr points to a refcounted thing that has AddRef and Release + * methods to increase/decrease the refcount, respectively. After a + * RefPtr is assigned a T*, the T* can be used through the RefPtr + * as if it were a T*. + * + * A RefPtr can forget its underlying T*, which results in the T* + * being wrapped in a temporary object until the T* is either + * re-adopted from or released by the temporary. + */ +template +class RefPtr +{ + // To allow them to use unref() + friend class TemporaryRef; + friend class OutParamRef; + + struct DontRef {}; + +public: + RefPtr() : mPtr(0) {} + RefPtr(const RefPtr& aOther) : mPtr(ref(aOther.mPtr)) {} + MOZ_IMPLICIT RefPtr(const TemporaryRef& aOther) : mPtr(aOther.drop()) {} + MOZ_IMPLICIT RefPtr(T* aVal) : mPtr(ref(aVal)) {} + + template + RefPtr(const RefPtr& aOther) : mPtr(ref(aOther.get())) {} + + ~RefPtr() { unref(mPtr); } + + RefPtr& operator=(const RefPtr& aOther) + { + assign(ref(aOther.mPtr)); + return *this; + } + RefPtr& operator=(const TemporaryRef& aOther) + { + assign(aOther.drop()); + return *this; + } + RefPtr& operator=(T* aVal) + { + assign(ref(aVal)); + return *this; + } + + template + RefPtr& operator=(const RefPtr& aOther) + { + assign(ref(aOther.get())); + return *this; + } + + TemporaryRef forget() + { + T* tmp = mPtr; + mPtr = nullptr; + return TemporaryRef(tmp, DontRef()); + } + + T* get() const { return mPtr; } + operator T*() const { return mPtr; } + T* operator->() const { return mPtr; } + T& operator*() const { return *mPtr; } + template + operator TemporaryRef() { return TemporaryRef(mPtr); } + +private: + void assign(T* aVal) + { + unref(mPtr); + mPtr = aVal; + } + + T* mPtr; + + static MOZ_ALWAYS_INLINE T* ref(T* aVal) + { + if (aVal) { + aVal->AddRef(); + } + return aVal; + } + + static MOZ_ALWAYS_INLINE void unref(T* aVal) + { + if (aVal) { + aVal->Release(); + } + } +}; + +/** + * TemporaryRef represents an object that holds a temporary + * reference to a T. TemporaryRef objects can't be manually ref'd or + * unref'd (being temporaries, not lvalues), so can only relinquish + * references to other objects, or unref on destruction. + */ +template +class TemporaryRef +{ + // To allow it to construct TemporaryRef from a bare T* + friend class RefPtr; + + typedef typename RefPtr::DontRef DontRef; + +public: + MOZ_IMPLICIT TemporaryRef(T* aVal) : mPtr(RefPtr::ref(aVal)) {} + TemporaryRef(const TemporaryRef& aOther) : mPtr(aOther.drop()) {} + + template + TemporaryRef(const TemporaryRef& aOther) : mPtr(aOther.drop()) {} + + ~TemporaryRef() { RefPtr::unref(mPtr); } + + T* drop() const + { + T* tmp = mPtr; + mPtr = nullptr; + return tmp; + } + +private: + TemporaryRef(T* aVal, const DontRef&) : mPtr(aVal) {} + + mutable T* mPtr; + + TemporaryRef() MOZ_DELETE; + void operator=(const TemporaryRef&) MOZ_DELETE; +}; + +/** + * OutParamRef is a wrapper that tracks a refcounted pointer passed as + * an outparam argument to a function. OutParamRef implements COM T** + * outparam semantics: this requires the callee to AddRef() the T* + * returned through the T** outparam on behalf of the caller. This + * means the caller (through OutParamRef) must Release() the old + * object contained in the tracked RefPtr. It's OK if the callee + * returns the same T* passed to it through the T** outparam, as long + * as the callee obeys the COM discipline. + * + * Prefer returning TemporaryRef from functions over creating T** + * outparams and passing OutParamRef to T**. Prefer RefPtr* + * outparams over T** outparams. + */ +template +class OutParamRef +{ + friend OutParamRef byRef(RefPtr&); + +public: + ~OutParamRef() + { + RefPtr::unref(mRefPtr.mPtr); + mRefPtr.mPtr = mTmp; + } + + operator T**() { return &mTmp; } + +private: + explicit OutParamRef(RefPtr& p) : mRefPtr(p), mTmp(p.get()) {} + + RefPtr& mRefPtr; + T* mTmp; + + OutParamRef() MOZ_DELETE; + OutParamRef& operator=(const OutParamRef&) MOZ_DELETE; +}; + +/** + * byRef cooperates with OutParamRef to implement COM outparam semantics. + */ +template +OutParamRef +byRef(RefPtr& aPtr) +{ + return OutParamRef(aPtr); +} + +} // namespace mozilla + +#if 0 + +// Command line that builds these tests +// +// cp RefPtr.h test.cc && g++ -g -Wall -pedantic -DDEBUG -o test test.cc && ./test + +using namespace mozilla; + +struct Foo : public RefCounted +{ + MOZ_DECLARE_REFCOUNTED_TYPENAME(Foo) + Foo() : mDead(false) {} + ~Foo() + { + MOZ_ASSERT(!mDead); + mDead = true; + sNumDestroyed++; + } + + bool mDead; + static int sNumDestroyed; +}; +int Foo::sNumDestroyed; + +struct Bar : public Foo {}; + +TemporaryRef +NewFoo() +{ + return RefPtr(new Foo()); +} + +TemporaryRef +NewBar() +{ + return new Bar(); +} + +void +GetNewFoo(Foo** f) +{ + *f = new Bar(); + // Kids, don't try this at home + (*f)->AddRef(); +} + +void +GetPassedFoo(Foo** f) +{ + // Kids, don't try this at home + (*f)->AddRef(); +} + +void +GetNewFoo(RefPtr* f) +{ + *f = new Bar(); +} + +void +GetPassedFoo(RefPtr* f) +{} + +TemporaryRef +GetNullFoo() +{ + return 0; +} + +int +main(int argc, char** argv) +{ + // This should blow up +// Foo* f = new Foo(); delete f; + + MOZ_ASSERT(0 == Foo::sNumDestroyed); + { + RefPtr f = new Foo(); + MOZ_ASSERT(f->refCount() == 1); + } + MOZ_ASSERT(1 == Foo::sNumDestroyed); + + { + RefPtr f1 = NewFoo(); + RefPtr f2(NewFoo()); + MOZ_ASSERT(1 == Foo::sNumDestroyed); + } + MOZ_ASSERT(3 == Foo::sNumDestroyed); + + { + RefPtr b = NewBar(); + MOZ_ASSERT(3 == Foo::sNumDestroyed); + } + MOZ_ASSERT(4 == Foo::sNumDestroyed); + + { + RefPtr f1; + { + f1 = new Foo(); + RefPtr f2(f1); + RefPtr f3 = f2; + MOZ_ASSERT(4 == Foo::sNumDestroyed); + } + MOZ_ASSERT(4 == Foo::sNumDestroyed); + } + MOZ_ASSERT(5 == Foo::sNumDestroyed); + + { + RefPtr f = new Foo(); + f.forget(); + MOZ_ASSERT(6 == Foo::sNumDestroyed); + } + + { + RefPtr f = new Foo(); + GetNewFoo(byRef(f)); + MOZ_ASSERT(7 == Foo::sNumDestroyed); + } + MOZ_ASSERT(8 == Foo::sNumDestroyed); + + { + RefPtr f = new Foo(); + GetPassedFoo(byRef(f)); + MOZ_ASSERT(8 == Foo::sNumDestroyed); + } + MOZ_ASSERT(9 == Foo::sNumDestroyed); + + { + RefPtr f = new Foo(); + GetNewFoo(&f); + MOZ_ASSERT(10 == Foo::sNumDestroyed); + } + MOZ_ASSERT(11 == Foo::sNumDestroyed); + + { + RefPtr f = new Foo(); + GetPassedFoo(&f); + MOZ_ASSERT(11 == Foo::sNumDestroyed); + } + MOZ_ASSERT(12 == Foo::sNumDestroyed); + + { + RefPtr f1 = new Bar(); + } + MOZ_ASSERT(13 == Foo::sNumDestroyed); + + { + RefPtr f = GetNullFoo(); + MOZ_ASSERT(13 == Foo::sNumDestroyed); + } + MOZ_ASSERT(13 == Foo::sNumDestroyed); + + return 0; +} + +#endif + +#endif /* mozilla_RefPtr_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RollingMean.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RollingMean.h new file mode 100644 index 0000000000..5add14c879 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/RollingMean.h @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A set abstraction for enumeration values. */ + +#ifndef mozilla_RollingMean_h_ +#define mozilla_RollingMean_h_ + +#include "mozilla/Assertions.h" +#include "mozilla/TypeTraits.h" +#include "mozilla/Vector.h" + +#include + +namespace mozilla { + +/** + * RollingMean calculates a rolling mean of the values it is given. It + * accumulates the total as values are added and removed. The second type + * argument S specifies the type of the total. This may need to be a bigger + * type in order to maintain that the sum of all values in the average doesn't + * exceed the maximum input value. + * + * WARNING: Float types are not supported due to rounding errors. + */ +template +class RollingMean +{ +private: + size_t mInsertIndex; + size_t mMaxValues; + Vector mValues; + S mTotal; + +public: + static_assert(!IsFloatingPoint::value, + "floating-point types are unsupported due to rounding " + "errors"); + + explicit RollingMean(size_t aMaxValues) + : mInsertIndex(0), + mMaxValues(aMaxValues), + mTotal(0) + { + MOZ_ASSERT(aMaxValues > 0); + } + + RollingMean& operator=(RollingMean&& aOther) + { + MOZ_ASSERT(this != &aOther, "self-assignment is forbidden"); + this->~RollingMean(); + new(this) RollingMean(aOther.mMaxValues); + mInsertIndex = aOther.mInsertIndex; + mTotal = aOther.mTotal; + mValues.swap(aOther.mValues); + return *this; + } + + /** + * Insert a value into the rolling mean. + */ + bool insert(T aValue) + { + MOZ_ASSERT(mValues.length() <= mMaxValues); + + if (mValues.length() == mMaxValues) { + mTotal = mTotal - mValues[mInsertIndex] + aValue; + mValues[mInsertIndex] = aValue; + } else { + if (!mValues.append(aValue)) { + return false; + } + mTotal = mTotal + aValue; + } + + mInsertIndex = (mInsertIndex + 1) % mMaxValues; + return true; + } + + /** + * Calculate the rolling mean. + */ + T mean() + { + MOZ_ASSERT(!empty()); + return T(mTotal / mValues.length()); + } + + bool empty() + { + return mValues.empty(); + } + + /** + * Remove all values from the rolling mean. + */ + void clear() + { + mValues.clear(); + mInsertIndex = 0; + mTotal = T(0); + } + + size_t maxValues() + { + return mMaxValues; + } +}; + +} // namespace mozilla + +#endif // mozilla_RollingMean_h_ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SHA1.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SHA1.h new file mode 100644 index 0000000000..ddccaa67e7 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SHA1.h @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Simple class for computing SHA1. */ + +#ifndef mozilla_SHA1_h +#define mozilla_SHA1_h + +#include "mozilla/Types.h" + +#include +#include + +namespace mozilla { + +/** + * This class computes the SHA1 hash of a byte sequence, or of the concatenation + * of multiple sequences. For example, computing the SHA1 of two sequences of + * bytes could be done as follows: + * + * void SHA1(const uint8_t* buf1, uint32_t size1, + * const uint8_t* buf2, uint32_t size2, + * SHA1Sum::Hash& hash) + * { + * SHA1Sum s; + * s.update(buf1, size1); + * s.update(buf2, size2); + * s.finish(hash); + * } + * + * The finish method may only be called once and cannot be followed by calls + * to update. + */ +class SHA1Sum +{ + union + { + uint32_t mW[16]; /* input buffer */ + uint8_t mB[64]; + } mU; + uint64_t mSize; /* count of hashed bytes. */ + unsigned mH[22]; /* 5 state variables, 16 tmp values, 1 extra */ + bool mDone; + +public: + MFBT_API SHA1Sum(); + + static const size_t kHashSize = 20; + typedef uint8_t Hash[kHashSize]; + + /* Add len bytes of dataIn to the data sequence being hashed. */ + MFBT_API void update(const void* aData, uint32_t aLength); + + /* Compute the final hash of all data into hashOut. */ + MFBT_API void finish(SHA1Sum::Hash& aHashOut); +}; + +} /* namespace mozilla */ + +#endif /* mozilla_SHA1_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Scoped.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Scoped.h new file mode 100644 index 0000000000..3f854d6375 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Scoped.h @@ -0,0 +1,308 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A number of structures to simplify scope-based RAII management. */ + +#ifndef mozilla_Scoped_h +#define mozilla_Scoped_h + +/* + * Resource Acquisition Is Initialization is a programming idiom used + * to write robust code that is able to deallocate resources properly, + * even in presence of execution errors or exceptions that need to be + * propagated. The Scoped* classes defined in this header perform the + * deallocation of the resource they hold once program execution + * reaches the end of the scope for which they have been defined. + * + * This header provides the following RAII classes: + * + * - |ScopedFreePtr| - a container for a pointer, that automatically calls + * |free()| at the end of the scope; + * - |ScopedDeletePtr| - a container for a pointer, that automatically calls + * |delete| at the end of the scope; + * - |ScopedDeleteArray| - a container for a pointer to an array, that + * automatically calls |delete[]| at the end of the scope. + * + * The general scenario for each of the RAII classes is the following: + * + * ScopedClass foo(create_value()); + * // ... In this scope, |foo| is defined. Use |foo.get()| or |foo.rwget()| + * to access the value. + * // ... In case of |return| or |throw|, |foo| is deallocated automatically. + * // ... If |foo| needs to be returned or stored, use |foo.forget()| + * + * Note that the RAII classes defined in this header do _not_ perform any form + * of reference-counting or garbage-collection. These classes have exactly two + * behaviors: + * + * - if |forget()| has not been called, the resource is always deallocated at + * the end of the scope; + * - if |forget()| has been called, any control on the resource is unbound + * and the resource is not deallocated by the class. + * + * Extension: + * + * In addition, this header provides class |Scoped| and macros |SCOPED_TEMPLATE| + * and |MOZ_TYPE_SPECIFIC_SCOPED_POINTER_TEMPLATE| to simplify the definition + * of RAII classes for other scenarios. These macros have been used to + * automatically close file descriptors/file handles when reaching the end of + * the scope, graphics contexts, etc. + */ + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/GuardObjects.h" +#include "mozilla/Move.h" +#include "mozilla/NullPtr.h" + +namespace mozilla { + +/* + * Scoped is a helper to create RAII wrappers + * Type argument |Traits| is expected to have the following structure: + * + * struct Traits + * { + * // Define the type of the value stored in the wrapper + * typedef value_type type; + * // Returns the value corresponding to the uninitialized or freed state + * const static type empty(); + * // Release resources corresponding to the wrapped value + * // This function is responsible for not releasing an |empty| value + * const static void release(type); + * } + */ +template +class Scoped +{ +public: + typedef typename Traits::type Resource; + + explicit Scoped(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM) + : mValue(Traits::empty()) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + explicit Scoped(const Resource& aValue + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : mValue(aValue) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } + + /* Move constructor. */ + explicit Scoped(Scoped&& aOther + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) + : mValue(Move(aOther.mValue)) + { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + aOther.mValue = Traits::empty(); + } + + ~Scoped() { Traits::release(mValue); } + + // Constant getter + operator const Resource&() const { return mValue; } + const Resource& operator->() const { return mValue; } + const Resource& get() const { return mValue; } + // Non-constant getter. + Resource& rwget() { return mValue; } + + /* + * Forget the resource. + * + * Once |forget| has been called, the |Scoped| is neutralized, i.e. it will + * have no effect at destruction (unless it is reset to another resource by + * |operator=|). + * + * @return The original resource. + */ + Resource forget() + { + Resource tmp = mValue; + mValue = Traits::empty(); + return tmp; + } + + /* + * Perform immediate clean-up of this |Scoped|. + * + * If this |Scoped| is currently empty, this method has no effect. + */ + void dispose() + { + Traits::release(mValue); + mValue = Traits::empty(); + } + + bool operator==(const Resource& aOther) const { return mValue == aOther; } + + /* + * Replace the resource with another resource. + * + * Calling |operator=| has the side-effect of triggering clean-up. If you do + * not want to trigger clean-up, you should first invoke |forget|. + * + * @return this + */ + Scoped& operator=(const Resource& aOther) { return reset(aOther); } + + Scoped& reset(const Resource& aOther) + { + Traits::release(mValue); + mValue = aOther; + return *this; + } + + /* Move assignment operator. */ + Scoped& operator=(Scoped&& aRhs) + { + MOZ_ASSERT(&aRhs != this, "self-move-assignment not allowed"); + this->~Scoped(); + new(this) Scoped(Move(aRhs)); + return *this; + } + +private: + explicit Scoped(const Scoped& aValue) MOZ_DELETE; + Scoped& operator=(const Scoped& aValue) MOZ_DELETE; + +private: + Resource mValue; + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +/* + * SCOPED_TEMPLATE defines a templated class derived from Scoped + * This allows to implement templates such as ScopedFreePtr. + * + * @param name The name of the class to define. + * @param Traits A struct implementing clean-up. See the implementations + * for more details. + */ +#define SCOPED_TEMPLATE(name, Traits) \ +template \ +struct name : public mozilla::Scoped > \ +{ \ + typedef mozilla::Scoped > Super; \ + typedef typename Super::Resource Resource; \ + name& operator=(Resource aRhs) \ + { \ + Super::operator=(aRhs); \ + return *this; \ + } \ + name& operator=(name&& aRhs) \ + { \ + Super::operator=(Move(aRhs)); \ + return *this; \ + } \ + explicit name(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM) \ + : Super(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_TO_PARENT) \ + {} \ + explicit name(Resource aRhs \ + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) \ + : Super(aRhs \ + MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT) \ + {} \ + explicit name(name&& aRhs \ + MOZ_GUARD_OBJECT_NOTIFIER_PARAM) \ + : Super(Move(aRhs) \ + MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT) \ + {} \ +private: \ + explicit name(name&) MOZ_DELETE; \ + name& operator=(name&) MOZ_DELETE; \ +}; + +/* + * ScopedFreePtr is a RAII wrapper for pointers that need to be free()d. + * + * struct S { ... }; + * ScopedFreePtr foo = malloc(sizeof(S)); + * ScopedFreePtr bar = strdup(str); + */ +template +struct ScopedFreePtrTraits +{ + typedef T* type; + static T* empty() { return nullptr; } + static void release(T* aPtr) { free(aPtr); } +}; +SCOPED_TEMPLATE(ScopedFreePtr, ScopedFreePtrTraits) + +/* + * ScopedDeletePtr is a RAII wrapper for pointers that need to be deleted. + * + * struct S { ... }; + * ScopedDeletePtr foo = new S(); + */ +template +struct ScopedDeletePtrTraits : public ScopedFreePtrTraits +{ + static void release(T* aPtr) { delete aPtr; } +}; +SCOPED_TEMPLATE(ScopedDeletePtr, ScopedDeletePtrTraits) + +/* + * ScopedDeleteArray is a RAII wrapper for pointers that need to be delete[]ed. + * + * struct S { ... }; + * ScopedDeleteArray foo = new S[42]; + */ +template +struct ScopedDeleteArrayTraits : public ScopedFreePtrTraits +{ + static void release(T* aPtr) { delete [] aPtr; } +}; +SCOPED_TEMPLATE(ScopedDeleteArray, ScopedDeleteArrayTraits) + +/* + * MOZ_TYPE_SPECIFIC_SCOPED_POINTER_TEMPLATE makes it easy to create scoped + * pointers for types with custom deleters; just overload + * TypeSpecificDelete(T*) in the same namespace as T to call the deleter for + * type T. + * + * @param name The name of the class to define. + * @param Type A struct implementing clean-up. See the implementations + * for more details. + * *param Deleter The function that is used to delete/destroy/free a + * non-null value of Type*. + * + * Example: + * + * MOZ_TYPE_SPECIFIC_SCOPED_POINTER_TEMPLATE(ScopedPRFileDesc, PRFileDesc, \ + * PR_Close) + * ... + * { + * ScopedPRFileDesc file(PR_OpenFile(...)); + * ... + * } // file is closed with PR_Close here + */ +#define MOZ_TYPE_SPECIFIC_SCOPED_POINTER_TEMPLATE(name, Type, Deleter) \ +template <> inline void TypeSpecificDelete(Type* aValue) { Deleter(aValue); } \ +typedef ::mozilla::TypeSpecificScopedPointer name; + +template void TypeSpecificDelete(T* aValue); + +template +struct TypeSpecificScopedPointerTraits +{ + typedef T* type; + static type empty() { return nullptr; } + static void release(type aValue) + { + if (aValue) { + TypeSpecificDelete(aValue); + } + } +}; + +SCOPED_TEMPLATE(TypeSpecificScopedPointer, TypeSpecificScopedPointerTraits) + +} /* namespace mozilla */ + +#endif /* mozilla_Scoped_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SplayTree.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SplayTree.h new file mode 100644 index 0000000000..a6d692266f --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/SplayTree.h @@ -0,0 +1,296 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * A sorted tree with optimal access times, where recently-accessed elements + * are faster to access again. + */ + +#ifndef mozilla_SplayTree_h +#define mozilla_SplayTree_h + +#include "mozilla/Assertions.h" +#include "mozilla/NullPtr.h" + +namespace mozilla { + +template +class SplayTree; + +template +class SplayTreeNode +{ +public: + template + friend class SplayTree; + + SplayTreeNode() + : mLeft(nullptr) + , mRight(nullptr) + , mParent(nullptr) + {} + +private: + T* mLeft; + T* mRight; + T* mParent; +}; + + +/** + * Class which represents a splay tree. + * Splay trees are balanced binary search trees for which search, insert and + * remove are all amortized O(log n), but where accessing a node makes it + * faster to access that node in the future. + * + * T indicates the type of tree elements, Comparator must have a static + * compare(const T&, const T&) method ordering the elements. The compare + * method must be free from side effects. + */ +template +class SplayTree +{ + T* mRoot; + +public: + SplayTree() + : mRoot(nullptr) + {} + + bool empty() const + { + return !mRoot; + } + + T* find(const T& aValue) + { + if (empty()) { + return nullptr; + } + + T* last = lookup(aValue); + splay(last); + checkCoherency(mRoot, nullptr); + return Comparator::compare(aValue, *last) == 0 ? last : nullptr; + } + + bool insert(T* aValue) + { + MOZ_ASSERT(!find(*aValue), "Duplicate elements are not allowed."); + + if (!mRoot) { + mRoot = aValue; + return true; + } + T* last = lookup(*aValue); + int cmp = Comparator::compare(*aValue, *last); + + T** parentPointer = (cmp < 0) ? &last->mLeft : &last->mRight; + MOZ_ASSERT(!*parentPointer); + *parentPointer = aValue; + aValue->mParent = last; + + splay(aValue); + checkCoherency(mRoot, nullptr); + return true; + } + + T* remove(const T& aValue) + { + T* last = lookup(aValue); + MOZ_ASSERT(last, "This tree must contain the element being removed."); + MOZ_ASSERT(Comparator::compare(aValue, *last) == 0); + + // Splay the tree so that the item to remove is the root. + splay(last); + MOZ_ASSERT(last == mRoot); + + // Find another node which can be swapped in for the root: either the + // rightmost child of the root's left, or the leftmost child of the + // root's right. + T* swap; + T* swapChild; + if (mRoot->mLeft) { + swap = mRoot->mLeft; + while (swap->mRight) { + swap = swap->mRight; + } + swapChild = swap->mLeft; + } else if (mRoot->mRight) { + swap = mRoot->mRight; + while (swap->mLeft) { + swap = swap->mLeft; + } + swapChild = swap->mRight; + } else { + T* result = mRoot; + mRoot = nullptr; + return result; + } + + // The selected node has at most one child, in swapChild. Detach it + // from the subtree by replacing it with that child. + if (swap == swap->mParent->mLeft) { + swap->mParent->mLeft = swapChild; + } else { + swap->mParent->mRight = swapChild; + } + if (swapChild) { + swapChild->mParent = swap->mParent; + } + + // Make the selected node the new root. + mRoot = swap; + mRoot->mParent = nullptr; + mRoot->mLeft = last->mLeft; + mRoot->mRight = last->mRight; + if (mRoot->mLeft) { + mRoot->mLeft->mParent = mRoot; + } + if (mRoot->mRight) { + mRoot->mRight->mParent = mRoot; + } + + checkCoherency(mRoot, nullptr); + return last; + } + + T* removeMin() + { + MOZ_ASSERT(mRoot, "No min to remove!"); + + T* min = mRoot; + while (min->mLeft) { + min = min->mLeft; + } + return remove(*min); + } + +private: + /** + * Returns the node in this comparing equal to |aValue|, or a node just + * greater or just less than |aValue| if there is no such node. + */ + T* lookup(const T& aValue) + { + MOZ_ASSERT(!empty()); + + T* node = mRoot; + T* parent; + do { + parent = node; + int c = Comparator::compare(aValue, *node); + if (c == 0) { + return node; + } else if (c < 0) { + node = node->mLeft; + } else { + node = node->mRight; + } + } while (node); + return parent; + } + + /** + * Rotate the tree until |node| is at the root of the tree. Performing + * the rotations in this fashion preserves the amortized balancing of + * the tree. + */ + void splay(T* aNode) + { + MOZ_ASSERT(aNode); + + while (aNode != mRoot) { + T* parent = aNode->mParent; + if (parent == mRoot) { + // Zig rotation. + rotate(aNode); + MOZ_ASSERT(aNode == mRoot); + return; + } + T* grandparent = parent->mParent; + if ((parent->mLeft == aNode) == (grandparent->mLeft == parent)) { + // Zig-zig rotation. + rotate(parent); + rotate(aNode); + } else { + // Zig-zag rotation. + rotate(aNode); + rotate(aNode); + } + } + } + + void rotate(T* aNode) + { + // Rearrange nodes so that aNode becomes the parent of its current + // parent, while preserving the sortedness of the tree. + T* parent = aNode->mParent; + if (parent->mLeft == aNode) { + // x y + // y c ==> a x + // a b b c + parent->mLeft = aNode->mRight; + if (aNode->mRight) { + aNode->mRight->mParent = parent; + } + aNode->mRight = parent; + } else { + MOZ_ASSERT(parent->mRight == aNode); + // x y + // a y ==> x c + // b c a b + parent->mRight = aNode->mLeft; + if (aNode->mLeft) { + aNode->mLeft->mParent = parent; + } + aNode->mLeft = parent; + } + aNode->mParent = parent->mParent; + parent->mParent = aNode; + if (T* grandparent = aNode->mParent) { + if (grandparent->mLeft == parent) { + grandparent->mLeft = aNode; + } else { + grandparent->mRight = aNode; + } + } else { + mRoot = aNode; + } + } + + T* checkCoherency(T* aNode, T* aMinimum) + { +#ifdef DEBUG + MOZ_ASSERT_IF(mRoot, !mRoot->mParent); + if (!aNode) { + MOZ_ASSERT(!mRoot); + return nullptr; + } + MOZ_ASSERT_IF(!aNode->mParent, aNode == mRoot); + MOZ_ASSERT_IF(aMinimum, Comparator::compare(*aMinimum, *aNode) < 0); + if (aNode->mLeft) { + MOZ_ASSERT(aNode->mLeft->mParent == aNode); + T* leftMaximum = checkCoherency(aNode->mLeft, aMinimum); + MOZ_ASSERT(Comparator::compare(*leftMaximum, *aNode) < 0); + } + if (aNode->mRight) { + MOZ_ASSERT(aNode->mRight->mParent == aNode); + return checkCoherency(aNode->mRight, aNode); + } + return aNode; +#else + return nullptr; +#endif + } + + SplayTree(const SplayTree&) MOZ_DELETE; + void operator=(const SplayTree&) MOZ_DELETE; +}; + +} /* namespace mozilla */ + +#endif /* mozilla_SplayTree_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TaggedAnonymousMemory.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TaggedAnonymousMemory.h new file mode 100644 index 0000000000..d26b06dfb4 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TaggedAnonymousMemory.h @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Some Linux kernels -- specifically, newer versions of Android and +// some B2G devices -- have a feature for assigning names to ranges of +// anonymous memory (i.e., memory that doesn't have a "name" in the +// form of an underlying mapped file). These names are reported in +// /proc//smaps alongside system-level memory usage information +// such as Proportional Set Size (memory usage adjusted for sharing +// between processes), which allows reporting this information at a +// finer granularity than would otherwise be possible (e.g., +// separating malloc() heap from JS heap). +// +// Existing memory can be tagged with MozTagAnonymousMemory(); it will +// tag the range of complete pages containing the given interval, so +// the results may be inexact if the range isn't page-aligned. +// MozTaggedAnonymousMmap() can be used like mmap() with an extra +// parameter, and will tag the returned memory if the mapping was +// successful (and if it was in fact anonymous). +// +// NOTE: The pointer given as the "tag" argument MUST remain valid as +// long as the mapping exists. The referenced string is read when +// /proc//smaps or /proc//maps is read, not when the tag is +// established, so freeing it or changing its contents will have +// unexpected results. Using a static string is probably best. +// +// Also note that this header can be used by both C and C++ code. + +#ifndef mozilla_TaggedAnonymousMemory_h +#define mozilla_TaggedAnonymousMemory_h + +#ifndef XP_WIN + +#include +#include + +#include "mozilla/Types.h" + +#ifdef ANDROID + +#ifdef __cplusplus +extern "C" { +#endif + +MFBT_API void +MozTagAnonymousMemory(const void* aPtr, size_t aLength, const char* aTag); + +MFBT_API void* +MozTaggedAnonymousMmap(void* aAddr, size_t aLength, int aProt, int aFlags, + int aFd, off_t aOffset, const char* aTag); + +MFBT_API int +MozTaggedMemoryIsSupported(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#else // ANDROID + +static inline void +MozTagAnonymousMemory(const void* aPtr, size_t aLength, const char* aTag) +{ +} + +static inline void* +MozTaggedAnonymousMmap(void* aAddr, size_t aLength, int aProt, int aFlags, + int aFd, off_t aOffset, const char* aTag) +{ + return mmap(aAddr, aLength, aProt, aFlags, aFd, aOffset); +} + +static inline int +MozTaggedMemoryIsSupported(void) +{ + return 0; +} + +#endif // ANDROID + +#endif // !XP_WIN + +#endif // mozilla_TaggedAnonymousMemory_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TemplateLib.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TemplateLib.h new file mode 100644 index 0000000000..ea12c18b2b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TemplateLib.h @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Reusable template meta-functions on types and compile-time values. Meta- + * functions are placed inside the 'tl' namespace to avoid conflict with non- + * meta functions of the same name (e.g., mozilla::tl::FloorLog2 vs. + * mozilla::FloorLog2). + * + * When constexpr support becomes universal, we should probably use that instead + * of some of these templates, for simplicity. + */ + +#ifndef mozilla_TemplateLib_h +#define mozilla_TemplateLib_h + +#include +#include + +namespace mozilla { + +namespace tl { + +/** Compute min/max. */ +template +struct Min +{ + static const size_t value = I < J ? I : J; +}; +template +struct Max +{ + static const size_t value = I > J ? I : J; +}; + +/** Compute floor(log2(i)). */ +template +struct FloorLog2 +{ + static const size_t value = 1 + FloorLog2::value; +}; +template<> struct FloorLog2<0> { /* Error */ }; +template<> struct FloorLog2<1> { static const size_t value = 0; }; + +/** Compute ceiling(log2(i)). */ +template +struct CeilingLog2 +{ + static const size_t value = FloorLog2<2 * I - 1>::value; +}; + +/** Round up to the nearest power of 2. */ +template +struct RoundUpPow2 +{ + static const size_t value = size_t(1) << CeilingLog2::value; +}; +template<> +struct RoundUpPow2<0> +{ + static const size_t value = 1; +}; + +/** Compute the number of bits in the given unsigned type. */ +template +struct BitSize +{ + static const size_t value = sizeof(T) * CHAR_BIT; +}; + +/** + * Produce an N-bit mask, where N <= BitSize::value. Handle the + * language-undefined edge case when N = BitSize::value. + */ +template +struct NBitMask +{ + // Assert the precondition. On success this evaluates to 0. Otherwise it + // triggers divide-by-zero at compile time: a guaranteed compile error in + // C++11, and usually one in C++98. Add this value to |value| to assure + // its computation. + static const size_t checkPrecondition = + 0 / size_t(N < BitSize::value); + static const size_t value = (size_t(1) << N) - 1 + checkPrecondition; +}; +template<> +struct NBitMask::value> +{ + static const size_t value = size_t(-1); +}; + +/** + * For the unsigned integral type size_t, compute a mask M for N such that + * for all X, !(X & M) implies X * N will not overflow (w.r.t size_t) + */ +template +struct MulOverflowMask +{ + static const size_t value = + ~NBitMask::value - CeilingLog2::value>::value; +}; +template<> struct MulOverflowMask<0> { /* Error */ }; +template<> struct MulOverflowMask<1> { static const size_t value = 0; }; + +} // namespace tl + +} // namespace mozilla + +#endif /* mozilla_TemplateLib_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ThreadLocal.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ThreadLocal.h new file mode 100644 index 0000000000..28015de22e --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ThreadLocal.h @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Cross-platform lightweight thread local data wrappers. */ + +#ifndef mozilla_ThreadLocal_h +#define mozilla_ThreadLocal_h + +#if defined(XP_WIN) +// This file will get included in any file that wants to add a profiler mark. +// In order to not bring together we could include windef.h and +// winbase.h which are sufficient to get the prototypes for the Tls* functions. +// # include +// # include +// Unfortunately, even including these headers causes us to add a bunch of ugly +// stuff to our namespace e.g #define CreateEvent CreateEventW +extern "C" { +__declspec(dllimport) void* __stdcall TlsGetValue(unsigned long); +__declspec(dllimport) int __stdcall TlsSetValue(unsigned long, void*); +__declspec(dllimport) unsigned long __stdcall TlsAlloc(); +} +#else +# include +# include +#endif + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/NullPtr.h" + +namespace mozilla { + +// sig_safe_t denotes an atomic type which can be read or stored in a single +// instruction. This means that data of this type is safe to be manipulated +// from a signal handler, or other similar asynchronous execution contexts. +#if defined(XP_WIN) +typedef unsigned long sig_safe_t; +#else +typedef sig_atomic_t sig_safe_t; +#endif + +/* + * Thread Local Storage helpers. + * + * Usage: + * + * Only static-storage-duration (e.g. global variables, or static class members) + * objects of this class should be instantiated. This class relies on + * zero-initialization, which is implicit for static-storage-duration objects. + * It doesn't have a custom default constructor, to avoid static initializers. + * + * API usage: + * + * // Create a TLS item. + * // + * // Note that init() should be invoked exactly once, before any usage of set() + * // or get(). + * mozilla::ThreadLocal tlsKey; + * if (!tlsKey.init()) { + * // deal with the error + * } + * + * // Set the TLS value + * tlsKey.set(123); + * + * // Get the TLS value + * int value = tlsKey.get(); + */ +template +class ThreadLocal +{ +#if defined(XP_WIN) + typedef unsigned long key_t; +#else + typedef pthread_key_t key_t; +#endif + + union Helper + { + void* mPtr; + T mValue; + }; + +public: + MOZ_WARN_UNUSED_RESULT inline bool init(); + + inline T get() const; + + inline void set(const T aValue); + + bool initialized() const { return mInited; } + +private: + key_t mKey; + bool mInited; +}; + +template +inline bool +ThreadLocal::init() +{ + static_assert(sizeof(T) <= sizeof(void*), + "mozilla::ThreadLocal can't be used for types larger than " + "a pointer"); + MOZ_ASSERT(!initialized()); +#ifdef XP_WIN + mKey = TlsAlloc(); + mInited = mKey != 0xFFFFFFFFUL; // TLS_OUT_OF_INDEXES +#else + mInited = !pthread_key_create(&mKey, nullptr); +#endif + return mInited; +} + +template +inline T +ThreadLocal::get() const +{ + MOZ_ASSERT(initialized()); + Helper h; +#ifdef XP_WIN + h.mPtr = TlsGetValue(mKey); +#else + h.mPtr = pthread_getspecific(mKey); +#endif + return h.mValue; +} + +template +inline void +ThreadLocal::set(const T aValue) +{ + MOZ_ASSERT(initialized()); + Helper h; + h.mValue = aValue; +#ifdef XP_WIN + bool succeeded = TlsSetValue(mKey, h.mPtr); +#else + bool succeeded = !pthread_setspecific(mKey, h.mPtr); +#endif + if (!succeeded) { + MOZ_CRASH(); + } +} + +} // namespace mozilla + +#endif /* mozilla_ThreadLocal_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ToString.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ToString.h new file mode 100644 index 0000000000..f11cad5cb6 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/ToString.h @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Utilities for converting an object to a string representation. */ + +#ifndef mozilla_ToString_h +#define mozilla_ToString_h + +#include +#include + +namespace mozilla { + +/** + * A convenience function for converting an object to a string representation. + * Supports any object which can be streamed to an std::ostream. + */ +template +std::string +ToString(const T& aValue) +{ + std::ostringstream stream; + stream << aValue; + return stream.str(); +} + +} // namespace mozilla + +#endif /* mozilla_ToString_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypeTraits.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypeTraits.h new file mode 100644 index 0000000000..515c68d94e --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypeTraits.h @@ -0,0 +1,998 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Template-based metaprogramming and type-testing facilities. */ + +#ifndef mozilla_TypeTraits_h +#define mozilla_TypeTraits_h + +#include "mozilla/Types.h" + +/* + * These traits are approximate copies of the traits and semantics from C++11's + * header. Don't add traits not in that header! When all + * platforms provide that header, we can convert all users and remove this one. + */ + +#include + +namespace mozilla { + +/* Forward declarations. */ + +template struct RemoveCV; + +/* 20.9.3 Helper classes [meta.help] */ + +/** + * Helper class used as a base for various type traits, exposed publicly + * because exposes it as well. + */ +template +struct IntegralConstant +{ + static const T value = Value; + typedef T ValueType; + typedef IntegralConstant Type; +}; + +/** Convenient aliases. */ +typedef IntegralConstant TrueType; +typedef IntegralConstant FalseType; + +/* 20.9.4 Unary type traits [meta.unary] */ + +/* 20.9.4.1 Primary type categories [meta.unary.cat] */ + +namespace detail { + +template +struct IsVoidHelper : FalseType {}; + +template<> +struct IsVoidHelper : TrueType {}; + +} // namespace detail + +/** + * IsVoid determines whether a type is void. + * + * mozilla::IsVoid::value is false; + * mozilla::IsVoid::value is true; + * mozilla::IsVoid::value is false; + * mozilla::IsVoid::value is true. + */ +template +struct IsVoid : detail::IsVoidHelper::Type> {}; + +namespace detail { + +template +struct IsIntegralHelper : FalseType {}; + +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +template<> struct IsIntegralHelper : TrueType {}; +#ifdef MOZ_CHAR16_IS_NOT_WCHAR +template<> struct IsIntegralHelper : TrueType {}; +#endif + +} /* namespace detail */ + +/** + * IsIntegral determines whether a type is an integral type. + * + * mozilla::IsIntegral::value is true; + * mozilla::IsIntegral::value is true; + * mozilla::IsIntegral::value is true; + * mozilla::IsIntegral::value is false; + * mozilla::IsIntegral::value is false; + * + * Note that the behavior of IsIntegral on char16_t and char32_t is + * unspecified. + */ +template +struct IsIntegral : detail::IsIntegralHelper::Type> +{}; + +template +struct IsSame; + +namespace detail { + +template +struct IsFloatingPointHelper + : IntegralConstant::value || + IsSame::value || + IsSame::value> +{}; + +} // namespace detail + +/** + * IsFloatingPoint determines whether a type is a floating point type (float, + * double, long double). + * + * mozilla::IsFloatingPoint::value is false; + * mozilla::IsFloatingPoint::value is true; + * mozilla::IsFloatingPoint::value is true; + * mozilla::IsFloatingPoint::value is false. + */ +template +struct IsFloatingPoint + : detail::IsFloatingPointHelper::Type> +{}; + +namespace detail { + +template +struct IsArrayHelper : FalseType {}; + +template +struct IsArrayHelper : TrueType {}; + +template +struct IsArrayHelper : TrueType {}; + +} // namespace detail + +/** + * IsArray determines whether a type is an array type, of known or unknown + * length. + * + * mozilla::IsArray::value is false; + * mozilla::IsArray::value is true; + * mozilla::IsArray::value is true. + */ +template +struct IsArray : detail::IsArrayHelper::Type> +{}; + +/** + * IsPointer determines whether a type is a pointer type (but not a pointer-to- + * member type). + * + * mozilla::IsPointer::value is true; + * mozilla::IsPointer::value is true; + * mozilla::IsPointer::value is true; + * mozilla::IsPointer::value is false; + * mozilla::IsPointer::value is false. + */ +template +struct IsPointer : FalseType {}; + +template +struct IsPointer : TrueType {}; + +/** + * IsLvalueReference determines whether a type is an lvalue reference. + * + * mozilla::IsLvalueReference::value is false; + * mozilla::IsLvalueReference::value is false; + * mozilla::IsLvalueReference::value is false; + * mozilla::IsLvalueReference::value is false; + * mozilla::IsLvalueReference::value is false; + * mozilla::IsLvalueReference::value is true; + * mozilla::IsLvalueReference::value is false. + */ +template +struct IsLvalueReference : FalseType {}; + +template +struct IsLvalueReference : TrueType {}; + +/** + * IsRvalueReference determines whether a type is an rvalue reference. + * + * mozilla::IsRvalueReference::value is false; + * mozilla::IsRvalueReference::value is false; + * mozilla::IsRvalueReference::value is false; + * mozilla::IsRvalueReference::value is false; + * mozilla::IsRvalueReference::value is false; + * mozilla::IsRvalueReference::value is false; + * mozilla::IsRvalueReference::value is true. + */ +template +struct IsRvalueReference : FalseType {}; + +template +struct IsRvalueReference : TrueType {}; + +namespace detail { + +// __is_enum is a supported extension across all of our supported compilers. +template +struct IsEnumHelper + : IntegralConstant +{}; + +} // namespace detail + +/** + * IsEnum determines whether a type is an enum type. + * + * mozilla::IsEnum::value is true; + * mozilla::IsEnum::value is false; + * mozilla::IsEnum::value is false; + */ +template +struct IsEnum + : detail::IsEnumHelper::Type> +{}; + +namespace detail { + +// __is_class is a supported extension across all of our supported compilers: +// http://llvm.org/releases/3.0/docs/ClangReleaseNotes.html +// http://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Type-Traits.html#Type-Traits +// http://msdn.microsoft.com/en-us/library/ms177194%28v=vs.100%29.aspx +template +struct IsClassHelper + : IntegralConstant +{}; + +} // namespace detail + +/** + * IsClass determines whether a type is a class type (but not a union). + * + * struct S {}; + * union U {}; + * mozilla::IsClass::value is false; + * mozilla::IsClass::value is true; + * mozilla::IsClass::value is false; + */ +template +struct IsClass + : detail::IsClassHelper::Type> +{}; + +/* 20.9.4.2 Composite type traits [meta.unary.comp] */ + +/** + * IsReference determines whether a type is an lvalue or rvalue reference. + * + * mozilla::IsReference::value is false; + * mozilla::IsReference::value is false; + * mozilla::IsReference::value is true; + * mozilla::IsReference::value is false; + * mozilla::IsReference::value is true; + * mozilla::IsReference::value is false; + * mozilla::IsReference::value is false; + * mozilla::IsReference::value is true; + * mozilla::IsReference::value is true; + * mozilla::IsReference::value is true. + */ +template +struct IsReference + : IntegralConstant::value || IsRvalueReference::value> +{}; + +/** + * IsArithmetic determines whether a type is arithmetic. A type is arithmetic + * iff it is an integral type or a floating point type. + * + * mozilla::IsArithmetic::value is true; + * mozilla::IsArithmetic::value is true; + * mozilla::IsArithmetic::value is false. + */ +template +struct IsArithmetic + : IntegralConstant::value || IsFloatingPoint::value> +{}; + +/* 20.9.4.3 Type properties [meta.unary.prop] */ + +/** + * IsConst determines whether a type is const or not. + * + * mozilla::IsConst::value is false; + * mozilla::IsConst::value is true; + * mozilla::IsConst::value is false. + */ +template +struct IsConst : FalseType {}; + +template +struct IsConst : TrueType {}; + +/** + * IsVolatile determines whether a type is volatile or not. + * + * mozilla::IsVolatile::value is false; + * mozilla::IsVolatile::value is true; + * mozilla::IsVolatile::value is false. + */ +template +struct IsVolatile : FalseType {}; + +template +struct IsVolatile : TrueType {}; + +/** + * Traits class for identifying POD types. Until C++11 there's no automatic + * way to detect PODs, so for the moment this is done manually. Users may + * define specializations of this class that inherit from mozilla::TrueType and + * mozilla::FalseType (or equivalently mozilla::IntegralConstant, or conveniently from mozilla::IsPod for composite types) as needed to + * ensure correct IsPod behavior. + */ +template +struct IsPod : public FalseType {}; + +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; +#ifdef MOZ_CHAR16_IS_NOT_WCHAR +template<> struct IsPod : TrueType {}; +#endif +template struct IsPod : TrueType {}; + +namespace detail { + +// __is_empty is a supported extension across all of our supported compilers: +// http://llvm.org/releases/3.0/docs/ClangReleaseNotes.html +// http://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Type-Traits.html#Type-Traits +// http://msdn.microsoft.com/en-us/library/ms177194%28v=vs.100%29.aspx +template +struct IsEmptyHelper + : IntegralConstant::value && __is_empty(T)> +{}; + +} // namespace detail + +/** + * IsEmpty determines whether a type is a class (but not a union) that is empty. + * + * A class is empty iff it and all its base classes have no non-static data + * members (except bit-fields of length 0) and no virtual member functions, and + * no base class is empty or a virtual base class. + * + * Intuitively, empty classes don't have any data that has to be stored in + * instances of those classes. (The size of the class must still be non-zero, + * because distinct array elements of any type must have different addresses. + * However, if the Empty Base Optimization is implemented by the compiler [most + * compilers implement it, and in certain cases C++11 requires it], the size of + * a class inheriting from an empty |Base| class need not be inflated by + * |sizeof(Base)|.) And intuitively, non-empty classes have data members and/or + * vtable pointers that must be stored in each instance for proper behavior. + * + * static_assert(!mozilla::IsEmpty::value, "not a class => not empty"); + * union U1 { int x; }; + * static_assert(!mozilla::IsEmpty::value, "not a class => not empty"); + * struct E1 {}; + * struct E2 { int : 0 }; + * struct E3 : E1 {}; + * struct E4 : E2 {}; + * static_assert(mozilla::IsEmpty::value && + * mozilla::IsEmpty::value && + * mozilla::IsEmpty::value && + * mozilla::IsEmpty::value, + * "all empty"); + * union U2 { E1 e1; }; + * static_assert(!mozilla::IsEmpty::value, "not a class => not empty"); + * struct NE1 { int x; }; + * struct NE2 : virtual E1 {}; + * struct NE3 : E2 { virtual ~NE3() {} }; + * struct NE4 { virtual void f() {} }; + * static_assert(!mozilla::IsEmpty::value && + * !mozilla::IsEmpty::value && + * !mozilla::IsEmpty::value && + * !mozilla::IsEmpty::value, + * "all empty"); + */ +template +struct IsEmpty : detail::IsEmptyHelper::Type> +{}; + + +namespace detail { + +template::value, + bool = IsIntegral::value, + typename NoCV = typename RemoveCV::Type> +struct IsSignedHelper; + +// Floating point is signed. +template +struct IsSignedHelper : TrueType {}; + +// Integral is conditionally signed. +template +struct IsSignedHelper + : IntegralConstant +{}; + +// Non-floating point, non-integral is not signed. +template +struct IsSignedHelper : FalseType {}; + +} // namespace detail + +/** + * IsSigned determines whether a type is a signed arithmetic type. |char| is + * considered a signed type if it has the same representation as |signed char|. + * + * mozilla::IsSigned::value is true; + * mozilla::IsSigned::value is false; + * mozilla::IsSigned::value is false; + * mozilla::IsSigned::value is true. + */ +template +struct IsSigned : detail::IsSignedHelper {}; + +namespace detail { + +template::value, + bool = IsIntegral::value, + typename NoCV = typename RemoveCV::Type> +struct IsUnsignedHelper; + +// Floating point is not unsigned. +template +struct IsUnsignedHelper : FalseType {}; + +// Integral is conditionally unsigned. +template +struct IsUnsignedHelper + : IntegralConstant::value || bool(NoCV(1) < NoCV(-1)))> +{}; + +// Non-floating point, non-integral is not unsigned. +template +struct IsUnsignedHelper : FalseType {}; + +} // namespace detail + +/** + * IsUnsigned determines whether a type is an unsigned arithmetic type. + * + * mozilla::IsUnsigned::value is false; + * mozilla::IsUnsigned::value is true; + * mozilla::IsUnsigned::value is true; + * mozilla::IsUnsigned::value is false. + */ +template +struct IsUnsigned : detail::IsUnsignedHelper {}; + +/* 20.9.5 Type property queries [meta.unary.prop.query] */ + +/* 20.9.6 Relationships between types [meta.rel] */ + +/** + * IsSame tests whether two types are the same type. + * + * mozilla::IsSame::value is true; + * mozilla::IsSame::value is true; + * mozilla::IsSame::value is false; + * mozilla::IsSame::value is true; + * mozilla::IsSame::value is false; + * mozilla::IsSame::value is true. + */ +template +struct IsSame : FalseType {}; + +template +struct IsSame : TrueType {}; + +namespace detail { + +#if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) + +template +struct BaseOfTester : IntegralConstant {}; + +#else + +// The trickery used to implement IsBaseOf here makes it possible to use it for +// the cases of private and multiple inheritance. This code was inspired by the +// sample code here: +// +// http://stackoverflow.com/questions/2910979/how-is-base-of-works +template +struct BaseOfHelper +{ +public: + operator Base*() const; + operator Derived*(); +}; + +template +struct BaseOfTester +{ +private: + template + static char test(Derived*, T); + static int test(Base*, int); + +public: + static const bool value = + sizeof(test(BaseOfHelper(), int())) == sizeof(char); +}; + +template +struct BaseOfTester +{ +private: + template + static char test(Derived*, T); + static int test(Base*, int); + +public: + static const bool value = + sizeof(test(BaseOfHelper(), int())) == sizeof(char); +}; + +template +struct BaseOfTester : FalseType {}; + +template +struct BaseOfTester : TrueType {}; + +template +struct BaseOfTester : TrueType {}; + +#endif + +} /* namespace detail */ + +/* + * IsBaseOf allows to know whether a given class is derived from another. + * + * Consider the following class definitions: + * + * class A {}; + * class B : public A {}; + * class C {}; + * + * mozilla::IsBaseOf::value is true; + * mozilla::IsBaseOf::value is false; + */ +template +struct IsBaseOf + : IntegralConstant::value> +{}; + +namespace detail { + +template +struct ConvertibleTester +{ +private: + static From create(); + + template + static char test(To to); + + template + static int test(...); + +public: + static const bool value = + sizeof(test(create())) == sizeof(char); +}; + +} // namespace detail + +/** + * IsConvertible determines whether a value of type From will implicitly convert + * to a value of type To. For example: + * + * struct A {}; + * struct B : public A {}; + * struct C {}; + * + * mozilla::IsConvertible::value is true; + * mozilla::IsConvertible::value is true; + * mozilla::IsConvertible::value is true; + * mozilla::IsConvertible::value is true; + * mozilla::IsConvertible::value is false; + * mozilla::IsConvertible::value is false; + * mozilla::IsConvertible::value is false; + * mozilla::IsConvertible::value is false. + * + * For obscure reasons, you can't use IsConvertible when the types being tested + * are related through private inheritance, and you'll get a compile error if + * you try. Just don't do it! + */ +template +struct IsConvertible + : IntegralConstant::value> +{}; + +/* 20.9.7 Transformations between types [meta.trans] */ + +/* 20.9.7.1 Const-volatile modifications [meta.trans.cv] */ + +/** + * RemoveConst removes top-level const qualifications on a type. + * + * mozilla::RemoveConst::Type is int; + * mozilla::RemoveConst::Type is int; + * mozilla::RemoveConst::Type is const int*; + * mozilla::RemoveConst::Type is int*. + */ +template +struct RemoveConst +{ + typedef T Type; +}; + +template +struct RemoveConst +{ + typedef T Type; +}; + +/** + * RemoveVolatile removes top-level volatile qualifications on a type. + * + * mozilla::RemoveVolatile::Type is int; + * mozilla::RemoveVolatile::Type is int; + * mozilla::RemoveVolatile::Type is volatile int*; + * mozilla::RemoveVolatile::Type is int*. + */ +template +struct RemoveVolatile +{ + typedef T Type; +}; + +template +struct RemoveVolatile +{ + typedef T Type; +}; + +/** + * RemoveCV removes top-level const and volatile qualifications on a type. + * + * mozilla::RemoveCV::Type is int; + * mozilla::RemoveCV::Type is int; + * mozilla::RemoveCV::Type is int; + * mozilla::RemoveCV::Type is int*. + */ +template +struct RemoveCV +{ + typedef typename RemoveConst::Type>::Type Type; +}; + +/* 20.9.7.2 Reference modifications [meta.trans.ref] */ + +/** + * Converts reference types to the underlying types. + * + * mozilla::RemoveReference::Type is T; + * mozilla::RemoveReference::Type is T; + * mozilla::RemoveReference::Type is T; + */ + +template +struct RemoveReference +{ + typedef T Type; +}; + +template +struct RemoveReference +{ + typedef T Type; +}; + +template +struct RemoveReference +{ + typedef T Type; +}; + +template +struct Conditional; + +namespace detail { + +enum Voidness { TIsVoid, TIsNotVoid }; + +template::value ? TIsVoid : TIsNotVoid> +struct AddLvalueReferenceHelper; + +template +struct AddLvalueReferenceHelper +{ + typedef void Type; +}; + +template +struct AddLvalueReferenceHelper +{ + typedef T& Type; +}; + +} // namespace detail + +/** + * AddLvalueReference adds an lvalue & reference to T if one isn't already + * present. (Note: adding an lvalue reference to an rvalue && reference in + * essence replaces the && with a &&, per C+11 reference collapsing rules. For + * example, int&& would become int&.) + * + * The final computed type will only *not* be an lvalue reference if T is void. + * + * mozilla::AddLvalueReference::Type is int&; + * mozilla::AddLvalueRference::Type is volatile int&; + * mozilla::AddLvalueReference::Type is void*&; + * mozilla::AddLvalueReference::Type is void; + * mozilla::AddLvalueReference::Type is struct S&. + */ +template +struct AddLvalueReference + : detail::AddLvalueReferenceHelper +{}; + +/* 20.9.7.3 Sign modifications [meta.trans.sign] */ + +template +struct EnableIf; + +namespace detail { + +template +struct WithC : Conditional +{}; + +template +struct WithV : Conditional +{}; + + +template +struct WithCV : WithC::Type> +{}; + +template +struct CorrespondingSigned; + +template<> +struct CorrespondingSigned { typedef signed char Type; }; +template<> +struct CorrespondingSigned { typedef signed char Type; }; +template<> +struct CorrespondingSigned { typedef short Type; }; +template<> +struct CorrespondingSigned { typedef int Type; }; +template<> +struct CorrespondingSigned { typedef long Type; }; +template<> +struct CorrespondingSigned { typedef long long Type; }; + +template::Type, + bool IsSignedIntegerType = IsSigned::value && + !IsSame::value> +struct MakeSigned; + +template +struct MakeSigned +{ + typedef T Type; +}; + +template +struct MakeSigned + : WithCV::value, IsVolatile::value, + typename CorrespondingSigned::Type> +{}; + +} // namespace detail + +/** + * MakeSigned produces the corresponding signed integer type for a given + * integral type T, with the const/volatile qualifiers of T. T must be a + * possibly-const/volatile-qualified integral type that isn't bool. + * + * If T is already a signed integer type (not including char!), then T is + * produced. + * + * Otherwise, if T is an unsigned integer type, the signed variety of T, with + * T's const/volatile qualifiers, is produced. + * + * Otherwise, the integral type of the same size as T, with the lowest rank, + * with T's const/volatile qualifiers, is produced. (This basically only acts + * to produce signed char when T = char.) + * + * mozilla::MakeSigned::Type is signed long; + * mozilla::MakeSigned::Type is volatile int; + * mozilla::MakeSigned::Type is const signed short; + * mozilla::MakeSigned::Type is const signed char; + * mozilla::MakeSigned is an error; + * mozilla::MakeSigned is an error. + */ +template +struct MakeSigned + : EnableIf::value && + !IsSame::Type>::value, + typename detail::MakeSigned + >::Type +{}; + +namespace detail { + +template +struct CorrespondingUnsigned; + +template<> +struct CorrespondingUnsigned { typedef unsigned char Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned char Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned short Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned int Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned long Type; }; +template<> +struct CorrespondingUnsigned { typedef unsigned long long Type; }; + + +template::Type, + bool IsUnsignedIntegerType = IsUnsigned::value && + !IsSame::value> +struct MakeUnsigned; + +template +struct MakeUnsigned +{ + typedef T Type; +}; + +template +struct MakeUnsigned + : WithCV::value, IsVolatile::value, + typename CorrespondingUnsigned::Type> +{}; + +} // namespace detail + +/** + * MakeUnsigned produces the corresponding unsigned integer type for a given + * integral type T, with the const/volatile qualifiers of T. T must be a + * possibly-const/volatile-qualified integral type that isn't bool. + * + * If T is already an unsigned integer type (not including char!), then T is + * produced. + * + * Otherwise, if T is an signed integer type, the unsigned variety of T, with + * T's const/volatile qualifiers, is produced. + * + * Otherwise, the unsigned integral type of the same size as T, with the lowest + * rank, with T's const/volatile qualifiers, is produced. (This basically only + * acts to produce unsigned char when T = char.) + * + * mozilla::MakeUnsigned::Type is unsigned long; + * mozilla::MakeUnsigned::Type is volatile unsigned int; + * mozilla::MakeUnsigned::Type is const unsigned short; + * mozilla::MakeUnsigned::Type is const unsigned char; + * mozilla::MakeUnsigned is an error; + * mozilla::MakeUnsigned is an error. + */ +template +struct MakeUnsigned + : EnableIf::value && + !IsSame::Type>::value, + typename detail::MakeUnsigned + >::Type +{}; + +/* 20.9.7.4 Array modifications [meta.trans.arr] */ + +/** + * RemoveExtent produces either the type of the elements of the array T, or T + * itself. + * + * mozilla::RemoveExtent::Type is int; + * mozilla::RemoveExtent::Type is const int; + * mozilla::RemoveExtent::Type is volatile int; + * mozilla::RemoveExtent::Type is long[17]. + */ +template +struct RemoveExtent +{ + typedef T Type; +}; + +template +struct RemoveExtent +{ + typedef T Type; +}; + +template +struct RemoveExtent +{ + typedef T Type; +}; + +/* 20.9.7.5 Pointer modifications [meta.trans.ptr] */ + +/* 20.9.7.6 Other transformations [meta.trans.other] */ + +/** + * EnableIf is a struct containing a typedef of T if and only if B is true. + * + * mozilla::EnableIf::Type is int; + * mozilla::EnableIf::Type is a compile-time error. + * + * Use this template to implement SFINAE-style (Substitution Failure Is not An + * Error) requirements. For example, you might use it to impose a restriction + * on a template parameter: + * + * template + * class PodVector // vector optimized to store POD (memcpy-able) types + * { + * EnableIf::value, T>::Type* vector; + * size_t length; + * ... + * }; + */ +template +struct EnableIf +{}; + +template +struct EnableIf +{ + typedef T Type; +}; + +/** + * Conditional selects a class between two, depending on a given boolean value. + * + * mozilla::Conditional::Type is A; + * mozilla::Conditional::Type is B; + */ +template +struct Conditional +{ + typedef A Type; +}; + +template +struct Conditional +{ + typedef B Type; +}; + +} /* namespace mozilla */ + +#endif /* mozilla_TypeTraits_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnum.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnum.h new file mode 100644 index 0000000000..d84cd90257 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnum.h @@ -0,0 +1,281 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Macros to emulate C++11 typed enums and enum classes. */ + +#ifndef mozilla_TypedEnum_h +#define mozilla_TypedEnum_h + +#include "mozilla/TypedEnumInternal.h" +#include "mozilla/MacroArgs.h" + +#if defined(__cplusplus) + +/** + * MOZ_ENUM_TYPE specifies the underlying numeric type for an enum. It's + * specified by placing MOZ_ENUM_TYPE(type) immediately after the enum name in + * its declaration, and before the opening curly brace, like + * + * enum MyEnum MOZ_ENUM_TYPE(uint16_t) + * { + * A, + * B = 7, + * C + * }; + * + * In supporting compilers, the macro will expand to ": uint16_t". The + * compiler will allocate exactly two bytes for MyEnum and will require all + * enumerators to have values between 0 and 65535. (Thus specifying "B = + * 100000" instead of "B = 7" would fail to compile.) In old compilers the + * macro expands to the empty string, and the underlying type is generally + * undefined. + */ +#ifdef MOZ_HAVE_CXX11_ENUM_TYPE +# define MOZ_ENUM_TYPE(type) : type +#else +# define MOZ_ENUM_TYPE(type) /* no support */ +#endif + +/** + * MOZ_BEGIN_ENUM_CLASS and MOZ_END_ENUM_CLASS provide access to the + * strongly-typed enumeration feature of C++11 ("enum class"). If supported + * by the compiler, an enum defined using these macros will not be implicitly + * converted to any other type, and its enumerators will be scoped using the + * enumeration name. Place MOZ_BEGIN_ENUM_CLASS(EnumName [, type]) in place of + * "enum EnumName {", and MOZ_END_ENUM_CLASS(EnumName) in place of the closing + * "};". For example, + * + * MOZ_BEGIN_ENUM_CLASS(Enum, int32_t) + * A, + * B = 6 + * MOZ_END_ENUM_CLASS(Enum) + * + * This will make "Enum::A" and "Enum::B" appear in the global scope, but "A" + * and "B" will not. In compilers that support C++11 strongly-typed + * enumerations, implicit conversions of Enum values to numeric types will + * fail. In other compilers, Enum itself will actually be defined as a class, + * and some implicit conversions will fail while others will succeed. + * + * The optional type argument specifies the underlying type for the enum where + * supported, as with MOZ_ENUM_TYPE(). As with MOZ_ENUM_TYPE(), it will do + * nothing on compilers that do not support it. + * + * MOZ_{BEGIN,END}_ENUM_CLASS doesn't work for defining enum classes nested + * inside classes. To define an enum class nested inside another class, use + * MOZ_{BEGIN,END}_NESTED_ENUM_CLASS, and place a MOZ_FINISH_NESTED_ENUM_CLASS + * in namespace scope to handle bits that can only be implemented with + * namespace-scoped code. For example: + * + * class FooBar + * { + * MOZ_BEGIN_NESTED_ENUM_CLASS(Enum, int32_t) + * A, + * B = 6 + * MOZ_END_NESTED_ENUM_CLASS(Enum) + * }; + * + * MOZ_FINISH_NESTED_ENUM_CLASS(FooBar::Enum) + */ +#if defined(MOZ_HAVE_CXX11_STRONG_ENUMS) + /* + * All compilers that support strong enums also support an explicit + * underlying type, so no extra check is needed. + */ + + /* Single-argument form. */ +# define MOZ_BEGIN_NESTED_ENUM_CLASS_HELPER1(Name) \ + enum class Name { + /* Two-argument form. */ +# define MOZ_BEGIN_NESTED_ENUM_CLASS_HELPER2(Name, type) \ + enum class Name : type { +# define MOZ_END_NESTED_ENUM_CLASS(Name) \ + }; +# define MOZ_FINISH_NESTED_ENUM_CLASS(Name) /* nothing */ + + /* + * MOZ_ENUM_CLASS_ENUM_TYPE allows using enum classes + * as template parameter types. For that, we need integer types. + * In the present case where the compiler supports strong enums, + * these are already integer types so there is nothing more to do. + */ +# define MOZ_ENUM_CLASS_ENUM_TYPE(Name) Name + /* + * See the comment below about MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE. + */ +# define MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(Name) Name +#else + /** + * We need Name to both name a type, and scope the provided enumerator + * names. Namespaces and classes both provide scoping, but namespaces + * aren't types, so we need to use a class that wraps the enum values. We + * have an implicit conversion from the inner enum type to the class, so + * statements like + * + * Enum x = Enum::A; + * + * will still work. We need to define an implicit conversion from the class + * to the inner enum as well, so that (for instance) switch statements will + * work. This means that the class can be implicitly converted to a numeric + * value as well via the enum type, since C++ allows an implicit + * user-defined conversion followed by a standard conversion to still be + * implicit. + * + * We have an explicit constructor from int defined, so that casts like + * (Enum)7 will still work. We also have a zero-argument constructor with + * no arguments, so declaration without initialization (like "Enum foo;") + * will work. + * + * Additionally, we'll delete as many operators as possible for the inner + * enum type, so statements like this will still fail: + * + * f(5 + Enum::B); // deleted operator+ + * + * But we can't prevent things like this, because C++ doesn't allow + * overriding conversions or assignment operators for enums: + * + * int x = Enum::A; + * int f() + * { + * return Enum::A; + * } + */ + + /* Single-argument form. */ +# define MOZ_BEGIN_NESTED_ENUM_CLASS_HELPER1(Name) \ + class Name \ + { \ + public: \ + enum Enum \ + { + /* Two-argument form. */ +# define MOZ_BEGIN_NESTED_ENUM_CLASS_HELPER2(Name, type) \ + class Name \ + { \ + public: \ + enum Enum MOZ_ENUM_TYPE(type) \ + { +# define MOZ_END_NESTED_ENUM_CLASS(Name) \ + }; \ + Name() {} \ + MOZ_CONSTEXPR Name(Enum aEnum) : mEnum(aEnum) {} \ + template \ + explicit MOZ_CONSTEXPR Name(Other num) : mEnum((Enum)num) {} \ + MOZ_CONSTEXPR operator Enum() const { return mEnum; } \ + explicit MOZ_CONSTEXPR Name(const mozilla::CastableTypedEnumResult& aOther) \ + : mEnum(aOther.get()) \ + {} \ + private: \ + Enum mEnum; \ + }; +# define MOZ_FINISH_NESTED_ENUM_CLASS(Name) \ + inline int operator+(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator+(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator-(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator-(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator*(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator*(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator/(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator/(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator%(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator%(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator+(const Name::Enum&) MOZ_DELETE; \ + inline int operator-(const Name::Enum&) MOZ_DELETE; \ + inline int& operator++(Name::Enum&) MOZ_DELETE; \ + inline int operator++(Name::Enum&, int) MOZ_DELETE; \ + inline int& operator--(Name::Enum&) MOZ_DELETE; \ + inline int operator--(Name::Enum&, int) MOZ_DELETE; \ + inline bool operator==(const int&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator==(const Name::Enum&, const int&) MOZ_DELETE; \ + inline bool operator!=(const int&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator!=(const Name::Enum&, const int&) MOZ_DELETE; \ + inline bool operator>(const int&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator>(const Name::Enum&, const int&) MOZ_DELETE; \ + inline bool operator<(const int&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator<(const Name::Enum&, const int&) MOZ_DELETE; \ + inline bool operator>=(const int&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator>=(const Name::Enum&, const int&) MOZ_DELETE; \ + inline bool operator<=(const int&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator<=(const Name::Enum&, const int&) MOZ_DELETE; \ + inline bool operator!(const Name::Enum&) MOZ_DELETE; \ + inline bool operator&&(const bool&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator&&(const Name::Enum&, const bool&) MOZ_DELETE; \ + inline bool operator||(const bool&, const Name::Enum&) MOZ_DELETE; \ + inline bool operator||(const Name::Enum&, const bool&) MOZ_DELETE; \ + inline int operator&(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator&(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator|(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator|(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator^(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator^(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator<<(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator<<(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int operator>>(const int&, const Name::Enum&) MOZ_DELETE; \ + inline int operator>>(const Name::Enum&, const int&) MOZ_DELETE; \ + inline int& operator+=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator-=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator*=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator/=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator%=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator&=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator|=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator^=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator<<=(int&, const Name::Enum&) MOZ_DELETE; \ + inline int& operator>>=(int&, const Name::Enum&) MOZ_DELETE; + + /* + * MOZ_ENUM_CLASS_ENUM_TYPE allows using enum classes + * as template parameter types. For that, we need integer types. + * In the present case, the integer type is the Enum nested type. + */ +# define MOZ_ENUM_CLASS_ENUM_TYPE(Name) Name::Enum + /* + * MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE is a variant of MOZ_ENUM_CLASS_ENUM_TYPE + * to be used when the enum class at hand depends on template parameters. + * + * Indeed, if T depends on template parameters, in order to name a nested type + * in T, C++ does not allow to just write "T::NestedType". Instead, we have + * to write "typename T::NestedType". The role of this macro is to add + * this "typename" keywords where needed. + * + * Example: + * + * template + * struct S {}; + * + * MOZ_BEGIN_ENUM_CLASS(E) + * Foo, + * Bar + * MOZ_END_ENUM_CLASS(E) + * + * S s; + * + * In this example, the second template parameter to S is meant to be of type + * T, but on non-C++11 compilers, type T is a class type, not an integer + * type, so it is not accepted as the type of a constant template parameter. + * One would then want to use MOZ_ENUM_CLASS_ENUM_TYPE(T), but that doesn't + * work either as T depends on template parameters (more specifically here, T + * _is_ a template parameter) so as MOZ_ENUM_CLASS_ENUM_TYPE(T) expands to + * T::Enum, we are missing the required "typename" keyword. So here, + * MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE is needed. + */ +# define MOZ_TEMPLATE_ENUM_CLASS_ENUM_TYPE(Name) typename Name::Enum +#endif + +# define MOZ_BEGIN_NESTED_ENUM_CLASS_GLUE(a, b) a b +# define MOZ_BEGIN_NESTED_ENUM_CLASS(...) \ + MOZ_BEGIN_NESTED_ENUM_CLASS_GLUE( \ + MOZ_PASTE_PREFIX_AND_ARG_COUNT(MOZ_BEGIN_NESTED_ENUM_CLASS_HELPER, \ + __VA_ARGS__), \ + (__VA_ARGS__)) + +# define MOZ_BEGIN_ENUM_CLASS(...) MOZ_BEGIN_NESTED_ENUM_CLASS(__VA_ARGS__) +# define MOZ_END_ENUM_CLASS(Name) \ + MOZ_END_NESTED_ENUM_CLASS(Name) \ + MOZ_FINISH_NESTED_ENUM_CLASS(Name) + +#endif /* __cplusplus */ + +#endif /* mozilla_TypedEnum_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumBits.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumBits.h new file mode 100644 index 0000000000..1f439f1239 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumBits.h @@ -0,0 +1,184 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS allows using a typed enum as bit flags. + */ + +#ifndef mozilla_TypedEnumBits_h +#define mozilla_TypedEnumBits_h + +#include "mozilla/IntegerTypeTraits.h" +#include "mozilla/TypedEnumInternal.h" + +namespace mozilla { + +#define MOZ_CASTABLETYPEDENUMRESULT_BINOP(Op, OtherType, ReturnType) \ +template \ +MOZ_CONSTEXPR ReturnType \ +operator Op(const OtherType& aE, const CastableTypedEnumResult& aR) \ +{ \ + return ReturnType(aE Op OtherType(aR)); \ +} \ +template \ +MOZ_CONSTEXPR ReturnType \ +operator Op(const CastableTypedEnumResult& aR, const OtherType& aE) \ +{ \ + return ReturnType(OtherType(aR) Op aE); \ +} \ +template \ +MOZ_CONSTEXPR ReturnType \ +operator Op(const CastableTypedEnumResult& aR1, \ + const CastableTypedEnumResult& aR2) \ +{ \ + return ReturnType(OtherType(aR1) Op OtherType(aR2)); \ +} + +MOZ_CASTABLETYPEDENUMRESULT_BINOP(|, E, CastableTypedEnumResult) +MOZ_CASTABLETYPEDENUMRESULT_BINOP(&, E, CastableTypedEnumResult) +MOZ_CASTABLETYPEDENUMRESULT_BINOP(^, E, CastableTypedEnumResult) +MOZ_CASTABLETYPEDENUMRESULT_BINOP(==, E, bool) +MOZ_CASTABLETYPEDENUMRESULT_BINOP(!=, E, bool) +MOZ_CASTABLETYPEDENUMRESULT_BINOP(||, bool, bool) +MOZ_CASTABLETYPEDENUMRESULT_BINOP(&&, bool, bool) + +template +MOZ_CONSTEXPR CastableTypedEnumResult +operator ~(const CastableTypedEnumResult& aR) +{ + return CastableTypedEnumResult(~(E(aR))); +} + +#define MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(Op) \ +template \ +E& \ +operator Op(E& aR1, \ + const CastableTypedEnumResult& aR2) \ +{ \ + return aR1 Op E(aR2); \ +} + +MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(&=) +MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(|=) +MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP(^=) + +#undef MOZ_CASTABLETYPEDENUMRESULT_COMPOUND_ASSIGN_OP + +#undef MOZ_CASTABLETYPEDENUMRESULT_BINOP + +#ifndef MOZ_HAVE_CXX11_STRONG_ENUMS + +#define MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(Op, ReturnType) \ +template \ +MOZ_CONSTEXPR ReturnType \ +operator Op(typename E::Enum aE, const CastableTypedEnumResult& aR) \ +{ \ + return ReturnType(aE Op E(aR)); \ +} \ +template \ +MOZ_CONSTEXPR ReturnType \ +operator Op(const CastableTypedEnumResult& aR, typename E::Enum aE) \ +{ \ + return ReturnType(E(aR) Op aE); \ +} + +MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(|, CastableTypedEnumResult) +MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(&, CastableTypedEnumResult) +MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(^, CastableTypedEnumResult) +MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(==, bool) +MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11(!=, bool) + +#undef MOZ_CASTABLETYPEDENUMRESULT_BINOP_EXTRA_NON_CXX11 + +#endif // not MOZ_HAVE_CXX11_STRONG_ENUMS + +namespace detail { +template +struct UnsignedIntegerTypeForEnum + : UnsignedStdintTypeForSize +{}; +} + +} // namespace mozilla + +#define MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, Op) \ + inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult \ + operator Op(Name a, Name b) \ + { \ + typedef mozilla::CastableTypedEnumResult Result; \ + typedef mozilla::detail::UnsignedIntegerTypeForEnum::Type U; \ + return Result(Name(U(a) Op U(b))); \ + } \ + \ + inline Name& \ + operator Op##=(Name& a, Name b) \ + { \ + return a = a Op b; \ + } + +#define MOZ_MAKE_ENUM_CLASS_OPS_IMPL(Name) \ + MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, |) \ + MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, &) \ + MOZ_MAKE_ENUM_CLASS_BINOP_IMPL(Name, ^) \ + inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult \ + operator~(Name a) \ + { \ + typedef mozilla::CastableTypedEnumResult Result; \ + typedef mozilla::detail::UnsignedIntegerTypeForEnum::Type U; \ + return Result(Name(~(U(a)))); \ + } + +#ifndef MOZ_HAVE_CXX11_STRONG_ENUMS +# define MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, Op) \ + inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult \ + operator Op(Name a, Name::Enum b) \ + { \ + return a Op Name(b); \ + } \ + \ + inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult \ + operator Op(Name::Enum a, Name b) \ + { \ + return Name(a) Op b; \ + } \ + \ + inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult \ + operator Op(Name::Enum a, Name::Enum b) \ + { \ + return Name(a) Op Name(b); \ + } \ + \ + inline Name& \ + operator Op##=(Name& a, Name::Enum b) \ + { \ + return a = a Op Name(b); \ + } + +# define MOZ_MAKE_ENUM_CLASS_OPS_EXTRA_NON_CXX11(Name) \ + MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, |) \ + MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, &) \ + MOZ_MAKE_ENUM_CLASS_BITWISE_BINOP_EXTRA_NON_CXX11(Name, ^) \ + inline MOZ_CONSTEXPR mozilla::CastableTypedEnumResult \ + operator~(Name::Enum a) \ + { \ + return ~(Name(a)); \ + } +#endif + +/** + * MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS generates standard bitwise operators + * for the given enum type. Use this to enable using an enum type as bit-field. + */ +#ifdef MOZ_HAVE_CXX11_STRONG_ENUMS +# define MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(Name) \ + MOZ_MAKE_ENUM_CLASS_OPS_IMPL(Name) +#else +# define MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(Name) \ + MOZ_MAKE_ENUM_CLASS_OPS_IMPL(Name) \ + MOZ_MAKE_ENUM_CLASS_OPS_EXTRA_NON_CXX11(Name) +#endif + +#endif // mozilla_TypedEnumBits_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumInternal.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumInternal.h new file mode 100644 index 0000000000..8c88cb589b --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/TypedEnumInternal.h @@ -0,0 +1,110 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Internal stuff needed by TypedEnum.h and TypedEnumBits.h. */ + +// NOTE: When we can assume C++11 enum class support and TypedEnum.h goes away, +// we should then consider folding TypedEnumInternal.h into TypedEnumBits.h. + +#ifndef mozilla_TypedEnumInternal_h +#define mozilla_TypedEnumInternal_h + +#include "mozilla/Attributes.h" + +#if defined(__cplusplus) + +#if defined(__clang__) + /* + * Per Clang documentation, "Note that marketing version numbers should not + * be used to check for language features, as different vendors use different + * numbering schemes. Instead, use the feature checking macros." + */ +# ifndef __has_extension +# define __has_extension __has_feature /* compatibility, for older versions of clang */ +# endif +# if __has_extension(cxx_strong_enums) +# define MOZ_HAVE_CXX11_ENUM_TYPE +# define MOZ_HAVE_CXX11_STRONG_ENUMS +# endif +#elif defined(__GNUC__) +# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L +# if MOZ_GCC_VERSION_AT_LEAST(4, 6, 3) +# define MOZ_HAVE_CXX11_ENUM_TYPE +# define MOZ_HAVE_CXX11_STRONG_ENUMS +# endif +# endif +#elif defined(_MSC_VER) +# if _MSC_VER >= 1400 +# define MOZ_HAVE_CXX11_ENUM_TYPE +# endif +# if _MSC_VER >= 1700 +# define MOZ_HAVE_CXX11_STRONG_ENUMS +# endif +#endif + +namespace mozilla { + +/* + * The problem that CastableTypedEnumResult aims to solve is that + * typed enums are not convertible to bool, and there is no way to make them + * be, yet user code wants to be able to write + * + * if (myFlags & Flags::SOME_PARTICULAR_FLAG) (1) + * + * There are different approaches to solving this. Most of them require + * adapting user code. For example, we could implement operator! and have + * the user write + * + * if (!!(myFlags & Flags::SOME_PARTICULAR_FLAG)) (2) + * + * Or we could supply a IsNonZero() or Any() function returning whether + * an enum value is nonzero, and have the user write + * + * if (Any(Flags & Flags::SOME_PARTICULAR_FLAG)) (3) + * + * But instead, we choose to preserve the original user syntax (1) as it + * is inherently more readable, and to ease porting existing code to typed + * enums. We achieve this by having operator& and other binary bitwise + * operators have as return type a class, CastableTypedEnumResult, + * that wraps a typed enum but adds bool convertibility. + */ +template +class CastableTypedEnumResult +{ +private: + const E mValue; + +public: + explicit MOZ_CONSTEXPR CastableTypedEnumResult(E aValue) + : mValue(aValue) + {} + + MOZ_CONSTEXPR operator E() const { return mValue; } + + template + MOZ_EXPLICIT_CONVERSION MOZ_CONSTEXPR + operator DestinationType() const { return DestinationType(mValue); } + + MOZ_CONSTEXPR bool operator !() const { return !bool(mValue); } + +#ifndef MOZ_HAVE_CXX11_STRONG_ENUMS + // This get() method is used to implement a constructor in the + // non-c++11 fallback path for MOZ_BEGIN_ENUM_CLASS, taking a + // CastableTypedEnumResult. If we try to implement it using the + // above conversion operator E(), then at least clang 3.3 + // (when forced to take the non-c++11 fallback path) compiles + // this constructor to an infinite recursion. So we introduce this + // get() method, that does exactly the same as the conversion operator, + // to work around this. + MOZ_CONSTEXPR E get() const { return mValue; } +#endif +}; + +} // namespace mozilla + +#endif // __cplusplus + +#endif // mozilla_TypedEnumInternal_h diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Types.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Types.h new file mode 100644 index 0000000000..e7e18abb27 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Types.h @@ -0,0 +1,134 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* mfbt foundational types and macros. */ + +#ifndef mozilla_Types_h +#define mozilla_Types_h + +/* + * This header must be valid C and C++, includable by code embedding either + * SpiderMonkey or Gecko. + */ + +/* Expose all types and size_t. */ +#include +#include + +/* Implement compiler and linker macros needed for APIs. */ + +/* + * MOZ_EXPORT is used to declare and define a symbol or type which is externally + * visible to users of the current library. It encapsulates various decorations + * needed to properly export the method's symbol. + * + * api.h: + * extern MOZ_EXPORT int MeaningOfLife(void); + * extern MOZ_EXPORT int LuggageCombination; + * + * api.c: + * int MeaningOfLife(void) { return 42; } + * int LuggageCombination = 12345; + * + * If you are merely sharing a method across files, just use plain |extern|. + * These macros are designed for use by library interfaces -- not for normal + * methods or data used cross-file. + */ +#if defined(WIN32) +# define MOZ_EXPORT __declspec(dllexport) +#else /* Unix */ +# ifdef HAVE_VISIBILITY_ATTRIBUTE +# define MOZ_EXPORT __attribute__((visibility("default"))) +# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# define MOZ_EXPORT __global +# else +# define MOZ_EXPORT /* nothing */ +# endif +#endif + + +/* + * Whereas implementers use MOZ_EXPORT to declare and define library symbols, + * users use MOZ_IMPORT_API and MOZ_IMPORT_DATA to access them. Most often the + * implementer of the library will expose an API macro which expands to either + * the export or import version of the macro, depending upon the compilation + * mode. + */ +#ifdef _WIN32 +# if defined(__MWERKS__) +# define MOZ_IMPORT_API /* nothing */ +# else +# define MOZ_IMPORT_API __declspec(dllimport) +# endif +#else +# define MOZ_IMPORT_API MOZ_EXPORT +#endif + +#if defined(_WIN32) && !defined(__MWERKS__) +# define MOZ_IMPORT_DATA __declspec(dllimport) +#else +# define MOZ_IMPORT_DATA MOZ_EXPORT +#endif + +/* + * Consistent with the above comment, the MFBT_API and MFBT_DATA macros expose + * export mfbt declarations when building mfbt, and they expose import mfbt + * declarations when using mfbt. + */ +#if defined(IMPL_MFBT) +# define MFBT_API MOZ_EXPORT +# define MFBT_DATA MOZ_EXPORT +#else + /* + * On linux mozglue is linked in the program and we link libxul.so with + * -z,defs. Normally that causes the linker to reject undefined references in + * libxul.so, but as a loophole it allows undefined references to weak + * symbols. We add the weak attribute to the import version of the MFBT API + * macros to exploit this. + */ +# if defined(MOZ_GLUE_IN_PROGRAM) +# define MFBT_API __attribute__((weak)) MOZ_IMPORT_API +# define MFBT_DATA __attribute__((weak)) MOZ_IMPORT_DATA +# else +# define MFBT_API MOZ_IMPORT_API +# define MFBT_DATA MOZ_IMPORT_DATA +# endif +#endif + +/* + * C symbols in C++ code must be declared immediately within |extern "C"| + * blocks. However, in C code, they need not be declared specially. This + * difference is abstracted behind the MOZ_BEGIN_EXTERN_C and MOZ_END_EXTERN_C + * macros, so that the user need not know whether he is being used in C or C++ + * code. + * + * MOZ_BEGIN_EXTERN_C + * + * extern MOZ_EXPORT int MostRandomNumber(void); + * ...other declarations... + * + * MOZ_END_EXTERN_C + * + * This said, it is preferable to just use |extern "C"| in C++ header files for + * its greater clarity. + */ +#ifdef __cplusplus +# define MOZ_BEGIN_EXTERN_C extern "C" { +# define MOZ_END_EXTERN_C } +#else +# define MOZ_BEGIN_EXTERN_C +# define MOZ_END_EXTERN_C +#endif + +/* + * GCC's typeof is available when decltype is not. + */ +#if defined(__GNUC__) && defined(__cplusplus) && \ + !defined(__GXX_EXPERIMENTAL_CXX0X__) && __cplusplus < 201103L +# define decltype __typeof__ +#endif + +#endif /* mozilla_Types_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/UniquePtr.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/UniquePtr.h new file mode 100644 index 0000000000..9c873db90c --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/UniquePtr.h @@ -0,0 +1,674 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Smart pointer managing sole ownership of a resource. */ + +#ifndef mozilla_UniquePtr_h +#define mozilla_UniquePtr_h + +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/Compiler.h" +#include "mozilla/Move.h" +#include "mozilla/NullPtr.h" +#include "mozilla/Pair.h" +#include "mozilla/TypeTraits.h" + +namespace mozilla { + +template class DefaultDelete; +template> class UniquePtr; + +} // namespace mozilla + +namespace mozilla { + +/** + * UniquePtr is a smart pointer that wholly owns a resource. Ownership may be + * transferred out of a UniquePtr through explicit action, but otherwise the + * resource is destroyed when the UniquePtr is destroyed. + * + * UniquePtr is similar to C++98's std::auto_ptr, but it improves upon auto_ptr + * in one crucial way: it's impossible to copy a UniquePtr. Copying an auto_ptr + * obviously *can't* copy ownership of its singly-owned resource. So what + * happens if you try to copy one? Bizarrely, ownership is implicitly + * *transferred*, preserving single ownership but breaking code that assumes a + * copy of an object is identical to the original. (This is why auto_ptr is + * prohibited in STL containers.) + * + * UniquePtr solves this problem by being *movable* rather than copyable. + * Instead of passing a |UniquePtr u| directly to the constructor or assignment + * operator, you pass |Move(u)|. In doing so you indicate that you're *moving* + * ownership out of |u|, into the target of the construction/assignment. After + * the transfer completes, |u| contains |nullptr| and may be safely destroyed. + * This preserves single ownership but also allows UniquePtr to be moved by + * algorithms that have been made move-safe. (Note: if |u| is instead a + * temporary expression, don't use |Move()|: just pass the expression, because + * it's already move-ready. For more information see Move.h.) + * + * UniquePtr is also better than std::auto_ptr in that the deletion operation is + * customizable. An optional second template parameter specifies a class that + * (through its operator()(T*)) implements the desired deletion policy. If no + * policy is specified, mozilla::DefaultDelete is used -- which will either + * |delete| or |delete[]| the resource, depending whether the resource is an + * array. Custom deletion policies ideally should be empty classes (no member + * fields, no member fields in base classes, no virtual methods/inheritance), + * because then UniquePtr can be just as efficient as a raw pointer. + * + * Use of UniquePtr proceeds like so: + * + * UniquePtr g1; // initializes to nullptr + * g1.reset(new int); // switch resources using reset() + * g1 = nullptr; // clears g1, deletes the int + * + * UniquePtr g2(new int); // owns that int + * int* p = g2.release(); // g2 leaks its int -- still requires deletion + * delete p; // now freed + * + * struct S { int x; S(int x) : x(x) {} }; + * UniquePtr g3, g4(new S(5)); + * g3 = Move(g4); // g3 owns the S, g4 cleared + * S* p = g3.get(); // g3 still owns |p| + * assert(g3->x == 5); // operator-> works (if .get() != nullptr) + * assert((*g3).x == 5); // also operator* (again, if not cleared) + * Swap(g3, g4); // g4 now owns the S, g3 cleared + * g3.swap(g4); // g3 now owns the S, g4 cleared + * UniquePtr g5(Move(g3)); // g5 owns the S, g3 cleared + * g5.reset(); // deletes the S, g5 cleared + * + * struct FreePolicy { void operator()(void* p) { free(p); } }; + * UniquePtr g6(static_cast(malloc(sizeof(int)))); + * int* ptr = g6.get(); + * g6 = nullptr; // calls free(ptr) + * + * Now, carefully note a few things you *can't* do: + * + * UniquePtr b1; + * b1 = new int; // BAD: can only assign another UniquePtr + * int* ptr = b1; // BAD: no auto-conversion to pointer, use get() + * + * UniquePtr b2(b1); // BAD: can't copy a UniquePtr + * UniquePtr b3 = b1; // BAD: can't copy-assign a UniquePtr + * + * A few miscellaneous notes: + * + * UniquePtr, when not instantiated for an array type, can be move-constructed + * and move-assigned, not only from itself but from "derived" UniquePtr + * instantiations where U converts to T and E converts to D. If you want to use + * this, you're going to have to specify a deletion policy for both UniquePtr + * instantations, and T pretty much has to have a virtual destructor. In other + * words, this doesn't work: + * + * struct Base { virtual ~Base() {} }; + * struct Derived : Base {}; + * + * UniquePtr b1; + * // BAD: DefaultDelete and DefaultDelete don't interconvert + * UniquePtr d1(Move(b)); + * + * UniquePtr b2; + * UniquePtr> d2(Move(b2)); // okay + * + * UniquePtr is specialized for array types. Specializing with an array type + * creates a smart-pointer version of that array -- not a pointer to such an + * array. + * + * UniquePtr arr(new int[5]); + * arr[0] = 4; + * + * What else is different? Deletion of course uses |delete[]|. An operator[] + * is provided. Functionality that doesn't make sense for arrays is removed. + * The constructors and mutating methods only accept array pointers (not T*, U* + * that converts to T*, or UniquePtr or UniquePtr) or |nullptr|. + * + * It's perfectly okay to return a UniquePtr from a method to assure the related + * resource is properly deleted. You'll need to use |Move()| when returning a + * local UniquePtr. Otherwise you can return |nullptr|, or you can return + * |UniquePtr(ptr)|. + * + * UniquePtr will commonly be a member of a class, with lifetime equivalent to + * that of that class. If you want to expose the related resource, you could + * expose a raw pointer via |get()|, but ownership of a raw pointer is + * inherently unclear. So it's better to expose a |const UniquePtr&| instead. + * This prohibits mutation but still allows use of |get()| when needed (but + * operator-> is preferred). Of course, you can only use this smart pointer as + * long as the enclosing class instance remains live -- no different than if you + * exposed the |get()| raw pointer. + * + * To pass a UniquePtr-managed resource as a pointer, use a |const UniquePtr&| + * argument. To specify an inout parameter (where the method may or may not + * take ownership of the resource, or reset it), or to specify an out parameter + * (where simply returning a |UniquePtr| isn't possible), use a |UniquePtr&| + * argument. To unconditionally transfer ownership of a UniquePtr + * into a method, use a |UniquePtr| argument. To conditionally transfer + * ownership of a resource into a method, should the method want it, use a + * |UniquePtr&&| argument. + */ +template +class UniquePtr +{ + public: + typedef T* Pointer; + typedef T ElementType; + typedef D DeleterType; + + private: + Pair tuple; + + Pointer& ptr() { return tuple.first(); } + const Pointer& ptr() const { return tuple.first(); } + + DeleterType& del() { return tuple.second(); } + const DeleterType& del() const { return tuple.second(); } + + public: + /** + * Construct a UniquePtr containing |nullptr|. + */ + MOZ_CONSTEXPR UniquePtr() + : tuple(static_cast(nullptr), DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + /** + * Construct a UniquePtr containing |p|. + */ + explicit UniquePtr(Pointer p) + : tuple(p, DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + UniquePtr(Pointer p, + typename Conditional::value, + D, + const D&>::Type d1) + : tuple(p, d1) + {} + + // If you encounter an error with MSVC10 about RemoveReference below, along + // the lines that "more than one partial specialization matches the template + // argument list": don't use UniquePtr! Ideally + // you should make deletion use the same function every time, using a + // deleter policy: + // + // // BAD, won't compile with MSVC10, deleter doesn't need to be a + // // variable at all + // typedef void (&FreeSignature)(void*); + // UniquePtr ptr((int*) malloc(sizeof(int)), free); + // + // // GOOD, compiles with MSVC10, deletion behavior statically known and + // // optimizable + // struct DeleteByFreeing + // { + // void operator()(void* ptr) { free(ptr); } + // }; + // + // If deletion really, truly, must be a variable: you might be able to work + // around this with a deleter class that contains the function reference. + // But this workaround is untried and untested, because variable deletion + // behavior really isn't something you should use. + UniquePtr(Pointer p, + typename RemoveReference::Type&& d2) + : tuple(p, Move(d2)) + { + static_assert(!IsReference::value, + "rvalue deleter can't be stored by reference"); + } + + UniquePtr(UniquePtr&& other) + : tuple(other.release(), Forward(other.getDeleter())) + {} + + template + UniquePtr(N, + typename EnableIf::value, int>::Type dummy = 0) + : tuple(static_cast(nullptr), DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + template + UniquePtr(UniquePtr&& other, + typename EnableIf::Pointer, + Pointer>::value && + !IsArray::value && + (IsReference::value + ? IsSame::value + : IsConvertible::value), + int>::Type dummy = 0) + : tuple(other.release(), Forward(other.getDeleter())) + { + } + + ~UniquePtr() { + reset(nullptr); + } + + UniquePtr& operator=(UniquePtr&& other) { + reset(other.release()); + getDeleter() = Forward(other.getDeleter()); + return *this; + } + + template + UniquePtr& operator=(UniquePtr&& other) + { + static_assert(IsConvertible::Pointer, Pointer>::value, + "incompatible UniquePtr pointees"); + static_assert(!IsArray::value, + "can't assign from UniquePtr holding an array"); + + reset(other.release()); + getDeleter() = Forward(other.getDeleter()); + return *this; + } + + UniquePtr& operator=(NullptrT n) { + MOZ_ASSERT(n == nullptr); + reset(nullptr); + return *this; + } + + T& operator*() const { return *get(); } + Pointer operator->() const { + MOZ_ASSERT(get(), "dereferencing a UniquePtr containing nullptr"); + return get(); + } + + Pointer get() const { return ptr(); } + + DeleterType& getDeleter() { return del(); } + const DeleterType& getDeleter() const { return del(); } + + private: + typedef void (UniquePtr::* ConvertibleToBool)(double, char); + void nonNull(double, char) {} + + public: + operator ConvertibleToBool() const { + return get() != nullptr ? &UniquePtr::nonNull : nullptr; + } + + Pointer release() { + Pointer p = ptr(); + ptr() = nullptr; + return p; + } + + void reset(Pointer p = Pointer()) { + Pointer old = ptr(); + ptr() = p; + if (old != nullptr) + getDeleter()(old); + } + + void swap(UniquePtr& other) { + tuple.swap(other.tuple); + } + + private: + UniquePtr(const UniquePtr& other) MOZ_DELETE; // construct using Move()! + void operator=(const UniquePtr& other) MOZ_DELETE; // assign using Move()! +}; + +// In case you didn't read the comment by the main definition (you should!): the +// UniquePtr specialization exists to manage array pointers. It deletes +// such pointers using delete[], it will reject construction and modification +// attempts using U* or U[]. Otherwise it works like the normal UniquePtr. +template +class UniquePtr +{ + public: + typedef T* Pointer; + typedef T ElementType; + typedef D DeleterType; + + private: + Pair tuple; + + public: + /** + * Construct a UniquePtr containing nullptr. + */ + MOZ_CONSTEXPR UniquePtr() + : tuple(static_cast(nullptr), DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + /** + * Construct a UniquePtr containing |p|. + */ + explicit UniquePtr(Pointer p) + : tuple(p, DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + private: + // delete[] knows how to handle *only* an array of a single class type. For + // delete[] to work correctly, it must know the size of each element, the + // fields and base classes of each element requiring destruction, and so on. + // So forbid all overloads which would end up invoking delete[] on a pointer + // of the wrong type. + template + UniquePtr(U&& u, + typename EnableIf::value && + IsConvertible::value, + int>::Type dummy = 0) + MOZ_DELETE; + + public: + UniquePtr(Pointer p, + typename Conditional::value, + D, + const D&>::Type d1) + : tuple(p, d1) + {} + + // If you encounter an error with MSVC10 about RemoveReference below, along + // the lines that "more than one partial specialization matches the template + // argument list": don't use UniquePtr! See the + // comment by this constructor in the non-T[] specialization above. + UniquePtr(Pointer p, + typename RemoveReference::Type&& d2) + : tuple(p, Move(d2)) + { + static_assert(!IsReference::value, + "rvalue deleter can't be stored by reference"); + } + + private: + // Forbidden for the same reasons as stated above. + template + UniquePtr(U&& u, V&& v, + typename EnableIf::value && + IsConvertible::value, + int>::Type dummy = 0) + MOZ_DELETE; + + public: + UniquePtr(UniquePtr&& other) + : tuple(other.release(), Forward(other.getDeleter())) + {} + + template + UniquePtr(N, + typename EnableIf::value, int>::Type dummy = 0) + : tuple(static_cast(nullptr), DeleterType()) + { + static_assert(!IsPointer::value, "must provide a deleter instance"); + static_assert(!IsReference::value, "must provide a deleter instance"); + } + + ~UniquePtr() { + reset(nullptr); + } + + UniquePtr& operator=(UniquePtr&& other) { + reset(other.release()); + getDeleter() = Forward(other.getDeleter()); + return *this; + } + + UniquePtr& operator=(NullptrT) { + reset(); + return *this; + } + + T& operator[](decltype(sizeof(int)) i) const { return get()[i]; } + Pointer get() const { return tuple.first(); } + + DeleterType& getDeleter() { return tuple.second(); } + const DeleterType& getDeleter() const { return tuple.second(); } + + private: + typedef void (UniquePtr::* ConvertibleToBool)(double, char); + void nonNull(double, char) {} + + public: + operator ConvertibleToBool() const { + return get() != nullptr ? &UniquePtr::nonNull : nullptr; + } + + Pointer release() { + Pointer p = tuple.first(); + tuple.first() = nullptr; + return p; + } + + void reset(Pointer p = Pointer()) { + Pointer old = tuple.first(); + tuple.first() = p; + if (old != nullptr) + tuple.second()(old); + } + + private: + // Kill off all remaining overloads that aren't true nullptr (the overload + // above should handle that) or emulated nullptr (which acts like int/long + // on gcc 4.4/4.5). + template + void reset(U, + typename EnableIf::value && + !IsSame::Type>::value, + int>::Type dummy = 0) + MOZ_DELETE; + + public: + void swap(UniquePtr& other) { + tuple.swap(other.tuple); + } + + private: + UniquePtr(const UniquePtr& other) MOZ_DELETE; // construct using Move()! + void operator=(const UniquePtr& other) MOZ_DELETE; // assign using Move()! +}; + +/** A default deletion policy using plain old operator delete. */ +template +class DefaultDelete +{ + public: + MOZ_CONSTEXPR DefaultDelete() {} + + template + DefaultDelete(const DefaultDelete& other, + typename EnableIf::value, + int>::Type dummy = 0) + {} + + void operator()(T* ptr) const { + static_assert(sizeof(T) > 0, "T must be complete"); + delete ptr; + } +}; + +/** A default deletion policy using operator delete[]. */ +template +class DefaultDelete +{ + public: + MOZ_CONSTEXPR DefaultDelete() {} + + void operator()(T* ptr) const { + static_assert(sizeof(T) > 0, "T must be complete"); + delete[] ptr; + } + + private: + template + void operator()(U* ptr) const MOZ_DELETE; +}; + +template +void +Swap(UniquePtr& x, UniquePtr& y) +{ + x.swap(y); +} + +template +bool +operator==(const UniquePtr& x, const UniquePtr& y) +{ + return x.get() == y.get(); +} + +template +bool +operator!=(const UniquePtr& x, const UniquePtr& y) +{ + return x.get() != y.get(); +} + +template +bool +operator==(const UniquePtr& x, NullptrT n) +{ + MOZ_ASSERT(n == nullptr); + return !x; +} + +template +bool +operator==(NullptrT n, const UniquePtr& x) +{ + MOZ_ASSERT(n == nullptr); + return !x; +} + +template +bool +operator!=(const UniquePtr& x, NullptrT n) +{ + MOZ_ASSERT(n == nullptr); + return bool(x); +} + +template +bool +operator!=(NullptrT n, const UniquePtr& x) +{ + MOZ_ASSERT(n == nullptr); + return bool(x); +} + +// No operator<, operator>, operator<=, operator>= for now because simplicity. + +namespace detail { + +template +struct UniqueSelector +{ + typedef UniquePtr SingleObject; +}; + +template +struct UniqueSelector +{ + typedef UniquePtr UnknownBound; +}; + +template +struct UniqueSelector +{ + typedef UniquePtr KnownBound; +}; + +} // namespace detail + +// We don't have variadic template support everywhere, so just hard-code arities +// 0-4 for now. If you need more arguments, feel free to add the extra +// overloads. +// +// Beware! Due to lack of true nullptr support in gcc 4.4 and 4.5, passing +// literal nullptr to MakeUnique will not work on some platforms. See Move.h +// for more details. + +template +typename detail::UniqueSelector::SingleObject +MakeUnique() +{ + return UniquePtr(new T()); +} + +template +typename detail::UniqueSelector::SingleObject +MakeUnique(A1&& a1) +{ + return UniquePtr(new T(Forward(a1))); +} + +template +typename detail::UniqueSelector::SingleObject +MakeUnique(A1&& a1, A2&& a2) +{ + return UniquePtr(new T(Forward(a1), Forward(a2))); +} + +template +typename detail::UniqueSelector::SingleObject +MakeUnique(A1&& a1, A2&& a2, A3&& a3) +{ + return UniquePtr(new T(Forward(a1), Forward(a2), Forward(a3))); +} + +template +typename detail::UniqueSelector::SingleObject +MakeUnique(A1&& a1, A2&& a2, A3&& a3, A4&& a4) +{ + return UniquePtr(new T(Forward(a1), Forward(a2), Forward(a3), Forward(a4))); +} + +template +typename detail::UniqueSelector::SingleObject +MakeUnique(A1&& a1, A2&& a2, A3&& a3, A4&& a4, A5&& a5) +{ + return UniquePtr(new T(Forward(a1), Forward(a2), Forward(a3), Forward(a4), Forward(a5))); +} + +template +typename detail::UniqueSelector::UnknownBound +MakeUnique(decltype(sizeof(int)) n) +{ + typedef typename RemoveExtent::Type ArrayType; + return UniquePtr(new ArrayType[n]()); +} + +template +typename detail::UniqueSelector::KnownBound +MakeUnique() MOZ_DELETE; + +template +typename detail::UniqueSelector::KnownBound +MakeUnique(A1&& a1) MOZ_DELETE; + +template +typename detail::UniqueSelector::KnownBound +MakeUnique(A1&& a1, A2&& a2) MOZ_DELETE; + +template +typename detail::UniqueSelector::KnownBound +MakeUnique(A1&& a1, A2&& a2, A3&& a3) MOZ_DELETE; + +template +typename detail::UniqueSelector::KnownBound +MakeUnique(A1&& a1, A2&& a2, A3&& a3, A4&& a4) MOZ_DELETE; + +} // namespace mozilla + +#endif /* mozilla_UniquePtr_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Vector.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Vector.h new file mode 100644 index 0000000000..8540caf476 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/Vector.h @@ -0,0 +1,1280 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A type/length-parametrized vector class. */ + +#ifndef mozilla_Vector_h +#define mozilla_Vector_h + +#include "mozilla/Alignment.h" +#include "mozilla/AllocPolicy.h" +#include "mozilla/ArrayUtils.h" // for PointerRangeSize +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/MathAlgorithms.h" +#include "mozilla/MemoryReporting.h" +#include "mozilla/Move.h" +#include "mozilla/NullPtr.h" +#include "mozilla/ReentrancyGuard.h" +#include "mozilla/TemplateLib.h" +#include "mozilla/TypeTraits.h" + +#include // for placement new + +/* Silence dire "bugs in previous versions of MSVC have been fixed" warnings */ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4345) +#endif + +namespace mozilla { + +template +class VectorBase; + +namespace detail { + +/* + * Check that the given capacity wastes the minimal amount of space if + * allocated on the heap. This means that aCapacity*sizeof(T) is as close to a + * power-of-two as possible. growStorageBy() is responsible for ensuring this. + */ +template +static bool CapacityHasExcessSpace(size_t aCapacity) +{ + size_t size = aCapacity * sizeof(T); + return RoundUpPow2(size) - size >= sizeof(T); +} + +/* + * This template class provides a default implementation for vector operations + * when the element type is not known to be a POD, as judged by IsPod. + */ +template +struct VectorImpl +{ + /* Destroys constructed objects in the range [aBegin, aEnd). */ + static inline void destroy(T* aBegin, T* aEnd) + { + MOZ_ASSERT(aBegin <= aEnd); + for (T* p = aBegin; p < aEnd; ++p) { + p->~T(); + } + } + + /* Constructs objects in the uninitialized range [aBegin, aEnd). */ + static inline void initialize(T* aBegin, T* aEnd) + { + MOZ_ASSERT(aBegin <= aEnd); + for (T* p = aBegin; p < aEnd; ++p) { + new(p) T(); + } + } + + /* + * Copy-constructs objects in the uninitialized range + * [aDst, aDst+(aSrcEnd-aSrcStart)) from the range [aSrcStart, aSrcEnd). + */ + template + static inline void copyConstruct(T* aDst, + const U* aSrcStart, const U* aSrcEnd) + { + MOZ_ASSERT(aSrcStart <= aSrcEnd); + for (const U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) { + new(aDst) T(*p); + } + } + + /* + * Move-constructs objects in the uninitialized range + * [aDst, aDst+(aSrcEnd-aSrcStart)) from the range [aSrcStart, aSrcEnd). + */ + template + static inline void moveConstruct(T* aDst, U* aSrcStart, U* aSrcEnd) + { + MOZ_ASSERT(aSrcStart <= aSrcEnd); + for (U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) { + new(aDst) T(Move(*p)); + } + } + + /* + * Copy-constructs objects in the uninitialized range [aDst, aDst+aN) from + * the same object aU. + */ + template + static inline void copyConstructN(T* aDst, size_t aN, const U& aU) + { + for (T* end = aDst + aN; aDst < end; ++aDst) { + new(aDst) T(aU); + } + } + + /* + * Grows the given buffer to have capacity aNewCap, preserving the objects + * constructed in the range [begin, end) and updating aV. Assumes that (1) + * aNewCap has not overflowed, and (2) multiplying aNewCap by sizeof(T) will + * not overflow. + */ + static inline bool + growTo(VectorBase& aV, size_t aNewCap) + { + MOZ_ASSERT(!aV.usingInlineStorage()); + MOZ_ASSERT(!CapacityHasExcessSpace(aNewCap)); + T* newbuf = reinterpret_cast(aV.malloc_(aNewCap * sizeof(T))); + if (!newbuf) { + return false; + } + T* dst = newbuf; + T* src = aV.beginNoCheck(); + for (; src < aV.endNoCheck(); ++dst, ++src) { + new(dst) T(Move(*src)); + } + VectorImpl::destroy(aV.beginNoCheck(), aV.endNoCheck()); + aV.free_(aV.mBegin); + aV.mBegin = newbuf; + /* aV.mLength is unchanged. */ + aV.mCapacity = aNewCap; + return true; + } +}; + +/* + * This partial template specialization provides a default implementation for + * vector operations when the element type is known to be a POD, as judged by + * IsPod. + */ +template +struct VectorImpl +{ + static inline void destroy(T*, T*) {} + + static inline void initialize(T* aBegin, T* aEnd) + { + /* + * You would think that memset would be a big win (or even break even) + * when we know T is a POD. But currently it's not. This is probably + * because |append| tends to be given small ranges and memset requires + * a function call that doesn't get inlined. + * + * memset(aBegin, 0, sizeof(T) * (aEnd - aBegin)); + */ + MOZ_ASSERT(aBegin <= aEnd); + for (T* p = aBegin; p < aEnd; ++p) { + new(p) T(); + } + } + + template + static inline void copyConstruct(T* aDst, + const U* aSrcStart, const U* aSrcEnd) + { + /* + * See above memset comment. Also, notice that copyConstruct is + * currently templated (T != U), so memcpy won't work without + * requiring T == U. + * + * memcpy(aDst, aSrcStart, sizeof(T) * (aSrcEnd - aSrcStart)); + */ + MOZ_ASSERT(aSrcStart <= aSrcEnd); + for (const U* p = aSrcStart; p < aSrcEnd; ++p, ++aDst) { + *aDst = *p; + } + } + + template + static inline void moveConstruct(T* aDst, + const U* aSrcStart, const U* aSrcEnd) + { + copyConstruct(aDst, aSrcStart, aSrcEnd); + } + + static inline void copyConstructN(T* aDst, size_t aN, const T& aT) + { + for (T* end = aDst + aN; aDst < end; ++aDst) { + *aDst = aT; + } + } + + static inline bool + growTo(VectorBase& aV, size_t aNewCap) + { + MOZ_ASSERT(!aV.usingInlineStorage()); + MOZ_ASSERT(!CapacityHasExcessSpace(aNewCap)); + size_t oldSize = sizeof(T) * aV.mCapacity; + size_t newSize = sizeof(T) * aNewCap; + T* newbuf = reinterpret_cast(aV.realloc_(aV.mBegin, oldSize, newSize)); + if (!newbuf) { + return false; + } + aV.mBegin = newbuf; + /* aV.mLength is unchanged. */ + aV.mCapacity = aNewCap; + return true; + } +}; + +} // namespace detail + +/* + * A CRTP base class for vector-like classes. Unless you really really want + * your own vector class -- and you almost certainly don't -- you should use + * mozilla::Vector instead! + * + * See mozilla::Vector for interface requirements. + */ +template +class VectorBase : private AllocPolicy +{ + /* utilities */ + + static const bool kElemIsPod = IsPod::value; + typedef detail::VectorImpl Impl; + friend struct detail::VectorImpl; + + bool growStorageBy(size_t aIncr); + bool convertToHeapStorage(size_t aNewCap); + + /* magic constants */ + + static const int kMaxInlineBytes = 1024; + + /* compute constants */ + + /* + * Consider element size to be 1 for buffer sizing if there are 0 inline + * elements. This allows us to compile when the definition of the element + * type is not visible here. + * + * Explicit specialization is only allowed at namespace scope, so in order + * to keep everything here, we use a dummy template parameter with partial + * specialization. + */ + template + struct ElemSize + { + static const size_t value = sizeof(T); + }; + template + struct ElemSize<0, Dummy> + { + static const size_t value = 1; + }; + + static const size_t kInlineCapacity = + tl::Min::value>::value; + + /* Calculate inline buffer size; avoid 0-sized array. */ + static const size_t kInlineBytes = + tl::Max<1, kInlineCapacity * ElemSize::value>::value; + + /* member data */ + + /* + * Pointer to the buffer, be it inline or heap-allocated. Only [mBegin, + * mBegin + mLength) hold valid constructed T objects. The range [mBegin + + * mLength, mBegin + mCapacity) holds uninitialized memory. The range + * [mBegin + mLength, mBegin + mReserved) also holds uninitialized memory + * previously allocated by a call to reserve(). + */ + T* mBegin; + + /* Number of elements in the vector. */ + size_t mLength; + + /* Max number of elements storable in the vector without resizing. */ + size_t mCapacity; + +#ifdef DEBUG + /* Max elements of reserved or used space in this vector. */ + size_t mReserved; +#endif + + /* Memory used for inline storage. */ + AlignedStorage mStorage; + +#ifdef DEBUG + friend class ReentrancyGuard; + bool mEntered; +#endif + + /* private accessors */ + + bool usingInlineStorage() const + { + return mBegin == const_cast(this)->inlineStorage(); + } + + T* inlineStorage() + { + return static_cast(mStorage.addr()); + } + + T* beginNoCheck() const + { + return mBegin; + } + + T* endNoCheck() + { + return mBegin + mLength; + } + + const T* endNoCheck() const + { + return mBegin + mLength; + } + +#ifdef DEBUG + size_t reserved() const + { + MOZ_ASSERT(mReserved <= mCapacity); + MOZ_ASSERT(mLength <= mReserved); + return mReserved; + } +#endif + + /* Append operations guaranteed to succeed due to pre-reserved space. */ + template void internalAppend(U&& aU); + template + void internalAppendAll(const VectorBase& aU); + void internalAppendN(const T& aT, size_t aN); + template void internalAppend(const U* aBegin, size_t aLength); + +public: + static const size_t sMaxInlineStorage = N; + + typedef T ElementType; + + explicit VectorBase(AllocPolicy = AllocPolicy()); + explicit VectorBase(ThisVector&&); /* Move constructor. */ + ThisVector& operator=(ThisVector&&); /* Move assignment. */ + ~VectorBase(); + + /* accessors */ + + const AllocPolicy& allocPolicy() const { return *this; } + + AllocPolicy& allocPolicy() { return *this; } + + enum { InlineLength = N }; + + size_t length() const { return mLength; } + + bool empty() const { return mLength == 0; } + + size_t capacity() const { return mCapacity; } + + T* begin() + { + MOZ_ASSERT(!mEntered); + return mBegin; + } + + const T* begin() const + { + MOZ_ASSERT(!mEntered); + return mBegin; + } + + T* end() + { + MOZ_ASSERT(!mEntered); + return mBegin + mLength; + } + + const T* end() const + { + MOZ_ASSERT(!mEntered); + return mBegin + mLength; + } + + T& operator[](size_t aIndex) + { + MOZ_ASSERT(!mEntered); + MOZ_ASSERT(aIndex < mLength); + return begin()[aIndex]; + } + + const T& operator[](size_t aIndex) const + { + MOZ_ASSERT(!mEntered); + MOZ_ASSERT(aIndex < mLength); + return begin()[aIndex]; + } + + T& back() + { + MOZ_ASSERT(!mEntered); + MOZ_ASSERT(!empty()); + return *(end() - 1); + } + + const T& back() const + { + MOZ_ASSERT(!mEntered); + MOZ_ASSERT(!empty()); + return *(end() - 1); + } + + class Range + { + friend class VectorBase; + T* mCur; + T* mEnd; + Range(T* aCur, T* aEnd) + : mCur(aCur) + , mEnd(aEnd) + { + MOZ_ASSERT(aCur <= aEnd); + } + + public: + Range() {} + bool empty() const { return mCur == mEnd; } + size_t remain() const { return PointerRangeSize(mCur, mEnd); } + T& front() const { MOZ_ASSERT(!empty()); return *mCur; } + void popFront() { MOZ_ASSERT(!empty()); ++mCur; } + T popCopyFront() { MOZ_ASSERT(!empty()); return *mCur++; } + }; + + Range all() { return Range(begin(), end()); } + + /* mutators */ + + /** + * Given that the vector is empty and has no inline storage, grow to + * |capacity|. + */ + bool initCapacity(size_t aRequest); + + /** + * If reserve(length() + N) succeeds, the N next appends are guaranteed to + * succeed. + */ + bool reserve(size_t aRequest); + + /** + * Destroy elements in the range [end() - aIncr, end()). Does not deallocate + * or unreserve storage for those elements. + */ + void shrinkBy(size_t aIncr); + + /** Grow the vector by aIncr elements. */ + bool growBy(size_t aIncr); + + /** Call shrinkBy or growBy based on whether newSize > length(). */ + bool resize(size_t aNewLength); + + /** + * Increase the length of the vector, but don't initialize the new elements + * -- leave them as uninitialized memory. + */ + bool growByUninitialized(size_t aIncr); + bool resizeUninitialized(size_t aNewLength); + + /** Shorthand for shrinkBy(length()). */ + void clear(); + + /** Clears and releases any heap-allocated storage. */ + void clearAndFree(); + + /** + * If true, appending |aNeeded| elements won't reallocate elements storage. + * This *doesn't* mean that infallibleAppend may be used! You still must + * reserve the extra space, even if this method indicates that appends won't + * need to reallocate elements storage. + */ + bool canAppendWithoutRealloc(size_t aNeeded) const; + + /** Potentially fallible append operations. */ + + /** + * This can take either a T& or a T&&. Given a T&&, it moves |aU| into the + * vector, instead of copying it. If it fails, |aU| is left unmoved. ("We are + * not amused.") + */ + template bool append(U&& aU); + + template + bool appendAll(const VectorBase& aU); + bool appendN(const T& aT, size_t aN); + template bool append(const U* aBegin, const U* aEnd); + template bool append(const U* aBegin, size_t aLength); + + /* + * Guaranteed-infallible append operations for use upon vectors whose + * memory has been pre-reserved. Don't use this if you haven't reserved the + * memory! + */ + template void infallibleAppend(U&& aU) + { + internalAppend(Forward(aU)); + } + void infallibleAppendN(const T& aT, size_t aN) + { + internalAppendN(aT, aN); + } + template void infallibleAppend(const U* aBegin, const U* aEnd) + { + internalAppend(aBegin, PointerRangeSize(aBegin, aEnd)); + } + template void infallibleAppend(const U* aBegin, size_t aLength) + { + internalAppend(aBegin, aLength); + } + + void popBack(); + + T popCopy(); + + /** + * Transfers ownership of the internal buffer used by this vector to the + * caller. (It's the caller's responsibility to properly deallocate this + * buffer, in accordance with this vector's AllocPolicy.) After this call, + * the vector is empty. Since the returned buffer may need to be allocated + * (if the elements are currently stored in-place), the call can fail, + * returning nullptr. + * + * N.B. Although a T*, only the range [0, length()) is constructed. + */ + T* extractRawBuffer(); + + /** + * Transfer ownership of an array of objects into the vector. The caller + * must have allocated the array in accordance with this vector's + * AllocPolicy. + * + * N.B. This call assumes that there are no uninitialized elements in the + * passed array. + */ + void replaceRawBuffer(T* aP, size_t aLength); + + /** + * Places |aVal| at position |aP|, shifting existing elements from |aP| onward + * one position higher. On success, |aP| should not be reused because it'll + * be a dangling pointer if reallocation of the vector storage occurred; the + * return value should be used instead. On failure, nullptr is returned. + * + * Example usage: + * + * if (!(p = vec.insert(p, val))) { + * + * } + * + * + * This is inherently a linear-time operation. Be careful! + */ + template + T* insert(T* aP, U&& aVal); + + /** + * Removes the element |aT|, which must fall in the bounds [begin, end), + * shifting existing elements from |aT + 1| onward one position lower. + */ + void erase(T* aT); + + /** + * Removes the elements [|aBegin|, |aEnd|), which must fall in the bounds + * [begin, end), shifting existing elements from |aEnd + 1| onward to aBegin's + * old position. + */ + void erase(T* aBegin, T* aEnd); + + /** + * Measure the size of the vector's heap-allocated storage. + */ + size_t sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const; + + /** + * Like sizeOfExcludingThis, but also measures the size of the vector + * object (which must be heap-allocated) itself. + */ + size_t sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const; + + void swap(ThisVector& aOther); + +private: + VectorBase(const VectorBase&) MOZ_DELETE; + void operator=(const VectorBase&) MOZ_DELETE; + + /* Move-construct/assign only from our derived class, ThisVector. */ + VectorBase(VectorBase&&) MOZ_DELETE; + void operator=(VectorBase&&) MOZ_DELETE; +}; + +/* This does the re-entrancy check plus several other sanity checks. */ +#define MOZ_REENTRANCY_GUARD_ET_AL \ + ReentrancyGuard g(*this); \ + MOZ_ASSERT_IF(usingInlineStorage(), mCapacity == kInlineCapacity); \ + MOZ_ASSERT(reserved() <= mCapacity); \ + MOZ_ASSERT(mLength <= reserved()); \ + MOZ_ASSERT(mLength <= mCapacity) + +/* Vector Implementation */ + +template +MOZ_ALWAYS_INLINE +VectorBase::VectorBase(AP aAP) + : AP(aAP) + , mLength(0) + , mCapacity(kInlineCapacity) +#ifdef DEBUG + , mReserved(kInlineCapacity) + , mEntered(false) +#endif +{ + mBegin = static_cast(mStorage.addr()); +} + +/* Move constructor. */ +template +MOZ_ALWAYS_INLINE +VectorBase::VectorBase(TV&& aRhs) + : AllocPolicy(Move(aRhs)) +#ifdef DEBUG + , mEntered(false) +#endif +{ + mLength = aRhs.mLength; + mCapacity = aRhs.mCapacity; +#ifdef DEBUG + mReserved = aRhs.mReserved; +#endif + + if (aRhs.usingInlineStorage()) { + /* We can't move the buffer over in this case, so copy elements. */ + mBegin = static_cast(mStorage.addr()); + Impl::moveConstruct(mBegin, aRhs.beginNoCheck(), aRhs.endNoCheck()); + /* + * Leave aRhs's mLength, mBegin, mCapacity, and mReserved as they are. + * The elements in its in-line storage still need to be destroyed. + */ + } else { + /* + * Take src's buffer, and turn src into an empty vector using + * in-line storage. + */ + mBegin = aRhs.mBegin; + aRhs.mBegin = static_cast(aRhs.mStorage.addr()); + aRhs.mCapacity = kInlineCapacity; + aRhs.mLength = 0; +#ifdef DEBUG + aRhs.mReserved = kInlineCapacity; +#endif + } +} + +/* Move assignment. */ +template +MOZ_ALWAYS_INLINE TV& +VectorBase::operator=(TV&& aRhs) +{ + MOZ_ASSERT(this != &aRhs, "self-move assignment is prohibited"); + TV* tv = static_cast(this); + tv->~TV(); + new(tv) TV(Move(aRhs)); + return *tv; +} + +template +MOZ_ALWAYS_INLINE +VectorBase::~VectorBase() +{ + MOZ_REENTRANCY_GUARD_ET_AL; + Impl::destroy(beginNoCheck(), endNoCheck()); + if (!usingInlineStorage()) { + this->free_(beginNoCheck()); + } +} + +/* + * This function will create a new heap buffer with capacity aNewCap, + * move all elements in the inline buffer to this new buffer, + * and fail on OOM. + */ +template +inline bool +VectorBase::convertToHeapStorage(size_t aNewCap) +{ + MOZ_ASSERT(usingInlineStorage()); + + /* Allocate buffer. */ + MOZ_ASSERT(!detail::CapacityHasExcessSpace(aNewCap)); + T* newBuf = reinterpret_cast(this->malloc_(aNewCap * sizeof(T))); + if (!newBuf) { + return false; + } + + /* Copy inline elements into heap buffer. */ + Impl::moveConstruct(newBuf, beginNoCheck(), endNoCheck()); + Impl::destroy(beginNoCheck(), endNoCheck()); + + /* Switch in heap buffer. */ + mBegin = newBuf; + /* mLength is unchanged. */ + mCapacity = aNewCap; + return true; +} + +template +MOZ_NEVER_INLINE bool +VectorBase::growStorageBy(size_t aIncr) +{ + MOZ_ASSERT(mLength + aIncr > mCapacity); + MOZ_ASSERT_IF(!usingInlineStorage(), + !detail::CapacityHasExcessSpace(mCapacity)); + + /* + * When choosing a new capacity, its size should is as close to 2**N bytes + * as possible. 2**N-sized requests are best because they are unlikely to + * be rounded up by the allocator. Asking for a 2**N number of elements + * isn't as good, because if sizeof(T) is not a power-of-two that would + * result in a non-2**N request size. + */ + + size_t newCap; + + if (aIncr == 1) { + if (usingInlineStorage()) { + /* This case occurs in ~70--80% of the calls to this function. */ + size_t newSize = + tl::RoundUpPow2<(kInlineCapacity + 1) * sizeof(T)>::value; + newCap = newSize / sizeof(T); + goto convert; + } + + if (mLength == 0) { + /* This case occurs in ~0--10% of the calls to this function. */ + newCap = 1; + goto grow; + } + + /* This case occurs in ~15--20% of the calls to this function. */ + + /* + * Will mLength * 4 *sizeof(T) overflow? This condition limits a vector + * to 1GB of memory on a 32-bit system, which is a reasonable limit. It + * also ensures that + * + * static_cast(end()) - static_cast(begin()) + * + * doesn't overflow ptrdiff_t (see bug 510319). + */ + if (mLength & tl::MulOverflowMask<4 * sizeof(T)>::value) { + this->reportAllocOverflow(); + return false; + } + + /* + * If we reach here, the existing capacity will have a size that is already + * as close to 2^N as sizeof(T) will allow. Just double the capacity, and + * then there might be space for one more element. + */ + newCap = mLength * 2; + if (detail::CapacityHasExcessSpace(newCap)) { + newCap += 1; + } + } else { + /* This case occurs in ~2% of the calls to this function. */ + size_t newMinCap = mLength + aIncr; + + /* Did mLength + aIncr overflow? Will newCap * sizeof(T) overflow? */ + if (newMinCap < mLength || + newMinCap & tl::MulOverflowMask<2 * sizeof(T)>::value) + { + this->reportAllocOverflow(); + return false; + } + + size_t newMinSize = newMinCap * sizeof(T); + size_t newSize = RoundUpPow2(newMinSize); + newCap = newSize / sizeof(T); + } + + if (usingInlineStorage()) { +convert: + return convertToHeapStorage(newCap); + } + +grow: + return Impl::growTo(*this, newCap); +} + +template +inline bool +VectorBase::initCapacity(size_t aRequest) +{ + MOZ_ASSERT(empty()); + MOZ_ASSERT(usingInlineStorage()); + if (aRequest == 0) { + return true; + } + T* newbuf = reinterpret_cast(this->malloc_(aRequest * sizeof(T))); + if (!newbuf) { + return false; + } + mBegin = newbuf; + mCapacity = aRequest; +#ifdef DEBUG + mReserved = aRequest; +#endif + return true; +} + +template +inline bool +VectorBase::reserve(size_t aRequest) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + if (aRequest > mCapacity && !growStorageBy(aRequest - mLength)) { + return false; + } +#ifdef DEBUG + if (aRequest > mReserved) { + mReserved = aRequest; + } + MOZ_ASSERT(mLength <= mReserved); + MOZ_ASSERT(mReserved <= mCapacity); +#endif + return true; +} + +template +inline void +VectorBase::shrinkBy(size_t aIncr) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + MOZ_ASSERT(aIncr <= mLength); + Impl::destroy(endNoCheck() - aIncr, endNoCheck()); + mLength -= aIncr; +} + +template +MOZ_ALWAYS_INLINE bool +VectorBase::growBy(size_t aIncr) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + if (aIncr > mCapacity - mLength && !growStorageBy(aIncr)) { + return false; + } + MOZ_ASSERT(mLength + aIncr <= mCapacity); + T* newend = endNoCheck() + aIncr; + Impl::initialize(endNoCheck(), newend); + mLength += aIncr; +#ifdef DEBUG + if (mLength > mReserved) { + mReserved = mLength; + } +#endif + return true; +} + +template +MOZ_ALWAYS_INLINE bool +VectorBase::growByUninitialized(size_t aIncr) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + if (aIncr > mCapacity - mLength && !growStorageBy(aIncr)) { + return false; + } + MOZ_ASSERT(mLength + aIncr <= mCapacity); + mLength += aIncr; +#ifdef DEBUG + if (mLength > mReserved) { + mReserved = mLength; + } +#endif + return true; +} + +template +inline bool +VectorBase::resize(size_t aNewLength) +{ + size_t curLength = mLength; + if (aNewLength > curLength) { + return growBy(aNewLength - curLength); + } + shrinkBy(curLength - aNewLength); + return true; +} + +template +MOZ_ALWAYS_INLINE bool +VectorBase::resizeUninitialized(size_t aNewLength) +{ + size_t curLength = mLength; + if (aNewLength > curLength) { + return growByUninitialized(aNewLength - curLength); + } + shrinkBy(curLength - aNewLength); + return true; +} + +template +inline void +VectorBase::clear() +{ + MOZ_REENTRANCY_GUARD_ET_AL; + Impl::destroy(beginNoCheck(), endNoCheck()); + mLength = 0; +} + +template +inline void +VectorBase::clearAndFree() +{ + clear(); + + if (usingInlineStorage()) { + return; + } + this->free_(beginNoCheck()); + mBegin = static_cast(mStorage.addr()); + mCapacity = kInlineCapacity; +#ifdef DEBUG + mReserved = kInlineCapacity; +#endif +} + +template +inline bool +VectorBase::canAppendWithoutRealloc(size_t aNeeded) const +{ + return mLength + aNeeded <= mCapacity; +} + +template +template +MOZ_ALWAYS_INLINE void +VectorBase::internalAppendAll( + const VectorBase& aOther) +{ + internalAppend(aOther.begin(), aOther.length()); +} + +template +template +MOZ_ALWAYS_INLINE void +VectorBase::internalAppend(U&& aU) +{ + MOZ_ASSERT(mLength + 1 <= mReserved); + MOZ_ASSERT(mReserved <= mCapacity); + new(endNoCheck()) T(Forward(aU)); + ++mLength; +} + +template +MOZ_ALWAYS_INLINE bool +VectorBase::appendN(const T& aT, size_t aNeeded) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + if (mLength + aNeeded > mCapacity && !growStorageBy(aNeeded)) { + return false; + } +#ifdef DEBUG + if (mLength + aNeeded > mReserved) { + mReserved = mLength + aNeeded; + } +#endif + internalAppendN(aT, aNeeded); + return true; +} + +template +MOZ_ALWAYS_INLINE void +VectorBase::internalAppendN(const T& aT, size_t aNeeded) +{ + MOZ_ASSERT(mLength + aNeeded <= mReserved); + MOZ_ASSERT(mReserved <= mCapacity); + Impl::copyConstructN(endNoCheck(), aNeeded, aT); + mLength += aNeeded; +} + +template +template +inline T* +VectorBase::insert(T* aP, U&& aVal) +{ + MOZ_ASSERT(begin() <= aP); + MOZ_ASSERT(aP <= end()); + size_t pos = aP - begin(); + MOZ_ASSERT(pos <= mLength); + size_t oldLength = mLength; + if (pos == oldLength) { + if (!append(Forward(aVal))) { + return nullptr; + } + } else { + T oldBack = Move(back()); + if (!append(Move(oldBack))) { /* Dup the last element. */ + return nullptr; + } + for (size_t i = oldLength; i > pos; --i) { + (*this)[i] = Move((*this)[i - 1]); + } + (*this)[pos] = Forward(aVal); + } + return begin() + pos; +} + +template +inline void +VectorBase::erase(T* aIt) +{ + MOZ_ASSERT(begin() <= aIt); + MOZ_ASSERT(aIt < end()); + while (aIt + 1 < end()) { + *aIt = Move(*(aIt + 1)); + ++aIt; + } + popBack(); +} + +template +inline void +VectorBase::erase(T* aBegin, T* aEnd) +{ + MOZ_ASSERT(begin() <= aBegin); + MOZ_ASSERT(aBegin <= aEnd); + MOZ_ASSERT(aEnd <= end()); + while (aEnd < end()) { + *aBegin++ = Move(*aEnd++); + } + shrinkBy(aEnd - aBegin); +} + +template +template +MOZ_ALWAYS_INLINE bool +VectorBase::append(const U* aInsBegin, const U* aInsEnd) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + size_t aNeeded = PointerRangeSize(aInsBegin, aInsEnd); + if (mLength + aNeeded > mCapacity && !growStorageBy(aNeeded)) { + return false; + } +#ifdef DEBUG + if (mLength + aNeeded > mReserved) { + mReserved = mLength + aNeeded; + } +#endif + internalAppend(aInsBegin, aNeeded); + return true; +} + +template +template +MOZ_ALWAYS_INLINE void +VectorBase::internalAppend(const U* aInsBegin, size_t aInsLength) +{ + MOZ_ASSERT(mLength + aInsLength <= mReserved); + MOZ_ASSERT(mReserved <= mCapacity); + Impl::copyConstruct(endNoCheck(), aInsBegin, aInsBegin + aInsLength); + mLength += aInsLength; +} + +template +template +MOZ_ALWAYS_INLINE bool +VectorBase::append(U&& aU) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + if (mLength == mCapacity && !growStorageBy(1)) { + return false; + } +#ifdef DEBUG + if (mLength + 1 > mReserved) { + mReserved = mLength + 1; + } +#endif + internalAppend(Forward(aU)); + return true; +} + +template +template +MOZ_ALWAYS_INLINE bool +VectorBase::appendAll(const VectorBase& aOther) +{ + return append(aOther.begin(), aOther.length()); +} + +template +template +MOZ_ALWAYS_INLINE bool +VectorBase::append(const U* aInsBegin, size_t aInsLength) +{ + return append(aInsBegin, aInsBegin + aInsLength); +} + +template +MOZ_ALWAYS_INLINE void +VectorBase::popBack() +{ + MOZ_REENTRANCY_GUARD_ET_AL; + MOZ_ASSERT(!empty()); + --mLength; + endNoCheck()->~T(); +} + +template +MOZ_ALWAYS_INLINE T +VectorBase::popCopy() +{ + T ret = back(); + popBack(); + return ret; +} + +template +inline T* +VectorBase::extractRawBuffer() +{ + T* ret; + if (usingInlineStorage()) { + ret = reinterpret_cast(this->malloc_(mLength * sizeof(T))); + if (!ret) { + return nullptr; + } + Impl::copyConstruct(ret, beginNoCheck(), endNoCheck()); + Impl::destroy(beginNoCheck(), endNoCheck()); + /* mBegin, mCapacity are unchanged. */ + mLength = 0; + } else { + ret = mBegin; + mBegin = static_cast(mStorage.addr()); + mLength = 0; + mCapacity = kInlineCapacity; +#ifdef DEBUG + mReserved = kInlineCapacity; +#endif + } + return ret; +} + +template +inline void +VectorBase::replaceRawBuffer(T* aP, size_t aLength) +{ + MOZ_REENTRANCY_GUARD_ET_AL; + + /* Destroy what we have. */ + Impl::destroy(beginNoCheck(), endNoCheck()); + if (!usingInlineStorage()) { + this->free_(beginNoCheck()); + } + + /* Take in the new buffer. */ + if (aLength <= kInlineCapacity) { + /* + * We convert to inline storage if possible, even though aP might + * otherwise be acceptable. Maybe this behaviour should be + * specifiable with an argument to this function. + */ + mBegin = static_cast(mStorage.addr()); + mLength = aLength; + mCapacity = kInlineCapacity; + Impl::moveConstruct(mBegin, aP, aP + aLength); + Impl::destroy(aP, aP + aLength); + this->free_(aP); + } else { + mBegin = aP; + mLength = aLength; + mCapacity = aLength; + } +#ifdef DEBUG + mReserved = aLength; +#endif +} + +template +inline size_t +VectorBase::sizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const +{ + return usingInlineStorage() ? 0 : aMallocSizeOf(beginNoCheck()); +} + +template +inline size_t +VectorBase::sizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const +{ + return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf); +} + +template +inline void +VectorBase::swap(TV& aOther) +{ + static_assert(N == 0, + "still need to implement this for N != 0"); + + // This only works when inline storage is always empty. + if (!usingInlineStorage() && aOther.usingInlineStorage()) { + aOther.mBegin = mBegin; + mBegin = inlineStorage(); + } else if (usingInlineStorage() && !aOther.usingInlineStorage()) { + mBegin = aOther.mBegin; + aOther.mBegin = aOther.inlineStorage(); + } else if (!usingInlineStorage() && !aOther.usingInlineStorage()) { + Swap(mBegin, aOther.mBegin); + } else { + // This case is a no-op, since we'd set both to use their inline storage. + } + + Swap(mLength, aOther.mLength); + Swap(mCapacity, aOther.mCapacity); +#ifdef DEBUG + Swap(mReserved, aOther.mReserved); +#endif +} + +/* + * STL-like container providing a short-lived, dynamic buffer. Vector calls the + * constructors/destructors of all elements stored in its internal buffer, so + * non-PODs may be safely used. Additionally, Vector will store the first N + * elements in-place before resorting to dynamic allocation. + * + * T requirements: + * - default and copy constructible, assignable, destructible + * - operations do not throw + * N requirements: + * - any value, however, N is clamped to min/max values + * AllocPolicy: + * - see "Allocation policies" in AllocPolicy.h (defaults to + * mozilla::MallocAllocPolicy) + * + * Vector is not reentrant: T member functions called during Vector member + * functions must not call back into the same object! + */ +template +class Vector + : public VectorBase > +{ + typedef VectorBase Base; + +public: + explicit Vector(AllocPolicy alloc = AllocPolicy()) : Base(alloc) {} + Vector(Vector&& vec) : Base(Move(vec)) {} + Vector& operator=(Vector&& aOther) + { + return Base::operator=(Move(aOther)); + } +}; + +} // namespace mozilla + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif /* mozilla_Vector_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/WeakPtr.h b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/WeakPtr.h new file mode 100644 index 0000000000..07f00bc295 --- /dev/null +++ b/frameworks/js-bindings/external/spidermonkey/include/ohos/mozilla/WeakPtr.h @@ -0,0 +1,202 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Weak pointer functionality, implemented as a mixin for use with any class. */ + +/** + * SupportsWeakPtr lets you have a pointer to an object 'Foo' without affecting + * its lifetime. It works by creating a single shared reference counted object + * (WeakReference) that each WeakPtr will access 'Foo' through. This lets 'Foo' + * clear the pointer in the WeakReference without having to know about all of + * the WeakPtrs to it and allows the WeakReference to live beyond the lifetime + * of 'Foo'. + * + * PLEASE NOTE: This weak pointer implementation is not thread-safe. + * + * Note that when deriving from SupportsWeakPtr you should add + * MOZ_DECLARE_REFCOUNTED_TYPENAME(ClassName) to the public section of your + * class, where ClassName is the name of your class. + * + * The overhead of WeakPtr is that accesses to 'Foo' becomes an additional + * dereference, and an additional heap allocated pointer sized object shared + * between all of the WeakPtrs. + * + * Example of usage: + * + * // To have a class C support weak pointers, inherit from + * // SupportsWeakPtr. + * class C : public SupportsWeakPtr + * { + * public: + * MOZ_DECLARE_REFCOUNTED_TYPENAME(C) + * int mNum; + * void act(); + * }; + * + * C* ptr = new C(); + * + * // Get weak pointers to ptr. The first time asWeakPtr is called + * // a reference counted WeakReference object is created that + * // can live beyond the lifetime of 'ptr'. The WeakReference + * // object will be notified of 'ptr's destruction. + * WeakPtr weak = ptr->asWeakPtr(); + * WeakPtr other = ptr->asWeakPtr(); + * + * // Test a weak pointer for validity before using it. + * if (weak) { + * weak->mNum = 17; + * weak->act(); + * } + * + * // Destroying the underlying object clears weak pointers to it. + * delete ptr; + * + * MOZ_ASSERT(!weak, "Deleting |ptr| clears weak pointers to it."); + * MOZ_ASSERT(!other, "Deleting |ptr| clears all weak pointers to it."); + * + * WeakPtr is typesafe and may be used with any class. It is not required that + * the class be reference-counted or allocated in any particular way. + * + * The API was loosely inspired by Chromium's weak_ptr.h: + * http://src.chromium.org/svn/trunk/src/base/memory/weak_ptr.h + */ + +#ifndef mozilla_WeakPtr_h +#define mozilla_WeakPtr_h + +#include "mozilla/ArrayUtils.h" +#include "mozilla/Assertions.h" +#include "mozilla/NullPtr.h" +#include "mozilla/RefPtr.h" +#include "mozilla/TypeTraits.h" + +#include + +namespace mozilla { + +template class WeakPtrBase; +template class SupportsWeakPtrBase; + +namespace detail { + +// This can live beyond the lifetime of the class derived from +// SupportsWeakPtrBase. +template +class WeakReference : public ::mozilla::RefCounted > +{ +public: + explicit WeakReference(T* p) : mPtr(p) {} + + T* get() const { return mPtr; } + +#ifdef MOZ_REFCOUNTED_LEAK_CHECKING +#ifdef XP_WIN +#define snprintf _snprintf +#endif + const char* typeName() const + { + static char nameBuffer[1024]; + const char* innerType = mPtr->typeName(); + // We could do fancier length checks at runtime, but innerType is + // controlled by us so we can ensure that this never causes a buffer + // overflow by this assertion. + MOZ_ASSERT(strlen(innerType) + sizeof("WeakReference<>") < + ArrayLength(nameBuffer), + "Exceedingly large type name"); + snprintf(nameBuffer, ArrayLength(nameBuffer), "WeakReference<%s>", + innerType); + // This is usually not OK, but here we are returning a pointer to a static + // buffer which will immediately be used by the caller. + return nameBuffer; + } + + size_t typeSize() const { return sizeof(*this); } +#undef snprintf +#endif + +private: + friend class WeakPtrBase >; + friend class SupportsWeakPtrBase >; + + void detach() { mPtr = nullptr; } + + T* mPtr; +}; + +} // namespace detail + +template +class SupportsWeakPtrBase +{ +public: + WeakPtrBase asWeakPtr() + { + if (!weakRef) { + weakRef = new WeakReference(static_cast(this)); + } + return WeakPtrBase(weakRef); + } + +protected: + ~SupportsWeakPtrBase() + { + static_assert(IsBaseOf, T>::value, + "T must derive from SupportsWeakPtrBase"); + if (weakRef) { + weakRef->detach(); + } + } + +private: + friend class WeakPtrBase; + + RefPtr weakRef; +}; + +template +class SupportsWeakPtr : public SupportsWeakPtrBase > +{ +}; + +template +class WeakPtrBase +{ +public: + WeakPtrBase(const WeakPtrBase& aOther) + : mRef(aOther.mRef) + {} + + // Ensure that mRef is dereferenceable in the uninitialized state. + WeakPtrBase() : mRef(new WeakReference(nullptr)) {} + + operator T*() const { return mRef->get(); } + T& operator*() const { return *mRef->get(); } + + T* operator->() const { return mRef->get(); } + + T* get() const { return mRef->get(); } + +private: + friend class SupportsWeakPtrBase; + + explicit WeakPtrBase(const RefPtr &aOther) : mRef(aOther) {} + + RefPtr mRef; +}; + +template +class WeakPtr : public WeakPtrBase > +{ + typedef WeakPtrBase > Base; +public: + WeakPtr(const WeakPtr& aOther) : Base(aOther) {} + MOZ_IMPLICIT WeakPtr(const Base& aOther) : Base(aOther) {} + WeakPtr() {} +}; + +} // namespace mozilla + +#endif /* mozilla_WeakPtr_h */ diff --git a/frameworks/js-bindings/external/spidermonkey/prebuilt/ohos/libjs_static.a b/frameworks/js-bindings/external/spidermonkey/prebuilt/ohos/libjs_static.a new file mode 100644 index 0000000000000000000000000000000000000000..1455c1989ab23022680f0142fc0e32f5f347c128 GIT binary patch literal 5924450 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

T`s8(hbLuLsA4t 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 z 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%0DHUw{_b-4yCV3z`E9-D!r#pcSbvAM5aX+% zZE3LY-qIjwhqSfOJVMCqBl~Vf-6})9JHq|S9jH^8@M&4F_YCOhV%W@!!PG_Tr#v(< zbw$?B5zxzaw)M~)>f5GTTc>;1_e|T-QLy!SX4^rGW5mwM#>u|Lwkcm-u)RGP+k{{% z<6wK_pZWrcZSTZ*w(D=l?3#Sa5wz!I$E1g@?}pn_Ax~E@wY}6!IriLJedvRR+804@ z+gWeVk=|hczTS$U3+SqJUK?~|bwxfPWk<`ug^I&;#P6_0991NP*Al zMSVVTRj}>&vLS7mm?wB!y1E#;LjCTW1zim@C761xDi;w_zUZzPujMC+YX?*j^cIPxKk5OW0g9Y%T>hHybwB3Y)tVzO)SfD^raDUxc4| z9X3aO<|EeTd|eWK$VRL- zCPkC*SFMkJo=}j0fP=EJD`3sEqJ5aAE|Hqe!kMeCH8W(M@#FaQ*h!aW=7ov?h%Z*2Khc4C^3_Ov6 zv`<_$4E1w3=3)a`uS2J{EnhbTesXAAt2ZHk@>o-U7ksimrzm4;)7~`0@6Sa7GxJ-a z%O69>$Vb|p!_4OEFY)O~#`H@}ew&m}g(<|?%`cy;0&Q97w`Hb}&TmIt$epJ7{21jx z`Mn?XJcqP7jJYbzA#FYg+r%8w<|C=GIiwam>+y3_rrC$HjnWeFG3YB0AM&fj=PvX& z9&+Zsn%-yjeG&27&hzDa0nebZT**&EvfG@j3m&1aorJfF{F#Cg6?Bm3?*MocyPtSy5kZZ2xLiJOaxj09cWT+%xm zhcu^|efRn07@b#S{YB>$S%1-a#kZrsP0*j66NK(Wk4bfyXiji2I!rQ8w+C}ex=)%p z20j{Xqk)f(&Itznvbh1e7)&`V2%W|_8~xw7Ih5!9v^r^Ahkk>M|6~rO95S?v&xO6U z48rGX`T>0|bSZh%J~stEH`C)ert9y#9sR7RO&am9kQZ~SKcu-HJ0I|Ow8eu1&1<5J zo`de}ye5q);7gm6%m?Us&24B0XkPR5=L4=l-{W%l{i3$sb@SWMKKT8Qplv4#rJeX| za0uFoU^}fVP}@N3f4$sZbi$96BVQS)^AU`3TG94qL5I{%QoBv-f|L)8+uO0mw2#)M za@g+^9km}>>1J08{Qd)2Gq`H#xSiztJK=91z}i6>{PhF0b^u@hqO2V#zn_Qx=QGpH zzQryd&*!sel+P#3eCELKgHLqL!^WRt_T7y5K7a4kWWN3-o)b;x>;C{B@Ztcz{-ptY z{qHT0cwc`^&Hs|GdP&Xyz8zonBlh)gu&;j|zW&O%xm#Mh7@K(RHi4hQ)|gwK;l4}< ztzE#^Q+Xblm)zGA9r^ke)UO?LY2AR<5XVR7oOaBmb%U{Sb51S8Ox(Hw+JC!l(8B8m z;ZbHE{`Mkn4XFeAg8t%sJ@ogEe0_uC>q(DEbvQ_0-%p3i*UK1?)?^aRsnQ&LB41B) zs)H#9J*TSE+JkKD+=l zQ%}x$%3EP}J&%4G`P4A{ei_!-d$ErJe{*2h*86^LtPiJo#84U5gYCWztRDwWZX@6LUK+1ydHKdZ{Ds!CX#h%Hj=JFg@^Xn!6g(yt3F! zS(Jr%G`~7IrFg@U_uV;B<{>AC%x1Lb7%TYtjjRn9Qd(t5D+O^wi{Wd%(4x!Epf!Di z`I^w8&`692m|xa)fmNkmXal8%wehUWGR@{GL(GbAgJ;%t!Bv^pdG`HW%}@IS(@&{*MAYtxUQ{W#Uy z^wW-SqW*k;-$Z?R`1e8jCfZLzdr4^A*`?N|X}xDW<_eBtte4C;(b{-2-z0ssWa9x! zOZz6BRwCc@#sI#_?S~HBzl(2wB2N1g8DQNSc^{;2^2gY;Zcz>26oGGg=l#3!Nqv*7 zIZ%2hU@xbtJFTavJ5&Z#cbd8Gl>2oDVxJ`KqwKrUj+4_``ud){%!H0T z2ig?#_>&po6}P7J^}RM3bM@(HBM2+zFwQBr{HP8S59$YuLE99Wiarg-(X_ve_|w>n z_|sgy)OTzFPCNReB|p5(q#Q#VU6O9r-68L2eCEc>fZRu>VSWbl2sC!aGx{E8R|xfa z4cc#t8=4aCq5VN5Ycpgs-euTFY4VO>?Efh05y_s(vX|pM`TWcFhhGa}Z)Qq)+OE)D z!@zIH?X-^IrcZgpx@&%-JP{w_T@BupAL4fib=W&&UOztG>vQ{IqG!=7#g%gE7&;-J zb(^-sblyt*TexgeI4@xiOZ+1oU*ci@wViZN{S?u81T>^`!n9tQRjDOfS7V&-!7fsf7uoMfbI!fP z=XH||#rz(2ljdO^)3;aJBg}hlK}UKx)w|wh5443sv{%?`_aKuOGB$nE74?N7Q-0=< zz|Iulw2xT&#m2MyA=5HV|94^TGfRKDciADk_qTV{x!oBTpkK=S_ePAydIt9Er68?T ztc6nFCv^Qy6KQR0+_vqvMzCMu&2?Ve@33cK_Lzw~+tCN=F2(+4tXZ@V_4h82+%#8G z>W$+)3=??|gWukl4KevGOJjQ&9(MLH;BPu|da#E9dXL+~&>Fy+D9WNZIAPHTymL~= zuK2*tHqf+TzSiHvFpl>y#HUAl7--$M4|^2u=RFMcybsS*y~V1M5@+06}@`zITm>;;Zp4}XDt9_YY&Lulyed>XS=PYoBQK)*i=ncQmVAj=Ev zyx0q)PmFy~-iQsv?|Q5^VO)njF{#Hep4t_}*x^s`MgE#dEUnfdF`jKhOl~>&mA>U| z#ymsG&yYq6c+*v5wLagay?0jr4>}(P3J%EmAZ%qyKxB))u^Uz_UXF}G;CQkN79eW;WQ~VX)nTv=A#T^O# z%p4QiISPKF5BWp?q~x)n$$uXCuf5>cw@(>!#?Gmjo4x^UTY35u6L(E{V&aSoem(Km z$n&eg?5yvD*Y~kMWy*?6e7e5j`F{?ck%hmrJn(*F4$J`WOz^k_I)4oRABEoEkN;?2 z(GHrNOwf?5H1|&OlgvjUb2ZJCz()jZKOx*hGHW@XgC98#J^JnSx!svg+e3TBsh!J0 z+jAN0Hj~?)JmjmI+n(QE^x*Ad$D9+__AJD{IohuyZO?YJJ+^-VI)ipt_Oj6axgBVG z+Mze9Z&ZIDo%-;^whJGeNIES*-b#_~O{mYAXlDw&tknAhciujBMWJnL9zAUvlmZ!_#EibqJ zx%zeGao-OlpUdBs4|}KLF6=9dyT-S)3{%D~11KEqq-z^_E?DBKNZhl?;yXE7?ckR`sclo*X+YP(+JRn!a3pxb?-YAFe&R{(qpbTc2Edx4n1u z>*mLm$IXvxUv7PK>D~Og_TZMU8+PlLE5F-*xaB)g{DI!P`E}`CdvV{p`f=rT!*2du z`*HcXVV9pPpG)ti=gRNehfD8<-ST(C1C@^}zZ-v`@^IeEf%eeZ_d{JZ7v(!2cK`tSM|x4-QA8#nC6A1Hjf^1AvRDE}^hH|*+Xps<_1 zt3S7VUHf(Gw`>1ye7C&Zu$%rs{9Jk5up57%_pZNi!)|-v>d!4dxBj|eH~(&Vx#_v( z?dC5T{nDnI8sndzV&vEkV?RZ2_#5*0D*LjfWmEx2JQ&CsbRJ)Ol zXgY#8aJC+N>o%^fUe{Dlhw@SYpUiKnAZmUBPdl#D_1Tyl}Nx;l~+Uz zNT^h7X&U5>rHMYpq^a_cE+TdDBa*0Us3?aWRH5dXwdFMpRc38@E=<)_SRvFeIwh2?A<6_N*s%;GhM@U1n zln?(j7~C374eZSRaCO1ihK9~Jv~1+Kj;Pi7K-B7L%ePk7Hq~BUUtZA&r#ZiRU3FuF zVRRJ~TD`WqqI_ecyubm);S}}y0Kpm=GQ&k@e`|dgx_S?N!_)0lNIR;$?gRHyu zW2SB`{#nmjx2dtZ7M5AL3|3Xw)RiJS)*bHGx}k=~Z790ND%6U`NPXS423fJ^TARkYE0&aS zKcKO$c-6A#v+Xj(pIZ#-RenNp_A!tvOXf+O`lc$=w2>Vc9>|3?q5c&3zuXAh04f%} znU#YG4Ww1vuPtwc`)sO5Bx}Y^4OLgv*EMZ|83L(FFK?)|_Xc|kk^y(5XMdNi#l4>X zSKG!XV@q9iW%|rau2%-&bu*WB|$Dm$~4bSk8Q(GLMj#?yBwRIEDcg79Auaa6EI-PYJH7V2>Ku}Y?)>PMS z@|(N{dL(*yM4YH+^N$LIa;~ahTMk`pthyEzqGAI%sZI6OTc|@yc8)p@3)qAMj8W-f z;gw|C#2q|f%%-6U&68=kwwf~27^!YBji`21Il!LE+FTn!V`xAS@sq=m=%r9%twF@v za%%faeG?$`lmudfD2vuwe#Rp}X(Ra-LCp`(rK(s4{!11umtJ7>ns8QJL>H8opm zFM){G4b94{sGK=_R#o6!ZXGzO(-nv0_ON_xirP^@ySd> zYb^Afj{j5mc^d8)@bg7{&%hmGS=x*FehKa~@ITqL2ov5z%&UFw`va7KdA|#rdo7;b z5C68sbNb=CEk3IsKAMC#?(Cp3CoH`?Dl;b4(x><1^NOXnKXLE=Xd%)}{PjDFlcwUY z$1F}-i@$zhanfS^bOea1Xsad);78>TEy))IfU zS)42<{<_2BWJU4Um!WzO;2!gBs676cN}e;etJ3B>GQ z^t1^qrUqi=8xHzedDP-DdyumfemfQX`{mY{&m@s^5-L0Cvx65hGI&Dai{L|eE;#^P z&Gy%rMM>me4?c6G{tcL5BKqS=@ZUh6B>yYq*l^9~D*hwnlkmf= zr0HBP`;(OW>r6j{oG7kz`)kaXU=PGct}s9RHHn@tfENP25e=ulrtHB1)-^dm>)Zj@eLNg*wWI^5PoV#zNQA! zIRrg3J@!5UkNH*NOV>rPThbf817xq`JmL3Gu(zp!nE&bUUz^`gAw1@PY8bCgqK9*n z*u!tR9N#*_XYhM2xeh>07CXj7zXF0@v@V8{8ef;g2#de6o-b;V6E4v3oORFg3!@VmlE29VjQl*=^W97Dapo5edJF=|!_&fB=Lq zWt`2~JO%*>{~qH~GZ%8cE@wG~{t4#)GSj1&>~#ba#KfnQacMSx59JdsB`Gy+H0$#U zjxYKB0n7PO#zk-YSwCVoY^G*A<6~G(!K+w5qF<4}fbnfiFZ#^F1IhV0E^wLe{xsVI z>4Pre)5vl@#PqVi;}GlN4~)yY%oiCy!MJ#eT7)UxXMFaye@u_xVf@byUd;F*#zj9r zV|kV^E}rxx=QqOn75!H-{T)m%`MQ(sZ5rc3|9!TT4>2FkhItwZk^Gl9^k>453I8k? ztkA!~{C7BbfayQaxTJfG>2G!L&oTZfhtE=$hsD8GPXF2qI+AA}(@T%%`&=%qj6+@a z!rzix`Wz06J(M%O@D+R%+llxoW@oxs&sEF^W^b=I8Q;WVsV}#1x?#qJKmG>E%G1e! z@PC%|fN#OsOXO+;0p)kDQ(k}IdWY{Z+e_^K3v4If^TjnF>n8NaRGA?{_+0OsUxY*mz zn12`JqMt2HkG~bPm*C|r|47C~o)s*AKI7sau4euhFfR2j#CD#^xXAwl&eu!_Z$m`V z|9r+p|7S}5VnFz(vfZBN=na1_WBE*V@GiFh3vJ=wEBTto{^Zk)^UdJN ze$if{|7*DZwm5tq=6ua?(oN-hLE~(?__Y~_2hs!n4&7d2{~u%dbD5CM$UMS!{!6A8 z|L_;K+n+El^bfH9Kj`q8$o4RS4OaZpuUQXgGA?p1XZ&KuMGqfgK9@70;J0wPbD3WH zSNI!Ko8MWCi~o->{VIn(hv_#s^f$47Dj64h`yR{r3C6+JUccmWU&?awYx8|B-_J52 z_BNjF?Is8R7}I}|aVf9YS)LWlU-*0+bX2}yXL_!dc9M|r?=UX<|0&D=4aP?3waI^y{5;U*dY<;Z7Id48Ad7>4!2P za$dvu8H_VKQ_J{xhyD__&w3^l{?~K8#^0;iOZ4+9m)Av%i$2d{yqGg2`I^Ccct6vN zeoinhXDLg+x|#7SnI2|iuir9W%{YdK_PT@X>BWrm&0Nm;+QRt~`J34uXq-Wp;ODXa zcQY>a_fK5E=wr;9{ueCI=NadlNn!iEj??90HWRtrzsrPT4^6DMA2Kfex5aE%&CEyW zUt_z)H*4bL`4{GMtCQ{<;7fM(3+69&`>)LB3@$*9W?C2@&$!V4nf=C>9eKiRSF0WR zn;8GNgD+wHe8$CYFJgQZ<9stqx&7V4>57~M>>nzbQ0(dxtp5ucM={xJ8~dLbj7z?z zGJP)NFb{ium+`rbi=1aLpUsR*x|tA+^xVh^O1j_Xa``mV^Ub`$_3K6lAA&IPp>m*0 z^1GMq_EyHlZokC#|24+Bn9WkQ+ix*0_VYWo!*4RqH*=iz{C$VdW31;NFfQrR8Ji?0 zomEB`*xHK@*dY8t2me>L=if0d_4nh9zrwiqffqU56fP*y|9>+57{-Oq9gM$^ahQ|6 zKF#>0j0^u<#;;^tE`ylJBmT@VU|6%-E#yJ}Xe;;V|(9VQXE)|U9d#d&l z`cl^aR~Z+1W^%bl*r0@d0+;Vc7#BG&V*7lO`5>G2>Sh1-JI2MoO=bH$$~dxbuS+@I zzcDWL;v!Brg%drgA^W!L!+K;9KJM68b-IehV2#&|Vj_eil3Q(-9{AbDjM5 zG5>3rUi@tYauaBVlTzf1Z0GZP}Zy;@j5^oQScNqs3` zfAX}G?hPy_owZ39o2ePc=~B7TCGvcM?Kzckq3>h*|8n>*N0{XN4Uapd9G_zOM?3td zu^p~->@&dSGSx}la@b?@mh!fVYcTC<}Z4tdP4HQ%zOl&#PpXq z@*H4&&SIRCG21v_mohHpbu;4&9DEns2|n@?C;yd9|53&fwATf!|MiSZx|>RIN~?dUm&`yux+AF-cLF@C>;?`QeH&A9lJbC~{{ zj7#}G!t@24QBK}`k@f$1rWZY|<#PXulkRTj^Y4uF&HRPw|HHvk82>fnqK7}QeLl&! z$oV|`r57ANKV-cfW?b}tE)+%f_7dY#U(V)oIqC4JW&91sCEbl+NPLE}0z}R`Sk4s2 zML*wRJ)h;^H?w~59dvt%JzUN9k8cgwi>tRe$@;-ZaO@@WoX_bF;S34h%Jiv>3;)GT zKgE$}ET=o&N%whVkn&68B)UYN?JWOHN1kD9&v_3050k8aeE|%i>V6lhslCp{z+Kjy z2$<=^24@P{{Wu&nmHa^TO9jNeM&V7-NdSC6OW`Go{r3cr|Tpxey~*K*#baLxZ7g=_xzF@84gv_=#r=D7AVKGwk>VVv?c z$0zlF*)ZJvh7_*lnXYhI(<4SQFG+l`q#V7rD*DAy)R_B{;9W`Zbl4|d#9#ASodmy| zanetYAJzW0GCt11&tr!`{4*8(VaAD1mclz3Cp~NY8m_R!XN97d@g(v2kisKOPkc1q z$~e(usXSU|?osp_->cHiQ~V!M_;Q7(vBPosPhgzn(fn%|r+mF%@!6yB%M^Z(!nHlf zx|FNW7q~&}r%(3d{q)IrKYcRp>a$t#xl+mb4TWp{Nc-gKr%UnI`guk1(fS|F{*>g` z>9#QL>fvU_T|I=jy>az0nsHYTX^gviC{grU{?&?J<7JFfx;kH56|VJmFbV%(B;o&v z;-mTJa{EW=&QRq=^WJn3uI;T+;o9D2qTLtzEBr_MOY5g}5ubGX#6R58a`E#NuFLTP zh3j;eD_qN2rf^wXrj%P0uKC}R1iw28eqR#&7fJ9(lHiAv;5BFZdXjpRtjo6a3XH{EL#uKC}r z@Jm#>i^uu_;g#z`KHw0<7 zYJ5Qw`sGRJr*q|T^P9`Ko8JP)-Tbare6-)*ukaa4{!Kiw>887taW~yhG47`O6Gcx+ zi5=p6b9)iJ#yc2y?W9xTTK){)5JK{3KGPX@`R6k3@~8c)bh-KMQ2e$1Jfiq(yi4)X zb~T>|MZ{nCqqZtsw-=vLxNcv<93Vd0K94i*+F>{2qz7$>x!ef3^p`U3(of)mbM=$X zxN8p=Fiw25e&#Dax*YFTxVFP)kZ6`lb_+=(`btqih$!$}78sa}KMjkirzEt6j{7m#8 zRCp&pQ@f+-A7|XPpTmq(ezm>H-!~9{?YFN%m@c;*Wqj?H;~qt?^(p&}Ts`Y?v@XYA zFdvdfm!s_Oam!Kmyu17-sBx?2FZ*DKzb?nUie8uFL51sboTmB7BwqXn#M$ z&xA`_1j#euB}_xN35w5^3Qv|Vqv+G$0lh@^z)yTHVIh7&IKIsry+$kik5SZb%P2_n zMT$P1X$Z#|z|kv1;de*T*!(cj%brwvU7+aq@H5?{T!{X|3SZ67gx{s`h{C_6@U05} zw!&K!E<6d^t?-ZVGu>Jhezn5)EBreO?@;)66@FOZZ3^#FxTHl;x5C@`nQkHEpDxnF z_xwluEA~eCH44vA^xs!F`4_r~{$Bsl{w`4XzbIV%57FPF@Q9+nPvKh?UaIgGg@0V( zyA{4q;jIe)vBLK&{C5{Gh_OD*R^(Z&CO!6~0^H;=}26tHS?7(eGEd z*gU=NQ24JD{b7YasPHa@KdkU>g+HS35VzN)&qoz5`*#U{OyL=d{t1N_DEx7S)4p7~ zh|g30qy3fj2*RIMctp|vM&Vl({*1y~6#iRN^zgjGCn)>{h2xwDdlCJM3NKLj|0sNc!vCc3)e0A%Nv|Uc zKdR`rD*Ppdw>jD72cunzbX8%!uu57rSKt2o^FK?Q+Q~YADQwxT;a05MtDf!8Hyff zX+*CAg{LZffx<^Be6_+yC_JL@GZem6;b$tmMd70qzFXm=72c|F`5Q~h#D0aJrRX~p zPJMB?4l6uO;av)+KDu1p3a2$)xo~!fy-3gF6+S`X6BLf~ilg-BD7--7G=`CDfx@p7 z5ckyzm%lZq*AazpQ}kOE{t1P*DEyNO->vXZDZEwT=PNn)E4*3JcPM3^ESCn)>^g=Z-ILWLJ7{33-fQ26^4zFOfK3Xdo}OW|7;ezC$^ z6h2+yyA^(k!dn$SL*e@sK2zZx3eQ&fVTI$2@95Q~@L3A)R`_g%)8Bc~Mf#_?1Gy$B zyg=a@3jb#z#$EQ45uXnz`UQ&qQiZQp_y-jpQTSyF->UGi!dnzRN8!5_K40Oj3je&4 zf4{=zZ`A2^hr)68QS>^j@Wl%6Quq>ucPo6U!ezal^d^66N{LKJ^^+oexuVZd_zHy= zD14>D7btv{!et$w_{&@?r5I84S1Nj0$0z!aDZE9|e_Y|a75-6$w<`Q~K4H3uPnE(KD14p5S1Ww2 z!e!qA@rfvWtD>(~c#FcbzE*{AQuO;3UZe01g>P2)VTIQ#yi4H?3h!2U zqryWYNh)7&dVY!izCdt2zm%cyKl&v0w?N@~erbWi_59Lmh2O3CL=>*)m$oXrSjpd_ z@SzIdt?(}>{;dlCqQdtp{1%0GD14W~4=emug?B0ZHidU9{L2ato#6+_-oB#n2@3zT z!ZQ?pgTm=M7<3VzYX8yxE>QSK6~0>GA5(Zl;ae2GRpFHiZ&CPGh3{7Q^$KrQ_{|F6 zukg<)yhGtt3O}sy28DMie67N}75*88htBi^q_@v1e1gKis_+bj?^bw$!f#jj0);mz ze6_-NDmwQ+SucBMR?U z_#Fxljq(Ge{~HxPLE(2QJVW8vD!f49I~2Y^;pGZnt?(}?JfiTM6uwpAjS6p3_}3J^ zTjA>!-m35xg@0(`r*H78Kl-sPm0Pd(ZuUOsRW+>rjQ3gZtKM$!cCTrtcUAp2y-i>D zHh;rg7rDc`(Yw>Tc86E~CGRG$@oV1t7H^OD;k&$VdEfR{f8^@#c;EHfyjGkf`#tZP z?|b)p|Ki=_-RG5le4qDY?|yH;_pjc+d1e3Z{nYz;pkmD-@1XZH@0Z>$y#MezykB__ zdJlV#c#nFIc~5wcdrx^!d%y9X@qX+5&igO#_uhYd&w8ES5$}2L1@A@gf4o0=UEWde zC2zya-e0^wd#`%0c_+NujdgE$-QHVXbKv^G4S^d2H7C6{y}x;V-e&@z3;c7SC9orK zQ{d*n&cNpbUkH3La7$oU;MTyG0=EUe9QaD$tAX8tuLW)oT=$K@woiQWQ{N0Ud)xN} z?h1S>@a@3ef&UZuPT;$N)AbuSUoYKORFnt$Wt$p`R^^oz&05}ApO4SM)AxxX{ktPXc0qj=zDUbi-MG94pJF9p z>Z@wX-yMl^>5IqnbNZF%th$Z(y7IEMOYC=*iKwrz5SRzzUfTgRW7|+8|5k46lG^u;KT1# zmHt=KORvt(UEff;q6y!%^@Ut+<<2YGT2a%~fY11HhKiOKEL`PN%x^G=@`+M>c$glR z*Vk>`CIJ+k`b4{+@n52kp|JYs_vr<#s@>EWWv4zME$`*C=MskT%OgH?EyW=a4mFTR zd$xfD_~XD5^uIzaA^Qz$3CKtPCG3BG*?#0(peyOK(fZT|dC{LL4k?!NBZQt9@!1gq zfyP1ffe}JQ5&3ipfe_I_Y(xi>-0?{U5;>|ge63$F`_+31L_Z%dK$OgWvs+MKS^oFQ z1;clht*a83dirCBe!wUMnmg5cREC?K(p(0xK(TCe58GQMid_)ZJ z4M1M|p=I_v`GV0m-}#IZf#L~bAF7x4)ZCUw(=3kqOr1%gO@zf_#OGY%Bu44j1fk%M z=u0qqh)NWY6I2AKbxtS{JoY(qL6RMq5Pgp}0_P?4I|RXb53`D$oDhAN=!k~sOP_K4 z`3>??AL}8Q{ZP9E`W+b{FJO-(i#@?ZF#0OGJlpF1Vfs9N6e3fP25ib?BvAw$RU2d5 zF=6I^mA+JcUtZq8Z_roaC5U!P9%D~njK<74Ttvv?Q;i)yBJZPhp{`z_=)oJ@QnGX| z+|XDVJEMb1#or05n8`|Qls9fzop2;1(Swl$kOHxX9tlV~jss$+C<#gYVM>C=MUtbG z877)c1HPE>4= zfIUn@0(8KHJo|_INGNtVmmqY~nmqeQS4fDDI+36~q(lPtzzzw}c~bI>oa0Oq3Hg~` z6^F^GAVL#=c#EKJoap&4LZFU;i9yj*UIbEyvk1gRBx2xj5_#jF)FGkR(IA4!j`iHGR$ev~-fm;8JE(!8!I1;qYYE&lwR3~|ddSwq^k}ykwHbu@Fk~h`VIiv%31c*C` z3yy^580eTCd2dfdk^r5jBhP#|lLX1u>{&emG$AP&rbjV3R!IQgS49um5*SL7NB@`~ z2}x%T?E+k0Lv@tQR<~HtKQBmP(fm!h1Z3DJ;eH1q$_slMoCI)~nLIYu(fL;r($BFo z|Kx3S@G3xb%qjpK3n|ZZHd^diJuaFTgQJgD!Ge>r<(Xb&=Sj#7(2;lYj!y=3fV}8? z;xsEqsN(`0Ro;LL%b1H}_r6OnP}$RZY#J zjTiv>Cf#5s#^QK5lYTTsj5$n|)Qoj>QW)&I922xNDmHC0Ybt6t@f>F*j`pOfz8Up( zEK|Yi`77;AZ}DQ9@EBPva87CCf-lXg)= zy>DNha$N!rE7~UuI7;o zn>N9Ws+OQTSywTy4r>)y0>H%X!d1Cfqdf%ujE!)PGp<;Ay%i|)VZQjX_=!qb;2Fw+w@IG20Uh>9=a%O&tSnrrh!)i}D+o_-<5o z(SWstj5>Qs`L;Dx)KeSH%7(=P%sE;%3855?k3xGIVKyLq#(mY=q&4_5xI3FQAL#22~c{y*u7 z^tN;oOal2ofcPS}+&>OGClQA^>8D)` z5SRX&VG2t;dZz0mh;K0`{y~<%%u@OGGX~FtmH(Cm^3O$lNnh@>rzV#F6_&q))0dmX zlkiN$Pb7ajZ}wflgrxs8{2#3R-$)?;Jj9pu<^D_({qLXdCtTy-qQ4SPfG3jZKf>}$ zBSG?y$N#~~-`s#?_l}Mz=JN*KU~$Iu4}o{u?<&kH)8Gx|$H*@^bW_!JE`4_+(c8bUY7M|Bob)|5C&kx#ga6PGb2>vi*eh z-%JuB@%*<4BYq-P_B=v94EXzK69b#h37uB=v7o0{vwmlITP1BANUzCD7l85MSh$ zJN@lVBKq{tfekc}S!pYJ0r4#_r~d3opg(en zuKvo#`RTiT@DLdsuKoOX9eyYlU&0?ne94Pobbp-F?;@vZuUE$?-oT0N*8^+Ham7?{xE@{olOYT>EBLe%?$UDNEg6wD|IX7t4`n?(ZibrJa5Y z{rXqf-oiLP+B44$ACq$=I5`VYTDqD1Oy7+L-HC8dm+8Erl38TE-ZQ!7slNOq--1)fJsfg}`d)tWtan-d-enK8g`lUDlVwk3c%g+M zFMUkP2hCX-a~3R2xdityxCfh8rg&{%pW=m2rl*%pDo4Ijfu(w>UtgFKK2SQvY(9iP z_a-{%^6Mrge6n}hp;ppix@S%jem3xs*Ss>4Y7S6Y;k)ip8Y=(ZQIoolbD1AfdORL9 z)&^Qmp-X(zpN?U%`lND1owqj88BA-pX$>`bErD>4`QY-NJ;vFR)N$koAJjt)pB$$uK>zlHPPjQopz9f!^J4xigi`Xc+%;r``w-szXm`GYH;F4+Hj zqkIO|LBH~W4hAY8%Ktkrp9@aEd@dYZ`DDCj>d(MB=vO|_!9e9h`9IzAA>Y#XbJea~ z<+UAO7C_q)Y=52G7xFO~1NawdXT+yaTXPqD3bj?IYNI@~QJ9-ddoE~pN!+k!@{R<< zCv96r?H25ge8KT$bK82aLi_V`zy0xjK|Drz@#PP+liaN zGq+@V;hx#}@8Q45h;P^>ZAZz6o((zSvu+6?4*h=}ep1KJ?CmR|yfm#byEI;Xvaf{N zV9DRRr5kgwauWH_|D86u@*mfy;4)4d()?tadHgl%2c@B(LS;P#WnGSP&Okru%Qu)O zQs%6<^)helF|=zX&&~4tLFn(~b&U!iNEvhRYJ8hwbA~szy(Q3cJGG7IE2cGaUuQ7( z*1!D;oxXod8JvGx@SbUZ2G&78{{|fl;(|uXnH^g{ivX^q~ zF1*8#H?Ci|06Nj-rs>N-ug4xosE?Rn>_PQ%F#SOju8R7&zspz&{NB@JrGKFOy`#?W zJ^>#*4&^6p@HqJ8zTu{4$`F(LdeF-f-<;Xk_awE?WHV^*OME{)?pQg>ziX5^VEYsB z*V1NUohk2uRI~Yc&_>P-_fUL_OZF2NcZ4}WZ7_C=?b2;7(#ShHZB8cjB{HrHog4DT z*)c8o_!H<;^bVh=#uxEevT^sR`b3lt=6!4(r7@Q6%Y@fVf(`$a#>c?Ul5uo0{vqUT zP~&>!P57IGQzuD(Nsq%%XIvgRMY=R*qj9J{po{s?$-K5V*I`UE3geOyn5*;1Pk45|t!vc8w?vPad*>cALn4#R$hWV<`2*;1zN5o(=r9F3+yNbSS{=Upzo)}G_*v+$ zYxw1F*>O*h>@e7N9CkGa;{zJ^ow$m|x*T(03SXoeDVm*&teYtY53EdF&@?SM{Oh7Ux#P*Wxy^m zc6rt8EuVxb?lki6>A1f@G|FZ%9Y2T9Hfnjt=6sJ(JDQ;1MRtYGBf>p>LEmPve6=}L(tNcydgCO>TOYd4TQzkg=ASW#>7kxZ z36)!XT4>EAdN+4u#iU4I-|S}7oj>QiZ!Jwf@2;g(b`*cggf){gXnwV?uVeva2=#<- zP3e8v_5%*V4n2eUYsi~{x$LQkNAua~>1!sK#m~f zs0dY9d_L~}yUIz`kfSBgogaoABm2wDVT~5s?y8z0G><@k4k|4@S%R@GKA>{Gx0q?+vY>H&jc6~j{ zlgsWlvQy1t4|qhNGXtHKQGA3G)nV+hOAEk0NR~sWuVgb~ADZ7?cvrz|I_})Z^O$4t zP*-RktvqaY&4H{k7Z$)=n6+7+8>6|e=Yk&j#k4hLcFrXY{@{rad@lLhA3yqyC%^KC ze|t@Q@n7L{e{2rE)?4beMS^A@;?auOE?WDdu>+oOgI~@{_qy|sU>+@iz6<VqW!q=!P~``Q65O|>z_8}i%Mm}14!#(>3kRN$;F#Ue|i>04ff3fr* zeDRY{rIP-ts&2grGHCs!{PfBng>L)Plj&Z?9UkhEfxj1h_KrFa4521_+?6cMBgT3>4$=e zZSp8|Np?xPB->1d?nsAW=xz#hNP12Wl}&1gT-5H0uDfBYH16viKHrXGlZ`1`lK5s? zE2g<2n(Lr7VXEI_P@iOc7lx0gF{Y+T2Tdyc&m8z4Y6CkF&O}?4TG<62smCG+Q(F~y z!PI#f<&)-icW#`5`3Ud4Z*9y(T9l4$-$AG6fGF)me$3|YG}oU)NJrWLk~anNPO)uF z*`z&`F14+Ym*x^O5Z3aNtRyqZEBz4a2ZYQ;(A9k_5od$Xvj99X?oLmiR7O0{37wU) zyv@Gvg8%kLPoLyvOqnz#eBq=(<&b5XAC;4=k9#zCt=7joz$@AKKb7-U3c0Tbon4zi ze+1hZ`jwfcC3&^3)6r%ugbqeP2c_PKW370vb)d_PbU^wfT^)4z{5{L8|GdDE)1Ma@ zI=Fd(4Ahy(dt%LfU>#5y#I3nQ2Y12#;^%7P=VmGYdLDp$3e_{c#_so-Vr%fU7hwvI zpJY!0jh$%hPIV}m&C(iLY~1s9_a5X9Xbb)HF#FVcXh(m7`b4xhBQ*tmh7?~1zJHD7 z+tow4F}ZWl7eae$=fp^F3ykR@AJN~2M-C`=xm$i`49F9?_iy` zXmDkn@eeBNx3$iT{J-OMUg+U;%bRrau9SD#J1FlZgDdaI|I6i#{J-P!h8|A0yh$hj zsPgs>mQ4zbuC;Smf3{;P%+Fy=>Ca_h&K1wL-!*D-H_Z#t7>4E=dWX-Ua9Y21z)L&* zc3|w_Y^C)d)E|4t?Z6;((61eU4o=rjNFVl{0j3 zy5&szc=yVA!s(auIfE7R4@}3!|4XlHH zmNV(&-7Dvrr(e$5gDdBj_e?nt ztb=~#3>}vAQRPg1?!I{ete1xDzONUt@9XHaK<&v-2HW1M8-l${L$TLs81{<{ zw|n+!?)b8h+1!MEU)N(z;x4tHAd+&5Ic4m{xdLhZ4Qp(j!T5bxht4!5+wrat`^vBe zhdn-%vuJ(z9PER76MKNVK%atj{C`4w_7?U6{a^Op2CmNXydQrKhnNF-F)`%TXvm8S zL?ed~URpa30Te<^FkrP^HXuL(32y??#MVhPYtgtZaoL(#H?d|LWV)a2(lzPaimm$% zt83$Qo7?*7$V)q7+-hfPq1EvJe(&eH&$)Pb4k4>ux8L7~59fKF?|nVjecji6-S2N# zVJ=BB-m#BIN?>92)oYV#u3n0HDH&;vS94C;f~n4dP#`&ZNpR7*e@IBm_$lU_RRtHE z`*A`DenaN_c45BR;&TINpTy>yEj07Z%o-OnU&!tEj!bjs`*3Wg1oK#y1g<)FcK(x# zz81`Qlj}2w@Lct`k^g*i>XVC{rPWvO{VC?2;Xa7FvjB6pFb23Tz542Z!5peT$Jks5 zvSUkxlvCOd%t@-jTv@xmC4|1XG@o^%(RmpdTetIV(f6Ihxk#Lo#P*c#qnqs5Pa5>P z6f$w_6Z3$~{B2^3i6zX#7(L{cxulwZ0CIBdG4cZ1cS&5U8tYHI)c!%tC%{-n3GD1v z*xN0zyJFa1QQ!NYD(pMEd~Nfac8*(Yu=Zd&s@yjbiYJ$*W~k-8gJfm`y}f= z|C9SG5&oY!e}Nuo8<#Tf)cxPsU&*;*X&58te6e>h7moFtB+QHB95>E+N}nA$o^k)? z*Q#bXcR$TIUK%*C4(=Jno#pwE%%Ou#=L}&E9C=a}@~0f&|8i)z@W=Z9 zJf?Tlm%fhm2_c!&SBv_XyKa_spvVa4fOMgrL-)i$mNAF=bME@0l2osUL+tV11{`j|T- zY2TlN-+br9V|Svy_^()BP>Ok+A&f<0elp&%ZwB(8f$dF?g$nNf5_N+A{IsBx-HkY; z`_s@*|5qcAQEtw048re$M>-#y1KNSLw?B3k>lUcTJ&GE-f-*e+m986z_(|&5UbT~D&t@!C^Y;ka! zhWnG{)YdmPIkipqt;QpqapJLqb0u2a9UL#)go8$KY)qZg)Vd7^i0pEj@oih{y^b(- z9m%lc?)FZHOhJk5u<@H^9^1&UIZW0K4hS1a)LF2TsjM4QH*&Toq1D<7p~4;ApVzI2tT_2!5O34Y>0fKt^%l!w*Ef5hD4nO>u@EH^an?;^iARqlL2R~k&f`1J0;>YKfIQ(Y< zC!gmFTs{pFrJq43s2`sqG{pSyRLDU-*6pav&e_Hq6{M9)AZbpYZ=^tI~5>^ZUFA3hc zW-LA(!jnE*?0m7%hp<;C@y)qo>9+{|0?5VdQTOKjrr^CRU7$|*d<6^Y$mi`DF5WNn zd4l(&0nH2TG;@7b_?*FlKVDY;>G+;}j-|V}<$qMnwpE%;aB}_+gurfzasW&@pj>Vljz~7&>x0E$fpkZG%rj4O-s+! z=(wyrdxZa|m%6y6|3|?iE5_nK6#axGAF=dxLf;F$^0N3>1usE7Yy5TLQyCeH&ldSl zh}~K~-xYk|y0P@XFZ>fRsKiUMIcL4l9}~N^d_F69kJzon-w{6DVz(AwCG>5QpIf|9 z@Vg}6w)js4KP+}@@rB5D7%zijpBBGG{5>l6Y4LvH^S0O_Ud?qA^zK)FeINOhAATA0 zLy0S4VQ!5q$9?cqkkb#J4_eCqqN(4ZULnj*2%aZKQRxy@^V*#Bw4Pl!F+ z^5s{NzmtE1*sU#(w!prLcZq#kKL09s(TcJB?}dM)hd1W3`rM5-;`Xxcb#d@N1fSUn z_G{D^MgDgsymgX(EyXFppBDqPc%6iIx_E8n&lCBdk@RBmFAKh2(u>7s3ZJ_oZV0U2 zvZTIoml#OD>+Ez3{`w6rVD%Xi{5jltz2V-RJlGHQ^NOS|OTSO#xk=L3e$m5sh0pVn zzASyV#N%N}Ul#u|{PDA^67cgYudju^{P4aw^w-Cs|Fbyse-x)aoE3-9Im$1((zkEM zp)ZZ&?{#tLAB;o)=W*nGJB~bC$p?OTul6`N>)n3gIuXa;199YhCJy~*96A3q4xfrR z^vOskesUg(!{>%L;W`?Jesvsro9`~dcb`{ET`$j90+%X{L8jxKmlq#a_-9=b^J~jd z^4EBs#G#i@m%=}z_zWvt^Eo8>3;8^(=xsSoe>I*c8JE}JRE2AQ4=G&p$&>txeD*1S zZ9RbgYW%RG*ZS;Nxb`V8cAn$KN==K^1@_-__G z&x0R~Lw_g^{p*5z^*>7t(Tk@lT+7*`a2;MOTr?N?NR`ICFOYJY_95Aqrn^L5JrpTi`+Gv+n$IqjYrMRC@}yk!;%ui| zdabvTIQW3VwSHDeCg$be8wcm4Gwbi?+(+|k>-W@;#`_h$_V+sq*ZQeLdxRI|(R|v_ zUa+|4b2P;t@15(955>W=rM^h{f8YJo{0_&#%NMvrUi!m=d-XXO2cIteairJ&_6Y7x z*M|l7rt4<}r#!X~j}kr?htJVCeEQ??8Hj@q3qA+_O42ckc~9`U9z1lVt2c)C3HQV*q$rIcw&rO1R z1YcR=Ad@LE&1Sy$aXzOux!y>Xm1f;9hwa3+|1tY=vuiZc@0G=Pre7c^(zq zE6;wxz4APv_-OqcRk)Vtd4+3v-cY!fr~7JGKMb$VXKqUM$D8D1(m&~vm|xp}!Stx{ zHx#|*e_r7_KWthS^H=j3RJi8zp29VsUa1^Vo^mB;=872qrxb4cSxB$(CltN*_n5-9 zznRzg^FN{RL&{&&S$#N@{|bf^|xQqA5e1IemBx<{Q6b?a+WAu%XvcKnosYIF+M%Y zU)xVde>I+x8Kc+w$yB)Z_n5*ppZ(z&pD(zN=GXQE(qE0gr|7l63$kK-w7)$H*L-%Z zj?s53e{DY_{nhvxMX&v}nIq#@``ax<#5JF4siYErMEPs`G3l?yUs3eh-ywx-f7^0m z;nI9ca%1>!D1U7~DgD*>QAMx)J)v;z?_GKR{B6G*`5#pNzL6iJ*Zgn#h(Eq74&JSB z&Ak`xTES8&#oH@GC`w_9-5lQquCw7gi~*yTQ&--Cj)zM=8MioQwF_X>U$=rw*+ z(Q7`(;_!b_aO!8f;(tPLh6`O;(d%`EFNvb)Hx-=W)%4#{xTYTzoO<{j#pjIR)Pu%{ z1*e<~6}?mFzK~Bc9&NvLqTuAC@mYeC&mzTVfrpQsf3euZ$Kq*veY}Z&kMR3aBtoYc+0C26hS>ixk$IAkROO?|gsS4NhQmt^v zN5`WSF9w&Us^O5Q_{@=K-Xii$KGM`Sh>bVmzbiDnwc(u?ady?%`7*ZOojCO~gG9Iv zDf;OyWPXn+ob*WD{}yqJD14P*yj3fl^bO+HpzsdCc1~;`U*R^*k^VV_liu3O zF@<-MP_8!=PWqjK4=Vh6OU%3UlUx1Rv>j6TgNi;);pE>XZkY3SXh< z7hLAPSbaVvZm9~tM$tzUPX2!^ZY2trrm%6b^FJ*AXNA5^(XSMYH!f1*W$FLSeRU2g zT$)zK#g2Da`r|_1ujn5VjJH9BQ~tjaw;_f9nqa);$vB1O{|#{~_uzjmc!LLjS@13o z{&#}g@e#}a9|V8SL;o*=4|wqJ3XZj(=CXXw2tM!XCG+Q8G5u4YzW>?>(%SCM*b~TX zpE2|DlvN$GJFkB*a6@`mU~k~p11qk%Zsm;+1%B9Xs3W3tL+{Fgdukv$egrJbzsU-aG4eb#BO7SCLbK8O}}hrR5cw zRmH{O%ykvz?X8`yW%awwROPBq=9O={ZC%xd)_d;}FY<508PA0^wGH)!S;anJ*nnB9 zc@%V&JJq?WrM0ScXJ=bYdrh(^(&7uSIoMwbwV*tfJKJ z+-7&i^Qzj`=H~jAPN%uPxud>QB+Od#$<~(ojaywM+|u6KT+p(+vH{%diZ_+zt*dYy zK)pVkZN#jlf@)eiWtKM`@{I$~&c@oR=K9Wt*18U7dq)+;tAaN9+}T>uy0g8u-n?_} zw;X_7+tw!Yw_UO8FiV?HtJ+)L8RV^P^)iioRZDAU{i<6x+;IcEs@)+W2xnEc-qG07 zxjL(&sr6p12pwk|Dzd89e7vSl%G#j&p9h zYdTrsiq7`NmTjdS<@N2&H7!tUL1$}oaXA#`x;U#i@w=*~t`5_|?PuYvO`PO@OH*qN z#GRa|TWv6NjFQbn_^nlq&23G^TQQrywWD4La_eiGYs#U4x;jDfiIi}*F0=Fa6!z4~_AU|4_Knl*c=|T>af#VO`rE|E0^;82)%i`P5kFcvmYfEONY~d}{1) zysP_Z97i`Ww9N4zx@=u@9PjF~H8wcj(f!mlym+pzwT*Gj@5ptudA?MRJ7ICf>%~J%FEQhiduJWX{w(jyIfOA z>*#bp5{|6kWo@g?%DkPlzL7Tk9? z^B$G0slKxw)xEa*_RifEojbQoBB-o$lxA=5Xsko9$%;bd-)5_X;rx!q`%v{NZK-YA zS%=z0WkX{}arrIHFBUXILGR)kZ^ftyX&&9A}jNbmO2w3b#6t~t?qzR zIE)IIN#9snrv%@wLqCQNm7s~}5Du3g4Pqj~sK;0pI4L@;`uwW}t`AFj zC-u$=NKLdvGfrJC^D4+R8!`>4sZ?K#R#HB)l#5Zi$#oKhVb^<8^O_t}B=d_A3R9Dd zUyN45gpBZFlx~~qq5fXC?7g$Gv*Fgpd+J+EuSGE% zS>c@GT_}7yfJ#3H%4gtfOxaRQig0Dkwr%xw@=dfLhZBm|{DP*Y*4nbhmO4Wl^UFX| zhJh}e)6vx0*-_bwBCchdbqu5AmKuaDSye6_zXDNPv8HN!`7K+}4TC3L%5JC#SA|#K zwi6|HQ@!-o5R10_QM}4$75PxRZ=s~Swtlr{#fzA>F2qB5_VDzee1 zWm&s@4J_O*g)_aGkgY4R+i7qK5>Jw^+q3XN^1bx#nu$aW=h?~&YFDDyIQBlqW)U-f zc3rXBjj*t(6E(J=YG>MpishEEMxfHc#dt?17$+VJ#TKev` zdOxmXGz7CXEeLkK)ppvvWRjjR%4{ut%VfL?uR%b522U>T$BMdDtIf_CW^0Qq2k%+3 zy#*e_=-_QN-K1!%gz;($0%ygpReG#Yy2$@ax5b!zAVYX#zQ1|5`}!|-U|C!-tU2cT z9^Qz_utU@>B2OhnQOG3I;nYQUdxa$aWm=b+qe3_D z_bZ?n#*6nF694Ub3w}2p|6cuV@7USd*tDwk##Hyplsj+kv-_Kqoo!sQvhs6WlIr9K zir3$g5Qs?>aK185KFVds*7zLZ4}OzC>F%fL>U-=K_<5!@YQAf4)@iUnuW$oH_ff8}>!mM>o<<^sMRm zY^t^6%pev|#=4!&&AXjzb|yOo9UaJ$xo6GRn#Lv!fqf+PnvUyJ zYdUfJ$Tf9{%U{GMH=Il0x5v#OaKF^)jv>lGu%U5(&YPQ`H8Ot~pUOWA`YV+676~s} z6xY_;_rrp74!|sV*0&vTa85z=qkl0D&M|I3`sd={$Kv3B83*4I2mfLmyfhA89tTeZ z&Wm&Mu5cgCuTArud#7<5R?aPBY{LA^l`416Ez@|K;GA1FL!NodR5B@bTw(Kz@agQ%Va6`|(@w|bLT z=cqhby;+=g!i(}qacbWC&96JxlX|vgIPH^{vuP>f75L z)Q#$Pa+KK=B^+hOxOYtxH~gylWXrwH{H?9{q9Zy&O$zWG($KENuQ!?_sV`VLinOtQog(Yw7N+Q(ek zcq3-x)jCGxVaNhD^y%AIp%iQBkmn&mYQe2B|(h3LL1WKY~)_PbvKpvw;HeqS7% z)pkGnjyU*Bad4{vu6LLY8hfpf2XEO}Bsl4H+1sY*bs3_|QX5u7ilMjF7$pqn7w@XC zb$bV;IB9JU=hk6puN?zV_2o6&>MJlNH(~kG+=fYCm@ww}@G5WZXxz2R6gE52A%il9 zKNI>M?%3VYS>J5LDIQ-Qjh#jWT1>y%>N85|hA%rNQ+aD^Q`VZ!)@|FG>cPCQwXVLP zqoB67zN4cNoukEOJTksgR=Z+ts&A^V>8Qt4F!lv|*oQMki71nc*+~)pfI1;wMWp$a zWrJeMtu$`fpg%>YL;6X1M>o(aPS-BO|{XoR`tFJ?&U8_%E5_gag2PRyoJN zi#_{!4%GvY9dVb!XT-~X2WQOi9*}#2+=I9e{92&m#f0mw{_B~EGo52StCr$_E&glq z-&54H>ZziqR(+x93#*=eY6S!S5f!n+Z+!jsXcJ%~q%O-HUb^^DI@ov?=4eEa_8R}EjdGthT_ zV*<{-nDy#h@c8=$&e7hlNAkNDIN3~(J>oYyYAct@_mt@<;_+)=ck-XS%n1+TJPn@9 zkSG)+=oP6YD9E$MmPM&cV8gt#{1Ab1MEL`0v8Msg!_# zbwAeANUtx_>x;a2Svp&XBY$4@Zs}4D8mseAE?&02n&!Sn+c(xf%O_LZEuJdx(oGZH z`!q%Hh}>;m*1lUgyWnnhLedic;9Bh7j3eFc_vM18T6YAD?pFT01Ycp@AvoQw{MCZn zaQ>p&+U)Q5Yioa(!bYVPVR3ui;8x2q{M!b%+KJ)+WN;hnF}xCZz*we>RU10@*>607 zEHA z?dQY(@{q!9e?R-VHGV>9$Y;Kyw|hmBk8MxUc^2MzUG2eB1h@3oj|Coji`%_;ExiqU zs)ydREYVp!ptK1DKI%BksZQn;qS zOW~TnOW~US359F=7ZtAQ2NkaAQMWJ`<<#^m6t3y*p2%MMhB);56|VU|qj1gtb%kqs zyLQ;C&jph8d*#VixaPlE;hO(0g=_jAg=>17kK1&e>Z;LsUg&K)wRpeamOf4B2R!r^ zf5k(eDfA~i^cLq{?z}AjJonXk!$WWJ?|A4VLO-?%m;d&g>j4Q6I2(Q6P&8@egGZPaWxD0j;){wS$%A#C9_x5_Ml8x`4-O<_F z7T-CXUt7~6-c_`6O)Mt9#wRbb%Y%I+DdH+&HQpH=>5O)>vBSBl3ZtG_JB)EiGf3(* zw$^qwIqWg6X=)lb&N;SU*M`s>;nOD2>;V^iL{^q(5 zYSP-M-RfO-oVdpoq#Q%sm z(qHnh;kWv~F)PmMLsx;25M&I2O z^xds5$j?CA`)n|&taRy1i;`|n-gOr;Cp>u;cD|i~lVYmE7!LvJNM@EVg7i@6$p4#vr{_F9)cJFEYe{aKjoX5Q* zF#YAFc;6mK-Zu@rhl10NJOI95e}A;{9L8*$rW71|GRe8S5dNJ-Uv+At1Hat(&g%r&y}o(efJW^)DQ z{#ruHxgPW(cHw+mI|mN?njJU~8I}a*o=brLLpZxQ3G&=5^1K6i&TlM0f6Uk2F=@y# z5V&+5J_WsE%sYeqrPN;!{7Q!Y%4S4H9tZ@^QSa;UUWMlpp3Q9ZlzgNLdU_CNE58XD z%OKYSBG(V7C+LCvE?j=~F#1iJ_Q-|W*Gh0kdPeSVZF=+n{#pC9S&`$R`;)IsPI7LiE<<}BS(Lo{fybKPzw5P) z*Zl3{X|pfiHw`v&F44(u+P&n8Cj-el7^driKMJ{@45XYJgq{3Ha7NiI^aI_#^jnK& zF8kJ^8?OD^MQ>ru;@NAi_5d^C5=96n4I7-}wUCQxf@y>4BK`h^ z3dGfprx8xtKmg&oFm>%P(~_|XJRAL2{bk?$^^tt?d{_FpLxK5aa|3~CU)$o`oi^2} zOhNqQfbYPvzhA`uZs*@W{n}EzgV(`Sj5TdX-*S?37H<4&`y|so6%R?gfpdg zATIwDaoK#$w;ta=d&a)Yk!D6ga~f&z2f>+TZA-ts=tlg{y!Km*zJ<8@LGZ?m=OE*O z#oZzt3VxNj%GW6d*E0`XhcttaFD;fE zTpA!sf~yTq3CCXS!&#OP!?PI>Tu4XJJ=k2t{k;k|J)gr?4fvTK&OQ|4<-+%%FhhRn z%m4epXD1{_%Qh?7eZZF`#KP4j{5phxzwq5J_pb>bd5!WrCG=MAqe8F>_$*7T?i}y- z!>wFwlk2&Kwy%V321`SBD}*O;>o=h`yz?R-q_yZ}=h2W}*QYdp-4_s@;o+GeVQckf znuXUbUafxBmW~c*)i$hVYV(_7VrG|kXD!BB2dmsw<~f+tg2~+ZB{dxlm0S#0T2}5m zMTG12a!FND-&tx_1z`ynR`u8HZ0aOj-%hlcWZ~S3*i@DB)~3eV-NnT@_-fXd1nfCOKJBW=T#sD<-QJ^HsPcv8EBzJU-C?wv9TSWa}Ksq;_Mwx1>)2uDAH#Z zk7clNy%bO!T$UoHC6@>3+6mtIW%h>!ea zY5lkN&j9n2|FFcHEeEZ<_B;E&$MW>Zzu!lG%I=k)^BIYG%*3(#HG0b&`#nA}R}p?G zztxkAVn1OK^kQw@yXAZPoxO)+MXZI)oqp+y<&s}p*V@0OwPmCC`yBv0sxzOIi~oc2 z0dG{P4Zn^5;(Kb;>MXk^Yl6APYx1RaJo&cnt{fW*$BCH72=?#|ppJ)eb+l)O(4NUa z9r&A0X70MctlSLLkylQM94`wvYp_Rh%9{#12Ml9BDH%(h1BM1i_?|^OZT&ToT|1^Y zKYY0PrFH4|hpya%x-`;Wlx`Z@Du!-uB+p9+{iV=tT3SK+bhN8xW*4S63ZGKBTfQ&J zdmrwp@W-?#(B|bF8Mi$bIC38Cggg_pgW2L3ejH3VvIuS0chT15Jh}HjHK(s+Wn|>N)|9?pwvR!Z{6^7i}E!JB>CE=jeSOJV}SPUdFG&Z_2Vq`tsp!{v$Jvec&VJO94-Boot?$j+$jG^GM~J7zA| z!NEi)=j=O?{Glr&Bip7rvl~$~@f*4)Po?cScb~=Fjk6Cq`9muMeZ7wJW#kc9GYMH9 z2w<+Bliv%Soq^onE982~xkmy8Qx2R8&V%meLvN5L=!Tu)9=z8X2|ZeNYy>(91(LJC z>v#fm$1n^%6v=OZ|AW(9eK1Va!R~iPF{f-v2IGzI)d|iO=QrL3o4yma{c+44yaRIw zD=~Mlq7Qa&=AOKN`IW;Lwgupx0JFDbT zM0Qs_g)M_&dsWSWyH8GYD&Ksd`b+EfB<)-Ge${U$H*VimwKH({QsB(1#(bY_zR&0P zsrLIMr!t*$D_?5NTY~Ru@Q!h(lyN-&(7Ah0$f-=4lC&?Bi>SrF@w5;9nZErg6r=kI^s8M%NmEDdE+TzO$rW6H79u5S6w$FTf_ z<@8JF+Z#ZWGXCO>@3Xe&0vAeiHSSQ>dqyI?HRQvz$&aaWuNawfDgts3W4jF$kOD_t82FaK0~K zodxmg)>+*CVN+*09jmjv`E*$y>nm^Jo3n+evwS6TJQs01_>f!HFubGRMxEs}%IG<$ zv#fTG|9A)f3ls9+T#h=+ovgFWP9J^EEsN0h%sKlS>MZk-23cPLJ>Ayn`bsV8D}UmQ zt*?waeWSp;q3hERB_22fxxcsEIl%e~b$<$Vm+wQCe+w?muyvLQ;(4&cF?ANK4T;uS z(0q#4{m@oQVR(jWrT&8SL)|cZyx$8MX$x#`FrL4F|FejjrLdFB5YMNdcJr7s*vEl& zO@70ACgYFKe)XLTtnYlDb8X%Fj(1(;XfOe5W2R#Li(}Sg4kDbiY0l@pu-c8=q2-a| z#FwCs^Mcs9#=1~Pp#R8QO#by0^Rn}t{F^*#&XG5BosrMN*3WOeweP}eqq{30 zzsdW(;R+Q+cBeZJnmnT#GTSk@PzwBzIx@>jwvX8M8Vv?sWjXfloe8J|22qv;k6c(D z=nGLM{VneQN9V|j2A zGM+~KeLv_NSRwkP4VyJZ%bh;*jyO)v&IIHe8w*kQLA__1)o;Mg(FWPrD|zgzW4kIY zpkBc7For9T>Wn-!GcauH2M+YXcH|bUv%u#E8xW4_WzO+VtanKIX7?uKO{RU8g8Crc z--S+=M{R)ZmU%`O)mYnb&qrV@sEfmvOgp0rbjs%zGKe+_q!9Fk^~y{Ceb(Wf(6^#@OC%foWxrpkDno z*nbA>(;Y9IR<;t~Hb%z_lg)S`!{ERljv1Qpp`D)e8)e6mlOnrW9;J^oplzI-MLUm< zo5_5C+MsKDum{M00eM_M#t5mSqzexj-2_B04dBaq?ik)bBJU)_o9^rb82V$UuMvF+ zXJM0#%TVr44-BWn{*qBfCP^8YoZ7YN5!44W0?Ch51rmSAx=2!RR&HoE=$jW;qz68Y zIvv{z?s)rBwr3#ImXDxKgzz$c7;lU-TW(j+403GRjL-KX{hfmS*>p_3(9SN*LB53c zAk*Lf);^q-?>@RI4gEJS?|8nww|QV)=>BO}CPl~6A712OT-)R?-w3=K!dUTeRbt-) zq=B=jf4D%+u#_2G=}>=3?3UX zHhECOj;9a@i}1}SP==gDT%;ktbPxyBEz*8Y3DWOb=_4vYew9{Ru=}j^5it)B;oA`M z;j_|D1UswjhI811FXFnAk%kPr0e2(LDJfGwE9M9)iKIW`slyW?OUTEBSKEv=b z@&e8WiR|gW>1C9C{d>A@TDRxov;8*?!J6!IQuY{9tx->`EvmL!$#ICS*2Z36GWeKT z1BT#PgHxkpuW3+C0{%iF7q?@BpPS+0b{)W5Dv0sdAC1?~SD*s#I2V1Y0Y5*SaqWly zH97~DCB*cZM?zffxGzhH=@b1E=Gp+mo26tH*tsE&zZbyA&)=`YX#Mcdfnu82gHiRbB>rB5tn%dH8eDn|<#TybpHh=Wkma9F<{Tdh|CLf72wqCBnZ5 zNz23+zB88$%Kjs9*ng48pDON&Xn6R^GYzKZhZiHf%MxPgcTl|H9D!vCvGf=b{(l7b zWeKtLYjdbSgulxYV(FCe!Rv9_VN9Jah~Jmv$nzU<@Me7D$7dPz<%gd^xcu(fS31ThnyciB!nE}PE{ZE zN;tTFgt24WpU()+^?DjVDmeLYZ!&ugD14~}aUWK=UT*>uG*>R%W7dK)O>pLS8cz|N z{<6HZSE|DEEr@%A!ZGd>z4j}7c@&MEVM_j)3jdCx|CqvU`9OM&JCe?bFI4o?1-E*( zPO}8JdbW7A;*)Mc+z%-}H!J)J#Yf|>C_Xug{yl}SRd}K#Ov=Af;qlhZb&J7}K10!e zN8!4Z92A^-&~|!8@Rc5X$U|?xv1e0SdW-AzWt`V(uftN5Qcf*Tui##Jo)O&gw|t)S z&|81e_A{5IxA=R4)8ECG3GNFdzb3vy;i(GO`nT)3NPmN(?-zP&SE4TGMZv9IS^O2n zU#H(T7?^1kpKJdK4bw2Q-!dF^ha35Cqa)l?NKE{i3#!7RX zg{ts~p>TgTD?C@>Z3@p*_+EwIr0`i%B-7uB!ZQV@ewHabTX5<}RICvHY{;b9vv@fE^P2$ zl4ssZ6dqQ1wZcED@HTm-K36N;)@P|tjiXP(T$CqE(QA1=qVNHECcXA|Na5LvzCq!s z3SXf7)ws18@-I;IX^LLk|6ZZ-%0Fk>>YFhU4kshvoLZbV(uPfPi`&~<+ucJx)hQ9> zx8O`R?0RclZ)wGOrZ}I0r<<1Fv%MITzqjAVslR1ByX+PmN?Tuw-4eq&I2fW6C#ZEA zh^LT6kGG8ywaNO}ve;=V;V{mNtNVC84n@VDfmqhcQ)=VSS$C%^qld(tpOjZuYd9W4o`tjpB&i_TcjsVZI#!E;+$TQ=-$YH|a>BX28e+Z)?D!&x2X?jBnk z4IU3~*|?#+rX8E6V~65;Gsl1IjO_3l%Hwjmb!Sa`om~gOGwH$wJ8=}QIiSYXa$y5_ zdDr-Q_B6K30l?PG|92<(hjU6ha9Z!$osCVMIE@RA#pOJe*d7qaXv0kOaCTv9b6aCm z{l+%4doq^Ts@O-|NOV~8EJ}E5;igt>bJ>oSyNY=HI%1v!h+|D|#ZqY+*KOEd5);N@ zIcmi+p^~=AJNc0s#Y${t&2LYZ(1)fyfKc}MIV$WoeLrh7V8DNj@`F1|+{4Ow1Ug)P9xZMJIH zqgQ>>O5nb*|Y&mcybEr>X?^rtgJG*0iu7kyQOTsYc*Q=`fwo=5hlAVF5VP1 z3GNyjJ$9SA4hu6HmswIY-nhyk2K)}gBCDcDm+2@k<9VMvq|58SJz=yWFDiUi@!dO- z6PwZut6#k719r?{;+UaLIM_3HYg0{UXFX09qz(HVjYe9YSyoh!BgyNqlYz@P4@Y_% zWWo>0GP9_$9XkiRId#m6z3I=Y-mh5Wk-@bM(fxRlP*u_B?$SFhmz#)Rb^}Vxc-iAG zx_AzU+uG~fYT9v>+XO-)R-*Y_II|W@p4xG?E7qi$c+9y4YtA;d*`v)?=M>emT;Edf zme2Kd%=YTrQSWg}Nwax|*UY`AnrU+{M;=kWy`rG1yqrc`j+#?#V_QvAhsj)+9lPbO zl^|A$V%bWf+{y;-x=~THHF^pkGmdb$qUN6Zy0Ks9;h@A87-?O2wUp{^I9yIX$N9m7 z{Pm4nTg}p};&^FhLq$$isSXuQX-!pD)+PwHv88GE*eXOZa*H)pVV|7O9Ifl73ml$^ zLjuEY?#S=4qYA5imC^k_ws+(*Lqv`f&c?ph9i4ppcumvJdb>Z!#O_E^S*0y?zKP23 z=tiB_=VEu4TbgQcJ|&}IyyCW-C|G@KJu+{e?$=O*EX$^(aA8wxi&&7?R{ToF4LGc= zbWGihD=LXaE!SOQ8RrDWtXRfj)N@OFYjY_o&?;YyAG71U0ig2b;^K<6Rpkx7C)X9k z&IHU_9h1S0-w#%Zm^w^ujT4hEE|RQ7tS@c3wW)PWO;bTj-KP4^o$W0ZwaCx^i`wxy z!*ESZ4dE=;E4Q%8THV;OX=h7kV>422T|JDYxP_~2al&*gdmj@sNY}+QqxCpg6O9?< z-=;YcqmEgG$xdLRQp}KzHy>gujGk?2jT0>Z+dwHT>L^}=3=})K`+puSosCeY+|!>o zT=LgBYg>2W>=s%`ZKr#nbu4UJ6Jsop3q|v}Mid+T>{^wJ%8`4(9k%=l=MXYKYxsmk zrMtKVkXclUE$7W1K;w?Y1HW)4iFDVPYE57IV-Y$gr7L>O$1T^nuR-b8u#VDPx3A8Z z01%UI)+ip4r#jE~(!Cv}1me~6B_Y#;Jh&`(4Eb>9u$pA&ym z`Jyh{FKq9BgO6jQVll!l>BN-oHi!PRpVG=|?_Y!RO!z6Bx=x7y>~GSS{mx=v#rFpD ze81pYmtwyV(tqmM8~%9mKk6et`vtB4_TB{f{N%^F4|Cb^ZTBtqy?x(?kNxED75Phq zkn*$Zc(U>z68SAXzh^(0mD}EL27#aaiDD3g_(os$JB!8BUyqOe*e_xwBOtNb#cw#v8_$e?reCl8XC?omZuK=wxGWt;9 z)pzeq#Jt}rm^Ytb)?#q(beDWI1iKRR{u9%!W%fNFBJq9cXtyD=T-D9XhB^gkW)2cZw%VIyWOfZ1z}^PJ^95%c|FYbl2@ zHxv5CdU01DSObwkeGE=>M!IHV-2mpWV%|IUM7y%01bYO`4?)lP&gvEGSt?T@3+5c3 z3t;|pKjzBL?{W?dWA5id=fq>57#;o3CBcQ~9)@m0&WXQkFz=yrm|R&I+R^k_sNnuD zajrc6^RYG|yBqpk5)7RqUk7XMC=1p+90?WP{#g1{cR#*<`l)orwK-Pi!H~Pw!SGDS zUSv~Ka~XzonUf#d6Uk4T-H<%A+{q6Goi!&h&-&C=?wT6%$OYffzRt(yQ6}Z*9_Y@> zlZy3j18cF43hR@G5%2xbIdti+<%eC7&nV`<{s`_3(8JfbKN#prX?^-ecCbCG1H$@cm?WuY)1T8(OpBOAQH2IDDJZy)1GZ<6dj{ z-6?!y=lynJ{R-A3N))IP+&A_AQtP8~8Zl zd_Lm-=HR?@_u~0s*vZYo`R5|Ir+I9k7jxuk12@A4mSc`|s@MS6&ZHqeUb@V+0c1Iq z$gMvr2sAE`i)B@JqWVR`T3@s7*RI_P0Y`c{p7egnYq(==OZvVg1|=g>VR^7GX-Z^-w#dAW`8@Pi z>8_WZa|ClEu-=>ddldCuz&;J&r&43W1jqAt-H4V6w0hoq~+0-SWo$9?pn)glqZ8h>pp&8fPTa; z-Khie;r;LFFVaZ}X(Sc-Rf)s(XJcjmHu3?i(|DEn2h;lnteN5Z7_Ot?x*4vMp*}{R zcKRwnTYZ&d*215~x)A0kp#udY%y-hDH--=AoM1f|_5lGe@;eP#&J;2q!M+_>H%B}C zXT-a&J7mVXvmEA0q_=TOo3CEz<_%GQzr6O6{r&1h{>~fkFY}0Ml*`sGxz>ex#eA+c zHeaM0_dZ!FvZYQpxo(y7s_jQ{}!$-#TrGpFAC1XdNHn{o)2uH z!6Nv6Pr|%?TY~dmc6qpKh0kMukOue@)o<~o>$iFW{iaSEuV0qKsW?+?jKArZZcmYk z{GIBt*Rz+-KW!rZ*tcbj{I{X(y~Ok|Ya;%vM!Lz`88ECaVGEd^PI_$ZKg&sBhg}oABi0vLkXVx zb&}MtFN@Z%hpVQdei`bs_3VDsg-$*lF!jXSS*~FZxLZ&zvi)T1){RoPW_wWAr}v=k zZ@)$R@*r&N%jY+if`19>vF=_LthYlhQ(qs-b^CTSU$)W6cP{GbUqQLJ0PW1XP;Z|1 zUcqal2@B4ZqOE588%7gCX7B!??PL2J(xk0P_ooq_!LPb)64qbQ6`V5kh}%XRT6_Cr zNz(VQN71ov+%0Xi9|t{cw4ht3|8ul~&f+F17k zh%80j1??nnT|ScP9A$so=yJ4ge%r}6^(QMs4eFiOO(4Vaz&IJ+f^MTSXm`lavv|A= ztk?HkIlf+>iaq!#i{Z7LdwK*+pUIiiZkR(~EEpMuY@^sqiTx|A8=+m|*8i5cI&8!` zb<&+hc)a20#a>Ika-v<-Gu6pGhH#A0#m@0OOxw!pTZdKJR)0K!F0fd_#K%0;9|y3< zz)*DG$9ZTY%rW~cp^v7L;X0&Hrm{jz9ST+Z;zeY;%0r z=6EXUzz-5XY;*i~wmEt~Y;*ja+8kG#zJ2a_!#cF>4`zRKKgt#MbGiLjGG2%AOWQBT z{a;w;=ea`Me+YfD{$l|_cP!w7>`TY7VfsV=ST@lwl#54uv5ynSNK3HiRtf6qA+uk0 z0{r*ipYjyGTgyEQm$NQ|{(96GN3TSEw?p<$WPd%}+;Y&})7tFWg}vcSTP5g@EyR@@ zefD|`!yUhH+gG+tH7ISWRSY}!^D}(EF}X2||MZMm^mEK&I>$Zx|1JsbA}6rrYW7Da z;T*D1_~FNgf@w#Vq_6)^?u7-JF^&@%S)S3giDNkoqu2j7i|FQ91in9o|I@W-zo5=+Yy|b?F2uq4jm3Se zci3@DUs}lDe_?9Q&~@Y6GF>y=I;r{Y8?GO$-<=6co1uB_h#AX4dv54Tx6OdD@SGux zW$H1WUf9@}u;9BPd^4^shH#j$fWHn4+m5F0>E{mlF}cIYZ~Ku?qCGptzw}G@4{Lu@ zqWaSEz`ri^i&J0RztiqtZPQP8wB5n<&2*xrjv=@7PB#1pMmJ z(a-tSNx8>o8tk3(M!44}^9+swu|=98H3kq6>jXfvn8ystxh6yy7BuQI+d=E~!J_n$-#6 z=P>^{g><)NE%E{66SjO9EKp%P9Sd8k#=jB6t0PVh^P-{o(Bmf~ecR`BZAw9S_x$F% z;Q{QY&2WSe*9?c9<1-hs+cpp6J=zQXC*jQe)!Ays7{7$pud6hK(Id=@{Qz-v`;h)Q`Sa&hlH{} z5we^_c+w&BL1339aE{8HBg<+cBM;%-?sv<+JmwW9tnecV-*P@lI>P5S2MFOpzu3<< z-cLCgPtmzTJdYCN{R|^*mhw?{=6A-%K+icWYZ8zyPzDSkUZZwh2)m}eV{cD>d-|c6 zee>G{*rc{`ev5J1_R#DnAE&)A{GqU$7i(MQx7wD2Cku@32Vu`WH@f!B@uQ#Bo+lbN z()N66JUg>YoJsApz4x{#;uI%~ak-k3I(maH*0d|cuUPjVk%P)MtU}PO^HPpQB z<+R-m!zsp|U7Msm(p>29C=33}Hx*z?OaChgy zosQWq`!S=qvgyd2N!avfA|H@VCw^$tlgX#iAAyM`m!40<7B6Pg1Mr{q2s>6oJ552p zm4J5f;{e?#>p70|5Xv_@j>CFg zGV(O`QF4#;ckjFf<4aPHwELuEjAstym}rcr!H)5ue5)Qa56?Zf>38p2Gt9Gh{tay~ z&Q)XGl5^DF!5m7qOBqgmrVhiJasTGms<3}H_s&jU8Zc)@tV9^90@Kd*vy6sbz6rgc zZc-NdMB^~#>!+}8`X{KL?SP)v&6u{2=S!BNCy=1h z{Vo;lFB`8|7v_mqx9#zj`*Mb#^vtj1`8R`@UuowOjur+@n|J6|oR_jKsc#|nDQ8{t z-8-lCaesWCg;D@}7_Lgj+`Q?1HV!EFd7QsOTlkTjBWCNN3rxAa;0X1J_&XXx+taVy zW<50NAyp4uo?zNRr(`Y~!k9CJctAS|V`Hux+o-9KiM$7~_dCy5z&y#6B-n4X9*VGF zJoCWdTG&&7=M%YYE80XV&KP2y>&MFi2j2PDgucOt9=d7tzO>=9Y|~G1=jJ|y^A9+# z@aC=9a~-yEcA9fMseotXI3vjcw5u5&%yVo+zXaW*~f%9o+EJ#zfBw?o?>x~v*Z!Sj7!c}923X;B7KZE=q#g0`T;^X1B3lz zXjhL6n)?2{a}lOp#yiRnj@2@L(U!n@W-5NmP;N;4`nCK0uuHLnk`e#@grAk~KmOF8 zZwNL@9hS;`V76&OX!GOjfg>dj+LN%&Qsg&};QXo#oL5kS`F&M?S$d9h{7&N>53Z$I z^$zD0`|v@#>QeZ;`=dB~P?xh2$Reymw#=i`oX~-uA}M`slXc zH|)B>xnU>%Yg=y+0=&jvYInA`*SFN}b~<*pakH=by7jHt0jIuW<5q`@r>Y8Do3NO? zwY|!R09!M(Hbpm^=+0?!=I$5f$I|#YhRByq5jIz-#QOP*F!GRjS&0H;w?nbV z51)Q+8bIgzhu43D20qmDe}j_Y#fN(S@6q#kUr;^$;I3a_G=3NkpJ@DF7ato-Hddsj z)z#mVo?6>f)3Pn~9(Tvm)Nt0S%vIskw5Fzenr~=pZ{3dV+)`KP)YfILSzRAqQ@^z) zH!C+kJ1-}HP3D%I+$}YD$PH)L3w6+yqVQvQG&8oTj5&PC;NwkqE+C#kG97~wywHbku8&}WKJh`>jNmzm;C-`QylJXS zw?ahjgO{W~HqFJ`q{6!c@5K983%z@Dz5&sRSITAr)?c2nL41FfOK9PNBq#TvHt$K;EA&Ngr)y`3GelS+wlI5gg2D! z@>${DoO(1&$$uD=BY1J~DX+z%&%{*oY7QLbQ>lbEBJx{*--W)(=dec)r!ig_n>BA@3Z-sR?O5Pd%3(Pu>XXo@0VrdA=`tKI4&xXJgRc6CVEW3I4W6o?jRKvxJZ3 zzfi(^y(b=z37=!4PaCd(61+?NwfG{uQ=fM43mcC?u?I_M?dJsv*Dg=EsJvu-Ww_yK%{@#Z8^~3LA zczvQ5=c*ZhLpQh{zs-Q+n$P(1p>G0nKYRne@xyE8xcvJizkWmbza1xBFN-{BvZt4& zpDTQxkmI{7o&h`e^Y_7-uD^CKbgSpparE;=p?@Cs!fUU{*^6|_csY#kcv(K(kk8NG zhpRx;{FJjn@WXK`si~p^8p|H3vulBk71vF^xp;jY<0GoEx$e%htG20 z)U&;;y(PuLXQAHZ=P$;HeDQC^(en((m-STL|A6^SOq{4oTb%r%C=Q=~+F|tT*h79C z{jWyR5&U#=As@l@dUFmSEAqym&Wax zRg?#7s-oAULQlLliaHL)>docV^Bao4*27zhPl@8Q8R?XlR}TjjuEX_=;NEaOC%89U z#}pqOt`x~Pz5a5KH7k$yw@z@czYT(W{cTfxw7*XX?zLxIkN4X1VdZbLE1LQ3RsL%H zc@I6ZcXKiS;dK?_k@OZHQuNx+-%|WFeqPaQf9)Av)Pu&cw$NPEv$lVIc2~AbVt(&Z z^mi+~PH?ZiH3&|BwY^OjgQvfDC_dN6!SfXUaYY}AgP&LURz)8Y#nN9Lt|o{Q=GRwd@PQ`(#>V{lP3PY=b^WFBI;ed7%y56sS0m(Nz8AW!gne>qVRhZ zUKt0ki-R{Qyj}5O{g4;s)OIqcaBU|=s2BOsAC7}3NKr`@=JOd67?@ z`)Gd46|T#>2ElFmlI+fD65QrL7Pn`rk-skQ&MW@4%HK@1zj%4|Y|l3H>bX+r$-l(? z)cn4vaIJ^;6t2USA{AM0xE2WR4Ogn*-f(?d;o9G$3fKO=BDmMz6M}pFeM9ll`b?bd z2HtDWb`Nc@Jx>>U`rEAZHcN2&tML^cddW_mG{L>~hjK-)?YvU)*Z5{dul=o7^crsy zoch=H|AfMIesxUYcdPKeD7e?&1_bxo+W`7uc+p=Szi%sC$8QMjUtZq$oi4aHep3YZ z+Eu^8b^ial!gY9yQe1z@N7LV>a7|w)xRrB_`?=E~xRul5Z0GVK|9jm>^Ltp~I}~0n z6$Y<7pH}$IivBwa*YclNc!Q!3p}o(G{O@od&2O8+HJ=l4@XYz{$6h)2$HAYAgTJWo zY$cD~)0+Hsxn}oj_Tqzz&&L%XtobpQmp)}d4A*vkNa4DCOp^*2`K(j?vEPZgy!lCk z;NJYCQ*fJ(?6|}(!EHLS_+CY?^MP(fukk~QJ`Bk$pC=T(#(M>4xOD!Iy~qt0ah-lQ zD_ob4Jqp+5xGt?Ga;6FHO-I)Y?oCI}3r_pVSNiD}oc5#fR|Kd2KceU#O^wN;%cCBJYrVap za9y6RU+T~2`8fD_h2QLcYJL|li}BI;3We)<$y2zFm-PzQ@lqKF->h&QUu_E4{_a({ z_P1BzI)0}wkA+K@cXtWScwD3Ouvy_ZDSVgUj9*RvX@zV0F2Nb^O^Q#q;MU%3zuu#Q zTYIzkA;l+8@p)eHSq0pVSNAJE8h>5!DOP+IuW(-|=dB9gtngn^c%9%@emkDuAh?y^ z;+=|*mjBZpK6ZXYmxqtVAC1H36@{-=a)z#ng{w{BX$mh=_3LU3>S(jz$asq^z^JoL7Fc}{R|`SOOM|5YW=cNBk(pHcMM-yub> z@nONe0-TykDaGu&)~6qEWSAopC=Tq)5Uib zuG7VP3fJi(H7yp81xi1ef_u|NiQwLN*{t|z`>#`cG~On-H(hiJ?oAh69{P~Tx>s;- zx_Cy>Yx{praPrsqF-5QK|9M5P@mB=*ri;Y%m_Btm5>mLf^Gw0L=^|U+*@8Gu5|U_O&5y=_r^=6;N+w2KTq+|c#+`V zbWtL>H(gYE=tHh}&Rv3g(?yq}*Y>|x@z?mHieB6QenqeG9>Klo;tj#Q<;8atuI)VW z`k0=_q$7oE`sspu^}k=?n?*Ogy{>TG4t+~->OT{7Q{|ht1*iTsKCJju2`z62Z*X5I z&n*gnQE;z43?-7Gd!gYH8|JZvMz^bY%fB4*7 z9yb95Bs>I^06r2_nwx|?DlIpJUEtesMEhFG08 zNprDMVgYtd&z)PD{c+{!<}+4J~#%SdlTR(At} z-V|LSc3%?drTkm*n;+s*o<@O7`I`hT>30cS%D-FSQvOzfOZn~oD9R({x6dmOXVbL% z+3k9!yIfr{s#t@{W%ncE6X)O;IdrP1kQ5Veerf4 z+Fh=^5fT1U{{;e<Y1}b z375}Enmz9_9C)6B)5?q21o^ysZhd`iy?)+Y9KK$#v|za(Cy=YV`WbV5dVRr`jk$$s z#T##Ns)N;Kb=&Oe=>yJp_h$ra8aCJCaQB*qQ2pjIJUxH*limH0r=Y$zRJ%M#jw}4B zo6Ac>#bs5s4Z-3CDFp>v3|h0f+J&z2FVNCg)@&%;)({F-XKVui_S*H&lOY%8j$50;kau30`n9>0Hc zF{-O7SVNUBS2FrDv~qQ+a;i!j8dObW4Scac>R_m%wp?*ZNpUGa z-1Dc03o6i*i~+nFLZzX~vSLY)@U;Y%D__aA}YHLA}lOmg2l{3Ev==^I}U3WDK zR<;Rg{FxB{+MsUzD}xOUr5l21+KSu8h6ON?+M6Yhh~+Apu-)Jp%^(ahh{jtNtPi2d z(CGZ>xm(MsHaApmp$lMx$)%9#d8IYwRl#Kig~hobEKDx;r`Uw5!LEX5S+=S$wRpkx zrB$1Qxu9CQPPD+n^kPMlwy~kIJU5q={?wJ5Rl_#C3$wtR$qI9dL0*_!ysq%t;#^9- z!oOfMtA{m!Mx=~9QbREKO7N?sau&cl=GK(emK%2=M4%!HL-lYrMpr{P7r(!W5qmR1I<$_r{6DnpgEHG@*7Br6GY z$|bd%;hWDZy+36$UejVrV5Ie@UYCP+x73uE))#H73l7SZiC_Vy*s6Fg#iXVx3Undp zif*p0FISe>0RN{osbnmJ>6W^gE5lFL4q{n#U6nt*2Ht5)a7AtHrp(z0N^@*Spmq5RJLhEP4)53bv)dDT7U0yN95+x#h&4Y^xG=*ufn zJJN`U6paj0{Hj=0!BE&O6oxj-c05$_RfQ?V%S_`gAgdMr6ls_)KgNg-e3)GUae<+M8u=#t$NAO~|NeSHZ7C3~j+1Wm8m?L)-5l+Gy50h{zR^+Gs@>{NN<+m~=Ra zL{K^`@>CUL4TDs*z6?bz-GH=ccL`Jy9mEav2IoqYqNOU`Qd(KXfr9Nv8qS$8O$iuD zr~-8Q@^hs$!DdcvbzNz_2{q1{C{<@C^-&zo+q}B$Tp6dPE0G5(==`}PD=yZLo_Bh` z*0@c7E}{L}5cEhy7yn#IOr6%zPu15TW#OhEx}{q9tcWj;WsXf6I-Hk4&$bMT?^JBtV#%KYgKRkfjpqS~Sg zs7%T?(D%Y!s4!LZR|5)+*gd6qK&|8!q~{khDBd_oB5EKU8>N?VfLctotnjBpRRh9W zq12)JU+spOkkzLva(K!7=@?M4uU}?6p5diq|A6dlBN$#HKh%K%%I4}|J;WSlaD}ol zZp5^YdS~GhgQ^VKhHR{Xvs9lzDtfQVP`H|h%?0m5Y6#ZW zHTeC|I|^b(*+Y~i+!Atg3p36+Rvs|Yj$R!Z7<8hxG2U&cEYm^F5GEQPle>rTWDIf5 z6dMAsDok7y2CLTR)nc|zkFSPQsJ0MWZZ%1uLt(c`4G6!Hr80GR7`%ZBap$l`A81q@ zG)6Pn0dY6Dt04}<*|Kn*3^Nnip4JT~D>WHm74Qi%8BQJ%59&{?Qp442gEc{vZpeD! z3=Yl5j@DQ#ca>l=heVlXM6;l>pf5&zq@tVZ5FlitiXnc>!))U5=JZkt{R;naiqSo{M4~cZ_A&L z%$dL27Lv_^%NKR>@Lwypy}oPY4-=R#ciROU*A1J_!asm~-WC0|_}yqRUY|7fGs}RK zpC5Pn$taLn%G3nr?=F*nok_@atRr{%SC-c4UU7cyXA(R%_7CCQY@BJ0v%!2k7l=En9w_lS`)#F^h-wTmi`4jq?TalUCec;qk@A;e4^Ae-GUMJl+%E z4cXmiU*w7Myd~sgd0@ivzTW-?{}0Zk_-)JL>;KKqD^Q*n!OOv!ihTDt-z%Pke>@+e z3-22z7K`7odvykkwTW1~s~!4?=h+zRaE_Hc3qzihq3i}{M^~`EeM6pC@or$8K8wPK z^Bu}Si@F+cRz)lHfcCV@hx02&j2nDj1<%J2XIJ%g#o>$v$j$QrVz+|Q&ewdA7w_W7dGpu97N^247kQ`j+>Gyc!`>Eor>gTS5{Edy zVv#w&BEg(r!L!YOUuU1%dN|Cp98l(2IDdgU4&dBq>X>IysPk9Md8j;p-=79fSNl?Y@h%{(`{Mp{Y2PAGTu&?XGH%Cs!|qeA(~?&$h9>@cavjfpnl z?MPM5k2Z{gen*3^uicgzwv4=D+w&&DZ}dCuIKz(TWps?$iE}t`?nBS_JngX)oxY9G zMN+BLvJ83{1N$EXe-b+~(03pF{?+jNSHVUOKE0wR8?PGuDzJBO_6O;!MmjIg$Nlf) z%#XdEaXr7m`424X)puq0zVYHo@PIpsuU& zyM3fHk-rzCP4ir!c(mK;Xj2GZc0Gjr)}mcq8c89Beicbo|_ej)Nl zjA3}hZHgJ=6itQf3$`EF!!ysR+wP5qToyOS_#16t{TOmUibU|8s@1S>D zPbF;qpm%yt0D(%wBIa2j^2`n)`xRdF}!kNpMvUY_wmTZ684A>M0Ag09$R zsJ|SXWpM=OSa@)cerz`MVRRBtzmrFWC(|1weK)2JI!80>rVJkeB zf<7Y8(Pw2ip0Z2$JK#8{+4ihFHm`HZ)rqYo7I$H(ynrCd0wn@89g5A!8-6DkFwF!31bGUeJS63AKcuSv46wmX3@?o?2u-PO} zTrT8FM%!NJbxcLunC;iVlFSBjIhweh0vkT*}U59ZFF5B6i`1kkt_Y?d(T;{aQ z9f7zFeJlHrOO($+Y>V^UnBI$jOoN!I<#3MnyGNkIaEyi6m2^BKlyszdYwiHL4xDEj zKC_JHzhQh;@8FEjGw3fNr}7`_d};LYAKWkk=Pu#=ESxcY65|e@{dCwnx#P?jr|+W; zG4MfNoV_)w<3sPrj$X9C_q<-#=L20RTPw~c>qFWkoHLHNs3Y;;L+~N+C-9kZ*@3Lj zp8oPHa5`y8x8Blwlzk(77X4Dv0-j~%>~m1>2{?;-(XF3V=NUDkzrPf9$g@UyJ`d%1 z(>txhw=%Wao0X&boUYOE?J>^2H{mOpr;QmBa26_c%ilb+>n-?q%2|Rlov5E9=AJ(9 zX_6`f{jb#xbjlbDddP+EU4nAw!1p4~g8uCJ*!_2SUp{@S5B@k7_u@cy-I+&T#foufN2r&358kD8^Gs#$P`S+it@-ZuFl`F;3qr$lK>MUf5OU zY2ldfz5bEy-J6^PO8$$S^v@z)f6s{aHt1&t{P9fm?MG1_#$~s{H{XbVf9rJJ&v>OR z#;1IEI{Kn+=!!8n%W2Pf!r^xdn9t!H0L-OCnj=+8qWgf*n@X6_oj!h|GB-BkA6H7G*_Rrem7GNazh`r**v% zXg`d5-H01mXJ`}iy6~Idw_%HQFY1)Bl}ZPUdG^Q5?5XrRMg1`|deHUamVi9_49gKvR6o2H{5-@bp()XI&$i_qsk z1KXJm-Ee%(Izj)EPJSF~PTiK&Tk)O6?LNfT6;qtPV;EQWjtLxKoOuIy9d@Pd9D#8; z(lWk}E1tZk5gz|VdO)Y*{b!AB zvdz%W*w@hacVCf>dd3-!@Xsp#M_;4k|41KnhGVQrjQjOm7bc>V4xc^QU!-_2jp5-t z)4!iK-2bdTH}!)XMq-}8i?%RA+0)6@qXyX0WZ2I)(1&vz{{id>W5%Cj4hHj&*3ZVX zzwg+J{^bVzgYQvoHlYmt8Tur9b|QT|>#GDhXIZwOpE`Vp?u)y>9HV?9`o(!&z(|K_ z-wa#FZ^TUPc^>28H*iL6Bd&)wR^9K*-u?r|5%`zY&3ORi#ktKp;0HS~KS~~y`4Ifz z(NTJwSb}?>gI;+C=auIAK4duv{+vrX2>t<%L0$aY%$(mr@Tbpf75v)-f9vzw%si&N zN1tcYu^($P%;#2zd@b& z&<71?{9b}Oq0dnB!Kf#9UjY6mx-iGh`@Tkf)+hT8N#~%Q^M2wG_c`VtYP_H5%<5%Y zJKj%lW}V`1)n|d9?W5Qp)f@!!ejmPs=QVRah;rzdExzLn`ZYVxFa>#ji2KwFeF^%$ zzV{I;ccI@fF}msl5?~+je|^ti5;*Wv==I8sudV6%$v@VQ**<1Q%5xNKWx@AIf{ zjtPrBJ~eJk!r9Ky?SArQ+(nqY;M`>Tf=}Wro;SWI zny;|;hV&Ka_Z!We6=NeikEZ6V;KyKh^X%B<48|t(9kx&SL)AssdDaDO*Ve@%*eTbh zP$%ymg}o+vd>ytf*dMZv{zugb`(U&W_POkb=_hUbV1La1mg8-<583b9_Q82}-EJ@z zM<4F)gH@YBzk5CWBl}}LRyJ`H#wBmW>2;T;Iq>Dsul4)%^_*v%f~)SMCv_Z+(nn)V zn%;DKac>ja3;XCpsLOfaW5?U7-$s9``fXeX_1mUjWxrj9e%1C_?tVLfdt*)gUx@3u z`aIdc4%O%VsrUOOQTlw$J)(6-wGQMzLmD)_N|2Z;WcQA8iXxW?n27b7F{N(y+$S=b$fw4%J*A=CM>i$aJJXia2T>))CP!AK*G^;0Vi_;Cl;v7VuS z$JmFlV?NUGZ2H+)r|Lu*o?$GAc~184j=9nYHqK;hhWT2|dvWZQxYKEAi^CWQu@uI8 zr{_U`arb$87hoLAvMfX2j`z#=9i5x4`aJho=^N0o^=+{xrnT{G7v$6T^xCzagPAq& zU!aFa5d(NYKO225b;)_gw=i#L=UL%rz!zh1$o$!iRX<=|__og|ggzGh8fBx;YM-NJ zYP&#>-`aswZ?=svZfgbIuc71HP-d>lsWmvXtG!qo+lIEqvB_TVMJnECa;=ZG86UdW ztaCStHL|8CYh+DkjZEI#2_4vU^qt*iY;p=V*d^l)V}rKpoon>h{LZTfY6q zS9;(>e)Vmq7uPIlSjHWuj1@zaafc~m zi76xdiHay?tUwv#VHffq%V^Wd{^4VkWk5`2%J>m%k7ZJ7!n}$EzquoE$ zi~U1qMlVrgn|`d_Bs$t3!$*YIZx+Kh+=+ift=(|m;~)C^zln9?Km7X5r~7}fS4hv< zB$#$Zdrd^UvSTd=z9|kinuvBa89qbaW4p5H*sj`)U*!InR_Pb#>b_a_)wJ26_W$Jl zPuTx6{*qp{hm)(L?ES$yWd+(D{d4zO=2=SMQ`nA6q04n>^LE~(X-*)k2{A#FW^3HE;4ex4pvogC^|F=|Wt?^-#NK=OfG~6K9{~#9`eD zYci*?C+0oSpwGX5GI(5cao|8A=2^Ni&+^oT7dL+svCA^VDqq^+n{o0hz8U>7v1(4$ z?ltYl7|%gJ=w45%F!2lTvrJuPZk2xDi}G>(XbRdT^Ckao%(vQjlI_#dvwa>i?ejyd zLw1_>DfjjqL%Ht0{68PeyW&3|L_E6bL)gqc=p#EZr+f@$%tt=U#>F-t!ycR@d|%|5 z*^@NeY1xT*wH;-=^1eXtau3!O4DE9C^BY0e?H$um4BF+OZ368)(9Fa?>JjC?KM!(K zmy83fK9p|p+Z_*Beegc@Vf%Hf5BC33AB+Q}J}kY|2iIkz>BGH`2{vxlHDWj2{@;3C zqX)K94O`*b#t!UHdgh(}qI)KeXjOjTB`|W(Yzo;4ZyW`;U9;8$2 z8tV`jU_X^wzreVL>lB~vV?w+@f5fqijC~Mm_Wf_!$FvOlJnq5VYhFO_JNw_f*C$8p z^_lyjjuivgKg)OmKJcu2eH^nVXt;ZQx-btAj#F}??+ap|+=}@f_=i5Z9|*B=hy0E4 z!OLgnaxGfVgK++XYt7u_!Z?e3y2k3YL(VOgF2-CxVg}AjF2X$g!|-oSW-L;H`1?ls zd-y6J_qp7GIVaBd?ucpcPIV5DS4kXWf4lBDnR6SFwE@K0j2D=WKA(F|?4IN%?04Z> zf|3X0hY#0b-^<+WEMJVXK<^Kks`fLf`_PZxFQUg7@T2LHCutJSjLzV=Asu4~Jzp?c zmGuM2`yu8{?HIlv>xs*R&u1Uk8D$?w;t+ixb!huQ#-{B1V$Gfoci-1$`@SpOv8mo; z((R3`CvG{}zd(<3BICX@b0g!uKh)kyJ6_~-3XCPY&EAF&ZqR!h_^g84KUR$SJ?v|U z7LRdX1NI;c6_2rRUIZJk@!0KHTjoB5ZoJ1Nzk| zL+oql#QeP7*D!_q8iu(a;m4=?i^d^7dmDLt75x99vZnVS_8EA9cT61Hyb@)tLB9=| zTHf%CRr?W~kNb-rL%)6SM=N@ePW9WbqTi;COhOqGVCUF-8ICod#r_3i+&8HDbl5!N z{QW-AFwM|=7WA_T;r$9ZdJWswKkJ=yrL1>%-^e-BUtmuk*P^+PF5(9!!QW^;5{mfc|=Xnro`vL+{48lJnzS2j<%TW~}YwS%!GdSHl*ET-$FoW6p=c>)UF~seN~3K33bn zN%VCb!-v=IN9U+ zuB)17s>EJ4J7>z+v(?PgaGs&b#Gdb;V}Ht@%erd*Cscs_5`FRIabeF*DawzkxXS zI;^Me{!*YFb0!1UQysOQI!%px81Hg?^rm<6JdT5!hP8G&wPQEtZb+}^6!g0nw~(%9J5_de-`~nVke$aLY;Z~cDyp%^;hjfmSc z2kRd{1(uKB+{1C@XeaHb-&W6A9w?4=ZfeBbM)64JCY;?~)G@(XkOZB?;kk{t?QwgO zFn_TFfpz>!!DqYBM0Sn$~sDdtXu<|j5Z?6G35N8*ERoV=0;fmZ^Sr#w1GL0lXIk$754u?3C7Eu zKW2Q7XC2jE@sq2?^9Fn_%KY2~S z#K5+$0$pYHycfnmU#O>v`TpDJ zSD2f!`l6nGf#09{mcf4N5A9pN5yiK>3EwAuOV23bTi{dh%tulF7~@kgUrB#Lo4W4z z>{FJhciO!4^9s!Gsd;%k!{%O_P8=KYDUZPC4CPZAac|X7J_Tj;^bOyq(4WwcD4zm- zu#M7}(5FQ6CrO~;J?l$4@g6AKHr&4CZ0(fwWZNm*Cfn&fUzpc?);5Z9N3=Ft;&t}( zIh#Kvzh!kofAJyw#hLNbd)Y_xIm)R%#3b-d)8MB#w{oi1(>@RHT%xc3U|sB-%@R-g8o6_A1GH><>!J9w&~;+sv5!EPLpMW{I zq6(IgvGcg;&3rD3-)DKI^!QN6-2dQ%e!AEB_QZ|L?&bc5O3-sI_R4V=sXY)!)gFi` zJqQ@f2x*ybe5{QRK~G<$JwG0&I#&`u`A=*!;mM0`PmAzg}vzS z8?kP(75giD(NFsNZ+)d{1lAgUbK5JiSjR}3*!f?0PuUCe&}Np+e*Qr`GxEZ$i=7i6 z;@w_TKi=_=md9+Y<#2wOe0*L{^DNJ_o*d*8dm4Q3&aYU!ZwP&l;zwT0pM1$P>2%I3 ze1_^n@7)hteh)*Ylh6~_5A41r#&Fl*_f))d>-~4PqwSixWxVgI0{LPO;)!Og|219U zYrba=_e96_#O}Q3!5(iK_M41pUR3IwcoyxDcpUJ2V9QTzzkib_zIoGZ&^u##Vvuh> zzUKpvbK;tdJ@M-OIY;3qjzNc4-WBNO+UoMVoZd%J4~TdASndpz=>sK`UjLwNbzzNp z)@bL%mB^EOtMC4+KyNJ4Rdxj0=OHHA8xz-41|BD|AI8QCo57E3KQ~{%x*Z(rQ&(4F zZK>*=uiSqRbUF^}`*+90HB;8FE_Pae;~m@4dDo7|e>2fJ@w1&yOY2>W9)BFyQslD( z>rs4m_7%1EGznvoSs06$^_o-t`$BI9)H5=a`5w^ydH|i)b;-w|`*xt6y8bDif9+&j zzu`x0&wXQNVt+QSY{y5@hOa~WZNL152f2rhv9*JJ@Qk++-|rg>y1l4}0QBu(jM0es z=6g~WCl!0fZki3dX`CK-Ivek|iJ4G+$!s6qo%dSlR}vCRF6sX3z0*rQzU5Y54xV?t z8_%WPgE1J}To1-pd?u}Vdf>oH#5woE&hEo{2;-*a>9~Ss9NJpG|M5LZ&>wv}_Z)2k z-SUT>cJhd;OzLGFsQqp?{8+u$itjgIEa%4cm<(;s(D7Y^e2?H%?7v`J!+Qqr=eq^5 z))ju=V1LZyo-M$*U#TC@y#;V}_l<30&6?vI+c#2=j8ofP&$+QLh=;$B_uMgTlU>7x z&uT<@!}}DB&kCXJdm$U;+H2%$8sb@9`VGp}Xyz&DUz(!G)daaFK`wcZa@lnBr4>f5 zlaQ+x6z+XgB?-Nb}fhGyQ|S$1>S;vVXvH9#QwQZbdn1Ym~1d#_6NZ|CHowf_!|(Bj*_^;FDMfcCYrC z@iTgTXzTi2hfc>w8$9i^Jf2Ox#e7$tw_VwtX)hu8#+$LW-tF})PePl@oPB8elpWi@ zj{2F$edcz(m}|;xU-X-uc(;OYN8s!9F=Ou9```}vvfH6wKKsJ`0F%L!_hNDHD)cGD z_KtM?yx$3%y!Uj;EB9iqqw@W)-2WJSBK8~3bB;K*eD_!5PWVIcyB9w3VdWF?u1E0B zhkrPDOH%Jqtn1Ui^Yu*cUm*=Pb;(U`_ubyD&a4Yrf>6?oc7Qq&VkDHF-dLk)3JEp zB<6n(aBqJbe6;p|k#`_|gm)mG8J(-*4XuYrpQ7sWMF0Misvlup^Ik+h33v`W+=rtM zkFhVQ{g?Jw*j60&Y+3v2M!IF5*yXe{YhxQx&SJbr0%O^hxXYfOj=gSaTTot>o3Up6 z7i0Gvg5Fv7Z$jr;(0K-QPCfKN-|s`;+;dR@K9yJe*MqE!IP?X0(PQ6a`2YRuoEGYc zdma+d9~}Z+|Bv!iUEG5H<_-AC8QU+K;hfR$Otg0VHp)QWtjh=Zenm3}a4;smhjE_O zb0zwuX!@1!msGl~{a4lhpw0$-us=$DFrT14@;CeA$?=%aLcdEN=s~<>_3Yp~5~z1K zpj`X-E`ZIn>+ymH-${eH%Y8n~!8xAJ&xK-~cGi8#sK(F9elf=IX5Cu8C8zuMa|{q; zc-nidz^y*q{pK07-(A%`e7gG?bC#tD@xw{jB+GO+>VxgnK|6T>vEKu*&0@#N()OwM zsdK(B5i;iiuYi3sZ`jKhDi8-yR@!?a-Yvwo+4G*~2b-?@#=Cqc+ArIs6@v(se{g~ss8$M(L+6vAU{lbKCj=~PZ zHpZik9_O4~Ox&hQ{5~-<(D!}Mgyy>3*gYq_ICUQ7c;o3n&(72RMHA7^egnVeALUG( z0K1zFd-?yM#|qe6EZRd7;+{nq?;gb*TIq#>r%Mnc#Z1_E$!x?%jE@*6F-Cd^?@07O zUK=-;d^j5K`rvan5xs=t6w`nHImIdTYi*v!pXVWlV&BPl>Q60}O2mAi?Kj=;O1AH# zPKWN@F*9SwUwtKZ#!TP&X)iIwN0J@B11H=sWFOghGm;rZk@IKG6ehg@-Fw~23g zzYJ}-Q@r!#5aP(ACcX{e9-s51{j%RbWa3;&!+67{PY~JJ}-|aU6VM@lf&1=S&;}+V|k|N>E4i z(e7uLZ2vjDI7N(~H#}$FPi*6mNW9tjUjP30k*6*%V-y_|sj_0fne97igFT?*yPYC2 z3fGV@CNnY0>03RR--^L=p8B0neD6fGSmhSzjj@VtH)|*Pn)9&6!gmC-@0$T#@_oS6 zWuJF?2j7dA=S6?zb?{6n)<>>*H5{|dgPmW5m?bO6X}LAWIq@Z29nAZZe(ymYvxLxx z@EO^Q5l1p+Nyk05)k^d`cI}64u?zcH-EB4Rlzu0jyRF(jnsJ_NkL;7#X4zIJqt4~M zXGB}I=>vF&QX9sAKD=9wZMGG<;n?&r#-(QM?*U88cPUXHdi1%d7=n3HJE??W3{B6gNbfr2h$= zGG&3zY*|M@U-)Ta zr$O_m&=a2_=eXa_g;GzPC$)Q*SohSEoI|zus3)6F>dDTby7gq^7xx_J8O(9o_wIb6 zST|0@y7*2%^IONdhUai%UH1Qp==+C?b=l8chrXY&0Q>*8YyFIkfBy-*?E7P6`wv9vtJ_3h&APX3gfWS1+qUk17k#vi@7PZ>PH)3pY9;)F zeScy{4CancFL@>Zz9p~VS-2N44=_>2e*^2_jLXL(E=OGbh4F~Xi7_s}0DkE| z5SRDkH{h(|~I^PyGuzxZmJx;mOhsPFYp3 zwBA{dgXv4lDwqn#d#SHDrxb_g8ak&Csc{4rua@BE`pQr+!JMtjlnKjl8d@pNxOV~p z+|pkywu}d#R))4YH9R(+$F7Hyf@dTt+RtzMfxG|YpV^Lc=O<77Y0BYh0OROC=*JWN z$e}?p43`c@HY__EE9k0$?U6_zq9^8_YfK!QUHYDIA(gvIgp5RZJpFH26kXTi< zrTXf+`r3`bvQR>5dRck$g4CdYL2!L(MoLCjT4s9Ig5-7SIR6!2GW==f8SAr3{YjJ> zZQJ2m1@?8Q?><~(&3CNFV0ujB7vPG0zKUidt{0l`7|%MG2UIxT$Kp&g-)G>8Jy8nB zc^(eeMVJ@*9A}RCekrb(neSKNnrOby!}Ut@{c2n>pQ+OFtVTSys=lY4WfVD4dfy2!B!0Uo;56R?!dkURNmGt_($zWhq897QzzW;l&#copa`#0Km~ zai5=k`r<4wc-LYLSWA6m2>xFNK{Wo~fu5t`{{g#-hG!4KhvpKE{vcjHFd@bWEiRu! zQ;9}Db_hN2Y~pD24(uly-ZTXN?+!uViY6M3&yxwjqsUJ)i-w;VqP*+p>Uvyjc-?5O z7h7DlZ^yCtUqYB@{P)2$qv78gLY`T$L)wr1B$%(AXa{p*BL2#@uUC=poS2Bey3P23 zWRz=842;EmEZ#Q?@>oz@-$y%*hChKWA)5UE%KD0k8RqnLO!P*>z36W2>o`f5CN5 zOmbLX)<4{YfM-t36=B@g`wy_lGbbj}-^CmL9_V3COr+l&Yxr-#{W&p_{%D%P5|*K=avq|L|L|9jBSoR~=bP-p1BkM7Iru>Cf(^W=}Qd$G>XJ_k!G^kYVPkr;79x=!w2H2&sf9%H5a}rLDN6R zU=W{~rik~UJ(JHgU8sgoCah1VSF4i~?QRc_uYtR%)A2KSkWnXUibh_xr zBS0nnZqz3~b^78IKrV$F`8rL#|HkCI*2uHV(C;$%ZKjH?JonAk`rK;htlwxJq50nl zJ@NB^(PyoZ$7lG2^lj%W&^zV1%E)Q?m%zUfzm&l^J_XkP4WB2BYqET9fj=jGmC8+fZ@DHTl2YLB9qA$)z&@b`V3?J<6Q=e_7-pi2>Kek*yG4#F0)EAn3 zer@XIMYJ=1j-WmBbJFOi+vwp54LkFVy&bw#1J>ROjD6l~t_TG-{HsF`L8e2_^TNjFVYvM4CSFd z?U1Cz=<^a&?=$CXLR;@6jJ-W!T#&`b8+&l9%K}S&E;IIAk)(e=Y4qG__#_xU)}BiY zUhx@CZ~0F*_MCwF;m6v^22)=p=^76i`9E*$a94`P>-5E0VanCyDp#waKWT7lw=0d^ zCT3~|35HM5)MK})N9%9#UIwMl#LsHNawE@ZYtM-q-)H#b8au%ubn0X6_PfSDpG?;H zYlhFWro68j{TwlTW|(~Q3?FNU1*7Sot<^wprd}=uKEb4wmutX38vcKi-lUcEPY!{9 z9<;P8+n-qpa4x*UZ99b8)n^pq7Sbo0JkV^_=Xv~%CeKgdkD}q<1pjDq{>KpX0iBIA z1NzN2-+4JM@Rb5jF!ezC$)`~8=@huk_icg8d`B34 zx%2fI+?}u0jXPiKe=Q#?(h?URix(MuI^?pxg!i@@octGBVq70Jcn0u1fn!ZqeW*W) zKVfjna|J12XZ-9lILjsR=LG#4O{)GL67&*(P0&j|uM2vKcN?7LvTchQR2Y9oT-H~s zz-4_||7Z1V?c^y#@2;=s1RrT9hYTLpk16wuf{&8l;I9il$p+(PA=*1XZuuJpF6G~C zaJT#q8Qd-Zqk@l=Urqd(eE(iap#LNoe@c0l2s~NflKwV>(+(y6fWQ|EKDWU?@MGoI zzp!ZR!fjnXU~pS5OW*3kE&Xc-r~I;AoD}$9S|+$&HCq30>%Uy!QvbIZ+{(Y+@Ve9B zR!)mI2|iN)j|p7LS!WzI`QIeu3>lpKC4R4NEN*5GbAX9{|mZ-T&Y(Ja;9O9dZEpD1uif0e=Aaux_&(uWN0mVc|@FZJ9c z=%qaO3j9_f|1QBt(mx<@Nx$3RZuy@QxTNngxLf`sg1?miq@b7b;5k$EA)niX{HFvT zNso7=s}Ji}(vL8>TmD3WOZpWCcgtTO_)GcmK3w%7y_Bb1;N_Y`{jCsuBz={@C4HU2 z-SR&ma7q89!QJvdCHPDEUljCGo|go^L&*QC;3Mf@6S$;*-QaHdM~u--iEj}66AkW` z|0;vK+wVd_FXagcJSg}t5quu2fx+GKZxy(d{~?3BHbX+ijhmVIVZPtdU)A3m z1s{puCis{ko1%YJ;GYwGR*cg>nC~?LFBkYKf!`+Z)dJrw@PNQi3cOz63op<=n6H^4 zP(Z7|&CpWeOU6g&OZ8Xvcdfw9kX+$a0?!fj#|3_)z)uNW#(@*eppSB<3i=fSUn%h0 z1TN+56u6}C75H+&XTn7N!`j<=b8ni#Y0tDPi_bJT<&<$(K;V-9+9CLt48gx#@R9s? z8Jy!RzmWd{gL9lE@kb3#In7jwO7)V#-TvWKgS*@H5kW8gRky&cZkWN_f{&y>E^tZT zYjC%JOSn)M(%rvgPSQBb^^pFm{)UFYUosO8q?dNvEpTbKBQXEQ59y`dP7t`X+nEAS z)k)RgB7sXg+&2XNw!o$RjF_UCy6w|vaJPLZ>gAB2m-y=jr``$#eXqdx3f#fG z96zN0uKue2&J_4x2>bzo|GmKX30&IMa{`z2FAjmfDsX9szG*r$%K3L9-(-Wk^`B;N zxBe3_56lnwr0cKh??QpgcGM+sY5&uv>%`>f9}~Eg^N_%$ zoS_*Jd8C|=30%tgoWb349x}LF&X)uqDQD5lNWN0eI)O_$n+(qOm8FxazxNuP?Mvcq zg3pbDexJaly}c@MX+L8xj>swXvqIofKjj8@>!-rtZvE5=K2krA30&rTMBp;tQwDeE z>tJ1gA9ub!gVPRWzPAZn*2`{z%X)cC;3X<2{pVGIOMNDqbxP(d%T*$9S+1=HcbDrn zgS*Rhr{E*YH8VlWW%+#D$eLhq%g5r02B(}~Ftogs2>kN`SDWzgoAi4H?whTD5SMZ8{9Ig4*8JzM=q0|-;4Ie)EsFZv zD{$$z3+8Ad(#v{p61c4QR)gF6vN6-62DkNP@y7%oS?_6cqvu;CaGCF&26yM%WN>%B zy96JZ?}SUE=bI;RnQw`~-T9Uq+?{Wg;3M;WQs955MNofVG`KsSe02!?^&#-Y%Od6a z3&B54;IiKH1inPjuNAnYZxVQ_pnuHZ)Q^l?o)GwULBCJnWdeUv;9CX$l)gWT;tLHtSBm;UOIpqKb- zf?o1@UC>Ls+u&|LRzV_s-2SRn;IjQbX>eP=>veMHDTBM)?{k8WY`=#DAAYs_OkWgy zB>uX=DQB|Dlb3~w`iEQoMuAKDcN^R-|3e0M%m1k0BjrCO@V^)Gj7^Hj^Cf{77@U4d z(w7T-v7pbJr+-*E?X3cXTRAO$ufeGYxgIp(N=@O`Pe9;OKWhzc^R@L`VsM+U#mfaB zsh@0!|;N&CmB0>Mxf_|;Q_Xzw( z!AH`U2wc*a8{9qb@si*#<#|=`k@yioFZ1md_--NR+k%gzKQ3@df70M?Ij0#XOI*?~ zG`L&O0fW2sTp;MBJVgTk8zKK%!AH{HC~!$%VsN+ocM4q6w;9|m|6_u`)c;e0Udq!c z@H>S3&j~(~{*b^W{fh>7%YR(pl0N=3Iy1NY(+uv`f1;q5@?0hGyM+A7f{&z66S$;b zXmGduqbH6!eb@K9aso;FA6^gS+K_N#K(HHG{k5 ze_i0;67qBj{C0sK5%@O*{|$1lK)A8Oa8qAm;9%hPL%Rrj(jgOdCwGhi;yS5 z;FL$wUn+1(pJ{ORJH~_+w}9YJJ_#m|Ji$le6@rf`ib_!@_K1Kg<_wNe@F8kRc zgWGyvZ+NXWxUFA{mk2(xpM65``I?YtpWq|$=LEfMkB0<)r{MFV;3Mf@61b#))!^>- zdrIJcCHPNB(?6)UhXlT4K?IleTOx2-k97i<^?0wqWqrLa@RcH89FVI%ltxO@CkXK?rUC1h~7f7@zsw_mzf(615Y+9l{E-YV#&ojfY&CH|zr zshFY4tv_~P77!GeA~#n)!>$o#TyOI za(zLR>q&tx68Ks(iA;LgPD=zX+v!sVcl)bOgS-9Ja|WmUS0GeTe{yBlC3jBz{DbIrf4;kk| zT=Kt7;3la`)oO6tF6?^BqXxI_!s7b`J*UR)bL~&MaQoc(Q-Y7A?{wjo{yBqFe&gDe zoNo*MY)4j}%A7EDkmwx+{z?bQy>hHp(5kArmiwy3z!?gx? z+hK{|Bkk}uf#-{S6R(ZrEAf{M?ymRO1TO3Sl)-JiTYqRD(y;Yz@d4CO z$a;TK;8Oo51upGjtoh-#hY1FE+ru=2yZvyQz-7Lzx>^R!&%Y*clT;zc4eplbq`}?t zoDzJbeZDC0N6mL$jtKm_0^bTf^22gT{0V`}`bvz6&|j;+s=oz8;9Ct1`4Tc5KLeTLr$>d?zmLbDH2U>E&~RlD<{YOMC7V_!5!tO9GelmkK-oTS0H1p)pqKWuTi`N2 z?-sbU!x2NYU;Ca9$|L!Y5PYPbt^X&z)N{F^ck8*z;BGzJdLbXFXZt+5o6kc-@aZx* z`A9jZiSkN0GX*a5y~@;=J74QJ-10Yx`jz>13S8#fC2*PV+X9#R|3mw|2}TaL-?RAd z%I`fV$}9DDO5jp&@uq&=^BpISd8VBbuN3qZ z0%v_qH23NRzERNc5;*B6n|r$jUM1+C6gcTGGWR+K9uo9j0w;Zfxo4l>r~K7|-sjan zYH1zg)e~VlDf62wi z+W%_;r~TXa_SyHRSU$E*CYy#pT-tM{z@_~M1TN|G1TO8rK;Y8;*9u(Pe~G}Q{Z|P5 zn?lb`0=K&1ZTp@bTV8AbyGQE8#P1V)?E73Sy|w4#g8m*sk8=Rj$I{!mylDczThQ~p zM*LWMYtI3J->*s3-x7ge4kXvy!+BEbLq1}5ApnpQ(q__6@k_!)y zkw)vpR({*|CJ0>G!!&_Q`$-VEq)!yMw4Y>wOZ&+bxU`>uz@`1<3H(wN#l9EQ&Kucs zec$M4t1%ejQqD$!%W^ddT+-Y3A&`$OmwoR6aapcb!AF*>P2h<}MqZu}ILl?%Qr^*K?oe9?#vL`#oRxeAV+UPmAZT zJ$pR6J%8i5!*i$SF3(QS%!{U7JZIJ=b7$OCw)H!n*w@(KS^0%IwKXA}6H&0VV7VVZ)m@xBQC%7;#HkcD8w$2;%q>hS z-gpbRtV-F~;7_@>s&-vz)#`P8i?BZUzna(T2o#X zTvkw+T%4Qhhad&@wV~SOI61>`OuaTIFIZIn`e0pEu%@!1BDn~-Qvuz4_1}VXYuCi ztkTPaq0-7KfBNeB@?d?iJg>B&qNsEoq+3;3>`xOY4%tvxDoIFjJrD87Rb*>|$hkB` zv>;T!jD=jFZ|8y_wHPICsDQ*I&Rnw@hjCN~g|xZ33vzMd$2Q#0E>1^AtLqwa3$u!I z(<*B!L+3AcG!aEfaOTId!j$4w_;*gh(m|}GSrC!NDt%x!X*lSl;{0X(W2@MoS|6n3 z%W4X$O3Q-hUx0yH(Dv{04|J+uf&2vc#w1dirQ!qB{Ppz$4y*adc{mNi< zE$p{oOSNe0rZs2Lgp_YcFT>e0p`i2!mWD<@Bu%8%I`hkFtE+LEjZGKkoyDe-Q&rl~ zAlVmW<`-(dHbFR};U);@kXBtfFV0?3T)e8-@6SLE z_M{#yYv%gOn$jv9Ae37`2b)fpx4KSc9Vv{P3;mNh_~$&hfPJKXWWI&P(X(ZOunvcr zAZ5XqYHNb4*K4_!*4I{N*K8}Q;6X&WYnDfF%m@2cZ+uEt3%4Yc6`mR21swLNF`c5L~=1x7sCB*5*2t zEx59j{a#Kjx)pRW!y6;(O&Yk2pbj2Z1{)e6BO(Ld$v|YWBnTT0F5O&H7Q%T0!YK?00K!$Dn_IBF ztYGOnLq!38^G+vN;p--E+rH0y%p z3<($LzDh>F(d=L6Y|1jUEPk{kSDR}XN~i&iE=svnJ!~lRFIb8G?z$Rt$Xu{oMZd|~ zy)LV+t3pw>h~BWEs2FY7R>Fp|lw_t?QLtbl`%mE=2c$&*ViFFZM(murxU?Pz;~`FW zyI18vocZW65QXEqty*3Gyuy7n)#}(XXtH=NX1A zGqic#Fbs}kj%8^Z8!F3DVPr)c@TX#Uxq7{gUeb6

ltzD>th#l^HK$^klmQo0uLW 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ç|C5X#_88Jfsn0)#tTtYu9ossq?UC^= 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

8g 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�zT~`*^ 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%0D5gZzTL(@2L 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 w>o8s@TR_hog6E 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�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

RSJiL+i&~j1KY}>&6P=V36Mjj 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

);LT+AxYA%>Sk?FFs>OJdytu>^2 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%0Amo^=NPpG5v-{P*_i{4eU0^8e@K`fT}sFbV%J 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 EeHRgr{o=V$TdA@xDWE?jS_M_?Aq!d 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� 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

~n=yPS&1>Hlds*@NWWt7x+hkKjrrQ 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

I=VlbF8BaKfGc-ZOngHm9zONYU!1~u21PN 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˙y>s;neapYgD%#23c4$y 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%0DT!9m7q-dpd+*ui+4ds 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

g%X! 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

K@;KzRC5qVJ@cC{vap{e#f25`8NDjQ)}@-+R1g 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 XV#_XZ9#rXfs|W%zUt4^vJ%j%MNs(gi literal 0 HcmV?d00001 diff --git a/samples/js-tests/CMakeLists.txt b/samples/js-tests/CMakeLists.txt index ae3f9066de..b7bf83398c 100644 --- a/samples/js-tests/CMakeLists.txt +++ b/samples/js-tests/CMakeLists.txt @@ -26,6 +26,9 @@ set(APP_NAME js-tests) if(WIN32) +elseif(OHOS) + set(PLATFORM_SRC + project/proj.ohos/entry/src/main/cpp/main.cpp) else() set(PLATFORM_SRC project/proj.linux/main.cpp @@ -50,30 +53,124 @@ include_directories( ../../frameworks/js-bindings/cocos2d-x/external/chipmunk/include/chipmunk ) -# add the executable -add_executable(${APP_NAME} - ${SAMPLE_SRC} -) +if(OHOS) + add_definitions("-DOpenHarmony") + # add_definitions("-DCOCOS2D_DEBUG=3") -target_link_libraries(${APP_NAME} - jsbindings - cocos2d -) + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + Classes + Classes/ExtensionsTest + ${COCOS2DX_ROOT_PATH} + ${COCOS2DX_ROOT_PATH}/external + ${COCOS2DX_ROOT_PATH}/external/chipmunk + ${COCOS2DX_ROOT_PATH}/external/chipmunk/include/chipmunk + ${COCOS2DX_ROOT_PATH}/external/lib + ${COCOS2DX_ROOT_PATH}/external/Box2D + ${COCOS2DX_ROOT_PATH}/external/tiff + ${COCOS2DX_ROOT_PATH}/external/tiff/include/ohos + ${COCOS2DX_ROOT_PATH}/cocos + ${COCOS2DX_ROOT_PATH}/cocos/editor-support + ${COCOS2DX_ROOT_PATH}/extensions + ) + + add_library(${APP_NAME} SHARED ${SAMPLE_SRC}) + + find_library( # Sets the name of the path variable. + EGL-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + EGL ) + + find_library( # Sets the name of the path variable. + GLES-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + GLESv3 ) + + find_library( # Sets the name of the path variable. + hilog-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + hilog_ndk.z ) + + find_library( # Sets the name of the path variable. + libace-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + ace_ndk.z ) + + find_library( # Sets the name of the path variable. + libnapi-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + ace_napi.z ) + + find_library( # Sets the name of the path variable. + libuv-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + uv ) + + target_link_libraries(${APP_NAME} PUBLIC ${EGL-lib} ${GLES-lib} ${hilog-lib} + ${libace-lib} ${libnapi-lib} ${libuv-lib} jsbindings cocos2d) -set(APP_BIN_DIR "${CMAKE_BINARY_DIR}/bin/${APP_NAME}") + set(APP_BIN_DIR "${CMAKE_BINARY_DIR}/bin/${APP_NAME}") -set_target_properties(${APP_NAME} PROPERTIES + set_target_properties(${APP_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${APP_BIN_DIR}") + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E remove_directory + ${APP_BIN_DIR}/script) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E remove_directory + ${APP_BIN_DIR}/res) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E remove_directory + ${APP_BIN_DIR}/src) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E remove + ${APP_BIN_DIR}/*.js) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E remove + ${APP_BIN_DIR}/*.json) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/res + ${APP_BIN_DIR}/res) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${APP_BIN_DIR}/src) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/../../frameworks/js-bindings/bindings/script + ${APP_BIN_DIR}/script) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/main.js + ${APP_BIN_DIR}/main.js) + + add_custom_command(TARGET ${APP_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/project.json + ${APP_BIN_DIR}/project.json) +else() + # add the executable + add_executable(${APP_NAME} + ${SAMPLE_SRC} + ) -pre_build(${APP_NAME} - COMMAND ${CMAKE_COMMAND} -E remove_directory ${APP_BIN_DIR}/script - COMMAND ${CMAKE_COMMAND} -E remove_directory ${APP_BIN_DIR}/res - COMMAND ${CMAKE_COMMAND} -E remove_directory ${APP_BIN_DIR}/src - COMMAND ${CMAKE_COMMAND} -E remove ${APP_BIN_DIR}/*.js - COMMAND ${CMAKE_COMMAND} -E remove ${APP_BIN_DIR}/*.json - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/res ${APP_BIN_DIR}/res - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/src ${APP_BIN_DIR}/src - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/../../frameworks/js-bindings/bindings/script ${APP_BIN_DIR}/script - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/main.js ${APP_BIN_DIR}/main.js - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/project.json ${APP_BIN_DIR}/project.json + target_link_libraries(${APP_NAME} + jsbindings + cocos2d ) +endif() \ No newline at end of file diff --git a/samples/js-tests/project/Classes/AppDelegate.cpp b/samples/js-tests/project/Classes/AppDelegate.cpp index 9640e35aa0..8b751179ea 100644 --- a/samples/js-tests/project/Classes/AppDelegate.cpp +++ b/samples/js-tests/project/Classes/AppDelegate.cpp @@ -159,3 +159,17 @@ void AppDelegate::applicationWillEnterForeground() SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); SimpleAudioEngine::getInstance()->resumeAllEffects(); } + +void AppDelegate::applicationScreenSizeChanged(int newWidth, int newHeight) +{ + auto director = cocos2d::Director::getInstance(); + auto glview = director->getOpenGLView(); + if (glview != NULL) { + // Set ResolutionPolicy to a proper value. here use the original value when the game is started. + ResolutionPolicy resolutionPolicy = glview->getResolutionPolicy(); + Size designSize = glview->getDesignResolutionSize(); + glview->setFrameSize(newWidth, newHeight); + // Set the design resolution to a proper value. here use the original value when the game is started. + glview->setDesignResolutionSize(designSize.width, designSize.height, resolutionPolicy); + } +} diff --git a/samples/js-tests/project/Classes/AppDelegate.h b/samples/js-tests/project/Classes/AppDelegate.h index ee146a75d9..82c9897c05 100644 --- a/samples/js-tests/project/Classes/AppDelegate.h +++ b/samples/js-tests/project/Classes/AppDelegate.h @@ -33,6 +33,13 @@ class AppDelegate : private cocos2d::Application @param the pointer of the application */ virtual void applicationWillEnterForeground(); + + /** + @brief This function will be called when the application screen size is changed. + @param new width + @param new height + */ + virtual void applicationScreenSizeChanged(int newWidth, int newHeight); }; #endif // _APP_DELEGATE_H_ diff --git a/samples/js-tests/project/proj.ohos/.gitignore b/samples/js-tests/project/proj.ohos/.gitignore new file mode 100644 index 0000000000..f02e936298 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/.gitignore @@ -0,0 +1,13 @@ +/node_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +oh_modules +entry/src/main/resources/rawfile +libSysCapabilities/build +oh-package-lock.json5 diff --git a/samples/js-tests/project/proj.ohos/AppScope/app.json5 b/samples/js-tests/project/proj.ohos/AppScope/app.json5 new file mode 100644 index 0000000000..e95d7a7b40 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/AppScope/app.json5 @@ -0,0 +1,11 @@ +{ + "app": { + "bundleName": "ohos.cocos3.6.js.tests", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name", + "distributedNotificationEnabled": true + } +} diff --git a/samples/js-tests/project/proj.ohos/AppScope/resources/base/element/string.json b/samples/js-tests/project/proj.ohos/AppScope/resources/base/element/string.json new file mode 100644 index 0000000000..7ea35e6be7 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "3.6_js_tests" + } + ] +} diff --git a/samples/js-tests/project/proj.ohos/AppScope/resources/base/media/app_icon.png b/samples/js-tests/project/proj.ohos/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 + { + OHOS_LOGD("Cocos2dxRenderer_nativeInit() - branch 1"); + GLView *view = GLViewImpl::sharedOpenGLView(); + view->setFrameSize(w, h); + CCDirector::sharedDirector()->setOpenGLView(view); + + AppDelegate *pAppDelegate = new AppDelegate(); + CCApplication::sharedApplication()->run(); + } + else + { + OHOS_LOGD("Cocos2dxRenderer_nativeInit() - branch 2"); + ccGLInvalidateStateCache(); + CCShaderCache::sharedShaderCache()->reloadDefaultShaders(); + ccDrawInit(); + CCTextureCache::reloadAllTextures(); + CCNotificationCenter::sharedNotificationCenter()->postNotification(EVENT_COME_TO_FOREGROUND, NULL); + CCDirector::sharedDirector()->setGLDefaultValues(); + } +} + +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000000..4448b81987 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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. + */ + +#include "platform/ohos/CCLogOhos.h" +#include "plugin_manager.h" + +/* + * function for module exports + */ +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] ={ + DECLARE_NAPI_FUNCTION("getContext", NapiManager::GetContext), + }; + NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); + + bool ret = NapiManager::GetInstance()->Export(env, exports); + if (!ret) { + OHOS_LOGE("Init failed"); + } + return exports; +} + +/* + * Napi Module define + */ +static napi_module nativerenderModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "nativerender", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; +/* + * Module register function + */ +extern "C" __attribute__((constructor)) void RegisterModule(void) +{ + napi_module_register(&nativerenderModule); +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000000..6a9293652b --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,30 @@ +import resmgr from '@ohos.resourceManager'; + +export interface CPPFunctions { + onCreate: () => void; + onShow: () => void; + onHide: () => void; + onBackPress: () => void; + onDestroy: () => void; + onPageShow: () => void; + onPageHide: () => void; + nativeResourceManagerInit: (resourceManager: resmgr.ResourceManager) => void; + writablePathInit: (writePath: string) => void; + workerInit: () => void; + nativeEngineStart: () => void; + registerFunction: () => void; + initAsyncInfo: () => void; + mouseWheelCB: (eventType: string, scrollY : number) => void; + editBoxOnFocusCB: (viewTag: number) => void; + editBoxOnChangeCB: (viewTag: number, text: string) => void; + editBoxOnEnterCB: (viewTag: number, text: string) => void; + textFieldTTFOnChangeCB: (text: string) => void; + shouldStartLoading: (viewTag: number, url: string) => void; + finishLoading: (viewTag: number, url: string) => void; + failLoading: (viewTag: number, url: string) => void; + jsCallback: () => void; + onVideoCallBack: (viewTag: number, event: number) => void; + onAccelerometerCallBack: (x: number, y: number, z: number, interval: number) => void; +} + +export const getContext: (a: number) => CPPFunctions; diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/oh-package.json5 b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000000..fa7874d594 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libnativerender.so", + "types": "./index.d.ts", + "version": "", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ts b/samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ts new file mode 100644 index 0000000000..a89ce067f4 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ts @@ -0,0 +1,80 @@ +import window from '@ohos.window'; +import UIAbility from '@ohos.app.ability.UIAbility'; +import web_webview from '@ohos.web.webview'; +import nativeRender from "libnativerender.so"; +import { ContextType } from "@ohos/libSysCapabilities" +import { GlobalContext,GlobalContextConstants} from "@ohos/libSysCapabilities" + +const nativeAppLifecycle: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.APP_LIFECYCLE); +const rawFileUtils: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.RAW_FILE_UTILS); + +export default class MainAbility extends UIAbility { + onCreate(want, launchParam) { + nativeAppLifecycle.onCreate(); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT, this.context); + // Initializes the webView kernel of the system. This parameter is optional if it is not used. + web_webview.WebviewController.initializeWebEngine(); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_WANT, this.context); + console.info('[LIFECYCLE-App] onCreate') + } + + onDestroy() { + nativeAppLifecycle.onDestroy(); + console.info('[LIFECYCLE-App] onDestroy') + } + + onWindowStageCreate(windowStage) { + // Main window is created, set main page for this ability + windowStage.loadContent('pages/Index', (err, data) => { + if (err.code) { + return; + } + rawFileUtils.nativeResourceManagerInit(this.context.resourceManager); + rawFileUtils.writablePathInit(this.context.filesDir); + }); + + windowStage.getMainWindow().then((windowIns: window.Window) => { + // Set whether to display the status bar and navigation bar. If they are not displayed, [] is displayed. + let systemBarPromise = windowIns.setWindowSystemBarEnable([]); + // Whether the window layout is displayed in full screen mode + let fullScreenPromise = windowIns.setWindowLayoutFullScreen(true); + // Sets whether the screen is always on. + let keepScreenOnPromise = windowIns.setWindowKeepScreenOn(true); + Promise.all([systemBarPromise, fullScreenPromise, keepScreenOnPromise]).then(() => { + console.info('Succeeded in setting the window'); + }).catch((err) => { + console.error('Failed to set the window, cause ' + JSON.stringify(err)); + }); + }) + + windowStage.on("windowStageEvent", (data) => { + let stageEventType: window.WindowStageEventType = data; + switch (stageEventType) { + case window.WindowStageEventType.RESUMED: + nativeAppLifecycle.onShow(); + break; + case window.WindowStageEventType.PAUSED: + nativeAppLifecycle.onHide(); + break; + default: + break; + } + }); + } + + onWindowStageDestroy() { + // Main window is destroyed, release UI related resources + } + + onForeground() { + // Ability has brought to foreground + console.info('[LIFECYCLE-App] onShow') + nativeAppLifecycle.onShow(); + } + + onBackground() { + // Ability has back to background + console.info('[LIFECYCLE-App] onDestroy') + nativeAppLifecycle.onHide(); + } +}; diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosEditBox.ets b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosEditBox.ets new file mode 100644 index 0000000000..2587169f24 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosEditBox.ets @@ -0,0 +1,82 @@ +import { TextInputInfo } from '@ohos/libSysCapabilities/src/main/ets/components/editbox/EditBoxMsg' +import worker from '@ohos.worker'; +import { WorkerManager } from '../workers/WorkerManager'; + +@Component +export struct CocosEditBox { + @ObjectLink textInputInfo: TextInputInfo; + cocosWorker: worker.ThreadWorker = WorkerManager.getInstance().getWorker(); + + build(){ + if(this.textInputInfo.multiline){ + TextArea({text: this.textInputInfo.text, placeholder: this.textInputInfo.placeHolder}) + .id('TextArea'+this.textInputInfo.viewTag) + .position({x: px2vp(this.textInputInfo.x), y: px2vp(this.textInputInfo.y)}) + .size({width: px2vp(this.textInputInfo.w), height: px2vp(this.textInputInfo.h)}) + .padding({top: px2vp(this.textInputInfo.paddingH), right: px2vp(this.textInputInfo.paddingW), + bottom: px2vp(this.textInputInfo.paddingH), left: px2vp(this.textInputInfo.paddingW)}) + .borderRadius(0) + .maxLength(this.textInputInfo.maxLength) + .type(TextAreaType.NORMAL) + .fontFamily($rawfile(this.textInputInfo.fontPath)) + .fontSize(px2fp(this.textInputInfo.fontSize)) + .fontColor(`rgba(${this.textInputInfo.fontColor.r}, ${this.textInputInfo.fontColor.g}, ${this.textInputInfo.fontColor.b}, ${this.textInputInfo.fontColor.a})`) + .placeholderFont({size: px2fp(this.textInputInfo.placeholderFontSize), family: $rawfile(this.textInputInfo.placeHolderFontPath)}) + .placeholderColor(`rgba(${this.textInputInfo.placeholderFontColor.r}, ${this.textInputInfo.placeholderFontColor.g}, ${this.textInputInfo.placeholderFontColor.b}, ${this.textInputInfo.placeholderFontColor.a})`) + .backgroundColor(Color.Transparent) + .visibility(this.textInputInfo.visible ? Visibility.Visible : Visibility.None) + .onVisibleAreaChange([0.0, 1.0], () => { + focusControl.requestFocus('TextArea' + this.textInputInfo.viewTag); + }) + .onFocus(() => { + this.cocosWorker.postMessage({type: "editBoxOnFocus", viewTag: this.textInputInfo.viewTag}); + }) + .onChange((value: string)=>{ + this.textInputInfo.text = value; + this.cocosWorker.postMessage({type: "editBoxOnChange", viewTag: this.textInputInfo.viewTag, value: value}); + }) + .onBlur(()=> { + this.textInputInfo.visible = false + this.cocosWorker.postMessage({type: "editBoxOnEnter", viewTag: this.textInputInfo.viewTag, text: this.textInputInfo.text}); + }) + .onSubmit(()=>{ + this.cocosWorker.postMessage({type: "editBoxOnEnter", viewTag: this.textInputInfo.viewTag, text: this.textInputInfo.text}); + }) + }else{ + TextInput({text: this.textInputInfo.text, placeholder: this.textInputInfo.placeHolder}) + .id('TextInput'+this.textInputInfo.viewTag) + .position({x: px2vp(this.textInputInfo.x), y: px2vp(this.textInputInfo.y)}) + .size({width: px2vp(this.textInputInfo.w), height: px2vp(this.textInputInfo.h)}) + .padding({top: px2vp(this.textInputInfo.paddingH), right: px2vp(this.textInputInfo.paddingW), + bottom: px2vp(this.textInputInfo.paddingH), left: px2vp(this.textInputInfo.paddingW)}) + .borderRadius(0) + .maxLength(this.textInputInfo.maxLength) + .type(this.textInputInfo.inputMode) + .fontFamily($rawfile(this.textInputInfo.fontPath)) + .fontSize(px2fp(this.textInputInfo.fontSize)) + .fontColor(`rgba(${this.textInputInfo.fontColor.r}, ${this.textInputInfo.fontColor.g}, ${this.textInputInfo.fontColor.b}, ${this.textInputInfo.fontColor.a})`) + .placeholderFont({size: px2fp(this.textInputInfo.placeholderFontSize), family: $rawfile(this.textInputInfo.placeHolderFontPath)}) + .placeholderColor(`rgba(${this.textInputInfo.placeholderFontColor.r}, ${this.textInputInfo.placeholderFontColor.g}, ${this.textInputInfo.placeholderFontColor.b}, ${this.textInputInfo.placeholderFontColor.a})`) + .backgroundColor(Color.Transparent) + .visibility(this.textInputInfo.visible ? Visibility.Visible : Visibility.None) + .showPasswordIcon(false) + .onVisibleAreaChange([0.0, 1.0], () => { + focusControl.requestFocus('TextInput' + this.textInputInfo.viewTag); + }) + .onFocus(() => { + this.cocosWorker.postMessage({type: "editBoxOnFocus", viewTag: this.textInputInfo.viewTag}); + }) + .onChange((value: string)=>{ + this.textInputInfo.text = value; + this.cocosWorker.postMessage({type: "editBoxOnChange", viewTag: this.textInputInfo.viewTag, value: value}); + }) + .onBlur(()=> { + this.textInputInfo.visible = false + this.cocosWorker.postMessage({type: "editBoxOnEnter", viewTag: this.textInputInfo.viewTag, text: this.textInputInfo.text}); + }) + .onSubmit(()=>{ + this.cocosWorker.postMessage({type: "editBoxOnEnter", viewTag: this.textInputInfo.viewTag, text: this.textInputInfo.text}); + }) + } + } +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosVideoPlayer.ets b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosVideoPlayer.ets new file mode 100644 index 0000000000..6f67afe3b4 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosVideoPlayer.ets @@ -0,0 +1,39 @@ +import { WorkerManager } from '../workers/WorkerManager' +import { VideoPlayerInfo, VideoEvent } from '@ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayerMsg'; +import worker from '@ohos.worker'; + +@Component +export struct CocosVideoPlayer { + @ObjectLink videoPlayerInfo: VideoPlayerInfo; + cocosWorker: worker.ThreadWorker = WorkerManager.getInstance().getWorker(); + + build() { + Column() { + Video({ + src: this.videoPlayerInfo.isUrl ? this.videoPlayerInfo.url : this.videoPlayerInfo.rawfile, + controller: this.videoPlayerInfo.controller + }) + .width(this.videoPlayerInfo.w) + .height(this.videoPlayerInfo.h) + .visibility(this.videoPlayerInfo.visible ? Visibility.Visible : Visibility.None) + .controls(false) + .loop(this.videoPlayerInfo.isLoop) + .objectFit(this.videoPlayerInfo.objectFit) + .onPrepared(()=>{ + if(this.videoPlayerInfo.isPlay) { + this.videoPlayerInfo.controller.start() + } + this.videoPlayerInfo.controller.requestFullscreen(this.videoPlayerInfo.isFullScreen) + }) + .onStart(()=>{ + this.cocosWorker.postMessage({type: "onVideoCallBack", viewTag: this.videoPlayerInfo.viewTag, event: VideoEvent.PLAYING}); + }) + .onPause(()=>{ + this.cocosWorker.postMessage({type: "onVideoCallBack", viewTag: this.videoPlayerInfo.viewTag, event: VideoEvent.PAUSED}); + }) + .onFinish(()=>{ + this.cocosWorker.postMessage({type: "onVideoCallBack", viewTag: this.videoPlayerInfo.viewTag, event: VideoEvent.COMPLETED}); + }) + } + } +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets new file mode 100644 index 0000000000..f26ba14cc6 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets @@ -0,0 +1,43 @@ +import { WebViewInfo } from "@ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg" +import worker from '@ohos.worker'; +import { WorkerManager } from '../workers/WorkerManager'; + +@Component +export struct CocosWebView { + viewInfo: WebViewInfo = new WebViewInfo(0, 0, 0, 0, 0); + cocosWorker: worker.ThreadWorker = WorkerManager.getInstance().getWorker(); + + build() { + Web({ src: this.viewInfo.isUrl ? this.viewInfo.url : $rawfile(this.viewInfo.url), controller: this.viewInfo.controller }) + .position({ x: this.viewInfo.x, y: this.viewInfo.y }) + .width(this.viewInfo.w) + .height(this.viewInfo.h) + .border({ width: 1 }) + .domStorageAccess(true) + .databaseAccess(true) + .imageAccess(true) + .onlineImageAccess(true) + .zoomAccess(this.viewInfo.zoomAccess) + .javaScriptAccess(true) + .visibility(this.viewInfo.visible ? Visibility.Visible : Visibility.None) + .opacity(this.viewInfo.opacity) + .backgroundColor(this.viewInfo.backgroundColor) + .onPageBegin((event) => { + this.cocosWorker.postMessage({ type: "onPageBegin", viewTag: this.viewInfo.viewTag, url: event == null ? '' : event.url }); + }) + .onPageEnd((event) => { + this.cocosWorker.postMessage({ type: "onPageEnd", viewTag: this.viewInfo.viewTag, url: event == null ? '' : event.url }) + if(this.viewInfo.jsInterfaceScheme != "" && event != null && event.url.startsWith(this.viewInfo.jsInterfaceScheme)) { + this.cocosWorker.postMessage({ type: "onJsCallBack", viewTag: this.viewInfo.viewTag, url: event == null ? '' : event.url }) + } + // if u want use the javascript on ur page, u can use registerJavaScriptProxy() to register js function here + // and confirm that just register once by a local variable + }) + .onErrorReceive((event) => { + this.cocosWorker.postMessage({ type: "onErrorReceive", viewTag: this.viewInfo.viewTag, url: this.viewInfo.url }) + }) + .onHttpErrorReceive((event) => { + this.cocosWorker.postMessage({ type: "onErrorReceive", viewTag: this.viewInfo.viewTag, url: this.viewInfo.url }) + }) + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/TextInputDialog.ets b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/TextInputDialog.ets new file mode 100644 index 0000000000..6830af22cf --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/TextInputDialog.ets @@ -0,0 +1,33 @@ +import { TextInputDialogEntity } from '@ohos/libSysCapabilities' +import worker from '@ohos.worker'; +import { WorkerManager } from '../workers/WorkerManager'; + +@CustomDialog +export struct TextInputDialog { + @State showMessage: TextInputDialogEntity = new TextInputDialogEntity(''); + cocosWorker: worker.ThreadWorker = WorkerManager.getInstance().getWorker(); + controller?: CustomDialogController + + build() { + Column() { + Row() { + TextInput({ text: this.showMessage.message }) + .backgroundColor('#ffffff') + .layoutWeight(1) + .defaultFocus(true) + .caretColor(Color.Transparent) + .onChange((value) => { + this.cocosWorker.postMessage({type: "textFieldTTFOnChange", data: value}) + }) + Blank(8).width(16) + Button($r('app.string.text_field_ttf_complete')).onClick(() => { + this.controller!.close(); + }) + }.padding({ left: 8, right: 8, top: 8, bottom: 8 }) + .backgroundColor(Color.Gray) + } + .width('100%') + + .justifyContent(FlexAlign.End) + } +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/pages/Index.ets b/samples/js-tests/project/proj.ohos/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000..dbb983025e --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,158 @@ +import deviceInfo from '@ohos.deviceInfo'; + +import nativeRender from 'libnativerender.so' +import { ContextType } from '@ohos/libSysCapabilities' +import { TextInputInfo } from '@ohos/libSysCapabilities/src/main/ets/components/editbox/EditBoxMsg' +import { TextInputDialogEntity } from '@ohos/libSysCapabilities' +import { WebViewInfo } from '@ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg' +import { VideoPlayerInfo } from '@ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayerMsg' +import { WorkerMsgUtils } from '@ohos/libSysCapabilities/src/main/ets/utils/WorkerMsgUtils' +import { WorkerManager } from '../workers/WorkerManager' +import { CocosEditBox } from '../components/CocosEditBox' +import { CocosWebView } from '../components/CocosWebview' +import { CocosVideoPlayer } from '../components/CocosVideoPlayer' +import { TextInputDialog } from '../components/TextInputDialog' +import { GlobalContext,GlobalContextConstants} from "@ohos/libSysCapabilities" +import promptAction from '@ohos.promptAction'; +import process from '@ohos.process'; +const nativePageLifecycle:nativeRender.CPPFunctions = nativeRender.getContext(ContextType.JSPAGE_LIFECYCLE); + +let cocosWorker = WorkerManager.getInstance().getWorker(); + +@Entry +@Component +struct Index { + xcomponentController: XComponentController = new XComponentController(); + + processMgr = new process.ProcessManager(); + + + // EditBox + @State editBoxArray: TextInputInfo[] = []; + private editBoxIndexMap: Map = new Map; + + // WebView + @State webViewArray: WebViewInfo[] = []; + private webViewIndexMap: Map = new Map; + + // videoPlayer + @State videoPlayerInfoArray: VideoPlayerInfo[] = []; + private videoPlayerIndexMap: Map = new Map; + + // textInputDialog + showMessage: TextInputDialogEntity = new TextInputDialogEntity(''); + dialogController: CustomDialogController = new CustomDialogController({ + builder: TextInputDialog({ + showMessage: this.showMessage + }), + autoCancel: true, + alignment: DialogAlignment.Bottom, + customStyle: true, + }) + // PanGesture + private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.Up | PanDirection.Down }); + + onPageShow() { + console.log('[LIFECYCLE-Page] onPageShow'); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_ARRAY, this.editBoxArray); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP, this.editBoxIndexMap); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_COCOS_WORKER, cocosWorker); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY, this.webViewArray); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP, this.webViewIndexMap); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_ARRAY, this.videoPlayerInfoArray); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP, this.videoPlayerIndexMap); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_DIALOG_CONTROLLER, this.dialogController); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_SHOW_MESSAGE, this.showMessage); + nativePageLifecycle.onPageShow(); + } + + onPageHide() { + console.log('[LIFECYCLE-Page] onPageHide'); + nativePageLifecycle.onPageHide(); + } + + onBackPress() { + console.log('[LIFECYCLE-Page] onBackPress'); + try { + promptAction.showDialog({ + title: "提示", + message: "确认退出游戏吗", + buttons: [ + { + text: '取消', + color: '#000000' + }, + { + text: '确认', + color: '#000000' + } + ], + }).then(data => { + console.info('showDialog success, click button: ' + data.index); + if(data.index == 0) { + console.info('showDialog click button cancel'); + return; + } else { + console.info('showDialog click button ok'); + this.processMgr.exit(0); + } + }) + } catch (error) { + console.error(`showDialog args error code is ${error.code}, message is ${error.message}`); + }; + // If disable system exit needed, remove comment "return true" + return true; + } + + onMouseWheel(eventType: string, scrollY: number) { + cocosWorker.postMessage({ type: "onMouseWheel", eventType: eventType, scrollY: scrollY }); + } + + build() { + Stack() { + XComponent({ + id: 'xcomponentId', + type: 'surface', + libraryname: 'nativerender', + controller: this.xcomponentController + }) + .focusable(true) + .focusOnTouch(true) + .gesture( + PanGesture(this.panOption) + .onActionStart(() => { + this.onMouseWheel("actionStart", 0); + }) + .onActionUpdate((event: GestureEvent) => { + if (deviceInfo.deviceType === '2in1') { + this.onMouseWheel("actionUpdate", event.offsetY); + } + }) + .onActionEnd(() => { + this.onMouseWheel("actionEnd", 0); + }) + ) + .onLoad((context) => { + console.log('[cocos] XComponent.onLoad Callback'); + cocosWorker.postMessage({ type: "abilityContextInit", data: GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT)}); + cocosWorker.postMessage({ type: "onXCLoad", data: "XComponent" }); + cocosWorker.onmessage = WorkerMsgUtils.recvWorkerThreadMessage; + }) + .onDestroy(() => { + }) + ForEach(this.editBoxArray, (item:TextInputInfo) => { + CocosEditBox({ textInputInfo: item}); + }, (item:TextInputInfo) => item.viewTag.toString()) + + ForEach(this.webViewArray, (item:WebViewInfo) => { + CocosWebView({ viewInfo: item }) + }, (item:WebViewInfo) => item.uniqueId.toString()) + + ForEach(this.videoPlayerInfoArray, (item:VideoPlayerInfo) => { + CocosVideoPlayer({ videoPlayerInfo: item }) + }, (item:VideoPlayerInfo) => item.viewTag.toString()) + } + .width('100%') + .height('100%') + } +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ts b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ts new file mode 100644 index 0000000000..94ddb8d389 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ts @@ -0,0 +1,79 @@ +import worker, { ThreadWorkerGlobalScope } from '@ohos.worker'; +import nativeRender from "libnativerender.so"; +import { ContextType } from "@ohos/libSysCapabilities" +import { VideoPlayer } from "@ohos/libSysCapabilities" +import { CocosEditBox } from "@ohos/libSysCapabilities" +import { Dialog } from "@ohos/libSysCapabilities" +import { WebView } from "@ohos/libSysCapabilities" +import { JumpManager } from "@ohos/libSysCapabilities" +import { NapiHelper } from "@ohos/libSysCapabilities" +import { ApplicationManager } from "@ohos/libSysCapabilities" +import { GlobalContext,GlobalContextConstants} from "@ohos/libSysCapabilities" + +const appLifecycle: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.APP_LIFECYCLE); +const workerContext: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.WORKER_INIT); +const inputNapi: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.INPUT_NAPI); +const mouseNapi: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.MOUSE_NAPI); +const webViewNapi: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.WEBVIEW_NAPI); +const videoPlayNapi: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.VIDEOPLAYER_NAPI); +const napiContext: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.NATIVE_API); +workerContext.workerInit() + +napiContext.nativeEngineStart(); +NapiHelper.registerFunctions(napiContext.registerFunction) + +const workerPort: ThreadWorkerGlobalScope = worker.workerPort; + +workerPort.onmessage = function(e) : void { + let data = e.data; + switch(data.type) { + case "onXCLoad": + console.log("[cocos] onXCLoad Callback"); + Dialog.init(workerPort); + CocosEditBox.init(workerPort); + JumpManager.init(workerPort); + WebView.init(workerPort); + VideoPlayer.init(workerPort); + ApplicationManager.init(workerPort); + napiContext.initAsyncInfo(); + break; + case "abilityContextInit": + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT, data.data); + break; + case "editBoxOnFocus": + inputNapi.editBoxOnFocusCB(data.viewTag); + break; + case "editBoxOnChange": + inputNapi.editBoxOnChangeCB(data.viewTag, data.value); + break; + case "editBoxOnEnter": + inputNapi.editBoxOnEnterCB(data.viewTag, data.text); + break; + case "textFieldTTFOnChange": + inputNapi.textFieldTTFOnChangeCB(data.data); + break; + case "onMouseWheel": + mouseNapi.mouseWheelCB(data.eventType, data.scrollY); + break; + case "onPageBegin": + webViewNapi.shouldStartLoading(data.viewTag, data.url); + break; + case "onPageEnd": + webViewNapi.finishLoading(data.viewTag, data.url); + break; + case "onJsCallBack": + webViewNapi.jsCallback(); + break; + case "onErrorReceive": + webViewNapi.failLoading(data.viewTag, data.url); + break; + case "onVideoCallBack": + videoPlayNapi.onVideoCallBack(data.viewTag, data.event); + break; + case "exit": + appLifecycle.onBackPress(); + break; + default: + console.error("cocos worker: message type unknown") + } +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ts b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ts new file mode 100644 index 0000000000..e2ec70b187 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ts @@ -0,0 +1,34 @@ +import worker from '@ohos.worker'; +import { Constants } from '@ohos/libSysCapabilities'; + +export class WorkerManager { + private cocosWorker: worker.ThreadWorker; + + private constructor() { + this.cocosWorker = new worker.ThreadWorker("entry/ets/workers/CocosWorker.ts", { + type: "classic", + name: "CocosWorker" + }); + this.cocosWorker.onerror = (e) => { + let msg = e.message; + let filename = e.filename; + let lineno = e.lineno; + let colno = e.colno; + console.error(`on Error ${msg} ${filename} ${lineno} ${colno}`); + } + } + + public static getInstance(): WorkerManager { + let workerManger: WorkerManager | undefined = AppStorage.get(Constants.APP_KEY_WORKER_MANAGER); + if (workerManger == undefined) { + workerManger = new WorkerManager; + AppStorage.setOrCreate(Constants.APP_KEY_WORKER_MANAGER, workerManger); + return workerManger; + } + return workerManger; + } + + public getWorker(): worker.ThreadWorker { + return this.cocosWorker; + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/module.json5 b/samples/js-tests/project/proj.ohos/entry/src/main/module.json5 new file mode 100644 index 0000000000..a1992394e3 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/module.json5 @@ -0,0 +1,69 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:entry_desc", + "mainElement": "MainAbility", + "deviceTypes": [ + "phone", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "MainAbility", + "srcEntry": "./ets/MainAbility/MainAbility.ts", + "description": "$string:MainAbility_desc", + "icon": "$media:icon", + "label": "$string:MainAbility_label", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:white", + "exported": true, + "orientation": "auto_rotation_landscape_restricted", + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + // https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/quick-start/module-configuration-file.md/ + "supportWindowMode": ["fullscreen"], + "maxWindowWidth": 1080, + "minWindowWidth": 1080, + "maxWindowHeight": 720, + "minWindowHeight": 720 + } + ], + "requestPermissions": [ + { + "name": "ohos.permission.INTERNET" + }, { + "name" : "ohos.permission.SET_NETWORK_INFO" + }, { + "name" : "ohos.permission.GET_NETWORK_INFO" + }, { + "name": "ohos.permission.GET_WIFI_INFO" + }, { + "name": "ohos.permission.ACCELEROMETER" + },{ + "name": "ohos.permission.VIBRATE" + } + ], + "metadata": [ + { + "name": "ArkTSPartialUpdate", + "value": "true" + }, + { + "name": "partialUpdateStrictCheck", + "value": "warn" + } + ] + } +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/color.json b/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000000..1bbc9aa961 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "white", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/string.json b/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..881519c1fd --- /dev/null +++ b/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/element/string.json @@ -0,0 +1,20 @@ +{ + "string": [ + { + "name": "entry_desc", + "value": "3.6_js_tests" + }, + { + "name": "MainAbility_label", + "value": "3.6_js_tests" + }, + { + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "text_field_ttf_complete", + "value": "完成" + } + ] +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/media/icon.png b/samples/js-tests/project/proj.ohos/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + if (item.viewTag == eventData.viewTag) { + removeIndex = index; + } + }); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_ARRAY).splice(removeIndex, 1); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP).delete(eventData.viewTag); + break; + } + case "setCurrentText": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.text = eventData.text; + break; + } + case "setEditBoxViewRect": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.x = eventData.viewRect.x; + textInputInfo.y = eventData.viewRect.y; + textInputInfo.w = eventData.viewRect.w; + textInputInfo.h = eventData.viewRect.h; + break; + } + case "setEditBoxVisible": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.visible = eventData.visible; + break; + } + case "setEditBoxFontSize": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.fontSize = eventData.fontSize; + break; + } + case "setEditBoxFontColor": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.fontColor = new FontColor(eventData.color.r, eventData.color.g, eventData.color.b, eventData.color.a / 255); + break; + } + case "setEditBoxPlaceHolderFontSize": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.placeholderFontSize = eventData.placeHolderSize; + break; + } + case "setEditBoxPlaceHolderFontColor": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.placeholderFontColor = new FontColor(eventData.placeHolderColor.r, eventData.placeHolderColor.g, eventData.placeHolderColor.b, eventData.placeHolderColor.a / 255); + break; + } + case "setEditBoxPlaceHolder": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.placeHolder = eventData.placeHolderText; + break; + } + case "setEditBoxMaxLength": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.maxLength = eventData.maxLength; + break; + } + case "setNativeInputMode": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.multiline = (eventData.inputMode == 0) ? true : false; + if (textInputInfo.inputMode != InputType.Password) { + switch (eventData.inputMode) { + case 0: + case 4: + case 6: + textInputInfo.inputMode = InputType.Normal; + break; + case 2: + case 5: + textInputInfo.inputMode = InputType.Number; + break; + case 3: + textInputInfo.inputMode = InputType.PhoneNumber; + break; + case 1: + textInputInfo.inputMode = InputType.Email; + break; + default: + break; + } + } + break; + } + case "setNativeInputFlag": { + // Any type can be changed to a password. The password can be changed to any type, + // but the password is mapped to the general type. Other changes are not allowed. + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + if (eventData.inputFlag == 0) { + textInputInfo.inputMode = InputType.Password; + } else if (textInputInfo.inputMode == InputType.Password) { + textInputInfo.inputMode = InputType.Normal; + } + break; + } + case "setEditBoxFontPath": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.fontPath = eventData.fontPath; + break; + } + case "setEditBoxPlaceHolderFontPath": { + let textInputInfo: TextInputInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_INDEX_MAP) + .get(eventData.viewTag); + textInputInfo.placeHolderFontPath = eventData.placeHolderFontPath; + break; + } + case "hideAllEditBox": { + let editBoxArray: TextInputInfo[] = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_EDIT_BOX_ARRAY); + editBoxArray.forEach(item => { + if (item.visible) { + item.visible = false; + let cocosWorker: worker.ThreadWorker = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_COCOS_WORKER); + cocosWorker.postMessage({ type: "editBoxOnEnter", viewTag: item.viewTag, text: item.text }) + } + }) + break; + } + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ts new file mode 100644 index 0000000000..50b7a7e69d --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ts @@ -0,0 +1,79 @@ +import { VideoPlayMsgEntity, ViewRect } from '../../entity/WorkerMsgEntity'; + +export class VideoPlayer { + static MODULE_NAME: string = 'VideoPlay'; + + private static workerPort; + + static init(workerPort) : void { + VideoPlayer.workerPort = workerPort; + } + + static setURL(viewTag: number, url: string, isUrl: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'setURL', viewTag); + videoPlayMsgEntity.url = url; + videoPlayMsgEntity.isUrl = isUrl; + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static setLooping(viewTag: number, isLoop: boolean) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'setLooping', viewTag); + videoPlayMsgEntity.isLoop = isLoop; + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static createVideoPlayer(viewTag: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'createVideoPlayer', viewTag); + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static removeVideoPlayer(viewTag: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'removeVideoPlayer', viewTag); + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static setVideoPlayerRect(viewTag: number, x: number, y: number, w: number, h: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'setVideoPlayerRect', viewTag); + let viewRect: ViewRect = new ViewRect(x, y, w, h); + videoPlayMsgEntity.viewRect = viewRect; + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static play(viewTag: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'play', viewTag); + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + static pause(viewTag: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'pause', viewTag); + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static stop(viewTag: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'stop', viewTag); + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static setVisible(viewTag: number, visible: boolean) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'setVisible', viewTag); + videoPlayMsgEntity.visible = visible + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static requestFullscreen(viewTag: number, isFullScreen: boolean) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'requestFullscreen', viewTag); + videoPlayMsgEntity.isFullScreen = isFullScreen; + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static seekTo(viewTag: number, seekTo: number) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'seekTo', viewTag); + videoPlayMsgEntity.seekTo = seekTo; + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } + + static setKeepAspectRatioEnabled(viewTag: number, enable: boolean) : void { + let videoPlayMsgEntity: VideoPlayMsgEntity = new VideoPlayMsgEntity(VideoPlayer.MODULE_NAME, 'setKeepAspectRatioEnabled', viewTag); + videoPlayMsgEntity.keepAspectRatioEnabled = enable; + VideoPlayer.workerPort.postMessage(videoPlayMsgEntity); + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayerMsg.ets b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayerMsg.ets new file mode 100644 index 0000000000..f11bdac82c --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayerMsg.ets @@ -0,0 +1,145 @@ +import Logger from '../../utils/Logger' +import { BusinessError } from '@ohos.base'; +import { GlobalContext,GlobalContextConstants } from "../../common/GlobalContext" +import { VideoPlayMsgEntity } from '../../entity/WorkerMsgEntity'; + +let log: Logger = new Logger(0x0001, "VideoPlayerMsg"); + +@Observed +export class VideoPlayerInfo { + // position + public x: number = 0; + public y: number = 0; + // size + public w: number = 0; + public h: number = 0; + // url + public url: string = '' + + public rawfile?: Resource; + public isUrl: boolean = false + // tag + public viewTag: number = 0 + + public isPlay: boolean = false + public isFullScreen: boolean = false + + // Whether to display + public visible: boolean = true + + public isLoop: boolean = false + + public objectFit: ImageFit = ImageFit.Auto + + public controller: VideoController = new VideoController() + + constructor(x: number, y: number, w: number, h: number, viewTag: number) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.viewTag = viewTag; + } +} + +export enum VideoEvent { + PLAYING = 0, + PAUSED, + STOPPED, + COMPLETED, +} + +export function handleVideoPlayMsg(eventData: VideoPlayMsgEntity) { + + switch (eventData.function) { + case "createVideoPlayer": { + let newVideoPlayerInfo = new VideoPlayerInfo(0, 0, 0, 0, eventData.viewTag); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_ARRAY).push(newVideoPlayerInfo); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).set(eventData.viewTag, newVideoPlayerInfo); + break; + } + case "removeVideoPlayer": { + let removeIndex = -1; + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_ARRAY).forEach((item:VideoPlayerInfo,index:number) => { + if (item.viewTag == eventData.viewTag) { + removeIndex = index; + } + }); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag).controller.requestFullscreen(false); //4.x已修复 + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_ARRAY).splice(removeIndex, 1); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).delete(eventData.viewTag); + break; + } + case "play": { + let videoPlayInfo :VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + videoPlayInfo.controller.start(); + videoPlayInfo.isPlay = true; + break; + } + case "pause": { + let videoPlayInfo:VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + videoPlayInfo.controller.pause(); + videoPlayInfo.isPlay = false; + break; + } + case "stop": { + let videoPlayInfo:VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + videoPlayInfo.controller.stop(); + videoPlayInfo.isPlay = false; + break; + } + case "setURL": { + let videoPlayInfo:VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + if(eventData.isUrl == 0) { + videoPlayInfo.isUrl = false; + videoPlayInfo.rawfile = $rawfile(eventData.url); + } else { + videoPlayInfo.isUrl = true; + videoPlayInfo.url = eventData.url; + } + break; + } + case "setLooping": { + let videoPlayInfo: VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + videoPlayInfo.isLoop = eventData.isLoop; + break; + } + case "setVideoPlayerRect": { + let videoPlayInfo:VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + try { + videoPlayInfo.x = px2vp(eventData.viewRect.x); + videoPlayInfo.y = px2vp(eventData.viewRect.y); + videoPlayInfo.w = px2vp(eventData.viewRect.w); + videoPlayInfo.h = px2vp(eventData.viewRect.h); + } catch (error) { + let e: BusinessError = error as BusinessError; + log.error('videoPlayerInfo ErrorCode: %{public}d, Message: %{public}s', e.code, e.message); + } + break; + } + case "setVisible": { + let videoPlayInfo:VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + if (videoPlayInfo.visible == eventData.visible) { + return; + } + videoPlayInfo.visible = eventData.visible; + break; + } + case "requestFullscreen": { + let videoPlayInfo: VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + videoPlayInfo.controller.requestFullscreen(eventData.isFullScreen); + videoPlayInfo.isFullScreen = eventData.isFullScreen; + break; + } + case "seekTo": { + let videoPlayInfo: VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + videoPlayInfo.controller.setCurrentTime(eventData.seekTo, SeekMode.Accurate); + break; + } + case "setKeepAspectRatioEnabled": { + let videoPlayInfo: VideoPlayerInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_VIDEO_PLAYER_INDEX_MAP).get(eventData.viewTag); + videoPlayInfo.objectFit = eventData.keepAspectRatioEnabled? ImageFit.Cover : ImageFit.Auto; + break; + } + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ts new file mode 100644 index 0000000000..872ec4ce70 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ts @@ -0,0 +1,114 @@ +import { ViewRect, WebViewMsgEntity } from '../../entity/WorkerMsgEntity'; + +export class WebView { + static MODULE_NAME: string = 'WebView'; + + private static workerPort; + + static init(workerPort) : void { + WebView.workerPort = workerPort; + } + + static createWebView(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'createWebView', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static removeWebView(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'removeWebView', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static setJavascriptInterfaceScheme(viewTag: number, jsInterfaceScheme: string) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'setJavascriptInterfaceScheme', viewTag); + webViewMsgEntity.jsInterfaceScheme = jsInterfaceScheme; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static loadData(viewTag: number, data: string, mimeType: string, encoding: string, baseURL: string) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'loadData', viewTag); + webViewMsgEntity.data = data; + webViewMsgEntity.mimeType = mimeType; + webViewMsgEntity.encoding = encoding; + webViewMsgEntity.baseURL = baseURL; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static loadURL(viewTag: number, url: string) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'loadURL', viewTag); + webViewMsgEntity.url = url; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static loadFile(viewTag: number, filePath: string) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'loadFile', viewTag); + webViewMsgEntity.filePath = filePath; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static stopLoading(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'stopLoading', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static reload(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'reload', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static canGoBack(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'canGoBack', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static canGoForward(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'canGoForward', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static goBack(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'goBack', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static goForward(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'goForward', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static setWebViewRect(viewTag: number, x: number, y: number, w: number, h: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'setWebViewRect', viewTag); + let viewRect: ViewRect = new ViewRect(x, y, w, h); + webViewMsgEntity.viewRect = viewRect; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static setVisible(viewTag: number, visible: boolean) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'setVisible', viewTag); + webViewMsgEntity.visible = visible; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static setOpacityWebView(viewTag: number, opacity: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'setOpacityWebView', viewTag); + webViewMsgEntity.opacity = opacity; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static setBackgroundTransparent(viewTag: number) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'setBackgroundTransparent', viewTag); + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static evaluateJS(viewTag: number, js: string) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'evaluateJS', viewTag); + webViewMsgEntity.js = js; + WebView.workerPort.postMessage(webViewMsgEntity); + } + + static setScalesPageToFit(viewTag: number, scalesPageToFit: boolean) : void { + let webViewMsgEntity: WebViewMsgEntity = new WebViewMsgEntity(WebView.MODULE_NAME, 'setScalesPageToFit', viewTag); + webViewMsgEntity.scalesPageToFit = scalesPageToFit; + WebView.workerPort.postMessage(webViewMsgEntity); + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets new file mode 100644 index 0000000000..24e1f86d97 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets @@ -0,0 +1,245 @@ +import web_webview from '@ohos.web.webview' +import Logger from '../../utils/Logger'; +import { GlobalContext, GlobalContextConstants } from '../../common/GlobalContext'; +import { WebViewMsgEntity } from '../../entity/WorkerMsgEntity'; +import { BusinessError } from '@ohos.base'; + +let log: Logger = new Logger(0x0001, "WebViewMsg"); + +export class WebViewInfo { + public uniqueId : number = 0; + // position + public x: number = 0; + public y: number = 0; + // size + public w: number = 0; + public h: number = 0; + // url + public url: string = ''; + public isUrl: boolean = true; + + public viewTag: number = 0 + public zoomAccess: boolean = true + public visible: boolean = true + public opacity: number = 1 + public backgroundColor: number = 0xffffff; + public jsInterfaceScheme: string = ""; + public controller: web_webview.WebviewController = new web_webview.WebviewController() + + constructor(x: number, y: number, w: number, h: number, viewTag: number) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.viewTag = viewTag + this.uniqueId = viewTag; + } +} + +function copyWebViewInfo(viewInfo: WebViewInfo) : WebViewInfo { + let newViewInfo: WebViewInfo = new WebViewInfo(viewInfo.x, viewInfo.y, viewInfo.w, viewInfo.h, viewInfo.viewTag); + newViewInfo.url = viewInfo.url; + newViewInfo.isUrl = viewInfo.isUrl; + newViewInfo.zoomAccess = viewInfo.zoomAccess; + newViewInfo.visible = viewInfo.visible; + newViewInfo.controller = viewInfo.controller; + newViewInfo.opacity = viewInfo.opacity; + newViewInfo.backgroundColor = viewInfo.backgroundColor; + newViewInfo.jsInterfaceScheme = viewInfo.jsInterfaceScheme; + newViewInfo.uniqueId = 100000 - viewInfo.uniqueId; // support 50000 webView exist at the same time + return newViewInfo; +} + +function waitUtilControllerAttached() : Promise { + return new Promise((resolve, reject) => { + resolve(1); + }) +} + +export function handleWebViewMsg(eventData: WebViewMsgEntity) { + let index: number; + switch (eventData.function) { + case "createWebView": { + let view = new WebViewInfo(0, 0, 0, 0, eventData.viewTag); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY).push(view); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP) + .set(eventData.viewTag, GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY) + .length - 1); + break; + } + case "removeWebView": { + if (GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY).length > 0) { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY).splice(index, 1); + // Do not assume the invoking time of removeWebView. After an element is deleted, the following elements need to be advanced by one bit. + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP) + .forEach((value: number, key: number, map: Map) => { + if (value > index) { + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).set(key, value - 1); + } + }) + + // Delete the subscript mapping of the removed webView. + let tempInfoMap: Map = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP); + tempInfoMap.delete(eventData.viewTag); + } + break; + } + case "setJavascriptInterfaceScheme": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + let webViewInfo: WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + webViewInfo.jsInterfaceScheme = eventData.jsInterfaceScheme; + break; + } + case "loadData": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + let webViewInfo: WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + waitUtilControllerAttached().then(() => { + webViewInfo.controller.loadData(eventData.data, eventData.mimeType, eventData.encoding, eventData.baseURL) + }); + break; + } + case "loadURL": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index].url = eventData.url; + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index].isUrl = true; + let webViewInfo: WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + waitUtilControllerAttached().then(() => { + webViewInfo.controller.loadUrl(eventData.url); + }) + break; + } + case "loadFile": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index].url = eventData.filePath; + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index].isUrl = false; + let webViewInfo: WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + waitUtilControllerAttached().then(() => { + webViewInfo.controller.loadUrl($rawfile(eventData.filePath)); + }) + break; + } + case "stopLoading": + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index].controller.stop(); + break; + case "reload": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + let webViewInfo: WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + waitUtilControllerAttached().then(() => { + webViewInfo.controller.refresh(); + }) + break; + } + case "canGoBack": + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + let result: number = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .controller + .accessBackward(); + // todo The value needs to be sent back to the worker thread. + break; + case "canGoForward": + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + result = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .controller + .accessForward(); + // todo The value needs to be sent back to the worker thread. + break; + case "goBack": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + let webViewInfo: WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + waitUtilControllerAttached().then(() => { + webViewInfo.controller.backward(); + }) + break; + } + case "goForward": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + let webViewInfo: WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + waitUtilControllerAttached().then(() => { + webViewInfo.controller.forward(); + }) + break; + } + case "setWebViewRect": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + let tmpWebInfo :WebViewInfo= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + tmpWebInfo.x = px2vp(eventData.viewRect.x); + tmpWebInfo.y = px2vp(eventData.viewRect.y); + tmpWebInfo.w = px2vp(eventData.viewRect.w); + tmpWebInfo.h = px2vp(eventData.viewRect.h); + let newViewInfo:WebViewInfo = copyWebViewInfo(tmpWebInfo); + let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); + tempInfoArray[index] = newViewInfo; + break; + } + case "setVisible": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + if (GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .visible == eventData.visible) { + return; + } + let tmpWebInfo:WebViewInfo= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + tmpWebInfo.visible = eventData.visible; + let newViewInfo:WebViewInfo = copyWebViewInfo(tmpWebInfo); + let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); + tempInfoArray[index] = newViewInfo; + break; + } + case "setOpacityWebView": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + if (GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .opacity == eventData.opacity) { + return; + } + let tmpWebInfo :WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + tmpWebInfo.opacity = eventData.opacity; + let newViewInfo :WebViewInfo= copyWebViewInfo(tmpWebInfo); + let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); + tempInfoArray[index] = newViewInfo; + break; + } + case "setBackgroundTransparent": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + if (GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .backgroundColor == Color.Transparent) { + return; + } + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .backgroundColor = Color.Transparent; + let newViewInfo :WebViewInfo= copyWebViewInfo(GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]); + let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); + tempInfoArray[index] = newViewInfo; + break; + } + case "evaluateJS": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .controller + .runJavaScript(eventData.js, (error:BusinessError, result:string) => { + if (error) { + log.warn("webView run JavaScript error:%{public}s", JSON.stringify(error)); + return; + } + if (result) { + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_WEB_RESULT,result) + log.debug("webView run JavaScript result is %{public}s:", result); + } + }) + break; + } + case "setScalesPageToFit": { + index = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_INDEX_MAP).get(eventData.viewTag); + if (GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] + .zoomAccess == eventData.scalesPageToFit) { + return; + } + let tmpWebInfo:WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; + tmpWebInfo.zoomAccess == eventData.scalesPageToFit + let newViewInfo:WebViewInfo = copyWebViewInfo(tmpWebInfo); + let tempInfoArray:WebViewInfo[] = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); + tempInfoArray[index] = newViewInfo; + } + break; + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts new file mode 100644 index 0000000000..dd9e38897d --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts @@ -0,0 +1,16 @@ +export class Result { + public static success(data){ + return { + "errCode": 0, + "errMsg": "", + "data": data, + }; + } + + public static error(errCode, errMsg) { + return { + "errCode": errCode, + "errMsg": errMsg, + }; + } +}; \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ts new file mode 100644 index 0000000000..39d272a0b6 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ts @@ -0,0 +1,7 @@ +export class TextInputDialogEntity { + message : string; + + constructor(msg: string) { + this.message = msg; + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/WorkerMsgEntity.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/WorkerMsgEntity.ts new file mode 100644 index 0000000000..70216b1e14 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/WorkerMsgEntity.ts @@ -0,0 +1,141 @@ +export class ViewRect { + x: number + y: number + w: number + h: number + + constructor(x: number, y: number, w: number, h: number) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } +} + +export class Color4B { + r: number + g: number + b: number + a: number + + constructor(r: number, g: number, b: number, a: number) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } +} + +export class BaseWorkerMsgEntity { + module: string; + + function: string; + + constructor(module: string, func: string) { + this.module = module; + this.function = func; + } +} + +export class DialogMsgEntity extends BaseWorkerMsgEntity { + title: string; + + message: string; + + constructor(module: string, func: string) { + super(module, func); + } +} + +export class EditBoxMsgEntity extends BaseWorkerMsgEntity { + viewTag: number + + viewRect: ViewRect + + paddingW: number + paddingH: number + + visible: boolean + + text: string + fontSize: number + color: Color4B + fontPath: string + + placeHolderText: string + placeHolderSize: number + placeHolderColor: Color4B + placeHolderFontPath: string + + maxLength: number + + inputMode: number + + inputFlag: number + + constructor(module: string, func: string, viewTag?: number) { + super(module, func); + this.viewTag = viewTag; + } +} + +export class VideoPlayMsgEntity extends BaseWorkerMsgEntity { + viewTag: number + + url: string + isUrl: number + + isLoop: boolean + + viewRect: ViewRect + + visible: boolean + + isFullScreen: boolean + + seekTo: number + + keepAspectRatioEnabled: boolean + + constructor(module: string, func: string, viewTag: number) { + super(module, func); + this.viewTag = viewTag; + } +} + +export class WebViewMsgEntity extends BaseWorkerMsgEntity { + viewTag: number + + data: string + mimeType: string + encoding: string + baseURL: string + + url: string + + filePath: string + + viewRect: ViewRect + + visible: boolean + + opacity: number + + js: string + + scalesPageToFit: boolean + jsInterfaceScheme: string + + constructor(module: string, func: string, viewTag: number) { + super(module, func); + this.viewTag = viewTag; + } +} + +export class JumpMsgEntity extends BaseWorkerMsgEntity { + url: string; + + constructor(module: string, func: string) { + super(module, func); + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ts new file mode 100644 index 0000000000..d4df1a5f98 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ts @@ -0,0 +1,118 @@ +import { Dialog } from '../components/dialog/DialogWorker' +import StringUtils from '../utils/StringUtils' +import { JumpManager } from '../system/appJump/JumpManager' +import { DeviceUtils } from '../system/device/DeviceUtils' +import { ApplicationManager } from '../system/application/ApplicationManager' +import { CocosEditBox } from '../components/editbox/CocosEditBox' +import { WebView } from '../components/webview/WebView' +import { VideoPlayer } from '../components/videoplayer/VideoPlayer' +import Accelerometer from '../system/sensor/AccelerometerUtils' +import Preferences from '../preferences/Preferences' + +export class NapiHelper { + + static registerFunctions(registerFunc : Function) { + NapiHelper.registerOthers(registerFunc); + NapiHelper.registerDeviceUtils(registerFunc); + NapiHelper.registerEditBox(registerFunc); + NapiHelper.registerWebView(registerFunc); + NapiHelper.registerVideoPlay(registerFunc); + NapiHelper.registerSensor(registerFunc); + NapiHelper.registerPreferences(registerFunc); + } + + private static registerOthers(registerFunc : Function) { + registerFunc('DiaLog.showDialog', Dialog.showDialog); + registerFunc('DiaLog.showTextInputDialog', Dialog.showTextInputDialog); + registerFunc('DiaLog.hideTextInputDialog', Dialog.hideTextInputDialog); + registerFunc('StringUtils.getWidth', StringUtils.getWidth); + registerFunc('ApplicationManager.exit', ApplicationManager.exit); + registerFunc('ApplicationManager.getVersionName', ApplicationManager.getVersionName); + registerFunc('JumpManager.openUrl', JumpManager.openUrl); + } + + private static registerDeviceUtils(registerFunc : Function) { + registerFunc('DeviceUtils.getDpi', DeviceUtils.getDpi); + registerFunc('DeviceUtils.getSystemLanguage', DeviceUtils.getSystemLanguage); + registerFunc('DeviceUtils.startVibration', DeviceUtils.startVibration); + registerFunc('DeviceUtils.setKeepScreenOn', DeviceUtils.setKeepScreenOn); + registerFunc('DeviceUtils.isRoundScreen', DeviceUtils.isRoundScreen); + registerFunc('DeviceUtils.hasSoftKeys', DeviceUtils.hasSoftKeys); + registerFunc('DeviceUtils.isCutoutEnable', DeviceUtils.isCutoutEnable); + registerFunc('DeviceUtils.initScreenInfo', DeviceUtils.initScreenInfo); + registerFunc('DeviceUtils.getOrientation', DeviceUtils.getOrientation); + registerFunc('DeviceUtils.getCutoutHeight', DeviceUtils.getCutoutHeight); + registerFunc('DeviceUtils.getCutoutWidth', DeviceUtils.getCutoutWidth); + } + + private static registerEditBox(registerFunc : Function) { + registerFunc('CocosEditBox.createCocosEditBox', CocosEditBox.createCocosEditBox); + registerFunc('CocosEditBox.removeCocosEditBox', CocosEditBox.removeCocosEditBox); + registerFunc('CocosEditBox.setCurrentText', CocosEditBox.setCurrentText); + registerFunc('CocosEditBox.setEditBoxViewRect', CocosEditBox.setEditBoxViewRect); + registerFunc('CocosEditBox.setEditBoxVisible', CocosEditBox.setEditBoxVisible); + registerFunc('CocosEditBox.setEditBoxPlaceHolder', CocosEditBox.setEditBoxPlaceHolder); + registerFunc('CocosEditBox.setEditBoxFontSize', CocosEditBox.setEditBoxFontSize); + registerFunc('CocosEditBox.setEditBoxFontColor', CocosEditBox.setEditBoxFontColor); + registerFunc('CocosEditBox.setEditBoxFontPath', CocosEditBox.setEditBoxFontPath); + registerFunc('CocosEditBox.setEditBoxPlaceHolderFontSize', CocosEditBox.setEditBoxPlaceHolderFontSize); + registerFunc('CocosEditBox.setEditBoxPlaceHolderFontColor', CocosEditBox.setEditBoxPlaceHolderFontColor); + registerFunc('CocosEditBox.setEditBoxPlaceHolderFontPath', CocosEditBox.setEditBoxPlaceHolderFontPath); + registerFunc('CocosEditBox.setEditBoxMaxLength', CocosEditBox.setEditBoxMaxLength); + registerFunc('CocosEditBox.setNativeInputMode', CocosEditBox.setNativeInputMode); + registerFunc('CocosEditBox.setNativeInputFlag', CocosEditBox.setNativeInputFlag); + registerFunc('CocosEditBox.hideAllEditBox', CocosEditBox.hideAllEditBox); + } + + private static registerWebView(registerFunc : Function) { + registerFunc('WebView.createWebView', WebView.createWebView); + registerFunc('WebView.removeWebView', WebView.removeWebView); + registerFunc('WebView.setJavascriptInterfaceScheme', WebView.setJavascriptInterfaceScheme); + registerFunc('WebView.loadData', WebView.loadData); + registerFunc('WebView.loadURL', WebView.loadURL); + registerFunc('WebView.loadFile', WebView.loadFile); + registerFunc('WebView.stopLoading', WebView.stopLoading); + registerFunc('WebView.reload', WebView.reload); + registerFunc('WebView.canGoBack', WebView.canGoBack); + registerFunc('WebView.canGoForward', WebView.canGoForward); + registerFunc('WebView.goBack', WebView.goBack); + registerFunc('WebView.goForward', WebView.goForward); + registerFunc('WebView.setWebViewRect', WebView.setWebViewRect); + registerFunc('WebView.setVisible', WebView.setVisible); + registerFunc('WebView.setOpacityWebView', WebView.setOpacityWebView); + registerFunc('WebView.setBackgroundTransparent', WebView.setBackgroundTransparent); + registerFunc('WebView.evaluateJS', WebView.evaluateJS); + registerFunc('WebView.setScalesPageToFit', WebView.setScalesPageToFit); + } + + private static registerVideoPlay(registerFunc : Function) { + registerFunc('VideoPlayer.createVideoPlayer', VideoPlayer.createVideoPlayer); + registerFunc('VideoPlayer.removeVideoPlayer', VideoPlayer.removeVideoPlayer); + registerFunc('VideoPlayer.setURL', VideoPlayer.setURL); + registerFunc('VideoPlayer.setLooping', VideoPlayer.setLooping); + registerFunc('VideoPlayer.setVideoPlayerRect', VideoPlayer.setVideoPlayerRect); + registerFunc('VideoPlayer.play', VideoPlayer.play); + registerFunc('VideoPlayer.pause', VideoPlayer.pause); + registerFunc('VideoPlayer.stop', VideoPlayer.stop); + registerFunc('VideoPlayer.setVisible', VideoPlayer.setVisible); + registerFunc('VideoPlayer.requestFullscreen', VideoPlayer.requestFullscreen); + registerFunc('VideoPlayer.seekTo', VideoPlayer.seekTo); + registerFunc('VideoPlayer.setKeepAspectRatioEnabled', VideoPlayer.setKeepAspectRatioEnabled); + } + + private static registerSensor(registerFunc : Function) { + registerFunc('Accelerometer.enable', Accelerometer.enable); + registerFunc('Accelerometer.disable', Accelerometer.disable); + } + + private static registerPreferences(registerFunc : Function) { + registerFunc('Preferences.get', Preferences.get); + registerFunc('Preferences.getAll', Preferences.getAll); + registerFunc('Preferences.put', Preferences.put); + registerFunc('Preferences.has', Preferences.has); + registerFunc('Preferences.delete', Preferences.delete); + registerFunc('Preferences.flush', Preferences.flush); + registerFunc('Preferences.clear', Preferences.clear); + } + +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ts new file mode 100644 index 0000000000..e95e89b29d --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ts @@ -0,0 +1,218 @@ +import Logger from '../utils/Logger'; +import data_preferences from '@ohos.data.preferences'; +import { BusinessError } from '@ohos.base'; +import common from '@ohos.app.ability.common'; +import { GlobalContext, GlobalContextConstants } from '../common/GlobalContext'; + +let log: Logger = new Logger(0x0001, "Preferences"); +let preferences: data_preferences.Preferences | null = null; +const PREFS_NAME: string = "Cocos2dxPreferences"; + +export default class Preferences { + + // 通过 preferencesName 获取Preferences实例 + static getPreferences(): data_preferences.Preferences { + let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); + try { + preferences = data_preferences.getPreferencesSync(context, {name: PREFS_NAME}); + log.info("Succeeded in getting preferences."); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to get preferences. code =" + code + ", message =" + message); + } + return preferences; + } + + /* + 通过 preferencesName 从缓存中移出指定的Preferences实例,若Preferences实例有对应的持久化文件,则同时删除其持久化文件。使用Promise异步回调。 + 调用该接口后,不建议再使用旧的Preferences实例进行数据操作,否则会出现数据一致性问题,应将Preferences实例置为null,系统将会统一回收。 + */ + static deletePreferences(): void { + let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); + try { + data_preferences.deletePreferences(context, PREFS_NAME).then(() => { + log.info("Succeeded in deleting preferences."); + }); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to delete preferences. code =" + code + ", message =" + message); + } + } + + /* + 通过 preferencesName 从缓存中移出指定的Preferences实例,使用Promise异步回调。 + 应用首次调用getPreferences接口获取某个Preferences实例后,该实例会被会被缓存起来,后续再次getPreferences时不会再次从持久化文件中读取, + 直接从缓存中获取Preferences实例。调用此接口移出缓存中的实例之后,再次getPreferences将会重新读取持久化文件,生成新的Preferences实例。 + 调用该接口后,不建议再使用旧的Preferences实例进行数据操作,否则会出现数据一致性问题,应将Preferences实例置为null,系统将会统一回收。 + */ + static removePreferencesFromCache(): void { + let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); + try { + data_preferences.removePreferencesFromCacheSync(context, PREFS_NAME); + log.info("Succeeded in removing preferences."); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to remove preferences. code =" + code + ", message =" + message); + } + } + + // 从缓存的Preferences实例中获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue + static get(key: string, defValue: data_preferences.ValueType): data_preferences.ValueType { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + let data = preferences.getSync(key, defValue); + log.info("Succeeded in getting value of 'startup'. Data: " + data); + return data; + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to get value of 'startup'. code =" + code + ", message =" + message); + return defValue; + } + } + + // 将数据写入缓存的Preferences实例中,可通过flush将Preferences实例持久化 + static put(key: string, value: data_preferences.ValueType): void { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + preferences.putSync(key, value); + log.info("Succeeded in put the key."); + Preferences.flush(); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to put. code =" + code + ", message =" + message); + } + } + + // 从缓存的Preferences实例中获取所有键值数据。 + static getAll(): string | undefined { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + let object = preferences.getAllSync(); + let allKeys = getObjKeys(object); + log.info('getAll keys = ' + allKeys); + log.info("getAll object = " + JSON.stringify(object)); + return JSON.stringify(object); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to getAll. code =" + code + ", message =" + message); + return undefined; + } + } + + // 检查缓存的Preferences实例中是否包含名为给定Key的存储键值对 + static has(key: string): boolean { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + let val = preferences.hasSync(key); + if (val) { + log.info("The key 'startup' is contained."); + return true; + } else { + log.info("The key 'startup' dose not contain."); + return false; + } + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to has. code =" + code + ", message =" + message); + return false; + } + } + + // 从缓存的Preferences实例中删除名为给定Key的存储键值对,可通过flush将Preferences实例持久化 + static delete(key: string): void { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + preferences.deleteSync(key); + log.info("Succeeded in deleting the key."); + Preferences.flush(); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to delete. code =" + code + ", message =" + message); + } + } + + // 将缓存的Preferences实例中的数据异步存储到用户首选项的持久化文件中,使用Promise异步回调。 + static flush(): void { + if (preferences === null) { + Preferences.getPreferences(); + } + preferences.flush().then(()=>{ + log.info("Succeeded in flushing."); + }); + } + + // 清除缓存的Preferences实例中的所有数据,可通过flush将Preferences实例持久化,使用Promise异步回调。 + static clear(): void { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + preferences.clearSync(); + log.info("Succeeded in clearing."); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to clear. code =" + code + ", message =" + message); + } + } + + + // 订阅数据变更,订阅的Key的值发生变更后,在执行flush方法后,触发callback回调。 + static onChange(cb: Function): void { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + preferences.on('change', (key: string) => { + log.info("The key " + key + " changed."); + cb(key); + }); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to flush. code =" + code + ", message =" + message); + } + } + + // 取消订阅数据变更。 + static offChange(cb: Function): void { + if (preferences === null) { + Preferences.getPreferences(); + } + try { + preferences.off('change', (key: string) => { + log.info("The key " + key + " changed."); + cb(key); + }); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + log.error("Failed to flush. code =" + code + ", message =" + message); + } + } +} + +// 由于ArkTS中无Object.keys,且无法使用for..in... +// 若报ArkTS问题,请将此方法单独抽离至一个ts文件中并暴露,在需要用到的ets文件中引入使用 +function getObjKeys(obj: Object): string[] { + let keys = Object.keys(obj); + return keys; +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ts new file mode 100644 index 0000000000..dfa95dfaa5 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ts @@ -0,0 +1,19 @@ +import type { ThreadWorkerGlobalScope } from '@ohos.worker'; +import { JumpMsgEntity } from '../../entity/WorkerMsgEntity'; + +export class JumpManager { + + static MODULE_NAME: string = 'JumpManager'; + + private static workerPort: ThreadWorkerGlobalScope; + + static init(workerPort: ThreadWorkerGlobalScope) : void { + JumpManager.workerPort = workerPort; + } + + static openUrl(url: string) : void { + let jumpMsgEntity: JumpMsgEntity = new JumpMsgEntity(JumpManager.MODULE_NAME, 'openUrl'); + jumpMsgEntity.url = url; + JumpManager.workerPort.postMessage(jumpMsgEntity); + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ts new file mode 100644 index 0000000000..ea373af908 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ts @@ -0,0 +1,31 @@ +import type common from '@ohos.app.ability.common'; +import { GlobalContext, GlobalContextConstants } from '../../common/GlobalContext'; +import {Result} from "../../entity/Result" +import type { JumpMsgEntity } from '../../entity/WorkerMsgEntity'; +import Logger from '../../utils/Logger' + +let log: Logger = new Logger(0x0001, "JumpManagerMsg"); + +export function handleJumpManagerMsg(eventData: JumpMsgEntity) : void { + switch (eventData.function) { + case "openUrl": + openUrl(eventData.url); + break; + default: + log.error('%{public}s has not implement yet', eventData.function); + } +} + +function openUrl(url: string): void { + let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); + let wantInfo = { + 'action': 'ohos.want.action.viewData', + 'entities': ['entity.system.browsable'], + 'uri': url + } + context.startAbility(wantInfo).then(() => { + log.info('%{public}s', JSON.stringify(Result.success({}))); + }).catch((err) => { + log.error('openUrl : err : %{public}s', JSON.stringify(Result.error(-1, JSON.stringify(err))) ?? ''); + }); +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ts new file mode 100644 index 0000000000..9a552f56e4 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ts @@ -0,0 +1,54 @@ +import bundleManager from '@ohos.bundle.bundleManager'; +import type { ThreadWorkerGlobalScope } from '@ohos.worker'; +import { BaseWorkerMsgEntity } from '../../entity/WorkerMsgEntity'; +import { common } from '@kit.AbilityKit'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { GlobalContext, GlobalContextConstants } from '../../common/GlobalContext'; + +export class ApplicationManager { + static MODULE_NAME: string = 'ApplicationManager'; + + private static workerPort: ThreadWorkerGlobalScope; + + static init(workerPort: ThreadWorkerGlobalScope): void { + ApplicationManager.workerPort = workerPort; + } + + static exit(): void { + let workerMsg: BaseWorkerMsgEntity = new BaseWorkerMsgEntity(ApplicationManager.MODULE_NAME, 'exit'); + ApplicationManager.workerPort.postMessage(workerMsg); + } + + static getVersionName(): string { + let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT; + return bundleManager.getBundleInfoForSelfSync(bundleFlags).versionName; + } +} + +export function handleApplicationMsg(eventData: BaseWorkerMsgEntity): void { + switch (eventData.function) { + case "exit": + terminateSelf(); + break; + default: + console.error('%{public}s has not implement yet', eventData.function); + } +} + +function terminateSelf(): void { + try { + let context: common.UIAbilityContext = + GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); + context.terminateSelf((err: BusinessError) => { + if (err.code) { + console.error(`terminateSelf failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('terminateSelf succeed'); + }); + } catch (err) { + let code = (err as BusinessError).code; + let message = (err as BusinessError).message; + console.error(`terminateSelf failed, code is ${code}, message is ${message}`); + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ts new file mode 100644 index 0000000000..b778f15848 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ts @@ -0,0 +1,164 @@ +import display from '@ohos.display' +import i18n from '@ohos.i18n'; +import vibrator from '@ohos.vibrator'; +import Logger from '../../utils/Logger'; +import window from '@ohos.window'; +import { GlobalContext, GlobalContextConstants } from '../../common/GlobalContext'; +import { Rect } from '@ohos.application.AccessibilityExtensionAbility'; + +let log = new Logger(0x0001, "DeviceUtils"); + +export class DeviceUtils { + static MODULE_NAME: string = 'DeviceUtils'; + static _roundScreen: boolean = false; + static _hasSoftKeys: boolean = false; + static _isCutoutEnable: boolean = false; + static _cutoutLeft: number; + static _cutoutWidth: number; + static _cutoutTop: number; + static _cutoutHeight: number; + + static getDpi(): number { + return display.getDefaultDisplaySync().densityDPI; + } + + static getSystemLanguage(): string { + return i18n.System.getSystemLanguage(); + } + + static startVibration(time: number) { + try { + vibrator.startVibration({ + type: 'time', + duration: time * 1000, // Seconds to milliseconds + }, { + id: 0, + usage: 'unknown' + }, (error) => { + if (error) { + log.error('vibrate fail, error.code: %{public}d, error.message: %{public}s', error.code, error.message); + return; + } + }); + } catch (err) { + log.error('error.code: %{public}d, error.message: %{public}s', err.code, err.message); + } + } + + static setKeepScreenOn(value: boolean) { + let windowClass = null; + try { + window.getLastWindow(GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT), (err, data) => { //获取窗口实例 + if (err.code) { + log.error('Failed to obtain last window when setKeepScreenOn. Cause:%{public}s', JSON.stringify(err)); + return; + } + windowClass = data; + // Sets whether the screen is always on. + let keepScreenOnPromise = windowClass.setWindowKeepScreenOn(value); + Promise.all([keepScreenOnPromise]).then(() => { + log.info('Succeeded in setKeepScreenOn, value:%{public}s', value); + }).catch((err) => { + log.error('Failed to setKeepScreenOn, cause:%{public}s', JSON.stringify(err)); + }); + }); + } catch (exception) { + log.error('Failed to get or set the window when setKeepScreenOn, cause:%{public}s', JSON.stringify(exception)); + } + } + + static isRoundScreen() : boolean { + return DeviceUtils._roundScreen; + } + + static hasSoftKeys() : boolean { + return DeviceUtils._hasSoftKeys; + } + + static isCutoutEnable() : boolean { + return DeviceUtils._isCutoutEnable; + } + + static initScreenInfo() : void { + let windowClass = null; + try { + window.getLastWindow(GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT), (err, data) => { + if (err.code) { + log.error('Failed to obtain last window when initScreenInfo. Cause:%{public}s', JSON.stringify(err)); + return; + } + + windowClass = data; + let windowProperties: window.WindowProperties = windowClass.getWindowProperties(); + DeviceUtils._roundScreen = windowProperties.isRoundCorner; + let rect: Rect = windowProperties.windowRect; + if(rect.top + rect.height < display.getDefaultDisplaySync().height) { + DeviceUtils._hasSoftKeys = true; + } else { + DeviceUtils._hasSoftKeys = false; + } + }); + } catch (exception) { + log.error('Failed to get or set the window when initScreenInfo, cause:%{public}s', JSON.stringify(exception)); + } + + display.getDefaultDisplaySync().getCutoutInfo().then((data) => { + if(data.boundingRects.length == 0) { + DeviceUtils._isCutoutEnable = false; + return; + } + + DeviceUtils._isCutoutEnable = true; + DeviceUtils._cutoutLeft = data.boundingRects[0].left; + DeviceUtils._cutoutTop = data.boundingRects[0].top; + DeviceUtils._cutoutWidth = data.boundingRects[0].width; + DeviceUtils._cutoutHeight = data.boundingRects[0].height; + }).catch((err) => { + log.error('Failed to obtain all the display objects. Code: ' + JSON.stringify(err)); + }); + } + + static getOrientation() : number { + let orientation: display.Orientation = display.getDefaultDisplaySync().orientation; + + // If the system enumeration value changes, the processing logic in the C++ code needs to be changed. Therefore, the mapping is performed again. + if(orientation == display.Orientation.PORTRAIT) { + return 0; + } + + if(orientation == display.Orientation.LANDSCAPE) { + return 1; + } + + if(orientation == display.Orientation.PORTRAIT_INVERTED) { + return 2; + } + + if(orientation == display.Orientation.LANDSCAPE_INVERTED) { + return 3; + } + + return 4; + } + + static getCutoutHeight() : number { + if(DeviceUtils._cutoutHeight) { + let height = DeviceUtils._cutoutTop + DeviceUtils._cutoutHeight; + return height; + } + return 0; + } + + static getCutoutWidth() : number { + if(!DeviceUtils._cutoutWidth) { + return 0; + } + + let disPlayWidth = display.getDefaultDisplaySync().width; + if(DeviceUtils._cutoutLeft + DeviceUtils._cutoutWidth > disPlayWidth - DeviceUtils._cutoutLeft) { + return disPlayWidth - DeviceUtils._cutoutLeft; + } + + return DeviceUtils._cutoutLeft + DeviceUtils._cutoutWidth; + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts new file mode 100644 index 0000000000..0e8c8fa115 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts @@ -0,0 +1,55 @@ +import { getContext } from "libnativerender.so"; +import { ContextType } from "../../common/Constants" +import sensor from '@ohos.sensor'; +import display from '@ohos.display'; +import {Result} from "../../entity/Result" +import Logger from '../../utils/Logger' + +let log: Logger = new Logger(0x0001, "AccelerometerUtils"); + +const accUtils = getContext(ContextType.SENSOR_API); + +export default class Accelerometer { + + private static instance = new Accelerometer(); + + static getInstance() : Accelerometer { + return Accelerometer.instance; + } + + static enable(intervalTime: number) : void { + try { + /* HarmonyOS allow multiple subscriptions, but the game only need one + so if the interval changed, cancel subscription and redo with the new interval */ + sensor.off(sensor.SensorId.ACCELEROMETER); + sensor.on(sensor.SensorId.ACCELEROMETER, function (data) { + let rotation = display.getDefaultDisplaySync().rotation; + if (rotation === 0) { + // Display device screen rotation 0° + accUtils.onAccelerometerCallBack(data.x, data.y, data.z, intervalTime); + } else if (rotation === 1) { + // Display device screen rotation 90° + accUtils.onAccelerometerCallBack(data.y, -data.x, data.z, intervalTime); + } else if (rotation === 2) { + // Display device screen rotation 180° + accUtils.onAccelerometerCallBack(-data.x, -data.y, data.z, intervalTime); + } else if (rotation === 3) { + // Display device screen rotation 270° + accUtils.onAccelerometerCallBack(-data.y, data.x, data.z, intervalTime); + } else { + log.error('Accelerometer init fail, err: %{public}s', JSON.stringify(Result.error(-1, 'unsupported rotation: ' + rotation))); + } + }, { interval: intervalTime }); + } catch (err) { + log.error('Accelerometer init fail, err: %{public}s', JSON.stringify(Result.error(-1, JSON.stringify(err))) ?? ''); + } + } + + static disable() : void { + try { + sensor.off(sensor.SensorId.ACCELEROMETER); + } catch (err) { + log.error('Accelerometer off fail, err: %{public}s', JSON.stringify(Result.error(-1, JSON.stringify(err))) ?? ''); + } + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/Logger.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/Logger.ts new file mode 100644 index 0000000000..6277b0e1ab --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/Logger.ts @@ -0,0 +1,27 @@ +import hilog from '@ohos.hilog' + +export default class Logger { + private domain: number + private prefix: string + + constructor(domain : number, prefix: string) { + this.domain = domain + this.prefix = prefix + } + + debug(format: string, ...args: any[]) { + hilog.debug(this.domain, this.prefix, format, args) + } + + info(format: string, ...args: any[]) { + hilog.info(this.domain, this.prefix, format, args) + } + + warn(format: string, ...args: any[]) { + hilog.warn(this.domain, this.prefix, format, args) + } + + error(format: string, ...args: any[]) { + hilog.error(this.domain, this.prefix, format, args) + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ts new file mode 100644 index 0000000000..4e3d20ec55 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ts @@ -0,0 +1,8 @@ +import measure from '@ohos.measure'; + +export default class StringUtils { + + public static getWidth(text: string, fontSize: number, fontWeight: number): number { + return measure.measureText({ textContent: text, fontSize: fontSize + 'px', fontWeight: fontWeight }); + } +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/WorkerMsgUtils.ets b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/WorkerMsgUtils.ets new file mode 100644 index 0000000000..b9cac7106b --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/WorkerMsgUtils.ets @@ -0,0 +1,42 @@ +import worker, { MessageEvents } from '@ohos.worker'; +import Logger from './Logger'; +import { handleEditBoxMsg } from '../components/editbox/EditBoxMsg' +import { handleWebViewMsg } from '../components/webview/WebViewMsg' +import { handleVideoPlayMsg } from '../components/videoplayer/VideoPlayerMsg' +import { handleDialogMsg } from '../components/dialog/DialogMsg' +import { handleJumpManagerMsg } from '../system/appJump/JumpManagerMsg' +import { handleApplicationMsg } from '../system/application/ApplicationManager' +import { BaseWorkerMsgEntity, DialogMsgEntity, EditBoxMsgEntity, JumpMsgEntity, VideoPlayMsgEntity, WebViewMsgEntity } from '../entity/WorkerMsgEntity'; + +export class WorkerMsgUtils { + static workPort = worker.workerPort; + static log : Logger = new Logger(0x0001, 'WorkerMsgUtils') + + static async recvWorkerThreadMessage(event: MessageEvents) { + let eventData: BaseWorkerMsgEntity = event.data; + WorkerMsgUtils.log.debug('mainThread receiveMsg, module:%{public}s, function:%{public}s', eventData.module, eventData.function); + + switch (eventData.module) { + case 'EditBox': + handleEditBoxMsg(eventData as EditBoxMsgEntity); + break; + case "Dialog": + handleDialogMsg(eventData as DialogMsgEntity); + break; + case 'WebView': + handleWebViewMsg(eventData as WebViewMsgEntity); + break; + case 'VideoPlay': + handleVideoPlayMsg(eventData as VideoPlayMsgEntity); + break; + case 'JumpManager': + handleJumpManagerMsg(eventData as JumpMsgEntity); + break; + case 'ApplicationManager': + handleApplicationMsg(eventData as BaseWorkerMsgEntity); + break; + default: + WorkerMsgUtils.log.error('%{public}s has not implement yet', eventData.module); + } + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/module.json5 b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/module.json5 new file mode 100644 index 0000000000..daa1891126 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/module.json5 @@ -0,0 +1,10 @@ +{ + "module": { + "name": "libSysCapabilities", + "type": "har", + "deviceTypes": [ + "phone", + "tablet" + ] + } +} diff --git a/samples/js-tests/project/proj.ohos/oh-package.json5 b/samples/js-tests/project/proj.ohos/oh-package.json5 new file mode 100644 index 0000000000..1ebf93ed2a --- /dev/null +++ b/samples/js-tests/project/proj.ohos/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "modelVersion": "5.0.0", + "license": "ISC", + "devDependencies": {}, + "name": "proj.ohos", + "description": "example description", + "repository": {}, + "version": "1.0.0", + "dependencies": {} +} \ No newline at end of file diff --git a/samples/js-tests/src/ExtensionsTest/NetworkTest/WebSocketTest.js b/samples/js-tests/src/ExtensionsTest/NetworkTest/WebSocketTest.js index 4455043a34..d8f7bc5c60 100644 --- a/samples/js-tests/src/ExtensionsTest/NetworkTest/WebSocketTest.js +++ b/samples/js-tests/src/ExtensionsTest/NetworkTest/WebSocketTest.js @@ -25,7 +25,7 @@ THE SOFTWARE. ****************************************************************************/ -var WebSocket = WebSocket || window.WebSocket || window.MozWebSocket; +var WebSocket = WebSocket || window.WebSocket || window.MozWebSocket; var WebSocketTestLayer = cc.Layer.extend({ From 7aceae4f87f91810410edc2f6bf75865999ab8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B0=E5=86=B0=E5=86=B0?= <418776654@qq.com> Date: Wed, 23 Apr 2025 11:16:06 +0800 Subject: [PATCH 2/2] Change the ts file to ets; API15 upgrade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 冰冰冰 <418776654@qq.com> --- .../project/proj.ohos/build-profile.json5 | 12 ++-- .../proj.ohos/entry/build-profile.json5 | 2 +- .../proj.ohos/entry/src/main/cpp/main.cpp | 4 +- .../entry/src/main/cpp/napi_init.cpp | 15 ----- .../src/main/cpp/types/libentry/index.d.ts | 1 - .../{MainAbility.ts => MainAbility.ets} | 41 +++++++++---- .../src/main/ets/components/CocosWebview.ets | 4 +- .../{CocosWorker.ts => CocosWorker.ets} | 38 ++++++------ .../{WorkerManager.ts => WorkerManager.ets} | 2 +- .../proj.ohos/entry/src/main/module.json5 | 4 +- .../{index.ts => index.ets} | 2 +- .../libSysCapabilities/oh-package.json5 | 2 +- .../common/{Constants.ts => Constants.ets} | 2 +- .../src/main/ets/common/GlobalContext.ts | 3 +- .../dialog/{DialogMsg.ts => DialogMsg.ets} | 4 +- .../{DialogWorker.ts => DialogWorker.ets} | 4 +- .../{CocosEditBox.ts => CocosEditBox.ets} | 7 ++- .../{VideoPlayer.ts => VideoPlayer.ets} | 5 +- .../webview/{WebView.ts => WebView.ets} | 5 +- .../ets/components/webview/WebViewMsg.ets | 30 +--------- .../src/main/ets/entity/Result.ets | 23 ++++++++ .../src/main/ets/entity/Result.ts | 16 ----- ...logEntity.ts => TextInputDialogEntity.ets} | 0 .../napi/{NapiHelper.ts => NapiHelper.ets} | 11 ++-- .../{Preferences.ts => Preferences.ets} | 27 +-------- .../{JumpManager.ts => JumpManager.ets} | 0 .../{JumpManagerMsg.ts => JumpManagerMsg.ets} | 10 ++-- ...ationManager.ts => ApplicationManager.ets} | 2 +- .../{DeviceUtils.ts => DeviceUtils.ets} | 59 ++++++++++++++++--- .../ets/system/sensor/AccelerometerUtils.ts | 55 ----------------- .../utils/{StringUtils.ts => StringUtils.ets} | 0 31 files changed, 174 insertions(+), 216 deletions(-) rename samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/{MainAbility.ts => MainAbility.ets} (58%) rename samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/{CocosWorker.ts => CocosWorker.ets} (72%) rename samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/{WorkerManager.ts => WorkerManager.ets} (97%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/{index.ts => index.ets} (96%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/{Constants.ts => Constants.ets} (99%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/{DialogMsg.ts => DialogMsg.ets} (97%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/{DialogWorker.ts => DialogWorker.ets} (95%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/{CocosEditBox.ts => CocosEditBox.ets} (96%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/{VideoPlayer.ts => VideoPlayer.ets} (95%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/{WebView.ts => WebView.ets} (96%) create mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ets delete mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/{TextInputDialogEntity.ts => TextInputDialogEntity.ets} (100%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/{NapiHelper.ts => NapiHelper.ets} (95%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/{Preferences.ts => Preferences.ets} (72%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/{JumpManager.ts => JumpManager.ets} (100%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/{JumpManagerMsg.ts => JumpManagerMsg.ets} (76%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/{ApplicationManager.ts => ApplicationManager.ets} (99%) rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/{DeviceUtils.ts => DeviceUtils.ets} (67%) delete mode 100644 samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts rename samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/{StringUtils.ts => StringUtils.ets} (100%) diff --git a/samples/js-tests/project/proj.ohos/build-profile.json5 b/samples/js-tests/project/proj.ohos/build-profile.json5 index fe6220c41a..6a7400f164 100644 --- a/samples/js-tests/project/proj.ohos/build-profile.json5 +++ b/samples/js-tests/project/proj.ohos/build-profile.json5 @@ -4,7 +4,7 @@ { "name": "default", "signingConfig": "default", - "compatibleSdkVersion": "5.0.0(12)", + "compatibleSdkVersion": "5.0.3(15)", "runtimeOS": "HarmonyOS" } ], @@ -13,13 +13,13 @@ "name": "default", "type": "HarmonyOS", "material": { - "certpath": "C:\\Users\\cocos\\.ohos\\config\\default_proj.ohos_QXMC-gAJhIy09r-aR-O9R7q8nTHTumnKBesfb9edLwk=.cer", - "storePassword": "0000001B6A69302D4D111DCB74975A8165D5E23EA61A73FCCE30D42952F837C28C48131D9A1D6724675265", + "certpath": "C:\\Users\\cocos\\.ohos\\config\\default_proj.ohos_8Fd3EcMM_RdXw_o1Qluil2Zs6rDDxSCb9KVybL2AofA=.cer", "keyAlias": "debugKey", - "keyPassword": "0000001B8470462D8531EC86C7F826FE0041C5136295A7521B1EF44982FE9731397016A1E84BA83212AFDE", - "profile": "C:\\Users\\cocos\\.ohos\\config\\default_proj.ohos_QXMC-gAJhIy09r-aR-O9R7q8nTHTumnKBesfb9edLwk=.p7b", + "keyPassword": "0000001A6E67CC5E817B52C8B8F1A155B53FCB113D9846F6430921A35A91F0C1FBA5081E337B95F52A2E", + "profile": "C:\\Users\\cocos\\.ohos\\config\\default_proj.ohos_8Fd3EcMM_RdXw_o1Qluil2Zs6rDDxSCb9KVybL2AofA=.p7b", "signAlg": "SHA256withECDSA", - "storeFile": "C:\\Users\\cocos\\.ohos\\config\\default_proj.ohos_QXMC-gAJhIy09r-aR-O9R7q8nTHTumnKBesfb9edLwk=.p12" + "storeFile": "C:\\Users\\cocos\\.ohos\\config\\default_proj.ohos_8Fd3EcMM_RdXw_o1Qluil2Zs6rDDxSCb9KVybL2AofA=.p12", + "storePassword": "0000001A8D23A0A8E834550BA7E84550FF7BF680D7129698185DB486564E8E45F50BEE6036BB86FE43D1" } } ] diff --git a/samples/js-tests/project/proj.ohos/entry/build-profile.json5 b/samples/js-tests/project/proj.ohos/entry/build-profile.json5 index edb7d04f04..81aa308f83 100644 --- a/samples/js-tests/project/proj.ohos/entry/build-profile.json5 +++ b/samples/js-tests/project/proj.ohos/entry/build-profile.json5 @@ -12,7 +12,7 @@ }, "sourceOption": { "workers": [ - './src/main/ets/workers/CocosWorker.ts' + './src/main/ets/workers/CocosWorker.ets' ] } }, diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/main.cpp b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/main.cpp index b04af9d0ef..093a2cf765 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/main.cpp +++ b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/main.cpp @@ -10,7 +10,7 @@ extern "C" void Cocos2dxRenderer_nativeInit(int w, int h) { - OHOS_LOGD("Cocos2dxRenderer_nativeInit() - window width:[%d], height:[%d]", w, h); + OHOS_LOGD("Cocos2dxRenderer_nativeInit() - window width:[%{public}d], height:[%{public}d]", w, h); if (!CCDirector::sharedDirector()->getOpenGLView()) { OHOS_LOGD("Cocos2dxRenderer_nativeInit() - branch 1"); @@ -33,4 +33,4 @@ void Cocos2dxRenderer_nativeInit(int w, int h) } } -} \ No newline at end of file +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp index 4448b81987..29e456357c 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp +++ b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/napi_init.cpp @@ -1,18 +1,3 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * 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. - */ - #include "platform/ohos/CCLogOhos.h" #include "plugin_manager.h" diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts index 6a9293652b..972797dab3 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts +++ b/samples/js-tests/project/proj.ohos/entry/src/main/cpp/types/libentry/index.d.ts @@ -24,7 +24,6 @@ export interface CPPFunctions { failLoading: (viewTag: number, url: string) => void; jsCallback: () => void; onVideoCallBack: (viewTag: number, event: number) => void; - onAccelerometerCallBack: (x: number, y: number, z: number, interval: number) => void; } export const getContext: (a: number) => CPPFunctions; diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ts b/samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ets similarity index 58% rename from samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ts rename to samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ets index a89ce067f4..3767ce3394 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ts +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/MainAbility/MainAbility.ets @@ -1,20 +1,21 @@ import window from '@ohos.window'; import UIAbility from '@ohos.app.ability.UIAbility'; -import web_webview from '@ohos.web.webview'; import nativeRender from "libnativerender.so"; -import { ContextType } from "@ohos/libSysCapabilities" +import { ContextType, DeviceUtils } from "@ohos/libSysCapabilities" import { GlobalContext,GlobalContextConstants} from "@ohos/libSysCapabilities" +import { BusinessError } from '@kit.BasicServicesKit'; +import { WorkerManager } from '../workers/WorkerManager'; +import Want from '@ohos.app.ability.Want'; +import AbilityConstant from '@ohos.app.ability.AbilityConstant'; const nativeAppLifecycle: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.APP_LIFECYCLE); const rawFileUtils: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.RAW_FILE_UTILS); +let cocosWorker = WorkerManager.getInstance().getWorker(); export default class MainAbility extends UIAbility { - onCreate(want, launchParam) { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { nativeAppLifecycle.onCreate(); GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT, this.context); - // Initializes the webView kernel of the system. This parameter is optional if it is not used. - web_webview.WebviewController.initializeWebEngine(); - GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_WANT, this.context); console.info('[LIFECYCLE-App] onCreate') } @@ -23,9 +24,9 @@ export default class MainAbility extends UIAbility { console.info('[LIFECYCLE-App] onDestroy') } - onWindowStageCreate(windowStage) { + onWindowStageCreate(windowStage: window.WindowStage): void { // Main window is created, set main page for this ability - windowStage.loadContent('pages/Index', (err, data) => { + windowStage.loadContent('pages/Index', (err:BusinessError, data) => { if (err.code) { return; } @@ -34,6 +35,7 @@ export default class MainAbility extends UIAbility { }); windowStage.getMainWindow().then((windowIns: window.Window) => { + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_MAIN_WINDOW, windowIns); // Set whether to display the status bar and navigation bar. If they are not displayed, [] is displayed. let systemBarPromise = windowIns.setWindowSystemBarEnable([]); // Whether the window layout is displayed in full screen mode @@ -42,12 +44,29 @@ export default class MainAbility extends UIAbility { let keepScreenOnPromise = windowIns.setWindowKeepScreenOn(true); Promise.all([systemBarPromise, fullScreenPromise, keepScreenOnPromise]).then(() => { console.info('Succeeded in setting the window'); - }).catch((err) => { - console.error('Failed to set the window, cause ' + JSON.stringify(err)); + }).catch((err: BusinessError) => { + console.error('Failed to set the window, cause ', err.code, err.message); }); + + try { + DeviceUtils.calculateSafeArea(cocosWorker, windowIns.getWindowAvoidArea(window.AvoidAreaType.TYPE_CUTOUT), windowIns.getWindowProperties().windowRect); + windowIns.on('avoidAreaChange', (data) => { + console.info('getSafeAreaRect Succeeded in enabling the listener for system avoid area changes. type:' + + JSON.stringify(data.type) + ', area: ' + JSON.stringify(data.area)); + + if(data.type == window.AvoidAreaType.TYPE_SYSTEM_GESTURE || data.type == window.AvoidAreaType.TYPE_KEYBOARD) { + return; + } + + let mainWindow: window.Window = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_MAIN_WINDOW); + DeviceUtils.calculateSafeArea(cocosWorker, data.area, mainWindow.getWindowProperties().windowRect); + }); + } catch (exception) { + console.error(`Failed to enable the listener for system avoid area changes. Cause code: ${exception.code}, message: ${exception.message}`); + } }) - windowStage.on("windowStageEvent", (data) => { + windowStage.on("windowStageEvent", (data:window.WindowStageEventType) => { let stageEventType: window.WindowStageEventType = data; switch (stageEventType) { case window.WindowStageEventType.RESUMED: diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets index f26ba14cc6..5205ec3ba7 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/components/CocosWebview.ets @@ -4,7 +4,7 @@ import { WorkerManager } from '../workers/WorkerManager'; @Component export struct CocosWebView { - viewInfo: WebViewInfo = new WebViewInfo(0, 0, 0, 0, 0); + @ObjectLink viewInfo: WebViewInfo ; cocosWorker: worker.ThreadWorker = WorkerManager.getInstance().getWorker(); build() { @@ -40,4 +40,4 @@ export struct CocosWebView { this.cocosWorker.postMessage({ type: "onErrorReceive", viewTag: this.viewInfo.viewTag, url: this.viewInfo.url }) }) } -} \ No newline at end of file +} diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ts b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ets similarity index 72% rename from samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ts rename to samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ets index 94ddb8d389..d8047e80ea 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ts +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/CocosWorker.ets @@ -1,13 +1,13 @@ -import worker, { ThreadWorkerGlobalScope } from '@ohos.worker'; +import worker, { ThreadWorkerGlobalScope, MessageEvents } from '@ohos.worker'; import nativeRender from "libnativerender.so"; -import { ContextType } from "@ohos/libSysCapabilities" +import { ContextType, DeviceUtils } from "@ohos/libSysCapabilities" import { VideoPlayer } from "@ohos/libSysCapabilities" +import { ApplicationManager } from "@ohos/libSysCapabilities" import { CocosEditBox } from "@ohos/libSysCapabilities" import { Dialog } from "@ohos/libSysCapabilities" import { WebView } from "@ohos/libSysCapabilities" import { JumpManager } from "@ohos/libSysCapabilities" import { NapiHelper } from "@ohos/libSysCapabilities" -import { ApplicationManager } from "@ohos/libSysCapabilities" import { GlobalContext,GlobalContextConstants} from "@ohos/libSysCapabilities" const appLifecycle: nativeRender.CPPFunctions = nativeRender.getContext(ContextType.APP_LIFECYCLE); @@ -24,56 +24,60 @@ NapiHelper.registerFunctions(napiContext.registerFunction) const workerPort: ThreadWorkerGlobalScope = worker.workerPort; -workerPort.onmessage = function(e) : void { - let data = e.data; - switch(data.type) { +workerPort.onmessage = (e: MessageEvents) => { + switch(e.data.type) { case "onXCLoad": console.log("[cocos] onXCLoad Callback"); Dialog.init(workerPort); CocosEditBox.init(workerPort); JumpManager.init(workerPort); WebView.init(workerPort); - VideoPlayer.init(workerPort); ApplicationManager.init(workerPort); + VideoPlayer.init(workerPort); napiContext.initAsyncInfo(); break; case "abilityContextInit": - GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT, data.data); + GlobalContext.storeGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT, e.data.data); break; case "editBoxOnFocus": - inputNapi.editBoxOnFocusCB(data.viewTag); + inputNapi.editBoxOnFocusCB(e.data.viewTag); break; case "editBoxOnChange": - inputNapi.editBoxOnChangeCB(data.viewTag, data.value); + inputNapi.editBoxOnChangeCB(e.data.viewTag, e.data.value); break; case "editBoxOnEnter": - inputNapi.editBoxOnEnterCB(data.viewTag, data.text); + inputNapi.editBoxOnEnterCB(e.data.viewTag, e.data.text); break; case "textFieldTTFOnChange": - inputNapi.textFieldTTFOnChangeCB(data.data); + inputNapi.textFieldTTFOnChangeCB(e.data.data); break; case "onMouseWheel": - mouseNapi.mouseWheelCB(data.eventType, data.scrollY); + mouseNapi.mouseWheelCB(e.data.eventType, e.data.scrollY); break; case "onPageBegin": - webViewNapi.shouldStartLoading(data.viewTag, data.url); + webViewNapi.shouldStartLoading(e.data.viewTag, e.data.url); break; case "onPageEnd": - webViewNapi.finishLoading(data.viewTag, data.url); + webViewNapi.finishLoading(e.data.viewTag, e.data.url); break; case "onJsCallBack": webViewNapi.jsCallback(); break; case "onErrorReceive": - webViewNapi.failLoading(data.viewTag, data.url); + webViewNapi.failLoading(e.data.viewTag, e.data.url); break; case "onVideoCallBack": - videoPlayNapi.onVideoCallBack(data.viewTag, data.event); + videoPlayNapi.onVideoCallBack(e.data.viewTag, e.data.event); break; case "exit": appLifecycle.onBackPress(); break; + case "updateSafeArea": + DeviceUtils.updateWorkerSafeArea(e.data.safeArea); + break; default: console.error("cocos worker: message type unknown") } } + + diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ts b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ets similarity index 97% rename from samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ts rename to samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ets index e2ec70b187..0447223b1e 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ts +++ b/samples/js-tests/project/proj.ohos/entry/src/main/ets/workers/WorkerManager.ets @@ -5,7 +5,7 @@ export class WorkerManager { private cocosWorker: worker.ThreadWorker; private constructor() { - this.cocosWorker = new worker.ThreadWorker("entry/ets/workers/CocosWorker.ts", { + this.cocosWorker = new worker.ThreadWorker("entry/ets/workers/CocosWorker.ets", { type: "classic", name: "CocosWorker" }); diff --git a/samples/js-tests/project/proj.ohos/entry/src/main/module.json5 b/samples/js-tests/project/proj.ohos/entry/src/main/module.json5 index a1992394e3..a71568bbe5 100644 --- a/samples/js-tests/project/proj.ohos/entry/src/main/module.json5 +++ b/samples/js-tests/project/proj.ohos/entry/src/main/module.json5 @@ -14,7 +14,7 @@ "abilities": [ { "name": "MainAbility", - "srcEntry": "./ets/MainAbility/MainAbility.ts", + "srcEntry": "./ets/MainAbility/MainAbility.ets", "description": "$string:MainAbility_desc", "icon": "$media:icon", "label": "$string:MainAbility_label", @@ -33,7 +33,7 @@ } ], // https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/quick-start/module-configuration-file.md/ - "supportWindowMode": ["fullscreen"], + "supportWindowMode": ["fullscreen"], "maxWindowWidth": 1080, "minWindowWidth": 1080, "maxWindowHeight": 720, diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/index.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/index.ets similarity index 96% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/index.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/index.ets index 6c537383d2..decdc1332d 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/index.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/index.ets @@ -12,4 +12,4 @@ export { NapiHelper } from './src/main/ets/napi/NapiHelper' export { JumpManager } from './src/main/ets/system/appJump/JumpManager' export { DeviceUtils } from './src/main/ets/system/device/DeviceUtils' -export { ApplicationManager } from './src/main/ets/system/application/ApplicationManager' +export { ApplicationManager } from './src/main/ets/system/application/ApplicationManager' \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/oh-package.json5 b/samples/js-tests/project/proj.ohos/libSysCapabilities/oh-package.json5 index 5634eb1fb1..cb9e2462c3 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/oh-package.json5 +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/oh-package.json5 @@ -7,7 +7,7 @@ "ohos": { "org": "" }, - "main": "index.ts", + "main": "index.ets", "type": "module", "version": "1.0.0", "dependencies": {} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/Constants.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/Constants.ets similarity index 99% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/Constants.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/Constants.ets index 1a101a31d2..e0f60659d8 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/Constants.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/Constants.ets @@ -19,4 +19,4 @@ export class AppPermissionConsts { static readonly REQUEST_CODE_REQUIRED: number = 1000; static readonly REQUEST_CODE_CUSTOM: number = 1001; -} +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/GlobalContext.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/GlobalContext.ts index 616534b266..15af26a900 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/GlobalContext.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/common/GlobalContext.ts @@ -22,4 +22,5 @@ export class GlobalContextConstants { static readonly COCOS2DX_ABILITY_CONTEXT = "Cocos2dx.abilityContext"; static readonly COCOS2DX_ABILITY_WANT = "Cocos2dx.abilityWant"; static readonly COCOS2DX_WEB_RESULT= "Cocos2dx.webResult"; -} \ No newline at end of file + static readonly COCOS2DX_MAIN_WINDOW = "Cocos2dx.mainWindow"; +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogMsg.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogMsg.ets similarity index 97% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogMsg.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogMsg.ets index dfc5babf34..5355a89f86 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogMsg.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogMsg.ets @@ -40,8 +40,8 @@ function showDialog(dialogTitle: string, dialogMessage: string) { color: '#000000' }, ], - success: function(data) { + success: (data) => { log.debug("handling callback, data:%{public}s", data); } }); -} +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogWorker.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogWorker.ets similarity index 95% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogWorker.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogWorker.ets index 08f0bd7c37..968ed4cca7 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogWorker.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/dialog/DialogWorker.ets @@ -3,7 +3,7 @@ import { DialogMsgEntity } from '../../entity/WorkerMsgEntity'; export class Dialog { static MODULE_NAME : string = 'Dialog'; - static workerPort; + static workerPort: ThreadWorkerGlobalScope; static init(workerPort: ThreadWorkerGlobalScope) : void { Dialog.workerPort = workerPort; @@ -26,4 +26,4 @@ export class Dialog { let dialogMsgEntity: DialogMsgEntity = new DialogMsgEntity(Dialog.MODULE_NAME, 'hideTextInputDialog'); Dialog.workerPort.postMessage(dialogMsgEntity); } -} +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/CocosEditBox.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/CocosEditBox.ets similarity index 96% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/CocosEditBox.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/CocosEditBox.ets index ca4d8e7109..ed2049cb2c 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/CocosEditBox.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/editbox/CocosEditBox.ets @@ -1,11 +1,12 @@ +import type { ThreadWorkerGlobalScope } from '@ohos.worker'; import { Color4B, EditBoxMsgEntity, ViewRect } from '../../entity/WorkerMsgEntity'; export class CocosEditBox { static MODULE_NAME : string = 'EditBox'; - private static workerPort; + private static workerPort : ThreadWorkerGlobalScope; - static init(workerPort) : void { + static init(workerPort : ThreadWorkerGlobalScope) : void { CocosEditBox.workerPort = workerPort; } @@ -108,4 +109,4 @@ export class CocosEditBox { let editBoxMsgEntity: EditBoxMsgEntity = new EditBoxMsgEntity(CocosEditBox.MODULE_NAME, 'hideAllEditBox'); CocosEditBox.workerPort.postMessage(editBoxMsgEntity); } -} +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ets similarity index 95% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ets index 50b7a7e69d..f4a11e84d2 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/videoplayer/VideoPlayer.ets @@ -1,11 +1,12 @@ import { VideoPlayMsgEntity, ViewRect } from '../../entity/WorkerMsgEntity'; +import type { ThreadWorkerGlobalScope } from '@ohos.worker'; export class VideoPlayer { static MODULE_NAME: string = 'VideoPlay'; - private static workerPort; + private static workerPort : ThreadWorkerGlobalScope; - static init(workerPort) : void { + static init(workerPort : ThreadWorkerGlobalScope) : void { VideoPlayer.workerPort = workerPort; } diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ets similarity index 96% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ets index 872ec4ce70..49ffb1dad4 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebView.ets @@ -1,11 +1,12 @@ import { ViewRect, WebViewMsgEntity } from '../../entity/WorkerMsgEntity'; +import type { ThreadWorkerGlobalScope } from '@ohos.worker'; export class WebView { static MODULE_NAME: string = 'WebView'; - private static workerPort; + private static workerPort : ThreadWorkerGlobalScope; - static init(workerPort) : void { + static init(workerPort : ThreadWorkerGlobalScope) : void { WebView.workerPort = workerPort; } diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets index 24e1f86d97..b03c4004f5 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/components/webview/WebViewMsg.ets @@ -5,7 +5,7 @@ import { WebViewMsgEntity } from '../../entity/WorkerMsgEntity'; import { BusinessError } from '@ohos.base'; let log: Logger = new Logger(0x0001, "WebViewMsg"); - +@Observed export class WebViewInfo { public uniqueId : number = 0; // position @@ -34,20 +34,7 @@ export class WebViewInfo { this.viewTag = viewTag this.uniqueId = viewTag; } -} -function copyWebViewInfo(viewInfo: WebViewInfo) : WebViewInfo { - let newViewInfo: WebViewInfo = new WebViewInfo(viewInfo.x, viewInfo.y, viewInfo.w, viewInfo.h, viewInfo.viewTag); - newViewInfo.url = viewInfo.url; - newViewInfo.isUrl = viewInfo.isUrl; - newViewInfo.zoomAccess = viewInfo.zoomAccess; - newViewInfo.visible = viewInfo.visible; - newViewInfo.controller = viewInfo.controller; - newViewInfo.opacity = viewInfo.opacity; - newViewInfo.backgroundColor = viewInfo.backgroundColor; - newViewInfo.jsInterfaceScheme = viewInfo.jsInterfaceScheme; - newViewInfo.uniqueId = 100000 - viewInfo.uniqueId; // support 50000 webView exist at the same time - return newViewInfo; } function waitUtilControllerAttached() : Promise { @@ -168,9 +155,6 @@ export function handleWebViewMsg(eventData: WebViewMsgEntity) { tmpWebInfo.y = px2vp(eventData.viewRect.y); tmpWebInfo.w = px2vp(eventData.viewRect.w); tmpWebInfo.h = px2vp(eventData.viewRect.h); - let newViewInfo:WebViewInfo = copyWebViewInfo(tmpWebInfo); - let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); - tempInfoArray[index] = newViewInfo; break; } case "setVisible": { @@ -181,9 +165,6 @@ export function handleWebViewMsg(eventData: WebViewMsgEntity) { } let tmpWebInfo:WebViewInfo= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; tmpWebInfo.visible = eventData.visible; - let newViewInfo:WebViewInfo = copyWebViewInfo(tmpWebInfo); - let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); - tempInfoArray[index] = newViewInfo; break; } case "setOpacityWebView": { @@ -194,9 +175,6 @@ export function handleWebViewMsg(eventData: WebViewMsgEntity) { } let tmpWebInfo :WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; tmpWebInfo.opacity = eventData.opacity; - let newViewInfo :WebViewInfo= copyWebViewInfo(tmpWebInfo); - let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); - tempInfoArray[index] = newViewInfo; break; } case "setBackgroundTransparent": { @@ -207,9 +185,6 @@ export function handleWebViewMsg(eventData: WebViewMsgEntity) { } GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index] .backgroundColor = Color.Transparent; - let newViewInfo :WebViewInfo= copyWebViewInfo(GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]); - let tempInfoArray :WebViewInfo[]= GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); - tempInfoArray[index] = newViewInfo; break; } case "evaluateJS": { @@ -236,9 +211,6 @@ export function handleWebViewMsg(eventData: WebViewMsgEntity) { } let tmpWebInfo:WebViewInfo = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY)[index]; tmpWebInfo.zoomAccess == eventData.scalesPageToFit - let newViewInfo:WebViewInfo = copyWebViewInfo(tmpWebInfo); - let tempInfoArray:WebViewInfo[] = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_WEB_VIEW_ARRAY); - tempInfoArray[index] = newViewInfo; } break; } diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ets b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ets new file mode 100644 index 0000000000..9d05d81c59 --- /dev/null +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ets @@ -0,0 +1,23 @@ +interface ResultObjectInterface { + "errCode": number; + "errMsg": string; + "data": string, +} + +export class Result { + public static success(data: string){ + return ({ + "errCode": 0, + "errMsg": "", + "data": data, + }as ResultObjectInterface); + } + + public static error(errCode:number, errMsg:string){ + return ({ + "errCode": errCode, + "errMsg": errMsg, + "data": "", + } as ResultObjectInterface); + } +}; \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts deleted file mode 100644 index dd9e38897d..0000000000 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/Result.ts +++ /dev/null @@ -1,16 +0,0 @@ -export class Result { - public static success(data){ - return { - "errCode": 0, - "errMsg": "", - "data": data, - }; - } - - public static error(errCode, errMsg) { - return { - "errCode": errCode, - "errMsg": errMsg, - }; - } -}; \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ets similarity index 100% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/entity/TextInputDialogEntity.ets diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ets similarity index 95% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ets index d4df1a5f98..c4f34b95ba 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/napi/NapiHelper.ets @@ -6,7 +6,6 @@ import { ApplicationManager } from '../system/application/ApplicationManager' import { CocosEditBox } from '../components/editbox/CocosEditBox' import { WebView } from '../components/webview/WebView' import { VideoPlayer } from '../components/videoplayer/VideoPlayer' -import Accelerometer from '../system/sensor/AccelerometerUtils' import Preferences from '../preferences/Preferences' export class NapiHelper { @@ -17,7 +16,6 @@ export class NapiHelper { NapiHelper.registerEditBox(registerFunc); NapiHelper.registerWebView(registerFunc); NapiHelper.registerVideoPlay(registerFunc); - NapiHelper.registerSensor(registerFunc); NapiHelper.registerPreferences(registerFunc); } @@ -43,6 +41,10 @@ export class NapiHelper { registerFunc('DeviceUtils.getOrientation', DeviceUtils.getOrientation); registerFunc('DeviceUtils.getCutoutHeight', DeviceUtils.getCutoutHeight); registerFunc('DeviceUtils.getCutoutWidth', DeviceUtils.getCutoutWidth); + registerFunc('DeviceUtils.getSafeAreaLeft', DeviceUtils.getSafeAreaLeft); + registerFunc('DeviceUtils.getSafeAreaTop', DeviceUtils.getSafeAreaTop); + registerFunc('DeviceUtils.getSafeAreaWidth', DeviceUtils.getSafeAreaWidth); + registerFunc('DeviceUtils.getSafeAreaHeight', DeviceUtils.getSafeAreaHeight); } private static registerEditBox(registerFunc : Function) { @@ -100,10 +102,7 @@ export class NapiHelper { registerFunc('VideoPlayer.setKeepAspectRatioEnabled', VideoPlayer.setKeepAspectRatioEnabled); } - private static registerSensor(registerFunc : Function) { - registerFunc('Accelerometer.enable', Accelerometer.enable); - registerFunc('Accelerometer.disable', Accelerometer.disable); - } + private static registerPreferences(registerFunc : Function) { registerFunc('Preferences.get', Preferences.get); diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ets similarity index 72% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ets index e95e89b29d..4b64aff555 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/preferences/Preferences.ets @@ -5,13 +5,12 @@ import common from '@ohos.app.ability.common'; import { GlobalContext, GlobalContextConstants } from '../common/GlobalContext'; let log: Logger = new Logger(0x0001, "Preferences"); -let preferences: data_preferences.Preferences | null = null; +let preferences: data_preferences.Preferences; const PREFS_NAME: string = "Cocos2dxPreferences"; export default class Preferences { - // 通过 preferencesName 获取Preferences实例 - static getPreferences(): data_preferences.Preferences { + static getPreferences(): void { let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); try { preferences = data_preferences.getPreferencesSync(context, {name: PREFS_NAME}); @@ -21,13 +20,8 @@ export default class Preferences { let message = (err as BusinessError).message; log.error("Failed to get preferences. code =" + code + ", message =" + message); } - return preferences; } - /* - 通过 preferencesName 从缓存中移出指定的Preferences实例,若Preferences实例有对应的持久化文件,则同时删除其持久化文件。使用Promise异步回调。 - 调用该接口后,不建议再使用旧的Preferences实例进行数据操作,否则会出现数据一致性问题,应将Preferences实例置为null,系统将会统一回收。 - */ static deletePreferences(): void { let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); try { @@ -41,12 +35,6 @@ export default class Preferences { } } - /* - 通过 preferencesName 从缓存中移出指定的Preferences实例,使用Promise异步回调。 - 应用首次调用getPreferences接口获取某个Preferences实例后,该实例会被会被缓存起来,后续再次getPreferences时不会再次从持久化文件中读取, - 直接从缓存中获取Preferences实例。调用此接口移出缓存中的实例之后,再次getPreferences将会重新读取持久化文件,生成新的Preferences实例。 - 调用该接口后,不建议再使用旧的Preferences实例进行数据操作,否则会出现数据一致性问题,应将Preferences实例置为null,系统将会统一回收。 - */ static removePreferencesFromCache(): void { let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); try { @@ -59,7 +47,6 @@ export default class Preferences { } } - // 从缓存的Preferences实例中获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue static get(key: string, defValue: data_preferences.ValueType): data_preferences.ValueType { if (preferences === null) { Preferences.getPreferences(); @@ -76,7 +63,6 @@ export default class Preferences { } } - // 将数据写入缓存的Preferences实例中,可通过flush将Preferences实例持久化 static put(key: string, value: data_preferences.ValueType): void { if (preferences === null) { Preferences.getPreferences(); @@ -92,7 +78,6 @@ export default class Preferences { } } - // 从缓存的Preferences实例中获取所有键值数据。 static getAll(): string | undefined { if (preferences === null) { Preferences.getPreferences(); @@ -111,7 +96,6 @@ export default class Preferences { } } - // 检查缓存的Preferences实例中是否包含名为给定Key的存储键值对 static has(key: string): boolean { if (preferences === null) { Preferences.getPreferences(); @@ -133,7 +117,6 @@ export default class Preferences { } } - // 从缓存的Preferences实例中删除名为给定Key的存储键值对,可通过flush将Preferences实例持久化 static delete(key: string): void { if (preferences === null) { Preferences.getPreferences(); @@ -149,7 +132,6 @@ export default class Preferences { } } - // 将缓存的Preferences实例中的数据异步存储到用户首选项的持久化文件中,使用Promise异步回调。 static flush(): void { if (preferences === null) { Preferences.getPreferences(); @@ -159,7 +141,6 @@ export default class Preferences { }); } - // 清除缓存的Preferences实例中的所有数据,可通过flush将Preferences实例持久化,使用Promise异步回调。 static clear(): void { if (preferences === null) { Preferences.getPreferences(); @@ -175,7 +156,6 @@ export default class Preferences { } - // 订阅数据变更,订阅的Key的值发生变更后,在执行flush方法后,触发callback回调。 static onChange(cb: Function): void { if (preferences === null) { Preferences.getPreferences(); @@ -192,7 +172,6 @@ export default class Preferences { } } - // 取消订阅数据变更。 static offChange(cb: Function): void { if (preferences === null) { Preferences.getPreferences(); @@ -210,8 +189,6 @@ export default class Preferences { } } -// 由于ArkTS中无Object.keys,且无法使用for..in... -// 若报ArkTS问题,请将此方法单独抽离至一个ts文件中并暴露,在需要用到的ets文件中引入使用 function getObjKeys(obj: Object): string[] { let keys = Object.keys(obj); return keys; diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ets similarity index 100% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManager.ets diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ets similarity index 76% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ets index ea373af908..2c20f240b2 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/appJump/JumpManagerMsg.ets @@ -3,6 +3,8 @@ import { GlobalContext, GlobalContextConstants } from '../../common/GlobalContex import {Result} from "../../entity/Result" import type { JumpMsgEntity } from '../../entity/WorkerMsgEntity'; import Logger from '../../utils/Logger' +import { BusinessError } from '@kit.BasicServicesKit'; +import { Want } from '@kit.AbilityKit' let log: Logger = new Logger(0x0001, "JumpManagerMsg"); @@ -18,14 +20,14 @@ export function handleJumpManagerMsg(eventData: JumpMsgEntity) : void { function openUrl(url: string): void { let context: common.UIAbilityContext = GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT); - let wantInfo = { + let wantInfo: Want = { 'action': 'ohos.want.action.viewData', 'entities': ['entity.system.browsable'], 'uri': url } context.startAbility(wantInfo).then(() => { - log.info('%{public}s', JSON.stringify(Result.success({}))); - }).catch((err) => { - log.error('openUrl : err : %{public}s', JSON.stringify(Result.error(-1, JSON.stringify(err))) ?? ''); + log.info('%{public}s', JSON.stringify(Result.success(""))); + }).catch((err: BusinessError) => { + log.error('openUrl : err : %{public}s', err.code, err.message); }); } \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ets similarity index 99% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ets index 9a552f56e4..ab8016646c 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/application/ApplicationManager.ets @@ -51,4 +51,4 @@ function terminateSelf(): void { let message = (err as BusinessError).message; console.error(`terminateSelf failed, code is ${code}, message is ${message}`); } -} +} \ No newline at end of file diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ets similarity index 67% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ets index b778f15848..239fe6990c 100644 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ts +++ b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/device/DeviceUtils.ets @@ -5,6 +5,8 @@ import Logger from '../../utils/Logger'; import window from '@ohos.window'; import { GlobalContext, GlobalContextConstants } from '../../common/GlobalContext'; import { Rect } from '@ohos.application.AccessibilityExtensionAbility'; +import { JSON, worker } from '@kit.ArkTS'; +import {BusinessError} from '@kit.BasicServicesKit' let log = new Logger(0x0001, "DeviceUtils"); @@ -17,6 +19,10 @@ export class DeviceUtils { static _cutoutWidth: number; static _cutoutTop: number; static _cutoutHeight: number; + static _originalWindowWidth: number = 0; + static _originalWindowHeight: number = 0; + static oldSafeArea: window.Rect = {left: 0, top: 0, width: 0, height: 0}; + static safeAreaInWorker: window.Rect = {left: 0, top: 0, width: 0, height: 0}; static getDpi(): number { return display.getDefaultDisplaySync().densityDPI; @@ -46,7 +52,7 @@ export class DeviceUtils { } static setKeepScreenOn(value: boolean) { - let windowClass = null; + let windowClass:window.Window; try { window.getLastWindow(GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT), (err, data) => { //获取窗口实例 if (err.code) { @@ -58,7 +64,7 @@ export class DeviceUtils { let keepScreenOnPromise = windowClass.setWindowKeepScreenOn(value); Promise.all([keepScreenOnPromise]).then(() => { log.info('Succeeded in setKeepScreenOn, value:%{public}s', value); - }).catch((err) => { + }).catch((err:BusinessError) => { log.error('Failed to setKeepScreenOn, cause:%{public}s', JSON.stringify(err)); }); }); @@ -80,11 +86,11 @@ export class DeviceUtils { } static initScreenInfo() : void { - let windowClass = null; + let windowClass: window.Window; try { window.getLastWindow(GlobalContext.loadGlobalThis(GlobalContextConstants.COCOS2DX_ABILITY_CONTEXT), (err, data) => { if (err.code) { - log.error('Failed to obtain last window when initScreenInfo. Cause:%{public}s', JSON.stringify(err)); + log.error('Failed to obtain last window when initScreenInfo. Cause:%{public}s', err.code, err.message); return; } @@ -113,8 +119,8 @@ export class DeviceUtils { DeviceUtils._cutoutTop = data.boundingRects[0].top; DeviceUtils._cutoutWidth = data.boundingRects[0].width; DeviceUtils._cutoutHeight = data.boundingRects[0].height; - }).catch((err) => { - log.error('Failed to obtain all the display objects. Code: ' + JSON.stringify(err)); + }).catch((err: BusinessError) => { + log.error('Failed to obtain all the display objects. Code: ', err.code, err.message); }); } @@ -161,4 +167,43 @@ export class DeviceUtils { return DeviceUtils._cutoutLeft + DeviceUtils._cutoutWidth; } -} \ No newline at end of file + + static calculateSafeArea(cocosWorker: worker.ThreadWorker, avoidArea: window.AvoidArea, windowRect: window.Rect) { + let safeArea : window.Rect = {left: 0, top: 0, width: 0, height: 0}; + if(DeviceUtils._originalWindowWidth == windowRect.width && DeviceUtils._originalWindowHeight == windowRect.height) { + safeArea.left = DeviceUtils.oldSafeArea.left + avoidArea.leftRect.left + avoidArea.leftRect.width; + safeArea.top = DeviceUtils.oldSafeArea.top + avoidArea.topRect.top + avoidArea.topRect.height; + safeArea.width = (avoidArea.rightRect.left != 0 ? avoidArea.rightRect.left : DeviceUtils.oldSafeArea.width) - safeArea.left; + safeArea.height = (avoidArea.bottomRect.top != 0 ? avoidArea.bottomRect.top : DeviceUtils.oldSafeArea.height) - safeArea.top; + } else { + safeArea.left = avoidArea.leftRect.left + avoidArea.leftRect.width; + safeArea.top = avoidArea.topRect.top + avoidArea.topRect.height; + safeArea.width = (avoidArea.rightRect.left != 0 ? avoidArea.rightRect.left : windowRect.width) - safeArea.left; + safeArea.height = (avoidArea.bottomRect.top != 0 ? avoidArea.bottomRect.top : windowRect.height) - safeArea.top; + DeviceUtils._originalWindowWidth = windowRect.width; + DeviceUtils._originalWindowHeight = windowRect.height; + } + DeviceUtils.oldSafeArea = safeArea; + cocosWorker.postMessage({type: 'updateSafeArea', safeArea: safeArea}); + } + + static updateWorkerSafeArea(safeArea: window.Rect) { + DeviceUtils.safeAreaInWorker = safeArea; + } + + static getSafeAreaLeft() : number { + return DeviceUtils.safeAreaInWorker.left; + } + + static getSafeAreaTop() : number { + return DeviceUtils.safeAreaInWorker.top; + } + + static getSafeAreaWidth() : number { + return DeviceUtils.safeAreaInWorker.width; + } + + static getSafeAreaHeight() : number { + return DeviceUtils.safeAreaInWorker.height; + } +} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts deleted file mode 100644 index 0e8c8fa115..0000000000 --- a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/system/sensor/AccelerometerUtils.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { getContext } from "libnativerender.so"; -import { ContextType } from "../../common/Constants" -import sensor from '@ohos.sensor'; -import display from '@ohos.display'; -import {Result} from "../../entity/Result" -import Logger from '../../utils/Logger' - -let log: Logger = new Logger(0x0001, "AccelerometerUtils"); - -const accUtils = getContext(ContextType.SENSOR_API); - -export default class Accelerometer { - - private static instance = new Accelerometer(); - - static getInstance() : Accelerometer { - return Accelerometer.instance; - } - - static enable(intervalTime: number) : void { - try { - /* HarmonyOS allow multiple subscriptions, but the game only need one - so if the interval changed, cancel subscription and redo with the new interval */ - sensor.off(sensor.SensorId.ACCELEROMETER); - sensor.on(sensor.SensorId.ACCELEROMETER, function (data) { - let rotation = display.getDefaultDisplaySync().rotation; - if (rotation === 0) { - // Display device screen rotation 0° - accUtils.onAccelerometerCallBack(data.x, data.y, data.z, intervalTime); - } else if (rotation === 1) { - // Display device screen rotation 90° - accUtils.onAccelerometerCallBack(data.y, -data.x, data.z, intervalTime); - } else if (rotation === 2) { - // Display device screen rotation 180° - accUtils.onAccelerometerCallBack(-data.x, -data.y, data.z, intervalTime); - } else if (rotation === 3) { - // Display device screen rotation 270° - accUtils.onAccelerometerCallBack(-data.y, data.x, data.z, intervalTime); - } else { - log.error('Accelerometer init fail, err: %{public}s', JSON.stringify(Result.error(-1, 'unsupported rotation: ' + rotation))); - } - }, { interval: intervalTime }); - } catch (err) { - log.error('Accelerometer init fail, err: %{public}s', JSON.stringify(Result.error(-1, JSON.stringify(err))) ?? ''); - } - } - - static disable() : void { - try { - sensor.off(sensor.SensorId.ACCELEROMETER); - } catch (err) { - log.error('Accelerometer off fail, err: %{public}s', JSON.stringify(Result.error(-1, JSON.stringify(err))) ?? ''); - } - } -} diff --git a/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ts b/samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ets similarity index 100% rename from samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ts rename to samples/js-tests/project/proj.ohos/libSysCapabilities/src/main/ets/utils/StringUtils.ets

wN9{)}9qO=xNBedA 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