Version in base suite: 21.0.11+10-1~deb13u2
Base version: openjdk-21_21.0.11+10-1~deb13u2
Target version: openjdk-21_21.0.12+8-1~deb13u1
Base file: /srv/ftp-master.debian.org/ftp/pool/main/o/openjdk-21/openjdk-21_21.0.11+10-1~deb13u2.dsc
Target file: /srv/ftp-master.debian.org/policy/pool/main/o/openjdk-21/openjdk-21_21.0.12+8-1~deb13u1.dsc
.jcheck/conf | 2
debian/JB-jre-headless.overrides.in | 1
debian/JB-jre-zero.overrides.in | 1
debian/changelog | 48
debian/control | 2
debian/control.in | 2
debian/copyright | 55
debian/patches/jdk-8387580.diff | 36
debian/patches/series | 1
debian/rules | 17
debian/tests/problems.csv | 96
doc/building.html | 2
doc/building.md | 2
make/Global.gmk | 1
make/InitSupport.gmk | 2
make/Main.gmk | 16
make/MainSupport.gmk | 9
make/RunTests.gmk | 3
make/autoconf/basic_tools.m4 | 4
make/autoconf/toolchain.m4 | 6
make/autoconf/toolchain_microsoft.m4 | 17
make/autoconf/util.m4 | 64
make/common/FindTests.gmk | 4
make/conf/github-actions.conf | 16
make/conf/jib-profiles.js | 39
make/conf/version-numbers.conf | 4
src/hotspot/cpu/arm/arm_32.ad | 32
src/hotspot/cpu/arm/assembler_arm_32.hpp | 2
src/hotspot/cpu/arm/c1_CodeStubs_arm.cpp | 2
src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp | 18
src/hotspot/cpu/arm/interp_masm_arm.cpp | 4
src/hotspot/cpu/arm/register_arm.cpp | 30
src/hotspot/cpu/arm/register_arm.hpp | 560
src/hotspot/cpu/arm/sharedRuntime_arm.cpp | 10
src/hotspot/cpu/arm/vmreg_arm.cpp | 4
src/hotspot/cpu/arm/vmreg_arm.hpp | 8
src/hotspot/cpu/arm/vmreg_arm.inline.hpp | 8
src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp | 4
src/hotspot/cpu/ppc/macroAssembler_ppc.cpp | 4
src/hotspot/cpu/ppc/registerMap_ppc.cpp | 46
src/hotspot/cpu/ppc/registerMap_ppc.hpp | 8
src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp | 24
src/hotspot/cpu/ppc/vm_version_ppc.cpp | 3
src/hotspot/cpu/riscv/gc/shenandoah/shenandoahBarrierSetAssembler_riscv.cpp | 2
src/hotspot/os/aix/os_aix.cpp | 25
src/hotspot/os/aix/os_aix.hpp | 8
src/hotspot/os/bsd/os_bsd.cpp | 38
src/hotspot/os/bsd/os_bsd.hpp | 8
src/hotspot/os/linux/cgroupSubsystem_linux.cpp | 25
src/hotspot/os/linux/cgroupSubsystem_linux.hpp | 19
src/hotspot/os/linux/cgroupUtil_linux.cpp | 2
src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp | 15
src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp | 37
src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp | 57
src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp | 34
src/hotspot/os/linux/osContainer_linux.cpp | 12
src/hotspot/os/linux/osContainer_linux.hpp | 5
src/hotspot/os/linux/os_linux.cpp | 75
src/hotspot/os/linux/os_linux.hpp | 8
src/hotspot/os/posix/os_posix.cpp | 90
src/hotspot/os/posix/perfMemory_posix.cpp | 5
src/hotspot/os/windows/os_windows.cpp | 113
src/hotspot/os/windows/os_windows.hpp | 30
src/hotspot/os_cpu/linux_arm/macroAssembler_linux_arm_32.cpp | 6
src/hotspot/share/compiler/compileBroker.cpp | 4
src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 89
src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 11
src/hotspot/share/gc/shared/gcInitLogger.cpp | 4
src/hotspot/share/gc/shared/gc_globals.hpp | 2
src/hotspot/share/gc/x/xLargePages.cpp | 3
src/hotspot/share/gc/z/zLargePages.cpp | 3
src/hotspot/share/jfr/jni/jfrJniMethod.cpp | 4
src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp | 23
src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.hpp | 3
src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp | 28
src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp | 1
src/hotspot/share/jfr/periodic/jfrPeriodic.cpp | 7
src/hotspot/share/jfr/recorder/jfrRecorder.cpp | 4
src/hotspot/share/prims/jvmtiAgentList.cpp | 5
src/hotspot/share/prims/jvmtiClassFileReconstituter.cpp | 5
src/hotspot/share/prims/jvmtiEnv.cpp | 22
src/hotspot/share/prims/jvmtiRedefineClasses.cpp | 20
src/hotspot/share/prims/whitebox.cpp | 4
src/hotspot/share/runtime/abstract_vm_version.cpp | 2
src/hotspot/share/runtime/arguments.cpp | 7
src/hotspot/share/runtime/os.cpp | 21
src/hotspot/share/runtime/os.hpp | 8
src/hotspot/share/runtime/thread.cpp | 2
src/hotspot/share/runtime/threadSMR.cpp | 7
src/hotspot/share/runtime/threads.cpp | 8
src/hotspot/share/services/management.cpp | 5
src/hotspot/share/services/threadIdTable.cpp | 25
src/hotspot/share/services/threadIdTable.hpp | 7
src/hotspot/share/utilities/globalDefinitions.hpp | 6
src/hotspot/share/utilities/vmError.cpp | 4
src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java | 31
src/java.base/share/classes/java/net/InetAddress.java | 6
src/java.base/share/classes/java/net/doc-files/net-properties.html | 10
src/java.base/share/classes/java/security/KeyStore.java | 16
src/java.base/share/classes/java/util/jar/JarVerifier.java | 6
src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java | 30
src/java.base/share/classes/sun/net/www/protocol/https/AbstractDelegateHttpsURLConnection.java | 115
src/java.base/share/classes/sun/net/www/protocol/https/HttpsClient.java | 80
src/java.base/share/classes/sun/security/pkcs/SignerInfo.java | 23
src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java | 89
src/java.base/share/classes/sun/security/ssl/Alert.java | 48
src/java.base/share/classes/sun/security/ssl/HelloCookieManager.java | 24
src/java.base/share/classes/sun/security/timestamp/TSResponse.java | 9
src/java.base/share/classes/sun/security/util/DerValue.java | 15
src/java.base/share/classes/sun/security/util/HostnameChecker.java | 4
src/java.base/share/classes/sun/security/util/SecurityProperties.java | 32
src/java.base/share/classes/sun/security/util/SignatureFileVerifier.java | 15
src/java.base/share/classes/sun/security/x509/DNSName.java | 10
src/java.base/share/conf/security/java.security | 16
src/java.base/share/data/cacerts/wisekeyglobalrootgbca | 29
src/java.base/share/data/cacerts/wisekeyglobalrootgcca | 22
src/java.base/share/data/lsrdata/language-subtag-registry.txt | 61
src/java.base/share/data/publicsuffixlist/VERSION | 4
src/java.base/share/data/publicsuffixlist/public_suffix_list.dat | 4105 ++--
src/java.base/share/data/tzdata/VERSION | 2
src/java.base/share/data/tzdata/northamerica | 56
src/java.base/share/legal/public_suffix.md | 2
src/java.base/share/native/libjli/java.c | 7
src/java.base/unix/native/libnet/net_util_md.c | 2
src/java.base/windows/native/libnet/net_util_md.c | 2
src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java | 22
src/java.desktop/macosx/native/libawt_lwawt/awt/CDesktopPeer.m | 5
src/java.desktop/macosx/native/libawt_lwawt/awt/CPrinterJob.m | 6
src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.h | 6
src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.m | 11
src/java.desktop/macosx/native/libawt_lwawt/awt/a11y/NavigableTextAccessibility.h | 3
src/java.desktop/macosx/native/libawt_lwawt/awt/a11y/NavigableTextAccessibility.m | 27
src/java.desktop/macosx/native/libawt_lwawt/awt/a11y/SpinboxAccessibility.m | 27
src/java.desktop/share/classes/com/sun/java/swing/SwingUtilities3.java | 10
src/java.desktop/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java | 6
src/java.desktop/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java | 3
src/java.desktop/share/classes/javax/swing/plaf/synth/SynthGraphicsUtils.java | 14
src/java.desktop/share/classes/javax/swing/text/DefaultCaret.java | 23
src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java | 334
src/java.desktop/share/legal/freetype.md | 42
src/java.desktop/share/legal/giflib.md | 2
src/java.desktop/share/legal/harfbuzz.md | 4
src/java.desktop/share/legal/lcms.md | 5
src/java.desktop/share/legal/libpng.md | 2
src/java.desktop/share/native/libawt/awt/medialib/awt_ImagingLib.c | 39
src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/freetype.h | 4
src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h | 4
src/java.desktop/share/native/libfreetype/include/freetype/tttables.h | 2
src/java.desktop/share/native/libfreetype/include/freetype/tttags.h | 2
src/java.desktop/share/native/libfreetype/include/ft2build.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afblue.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin | 2
src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat | 2
src/java.desktop/share/native/libfreetype/src/autofit/afblue.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin | 2
src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afcover.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afhints.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afhints.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afindic.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afindic.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afloader.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afloader.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afranges.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afranges.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afscript.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h | 2
src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c | 2
src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h | 2
src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftbase.h | 2
src/java.desktop/share/native/libfreetype/src/base/ftbbox.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftcalc.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftcid.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftcolor.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftdebug.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftfstype.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftgasp.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftglyph.c | 8
src/java.desktop/share/native/libfreetype/src/base/ftinit.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftmac.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftmm.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftobjs.c | 43
src/java.desktop/share/native/libfreetype/src/base/ftoutln.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftpatent.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftrfork.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftsnames.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftstream.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftstroke.c | 11
src/java.desktop/share/native/libfreetype/src/base/ftsynth.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftsystem.c | 2
src/java.desktop/share/native/libfreetype/src/base/fttrigon.c | 2
src/java.desktop/share/native/libfreetype/src/base/fttype1.c | 2
src/java.desktop/share/native/libfreetype/src/base/ftutil.c | 2
src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c | 2
src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h | 2
src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c | 2
src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h | 2
src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h | 2
src/java.desktop/share/native/libfreetype/src/cff/cffgload.c | 2
src/java.desktop/share/native/libfreetype/src/cff/cffgload.h | 2
src/java.desktop/share/native/libfreetype/src/cff/cffload.c | 2
src/java.desktop/share/native/libfreetype/src/cff/cffload.h | 2
src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c | 4
src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h | 4
src/java.desktop/share/native/libfreetype/src/cff/cffparse.c | 2
src/java.desktop/share/native/libfreetype/src/cff/cffparse.h | 2
src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h | 2
src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h | 2
src/java.desktop/share/native/libfreetype/src/cid/cidgload.c | 33
src/java.desktop/share/native/libfreetype/src/cid/cidgload.h | 2
src/java.desktop/share/native/libfreetype/src/cid/cidload.c | 2
src/java.desktop/share/native/libfreetype/src/cid/cidload.h | 2
src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c | 2
src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h | 2
src/java.desktop/share/native/libfreetype/src/cid/cidparse.c | 2
src/java.desktop/share/native/libfreetype/src/cid/cidparse.h | 2
src/java.desktop/share/native/libfreetype/src/cid/cidriver.c | 2
src/java.desktop/share/native/libfreetype/src/cid/cidriver.h | 2
src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c | 2
src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c | 2
src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c | 2
src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/psconv.c | 2
src/java.desktop/share/native/libfreetype/src/psaux/psconv.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c | 2
src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c | 2
src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h | 2
src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c | 39
src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c | 2
src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h | 2
src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c | 2
src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h | 2
src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h | 2
src/java.desktop/share/native/libfreetype/src/psnames/pstables.h | 2
src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h | 2
src/java.desktop/share/native/libfreetype/src/raster/ftraster.c | 54
src/java.desktop/share/native/libfreetype/src/raster/ftraster.h | 2
src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c | 2
src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h | 2
src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c | 43
src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h | 2
src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c | 2
src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h | 2
src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c | 2
src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h | 2
src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h | 2
src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c | 2
src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h | 2
src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c | 14
src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c | 26
src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c | 2
src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1afm.c | 2
src/java.desktop/share/native/libfreetype/src/type1/t1afm.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1driver.c | 2
src/java.desktop/share/native/libfreetype/src/type1/t1driver.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1errors.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1gload.c | 2
src/java.desktop/share/native/libfreetype/src/type1/t1gload.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1load.c | 2
src/java.desktop/share/native/libfreetype/src/type1/t1load.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1objs.c | 2
src/java.desktop/share/native/libfreetype/src/type1/t1objs.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1parse.c | 2
src/java.desktop/share/native/libfreetype/src/type1/t1parse.h | 2
src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h | 2
src/java.desktop/share/native/libharfbuzz/OT/Color/COLR/COLR.hh | 17
src/java.desktop/share/native/libharfbuzz/OT/Color/CPAL/CPAL.hh | 2
src/java.desktop/share/native/libharfbuzz/OT/Color/sbix/sbix.hh | 2
src/java.desktop/share/native/libharfbuzz/OT/Color/svg/svg.hh | 684
src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh | 4
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh | 22
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairSet.hh | 6
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat1.hh | 2
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat2.hh | 2
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh | 2
src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc | 68
src/java.desktop/share/native/libharfbuzz/OT/glyf/CompositeGlyph.hh | 2
src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh | 28
src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh | 1
src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh | 4
src/java.desktop/share/native/libharfbuzz/OT/name/name.hh | 2
src/java.desktop/share/native/libharfbuzz/graph/classdef-graph.hh | 6
src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh | 6
src/java.desktop/share/native/libharfbuzz/graph/graph.hh | 22
src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh | 8
src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh | 9
src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh | 5
src/java.desktop/share/native/libharfbuzz/graph/serialize.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh | 17
src/java.desktop/share/native/libharfbuzz/hb-algs.hh | 227
src/java.desktop/share/native/libharfbuzz/hb-array.hh | 44
src/java.desktop/share/native/libharfbuzz/hb-atomic.hh | 3
src/java.desktop/share/native/libharfbuzz/hb-bimap.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh | 9
src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh | 28
src/java.desktop/share/native/libharfbuzz/hb-blob.cc | 128
src/java.desktop/share/native/libharfbuzz/hb-blob.hh | 158
src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc | 44
src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc | 31
src/java.desktop/share/native/libharfbuzz/hb-buffer.cc | 58
src/java.desktop/share/native/libharfbuzz/hb-buffer.h | 14
src/java.desktop/share/native/libharfbuzz/hb-buffer.hh | 39
src/java.desktop/share/native/libharfbuzz/hb-cff-interp-common.hh | 41
src/java.desktop/share/native/libharfbuzz/hb-cff2-interp-cs.hh | 11
src/java.desktop/share/native/libharfbuzz/hb-config.hh | 27
src/java.desktop/share/native/libharfbuzz/hb-cplusplus.hh | 66
src/java.desktop/share/native/libharfbuzz/hb-draw.cc | 278
src/java.desktop/share/native/libharfbuzz/hb-draw.h | 52
src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc | 6
src/java.desktop/share/native/libharfbuzz/hb-font.cc | 41
src/java.desktop/share/native/libharfbuzz/hb-font.hh | 26
src/java.desktop/share/native/libharfbuzz/hb-ft.cc | 20
src/java.desktop/share/native/libharfbuzz/hb-geometry.hh | 52
src/java.desktop/share/native/libharfbuzz/hb-limits.hh | 29
src/java.desktop/share/native/libharfbuzz/hb-machinery.hh | 4
src/java.desktop/share/native/libharfbuzz/hb-map.hh | 6
src/java.desktop/share/native/libharfbuzz/hb-number.cc | 7
src/java.desktop/share/native/libharfbuzz/hb-object.hh | 17
src/java.desktop/share/native/libharfbuzz/hb-open-type.hh | 39
src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh | 6
src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.cc | 7
src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh | 12
src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc | 7
src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.hh | 4
src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh | 170
src/java.desktop/share/native/libharfbuzz/hb-ot-color.cc | 68
src/java.desktop/share/native/libharfbuzz/hb-ot-color.h | 14
src/java.desktop/share/native/libharfbuzz/hb-ot-face-table-list.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc | 20
src/java.desktop/share/native/libharfbuzz/hb-ot-hdmx-table.hh | 4
src/java.desktop/share/native/libharfbuzz/hb-ot-kern-table.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh | 41
src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh | 70
src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc | 12
src/java.desktop/share/native/libharfbuzz/hb-ot-os2-table.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-ot-post-table.hh | 14
src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc | 6
src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc | 24
src/java.desktop/share/native/libharfbuzz/hb-ot-shape.h | 15
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-pua.hh | 138
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh | 267
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc | 48
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc | 4
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc | 484
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc | 12
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh | 1052 -
src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc | 2
src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh | 1278 -
src/java.desktop/share/native/libharfbuzz/hb-ot-tag.cc | 153
src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh | 52
src/java.desktop/share/native/libharfbuzz/hb-ot-var-gvar-table.hh | 111
src/java.desktop/share/native/libharfbuzz/hb-ot-var-hvar-table.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-outline.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-paint.cc | 420
src/java.desktop/share/native/libharfbuzz/hb-paint.h | 254
src/java.desktop/share/native/libharfbuzz/hb-paint.hh | 28
src/java.desktop/share/native/libharfbuzz/hb-priority-queue.hh | 2
src/java.desktop/share/native/libharfbuzz/hb-repacker.hh | 7
src/java.desktop/share/native/libharfbuzz/hb-static.cc | 7
src/java.desktop/share/native/libharfbuzz/hb-subset-cff-common.cc | 8
src/java.desktop/share/native/libharfbuzz/hb-subset-cff-common.hh | 26
src/java.desktop/share/native/libharfbuzz/hb-subset-cff1.cc | 6
src/java.desktop/share/native/libharfbuzz/hb-subset-cff2.cc | 596
src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.cc | 35
src/java.desktop/share/native/libharfbuzz/hb-subset.h | 16
src/java.desktop/share/native/libharfbuzz/hb-ucd-table.hh | 8503 +++++-----
src/java.desktop/share/native/libharfbuzz/hb-unicode-emoji-table.hh | 61
src/java.desktop/share/native/libharfbuzz/hb-unicode.cc | 12
src/java.desktop/share/native/libharfbuzz/hb-vector.hh | 69
src/java.desktop/share/native/libharfbuzz/hb-version.h | 8
src/java.desktop/share/native/libharfbuzz/hb-zlib.hh | 37
src/java.desktop/share/native/libharfbuzz/hb.hh | 10
src/java.desktop/share/native/libjavajpeg/imageioJPEG.c | 395
src/java.desktop/share/native/liblcms/cmsalpha.c | 4
src/java.desktop/share/native/liblcms/cmscam02.c | 41
src/java.desktop/share/native/liblcms/cmscgats.c | 55
src/java.desktop/share/native/liblcms/cmscnvrt.c | 2
src/java.desktop/share/native/liblcms/cmserr.c | 57
src/java.desktop/share/native/liblcms/cmsgamma.c | 3
src/java.desktop/share/native/liblcms/cmsgmt.c | 2
src/java.desktop/share/native/liblcms/cmshalf.c | 2
src/java.desktop/share/native/liblcms/cmsintrp.c | 10
src/java.desktop/share/native/liblcms/cmsio0.c | 257
src/java.desktop/share/native/liblcms/cmsio1.c | 10
src/java.desktop/share/native/liblcms/cmslut.c | 13
src/java.desktop/share/native/liblcms/cmsmd5.c | 2
src/java.desktop/share/native/liblcms/cmsmtrx.c | 2
src/java.desktop/share/native/liblcms/cmsnamed.c | 32
src/java.desktop/share/native/liblcms/cmsopt.c | 28
src/java.desktop/share/native/liblcms/cmspack.c | 2
src/java.desktop/share/native/liblcms/cmspcs.c | 2
src/java.desktop/share/native/liblcms/cmsplugin.c | 4
src/java.desktop/share/native/liblcms/cmsps2.c | 38
src/java.desktop/share/native/liblcms/cmssamp.c | 61
src/java.desktop/share/native/liblcms/cmssm.c | 2
src/java.desktop/share/native/liblcms/cmstypes.c | 54
src/java.desktop/share/native/liblcms/cmsvirt.c | 59
src/java.desktop/share/native/liblcms/cmswtpnt.c | 2
src/java.desktop/share/native/liblcms/cmsxform.c | 42
src/java.desktop/share/native/liblcms/lcms2.h | 40
src/java.desktop/share/native/liblcms/lcms2_internal.h | 3
src/java.desktop/share/native/liblcms/lcms2_plugin.h | 2
src/java.desktop/unix/native/common/java2d/opengl/GLXSurfaceData.c | 100
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java | 17
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java | 44
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuBarUI.java | 19
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java | 57
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java | 20
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java | 17
src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java | 8
src/java.desktop/windows/native/libawt/windows/awt_Desktop.cpp | 4
src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStoreImpl.java | 45
src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/ToStream.java | 6
src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java | 2
src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java | 15
src/jdk.httpserver/share/classes/sun/net/httpserver/simpleserver/FileServerHandler.java | 22
src/jdk.internal.le/share/classes/jdk/internal/org/jline/reader/LineReader.java | 7
src/jdk.internal.le/share/classes/jdk/internal/org/jline/reader/UserInterruptException.java | 5
src/jdk.internal.le/share/classes/jdk/internal/org/jline/reader/impl/DefaultHighlighter.java | 8
src/jdk.internal.le/share/classes/jdk/internal/org/jline/reader/impl/LineReaderImpl.java | 15
src/jdk.internal.le/share/classes/jdk/internal/org/jline/reader/impl/completer/SystemCompleter.java | 9
src/jdk.internal.le/share/classes/jdk/internal/org/jline/reader/impl/history/DefaultHistory.java | 2
src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/TerminalBuilder.java | 44
src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/AbstractPosixTerminal.java | 9
src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/AbstractTerminal.java | 8
src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java | 85
src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/exec/ExecPty.java | 2
src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/exec/ExecTerminalProvider.java | 3
src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/Display.java | 6
src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/InputStreamReader.java | 3
src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/Status.java | 8
src/jdk.internal.le/share/legal/jline.md | 2
src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java | 2
src/jdk.jfr/share/classes/jdk/jfr/internal/SettingsManager.java | 2
src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ParserFactory.java | 9
src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java | 3
src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties | 1
src/jdk.jshell/share/classes/jdk/jshell/CompletenessAnalyzer.java | 2
src/jdk.jshell/share/classes/jdk/jshell/SnippetEvent.java | 8
src/jdk.jshell/share/classes/jdk/jshell/execution/impl/ConsoleImpl.java | 6
src/jdk.management.jfr/share/classes/jdk/management/jfr/RemoteRecordingStream.java | 14
test/docs/ProblemList.txt | 41
test/docs/TEST.ROOT | 51
test/docs/TEST.groups | 29
test/docs/jdk/javadoc/TestDocs.java | 44
test/docs/tools/tester/DocTester.java | 47
test/hotspot/jtreg/ProblemList.txt | 2
test/hotspot/jtreg/compiler/c2/TestBit.java | 2
test/hotspot/jtreg/compiler/c2/TestMinMaxSubword.java | 1
test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeIntIdealizationTests.java | 4
test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeLongIdealizationTests.java | 4
test/hotspot/jtreg/compiler/c2/irTests/TestMulNodeIdealization.java | 3
test/hotspot/jtreg/compiler/c2/irTests/TestShiftAndMask.java | 1
test/hotspot/jtreg/compiler/codecache/stress/UnexpectedDeoptimizationTest.java | 12
test/hotspot/jtreg/compiler/intrinsics/sha/cli/DigestOptionsBase.java | 4
test/hotspot/jtreg/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java | 3
test/hotspot/jtreg/compiler/lib/compile_framework/Compile.java | 14
test/hotspot/jtreg/compiler/lib/compile_framework/CompileFramework.java | 7
test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java | 3
test/hotspot/jtreg/compiler/loopopts/superword/MinMaxRed_Int.java | 1
test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java | 6
test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java | 8
test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java | 1
test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java | 44
test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java | 20
test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java | 9
test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java | 5
test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java | 3
test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment.java | 821
test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java | 6
test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java | 5
test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java | 1
test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java | 1
test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java | 5
test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java | 12
test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java | 2
test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java | 33
test/hotspot/jtreg/compiler/vectorapi/Test8278948.java | 3
test/hotspot/jtreg/compiler/vectorapi/TestVectorCompressExpandBits.java | 1
test/hotspot/jtreg/compiler/vectorapi/TestVectorReallocation.java | 414
test/hotspot/jtreg/compiler/vectorization/TestAutoVecIntMinMax.java | 1
test/hotspot/jtreg/compiler/vectorization/TestEor3AArch64.java | 1
test/hotspot/jtreg/compiler/vectorization/TestMacroLogicVector.java | 3
test/hotspot/jtreg/compiler/vectorization/TestVectorZeroCount.java | 12
test/hotspot/jtreg/containers/docker/DockerBasicTest.java | 4
test/hotspot/jtreg/containers/docker/EventGeneratorLoop.java | 13
test/hotspot/jtreg/containers/docker/ShareTmpDir.java | 4
test/hotspot/jtreg/containers/docker/TestCPUAwareness.java | 4
test/hotspot/jtreg/containers/docker/TestJcmd.java | 8
test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java | 69
test/hotspot/jtreg/containers/docker/TestLimitsUpdating.java | 4
test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java | 4
test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java | 74
test/hotspot/jtreg/containers/docker/TestMisc.java | 56
test/hotspot/jtreg/containers/docker/TestPids.java | 4
test/hotspot/jtreg/gc/TestUseGCOverheadLimit.java | 97
test/hotspot/jtreg/gc/arguments/TestParallelRefProc.java | 85
test/hotspot/jtreg/gc/arguments/TestSelectDefaultGC.java | 4
test/hotspot/jtreg/gc/g1/TestEagerReclaimHumongousRegionsClearMarkBits.java | 127
test/hotspot/jtreg/gc/shenandoah/compiler/TestLinkToNativeRBP.java | 5
test/hotspot/jtreg/gc/stress/TestReclaimStringsLeaksMemory.java | 55
test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java | 2
test/hotspot/jtreg/runtime/ErrorHandling/CreateCoredumpOnCrash.java | 59
test/hotspot/jtreg/runtime/ErrorHandling/StackWalkNativeToJava.java | 2
test/hotspot/jtreg/runtime/ErrorHandling/TestCrashOnOutOfMemoryError.java | 6
test/hotspot/jtreg/runtime/Metaspace/DefineClass.java | 2
test/hotspot/jtreg/runtime/Monitor/MonitorWithDeadObjectTest.java | 7
test/hotspot/jtreg/runtime/NMT/CommandLineDetail.java | 21
test/hotspot/jtreg/runtime/NMT/CommandLineSummary.java | 21
test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java | 41
test/hotspot/jtreg/runtime/Thread/AsyncExceptionTest.java | 60
test/hotspot/jtreg/runtime/cds/appcds/SignedJar.java | 4
test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/InternSharedString.java | 4
test/hotspot/jtreg/runtime/os/AvailableProcessors.java | 49
test/hotspot/jtreg/runtime/vthread/RedefineClass.java | 2
test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java | 103
test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/libEarlyDynamicLoad.cpp | 59
test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/ClassVersionAfterRedefine.java | 2
test/hotspot/jtreg/serviceability/threads/ThreadInfoTest.java | 187
test/hotspot/jtreg/testlibrary_tests/compile_framework/examples/IRFrameworkWithVectorAPIExample.java | 90
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TestDescription.java | 8
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/attach020Target.java | 6
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TestDescription.java | 6
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/attach021Target.java | 6
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TestDescription.java | 6
test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/attach022Target.java | 6
test/hotspot/jtreg/vmTestbase/nsk/jvmti/ClearFieldAccessWatch/clrfldw001.java | 8
test/hotspot/jtreg/vmTestbase/nsk/jvmti/ClearFieldModificationWatch/clrfmodw001.java | 8
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001/TestDescription.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart001.java | 11
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart001/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart001/TestDescription.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart002.java | 11
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart002/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart002/TestDescription.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001.java | 8
test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001.java | 8
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP12/ap12t001.java | 10
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP12/ap12t001/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP12/ap12t001/TestDescription.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001.java | 6
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001/tc03t001.cpp | 64
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002.java | 7
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002/tc03t002.cpp | 65
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC05/tc05t001/tc05t001.cpp | 2
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002/TestDescription.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006.java | 5
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006/TEST.properties | 24
test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006/TestDescription.java | 5
test/hotspot/jtreg/vmTestbase/vm/mlvm/meth/stress/jni/nativeAndMH/Test.java | 25
test/hotspot/jtreg/vmTestbase/vm/runtime/defmeth/StressTest.java | 23
test/jaxp/javax/xml/jaxp/functional/javax/xml/transform/xmlfiles/lexical.xml | 24
test/jaxp/javax/xml/jaxp/functional/javax/xml/transform/xmlfiles/out/doctypeGF.out | 21
test/jaxp/javax/xml/jaxp/functional/javax/xml/transform/xmlfiles/publish2.xml | 23
test/jaxp/javax/xml/jaxp/functional/org/xml/sax/xmlfiles/out/DTDHandlerGF.out | 2
test/jaxp/javax/xml/jaxp/unittest/transform/JDK8207760.java | 125
test/jaxp/javax/xml/jaxp/unittest/validation/CR6740048.java | 10
test/jdk/ProblemList.txt | 21
test/jdk/TEST.groups | 1
test/jdk/com/sun/java/swing/SwingUtilities3/ApplyInsetsTest.java | 65
test/jdk/com/sun/java/swing/plaf/gtk/4928019/bug4928019.java | 20
test/jdk/com/sun/java/swing/plaf/gtk/Test6635110.java | 36
test/jdk/com/sun/java/swing/plaf/gtk/Test6963870.java | 30
test/jdk/com/sun/java/swing/plaf/windows/MenuItem/MenuItemAcceleratorColor.java | 193
test/jdk/com/sun/net/httpserver/SANTest.java | 7
test/jdk/com/sun/net/httpserver/SelCacheTest.java | 4
test/jdk/com/sun/net/httpserver/ServerStopTerminationTest.java | 31
test/jdk/com/sun/net/httpserver/Test1.java | 5
test/jdk/com/sun/net/httpserver/Test12.java | 5
test/jdk/com/sun/net/httpserver/Test13.java | 5
test/jdk/com/sun/net/httpserver/Test6a.java | 4
test/jdk/com/sun/net/httpserver/Test7a.java | 2
test/jdk/com/sun/net/httpserver/Test8a.java | 4
test/jdk/com/sun/net/httpserver/Test9.java | 18
test/jdk/com/sun/net/httpserver/Test9a.java | 9
test/jdk/com/sun/net/httpserver/bugs/HandlerConnectionClose.java | 6
test/jdk/com/sun/net/httpserver/simpleserver/CustomFileSystemTest.java | 106
test/jdk/com/sun/net/httpserver/simpleserver/HttpsServerTest.java | 14
test/jdk/com/sun/net/httpserver/simpleserver/SimpleFileServerTest.java | 134
test/jdk/com/sun/net/httpserver/simpleserver/jwebserver/MaxRequestTimeTest.java | 8
test/jdk/com/sun/nio/sctp/SctpChannel/CloseDescriptors.java | 1
test/jdk/java/awt/Checkbox/AppearanceIfLargeFont.java | 84
test/jdk/java/awt/Checkbox/CheckboxMenuItemEventsTest.java | 120
test/jdk/java/awt/Choice/ChoiceMouseWheelTest/ChoiceMouseWheelTest.java | 176
test/jdk/java/awt/Choice/PaintArtefacts.java | 122
test/jdk/java/awt/Choice/PopupPosTest/PopupPosTest.java | 4
test/jdk/java/awt/Choice/SelectBetweenPressRelease.java | 146
test/jdk/java/awt/Container/ActivateOnFocusTest.java | 141
test/jdk/java/awt/Container/MouseEnteredTest.java | 244
test/jdk/java/awt/Container/ValidateTest.java | 78
test/jdk/java/awt/Dialog/ClosingParentTest.java | 100
test/jdk/java/awt/Dialog/DefaultIconTest.java | 71
test/jdk/java/awt/Dialog/DialogDisposeLeak.java | 200
test/jdk/java/awt/Dialog/DialogInitialResizability.java | 96
test/jdk/java/awt/Dialog/FileDialogEmptyTitleTest.java | 59
test/jdk/java/awt/Dialog/FileDialogTest.java | 189
test/jdk/java/awt/Dialog/FileDialogUIUpdate.java | 83
test/jdk/java/awt/Dialog/MenuAndModalDialogTest.java | 104
test/jdk/java/awt/Dialog/ModalExcludedTest.java | 315
test/jdk/java/awt/Dialog/NestedDialogTest.java | 312
test/jdk/java/awt/Dialog/ShownModalDialogSerializationTest.java | 92
test/jdk/java/awt/Dialog/TaskbarIconTest.java | 145
test/jdk/java/awt/Dialog/WindowInputBlock.java | 134
test/jdk/java/awt/Focus/ClearLwQueueBreakTest/ClearLwQueueBreakTest.java | 5
test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest1.java | 37
test/jdk/java/awt/Focus/KeyStrokeTest.java | 79
test/jdk/java/awt/Frame/DisposeTest.java | 7
test/jdk/java/awt/Frame/FrameSetMinimumSizeTest.java | 85
test/jdk/java/awt/Frame/FrameVisualTest.java | 73
test/jdk/java/awt/Frame/MultiScreenTest.java | 639
test/jdk/java/awt/FullScreen/DisplayModeNoRefreshTest.java | 115
test/jdk/java/awt/Graphics2D/CopyAreaOOB.java | 154
test/jdk/java/awt/GraphicsDevice/CheckDisplayModes.java | 16
test/jdk/java/awt/KeyboardFocusmanager/ConsumeNextMnemonicKeyTypedTest/ConsumeNextMnemonicKeyTypedTest.java | 4
test/jdk/java/awt/KeyboardFocusmanager/TypeAhead/ButtonActionKeyTest/ButtonActionKeyTest.java | 19
test/jdk/java/awt/LightweightComponent/LightWeightTabFocus/LightWeightTabFocus.java | 3
test/jdk/java/awt/MenuBar/8007006/bug8007006.java | 134
test/jdk/java/awt/Modal/PrintDialogsTest/PrintDialogsTest.html | 44
test/jdk/java/awt/Modal/PrintDialogsTest/PrintDialogsTest.java | 88
test/jdk/java/awt/Modal/PrintDialogsTest/Test.java | 1
test/jdk/java/awt/Modal/ToFront/DialogToFrontModeless1Test.java | 17
test/jdk/java/awt/Mouse/EnterExitEvents/DragWindowTest.java | 113
test/jdk/java/awt/PopupMenu/PopupMenuVisuals.java | 24
test/jdk/java/awt/PrintJob/TestPrintNoException.java | 61
test/jdk/java/awt/SplashScreen/MultiResolutionSplash/MultiResolutionSplashTest.java | 185
test/jdk/java/awt/TextArea/PrintTextTest.java | 98
test/jdk/java/awt/TextArea/ScrollBarArrowScrollTest.java | 65
test/jdk/java/awt/TextArea/TextAreaAppendScrollTest.java | 98
test/jdk/java/awt/TextArea/TextAreaAppendScrollTest2.java | 68
test/jdk/java/awt/TextArea/TextAreaAppendTest.java | 68
test/jdk/java/awt/TextArea/TextAreaCRLFAutoDetectManualTest.java | 106
test/jdk/java/awt/TextArea/TextAreaCursorTest.java | 86
test/jdk/java/awt/TextArea/TextAreaHScrollbarTest.java | 60
test/jdk/java/awt/TextArea/TextAreaKeypadTest.java | 62
test/jdk/java/awt/TextArea/TextAreaLimit.java | 70
test/jdk/java/awt/TextArea/TextAreaLineScrollWrapTest.java | 65
test/jdk/java/awt/TextArea/TextAreaScrollbarTest.java | 116
test/jdk/java/awt/TextArea/TextAreaSelectionTest.java | 111
test/jdk/java/awt/TextArea/TextScrollTest.java | 69
test/jdk/java/awt/TextArea/WordWrappingTest.java | 66
test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java | 4
test/jdk/java/awt/font/BoldItalicFontTest.java | 73
test/jdk/java/awt/font/GlyphVector/TestGlyphVectorLayout.java | 121
test/jdk/java/awt/font/GlyphVector/TestSetGlyphPositions.java | 96
test/jdk/java/awt/font/Rotate/RotateTest1.java | 97
test/jdk/java/awt/font/TestDevanagari.java | 101
test/jdk/java/awt/font/TestGraphicPlacement.java | 199
test/jdk/java/awt/font/TextLayout/RotFontBoundsTest.java | 257
test/jdk/java/awt/font/TextLayout/TestControls.java | 161
test/jdk/java/awt/font/TextLayout/TestGraphicOutline.java | 155
test/jdk/java/awt/image/VolatileImage/DrawBufImgOp.java | 484
test/jdk/java/awt/print/PrinterJob/ImagePrinting/BitmaskImage.java | 142
test/jdk/java/awt/print/PrinterJob/PageDialogTest.java | 11
test/jdk/java/awt/print/PrinterJob/PageRanges.java | 63
test/jdk/java/awt/print/PrinterJob/PageRangesAuto.java | 199
test/jdk/java/awt/print/PrinterJob/PolylinePrintingTest.java | 179
test/jdk/java/awt/print/PrinterJob/SwingUIText.java | 218
test/jdk/java/io/FileDescriptor/Sharing.java | 76
test/jdk/java/io/FileInputStream/LeadingSlash.java | 21
test/jdk/java/io/Serializable/records/AbsentStreamValuesTest.java | 50
test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java | 28
test/jdk/java/io/Serializable/records/BadValues.java | 17
test/jdk/java/io/Serializable/records/BasicRecordSer.java | 58
test/jdk/java/io/Serializable/records/ConstructorAccessTest.java | 21
test/jdk/java/io/Serializable/records/CycleTest.java | 35
test/jdk/java/io/Serializable/records/DifferentStreamFieldsTest.java | 97
test/jdk/java/io/Serializable/records/ProhibitedMethods.java | 45
test/jdk/java/io/Serializable/records/ReadResolveTest.java | 24
test/jdk/java/io/Serializable/records/RecordClassTest.java | 38
test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java | 30
test/jdk/java/io/Serializable/records/SerialVersionUIDTest.java | 39
test/jdk/java/io/Serializable/records/StreamRefTest.java | 23
test/jdk/java/io/Serializable/records/ThrowingConstructorTest.java | 35
test/jdk/java/io/Serializable/records/UnsharedTest.java | 29
test/jdk/java/io/Serializable/records/WriteReplaceTest.java | 26
test/jdk/java/io/Serializable/records/migration/AbstractTest.java | 9
test/jdk/java/io/Serializable/records/migration/AssignableFromTest.java | 25
test/jdk/java/io/Serializable/records/migration/DefaultValuesTest.java | 23
test/jdk/java/io/Serializable/records/migration/SuperStreamFieldsTest.java | 34
test/jdk/java/io/pathNames/GeneralSolaris.java | 7
test/jdk/java/io/pathNames/GeneralWin32.java | 7
test/jdk/java/io/pathNames/unix/TrailingSlash.java | 8
test/jdk/java/io/pathNames/win32/DriveOnly.java | 2
test/jdk/java/io/pathNames/win32/DriveRelativePath.java | 8
test/jdk/java/io/pathNames/win32/DriveSlash.java | 6
test/jdk/java/io/pathNames/win32/RenameDelete.java | 8
test/jdk/java/io/pathNames/win32/SJIS.java | 2
test/jdk/java/io/pathNames/win32/bug6344646.java | 8
test/jdk/java/lang/Character/Latin1CaseConversion.java | 47
test/jdk/java/lang/Character/UnicodeBlock/NumberEntities.java | 17
test/jdk/java/lang/StringBuilder/HugeCapacity.java | 4
test/jdk/java/lang/Thread/virtual/JfrEvents.java | 15
test/jdk/java/lang/Thread/virtual/stress/Skynet.java | 8
test/jdk/java/lang/instrument/RetransformBigClassTest.java | 161
test/jdk/java/lang/invoke/MethodHandleProxies/Driver.java | 6
test/jdk/java/lang/invoke/MethodHandleProxies/Unnamed.java | 6
test/jdk/java/lang/invoke/TestVHInvokerCaching.java | 8
test/jdk/java/lang/management/MemoryMXBean/LowMemoryTest2.java | 26
test/jdk/java/lang/module/customfs/ModulesInCustomFileSystem.java | 4
test/jdk/java/lang/ref/FinalizerHistogramTest.java | 41
test/jdk/java/net/URL/EarlyOrDelayedParsing.java | 19
test/jdk/java/net/httpclient/AbstractThrowingPublishers.java | 177
test/jdk/java/net/httpclient/AbstractThrowingPushPromises.java | 138
test/jdk/java/net/httpclient/AbstractThrowingSubscribers.java | 143
test/jdk/java/net/httpclient/CancelledResponse2.java | 258
test/jdk/java/net/httpclient/EmptyAuthenticate.java | 141
test/jdk/java/net/httpclient/ThrowingPublishersCustomAfterCancel.java | 10
test/jdk/java/net/httpclient/ThrowingPublishersCustomBeforeCancel.java | 10
test/jdk/java/net/httpclient/ThrowingPublishersIOAfterCancel.java | 10
test/jdk/java/net/httpclient/ThrowingPublishersIOBeforeCancel.java | 10
test/jdk/java/net/httpclient/ThrowingPublishersInNextRequest.java | 10
test/jdk/java/net/httpclient/ThrowingPublishersInRequest.java | 10
test/jdk/java/net/httpclient/ThrowingPublishersInSubscribe.java | 10
test/jdk/java/net/httpclient/ThrowingPublishersSanity.java | 10
test/jdk/java/net/httpclient/ThrowingPushPromisesAsInputStreamCustom.java | 10
test/jdk/java/net/httpclient/ThrowingPushPromisesAsInputStreamIO.java | 10
test/jdk/java/net/httpclient/ThrowingPushPromisesAsLinesCustom.java | 10
test/jdk/java/net/httpclient/ThrowingPushPromisesAsLinesIO.java | 10
test/jdk/java/net/httpclient/ThrowingPushPromisesAsStringCustom.java | 10
test/jdk/java/net/httpclient/ThrowingPushPromisesAsStringIO.java | 10
test/jdk/java/net/httpclient/ThrowingPushPromisesSanity.java | 10
test/jdk/java/net/httpclient/ThrowingSubscribersAsInputStream.java | 10
test/jdk/java/net/httpclient/ThrowingSubscribersAsInputStreamAsync.java | 10
test/jdk/java/net/httpclient/ThrowingSubscribersAsLines.java | 10
test/jdk/java/net/httpclient/ThrowingSubscribersAsLinesAsync.java | 10
test/jdk/java/net/httpclient/ThrowingSubscribersAsString.java | 10
test/jdk/java/net/httpclient/ThrowingSubscribersAsStringAsync.java | 10
test/jdk/java/net/httpclient/ThrowingSubscribersSanity.java | 10
test/jdk/java/net/httpclient/http2/BadHeadersTest.java | 47
test/jdk/java/net/httpclient/http2/BasicTest.java | 7
test/jdk/java/net/httpclient/http2/ConnectionFlowControlTest.java | 95
test/jdk/java/net/httpclient/http2/ContinuationFrameTest.java | 57
test/jdk/java/net/httpclient/websocket/DummyWebSocketServer.java | 9
test/jdk/java/net/httpclient/whitebox/RawChannelTestDriver.java | 9
test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/RawChannelTest.java | 82
test/jdk/java/nio/Buffer/LimitDirectMemory.java | 3
test/jdk/java/nio/Buffer/LimitDirectMemoryNegativeTest.java | 3
test/jdk/java/nio/channels/AsynchronousSocketChannel/CompletionHandlerRelease.java | 28
test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java | 3
test/jdk/java/nio/file/spi/fs.policy | 2
test/jdk/java/nio/file/spi/m/p/Main.java | 4
test/jdk/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java | 25
test/jdk/java/security/KeyStore/DisabledKnownType.java | 53
test/jdk/java/security/Provider/NewInstance.java | 29
test/jdk/java/security/cert/CertStore/NoLDAP.java | 11
test/jdk/java/text/Collator/RuleBasedCollatorTest.java | 95
test/jdk/java/text/Format/CompactNumberFormat/CompactFormatAndParseHelper.java | 11
test/jdk/java/text/Format/CompactNumberFormat/TestCNFRounding.java | 55
test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java | 84
test/jdk/java/text/Format/CompactNumberFormat/TestCompactPatternsValidity.java | 50
test/jdk/java/text/Format/CompactNumberFormat/TestEquality.java | 15
test/jdk/java/text/Format/CompactNumberFormat/TestFormatToCharacterIterator.java | 34
test/jdk/java/text/Format/CompactNumberFormat/TestMutatingInstance.java | 31
test/jdk/java/text/Format/CompactNumberFormat/TestParseBigDecimal.java | 23
test/jdk/java/text/Format/CompactNumberFormat/TestPlurals.java | 59
test/jdk/java/text/Format/CompactNumberFormat/TestSpecialValues.java | 25
test/jdk/java/text/Format/CompactNumberFormat/TestUExtensionOverride.java | 25
test/jdk/java/text/Format/CompactNumberFormat/TestWithCompatProvider.java | 17
test/jdk/java/text/Format/CompactNumberFormat/serialization/TestDeserializeCNF.java | 23
test/jdk/java/text/Format/CompactNumberFormat/serialization/TestSerialization.java | 24
test/jdk/java/text/Format/DateFormat/Bug8193444.java | 22
test/jdk/java/text/Format/DateFormat/CaseInsensitiveParseTest.java | 32
test/jdk/java/text/Format/DateFormat/LocaleDateFormats.java | 24
test/jdk/java/text/Format/DateFormat/SimpleDateFormatPatternTest.java | 120
test/jdk/java/text/Format/DecimalFormat/SetGroupingSizeTest.java | 38
test/jdk/java/text/Format/NumberFormat/Bug4944439.java | 25
test/jdk/java/text/Format/NumberFormat/DFSMinusPerCentMill.java | 55
test/jdk/java/text/Normalizer/SquareEraCharacterTest.java | 24
test/jdk/java/util/Calendar/CalendarDisplayNamesTest.java | 12
test/jdk/java/util/Calendar/JapaneseLenientEraTest.java | 21
test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java | 16
test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java | 4
test/jdk/java/util/Locale/LocaleMatchingTest.java | 186
test/jdk/java/util/Locale/RequiredAvailableLocalesTest.java | 35
test/jdk/java/util/Locale/TestOf.java | 58
test/jdk/java/util/Locale/bcp47u/CalendarTests.java | 63
test/jdk/java/util/Locale/bcp47u/CurrencyFormatTests.java | 19
test/jdk/java/util/Locale/bcp47u/CurrencyTests.java | 31
test/jdk/java/util/Locale/bcp47u/DisplayNameTests.java | 19
test/jdk/java/util/Locale/bcp47u/FormatTests.java | 49
test/jdk/java/util/Locale/bcp47u/SymbolsTests.java | 33
test/jdk/java/util/Locale/bcp47u/SystemPropertyTests.java | 25
test/jdk/java/util/Properties/CompatibilityTest.java | 19
test/jdk/java/util/Properties/EncodingTest.java | 18
test/jdk/java/util/Properties/InitialCapacity.java | 14
test/jdk/java/util/Properties/PropertiesEntrySetTest.java | 38
test/jdk/java/util/Properties/PropertiesStoreTest.java | 38
test/jdk/java/util/ResourceBundle/modules/basic/BasicTest.java | 18
test/jdk/java/util/ResourceBundle/modules/cache/CacheTest.java | 15
test/jdk/java/util/ResourceBundle/modules/casesensitive/CaseInsensitiveNameClash.java | 14
test/jdk/java/util/ResourceBundle/modules/visibility/VisibilityTest.java | 36
test/jdk/java/util/ServiceLoader/BadProvidersTest.java | 78
test/jdk/java/util/ServiceLoader/CachingTest.java | 18
test/jdk/java/util/ServiceLoader/ModulesTest.java | 42
test/jdk/java/util/ServiceLoader/NoInterferenceTest.java | 14
test/jdk/java/util/ServiceLoader/ReloadTest.java | 31
test/jdk/java/util/ServiceLoader/TwoIterators.java | 19
test/jdk/java/util/ServiceLoader/basic/ServiceLoaderBasicTest.java | 40
test/jdk/java/util/StringJoiner/MergeTest.java | 55
test/jdk/java/util/StringJoiner/StringJoinerOomUtf16Test.java | 19
test/jdk/java/util/StringJoiner/StringJoinerTest.java | 182
test/jdk/java/util/TimeZone/NegativeDSTTest.java | 23
test/jdk/java/util/TimeZone/TimeZoneData/VERSION | 2
test/jdk/java/util/TimeZone/ZoneIdRoundTripTest.java | 21
test/jdk/java/util/Vector/ArrayManagement.java | 81
test/jdk/java/util/logging/LoggingDeadlock2.java | 4
test/jdk/javax/accessibility/JSpinner/CustomSpinnerAccessibilityTest.java | 86
test/jdk/javax/imageio/ReadAbortTest.java | 11
test/jdk/javax/imageio/WriteAbortTest.java | 15
test/jdk/javax/net/ssl/HttpsURLConnection/SubjectAltNameIP.java | 379
test/jdk/javax/net/ssl/SSLSocket/Tls13PacketSize.java | 5
test/jdk/javax/net/ssl/TLSCommon/interop/JdkClient.java | 13
test/jdk/javax/net/ssl/TLSCommon/interop/JdkServer.java | 14
test/jdk/javax/net/ssl/templates/SSLSocketTemplate.java | 2
test/jdk/javax/sound/midi/MidiDeviceConnectors/TestAllDevices.java | 1
test/jdk/javax/sound/midi/Sequencer/Looping.java | 2
test/jdk/javax/sound/midi/SysexMessage/SendRawSysexMessage.java | 1
test/jdk/javax/sound/midi/spi/MidiDeviceProvider/ExpectedNPEOnNull.java | 1
test/jdk/javax/sound/midi/spi/MidiDeviceProvider/FakeInfo.java | 1
test/jdk/javax/sound/midi/spi/MidiDeviceProvider/UnsupportedInfo.java | 1
test/jdk/javax/sound/sampled/Clip/AutoCloseTimeCheck.java | 1
test/jdk/javax/sound/sampled/Clip/IsRunningHang.java | 1
test/jdk/javax/sound/sampled/Clip/bug5070081.java | 5
test/jdk/javax/sound/sampled/DataLine/LongFramePosition.java | 1
test/jdk/javax/sound/sampled/DirectAudio/bug6372428.java | 1
test/jdk/javax/swing/AbstractButton/bug4133768.java | 179
test/jdk/javax/swing/AbstractButton/bug4391622.java | 142
test/jdk/javax/swing/JButton/SwingButtonResizeTestWithOpenGL.java | 352
test/jdk/javax/swing/JColorChooser/Test4234761.java | 14
test/jdk/javax/swing/JComboBox/bug4135833.java | 62
test/jdk/javax/swing/JComboBox/bug4171819.java | 89
test/jdk/javax/swing/JComboBox/bug4248128.java | 80
test/jdk/javax/swing/JComboBox/bug4436376.java | 95
test/jdk/javax/swing/JEditorPane/TestBrowserBGColor.java | 133
test/jdk/javax/swing/JFileChooser/4966171/bug4966171.java | 6
test/jdk/javax/swing/JFileChooser/FileSizeCheck.java | 27
test/jdk/javax/swing/JFileChooser/bug4759934.java | 16
test/jdk/javax/swing/JFrame/ClientDecoratedIcon/ClientDecoratedIconTest.java | 186
test/jdk/javax/swing/JFrame/ClientDecoratedIcon/DialogIconTest.java | 173
test/jdk/javax/swing/JFrame/ClientDecoratedIcon/DialogInheritIcon.java | 71
test/jdk/javax/swing/JInternalFrame/bug4130806.java | 72
test/jdk/javax/swing/JInternalFrame/bug4134077.java | 132
test/jdk/javax/swing/JInternalFrame/bug4193070.java | 87
test/jdk/javax/swing/JInternalFrame/bug4225701.java | 87
test/jdk/javax/swing/JList/bug4183379.java | 85
test/jdk/javax/swing/JList/bug4251306.java | 115
test/jdk/javax/swing/JMenu/bug4624845.java | 164
test/jdk/javax/swing/JMenuBar/TestMenuMnemonic.java | 132
test/jdk/javax/swing/JMenuItem/LargeMenuTextArrowIconPosition.java | 92
test/jdk/javax/swing/JMenuItem/MenuItemTest/bug6197830.java | 1
test/jdk/javax/swing/JRootPane/bug4403624.java | 106
test/jdk/javax/swing/JScrollBar/4865918/bug4865918.java | 49
test/jdk/javax/swing/JScrollPane/AcceleratedWheelScrolling/HorizScrollers.java | 235
test/jdk/javax/swing/JScrollPane/AcceleratedWheelScrolling/RTLScrollers.java | 680
test/jdk/javax/swing/JScrollPane/bug4166037.java | 167
test/jdk/javax/swing/JScrollPane/bug4237517.java | 69
test/jdk/javax/swing/JScrollPane/bug4237560.java | 77
test/jdk/javax/swing/JScrollPane/bug4244899.java | 99
test/jdk/javax/swing/JSlider/bug4382876.java | 11
test/jdk/javax/swing/JSpinner/8223788/JSpinnerButtonFocusTest.java | 29
test/jdk/javax/swing/JTabbedPane/4624207/bug4624207.java | 67
test/jdk/javax/swing/plaf/motif/bug4150591.java | 6
test/jdk/javax/swing/text/Caret/8163124/CaretFloatingPointAPITest.java | 8
test/jdk/javax/swing/text/JTextComponent/bug4532590.java | 147
test/jdk/jdk/internal/platform/docker/MetricsCpuTester.java | 10
test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java | 4
test/jdk/jdk/internal/platform/docker/TestGetFreeSwapSpaceSize.java | 4
test/jdk/jdk/internal/platform/docker/TestLimitsUpdating.java | 4
test/jdk/jdk/internal/platform/docker/TestPidsLimit.java | 4
test/jdk/jdk/jfr/api/consumer/streaming/TestFilledChunks.java | 2
test/jdk/jdk/jfr/api/consumer/streaming/TestMetadataReconstructionWithRetainedStringPool.java | 106
test/jdk/jdk/jfr/api/consumer/streaming/TestStartMultiChunk.java | 4
test/jdk/jdk/jfr/event/gc/detailed/TestZAllocationStallEvent.java | 10
test/jdk/jdk/jfr/event/oldobject/OldObjects.java | 14
test/jdk/jdk/jfr/event/oldobject/TestDFSWithSmallStack.java | 101
test/jdk/jdk/jfr/jmx/streaming/TestEnableDisable.java | 4
test/jdk/jdk/jfr/jmx/streaming/TestMaxSize.java | 6
test/jdk/jdk/jfr/jmx/streaming/TestRemoteDump.java | 16
test/jdk/jdk/jfr/jmx/streaming/TestWithers.java | 141
test/jdk/jdk/jfr/jvm/TestWaste.java | 2
test/jdk/jdk/jfr/startupargs/TestMultipleStartupRecordings.java | 8
test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java | 37
test/jdk/sun/java2d/OpenGL/DrawBitmaskImage.java | 173
test/jdk/sun/java2d/OpenGL/DrawBufImgOp.java | 514
test/jdk/sun/java2d/OpenGL/DrawImageBg.java | 145
test/jdk/sun/java2d/OpenGL/FlipCoexistTest.java | 134
test/jdk/sun/java2d/OpenGL/LargeOps.java | 138
test/jdk/sun/java2d/OpenGL/MultiWindowFillTest.java | 122
test/jdk/sun/java2d/OpenGL/OpaqueDest.java | 186
test/jdk/sun/java2d/OpenGL/ScaleParamsOOB.java | 210
test/jdk/sun/java2d/OpenGL/ShapeClip.java | 140
test/jdk/sun/java2d/OpenGL/SrcMaskOps.java | 188
test/jdk/sun/java2d/OpenGL/VolatileSubRegion.java | 166
test/jdk/sun/java2d/OpenGL/XformVolatile.java | 146
test/jdk/sun/java2d/X11SurfaceData/SharedMemoryPixmapsTest/SharedMemoryPixmapsTest.java | 106
test/jdk/sun/java2d/X11SurfaceData/SharedMemoryPixmapsTest/SharedMemoryPixmapsTest.sh | 3
test/jdk/sun/net/www/protocol/http/NTLMHeadTest.java | 16
test/jdk/sun/net/www/protocol/http/TestTransparentNTLM.java | 3
test/jdk/sun/net/www/protocol/https/HttpsURLConnection/GetServerCertificates.java | 307
test/jdk/sun/security/krb5/auto/UserIterCount.java | 22
test/jdk/sun/security/krb5/config/native/TestDynamicStore.java | 15
test/jdk/sun/security/lib/cacerts/VerifyCACerts.java | 12
test/jdk/sun/security/pkcs11/Cipher/KeyWrap/NISTWrapKAT.java | 81
test/jdk/sun/security/pkcs11/Cipher/KeyWrap/TestGeneral.java | 45
test/jdk/sun/security/pkcs11/Cipher/KeyWrap/XMLEncKAT.java | 19
test/jdk/sun/security/pkcs11/Cipher/ReinitCipher.java | 7
test/jdk/sun/security/pkcs11/Cipher/Test4512704.java | 21
test/jdk/sun/security/pkcs11/Cipher/TestCICOWithGCM.java | 27
test/jdk/sun/security/pkcs11/Cipher/TestCICOWithGCMAndAAD.java | 10
test/jdk/sun/security/pkcs11/Cipher/TestChaChaPoly.java | 7
test/jdk/sun/security/pkcs11/Cipher/TestChaChaPolyKAT.java | 16
test/jdk/sun/security/pkcs11/Cipher/TestChaChaPolyNoReuse.java | 15
test/jdk/sun/security/pkcs11/Cipher/TestChaChaPolyOutputSize.java | 9
test/jdk/sun/security/pkcs11/Cipher/TestCipherMode.java | 37
test/jdk/sun/security/pkcs11/Cipher/TestGCMKeyAndIvCheck.java | 25
test/jdk/sun/security/pkcs11/Cipher/TestKATForGCM.java | 22
test/jdk/sun/security/pkcs11/Cipher/TestRSACipher.java | 6
test/jdk/sun/security/pkcs11/Cipher/TestRSACipherWrap.java | 6
test/jdk/sun/security/pkcs11/Cipher/TestRawRSACipher.java | 6
test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java | 78
test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java | 58
test/jdk/sun/security/pkcs11/Config/ReadConfInUTF16Env.java | 6
test/jdk/sun/security/pkcs11/KeyStore/SecretKeysBasic.java | 17
test/jdk/sun/security/pkcs11/PKCS11Test.java | 90
test/jdk/sun/security/pkcs11/Provider/Absolute.java | 9
test/jdk/sun/security/pkcs11/Provider/ConfigShortPath.java | 19
test/jdk/sun/security/pkcs11/Provider/LoginISE.java | 19
test/jdk/sun/security/pkcs11/Secmod/AddPrivateKey.java | 6
test/jdk/sun/security/pkcs11/Secmod/AddTrustedCert.java | 14
test/jdk/sun/security/pkcs11/Secmod/Crypto.java | 6
test/jdk/sun/security/pkcs11/Secmod/GetPrivateKey.java | 6
test/jdk/sun/security/pkcs11/Secmod/JksSetPrivateKey.java | 6
test/jdk/sun/security/pkcs11/Secmod/LoadKeystore.java | 6
test/jdk/sun/security/pkcs11/Secmod/TestNssDbSqlite.java | 20
test/jdk/sun/security/pkcs11/Secmod/TrustAnchors.java | 6
test/jdk/sun/security/pkcs11/SecmodTest.java | 5
test/jdk/sun/security/pkcs11/Signature/TestDSAKeyLength.java | 18
test/jdk/sun/security/pkcs11/ec/ReadCertificates.java | 4
test/jdk/sun/security/pkcs11/ec/ReadPKCS12.java | 4
test/jdk/sun/security/pkcs11/ec/TestECDH.java | 1
test/jdk/sun/security/pkcs11/ec/TestKeyFactory.java | 7
test/jdk/sun/security/pkcs11/rsa/KeyWrap.java | 10
test/jdk/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java | 4
test/jdk/sun/security/pkcs11/tls/TestKeyMaterial.java | 7
test/jdk/sun/security/pkcs11/tls/TestKeyMaterialChaCha20.java | 11
test/jdk/sun/security/pkcs11/tls/TestMasterSecret.java | 7
test/jdk/sun/security/pkcs11/tls/TestPRF.java | 7
test/jdk/sun/security/pkcs11/tls/TestPremaster.java | 10
test/jdk/sun/security/pkcs11/tls/tls12/FipsModeTLS12.java | 14
test/jdk/sun/security/ssl/SSLSocketImpl/ReuseAddr.java | 5
test/jdk/sun/security/ssl/X509KeyManager/PreferredKey.java | 152
test/jdk/sun/security/ssl/X509KeyManager/SelectOneKeyOutOfMany.java | 299
test/jdk/sun/security/tools/jarsigner/DefaultOptions.java | 7
test/jdk/sun/security/tools/keytool/i18n.java | 52
test/jdk/sun/security/util/RegisteredDomain/ParseNames.java | 4
test/jdk/sun/security/util/RegisteredDomain/tests.dat | 11
test/jdk/sun/security/validator/CertReplace.java | 178
test/jdk/sun/security/validator/certreplace.sh | 88
test/jdk/sun/security/validator/samedn.sh | 86
test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java | 32
test/langtools/jdk/javadoc/doclet/testLinkOption/TestRedirectLinks.java | 111
test/langtools/jdk/javadoc/tool/EnablePreviewOption.java | 4
test/langtools/jdk/javadoc/tool/ReleaseOption.java | 4
test/langtools/jdk/javadoc/tool/T4696488.java | 4
test/langtools/jdk/javadoc/tool/T4994049/T4994049.java | 4
test/langtools/jdk/javadoc/tool/T6551367.java | 4
test/langtools/jdk/javadoc/tool/TestScriptInComment.java | 4
test/langtools/jdk/javadoc/tool/modules/CommandLineFiles.java | 4
test/langtools/jdk/javadoc/tool/modules/FilterOptions.java | 4
test/langtools/jdk/javadoc/tool/modules/PackageOptions.java | 4
test/langtools/jdk/javadoc/tool/modules/PatchModules.java | 4
test/langtools/jdk/javadoc/tool/modules/ReleaseOptions.java | 4
test/langtools/jdk/javadoc/tool/nonConstExprs/Test.java | 4
test/langtools/jdk/javadoc/tool/parser/7091528/T7091528.java | 4
test/langtools/jdk/jshell/AnalysisTest.java | 11
test/langtools/jdk/jshell/AnalyzeSnippetTest.java | 48
test/langtools/jdk/jshell/BadExecutionControlSpecTest.java | 11
test/langtools/jdk/jshell/ClassMembersTest.java | 26
test/langtools/jdk/jshell/ClassPathTest.java | 13
test/langtools/jdk/jshell/ClassesTest.java | 55
test/langtools/jdk/jshell/CommandCompletionTest.java | 20
test/langtools/jdk/jshell/CompilerOptionsTest.java | 13
test/langtools/jdk/jshell/CompletenessStressTest.java | 10
test/langtools/jdk/jshell/CompletenessTest.java | 25
test/langtools/jdk/jshell/CompletionSuggestionTest.java | 56
test/langtools/jdk/jshell/ComputeFQNsTest.java | 20
test/langtools/jdk/jshell/ConsoleTest.java | 41
test/langtools/jdk/jshell/CustomInputToolBuilder.java | 12
test/langtools/jdk/jshell/DropTest.java | 18
test/langtools/jdk/jshell/EditorTestBase.java | 28
test/langtools/jdk/jshell/EmptyTest.java | 13
test/langtools/jdk/jshell/ErrorRecoveryTest.java | 10
test/langtools/jdk/jshell/ErrorTranslationTest.java | 25
test/langtools/jdk/jshell/ExceptionMessageTest.java | 19
test/langtools/jdk/jshell/ExceptionsTest.java | 46
test/langtools/jdk/jshell/ExecutionControlSpecTest.java | 14
test/langtools/jdk/jshell/ExecutionControlTestBase.java | 4
test/langtools/jdk/jshell/ExpectedDiagnostic.java | 14
test/langtools/jdk/jshell/ExternalEditorTest.java | 37
test/langtools/jdk/jshell/FailOverDirectExecutionControlTest.java | 28
test/langtools/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java | 10
test/langtools/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java | 10
test/langtools/jdk/jshell/FailOverExecutionControlHangingListenTest.java | 10
test/langtools/jdk/jshell/FailOverExecutionControlTest.java | 10
test/langtools/jdk/jshell/FileManagerTest.java | 15
test/langtools/jdk/jshell/ForwardReferenceImportTest.java | 24
test/langtools/jdk/jshell/ForwardReferenceTest.java | 33
test/langtools/jdk/jshell/GetResourceTest.java | 13
test/langtools/jdk/jshell/HighlightUITest.java | 10
test/langtools/jdk/jshell/HistoryTest.java | 34
test/langtools/jdk/jshell/HistoryUITest.java | 11
test/langtools/jdk/jshell/IOTest.java | 17
test/langtools/jdk/jshell/IdGeneratorTest.java | 19
test/langtools/jdk/jshell/IgnoreTest.java | 16
test/langtools/jdk/jshell/IllegalArgumentExceptionTest.java | 15
test/langtools/jdk/jshell/ImportTest.java | 25
test/langtools/jdk/jshell/InaccessibleExpressionTest.java | 24
test/langtools/jdk/jshell/IndentUITest.java | 10
test/langtools/jdk/jshell/InferTypeTest.java | 8
test/langtools/jdk/jshell/JShellQueryTest.java | 18
test/langtools/jdk/jshell/JShellStateClosedTest.java | 21
test/langtools/jdk/jshell/JavadocTest.java | 10
test/langtools/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java | 12
test/langtools/jdk/jshell/JdiBadOptionListenExecutionControlTest.java | 12
test/langtools/jdk/jshell/JdiBogusHostListenExecutionControlTest.java | 12
test/langtools/jdk/jshell/JdiFailingLaunchExecutionControlTest.java | 12
test/langtools/jdk/jshell/JdiFailingListenExecutionControlTest.java | 12
test/langtools/jdk/jshell/JdiHangingLaunchExecutionControlTest.java | 10
test/langtools/jdk/jshell/JdiHangingListenExecutionControlTest.java | 10
test/langtools/jdk/jshell/JdiLaunchingExecutionControlTest.java | 10
test/langtools/jdk/jshell/JdiListeningExecutionControlTest.java | 10
test/langtools/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java | 10
test/langtools/jdk/jshell/KullaCompletenessStressTest.java | 20
test/langtools/jdk/jshell/KullaTesting.java | 150
test/langtools/jdk/jshell/MethodsTest.java | 49
test/langtools/jdk/jshell/ModifiersTest.java | 23
test/langtools/jdk/jshell/MultipleDocumentationTest.java | 12
test/langtools/jdk/jshell/MyExecutionControl.java | 4
test/langtools/jdk/jshell/NullTest.java | 8
test/langtools/jdk/jshell/PasteAndMeasurementsUITest.java | 12
test/langtools/jdk/jshell/PipeInputStreamTest.java | 22
test/langtools/jdk/jshell/RecordsTest.java | 20
test/langtools/jdk/jshell/RejectedFailedTest.java | 29
test/langtools/jdk/jshell/ReplToolTesting.java | 21
test/langtools/jdk/jshell/ReplaceTest.java | 29
test/langtools/jdk/jshell/SealedClassesTest.java | 12
test/langtools/jdk/jshell/ShutdownTest.java | 77
test/langtools/jdk/jshell/SimpleRegressionTest.java | 48
test/langtools/jdk/jshell/SnippetEventToStringTest.java | 65
test/langtools/jdk/jshell/SnippetHighlightTest.java | 13
test/langtools/jdk/jshell/SnippetStatusListenerTest.java | 45
test/langtools/jdk/jshell/SnippetTest.java | 31
test/langtools/jdk/jshell/SourceLevelTest.java | 14
test/langtools/jdk/jshell/StartOptionTest.java | 84
test/langtools/jdk/jshell/StopExecutionTest.java | 24
test/langtools/jdk/jshell/T8146368/JShellTest8146368.java | 8
test/langtools/jdk/jshell/T8146368/JShellToolTest8146368.java | 8
test/langtools/jdk/jshell/Test8294583.java | 13
test/langtools/jdk/jshell/Test8296012.java | 13
test/langtools/jdk/jshell/ToolBasicTest.java | 84
test/langtools/jdk/jshell/ToolCommandOptionTest.java | 23
test/langtools/jdk/jshell/ToolEnableNativeAccessTest.java | 9
test/langtools/jdk/jshell/ToolEnablePreviewTest.java | 9
test/langtools/jdk/jshell/ToolFormatTest.java | 42
test/langtools/jdk/jshell/ToolLocalSimpleTest.java | 10
test/langtools/jdk/jshell/ToolLocaleMessageTest.java | 16
test/langtools/jdk/jshell/ToolMultilineSnippetHistoryTest.java | 10
test/langtools/jdk/jshell/ToolProviderTest.java | 9
test/langtools/jdk/jshell/ToolReloadTest.java | 19
test/langtools/jdk/jshell/ToolRetainTest.java | 17
test/langtools/jdk/jshell/ToolShiftTabTest.java | 15
test/langtools/jdk/jshell/ToolSimpleTest.java | 13
test/langtools/jdk/jshell/ToolTabCommandTest.java | 12
test/langtools/jdk/jshell/ToolTabSnippetTest.java | 14
test/langtools/jdk/jshell/ToolingTest.java | 5
test/langtools/jdk/jshell/TypeNameTest.java | 23
test/langtools/jdk/jshell/UITesting.java | 4
test/langtools/jdk/jshell/UndefinedClassTest.java | 11
test/langtools/jdk/jshell/UnicodeTest.java | 13
test/langtools/jdk/jshell/UnnamedTest.java | 92
test/langtools/jdk/jshell/UserExecutionControlTest.java | 18
test/langtools/jdk/jshell/UserInputTest.java | 12
test/langtools/jdk/jshell/UserJdiUserRemoteTest.java | 22
test/langtools/jdk/jshell/VariablesTest.java | 78
test/langtools/jdk/jshell/WrapperTest.java | 72
test/langtools/tools/javac/7129225/NegTest.out | 2
test/langtools/tools/javac/7129225/TestImportStar.out | 2
test/langtools/tools/javac/HexThree.java | 3
test/langtools/tools/javac/StringsInSwitch/OneCaseSwitches.java | 1
test/langtools/tools/javac/StringsInSwitch/StringSwitches.java | 3
test/langtools/tools/javac/TryWithResources/BadTwr.java | 1
test/langtools/tools/javac/TryWithResources/BadTwr.out | 8
test/langtools/tools/javac/TryWithResources/BadTwrSyntax.java | 1
test/langtools/tools/javac/TryWithResources/BadTwrSyntax.out | 2
test/langtools/tools/javac/TryWithResources/ExplicitFinal.java | 3
test/langtools/tools/javac/TryWithResources/PlainTry.java | 3
test/langtools/tools/javac/TryWithResources/PlainTry.out | 2
test/langtools/tools/javac/TryWithResources/TwrFlow.java | 1
test/langtools/tools/javac/TryWithResources/TwrFlow.out | 4
test/langtools/tools/javac/TryWithResources/TwrLint.java | 1
test/langtools/tools/javac/TryWithResources/TwrLint.out | 4
test/langtools/tools/javac/TryWithResources/TwrMultiCatch.java | 3
test/langtools/tools/javac/TryWithResources/TwrOnNonResource.java | 1
test/langtools/tools/javac/TryWithResources/TwrOnNonResource.out | 6
test/langtools/tools/javac/TryWithResources/TwrSuppression.java | 3
test/langtools/tools/javac/TryWithResources/WeirdTwr.java | 1
test/langtools/tools/javac/annotations/pos/TrailingComma.java | 3
test/langtools/tools/javac/boxing/BoxingCaching.java | 3
test/langtools/tools/javac/enum/6350057/T6350057.java | 3
test/langtools/tools/javac/enum/AbstractEmptyEnum.java | 1
test/langtools/tools/javac/enum/AbstractEmptyEnum.out | 2
test/langtools/tools/javac/enum/EnumImplicitPrivateConstructor.java | 3
test/langtools/tools/javac/enum/EnumPrivateConstructor.java | 3
test/langtools/tools/javac/enum/EnumProtectedConstructor.java | 1
test/langtools/tools/javac/enum/EnumProtectedConstructor.out | 2
test/langtools/tools/javac/enum/EnumPublicConstructor.java | 1
test/langtools/tools/javac/enum/EnumPublicConstructor.out | 2
test/langtools/tools/javac/enum/ExplicitlyAbstractEnum1.java | 1
test/langtools/tools/javac/enum/ExplicitlyAbstractEnum1.out | 2
test/langtools/tools/javac/enum/ExplicitlyAbstractEnum2.java | 1
test/langtools/tools/javac/enum/ExplicitlyAbstractEnum2.out | 2
test/langtools/tools/javac/enum/ExplicitlyFinalEnum1.java | 1
test/langtools/tools/javac/enum/ExplicitlyFinalEnum1.out | 2
test/langtools/tools/javac/enum/ExplicitlyFinalEnum2.java | 1
test/langtools/tools/javac/enum/ExplicitlyFinalEnum2.out | 2
test/langtools/tools/javac/enum/FauxEnum1.java | 1
test/langtools/tools/javac/enum/FauxEnum1.out | 2
test/langtools/tools/javac/enum/FauxEnum3.java | 1
test/langtools/tools/javac/enum/FauxEnum3.out | 2
test/langtools/tools/javac/enum/FauxSpecialEnum1.java | 1
test/langtools/tools/javac/enum/FauxSpecialEnum1.out | 2
test/langtools/tools/javac/enum/FauxSpecialEnum2.java | 1
test/langtools/tools/javac/enum/FauxSpecialEnum2.out | 2
test/langtools/tools/javac/generics/InheritanceConflict3.java | 1
test/langtools/tools/javac/generics/InheritanceConflict3.out | 4
test/langtools/tools/javac/importChecks/ImportIsFullyQualified.out | 2
test/langtools/tools/javac/importChecks/ImportsObservable.out | 2
test/langtools/tools/javac/modules/ConvenientAccessErrorsTest.java | 6
test/langtools/tools/javac/multicatch/Neg01.java | 1
test/langtools/tools/javac/multicatch/Neg01.out | 2
test/langtools/tools/javac/multicatch/Neg01eff_final.java | 1
test/langtools/tools/javac/multicatch/Neg01eff_final.out | 2
test/langtools/tools/javac/multicatch/Neg07.java | 1
test/langtools/tools/javac/multicatch/Neg07.out | 2
test/langtools/tools/javac/multicatch/Pos10.java | 1
test/langtools/tools/javac/processing/6365040/T6365040.java | 4
test/langtools/tools/javac/processing/6378728/T6378728.java | 3
test/langtools/tools/javac/processing/6634138/T6634138.java | 3
test/langtools/tools/javac/processing/completion/TestCompletions.java | 3
test/langtools/tools/javac/processing/environment/TestSourceVersion.java | 3
test/langtools/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java | 3
test/langtools/tools/javac/processing/errors/TestFatalityOfParseErrors.java | 1
test/langtools/tools/javac/processing/errors/TestOptionSyntaxErrors.java | 3
test/langtools/tools/javac/processing/errors/TestReturnCode.java | 1
test/langtools/tools/javac/processing/filer/TestFilerConstraints.java | 3
test/langtools/tools/javac/processing/filer/TestGetResource.java | 3
test/langtools/tools/javac/processing/filer/TestPackageInfo.java | 1
test/langtools/tools/javac/processing/messager/MessagerBasics.java | 1
test/langtools/tools/javac/processing/model/TestExceptions.java | 3
test/langtools/tools/javac/processing/model/TestSourceVersion.java | 3
test/langtools/tools/javac/processing/model/element/TestAnonClassNames.java | 3
test/langtools/tools/javac/processing/model/element/TestElement.java | 3
test/langtools/tools/javac/processing/model/element/TestExecutableElement.java | 3
test/langtools/tools/javac/processing/model/element/TestNames.java | 3
test/langtools/tools/javac/processing/model/element/TestPackageElement.java | 3
test/langtools/tools/javac/processing/model/element/TestResourceVariable.java | 3
test/langtools/tools/javac/processing/model/type/MirroredTypeEx/NpeTest.java | 3
test/langtools/tools/javac/processing/model/type/MirroredTypeEx/Plurality.java | 3
test/langtools/tools/javac/processing/model/type/TestTypeKind.java | 3
test/langtools/tools/javac/processing/model/util/deprecation/TestDeprecation.java | 3
test/langtools/tools/javac/processing/model/util/elements/TestGetConstantExpression.java | 3
test/langtools/tools/javac/processing/model/util/elements/TestGetPackageOf.java | 3
test/langtools/tools/javac/processing/model/util/elements/TestIsFunctionalInterface.java | 3
test/langtools/tools/javac/processing/model/util/elements/VacuousEnum.java | 3
test/langtools/tools/javac/processing/model/util/filter/TestIterables.java | 3
test/langtools/tools/javac/processing/model/util/types/TestPseudoTypeHandling.java | 3
test/langtools/tools/javac/processing/warnings/TestSourceVersionWarnings.java | 4
test/lib-test/jdk/test/lib/security/DerUtilsTest.java | 116
test/lib/jdk/test/lib/artifacts/ArtifactResolver.java | 9
test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java | 4
test/lib/jdk/test/lib/net/SimpleSSLContext.java | 174
test/lib/jdk/test/lib/security/CertificateBuilder.java | 127
test/lib/jdk/test/lib/security/DerUtils.java | 83
test/lib/jdk/test/lib/security/OpensslArtifactFetcher.java | 35
test/lib/jdk/test/lib/security/timestamp/TsaHandler.java | 9
test/lib/jdk/test/lib/security/timestamp/TsaParam.java | 26
test/lib/jdk/test/lib/security/timestamp/TsaSigner.java | 39
test/lib/jdk/test/lib/thread/TestThreadFactory.java | 55
test/micro/org/openjdk/bench/java/security/HSS.java | 2010 --
test/micro/org/openjdk/bench/javax/imageio/plugins/jpeg/LargeJpegReadWithProgressBench.java | 166
test/micro/org/openjdk/bench/javax/imageio/plugins/jpeg/LargeJpegReadWriteBench.java | 141
1358 files changed, 40959 insertions(+), 20098 deletions(-)
dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmpes1xt6kv/openjdk-21_21.0.11+10-1~deb13u2.dsc: no acceptable signature found
dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmpes1xt6kv/openjdk-21_21.0.12+8-1~deb13u1.dsc: no acceptable signature found
diff -Nru openjdk-21-21.0.11+10/.jcheck/conf openjdk-21-21.0.12+8/.jcheck/conf
--- openjdk-21-21.0.11+10/.jcheck/conf 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/.jcheck/conf 2026-07-13 06:55:55.000000000 +0000
@@ -1,7 +1,7 @@
[general]
project=jdk-updates
jbs=JDK
-version=21.0.11
+version=21.0.12
[checks]
error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists
diff -Nru openjdk-21-21.0.11+10/debian/JB-jre-headless.overrides.in openjdk-21-21.0.12+8/debian/JB-jre-headless.overrides.in
--- openjdk-21-21.0.11+10/debian/JB-jre-headless.overrides.in 2026-04-24 01:32:54.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/JB-jre-headless.overrides.in 2026-07-22 00:30:06.000000000 +0000
@@ -9,7 +9,6 @@
@basename@-jre-headless binary: debug-suffix-not-dbg
# Upstream implementation
-@basename@-jre-headless binary: exit-in-shared-library
@basename@-jre-headless binary: spelling-error-in-binary
# Override due to upstream copyright
diff -Nru openjdk-21-21.0.11+10/debian/JB-jre-zero.overrides.in openjdk-21-21.0.12+8/debian/JB-jre-zero.overrides.in
--- openjdk-21-21.0.11+10/debian/JB-jre-zero.overrides.in 2026-03-01 21:51:15.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/JB-jre-zero.overrides.in 2026-07-22 00:30:06.000000000 +0000
@@ -3,7 +3,6 @@
@basename@-jre-zero binary: unstripped-binary-or-object
# Upstream implementation
-@basename@-jre-zero binary: exit-in-shared-library
@basename@-jre-zero binary: spelling-error-in-binary
# repeated lib due to upstream implementation directory layout
diff -Nru openjdk-21-21.0.11+10/debian/changelog openjdk-21-21.0.12+8/debian/changelog
--- openjdk-21-21.0.11+10/debian/changelog 2026-04-26 12:23:41.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/changelog 2026-08-08 15:22:18.000000000 +0000
@@ -1,8 +1,50 @@
-openjdk-21 (21.0.11+10-1~deb13u2) trixie-security; urgency=medium
+openjdk-21 (21.0.12+8-1~deb13u1) trixie-security; urgency=medium
- * Rebuild for trixie, now with updated jtreg7
+ * Rebuild for trixie
- -- Moritz Mühlenhoff Sun, 26 Apr 2026 14:23:41 +0200
+ -- Moritz Muehlenhoff Sat, 08 Aug 2026 17:22:18 +0200
+
+openjdk-21 (21.0.12+8-1) unstable; urgency=medium
+
+ * OpenJDK 21.0.12 release, build 8.
+ - CVEs:
+ + CVE-2026-46968
+ + CVE-2026-46917
+ + CVE-2026-47010
+ + CVE-2026-47021
+ + CVE-2026-47027
+ + CVE-2026-60147
+ + CVE-2026-47059
+ + CVE-2026-47063
+ + CVE-2026-41254
+ - Release notes: https://bit.ly/openjdk2112
+
+ -- Vladimir Petko Wed, 22 Jul 2026 12:30:18 +1200
+
+openjdk-21 (21.0.12~7ea-1) unstable; urgency=medium
+
+ * OpenJDK 21.0.12 early access, build 7.
+ * d/copyright: Regenerate.
+ * d/p/jdk-8387580.diff: Apply upstream patch to resolve S390x
+ ftbfs (JDK-8387580).
+ * d/t/problems.csv: Drop obsolete versions, add openjdk-28,
+ add new exclusions.
+
+ -- Vladimir Petko Thu, 16 Jul 2026 15:29:45 +1200
+
+openjdk-21 (21.0.12~5ea-1) unstable; urgency=medium
+
+ * OpenJDK 21.0.12 early access, build 5.
+ * d/rules: Do not perform copyright validation for old releases.
+ * d/rules: Check DEB_BUILD_PROFILES in addition to DEB_BUILD_OPTIONS
+ to set up with_check variable. Do not check control files if
+ with_check is disabled (Closes: #1137499).
+ * d/control.in: Add myself to uploaders.
+ * Regenerate files.
+ * d/JB-jre-{headless,zero}.overrides.in: Drop exit-in-shared-library
+ override.
+
+ -- Vladimir Petko Mon, 08 Jun 2026 12:05:35 +1200
openjdk-21 (21.0.11+10-1) unstable; urgency=medium
diff -Nru openjdk-21-21.0.11+10/debian/control openjdk-21-21.0.12+8/debian/control
--- openjdk-21-21.0.11+10/debian/control 2026-04-26 12:23:16.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/control 2026-08-08 15:13:50.000000000 +0000
@@ -2,7 +2,7 @@
Section: java
Priority: optional
Maintainer: OpenJDK Team
-Uploaders: Matthias Klose
+Uploaders: Matthias Klose , Vladimir Petko
Build-Depends: debhelper (>= 11),
m4, lsb-release, zip, unzip,
sharutils, gawk, cpio, procps, wdiff, pkgconf, fastjar (>= 2:0.96-0ubuntu2),
diff -Nru openjdk-21-21.0.11+10/debian/control.in openjdk-21-21.0.12+8/debian/control.in
--- openjdk-21-21.0.11+10/debian/control.in 2026-04-26 12:23:07.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/control.in 2026-08-08 15:13:42.000000000 +0000
@@ -2,7 +2,7 @@
Section: java
Priority: optional
Maintainer: OpenJDK Team <@basename@@packages.debian.org>
-Uploaders: Matthias Klose
+Uploaders: Matthias Klose , Vladimir Petko
Build-Depends: @bd_debhelper@
m4, lsb-release, zip, unzip,
sharutils, gawk, cpio, procps, wdiff, @bd_pkgconf@ @bd_fastjar@
diff -Nru openjdk-21-21.0.11+10/debian/copyright openjdk-21-21.0.12+8/debian/copyright
--- openjdk-21-21.0.11+10/debian/copyright 2026-04-24 01:35:11.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/copyright 2026-07-22 00:30:06.000000000 +0000
@@ -2286,7 +2286,7 @@
.
The Source Code of this file is available under the
Mozilla Public License, v. 2.0 and is located at
- https://raw.githubusercontent.com/publicsuffix/list/1cbd6e71a9b83620b1d0b11e49d3d9ff48c27e22/public_suffix_list.dat.
+ https://raw.githubusercontent.com/publicsuffix/list/823beb1425def931c8b0b170a6bc33b424c3f9b0/public_suffix_list.dat.
If a copy of the MPL was not distributed with this file, you can obtain one
at https://mozilla.org/MPL/2.0/.
.
@@ -2957,7 +2957,7 @@
--- end of LICENSE ---
.
------------------------------------------------------------------------------
- %% This notice is provided with respect to The FreeType Project: Freetype v2.14.2,
+ %% This notice is provided with respect to The FreeType Project: Freetype v2.14.3,
which may be included with JRE 21, JDK 21 and OpenJDK 21
.
--- begin of LICENSE ---
@@ -2983,24 +2983,24 @@
FreeType License
.
.
- Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, and Werner Lemberg.
- Copyright (C) 2007-2025 by Dereg Clegg and Michael Toftdal.
- Copyright (C) 1996-2025 by Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
- Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
- Copyright (C) 2004-2025 by Masatake YAMATO and Redhat K.K.
- Copyright (C) 2007-2025 by Derek Clegg and Michael Toftdal.
- Copyright (C) 2003-2025 by Masatake YAMATO, Red Hat K.K.,
- Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
- Copyright (C) 2007-2025 by David Turner.
- Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
- Copyright (C) 2007-2025 by Rahul Bhalerao , .
- Copyright (C) 2025 by Behdad Esfahbod.
- Copyright (C) 2008-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
- Copyright (C) 2013-2025 by Google, Inc.
- Copyright (C) 2019-2025 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
- Copyright (C) 2009-2025 by Oran Agra and Mickey Gabel.
- Copyright (C) 2018-2025 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
- Copyright (C) 2004-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
+ Copyright (C) 1996-2026 by David Turner, Robert Wilhelm, and Werner Lemberg.
+ Copyright (C) 2007-2026 by Dereg Clegg and Michael Toftdal.
+ Copyright (C) 1996-2026 by Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
+ Copyright (C) 2022-2026 by David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
+ Copyright (C) 2004-2026 by Masatake YAMATO and Redhat K.K.
+ Copyright (C) 2007-2026 by Derek Clegg and Michael Toftdal.
+ Copyright (C) 2003-2026 by Masatake YAMATO, Red Hat K.K.,
+ Copyright (C) 1996-2026 by David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
+ Copyright (C) 2007-2026 by David Turner.
+ Copyright (C) 2022-2026 by David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
+ Copyright (C) 2007-2026 by Rahul Bhalerao , .
+ Copyright (C) 2025-2026 by Behdad Esfahbod.
+ Copyright (C) 2008-2026 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
+ Copyright (C) 2013-2026 by Google, Inc.
+ Copyright (C) 2019-2026 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
+ Copyright (C) 2009-2026 by Oran Agra and Mickey Gabel.
+ Copyright (C) 2018-2026 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
+ Copyright (C) 2004-2026 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
The FreeType Project LICENSE
----------------------------
.
@@ -3052,7 +3052,7 @@
.
"""
Portions of this software are copyright © The FreeType
- Project (www.freetype.org). All rights reserved.
+ Project (https://freetype.org). All rights reserved.
"""
.
Please replace with the value from the FreeType version you
@@ -3166,7 +3166,7 @@
.
Our home page can be found at
.
- https://www.freetype.org
+ https://freetype.org
.
.
.
@@ -3269,7 +3269,7 @@
--- end of LICENSE ---
.
------------------------------------------------------------------------------
- %% This notice is provided with respect to Harfbuzz 12.3.2,
+ %% This notice is provided with respect to Harfbuzz v14.2.0,
which may be included with JRE 21, JDK 21 and OpenJDK 21
.
--- begin of LICENSE ---
@@ -3349,7 +3349,7 @@
The below applies to the following file(s):
libharfbuzz/hb-unicode-emoji-table.hh
.
- © 2024 Unicode®, Inc.
+ © 2025 Unicode®, Inc.
.
Unicode and the Unicode Logo are registered trademarks of Unicode, Inc.
in the U.S. and other countries.
@@ -3380,7 +3380,7 @@
--- end of LICENSE ---
.
------------------------------------------------------------------------------
- %% This notice is provided with respect to Little Color Management System (LCMS) v2.17,
+ %% This notice is provided with respect to Little Color Management System (LCMS) v2.19.1,
which may be included with JRE 21, JDK 21 and OpenJDK 21
.
--- begin of LICENSE ---
@@ -3390,7 +3390,7 @@
.
MIT License
.
- Copyright (C) 1998-2025 Marti Maria Saguer
+ Copyright (C) 1998-2026 Marti Maria Saguer
.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the "Software"),
@@ -3471,6 +3471,7 @@
Lovell Fuller
Eli Schwartz
Diogo Teles Sant'Anna
+ Vlad Erium
.
Special Thanks
--------------
@@ -4141,7 +4142,7 @@
--- end of LICENSE ---
.
------------------------------------------------------------------------------
- %% This notice is provided with respect to JLine v3.26.1,
+ %% This notice is provided with respect to JLine v3.29.0,
which may be included with JRE 21, JDK 21 and OpenJDK 21
.
--- begin of LICENSE ---
diff -Nru openjdk-21-21.0.11+10/debian/patches/jdk-8387580.diff openjdk-21-21.0.12+8/debian/patches/jdk-8387580.diff
--- openjdk-21-21.0.11+10/debian/patches/jdk-8387580.diff 1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/patches/jdk-8387580.diff 2026-07-22 00:30:06.000000000 +0000
@@ -0,0 +1,36 @@
+From b9ea4636bea0f6264b2c602e4203e8e604d8da6e Mon Sep 17 00:00:00 2001
+From: Vladimir Petko
+Date: Tue, 7 Jul 2026 09:58:32 +1200
+Subject: [PATCH] fix(TemplateTable): use float operations for fast_xaccess()
+ and fstore().
+ This PR changes fstore and fast_xaccess operations to generate float
+ (4 byte) instructions on S390x. This resolves out of bound read and
+ writes on float that causes a segmentation fault with
+ Compact Object Headers enabled.
+Bug: https://bugs.openjdk.org/browse/JDK-8387580
+Origin: upstream, https://github.com/openjdk/jdk/commit/978dfecb6545166aee93a8e68c9c82535b0cb3e2
+
+---
+ src/hotspot/cpu/s390/templateTable_s390.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/src/hotspot/cpu/s390/templateTable_s390.cpp
++++ b/src/hotspot/cpu/s390/templateTable_s390.cpp
+@@ -1042,7 +1042,7 @@
+ void TemplateTable::fstore() {
+ transition(ftos, vtos);
+ locals_index(Z_R1_scratch);
+- __ freg2mem_opt(Z_ftos, faddress(_masm, Z_R1_scratch));
++ __ freg2mem_opt(Z_ftos, faddress(_masm, Z_R1_scratch), false);
+ }
+
+ void TemplateTable::dstore() {
+@@ -3418,7 +3418,7 @@
+ __ verify_oop(Z_tos);
+ break;
+ case ftos:
+- __ mem2freg_opt(Z_ftos, Address(receiver, index));
++ __ mem2freg_opt(Z_ftos, Address(receiver, index), false);
+ break;
+ default:
+ ShouldNotReachHere();
diff -Nru openjdk-21-21.0.11+10/debian/patches/series openjdk-21-21.0.12+8/debian/patches/series
--- openjdk-21-21.0.11+10/debian/patches/series 2026-04-24 01:32:54.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/patches/series 2026-07-22 00:30:06.000000000 +0000
@@ -49,3 +49,4 @@
#jdk-8347014-proposed.patch
jdk-8359735.patch
jdk-8381555.diff
+jdk-8387580.diff
diff -Nru openjdk-21-21.0.11+10/debian/rules openjdk-21-21.0.12+8/debian/rules
--- openjdk-21-21.0.11+10/debian/rules 2026-04-24 01:33:08.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/rules 2026-07-22 00:30:12.000000000 +0000
@@ -169,7 +169,7 @@
testng_pkg = libtestng7-java
endif
-with_check = $(if $(findstring nocheck, $(DEB_BUILD_OPTIONS)),,yes)
+with_check = $(if $(findstring nocheck, $(DEB_BUILD_OPTIONS)$(DEB_BUILD_PROFILES)),,yes)
ifneq (,$(filter $(DEB_HOST_ARCH), alpha arc armel ia64 mipsel mips64el powerpc riscv64 x32))
with_check = disabled running check on $(DEB_HOST_ARCH)
endif
@@ -1177,6 +1177,9 @@
update-control-files: debian/control debian/tests/control gen-autopkgtests update-license
update-license:
+ifneq (,$(filter $(distrel),squeeze wheezy jessie stretch buster bullseye bookworm lucid precise trusty xenial bionic focal))
+ @echo "Skipping debian/copyright valdidation for $(distrel), old release."
+else
@cp -p debian/copyright debian/copyright.old
./debian/copyright-generator/copyright-gen.py
@if cmp -s debian/copyright debian/copyright.old; then \
@@ -1187,14 +1190,18 @@
rm -f debian/copyright.old; \
exit 1; \
fi
+endif
+PRE_BUILD_DEP =
ifeq (,$(filter nogen, $(DEB_BUILD_OPTIONS)))
-# Only check control files on amd64, other architectures may have
-# nocheck set by d/rules, e.g. riscv64
+# Only check control files on amd64
ifeq (amd64,$(DEB_HOST_ARCH))
PRE_BUILD_DEP = update-control-files
endif
-else
+endif
+
+# do not check control files if with_check is disabled
+ifneq ($(with_check),yes)
PRE_BUILD_DEP =
endif
@@ -2078,7 +2085,7 @@
dh_builddeb -a $(nodemo) $(nojrez) #$(bd_options)
git_project = jdk21u
-git_tag = jdk-21.0.11+10
+git_tag = jdk-21.0.12+8
package_version = $(shell echo $(PKGVERSION) | sed 's/-[^-][^-]*$$//')
ifneq ($(is_upstream_release),yes)
package_version := $(subst +,~,$(package_version))
diff -Nru openjdk-21-21.0.11+10/debian/tests/problems.csv openjdk-21-21.0.12+8/debian/tests/problems.csv
--- openjdk-21-21.0.11+10/debian/tests/problems.csv 2026-04-24 01:33:16.000000000 +0000
+++ openjdk-21-21.0.12+8/debian/tests/problems.csv 2026-07-16 04:29:37.000000000 +0000
@@ -1,10 +1,8 @@
Test,Bug,Comment,Packages,Arch,Release
-Error: runtime/Unsafe/InternalErrorTest.java,JDK-8335238,"To investigate, not critical for security release – JDK-22 will expire before OO release",:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,i386,:release-all
-Error: serviceability/jvmti/vthread/SuspendResume1/SuspendResume1.java#default,,"Deadlock, new failure, not critical – JDK-22 will expire before OO release",:openjdk-22,ppc64el,:release-all
-FAILED: compiler/arguments/CheckCICompilerCount.java,,"Existing failure (exit code 0, expected 1)",:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,i386,:release-all
+Error: runtime/Unsafe/InternalErrorTest.java,JDK-8335238,"To investigate, not critical for security release – JDK-22 will expire before OO release",:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,i386,:release-all
+FAILED: compiler/arguments/CheckCICompilerCount.java,,"Existing failure (exit code 0, expected 1)",:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,i386,:release-all
FAILED: compiler/codecache/MHIntrinsicAllocFailureTest.java,JDK-8298947,The issue only happens on armhf platform. ,:openjdk-17:openjdk-21,armhf,:release-all
FAILED: gtest/GTestWrapper.java,,"17:UninitializedDoubleElementWorkerDataArrayTest.print_summary_on_test_vm, ",:openjdk-17:openjdk-21,i386,:release-all
-FAILED: java/foreign/critical/TestCritical.java,,"SEGSEGV in test, submit bug, not critical for security release",:openjdk-22,s390x,:release-all
FAILED: java/foreign/StdLibTest.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all
FAILED: java/foreign/TestAddressDereference.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all
FAILED: java/foreign/TestIllegalLink.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all
@@ -12,38 +10,38 @@
FAILED: java/foreign/TestSegments.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all
FAILED: java/foreign/TestUpcallHighArity.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all
FAILED: java/foreign/TestUpcallStructScope.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all
-FAILED: java/io/File/createTempFile/TargetDirectory.java,JDK-8166162,Container issue,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/io/File/GetXSpace.java,,"Container issue, disk space size exceeds 32 bit integer",:openjdk-17:openjdk-21:openjdk-22,:i386:armhf,:release-all
-FAILED: java/nio/channels/FileChannel/directio/DirectIOTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/channels/FileChannel/directio/PreadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/channels/FileChannel/directio/PwriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/channels/FileChannel/directio/ReadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/channels/FileChannel/directio/WriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/attribute/AclFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
+FAILED: java/io/File/createTempFile/TargetDirectory.java,JDK-8166162,Container issue,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/io/File/GetXSpace.java,,"Container issue, disk space size exceeds 32 bit integer",:openjdk-17:openjdk-21:,:i386:armhf,:release-all
+FAILED: java/nio/channels/FileChannel/directio/DirectIOTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/channels/FileChannel/directio/PreadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/channels/FileChannel/directio/PwriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/channels/FileChannel/directio/ReadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/channels/FileChannel/directio/WriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/attribute/AclFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
FAILED: java/nio/file/attribute/BasicFileAttributeView/CreationTime.java,JDK-8166162,Container issue,:openjdk-22,i386,:release-all
-FAILED: java/nio/file/attribute/BasicFileAttributeView/SetTimesNanos.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/attribute/DosFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/attribute/PosixFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/Files/CheckPermissions.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/Files/CopyAndMove.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/Files/CopyMoveVariations.java,JDK-8166162,Container issue,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/Files/FileAttributes.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/Files/InterruptCopy.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/Files/Misc.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/Files/TemporaryFiles.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: java/nio/file/FileStore/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: com/sun/net/httpserver/simpleserver/DocRootDirPermissionsTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
+FAILED: java/nio/file/attribute/BasicFileAttributeView/SetTimesNanos.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/attribute/DosFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/attribute/PosixFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/Files/CheckPermissions.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/Files/CopyAndMove.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/Files/CopyMoveVariations.java,JDK-8166162,Container issue,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/Files/FileAttributes.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/Files/InterruptCopy.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/Files/Misc.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/Files/TemporaryFiles.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: java/nio/file/FileStore/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: com/sun/net/httpserver/simpleserver/DocRootDirPermissionsTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
FAILED: runtime/cds/appcds/jcmd/JCmdTestDynamicDump.java,,flaky test (?) existing comment,:openjdk-17,:arch-all,:release-all
FAILED: runtime/cds/appcds/jcmd/JCmdTestFileSafety.java,,flaky test (?) existing comment,:openjdk-17,i386:arm64:amd64:ppc64el,:release-all
FAILED: runtime/cds/appcds/jcmd/JCmdTestStaticDump.java,,flaky test (?) existing comment,:openjdk-17,:arch-all,:release-all
FAILED: runtime/ErrorHandling/MachCodeFramesInErrorFile.java,,java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code at java.base/java.lang.Long.toHexString(Long.java:309) at,:openjdk-17:openjdk-21,armhf,:release-all
FAILED: runtime/jni/nativeStack/TestNativeStack.java,JDK-8312016,"Backport fix (do not add patch, the fix just disables the test)",:openjdk-lts:openjdk-11:openjdk-17,armhf,:release-all
-FAILED: runtime/LoadClass/LongBCP.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
+FAILED: runtime/LoadClass/LongBCP.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
FAILED: runtime/Monitor/ConcurrentDeflation.java,,LockingMode == 0 (LM_MONITOR) is not fully implemented on this architectureError: Could not create the Java Virtual Machine.,:openjdk-21,armhf,:release-all
-FAILED: runtime/NMT/VirtualAllocCommitMerge.java,JDK-8309698,P4 bug (existing issue),:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,s390x,:release-all
+FAILED: runtime/NMT/VirtualAllocCommitMerge.java,JDK-8309698,P4 bug (existing issue),:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,s390x,:release-all
FAILED: serviceability/AsyncGetCallTrace/MyPackage/ASGCTBaseTest.java,JDK-8303168,Existing bug,:openjdk-21,armhf,:release-all
-FAILED: tools/jlink/JLinkTest.java,JDK-8240349,Bugfix failed for i386 (P4 bug),:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,i386,:release-all
+FAILED: tools/jlink/JLinkTest.java,JDK-8240349,Bugfix failed for i386 (P4 bug),:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,i386,:release-all
FAILED: jdk/javadoc/doclet/dupThrowsTags/TestDupThrowsTags.java,,tests failing due to disable-doclint-by-default.diff (reproducible build maintainer patch),:openjdk-lts:openjdk-11,:arch-all,:release-all
FAILED: jdk/javadoc/doclet/T6735320/T6735320.java,,tests failing due to disable-doclint-by-default.diff (reproducible build maintainer patch),:openjdk-lts:openjdk-11,:arch-all,:release-all
FAILED: jdk/javadoc/doclet/testBadHtml/TestBadHtml.java,,tests failing due to disable-doclint-by-default.diff (reproducible build maintainer patch),:openjdk-lts:openjdk-11,:arch-all,:release-all
@@ -84,24 +82,30 @@
FAILED: java/foreign/TestUpcallStack.java,, asserts due to the invalid structure size. Ignore as this is a preview API and the issue does not occur in openjdk-22. I will add it to the problemlist.,:openjdk-21,:armhf,:release-all
FAILED: java/foreign/TestVarArgs.java,, asserts due to the invalid structure size. Ignore as this is a preview API and the issue does not occur in openjdk-22. I will add it to the problemlist.,:openjdk-21,:armhf,:release-all
FAILED: runtime/os/TestTrimNative.java#trimNative,, java.lang.RuntimeException: We found fewer (periodic) trim lines in UL log than expected (expected at least 13 found 11). This looks like a flaky test - it asserts number of lines from the periodic trimmer e.g. src/hotspot/share/runtime/trimNativeHeap.hpp:56 which causes the test to fail due to the slow VM. Test passes locally.,:openjdk-21,:armhf,:release-all
-FAILED: sun/security/util/Debug/DebugOptions.java,JDK-8339713,Stack overflow error on 32-bit platforms,:openjdk-17:openjdk-21:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:armhf:i386:s390x,:release-all
-Error: jdk/jshell/TerminalNoExecTest.java,,BackingStoreException: Couldn't get file lock - possibly because the LP (non-root) container has no home directory,:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all
-FAILED: applications/ctw/modules/jdk_jfr.java,JDK-8352567, Unimplemented SharedRuntime::generate_jfr_write_checkpoint for S390x, :openjdk-25:openjdk-26:openjdk-27:,:s390x,:release-all
-Error: serviceability/jvmti/thread/SuspendThreadList/suspendthrdlst01/suspendthrdlst01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/ResumeThreadList/resumethrdlst02/resumethrdlst02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/SuspendThread/suspendthrd01/suspendthrd01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/ResumeThreadList/resumethrdlst01/resumethrdlst01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/ResumeThread/resumethrd02/resumethrd02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/ResumeThread/resumethrd01/resumethrd01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/GetThreadState/thrstat02/thrstat02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/GetCurrentContendedMonitor/contmon02/contmon02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/thread/GetCurrentContendedMonitor/contmon01/contmon01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: serviceability/jvmti/SuspendWithCurrentThread/SuspendWithCurrentThread.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: runtime/NMT/SummaryDiffThreadCount.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: runtime/lockStack/TestStackWalk.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: compiler/loopopts/TestRemoveEmptyLoop.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
-Error: jdk/internal/shellsupport/doc/JavadocHelperTest.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all
+FAILED: sun/security/util/Debug/DebugOptions.java,JDK-8339713,Stack overflow error on 32-bit platforms,:openjdk-17:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:armhf:i386:s390x,:release-all
+Error: jdk/jshell/TerminalNoExecTest.java,,BackingStoreException: Couldn't get file lock - possibly because the LP (non-root) container has no home directory,:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:arch-all,:release-all
+FAILED: applications/ctw/modules/jdk_jfr.java,JDK-8352567, Unimplemented SharedRuntime:generate_jfr_write_checkpoint for S390x, :openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:s390x,:release-all
+Error: serviceability/jvmti/thread/SuspendThreadList/suspendthrdlst01/suspendthrdlst01.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/ResumeThreadList/resumethrdlst02/resumethrdlst02.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/SuspendThread/suspendthrd01/suspendthrd01.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/ResumeThreadList/resumethrdlst01/resumethrdlst01.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/ResumeThread/resumethrd02/resumethrd02.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/ResumeThread/resumethrd01/resumethrd01.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/GetThreadState/thrstat02/thrstat02.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/GetCurrentContendedMonitor/contmon02/contmon02.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/thread/GetCurrentContendedMonitor/contmon01/contmon01.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: serviceability/jvmti/SuspendWithCurrentThread/SuspendWithCurrentThread.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: runtime/NMT/SummaryDiffThreadCount.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: runtime/lockStack/TestStackWalk.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: compiler/loopopts/TestRemoveEmptyLoop.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
+Error: jdk/internal/shellsupport/doc/JavadocHelperTest.java,,Takes too long on loong64,:openjdk-21:openjdk-25:openjdk-26:openjdk-27:openjdk-28:,:loong64,:release-all
FAILED: tools/javac/tree/SourceDocTreeScannerTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all
-FAILED: tools/javac/patterns/SOEDeeplyNestedBlocksTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all
+FAILED: tools/javac/tree/SourceTreeScannerTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all
+FAILED: tools/javac/tree/JavacTreeScannerTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all
+FAILED: jdk/jfr/event/oldobject/TestDFSWithSmallStack.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all
+FAILED: tools/javac/patterns/SOEDeeplyNestedBlocksTest.java,JDK-8332619,Test runs out of stack space due to brittle design,:openjdk-21,:armhf:i386:s390x,:release-all
FAILED: tools/javac/tree/TreePosTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all
FAILED: java/time/test/java/time/format/TestUTCParse.java,JDK-8381709,jtreg test initialization issue,:openjdk-11,:arch-all,:release-all
+FAILED: serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java,JDK-8386138,Problemlisted upstream,:openjdk-27:,arch-all,:release-all
+FAILED: compiler/loopopts/superword/TestDoNotFilterNaNSummands.java,JDK-8370408,Known issue in s390x C2,:openjdk-25::openjdk-26::openjdk-27::openjdk-28:,s390x:,:release-all
+FAILED: compiler/loopopts/superword/TestMemorySegmentFilterSummands.java,JDK-8370408,Known issue in s390x C2,:openjdk-25::openjdk-26::openjdk-27::openjdk-28:,s390x:,:release-all
diff -Nru openjdk-21-21.0.11+10/doc/building.html openjdk-21-21.0.12+8/doc/building.html
--- openjdk-21-21.0.11+10/doc/building.html 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/doc/building.html 2026-07-13 06:55:55.000000000 +0000
@@ -598,7 +598,7 @@
(Note that this version is often presented as "MSVC 14.28", and reported
by cl.exe as 19.28.) Older versions will not be accepted by
configure and will not work. The maximum accepted version
-of Visual Studio is 2022.
+of Visual Studio is 2026.
If you have multiple versions of Visual Studio installed,
configure will by default pick the latest. You can request
a specific version to be used by setting
diff -Nru openjdk-21-21.0.11+10/doc/building.md openjdk-21-21.0.12+8/doc/building.md
--- openjdk-21-21.0.11+10/doc/building.md 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/doc/building.md 2026-07-13 06:55:55.000000000 +0000
@@ -389,7 +389,7 @@
The minimum accepted version is Visual Studio 2019 version 16.8. (Note that this
version is often presented as "MSVC 14.28", and reported by cl.exe as 19.28.)
Older versions will not be accepted by `configure` and will not work. The
-maximum accepted version of Visual Studio is 2022.
+maximum accepted version of Visual Studio is 2026.
If you have multiple versions of Visual Studio installed, `configure` will by
default pick the latest. You can request a specific version to be used by
diff -Nru openjdk-21-21.0.11+10/make/Global.gmk openjdk-21-21.0.12+8/make/Global.gmk
--- openjdk-21-21.0.11+10/make/Global.gmk 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/Global.gmk 2026-07-13 06:55:55.000000000 +0000
@@ -103,6 +103,7 @@
$(info $(_) # method is 'auto', 'ignore' or 'fail' (default))
$(info $(_) TEST="test1 ..." # Use the given test descriptor(s) for testing, e.g.)
$(info $(_) # make test TEST="jdk_lang gtest:all")
+ $(info $(_) TEST_DEPS="dependency1 ..." # Specify additional dependencies for running tests, e.g docs-jdk)
$(info $(_) JTREG="OPT1=x;OPT2=y" # Control the JTREG test harness, use 'help' to list)
$(info $(_) GTEST="OPT1=x;OPT2=y" # Control the GTEST test harness, use 'help' to list)
$(info $(_) MICRO="OPT1=x;OPT2=y" # Control the MICRO test harness, use 'help' to list)
diff -Nru openjdk-21-21.0.11+10/make/InitSupport.gmk openjdk-21-21.0.12+8/make/InitSupport.gmk
--- openjdk-21-21.0.11+10/make/InitSupport.gmk 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/InitSupport.gmk 2026-07-13 06:55:55.000000000 +0000
@@ -50,7 +50,7 @@
# Make control variables, handled by Init.gmk
INIT_CONTROL_VARIABLES += LOG CONF CONF_NAME SPEC JOBS TEST_JOBS CONF_CHECK \
- COMPARE_BUILD JTREG GTEST MICRO TEST_OPTS TEST_VM_OPTS
+ COMPARE_BUILD JTREG GTEST MICRO TEST_OPTS TEST_VM_OPTS TEST_DEPS
# All known make control variables
MAKE_CONTROL_VARIABLES := $(INIT_CONTROL_VARIABLES) TEST JDK_FILTER SPEC_FILTER
diff -Nru openjdk-21-21.0.11+10/make/Main.gmk openjdk-21-21.0.12+8/make/Main.gmk
--- openjdk-21-21.0.11+10/make/Main.gmk 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/Main.gmk 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -774,13 +774,13 @@
$(eval $(call SetupTarget, test, \
MAKEFILE := RunTests, \
ARGS := TEST="$(TEST)", \
- DEPS := jdk-image test-image, \
+ DEPS := jdk-image test-image $(TEST_DEPS), \
))
$(eval $(call SetupTarget, exploded-test, \
MAKEFILE := RunTests, \
ARGS := TEST="$(TEST)" JDK_IMAGE_DIR=$(JDK_OUTPUTDIR), \
- DEPS := exploded-image test-image, \
+ DEPS := exploded-image test-image $(TEST_DEPS), \
))
ifeq ($(JCOV_ENABLED), true)
@@ -1061,8 +1061,8 @@
test-make-compile-commands: compile-commands
# Declare dependency for all generated test targets
- $(foreach t, $(filter-out test-make%, $(ALL_TEST_TARGETS)), $(eval $t: jdk-image test-image))
- $(foreach t, $(ALL_EXPLODED_TEST_TARGETS), $(eval $t: exploded-image test-image))
+ $(foreach t, $(filter-out test-make%, $(ALL_TEST_TARGETS)), $(eval $t: jdk-image test-image $(TEST_DEPS)))
+ $(foreach t, $(ALL_EXPLODED_TEST_TARGETS), $(eval $t: exploded-image test-image $(TEST_DEPS)))
interim-image: $(INTERIM_JMOD_TARGETS)
@@ -1293,9 +1293,13 @@
test-hotspot-gtest: exploded-test-gtest
test-jdk-jtreg-native: test-jdk_native_sanity
+# Set dependencies for doc tests
+$(eval $(call AddTestDependency, docs_all, docs-jdk))
+test-docs: test-docs_all
+
ALL_TARGETS += $(RUN_TEST_TARGETS) run-test exploded-run-test check \
test-hotspot-jtreg test-hotspot-jtreg-native test-hotspot-gtest \
- test-jdk-jtreg-native
+ test-jdk-jtreg-native test-docs
################################################################################
################################################################################
diff -Nru openjdk-21-21.0.11+10/make/MainSupport.gmk openjdk-21-21.0.12+8/make/MainSupport.gmk
--- openjdk-21-21.0.11+10/make/MainSupport.gmk 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/MainSupport.gmk 2026-07-13 06:55:55.000000000 +0000
@@ -132,6 +132,15 @@
$(call Clean-include, $1)
endef
+define AddTestDependency
+ test-$(strip $1): $2
+
+ exploded-test-$(strip $1): $2
+
+ ifneq ($(filter $(TEST), $1), )
+ TEST_DEPS += $2
+ endif
+endef
################################################################################
diff -Nru openjdk-21-21.0.11+10/make/RunTests.gmk openjdk-21-21.0.12+8/make/RunTests.gmk
--- openjdk-21-21.0.11+10/make/RunTests.gmk 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/RunTests.gmk 2026-07-13 06:55:55.000000000 +0000
@@ -263,6 +263,7 @@
langtools_JTREG_PROBLEM_LIST += $(TOPDIR)/test/langtools/ProblemList.txt
hotspot_JTREG_PROBLEM_LIST += $(TOPDIR)/test/hotspot/jtreg/ProblemList.txt
lib-test_JTREG_PROBLEM_LIST += $(TOPDIR)/test/lib-test/ProblemList.txt
+docs_JTREG_PROBLEM_LIST += $(TOPDIR)/test/docs/ProblemList.txt
################################################################################
# Parse test selection
@@ -866,6 +867,8 @@
$1_JTREG_BASIC_OPTIONS += -e:TEST_IMAGE_DIR=$(TEST_IMAGE_DIR)
+ $1_JTREG_BASIC_OPTIONS += -e:DOCS_JDK_IMAGE_DIR=$$(DOCS_JDK_IMAGE_DIR)
+
ifneq ($$(JTREG_FAILURE_HANDLER_OPTIONS), )
$1_JTREG_LAUNCHER_OPTIONS += -Djava.library.path="$(JTREG_FAILURE_HANDLER_DIR)"
endif
diff -Nru openjdk-21-21.0.11+10/make/autoconf/basic_tools.m4 openjdk-21-21.0.12+8/make/autoconf/basic_tools.m4
--- openjdk-21-21.0.11+10/make/autoconf/basic_tools.m4 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/autoconf/basic_tools.m4 2026-07-13 06:55:55.000000000 +0000
@@ -148,7 +148,7 @@
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
MAKE_EXPECTED_ENV='cygwin'
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys2"; then
- MAKE_EXPECTED_ENV='msys'
+ MAKE_EXPECTED_ENV='cygwin|msys'
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.wsl1" || test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.wsl2"; then
if test "x$OPENJDK_BUILD_CPU" = "xaarch64"; then
MAKE_EXPECTED_ENV='aarch64-.*-linux-gnu'
@@ -159,7 +159,7 @@
AC_MSG_ERROR([Unknown Windows environment])
fi
MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'`
- IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV`
+ IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP -E $MAKE_EXPECTED_ENV`
else
# Not relevant for non-Windows
IS_MAKE_CORRECT_ENV=true
diff -Nru openjdk-21-21.0.11+10/make/autoconf/toolchain.m4 openjdk-21-21.0.12+8/make/autoconf/toolchain.m4
--- openjdk-21-21.0.11+10/make/autoconf/toolchain.m4 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/autoconf/toolchain.m4 2026-07-13 06:55:55.000000000 +0000
@@ -380,7 +380,7 @@
[
# Restore old path, except for the microsoft toolchain, which requires the
# toolchain path to remain in place. Otherwise the compiler will not work in
- # some siutations in later configure checks.
+ # some situations in later configure checks.
if test "x$TOOLCHAIN_TYPE" != "xmicrosoft"; then
PATH="$OLD_PATH"
fi
@@ -389,10 +389,6 @@
# This is necessary since AC_PROG_CC defaults CFLAGS to "-g -O2"
CFLAGS="$ORG_CFLAGS"
CXXFLAGS="$ORG_CXXFLAGS"
-
- # filter out some unwanted additions autoconf may add to CXX; we saw this on macOS with autoconf 2.72
- UTIL_GET_NON_MATCHING_VALUES(cxx_filtered, $CXX, -std=c++11 -std=gnu++11)
- CXX="$cxx_filtered"
])
# Check if a compiler is of the toolchain type we expect, and save the version
diff -Nru openjdk-21-21.0.11+10/make/autoconf/toolchain_microsoft.m4 openjdk-21-21.0.12+8/make/autoconf/toolchain_microsoft.m4
--- openjdk-21-21.0.11+10/make/autoconf/toolchain_microsoft.m4 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/autoconf/toolchain_microsoft.m4 2026-07-13 06:55:55.000000000 +0000
@@ -25,7 +25,7 @@
################################################################################
# The order of these defines the priority by which we try to find them.
-VALID_VS_VERSIONS="2022 2019"
+VALID_VS_VERSIONS="2022 2019 2026"
VS_DESCRIPTION_2019="Microsoft Visual Studio 2019"
VS_VERSION_INTERNAL_2019=142
@@ -57,6 +57,21 @@
VS_SUPPORTED_2022=true
VS_TOOLSET_SUPPORTED_2022=true
+VS_DESCRIPTION_2026="Microsoft Visual Studio 2026"
+VS_VERSION_INTERNAL_2026=145
+VS_MSVCR_2026=vcruntime140.dll
+VS_VCRUNTIME_1_2026=vcruntime140_1.dll
+VS_MSVCP_2026=msvcp140.dll
+VS_ENVVAR_2026="VS180COMNTOOLS"
+VS_USE_UCRT_2026="true"
+VS_VS_INSTALLDIR_2026="Microsoft Visual Studio/18"
+VS_EDITIONS_2026="BuildTools Community Professional Enterprise"
+VS_SDK_INSTALLDIR_2026=
+VS_VS_PLATFORM_NAME_2026="v145"
+VS_SDK_PLATFORM_NAME_2026=
+VS_SUPPORTED_2026=true
+VS_TOOLSET_SUPPORTED_2026=true
+
################################################################################
AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT],
diff -Nru openjdk-21-21.0.11+10/make/autoconf/util.m4 openjdk-21-21.0.12+8/make/autoconf/util.m4
--- openjdk-21-21.0.11+10/make/autoconf/util.m4 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/autoconf/util.m4 2026-07-13 06:55:55.000000000 +0000
@@ -26,6 +26,70 @@
m4_include([util_paths.m4])
###############################################################################
+# Overwrite the existing version of AC_PROG_CC with our own custom variant.
+# Unlike the regular AC_PROG_CC, the compiler list must always be passed.
+AC_DEFUN([AC_PROG_CC],
+[
+ AC_LANG_PUSH(C)
+ AC_ARG_VAR([CC], [C compiler command])
+ AC_ARG_VAR([CFLAGS], [C compiler flags])
+
+ _AC_ARG_VAR_LDFLAGS()
+ _AC_ARG_VAR_LIBS()
+ _AC_ARG_VAR_CPPFLAGS()
+
+ AC_CHECK_TOOLS(CC, [$1])
+
+ test -z "$CC" && AC_MSG_FAILURE([no acceptable C compiler found in \$PATH])
+
+ # Provide some information about the compiler.
+ _AS_ECHO_LOG([checking for _AC_LANG compiler version])
+ set X $ac_compile
+ ac_compiler=$[2]
+ for ac_option in --version -v -V -qversion -version; do
+ _AC_DO_LIMIT([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD])
+ done
+
+ m4_expand_once([_AC_COMPILER_EXEEXT])
+ m4_expand_once([_AC_COMPILER_OBJEXT])
+
+ _AC_PROG_CC_G
+
+ AC_LANG_POP(C)
+])
+
+###############################################################################
+# Overwrite the existing version of AC_PROG_CXX with our own custom variant.
+# Unlike the regular AC_PROG_CXX, the compiler list must always be passed.
+AC_DEFUN([AC_PROG_CXX],
+[
+ AC_LANG_PUSH(C++)
+ AC_ARG_VAR([CXX], [C++ compiler command])
+ AC_ARG_VAR([CXXFLAGS], [C++ compiler flags])
+
+ _AC_ARG_VAR_LDFLAGS()
+ _AC_ARG_VAR_LIBS()
+ _AC_ARG_VAR_CPPFLAGS()
+
+ AC_CHECK_TOOLS(CXX, [$1])
+
+ # Provide some information about the compiler.
+ _AS_ECHO_LOG([checking for _AC_LANG compiler version])
+ set X $ac_compile
+ ac_compiler=$[2]
+ for ac_option in --version -v -V -qversion; do
+ _AC_DO_LIMIT([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD])
+ done
+
+ m4_expand_once([_AC_COMPILER_EXEEXT])
+ m4_expand_once([_AC_COMPILER_OBJEXT])
+
+ _AC_PROG_CXX_G
+
+ AC_LANG_POP(C++)
+])
+
+################################################################################
# Create a function/macro that takes a series of named arguments. The call is
# similar to AC_DEFUN, but the setup of the function looks like this:
# UTIL_DEFUN_NAMED([MYFUNC], [FOO *BAR], [$@], [
diff -Nru openjdk-21-21.0.11+10/make/common/FindTests.gmk openjdk-21-21.0.12+8/make/common/FindTests.gmk
--- openjdk-21-21.0.11+10/make/common/FindTests.gmk 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/common/FindTests.gmk 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -43,7 +43,7 @@
TEST_BASEDIRS += $(TOPDIR)/test $(TOPDIR)
# JTREG_TESTROOTS might have been set by a custom extension
-JTREG_TESTROOTS += $(addprefix $(TOPDIR)/test/, hotspot/jtreg jdk langtools jaxp lib-test)
+JTREG_TESTROOTS += $(addprefix $(TOPDIR)/test/, hotspot/jtreg jdk langtools jaxp lib-test docs)
# Extract the names of the Jtreg group files from the TEST.ROOT files. The
# TEST.ROOT files being properties files can be interpreted as makefiles so
diff -Nru openjdk-21-21.0.11+10/make/conf/github-actions.conf openjdk-21-21.0.12+8/make/conf/github-actions.conf
--- openjdk-21-21.0.11+10/make/conf/github-actions.conf 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/conf/github-actions.conf 2026-07-13 06:55:55.000000000 +0000
@@ -29,17 +29,17 @@
JTREG_VERSION=7.5.2+1
LINUX_X64_BOOT_JDK_EXT=tar.gz
-LINUX_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.6%2B7/OpenJDK21U-jdk_x64_linux_hotspot_21.0.6_7.tar.gz
-LINUX_X64_BOOT_JDK_SHA256=a2650fba422283fbed20d936ce5d2a52906a5414ec17b2f7676dddb87201dbae
+LINUX_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_linux_hotspot_21.0.11_10.tar.gz
+LINUX_X64_BOOT_JDK_SHA256=4b2220e232a97997b436ca6ab15cbf70171ecff52958a46159dfa5a8c44ca4de
MACOS_AARCH64_BOOT_JDK_EXT=tar.gz
-MACOS_AARCH64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.6%2B7/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.6_7.tar.gz
-MACOS_AARCH64_BOOT_JDK_SHA256=4ef4083919126a3d93e603284b405c7493905497485a92b375f5d6c3e8f7e8f2
+MACOS_AARCH64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_aarch64_mac_hotspot_21.0.11_10.tar.gz
+MACOS_AARCH64_BOOT_JDK_SHA256=6ebcf221c9b41507b14c098e93c6ead6440b8d9bd154f8ec666c4c73abbdb201
MACOS_X64_BOOT_JDK_EXT=tar.gz
-MACOS_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.6%2B7/OpenJDK21U-jdk_x64_mac_hotspot_21.0.6_7.tar.gz
-MACOS_X64_BOOT_JDK_SHA256=7aacfc400078ad65b7c7de3ec75ff74bf5c2077d6740b350f85ae10be4f71e76
+MACOS_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_mac_hotspot_21.0.11_10.tar.gz
+MACOS_X64_BOOT_JDK_SHA256=34180eb03e6d207c388cce3da668f6cc7cd7508c185c24782fadac2c9c0e66f9
WINDOWS_X64_BOOT_JDK_EXT=zip
-WINDOWS_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.6%2B7/OpenJDK21U-jdk_x64_windows_hotspot_21.0.6_7.zip
-WINDOWS_X64_BOOT_JDK_SHA256=897c8eebb0f85a99ccecbd482ebae9a45d88c19d6077054f6529ebab49b6d259
+WINDOWS_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_x64_windows_hotspot_21.0.11_10.zip
+WINDOWS_X64_BOOT_JDK_SHA256=d3625e7cadf23787ea540229544b6e2ab494b3b54da1801879e583e1dfee0a64
diff -Nru openjdk-21-21.0.11+10/make/conf/jib-profiles.js openjdk-21-21.0.12+8/make/conf/jib-profiles.js
--- openjdk-21-21.0.11+10/make/conf/jib-profiles.js 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/conf/jib-profiles.js 2026-07-13 06:55:55.000000000 +0000
@@ -952,7 +952,7 @@
// Profiles used to run tests using Jib for internal dependencies.
var testedProfile = input.testedProfile;
- if (testedProfile == null) {
+ if (testedProfile == null || testedProfile == "docs") {
testedProfile = input.build_os + "-" + input.build_cpu;
}
var testedProfileJdk = testedProfile + ".jdk";
@@ -994,25 +994,38 @@
testOnlyProfilesPrebuilt["run-test-prebuilt"]["dependencies"].push(testedProfile + ".jdk_symbols");
}
+ var testOnlyProfilesPrebuiltDocs = {
+ "run-test-prebuilt-docs": clone(testOnlyProfilesPrebuilt["run-test-prebuilt"])
+ };
+
+ testOnlyProfilesPrebuiltDocs["run-test-prebuilt-docs"].dependencies.push("docs.doc_api_spec", "tidy");
+ testOnlyProfilesPrebuiltDocs["run-test-prebuilt-docs"].environment["DOCS_JDK_IMAGE_DIR"]
+ = input.get("docs.doc_api_spec", "install_path");
+ testOnlyProfilesPrebuiltDocs["run-test-prebuilt-docs"].environment["TIDY"]
+ = input.get("tidy", "home_path") + "/bin/tidy";
+ testOnlyProfilesPrebuiltDocs["run-test-prebuilt-docs"].labels = "test-docs";
+
// If actually running the run-test-prebuilt profile, verify that the input
// variable is valid and if so, add the appropriate target_* values from
// the tested profile. Use testImageProfile value as backup.
- if (input.profile == "run-test-prebuilt") {
+ if (input.profile == "run-test-prebuilt" || input.profile == "run-test-prebuilt-docs") {
if (profiles[testedProfile] == null && profiles[testImageProfile] == null) {
error("testedProfile is not defined: " + testedProfile + " " + testImageProfile);
}
}
- if (profiles[testedProfile] != null) {
- testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
- = profiles[testedProfile]["target_os"];
- testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
- = profiles[testedProfile]["target_cpu"];
- } else if (profiles[testImageProfile] != null) {
- testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
- = profiles[testImageProfile]["target_os"];
- testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
- = profiles[testImageProfile]["target_cpu"];
+ function updateProfileTargets(profiles, testedProfile, testImageProfile, targetProfile, runTestProfile) {
+ var profileToCheck = profiles[testedProfile] || profiles[testImageProfile];
+
+ if (profileToCheck != null) {
+ targetProfile[runTestProfile]["target_os"] = profileToCheck["target_os"];
+ targetProfile[runTestProfile]["target_cpu"] = profileToCheck["target_cpu"];
+ }
}
+
+ updateProfileTargets(profiles, testedProfile, testImageProfile, testOnlyProfilesPrebuilt, "run-test-prebuilt");
+ updateProfileTargets(profiles, testedProfile, testImageProfile, testOnlyProfilesPrebuiltDocs, "run-test-prebuilt-docs");
+
+ profiles = concatObjects(profiles, testOnlyProfilesPrebuiltDocs);
profiles = concatObjects(profiles, testOnlyProfilesPrebuilt);
// On macosx add the devkit bin dir to the path in all the run-test profiles.
@@ -1062,6 +1075,8 @@
}
profiles["run-test-prebuilt"] = concatObjects(profiles["run-test-prebuilt"],
runTestPrebuiltSrcFullExtra);
+ profiles["run-test-prebuilt-docs"] = concatObjects(profiles["run-test-prebuilt-docs"],
+ runTestPrebuiltSrcFullExtra);
}
// Generate the missing platform attributes
diff -Nru openjdk-21-21.0.11+10/make/conf/version-numbers.conf openjdk-21-21.0.12+8/make/conf/version-numbers.conf
--- openjdk-21-21.0.11+10/make/conf/version-numbers.conf 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/make/conf/version-numbers.conf 2026-07-13 06:55:55.000000000 +0000
@@ -28,12 +28,12 @@
DEFAULT_VERSION_FEATURE=21
DEFAULT_VERSION_INTERIM=0
-DEFAULT_VERSION_UPDATE=11
+DEFAULT_VERSION_UPDATE=12
DEFAULT_VERSION_PATCH=0
DEFAULT_VERSION_EXTRA1=0
DEFAULT_VERSION_EXTRA2=0
DEFAULT_VERSION_EXTRA3=0
-DEFAULT_VERSION_DATE=2026-04-21
+DEFAULT_VERSION_DATE=2026-07-21
DEFAULT_VERSION_CLASSFILE_MAJOR=65 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
DEFAULT_VERSION_CLASSFILE_MINOR=0
DEFAULT_VERSION_DOCS_API_SINCE=11
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/arm_32.ad openjdk-21-21.0.12+8/src/hotspot/cpu/arm/arm_32.ad
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/arm_32.ad 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/arm_32.ad 2026-07-13 06:55:55.000000000 +0000
@@ -62,22 +62,22 @@
// Integer/Long Registers
// ----------------------------
-reg_def R_R0 (SOC, SOC, Op_RegI, 0, R(0)->as_VMReg());
-reg_def R_R1 (SOC, SOC, Op_RegI, 1, R(1)->as_VMReg());
-reg_def R_R2 (SOC, SOC, Op_RegI, 2, R(2)->as_VMReg());
-reg_def R_R3 (SOC, SOC, Op_RegI, 3, R(3)->as_VMReg());
-reg_def R_R4 (SOC, SOE, Op_RegI, 4, R(4)->as_VMReg());
-reg_def R_R5 (SOC, SOE, Op_RegI, 5, R(5)->as_VMReg());
-reg_def R_R6 (SOC, SOE, Op_RegI, 6, R(6)->as_VMReg());
-reg_def R_R7 (SOC, SOE, Op_RegI, 7, R(7)->as_VMReg());
-reg_def R_R8 (SOC, SOE, Op_RegI, 8, R(8)->as_VMReg());
-reg_def R_R9 (SOC, SOE, Op_RegI, 9, R(9)->as_VMReg());
-reg_def R_R10(NS, SOE, Op_RegI, 10, R(10)->as_VMReg());
-reg_def R_R11(NS, SOE, Op_RegI, 11, R(11)->as_VMReg());
-reg_def R_R12(SOC, SOC, Op_RegI, 12, R(12)->as_VMReg());
-reg_def R_R13(NS, NS, Op_RegI, 13, R(13)->as_VMReg());
-reg_def R_R14(SOC, SOC, Op_RegI, 14, R(14)->as_VMReg());
-reg_def R_R15(NS, NS, Op_RegI, 15, R(15)->as_VMReg());
+reg_def R_R0 (SOC, SOC, Op_RegI, 0, as_Register(0)->as_VMReg());
+reg_def R_R1 (SOC, SOC, Op_RegI, 1, as_Register(1)->as_VMReg());
+reg_def R_R2 (SOC, SOC, Op_RegI, 2, as_Register(2)->as_VMReg());
+reg_def R_R3 (SOC, SOC, Op_RegI, 3, as_Register(3)->as_VMReg());
+reg_def R_R4 (SOC, SOE, Op_RegI, 4, as_Register(4)->as_VMReg());
+reg_def R_R5 (SOC, SOE, Op_RegI, 5, as_Register(5)->as_VMReg());
+reg_def R_R6 (SOC, SOE, Op_RegI, 6, as_Register(6)->as_VMReg());
+reg_def R_R7 (SOC, SOE, Op_RegI, 7, as_Register(7)->as_VMReg());
+reg_def R_R8 (SOC, SOE, Op_RegI, 8, as_Register(8)->as_VMReg());
+reg_def R_R9 (SOC, SOE, Op_RegI, 9, as_Register(9)->as_VMReg());
+reg_def R_R10(NS, SOE, Op_RegI, 10, as_Register(10)->as_VMReg());
+reg_def R_R11(NS, SOE, Op_RegI, 11, as_Register(11)->as_VMReg());
+reg_def R_R12(SOC, SOC, Op_RegI, 12, as_Register(12)->as_VMReg());
+reg_def R_R13(NS, NS, Op_RegI, 13, as_Register(13)->as_VMReg());
+reg_def R_R14(SOC, SOC, Op_RegI, 14, as_Register(14)->as_VMReg());
+reg_def R_R15(NS, NS, Op_RegI, 15, as_Register(15)->as_VMReg());
// ----------------------------
// Float/Double Registers
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/assembler_arm_32.hpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/assembler_arm_32.hpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/assembler_arm_32.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/assembler_arm_32.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -114,7 +114,7 @@
}
RegisterSet(Register first, Register last) {
- assert(first < last, "encoding constraint");
+ assert(first->encoding() < last->encoding(), "encoding constraint");
_encoding = (1 << (last->encoding() + 1)) - (1 << first->encoding());
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/c1_CodeStubs_arm.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/c1_CodeStubs_arm.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/c1_CodeStubs_arm.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/c1_CodeStubs_arm.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -182,7 +182,7 @@
const Register lock_reg = _lock_reg->as_pointer_register();
ce->verify_reserved_argument_area_size(2);
- if (obj_reg < lock_reg) {
+ if (obj_reg->encoding() < lock_reg->encoding()) {
__ stmia(SP, RegisterSet(obj_reg) | RegisterSet(lock_reg));
} else {
__ str(obj_reg, Address(SP));
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -152,8 +152,14 @@
int monitor_offset = (method()->max_locals() + 2 * (number_of_locks - 1)) * BytesPerWord;
for (int i = 0; i < number_of_locks; i++) {
int slot_offset = monitor_offset - (i * 2 * BytesPerWord);
- __ ldr(R1, Address(OSR_buf, slot_offset + 0*BytesPerWord));
- __ ldr(R2, Address(OSR_buf, slot_offset + 1*BytesPerWord));
+ if (slot_offset >= 4096 - BytesPerWord) {
+ __ add_slow(R2, OSR_buf, slot_offset);
+ __ ldr(R1, Address(R2, 0*BytesPerWord));
+ __ ldr(R2, Address(R2, 1*BytesPerWord));
+ } else {
+ __ ldr(R1, Address(OSR_buf, slot_offset + 0*BytesPerWord));
+ __ ldr(R2, Address(OSR_buf, slot_offset + 1*BytesPerWord));
+ }
__ str(R1, frame_map()->address_for_monitor_lock(i));
__ str(R2, frame_map()->address_for_monitor_object(i));
}
@@ -2653,11 +2659,11 @@
const Register src_hi = src->as_register_hi();
assert(addr->index()->is_illegal() && addr->disp() == 0, "The address is simple already");
- if (src_lo < src_hi) {
+ if (src_lo->encoding() < src_hi->encoding()) {
null_check_offset = __ offset();
__ stmia(addr->base()->as_register(), RegisterSet(src_lo) | RegisterSet(src_hi));
} else {
- assert(src_lo < Rtemp, "Rtemp is higher than any allocatable register");
+ assert(src_lo->encoding() < Rtemp->encoding(), "Rtemp is higher than any allocatable register");
__ mov(Rtemp, src_hi);
null_check_offset = __ offset();
__ stmia(addr->base()->as_register(), RegisterSet(src_lo) | RegisterSet(Rtemp));
@@ -2670,10 +2676,10 @@
assert(addr->index()->is_illegal() && addr->disp() == 0, "The address is simple already");
null_check_offset = __ offset();
- if (dest_lo < dest_hi) {
+ if (dest_lo->encoding() < dest_hi->encoding()) {
__ ldmia(addr->base()->as_register(), RegisterSet(dest_lo) | RegisterSet(dest_hi));
} else {
- assert(dest_lo < Rtemp, "Rtemp is higher than any allocatable register");
+ assert(dest_lo->encoding() < Rtemp->encoding(), "Rtemp is higher than any allocatable register");
__ ldmia(addr->base()->as_register(), RegisterSet(dest_lo) | RegisterSet(Rtemp));
__ mov(dest_hi, Rtemp);
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/interp_masm_arm.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/interp_masm_arm.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/interp_masm_arm.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/interp_masm_arm.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -406,7 +406,7 @@
void InterpreterMacroAssembler::pop_l(Register lo, Register hi) {
assert_different_registers(lo, hi);
- assert(lo < hi, "lo must be < hi");
+ assert(lo->encoding() < hi->encoding(), "lo must be < hi");
pop(RegisterSet(lo) | RegisterSet(hi));
}
@@ -456,7 +456,7 @@
void InterpreterMacroAssembler::push_l(Register lo, Register hi) {
assert_different_registers(lo, hi);
- assert(lo < hi, "lo must be < hi");
+ assert(lo->encoding() < hi->encoding(), "lo must be < hi");
push(RegisterSet(lo) | RegisterSet(hi));
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/register_arm.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/register_arm.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/register_arm.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/register_arm.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -26,12 +26,19 @@
#include "register_arm.hpp"
#include "utilities/debug.hpp"
-const int ConcreteRegisterImpl::max_gpr = ConcreteRegisterImpl::num_gpr;
-const int ConcreteRegisterImpl::max_fpr = ConcreteRegisterImpl::num_fpr +
- ConcreteRegisterImpl::max_gpr;
+Register::RegisterImpl all_RegisterImpls [Register::number_of_registers + 1];
+FloatRegister::FloatRegisterImpl all_FloatRegisterImpls [FloatRegister::number_of_registers + 1];
+VFPSystemRegister::VFPSystemRegisterImpl all_VFPSystemRegisterImpls [VFPSystemRegister::number_of_registers + 1] {
+ { -1 }, //vfpsnoreg
+ { VFPSystemRegister::FPSID },
+ { VFPSystemRegister::FPSCR },
+ { VFPSystemRegister::MVFR0 },
+ { VFPSystemRegister::MVFR1 }
+};
-const char* RegisterImpl::name() const {
- const char* names[number_of_registers] = {
+const char* Register::RegisterImpl::name() const {
+ static const char* names[number_of_registers + 1] = {
+ "noreg",
"r0", "r1", "r2", "r3", "r4", "r5", "r6",
#if (FP_REG_NUM == 7)
"fp",
@@ -46,13 +53,14 @@
#endif
"r12", "sp", "lr", "pc"
};
- return is_valid() ? names[encoding()] : "noreg";
+ return names[encoding() + 1];
}
-const char* FloatRegisterImpl::name() const {
- const char* names[number_of_registers] = {
- "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
- "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
+const char* FloatRegister::FloatRegisterImpl::name() const {
+ static const char* names[number_of_registers + 1] = {
+ "fnoreg",
+ "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
+ "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
"s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
"s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31"
#ifdef COMPILER2
@@ -62,5 +70,5 @@
"s56", "s57?","s58", "s59?","s60", "s61?","s62", "s63?"
#endif
};
- return is_valid() ? names[encoding()] : "fnoreg";
+ return names[encoding() + 1];
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/register_arm.hpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/register_arm.hpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/register_arm.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/register_arm.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -31,26 +31,6 @@
class VMRegImpl;
typedef VMRegImpl* VMReg;
-// These are declared ucontext.h
-#undef R0
-#undef R1
-#undef R2
-#undef R3
-#undef R4
-#undef R5
-#undef R6
-#undef R7
-#undef R8
-#undef R9
-#undef R10
-#undef R11
-#undef R12
-#undef R13
-#undef R14
-#undef R15
-
-#define R(r) ((Register)(r))
-
/////////////////////////////////
// Support for different ARM ABIs
// Note: default ABI is for linux
@@ -94,25 +74,86 @@
#define ALIGN_WIDE_ARGUMENTS 1
#endif
-#define R0 ((Register)0)
-#define R1 ((Register)1)
-#define R2 ((Register)2)
-#define R3 ((Register)3)
-#define R4 ((Register)4)
-#define R5 ((Register)5)
-#define R6 ((Register)6)
-#define R7 ((Register)7)
-#define R8 ((Register)8)
-#define R9 ((Register)9)
-#define R10 ((Register)10)
-#define R11 ((Register)11)
-#define R12 ((Register)12)
-#define R13 ((Register)13)
-#define R14 ((Register)14)
-#define R15 ((Register)15)
+class Register {
+ private:
+ int _encoding;
+
+ constexpr explicit Register(int encoding) : _encoding(encoding) {}
+
+ public:
+ enum {
+ number_of_registers = 16,
+ max_slots_per_register = 1
+ };
+
+ class RegisterImpl : public AbstractRegisterImpl {
+ friend class Register;
+
+ static constexpr const RegisterImpl* first();
+
+ public:
+
+ // accessors and testers
+ int raw_encoding() const { return this - first(); }
+ int encoding() const { assert(is_valid(), "invalid register"); return raw_encoding(); }
+ bool is_valid() const { return 0 <= raw_encoding() && raw_encoding() < number_of_registers; }
+ inline Register successor() const;
-#define FP ((Register)FP_REG_NUM)
+ VMReg as_VMReg() const;
+
+ const char* name() const;
+ };
+
+
+ inline friend constexpr Register as_Register(int encoding);
+
+ constexpr Register() : _encoding(-1) {} //noreg
+
+ int operator==(const Register r) const { return _encoding == r._encoding; }
+ int operator!=(const Register r) const { return _encoding != r._encoding; }
+
+ const RegisterImpl* operator->() const { return RegisterImpl::first() + _encoding; }
+};
+
+extern Register::RegisterImpl all_RegisterImpls[Register::number_of_registers + 1] INTERNAL_VISIBILITY;
+
+inline constexpr const Register::RegisterImpl* Register::RegisterImpl::first() {
+ return all_RegisterImpls + 1;
+}
+
+constexpr Register noreg = Register();
+
+inline constexpr Register as_Register(int encoding) {
+ if (0 <= encoding && encoding < Register::number_of_registers) {
+ return Register(encoding);
+ }
+ return noreg;
+}
+
+inline Register Register::RegisterImpl::successor() const {
+ assert(is_valid(), "sainty");
+ return as_Register(encoding() + 1);
+}
+
+constexpr Register R0 = as_Register( 0);
+constexpr Register R1 = as_Register( 1);
+constexpr Register R2 = as_Register( 2);
+constexpr Register R3 = as_Register( 3);
+constexpr Register R4 = as_Register( 4);
+constexpr Register R5 = as_Register( 5);
+constexpr Register R6 = as_Register( 6);
+constexpr Register R7 = as_Register( 7);
+constexpr Register R8 = as_Register( 8);
+constexpr Register R9 = as_Register( 9);
+constexpr Register R10 = as_Register(10);
+constexpr Register R11 = as_Register(11);
+constexpr Register R12 = as_Register(12);
+constexpr Register R13 = as_Register(13);
+constexpr Register R14 = as_Register(14);
+constexpr Register R15 = as_Register(15);
+
+constexpr Register FP = as_Register(FP_REG_NUM);
// Safe use of registers which may be FP on some platforms.
//
@@ -122,282 +163,340 @@
// as FP on supported ABIs (and replace R# by altFP_#_11). altFP_#_11
// must be #define to R11 if and only if # is FP_REG_NUM.
#if (FP_REG_NUM == 7)
-#define altFP_7_11 ((Register)11)
+constexpr Register altFP_7_11 = R11;
#else
-#define altFP_7_11 ((Register)7)
+constexpr Register altFP_7_11 = R7;
#endif
-#define SP R13
-#define LR R14
-#define PC R15
+constexpr Register SP = R13;
+constexpr Register LR = R14;
+constexpr Register PC = R15;
-class RegisterImpl;
-typedef RegisterImpl* Register;
+class FloatRegister {
+ private:
+ int _encoding;
-inline Register as_Register(int encoding) {
- return (Register)(intptr_t)encoding;
-}
+ constexpr explicit FloatRegister(int encoding) : _encoding(encoding) {}
-class RegisterImpl : public AbstractRegisterImpl {
public:
enum {
- number_of_registers = 16
+ number_of_registers = NOT_COMPILER2(32) COMPILER2_PRESENT(64),
+ max_slots_per_register = 1
};
- Register successor() const { return as_Register(encoding() + 1); }
+ class FloatRegisterImpl : public AbstractRegisterImpl {
+ friend class FloatRegister;
- inline friend Register as_Register(int encoding);
+ static constexpr const FloatRegisterImpl* first();
- VMReg as_VMReg();
+ public:
- // accessors
- int encoding() const { assert(is_valid(), "invalid register"); return value(); }
- const char* name() const;
+ // accessors and testers
+ int raw_encoding() const { return this - first(); }
+ int encoding() const { assert(is_valid(), "invalid register"); return raw_encoding(); }
+ bool is_valid() const { return 0 <= raw_encoding() && raw_encoding() < number_of_registers; }
+ inline FloatRegister successor() const;
- // testers
- bool is_valid() const { return 0 <= value() && value() < number_of_registers; }
+ VMReg as_VMReg() const;
-};
-
-CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1));
+ int hi_bits() const {
+ return (encoding() >> 1) & 0xf;
+ }
+ int lo_bit() const {
+ return encoding() & 1;
+ }
-// Use FloatRegister as shortcut
-class FloatRegisterImpl;
-typedef FloatRegisterImpl* FloatRegister;
+ int hi_bit() const {
+ return encoding() >> 5;
+ }
-inline FloatRegister as_FloatRegister(int encoding) {
- return (FloatRegister)(intptr_t)encoding;
-}
-
-class FloatRegisterImpl : public AbstractRegisterImpl {
- public:
- enum {
- number_of_registers = NOT_COMPILER2(32) COMPILER2_PRESENT(64)
+ const char* name() const;
};
- inline friend FloatRegister as_FloatRegister(int encoding);
+ inline friend constexpr FloatRegister as_FloatRegister(int encoding);
- VMReg as_VMReg();
+ constexpr FloatRegister() : _encoding(-1) {} // fnoreg
- int encoding() const { assert(is_valid(), "invalid register"); return value(); }
- bool is_valid() const { return 0 <= (intx)this && (intx)this < number_of_registers; }
- FloatRegister successor() const { return as_FloatRegister(encoding() + 1); }
+ int operator==(const FloatRegister r) const { return _encoding == r._encoding; }
+ int operator!=(const FloatRegister r) const { return _encoding != r._encoding; }
- const char* name() const;
+ const FloatRegisterImpl* operator->() const { return FloatRegisterImpl::first() + _encoding; }
+};
- int hi_bits() const {
- return (encoding() >> 1) & 0xf;
- }
+extern FloatRegister::FloatRegisterImpl all_FloatRegisterImpls[FloatRegister::number_of_registers + 1] INTERNAL_VISIBILITY;
- int lo_bit() const {
- return encoding() & 1;
- }
+inline constexpr const FloatRegister::FloatRegisterImpl* FloatRegister::FloatRegisterImpl::first() {
+ return all_FloatRegisterImpls + 1;
+}
- int hi_bit() const {
- return encoding() >> 5;
+constexpr FloatRegister fnoreg = FloatRegister();
+
+inline constexpr FloatRegister as_FloatRegister(int encoding) {
+ if (0 <= encoding && encoding < FloatRegister::number_of_registers) {
+ return FloatRegister(encoding);
}
-};
+ return fnoreg;
+}
-CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg, (-1));
+inline FloatRegister FloatRegister::FloatRegisterImpl::successor() const {
+ assert(is_valid(), "sainty");
+ return as_FloatRegister(encoding() + 1);
+}
/*
* S1-S6 are named with "_reg" suffix to avoid conflict with
* constants defined in sharedRuntimeTrig.cpp
*/
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S0, ( 0));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S1_reg, ( 1));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S2_reg, ( 2));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S3_reg, ( 3));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S4_reg, ( 4));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S5_reg, ( 5));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S6_reg, ( 6));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S7, ( 7));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S8, ( 8));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S9, ( 9));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S10, (10));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S11, (11));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S12, (12));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S13, (13));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S14, (14));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S15, (15));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S16, (16));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S17, (17));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S18, (18));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S19, (19));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S20, (20));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S21, (21));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S22, (22));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S23, (23));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S24, (24));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S25, (25));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S26, (26));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S27, (27));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S28, (28));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S29, (29));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S30, (30));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, S31, (31));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, Stemp, (30));
-
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D0, ( 0));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D1, ( 2));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D2, ( 4));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D3, ( 6));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D4, ( 8));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D5, ( 10));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D6, ( 12));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D7, ( 14));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D8, ( 16));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D9, ( 18));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D10, ( 20));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D11, ( 22));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D12, ( 24));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D13, ( 26));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D14, ( 28));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D15, (30));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D16, (32));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D17, (34));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D18, (36));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D19, (38));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D20, (40));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D21, (42));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D22, (44));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D23, (46));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D24, (48));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D25, (50));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D26, (52));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D27, (54));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D28, (56));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D29, (58));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D30, (60));
-CONSTANT_REGISTER_DECLARATION(FloatRegister, D31, (62));
+constexpr FloatRegister S0 = as_FloatRegister( 0);
+constexpr FloatRegister S1_reg = as_FloatRegister(1);
+constexpr FloatRegister S2_reg = as_FloatRegister(2);
+constexpr FloatRegister S3_reg = as_FloatRegister(3);
+constexpr FloatRegister S4_reg = as_FloatRegister(4);
+constexpr FloatRegister S5_reg = as_FloatRegister(5);
+constexpr FloatRegister S6_reg = as_FloatRegister(6);
+constexpr FloatRegister S7 = as_FloatRegister( 7);
+constexpr FloatRegister S8 = as_FloatRegister( 8);
+constexpr FloatRegister S9 = as_FloatRegister( 9);
+constexpr FloatRegister S10 = as_FloatRegister(10);
+constexpr FloatRegister S11 = as_FloatRegister(11);
+constexpr FloatRegister S12 = as_FloatRegister(12);
+constexpr FloatRegister S13 = as_FloatRegister(13);
+constexpr FloatRegister S14 = as_FloatRegister(14);
+constexpr FloatRegister S15 = as_FloatRegister(15);
+constexpr FloatRegister S16 = as_FloatRegister(16);
+constexpr FloatRegister S17 = as_FloatRegister(17);
+constexpr FloatRegister S18 = as_FloatRegister(18);
+constexpr FloatRegister S19 = as_FloatRegister(19);
+constexpr FloatRegister S20 = as_FloatRegister(20);
+constexpr FloatRegister S21 = as_FloatRegister(21);
+constexpr FloatRegister S22 = as_FloatRegister(22);
+constexpr FloatRegister S23 = as_FloatRegister(23);
+constexpr FloatRegister S24 = as_FloatRegister(24);
+constexpr FloatRegister S25 = as_FloatRegister(25);
+constexpr FloatRegister S26 = as_FloatRegister(26);
+constexpr FloatRegister S27 = as_FloatRegister(27);
+constexpr FloatRegister S28 = as_FloatRegister(28);
+constexpr FloatRegister S29 = as_FloatRegister(29);
+constexpr FloatRegister S30 = as_FloatRegister(30);
+constexpr FloatRegister S31 = as_FloatRegister(31);
+constexpr FloatRegister Stemp = S30;
+
+constexpr FloatRegister D0 = as_FloatRegister( 0);
+constexpr FloatRegister D1 = as_FloatRegister( 2);
+constexpr FloatRegister D2 = as_FloatRegister( 4);
+constexpr FloatRegister D3 = as_FloatRegister( 6);
+constexpr FloatRegister D4 = as_FloatRegister( 8);
+constexpr FloatRegister D5 = as_FloatRegister(10);
+constexpr FloatRegister D6 = as_FloatRegister(12);
+constexpr FloatRegister D7 = as_FloatRegister(14);
+constexpr FloatRegister D8 = as_FloatRegister(16);
+constexpr FloatRegister D9 = as_FloatRegister(18);
+constexpr FloatRegister D10 = as_FloatRegister(20);
+constexpr FloatRegister D11 = as_FloatRegister(22);
+constexpr FloatRegister D12 = as_FloatRegister(24);
+constexpr FloatRegister D13 = as_FloatRegister(26);
+constexpr FloatRegister D14 = as_FloatRegister(28);
+constexpr FloatRegister D15 = as_FloatRegister(30);
+constexpr FloatRegister D16 = as_FloatRegister(32);
+constexpr FloatRegister D17 = as_FloatRegister(34);
+constexpr FloatRegister D18 = as_FloatRegister(36);
+constexpr FloatRegister D19 = as_FloatRegister(38);
+constexpr FloatRegister D20 = as_FloatRegister(40);
+constexpr FloatRegister D21 = as_FloatRegister(42);
+constexpr FloatRegister D22 = as_FloatRegister(44);
+constexpr FloatRegister D23 = as_FloatRegister(46);
+constexpr FloatRegister D24 = as_FloatRegister(48);
+constexpr FloatRegister D25 = as_FloatRegister(50);
+constexpr FloatRegister D26 = as_FloatRegister(52);
+constexpr FloatRegister D27 = as_FloatRegister(54);
+constexpr FloatRegister D28 = as_FloatRegister(56);
+constexpr FloatRegister D29 = as_FloatRegister(58);
+constexpr FloatRegister D30 = as_FloatRegister(60);
+constexpr FloatRegister D31 = as_FloatRegister(62);
class ConcreteRegisterImpl : public AbstractRegisterImpl {
public:
enum {
- log_vmregs_per_word = LogBytesPerWord - LogBytesPerInt, // VMRegs are of 4-byte size
-#ifdef COMPILER2
- log_bytes_per_fpr = 2, // quad vectors
-#else
- log_bytes_per_fpr = 2, // double vectors
-#endif
- log_words_per_fpr = log_bytes_per_fpr - LogBytesPerWord,
- words_per_fpr = 1 << log_words_per_fpr,
- log_vmregs_per_fpr = log_bytes_per_fpr - LogBytesPerInt,
- log_vmregs_per_gpr = log_vmregs_per_word,
- vmregs_per_gpr = 1 << log_vmregs_per_gpr,
- vmregs_per_fpr = 1 << log_vmregs_per_fpr,
-
- num_gpr = RegisterImpl::number_of_registers << log_vmregs_per_gpr,
- max_gpr0 = num_gpr,
- num_fpr = FloatRegisterImpl::number_of_registers << log_vmregs_per_fpr,
- max_fpr0 = max_gpr0 + num_fpr,
- number_of_registers = num_gpr + num_fpr + 1+1 // APSR and FPSCR so that c2's REG_COUNT <= ConcreteRegisterImpl::number_of_registers
- };
+ max_gpr = Register::number_of_registers * Register::max_slots_per_register,
+ max_fpr = max_gpr + FloatRegister::number_of_registers * FloatRegister::max_slots_per_register,
- static const int max_gpr;
- static const int max_fpr;
+ number_of_registers = max_fpr + 1+1 // APSR and FPSCR so that c2's REG_COUNT <= ConcreteRegisterImpl::number_of_registers
+ };
};
-class VFPSystemRegisterImpl;
-typedef VFPSystemRegisterImpl* VFPSystemRegister;
-class VFPSystemRegisterImpl : public AbstractRegisterImpl {
+typedef AbstractRegSet RegSet;
+typedef AbstractRegSet FloatRegSet;
+
+template <>
+inline Register AbstractRegSet::first() {
+ if (_bitset == 0) { return noreg; }
+ return as_Register(count_trailing_zeros(_bitset));
+}
+
+
+template <>
+inline FloatRegister AbstractRegSet::first() {
+ uint32_t first = _bitset & -_bitset;
+ return first ? as_FloatRegister(exact_log2(first)) : fnoreg;
+}
+
+
+class VFPSystemRegister {
+ private:
+ int _store_idx;
+
+ constexpr explicit VFPSystemRegister(int store_idx) : _store_idx(store_idx) {}
+
+ enum {
+ _FPSID_store_idx = 0,
+ _FPSCR_store_idx = 1,
+ _MVFR0_store_idx = 2,
+ _MVFR1_store_idx = 3
+ };
+
public:
- int encoding() const { return value(); }
+ enum {
+ FPSID = 0,
+ FPSCR = 1,
+ MVFR0 = 6,
+ MVFR1 = 7,
+ number_of_registers = 4
+ };
+
+ class VFPSystemRegisterImpl : public AbstractRegisterImpl {
+ friend class VFPSystemRegister;
+
+ int _encoding;
+
+ static constexpr const VFPSystemRegisterImpl* first();
+
+ public:
+ constexpr VFPSystemRegisterImpl(int encoding) : _encoding(encoding) {}
+
+ int encoding() const { return _encoding; }
+ };
+
+ inline friend constexpr VFPSystemRegister as_VFPSystemRegister(int encoding);
+
+ constexpr VFPSystemRegister() : _store_idx(-1) {} // vfpsnoreg
+
+ int operator==(const VFPSystemRegister r) const { return _store_idx == r._store_idx; }
+ int operator!=(const VFPSystemRegister r) const { return _store_idx != r._store_idx; }
+
+ const VFPSystemRegisterImpl* operator->() const { return VFPSystemRegisterImpl::first() + _store_idx; }
};
-#define FPSID ((VFPSystemRegister)0)
-#define FPSCR ((VFPSystemRegister)1)
-#define MVFR0 ((VFPSystemRegister)0x6)
-#define MVFR1 ((VFPSystemRegister)0x7)
+extern VFPSystemRegister::VFPSystemRegisterImpl all_VFPSystemRegisterImpls[VFPSystemRegister::number_of_registers + 1] INTERNAL_VISIBILITY;
+
+inline constexpr const VFPSystemRegister::VFPSystemRegisterImpl* VFPSystemRegister::VFPSystemRegisterImpl::first() {
+ return all_VFPSystemRegisterImpls + 1;
+}
+
+constexpr VFPSystemRegister vfpsnoreg = VFPSystemRegister();
+
+inline constexpr VFPSystemRegister as_VFPSystemRegister(int encoding) {
+ switch (encoding) {
+ case VFPSystemRegister::FPSID: return VFPSystemRegister(VFPSystemRegister::_FPSID_store_idx);
+ case VFPSystemRegister::FPSCR: return VFPSystemRegister(VFPSystemRegister::_FPSCR_store_idx);
+ case VFPSystemRegister::MVFR0: return VFPSystemRegister(VFPSystemRegister::_MVFR0_store_idx);
+ case VFPSystemRegister::MVFR1: return VFPSystemRegister(VFPSystemRegister::_MVFR1_store_idx);
+ default: return vfpsnoreg;
+ }
+}
+
+constexpr VFPSystemRegister FPSID = as_VFPSystemRegister(VFPSystemRegister::FPSID);
+constexpr VFPSystemRegister FPSCR = as_VFPSystemRegister(VFPSystemRegister::FPSCR);
+constexpr VFPSystemRegister MVFR0 = as_VFPSystemRegister(VFPSystemRegister::MVFR0);
+constexpr VFPSystemRegister MVFR1 = as_VFPSystemRegister(VFPSystemRegister::MVFR1);
/*
* Register definitions shared across interpreter and compiler
*/
-#define Rexception_obj R4
-#define Rexception_pc R5
+constexpr Register Rexception_obj = R4;
+constexpr Register Rexception_pc = R5;
/*
* Interpreter register definitions common to C++ and template interpreters.
*/
-#define Rlocals R8
-#define Rmethod R9
-#define Rthread R10
-#define Rtemp R12
+constexpr Register Rlocals = R8;
+constexpr Register Rmethod = R9;
+constexpr Register Rthread = R10;
+constexpr Register Rtemp = R12;
// Interpreter calling conventions
-#define Rparams SP
-#define Rsender_sp R4
+constexpr Register Rparams = SP;
+constexpr Register Rsender_sp = R4;
// JSR292
// Note: R5_mh is needed only during the call setup, including adapters
// This does not seem to conflict with Rexception_pc
// In case of issues, R3 might be OK but adapters calling the runtime would have to save it
-#define R5_mh R5 // MethodHandle register, used during the call setup
-#define Rmh_SP_save FP // for C1
+constexpr Register R5_mh = R5; // MethodHandle register, used during the call setup
+constexpr Register Rmh_SP_save = FP; // for C1
/*
* C++ Interpreter Register Defines
*/
-#define Rsave0 R4
-#define Rsave1 R5
-#define Rsave2 R6
-#define Rstate altFP_7_11 // R7 or R11
-#define Ricklass R8
+constexpr Register Rsave0 = R4;
+constexpr Register Rsave1 = R5;
+constexpr Register Rsave2 = R6;
+constexpr Register Rstate = altFP_7_11; // R7 or R11
+constexpr Register Ricklass = R8;
/*
* TemplateTable Interpreter Register Usage
*/
// Temporary registers
-#define R0_tmp R0
-#define R1_tmp R1
-#define R2_tmp R2
-#define R3_tmp R3
-#define R4_tmp R4
-#define R5_tmp R5
-#define R12_tmp R12
-#define LR_tmp LR
+constexpr Register R0_tmp = R0;
+constexpr Register R1_tmp = R1;
+constexpr Register R2_tmp = R2;
+constexpr Register R3_tmp = R3;
+constexpr Register R4_tmp = R4;
+constexpr Register R5_tmp = R5;
+constexpr Register R12_tmp = R12;
+constexpr Register LR_tmp = LR;
-#define S0_tmp S0
-#define S1_tmp S1_reg
+constexpr FloatRegister S0_tmp = S0;
+constexpr FloatRegister S1_tmp = S1_reg;
-#define D0_tmp D0
-#define D1_tmp D1
+constexpr FloatRegister D0_tmp = D0;
+constexpr FloatRegister D1_tmp = D1;
// Temporary registers saved across VM calls (according to C calling conventions)
-#define Rtmp_save0 R4
-#define Rtmp_save1 R5
+constexpr Register Rtmp_save0 = R4;
+constexpr Register Rtmp_save1 = R5;
// Cached TOS value
-#define R0_tos R0
+constexpr Register R0_tos = R0;
-#define R0_tos_lo R0
-#define R1_tos_hi R1
+constexpr Register R0_tos_lo = R0;
+constexpr Register R1_tos_hi = R1;
-#define S0_tos S0
-#define D0_tos D0
+constexpr FloatRegister S0_tos = S0;
+constexpr FloatRegister D0_tos = D0;
// Dispatch table
-#define RdispatchTable R6
+constexpr Register RdispatchTable = R6;
// Bytecode pointer
-#define Rbcp altFP_7_11
+constexpr Register Rbcp = altFP_7_11;
// Pre-loaded next bytecode for the dispatch
-#define R3_bytecode R3
+constexpr Register R3_bytecode = R3;
// Conventions between bytecode templates and stubs
-#define R2_ClassCastException_obj R2
-#define R4_ArrayIndexOutOfBounds_index R4
+constexpr Register R2_ClassCastException_obj = R2;
+constexpr Register R4_ArrayIndexOutOfBounds_index = R4;
// Interpreter expression stack top
-#define Rstack_top SP
+constexpr Register Rstack_top = SP;
/*
* Linux 32-bit ARM C ABI Register calling conventions
@@ -420,10 +519,11 @@
* R14 (LR) Link register
* R15 (PC) Program Counter
*/
-#define c_rarg0 R0
-#define c_rarg1 R1
-#define c_rarg2 R2
-#define c_rarg3 R3
+
+constexpr Register c_rarg0 = R0;
+constexpr Register c_rarg1 = R1;
+constexpr Register c_rarg2 = R2;
+constexpr Register c_rarg3 = R3;
#define GPR_PARAMS 4
@@ -431,10 +531,10 @@
// Java ABI
// XXX Is this correct?
-#define j_rarg0 c_rarg0
-#define j_rarg1 c_rarg1
-#define j_rarg2 c_rarg2
-#define j_rarg3 c_rarg3
+constexpr Register j_rarg0 = c_rarg0;
+constexpr Register j_rarg1 = c_rarg1;
+constexpr Register j_rarg2 = c_rarg2;
+constexpr Register j_rarg3 = c_rarg3;
#endif // CPU_ARM_REGISTER_ARM_HPP
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/sharedRuntime_arm.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/sharedRuntime_arm.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/sharedRuntime_arm.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/sharedRuntime_arm.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -71,7 +71,7 @@
enum RegisterLayout {
- fpu_save_size = FloatRegisterImpl::number_of_registers,
+ fpu_save_size = FloatRegister::number_of_registers,
#ifndef __SOFTFP__
D0_offset = 0,
#endif
@@ -140,8 +140,8 @@
if (VM_Version::has_vfp3_32()) {
__ fpush(FloatRegisterSet(D16, 16));
} else {
- if (FloatRegisterImpl::number_of_registers > 32) {
- assert(FloatRegisterImpl::number_of_registers == 64, "nb fp registers should be 64");
+ if (FloatRegister::number_of_registers > 32) {
+ assert(FloatRegister::number_of_registers == 64, "nb fp registers should be 64");
__ sub(SP, SP, 32 * wordSize);
}
}
@@ -183,8 +183,8 @@
if (VM_Version::has_vfp3_32()) {
__ fpop(FloatRegisterSet(D16, 16));
} else {
- if (FloatRegisterImpl::number_of_registers > 32) {
- assert(FloatRegisterImpl::number_of_registers == 64, "nb fp registers should be 64");
+ if (FloatRegister::number_of_registers > 32) {
+ assert(FloatRegister::number_of_registers == 64, "nb fp registers should be 64");
__ add(SP, SP, 32 * wordSize);
}
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/vmreg_arm.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/vmreg_arm.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/vmreg_arm.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/vmreg_arm.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -31,14 +31,14 @@
Register reg = ::as_Register(0);
int i;
for (i = 0; i < ConcreteRegisterImpl::max_gpr; reg = reg->successor()) {
- for (int j = 0; j < (1 << ConcreteRegisterImpl::log_vmregs_per_gpr); j++) {
+ for (int j = 0; j < Register::max_slots_per_register; j++) {
regName[i++] = reg->name();
}
}
#ifndef __SOFTFP__
FloatRegister freg = ::as_FloatRegister(0);
for ( ; i < ConcreteRegisterImpl::max_fpr ; ) {
- for (int j = 0; j < (1 << ConcreteRegisterImpl::log_vmregs_per_fpr); j++) {
+ for (int j = 0; j < Register::max_slots_per_register; j++) {
regName[i++] = freg->name();
}
freg = freg->successor();
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/vmreg_arm.hpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/vmreg_arm.hpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/vmreg_arm.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/vmreg_arm.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -36,20 +36,20 @@
inline Register as_Register() {
assert(is_Register(), "must be");
assert(is_concrete(), "concrete register expected");
- return ::as_Register(value() >> ConcreteRegisterImpl::log_vmregs_per_gpr);
+ return ::as_Register(value() / Register::max_slots_per_register);
}
inline FloatRegister as_FloatRegister() {
assert(is_FloatRegister(), "must be");
assert(is_concrete(), "concrete register expected");
- return ::as_FloatRegister((value() - ConcreteRegisterImpl::max_gpr) >> ConcreteRegisterImpl::log_vmregs_per_fpr);
+ return ::as_FloatRegister((value() - ConcreteRegisterImpl::max_gpr) / FloatRegister::max_slots_per_register);
}
inline bool is_concrete() {
if (is_Register()) {
- return ((value() & right_n_bits(ConcreteRegisterImpl::log_vmregs_per_gpr)) == 0);
+ return (value() % Register::max_slots_per_register == 0);
} else if (is_FloatRegister()) {
- return (((value() - ConcreteRegisterImpl::max_gpr) & right_n_bits(ConcreteRegisterImpl::log_vmregs_per_fpr)) == 0);
+ return (value() % FloatRegister::max_slots_per_register == 0); // Single slot
} else {
return false;
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/arm/vmreg_arm.inline.hpp openjdk-21-21.0.12+8/src/hotspot/cpu/arm/vmreg_arm.inline.hpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/arm/vmreg_arm.inline.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/arm/vmreg_arm.inline.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -25,11 +25,11 @@
#ifndef CPU_ARM_VMREG_ARM_INLINE_HPP
#define CPU_ARM_VMREG_ARM_INLINE_HPP
-inline VMReg RegisterImpl::as_VMReg() {
- return VMRegImpl::as_VMReg(encoding() << ConcreteRegisterImpl::log_vmregs_per_gpr);
+inline VMReg Register::RegisterImpl::as_VMReg() const {
+ return VMRegImpl::as_VMReg(encoding() * Register::max_slots_per_register);
}
-inline VMReg FloatRegisterImpl::as_VMReg() {
- return VMRegImpl::as_VMReg((encoding() << ConcreteRegisterImpl::log_vmregs_per_fpr) + ConcreteRegisterImpl::max_gpr);
+inline VMReg FloatRegister::FloatRegisterImpl::as_VMReg() const {
+ return VMRegImpl::as_VMReg((encoding() * FloatRegister::max_slots_per_register) + ConcreteRegisterImpl::max_gpr);
}
#endif // CPU_ARM_VMREG_ARM_INLINE_HPP
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -594,9 +594,11 @@
bind(Lslow); // Fallback to slow version.
subf(tmp0, src, result); // Bytes known positive.
- subf_(tmp0, tmp0, cnt); // Remaining Bytes.
+ clrldi(tmp1, cnt, 32); // Clear garbage from upper 32 bits.
+ subf_(tmp0, tmp0, tmp1); // Remaining Bytes.
beq(CCR0, Ldone);
mtctr(tmp0);
+
bind(Lloop);
lbz(tmp0, 0, result);
andi_(tmp0, tmp0, 0x80);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -4440,7 +4440,7 @@
Label done;
ld_ptr(R0, JavaThread::cont_fastpath_offset(), R16_thread);
cmpld(CCR0, R1_SP, R0);
- ble(CCR0, done);
+ ble(CCR0, done); // if (SP <= _cont_fastpath) goto done;
st_ptr(R1_SP, JavaThread::cont_fastpath_offset(), R16_thread);
bind(done);
}
@@ -4449,7 +4449,7 @@
Label done;
ld_ptr(R0, JavaThread::cont_fastpath_offset(), R16_thread);
cmpld(CCR0, R1_SP, R0);
- ble(CCR0, done);
+ blt(CCR0, done); // if (SP < _cont_fastpath) goto done;
li(R0, 0);
st_ptr(R0, JavaThread::cont_fastpath_offset(), R16_thread);
bind(done);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/registerMap_ppc.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/registerMap_ppc.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/registerMap_ppc.cpp 1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/registerMap_ppc.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2026 SAP SE. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "runtime/registerMap.hpp"
+
+address RegisterMap::pd_location(VMReg base_reg, int slot_idx) const {
+ if (base_reg->is_VectorSRegister()) {
+ // Not all physical slots belonging to a VectorRegister have corresponding
+ // valid VMReg locations in the RegisterMap.
+ // (See RegisterSaver::push_frame_reg_args_and_save_live_registers.)
+ // However, the slots are always saved to the stack in a contiguous region
+ // of memory so we can calculate the address of the upper slots by
+ // offsetting from the base address.
+ assert(base_reg->is_concrete(), "must pass base reg");
+ address base_location = location(base_reg, nullptr);
+ if (base_location != nullptr) {
+ intptr_t offset_in_bytes = slot_idx * VMRegImpl::stack_slot_size;
+ return base_location + offset_in_bytes;
+ } else {
+ return nullptr;
+ }
+ } else {
+ return location(base_reg->next(slot_idx), nullptr);
+ }
+}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/registerMap_ppc.hpp openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/registerMap_ppc.hpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/registerMap_ppc.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/registerMap_ppc.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2013 SAP SE. All rights reserved.
+ * Copyright (c) 2000, 2026, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2026 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -35,9 +35,7 @@
// Since there is none, we just return null.
address pd_location(VMReg reg) const { return nullptr; }
- address pd_location(VMReg base_reg, int slot_idx) const {
- return location(base_reg->next(slot_idx), nullptr);
- }
+ address pd_location(VMReg base_reg, int slot_idx) const;
// no PD state to clear or copy:
void pd_clear() {}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -105,7 +105,7 @@
// During deoptimization only the result registers need to be restored
// all the other values have already been extracted.
- static void restore_result_registers(MacroAssembler* masm, int frame_size_in_bytes);
+ static void restore_result_registers(MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors);
// Constants and data structures:
@@ -355,6 +355,7 @@
__ li(R30, offset);
__ stxvd2x(as_VectorSRegister(reg_num), R30, R1_SP);
+ // RegisterMap::pd_location only uses the first VMReg for each VectorRegister.
if (generate_oop_map) {
map->set_callee_saved(VMRegImpl::stack2reg(offset>>2),
RegisterSaver_LiveVSRegs[i].vmreg);
@@ -528,10 +529,14 @@
}
// Restore the registers that might be holding a result.
-void RegisterSaver::restore_result_registers(MacroAssembler* masm, int frame_size_in_bytes) {
+void RegisterSaver::restore_result_registers(MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors) {
const int regstosave_num = sizeof(RegisterSaver_LiveRegs) /
sizeof(RegisterSaver::LiveRegType);
- const int register_save_size = regstosave_num * reg_size; // VS registers not relevant here.
+ const int vecregstosave_num = save_vectors ? (sizeof(RegisterSaver_LiveVSRegs) /
+ sizeof(RegisterSaver::LiveRegType))
+ : 0;
+ const int register_save_size = regstosave_num * reg_size + vecregstosave_num * vs_reg_size;
+
const int register_save_offset = frame_size_in_bytes - register_save_size;
// restore all result registers (ints and floats)
@@ -560,7 +565,7 @@
offset += reg_size;
}
- assert(offset == frame_size_in_bytes, "consistency check");
+ assert(offset == frame_size_in_bytes - (save_vectors ? vecregstosave_num * vs_reg_size : 0), "consistency check");
}
// Is vector's size (in bytes) bigger than a size saved by default?
@@ -2984,7 +2989,8 @@
&first_frame_size_in_bytes,
/*generate_oop_map=*/ true,
return_pc_adjustment_no_exception,
- RegisterSaver::return_pc_is_lr);
+ RegisterSaver::return_pc_is_lr,
+ /*save_vectors*/ SuperwordUseVSX);
assert(map != nullptr, "OopMap must have been created");
__ li(exec_mode_reg, Deoptimization::Unpack_deopt);
@@ -3019,7 +3025,8 @@
&first_frame_size_in_bytes,
/*generate_oop_map=*/ false,
/*return_pc_adjustment_exception=*/ 0,
- RegisterSaver::return_pc_is_pre_saved);
+ RegisterSaver::return_pc_is_pre_saved,
+ /*save_vectors*/ SuperwordUseVSX);
// Deopt during an exception. Save exec mode for unpack_frames.
__ li(exec_mode_reg, Deoptimization::Unpack_exception);
@@ -3037,7 +3044,8 @@
&first_frame_size_in_bytes,
/*generate_oop_map=*/ false,
/*return_pc_adjustment_reexecute=*/ 0,
- RegisterSaver::return_pc_is_pre_saved);
+ RegisterSaver::return_pc_is_pre_saved,
+ /*save_vectors*/ SuperwordUseVSX);
__ li(exec_mode_reg, Deoptimization::Unpack_reexecute);
#endif
@@ -3063,7 +3071,7 @@
// Restore only the result registers that have been saved
// by save_volatile_registers(...).
- RegisterSaver::restore_result_registers(masm, first_frame_size_in_bytes);
+ RegisterSaver::restore_result_registers(masm, first_frame_size_in_bytes, /*save_vectors*/ SuperwordUseVSX);
// reload the exec mode from the UnrollBlock (it might have changed)
__ lwz(exec_mode_reg, in_bytes(Deoptimization::UnrollBlock::unpack_kind_offset()), unroll_block_reg);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/vm_version_ppc.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/vm_version_ppc.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/vm_version_ppc.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/ppc/vm_version_ppc.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -26,6 +26,7 @@
#include "precompiled.hpp"
#include "asm/assembler.inline.hpp"
#include "asm/macroAssembler.inline.hpp"
+#include "compiler/compilerDefinitions.inline.hpp"
#include "compiler/disassembler.hpp"
#include "jvm.h"
#include "memory/resourceArea.hpp"
@@ -130,7 +131,7 @@
}
if (PowerArchitecturePPC64 >= 8) {
- if (FLAG_IS_DEFAULT(SuperwordUseVSX)) {
+ if (FLAG_IS_DEFAULT(SuperwordUseVSX) && CompilerConfig::is_c2_enabled()) {
FLAG_SET_ERGO(SuperwordUseVSX, true);
}
} else {
diff -Nru openjdk-21-21.0.11+10/src/hotspot/cpu/riscv/gc/shenandoah/shenandoahBarrierSetAssembler_riscv.cpp openjdk-21-21.0.12+8/src/hotspot/cpu/riscv/gc/shenandoah/shenandoahBarrierSetAssembler_riscv.cpp
--- openjdk-21-21.0.11+10/src/hotspot/cpu/riscv/gc/shenandoah/shenandoahBarrierSetAssembler_riscv.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/cpu/riscv/gc/shenandoah/shenandoahBarrierSetAssembler_riscv.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -298,7 +298,7 @@
} else {
assert(is_phantom, "only remaining strength");
assert(!is_narrow, "phantom access cannot be narrow");
- target = CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak);
+ target = CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_phantom);
}
__ call(target);
__ mv(t0, x10);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/aix/os_aix.cpp openjdk-21-21.0.12+8/src/hotspot/os/aix/os_aix.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/aix/os_aix.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/aix/os_aix.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -177,7 +177,7 @@
////////////////////////////////////////////////////////////////////////////////
// global variables (for a description see os_aix.hpp)
-julong os::Aix::_physical_memory = 0;
+physical_memory_size_type os::Aix::_physical_memory = 0;
pthread_t os::Aix::_main_thread = ((pthread_t)0);
@@ -265,28 +265,29 @@
return false;
}
-julong os::free_memory() {
- return Aix::available_memory();
+bool os::free_memory(physical_memory_size_type& value) {
+ return Aix::available_memory(value);
}
-julong os::available_memory() {
- return Aix::available_memory();
+bool os::available_memory(physical_memory_size_type& value) {
+ return Aix::available_memory(value);
}
-julong os::Aix::available_memory() {
+bool os::Aix::available_memory(physical_memory_size_type& value) {
// Avoid expensive API call here, as returned value will always be null.
if (os::Aix::on_pase()) {
return 0x0LL;
}
os::Aix::meminfo_t mi;
if (os::Aix::get_meminfo(&mi)) {
- return mi.real_free;
+ value = static_cast(mi.real_free);
+ return true;
} else {
- return ULONG_MAX;
+ return false;
}
}
-julong os::physical_memory() {
+physical_memory_size_type os::physical_memory() {
return Aix::physical_memory();
}
@@ -357,7 +358,7 @@
if (!os::Aix::get_meminfo(&mi)) {
assert(false, "os::Aix::get_meminfo failed.");
}
- _physical_memory = (julong) mi.real_total;
+ _physical_memory = static_cast(mi.real_total);
}
// Helper function for tracing page sizes.
@@ -1133,6 +1134,8 @@
dflags |= RTLD_MEMBER;
}
+ Events::log_dll_message(nullptr, "Attempting to load shared library %s", filename);
+
void* result;
const char* error_report = nullptr;
result = Aix_dlopen(filename, dflags, eno, &error_report);
@@ -2402,7 +2405,7 @@
}
trcVerbose("processor count: %d", os::_processor_count);
- trcVerbose("physical memory: %lu", Aix::_physical_memory);
+ trcVerbose("physical memory: " PHYS_MEM_TYPE_FORMAT, Aix::_physical_memory);
// Initially build up the loaded dll map.
LoadedLibraries::reload();
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/aix/os_aix.hpp openjdk-21-21.0.12+8/src/hotspot/os/aix/os_aix.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/aix/os_aix.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/aix/os_aix.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -35,7 +35,7 @@
private:
- static julong _physical_memory;
+ static physical_memory_size_type _physical_memory;
static pthread_t _main_thread;
// -1 = uninitialized, 0 = AIX, 1 = OS/400 (PASE)
@@ -58,9 +58,9 @@
// 1 - EXTSHM=ON
static int _extshm;
- static julong available_memory();
- static julong free_memory();
- static julong physical_memory() { return _physical_memory; }
+ static bool available_memory(physical_memory_size_type& value);
+ static bool free_memory(physical_memory_size_type& value);
+ static physical_memory_size_type physical_memory() { return _physical_memory; }
static void initialize_system_info();
// OS recognitions (PASE/AIX, OS level) call this before calling any
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/bsd/os_bsd.cpp openjdk-21-21.0.12+8/src/hotspot/os/bsd/os_bsd.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/bsd/os_bsd.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/bsd/os_bsd.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -120,7 +120,7 @@
////////////////////////////////////////////////////////////////////////////////
// global variables
-julong os::Bsd::_physical_memory = 0;
+physical_memory_size_type os::Bsd::_physical_memory = 0;
#ifdef __APPLE__
mach_timebase_info_data_t os::Bsd::_timebase_info = {0, 0};
@@ -139,17 +139,17 @@
////////////////////////////////////////////////////////////////////////////////
// utility functions
-julong os::available_memory() {
- return Bsd::available_memory();
+bool os::available_memory(physical_memory_size_type& value) {
+ return Bsd::available_memory(value);
}
-julong os::free_memory() {
- return Bsd::available_memory();
+bool os::free_memory(physical_memory_size_type& value) {
+ return Bsd::available_memory(value);
}
// available here means free
-julong os::Bsd::available_memory() {
- uint64_t available = physical_memory() >> 2;
+bool os::Bsd::available_memory(physical_memory_size_type& value) {
+ physical_memory_size_type available = physical_memory() >> 2;
#ifdef __APPLE__
mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
vm_statistics64_data_t vmstat;
@@ -159,9 +159,12 @@
"host_statistics64 failed - check mach_host_self() and count");
if (kerr == KERN_SUCCESS) {
available = vmstat.free_count * os::vm_page_size();
+ } else {
+ return false;
}
#endif
- return available;
+ value = available;
+ return true;
}
// for more info see :
@@ -180,7 +183,7 @@
}
}
-julong os::physical_memory() {
+physical_memory_size_type os::physical_memory() {
return Bsd::physical_memory();
}
@@ -254,7 +257,7 @@
len = sizeof(mem_val);
if (sysctl(mib, 2, &mem_val, &len, nullptr, 0) != -1) {
assert(len == sizeof(mem_val), "unexpected data size");
- _physical_memory = mem_val;
+ _physical_memory = static_cast(mem_val);
} else {
_physical_memory = 256 * 1024 * 1024; // fallback (XXXBSD?)
}
@@ -265,7 +268,7 @@
// datasize rlimit restricts us anyway.
struct rlimit limits;
getrlimit(RLIMIT_DATA, &limits);
- _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
+ _physical_memory = MIN2(_physical_memory, static_cast(limits.rlim_cur));
}
#endif
}
@@ -987,6 +990,8 @@
assert(rtn == 0, "fegetenv must succeed");
#endif // IA32
+ Events::log_dll_message(nullptr, "Attempting to load shared library %s", filename);
+
void * result= ::dlopen(filename, RTLD_LAZY);
#ifndef IA32
@@ -1411,10 +1416,13 @@
st->print("Memory:");
st->print(" " SIZE_FORMAT "k page", os::vm_page_size()>>10);
- st->print(", physical " UINT64_FORMAT "k",
- os::physical_memory() >> 10);
- st->print("(" UINT64_FORMAT "k free)",
- os::available_memory() >> 10);
+ physical_memory_size_type phys_mem = os::physical_memory();
+ st->print(", physical " PHYS_MEM_TYPE_FORMAT "k",
+ phys_mem >> 10);
+ physical_memory_size_type avail_mem = 0;
+ (void)os::available_memory(avail_mem);
+ st->print("(" PHYS_MEM_TYPE_FORMAT "k free)",
+ avail_mem >> 10);
if((sysctlbyname("vm.swapusage", &swap_usage, &size, nullptr, 0) == 0) || (errno == ENOMEM)) {
if (size >= offset_of(xsw_usage, xsu_used)) {
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/bsd/os_bsd.hpp openjdk-21-21.0.12+8/src/hotspot/os/bsd/os_bsd.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/bsd/os_bsd.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/bsd/os_bsd.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -42,12 +42,12 @@
protected:
- static julong _physical_memory;
+ static physical_memory_size_type _physical_memory;
static pthread_t _main_thread;
- static julong available_memory();
- static julong free_memory();
- static julong physical_memory() { return _physical_memory; }
+ static bool available_memory(physical_memory_size_type& value);
+ static bool free_memory(physical_memory_size_type& value);
+ static physical_memory_size_type physical_memory() { return _physical_memory; }
static void initialize_system_info();
static void rebuild_cpu_to_node_map();
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.cpp openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupSubsystem_linux.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupSubsystem_linux.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -62,7 +62,7 @@
CgroupV1MemoryController* memory = nullptr;
CgroupV1Controller* cpuset = nullptr;
CgroupV1CpuController* cpu = nullptr;
- CgroupV1Controller* cpuacct = nullptr;
+ CgroupV1CpuacctController* cpuacct = nullptr;
CgroupV1Controller* pids = nullptr;
CgroupInfo cg_infos[CG_INFO_LENGTH];
u1 cg_type_flags = INVALID_CGROUPS_GENERIC;
@@ -105,9 +105,10 @@
CgroupV2CpuController* cpu = new CgroupV2CpuController(CgroupV2Controller(cg_infos[CPU_IDX]._mount_path,
cg_infos[CPU_IDX]._cgroup_path,
cg_infos[CPU_IDX]._read_only));
+ CgroupV2CpuacctController* cpuacct = new CgroupV2CpuacctController(cpu);
log_debug(os, container)("Detected cgroups v2 unified hierarchy");
cleanup(cg_infos);
- return new CgroupV2Subsystem(memory, cpu, mem_other);
+ return new CgroupV2Subsystem(memory, cpu, cpuacct, mem_other);
}
/*
@@ -150,7 +151,7 @@
cpu = new CgroupV1CpuController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only));
cpu->set_subsystem_path(info._cgroup_path);
} else if (strcmp(info._name, "cpuacct") == 0) {
- cpuacct = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only);
+ cpuacct = new CgroupV1CpuacctController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only));
cpuacct->set_subsystem_path(info._cgroup_path);
} else if (strcmp(info._name, "pids") == 0) {
pids = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only);
@@ -669,8 +670,8 @@
if (!memory_limit->should_check_metric()) {
return memory_limit->value();
}
- jlong phys_mem = os::Linux::physical_memory();
- log_trace(os, container)("total physical memory: " JLONG_FORMAT, phys_mem);
+ julong phys_mem = static_cast(os::Linux::physical_memory());
+ log_trace(os, container)("total physical memory: " JULONG_FORMAT, phys_mem);
jlong mem_limit = contrl->controller()->read_memory_limit_in_bytes(phys_mem);
// Update cached metric to avoid re-reading container settings too often
memory_limit->set_value(mem_limit, OSCONTAINER_CACHE_TIMEOUT);
@@ -840,16 +841,20 @@
// CgroupSubsystem implementations
jlong CgroupSubsystem::memory_and_swap_limit_in_bytes() {
- julong phys_mem = os::Linux::physical_memory();
+ julong phys_mem = static_cast(os::Linux::physical_memory());
julong host_swap = os::Linux::host_swap();
return memory_controller()->controller()->memory_and_swap_limit_in_bytes(phys_mem, host_swap);
}
jlong CgroupSubsystem::memory_soft_limit_in_bytes() {
- julong phys_mem = os::Linux::physical_memory();
+ julong phys_mem = static_cast(os::Linux::physical_memory());
return memory_controller()->controller()->memory_soft_limit_in_bytes(phys_mem);
}
+jlong CgroupSubsystem::memory_throttle_limit_in_bytes() {
+ return memory_controller()->controller()->memory_throttle_limit_in_bytes();
+}
+
jlong CgroupSubsystem::memory_usage_in_bytes() {
return memory_controller()->controller()->memory_usage_in_bytes();
}
@@ -878,7 +883,11 @@
return cpu_controller()->controller()->cpu_shares();
}
+jlong CgroupSubsystem::cpu_usage_in_micros() {
+ return cpuacct_controller()->cpu_usage_in_micros();
+}
+
void CgroupSubsystem::print_version_specific_info(outputStream* st) {
- julong phys_mem = os::Linux::physical_memory();
+ julong phys_mem = static_cast(os::Linux::physical_memory());
memory_controller()->controller()->print_version_specific_info(st, phys_mem);
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.hpp openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupSubsystem_linux.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupSubsystem_linux.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -227,6 +227,18 @@
virtual const char* cgroup_path() = 0;
};
+// Pure virtual class representing version agnostic CPU accounting controllers
+class CgroupCpuacctController: public CHeapObj {
+ public:
+ virtual jlong cpu_usage_in_micros() = 0;
+ virtual bool needs_hierarchy_adjustment() = 0;
+ virtual bool is_read_only() = 0;
+ virtual const char* subsystem_path() = 0;
+ virtual void set_subsystem_path(const char* cgroup_path) = 0;
+ virtual const char* mount_point() = 0;
+ virtual const char* cgroup_path() = 0;
+};
+
// Pure virtual class representing version agnostic memory controllers
class CgroupMemoryController: public CHeapObj {
public:
@@ -234,6 +246,7 @@
virtual jlong memory_usage_in_bytes() = 0;
virtual jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) = 0;
virtual jlong memory_soft_limit_in_bytes(julong upper_bound) = 0;
+ virtual jlong memory_throttle_limit_in_bytes() = 0;
virtual jlong memory_max_usage_in_bytes() = 0;
virtual jlong rss_usage_in_bytes() = 0;
virtual jlong cache_usage_in_bytes() = 0;
@@ -260,14 +273,18 @@
virtual const char * container_type() = 0;
virtual CachingCgroupController* memory_controller() = 0;
virtual CachingCgroupController* cpu_controller() = 0;
+ virtual CgroupCpuacctController* cpuacct_controller() = 0;
int cpu_quota();
int cpu_period();
int cpu_shares();
+ jlong cpu_usage_in_micros();
+
jlong memory_usage_in_bytes();
jlong memory_and_swap_limit_in_bytes();
jlong memory_soft_limit_in_bytes();
+ jlong memory_throttle_limit_in_bytes();
jlong memory_max_usage_in_bytes();
jlong rss_usage_in_bytes();
jlong cache_usage_in_bytes();
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupUtil_linux.cpp openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupUtil_linux.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupUtil_linux.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupUtil_linux.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -65,7 +65,7 @@
char* cg_path = os::strdup(orig);
char* last_slash;
assert(cg_path[0] == '/', "cgroup path must start with '/'");
- julong phys_mem = os::Linux::physical_memory();
+ julong phys_mem = static_cast(os::Linux::physical_memory());
char* limit_cg_path = nullptr;
jlong limit = mem->read_memory_limit_in_bytes(phys_mem);
jlong lowest_limit = limit < 0 ? phys_mem : limit;
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -243,10 +243,16 @@
}
}
+jlong CgroupV1MemoryController::memory_throttle_limit_in_bytes() {
+ // Log this string at trace level so as to make tests happy.
+ log_trace(os, container)("Memory Throttle Limit is not supported.");
+ return OSCONTAINER_ERROR; // not supported
+}
+
// Constructor
CgroupV1Subsystem::CgroupV1Subsystem(CgroupV1Controller* cpuset,
CgroupV1CpuController* cpu,
- CgroupV1Controller* cpuacct,
+ CgroupV1CpuacctController* cpuacct,
CgroupV1Controller* pids,
CgroupV1MemoryController* memory) :
_cpuset(cpuset),
@@ -415,6 +421,13 @@
return shares_int;
}
+jlong CgroupV1CpuacctController::cpu_usage_in_micros() {
+ julong cpu_usage;
+ CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpuacct.usage", "CPU Usage", cpu_usage);
+ // Output is in nanoseconds, convert to microseconds.
+ return (jlong)cpu_usage / 1000;
+}
+
/* pids_max
*
* Return the maximum number of tasks available to the process
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -81,6 +81,7 @@
jlong memory_usage_in_bytes() override;
jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) override;
jlong memory_soft_limit_in_bytes(julong upper_bound) override;
+ jlong memory_throttle_limit_in_bytes() override;
jlong memory_max_usage_in_bytes() override;
jlong rss_usage_in_bytes() override;
jlong cache_usage_in_bytes() override;
@@ -140,12 +141,41 @@
}
};
+class CgroupV1CpuacctController final : public CgroupCpuacctController {
+
+ private:
+ CgroupV1Controller _reader;
+ CgroupV1Controller* reader() { return &_reader; }
+ public:
+ jlong cpu_usage_in_micros() override;
+ void set_subsystem_path(const char *cgroup_path) override {
+ reader()->set_subsystem_path(cgroup_path);
+ }
+ bool is_read_only() override {
+ return reader()->is_read_only();
+ }
+ const char* subsystem_path() override {
+ return reader()->subsystem_path();
+ }
+ const char* mount_point() override {
+ return reader()->mount_point();
+ }
+ bool needs_hierarchy_adjustment() override {
+ return reader()->needs_hierarchy_adjustment();
+ }
+ const char* cgroup_path() override { return reader()->cgroup_path(); }
+
+ public:
+ CgroupV1CpuacctController(const CgroupV1Controller& reader) : _reader(reader) {
+ }
+};
+
class CgroupV1Subsystem: public CgroupSubsystem {
public:
CgroupV1Subsystem(CgroupV1Controller* cpuset,
CgroupV1CpuController* cpu,
- CgroupV1Controller* cpuacct,
+ CgroupV1CpuacctController* cpuacct,
CgroupV1Controller* pids,
CgroupV1MemoryController* memory);
@@ -165,13 +195,14 @@
}
CachingCgroupController* memory_controller() { return _memory; }
CachingCgroupController* cpu_controller() { return _cpu; }
+ CgroupCpuacctController* cpuacct_controller() { return _cpuacct; }
private:
/* controllers */
CachingCgroupController* _memory = nullptr;
CgroupV1Controller* _cpuset = nullptr;
CachingCgroupController* _cpu = nullptr;
- CgroupV1Controller* _cpuacct = nullptr;
+ CgroupV1CpuacctController* _cpuacct = nullptr;
CgroupV1Controller* _pids = nullptr;
};
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2020, 2025, Red Hat Inc.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +26,8 @@
#include "cgroupV2Subsystem_linux.hpp"
#include "cgroupUtil_linux.hpp"
+#include
+
// Constructor
CgroupV2Controller::CgroupV2Controller(char* mount_path,
char *cgroup_path,
@@ -60,22 +63,39 @@
log_debug(os, container)("CPU Shares is: %d", -1);
return -1;
}
+ // cg v2 values must be in range [1-10000]
+ assert(shares_int >= 1 && shares_int <= 10000, "invariant");
// CPU shares (OCI) value needs to get translated into
// a proper Cgroups v2 value. See:
- // https://github.com/containers/crun/blob/master/crun.1.md#cpu-controller
+ // https://github.com/containers/crun/blob/1.24/crun.1.md#cpu-controller
//
// Use the inverse of (x == OCI value, y == cgroupsv2 value):
- // ((262142 * y - 1)/9999) + 2 = x
+ // y = 10^(log2(x)^2/612 + 125/612 * log2(x) - 7.0/34.0)
+ //
+ // By re-arranging it to the standard quadratic form:
+ // log2(x)^2 + 125 * log2(x) - (126 + 612 * log_10(y)) = 0
+ //
+ // Therefore, log2(x) = (-125 + sqrt( 125^2 - 4 * (-(126 + 612 * log_10(y)))))/2
//
- int x = 262142 * shares_int - 1;
- double frac = x/9999.0;
- x = ((int)frac) + 2;
+ // As a result we have the inverse (we can discount substraction of the
+ // square root value since those values result in very small numbers and the
+ // cpu shares values - OCI - are in range [2,262144]):
+ //
+ // x = 2^((-125 + sqrt(16129 + 2448* log10(y)))/2)
+ //
+ double log_multiplicand = log10(shares_int);
+ double discriminant = 16129 + 2448 * log_multiplicand;
+ double square_root = sqrt(discriminant);
+ double exponent = (-125 + square_root)/2;
+ double scaled_val = pow(2, exponent);
+ int x = (int) scaled_val;
log_trace(os, container)("Scaled CPU shares value is: %d", x);
// Since the scaled value is not precise, return the closest
// multiple of PER_CPU_SHARES for a more conservative mapping
if ( x <= PER_CPU_SHARES ) {
- // will always map to 1 CPU
+ // Don't do the multiples of PER_CPU_SHARES mapping since we
+ // have a value <= PER_CPU_SHARES
log_debug(os, container)("CPU Shares is: %d", x);
return x;
}
@@ -114,12 +134,14 @@
// Constructor
CgroupV2Subsystem::CgroupV2Subsystem(CgroupV2MemoryController * memory,
CgroupV2CpuController* cpu,
+ CgroupV2CpuacctController* cpuacct,
CgroupV2Controller unified) :
_unified(unified) {
CgroupUtil::adjust_controller(memory);
CgroupUtil::adjust_controller(cpu);
_memory = new CachingCgroupController(memory);
_cpu = new CachingCgroupController(cpu);
+ _cpuacct = cpuacct;
}
bool CgroupV2Subsystem::is_containerized() {
@@ -152,6 +174,17 @@
return period;
}
+jlong CgroupV2CpuController::cpu_usage_in_micros() {
+ julong cpu_usage;
+ bool is_ok = reader()->read_numerical_key_value("/cpu.stat", "usage_usec", &cpu_usage);
+ if (!is_ok) {
+ log_trace(os, container)("CPU Usage failed: %d", OSCONTAINER_ERROR);
+ return OSCONTAINER_ERROR;
+ }
+ log_trace(os, container)("CPU Usage is: " JULONG_FORMAT, cpu_usage);
+ return (jlong)cpu_usage;
+}
+
/* memory_usage_in_bytes
*
* Return the amount of used memory used by this cgroup and descendents
@@ -173,10 +206,16 @@
return mem_soft_limit;
}
+jlong CgroupV2MemoryController::memory_throttle_limit_in_bytes() {
+ jlong mem_throttle_limit;
+ CONTAINER_READ_NUMBER_CHECKED_MAX(reader(), "/memory.high", "Memory Throttle Limit", mem_throttle_limit);
+ return mem_throttle_limit;
+}
+
jlong CgroupV2MemoryController::memory_max_usage_in_bytes() {
- // Log this string at trace level so as to make tests happy.
- log_trace(os, container)("Maximum Memory Usage is not supported.");
- return OSCONTAINER_ERROR; // not supported
+ julong mem_max_usage;
+ CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.peak", "Maximum Memory Usage", mem_max_usage);
+ return mem_max_usage;
}
jlong CgroupV2MemoryController::rss_usage_in_bytes() {
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2020, 2024, Red Hat Inc.
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -61,6 +62,34 @@
int cpu_quota() override;
int cpu_period() override;
int cpu_shares() override;
+ jlong cpu_usage_in_micros();
+ bool is_read_only() override {
+ return reader()->is_read_only();
+ }
+ const char* subsystem_path() override {
+ return reader()->subsystem_path();
+ }
+ bool needs_hierarchy_adjustment() override {
+ return reader()->needs_hierarchy_adjustment();
+ }
+ void set_subsystem_path(const char* cgroup_path) override {
+ reader()->set_subsystem_path(cgroup_path);
+ }
+ const char* mount_point() override { return reader()->mount_point(); }
+ const char* cgroup_path() override { return reader()->cgroup_path(); }
+};
+
+class CgroupV2CpuacctController: public CgroupCpuacctController {
+ private:
+ CgroupV2CpuController* _reader;
+ CgroupV2CpuController* reader() { return _reader; }
+ public:
+ CgroupV2CpuacctController(CgroupV2CpuController* reader) : _reader(reader) {
+ }
+ // In cgroup v2, cpu usage is a part of the cpu controller.
+ jlong cpu_usage_in_micros() override {
+ return reader()->cpu_usage_in_micros();
+ }
bool is_read_only() override {
return reader()->is_read_only();
}
@@ -88,6 +117,7 @@
jlong read_memory_limit_in_bytes(julong upper_bound) override;
jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swp) override;
jlong memory_soft_limit_in_bytes(julong upper_bound) override;
+ jlong memory_throttle_limit_in_bytes() override;
jlong memory_usage_in_bytes() override;
jlong memory_max_usage_in_bytes() override;
jlong rss_usage_in_bytes() override;
@@ -117,11 +147,14 @@
CachingCgroupController* _memory = nullptr;
CachingCgroupController* _cpu = nullptr;
+ CgroupCpuacctController* _cpuacct = nullptr;
+
CgroupV2Controller* unified() { return &_unified; }
public:
CgroupV2Subsystem(CgroupV2MemoryController * memory,
CgroupV2CpuController* cpu,
+ CgroupV2CpuacctController* cpuacct,
CgroupV2Controller unified);
char * cpu_cpuset_cpus() override;
@@ -136,6 +169,7 @@
}
CachingCgroupController* memory_controller() override { return _memory; }
CachingCgroupController* cpu_controller() override { return _cpu; }
+ CgroupCpuacctController* cpuacct_controller() override { return _cpuacct; };
};
#endif // CGROUP_V2_SUBSYSTEM_LINUX_HPP
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/osContainer_linux.cpp openjdk-21-21.0.12+8/src/hotspot/os/linux/osContainer_linux.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/osContainer_linux.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/osContainer_linux.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -117,6 +117,11 @@
return cgroup_subsystem->memory_soft_limit_in_bytes();
}
+jlong OSContainer::memory_throttle_limit_in_bytes() {
+ assert(cgroup_subsystem != nullptr, "cgroup subsystem not available");
+ return cgroup_subsystem->memory_throttle_limit_in_bytes();
+}
+
jlong OSContainer::memory_usage_in_bytes() {
assert(cgroup_subsystem != nullptr, "cgroup subsystem not available");
return cgroup_subsystem->memory_usage_in_bytes();
@@ -172,6 +177,11 @@
return cgroup_subsystem->cpu_shares();
}
+jlong OSContainer::cpu_usage_in_micros() {
+ assert(cgroup_subsystem != nullptr, "cgroup subsystem not available");
+ return cgroup_subsystem->cpu_usage_in_micros();
+}
+
jlong OSContainer::pids_max() {
assert(cgroup_subsystem != nullptr, "cgroup subsystem not available");
return cgroup_subsystem->pids_max();
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/osContainer_linux.hpp openjdk-21-21.0.12+8/src/hotspot/os/linux/osContainer_linux.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/osContainer_linux.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/osContainer_linux.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,6 +53,7 @@
static jlong memory_limit_in_bytes();
static jlong memory_and_swap_limit_in_bytes();
static jlong memory_soft_limit_in_bytes();
+ static jlong memory_throttle_limit_in_bytes();
static jlong memory_usage_in_bytes();
static jlong memory_max_usage_in_bytes();
static jlong rss_usage_in_bytes();
@@ -68,6 +69,8 @@
static int cpu_shares();
+ static jlong cpu_usage_in_micros();
+
static jlong pids_max();
static jlong pids_current();
};
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/os_linux.cpp openjdk-21-21.0.12+8/src/hotspot/os/linux/os_linux.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/os_linux.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/os_linux.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -161,7 +161,7 @@
////////////////////////////////////////////////////////////////////////////////
// global variables
-julong os::Linux::_physical_memory = 0;
+physical_memory_size_type os::Linux::_physical_memory = 0;
address os::Linux::_initial_thread_stack_bottom = nullptr;
uintptr_t os::Linux::_initial_thread_stack_size = 0;
@@ -236,15 +236,16 @@
return avail_mem;
}
-julong os::available_memory() {
- return Linux::available_memory();
+bool os::available_memory(physical_memory_size_type& value) {
+ return Linux::available_memory(value);
}
-julong os::Linux::available_memory() {
+bool os::Linux::available_memory(physical_memory_size_type& value) {
julong avail_mem = available_memory_in_container();
if (avail_mem != static_cast(-1L)) {
log_trace(os)("available container memory: " JULONG_FORMAT, avail_mem);
- return avail_mem;
+ value = static_cast(avail_mem);
+ return true;
}
FILE *fp = os::fopen("/proc/meminfo", "r");
@@ -259,43 +260,52 @@
fclose(fp);
}
if (avail_mem == static_cast(-1L)) {
- avail_mem = free_memory();
+ physical_memory_size_type free_mem = 0;
+ if (!free_memory(free_mem)) {
+ return false;
+ }
+ avail_mem = static_cast(free_mem);
}
log_trace(os)("available memory: " JULONG_FORMAT, avail_mem);
- return avail_mem;
+ value = static_cast(avail_mem);
+ return true;
}
-julong os::free_memory() {
- return Linux::free_memory();
+bool os::free_memory(physical_memory_size_type& value) {
+ return Linux::free_memory(value);
}
-julong os::Linux::free_memory() {
+bool os::Linux::free_memory(physical_memory_size_type& value) {
// values in struct sysinfo are "unsigned long"
struct sysinfo si;
julong free_mem = available_memory_in_container();
if (free_mem != static_cast(-1L)) {
log_trace(os)("free container memory: " JULONG_FORMAT, free_mem);
- return free_mem;
+ value = static_cast(free_mem);
+ return true;
}
- sysinfo(&si);
+ int ret = sysinfo(&si);
+ if (ret != 0) {
+ return false;
+ }
free_mem = (julong)si.freeram * si.mem_unit;
log_trace(os)("free memory: " JULONG_FORMAT, free_mem);
- return free_mem;
+ value = static_cast(free_mem);
+ return true;
}
-julong os::physical_memory() {
- jlong phys_mem = 0;
+physical_memory_size_type os::physical_memory() {
if (OSContainer::is_containerized()) {
jlong mem_limit;
if ((mem_limit = OSContainer::memory_limit_in_bytes()) > 0) {
log_trace(os)("total container memory: " JLONG_FORMAT, mem_limit);
- return mem_limit;
+ return static_cast(mem_limit);
}
}
- phys_mem = Linux::physical_memory();
- log_trace(os)("total system memory: " JLONG_FORMAT, phys_mem);
+ physical_memory_size_type phys_mem = Linux::physical_memory();
+ log_trace(os)("total system memory: " PHYS_MEM_TYPE_FORMAT, phys_mem);
return phys_mem;
}
@@ -452,7 +462,7 @@
fclose(fp);
}
}
- _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE);
+ _physical_memory = static_cast(sysconf(_SC_PHYS_PAGES)) * static_cast(sysconf(_SC_PAGESIZE));
assert(processor_count() > 0, "linux error");
}
@@ -1828,6 +1838,8 @@
assert(rtn == 0, "fegetenv must succeed");
#endif // IA32
+ Events::log_dll_message(nullptr, "Attempting to load shared library %s", filename);
+
void * result = ::dlopen(filename, RTLD_LAZY);
if (result == nullptr) {
const char* error_report = ::dlerror();
@@ -2375,9 +2387,18 @@
st->print_cr("%s", i == OSCONTAINER_ERROR ? "not supported" : "no shares");
}
+ jlong j = OSContainer::cpu_usage_in_micros();
+ st->print("cpu_usage_in_micros: ");
+ if (j >= 0) {
+ st->print_cr(JLONG_FORMAT, j);
+ } else {
+ st->print_cr("%s", j == OSCONTAINER_ERROR ? "not supported" : "no usage");
+ }
+
OSContainer::print_container_helper(st, OSContainer::memory_limit_in_bytes(), "memory_limit_in_bytes");
OSContainer::print_container_helper(st, OSContainer::memory_and_swap_limit_in_bytes(), "memory_and_swap_limit_in_bytes");
OSContainer::print_container_helper(st, OSContainer::memory_soft_limit_in_bytes(), "memory_soft_limit_in_bytes");
+ OSContainer::print_container_helper(st, OSContainer::memory_throttle_limit_in_bytes(), "memory_throttle_limit_in_bytes");
OSContainer::print_container_helper(st, OSContainer::memory_usage_in_bytes(), "memory_usage_in_bytes");
OSContainer::print_container_helper(st, OSContainer::memory_max_usage_in_bytes(), "memory_max_usage_in_bytes");
OSContainer::print_container_helper(st, OSContainer::rss_usage_in_bytes(), "rss_usage_in_bytes");
@@ -2385,7 +2406,7 @@
OSContainer::print_version_specific_info(st);
- jlong j = OSContainer::pids_max();
+ j = OSContainer::pids_max();
st->print("maximum number of tasks: ");
if (j > 0) {
st->print_cr(JLONG_FORMAT, j);
@@ -2432,11 +2453,13 @@
// values in struct sysinfo are "unsigned long"
struct sysinfo si;
sysinfo(&si);
-
- st->print(", physical " UINT64_FORMAT "k",
- os::physical_memory() >> 10);
- st->print("(" UINT64_FORMAT "k free)",
- os::available_memory() >> 10);
+ physical_memory_size_type phys_mem = physical_memory();
+ st->print(", physical " PHYS_MEM_TYPE_FORMAT "k",
+ phys_mem >> 10);
+ physical_memory_size_type avail_mem = 0;
+ (void)os::available_memory(avail_mem);
+ st->print("(" PHYS_MEM_TYPE_FORMAT "k free)",
+ avail_mem >> 10);
st->print(", swap " UINT64_FORMAT "k",
((jlong)si.totalswap * si.mem_unit) >> 10);
st->print("(" UINT64_FORMAT "k free)",
@@ -5388,7 +5411,7 @@
if (core_pattern[0] == '|') {
written = jio_snprintf(buffer, bufferSize,
- "\"%s\" (or dumping to %s/core.%d)",
+ "\"%s\" (alternatively, falling back to %s/core.%d)",
&core_pattern[1], p, current_process_id());
} else if (pid_pos != nullptr) {
*pid_pos = '\0';
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/linux/os_linux.hpp openjdk-21-21.0.12+8/src/hotspot/os/linux/os_linux.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/linux/os_linux.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/linux/os_linux.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -51,11 +51,11 @@
protected:
- static julong _physical_memory;
+ static physical_memory_size_type _physical_memory;
static pthread_t _main_thread;
- static julong available_memory();
- static julong free_memory();
+ static bool available_memory(physical_memory_size_type& value);
+ static bool free_memory(physical_memory_size_type& value);
static void initialize_system_info();
@@ -127,7 +127,7 @@
static address initial_thread_stack_bottom(void) { return _initial_thread_stack_bottom; }
static uintptr_t initial_thread_stack_size(void) { return _initial_thread_stack_size; }
- static julong physical_memory() { return _physical_memory; }
+ static physical_memory_size_type physical_memory() { return _physical_memory; }
static julong host_swap();
static intptr_t* ucontext_get_sp(const ucontext_t* uc);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/posix/os_posix.cpp openjdk-21-21.0.12+8/src/hotspot/os/posix/os_posix.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/posix/os_posix.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/posix/os_posix.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -105,49 +105,63 @@
size_t os::_os_min_stack_allowed = PTHREAD_STACK_MIN;
// Check core dump limit and report possible place where core can be found
-void os::check_dump_limit(char* buffer, size_t bufferSize) {
+void os::check_core_dump_prerequisites(char* buffer, size_t bufferSize, bool check_only) {
+ stringStream buf(buffer, bufferSize);
if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) {
- jio_snprintf(buffer, bufferSize, "CreateCoredumpOnCrash is disabled from command line");
- VMError::record_coredump_status(buffer, false);
- return;
- }
-
- int n;
- struct rlimit rlim;
- bool success;
-
- char core_path[PATH_MAX];
- n = get_core_path(core_path, PATH_MAX);
-
- if (n <= 0) {
- jio_snprintf(buffer, bufferSize, "core.%d (may not exist)", current_process_id());
- success = true;
+ buf.print("CreateCoredumpOnCrash is disabled from command line");
+ VMError::record_coredump_status(buf.freeze(), false);
+ } else {
+ struct rlimit rlim;
+ bool success = true;
+ bool warn = true;
+ char core_path[PATH_MAX];
+ if (get_core_path(core_path, PATH_MAX) <= 0) {
+ // In the warning message, let the user know.
+ if (check_only) {
+ buf.print("the core path couldn't be determined. It commonly defaults to ");
+ }
+ buf.print("core.%d%s", current_process_id(), check_only ? "" : " (may not exist)");
#ifdef LINUX
- } else if (core_path[0] == '"') { // redirect to user process
- jio_snprintf(buffer, bufferSize, "Core dumps may be processed with %s", core_path);
- success = true;
+ } else if (core_path[0] == '"') { // redirect to user process
+ if (check_only) {
+ buf.print("core dumps may be further processed by the following: ");
+ } else {
+ buf.print("Determined by the following: ");
+ }
+ buf.print("%s", core_path);
#endif
- } else if (getrlimit(RLIMIT_CORE, &rlim) != 0) {
- jio_snprintf(buffer, bufferSize, "%s (may not exist)", core_path);
- success = true;
- } else {
- switch(rlim.rlim_cur) {
- case RLIM_INFINITY:
- jio_snprintf(buffer, bufferSize, "%s", core_path);
- success = true;
- break;
- case 0:
- jio_snprintf(buffer, bufferSize, "Core dumps have been disabled. To enable core dumping, try \"ulimit -c unlimited\" before starting Java again");
- success = false;
- break;
- default:
- jio_snprintf(buffer, bufferSize, "%s (max size " UINT64_FORMAT " k). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", core_path, uint64_t(rlim.rlim_cur) / K);
- success = true;
- break;
+ } else if (getrlimit(RLIMIT_CORE, &rlim) != 0) {
+ if (check_only) {
+ buf.print("the rlimit couldn't be determined. If resource limits permit, the core dump will be located at ");
+ }
+ buf.print("%s%s", core_path, check_only ? "" : " (may not exist)");
+ } else {
+ switch(rlim.rlim_cur) {
+ case RLIM_INFINITY:
+ buf.print("%s", core_path);
+ warn = false;
+ break;
+ case 0:
+ buf.print("%s dumps have been disabled. To enable core dumping, try \"ulimit -c unlimited\" before starting Java again", check_only ? "core" : "Core");
+ success = false;
+ break;
+ default:
+ if (check_only) {
+ buf.print("core dumps are constrained ");
+ } else {
+ buf.print( "%s ", core_path);
+ }
+ buf.print( "(max size " UINT64_FORMAT " k). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", uint64_t(rlim.rlim_cur) / K);
+ break;
+ }
+ }
+ const char* result = buf.freeze();
+ if (!check_only) {
+ VMError::record_coredump_status(result, success);
+ } else if (warn) {
+ warning("CreateCoredumpOnCrash specified, but %s", result);
}
}
-
- VMError::record_coredump_status(buffer, success);
}
int os::get_native_stack(address* stack, int frames, int toSkip) {
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/posix/perfMemory_posix.cpp openjdk-21-21.0.12+8/src/hotspot/os/posix/perfMemory_posix.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/posix/perfMemory_posix.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/posix/perfMemory_posix.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -112,6 +112,10 @@
result = ::close(fd);
if (result == OS_ERR) {
warning("Could not close %s: %s\n", destfile, os::strerror(errno));
+ } else {
+ if (!successful_write) {
+ remove(destfile);
+ }
}
}
FREE_C_HEAP_ARRAY(char, destfile);
@@ -954,6 +958,7 @@
warning("Insufficient space for shared memory file:\n %s\nTry using the -Djava.io.tmpdir= option to select an alternate temp location.\n", filename);
}
result = OS_ERR;
+ remove(filename);
break;
}
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/windows/os_windows.cpp openjdk-21-21.0.12+8/src/hotspot/os/windows/os_windows.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os/windows/os_windows.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/windows/os_windows.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -832,25 +832,30 @@
}
-julong os::available_memory() {
- return win32::available_memory();
+bool os::available_memory(physical_memory_size_type& value) {
+ return win32::available_memory(value);
}
-julong os::free_memory() {
- return win32::available_memory();
+bool os::free_memory(physical_memory_size_type& value) {
+ return win32::available_memory(value);
}
-julong os::win32::available_memory() {
+bool os::win32::available_memory(physical_memory_size_type& value) {
// Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
// value if total memory is larger than 4GB
MEMORYSTATUSEX ms;
ms.dwLength = sizeof(ms);
- GlobalMemoryStatusEx(&ms);
-
- return (julong)ms.ullAvailPhys;
+ BOOL res = GlobalMemoryStatusEx(&ms);
+ if (res == TRUE) {
+ value = static_cast(ms.ullAvailPhys);
+ return true;
+ } else {
+ assert(false, "GlobalMemoryStatusEx failed in os::win32::available_memory(): %lu", ::GetLastError());
+ return false;
+ }
}
-julong os::physical_memory() {
+physical_memory_size_type os::physical_memory() {
return win32::physical_memory();
}
@@ -1269,38 +1274,50 @@
static HANDLE dumpFile = nullptr;
-// Check if dump file can be created.
-void os::check_dump_limit(char* buffer, size_t buffsz) {
- bool status = true;
+// Check if core dump is active and if a core dump file can be created
+void os::check_core_dump_prerequisites(char* buffer, size_t bufferSize, bool check_only) {
if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) {
- jio_snprintf(buffer, buffsz, "CreateCoredumpOnCrash is disabled from command line");
- status = false;
- }
-
+ jio_snprintf(buffer, bufferSize, "CreateCoredumpOnCrash is disabled from command line");
+ VMError::record_coredump_status(buffer, false);
+ } else {
+ bool success = true;
+ bool warn = true;
#ifndef ASSERT
- if (!os::win32::is_windows_server() && FLAG_IS_DEFAULT(CreateCoredumpOnCrash)) {
- jio_snprintf(buffer, buffsz, "Minidumps are not enabled by default on client versions of Windows");
- status = false;
- }
+ if (!os::win32::is_windows_server() && FLAG_IS_DEFAULT(CreateCoredumpOnCrash)) {
+ jio_snprintf(buffer, bufferSize, "Minidumps are not enabled by default on client versions of Windows");
+ success = false;
+ warn = true;
+ }
#endif
- if (status) {
- const char* cwd = get_current_directory(nullptr, 0);
- int pid = current_process_id();
- if (cwd != nullptr) {
- jio_snprintf(buffer, buffsz, "%s\\hs_err_pid%u.mdmp", cwd, pid);
- } else {
- jio_snprintf(buffer, buffsz, ".\\hs_err_pid%u.mdmp", pid);
+ if (success) {
+ if (!check_only) {
+ const char* cwd = get_current_directory(nullptr, 0);
+ int pid = current_process_id();
+ if (cwd != nullptr) {
+ jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp", cwd, pid);
+ } else {
+ jio_snprintf(buffer, bufferSize, ".\\hs_err_pid%u.mdmp", pid);
+ }
+
+ if (dumpFile == nullptr &&
+ (dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr))
+ == INVALID_HANDLE_VALUE) {
+ jio_snprintf(buffer, bufferSize, "Failed to create minidump file (0x%x).", GetLastError());
+ success = false;
+ }
+ } else {
+ // For now on Windows, there are no more checks that we can do
+ warn = false;
+ }
}
- if (dumpFile == nullptr &&
- (dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr))
- == INVALID_HANDLE_VALUE) {
- jio_snprintf(buffer, buffsz, "Failed to create minidump file (0x%x).", GetLastError());
- status = false;
+ if (!check_only) {
+ VMError::record_coredump_status(buffer, success);
+ } else if (warn) {
+ warning("CreateCoredumpOnCrash specified, but %s", buffer);
}
}
- VMError::record_coredump_status(buffer, status);
}
void os::abort(bool dump_core, void* siginfo, const void* context) {
@@ -1632,6 +1649,7 @@
// same architecture as Hotspot is running on
void * os::dll_load(const char *name, char *ebuf, int ebuflen) {
log_info(os)("attempting shared library load of %s", name);
+ Events::log_dll_message(nullptr, "Attempting to load shared library %s", name);
void * result = LoadLibrary(name);
if (result != nullptr) {
@@ -4062,25 +4080,25 @@
return (_initial_pid ? _initial_pid : _getpid());
}
-int os::win32::_processor_type = 0;
+int os::win32::_processor_type = 0;
// Processor level is not available on non-NT systems, use vm_version instead
-int os::win32::_processor_level = 0;
-julong os::win32::_physical_memory = 0;
+int os::win32::_processor_level = 0;
+physical_memory_size_type os::win32::_physical_memory = 0;
-bool os::win32::_is_windows_server = false;
+bool os::win32::_is_windows_server = false;
// 6573254
// Currently, the bug is observed across all the supported Windows releases,
// including the latest one (as of this writing - Windows Server 2012 R2)
-bool os::win32::_has_exit_bug = true;
+bool os::win32::_has_exit_bug = true;
-int os::win32::_major_version = 0;
-int os::win32::_minor_version = 0;
-int os::win32::_build_number = 0;
-int os::win32::_build_minor = 0;
+int os::win32::_major_version = 0;
+int os::win32::_minor_version = 0;
+int os::win32::_build_number = 0;
+int os::win32::_build_minor = 0;
-bool os::win32::_processor_group_warning_displayed = false;
-bool os::win32::_job_object_processor_group_warning_displayed = false;
+bool os::win32::_processor_group_warning_displayed = false;
+bool os::win32::_job_object_processor_group_warning_displayed = false;
void getWindowsInstallationType(char* buffer, int bufferSize) {
HKEY hKey;
@@ -4295,8 +4313,11 @@
// also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
// dwMemoryLoad (% of memory in use)
- GlobalMemoryStatusEx(&ms);
- _physical_memory = ms.ullTotalPhys;
+ BOOL res = GlobalMemoryStatusEx(&ms);
+ if (res != TRUE) {
+ assert(false, "GlobalMemoryStatusEx failed in os::win32::initialize_system_info(): %lu", ::GetLastError());
+ }
+ _physical_memory = static_cast(ms.ullTotalPhys);
if (FLAG_IS_DEFAULT(MaxRAM)) {
// Adjust MaxRAM according to the maximum virtual address space available.
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os/windows/os_windows.hpp openjdk-21-21.0.12+8/src/hotspot/os/windows/os_windows.hpp
--- openjdk-21-21.0.11+10/src/hotspot/os/windows/os_windows.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os/windows/os_windows.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -38,18 +38,18 @@
friend class os;
protected:
- static int _processor_type;
- static int _processor_level;
- static julong _physical_memory;
- static bool _is_windows_server;
- static bool _has_exit_bug;
- static bool _processor_group_warning_displayed;
- static bool _job_object_processor_group_warning_displayed;
-
- static int _major_version;
- static int _minor_version;
- static int _build_number;
- static int _build_minor;
+ static int _processor_type;
+ static int _processor_level;
+ static physical_memory_size_type _physical_memory;
+ static bool _is_windows_server;
+ static bool _has_exit_bug;
+ static bool _processor_group_warning_displayed;
+ static bool _job_object_processor_group_warning_displayed;
+
+ static int _major_version;
+ static int _minor_version;
+ static int _build_number;
+ static int _build_minor;
static void print_windows_version(outputStream* st);
static void print_uptime_info(outputStream* st);
@@ -102,9 +102,9 @@
static int processor_level() {
return _processor_level;
}
- static julong available_memory();
- static julong free_memory();
- static julong physical_memory() { return _physical_memory; }
+ static bool available_memory(physical_memory_size_type& value);
+ static bool free_memory(physical_memory_size_type& value);
+ static physical_memory_size_type physical_memory() { return _physical_memory; }
// load dll from Windows system directory or Windows directory
static HINSTANCE load_Windows_dll(const char* name, char *ebuf, int ebuflen);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/os_cpu/linux_arm/macroAssembler_linux_arm_32.cpp openjdk-21-21.0.12+8/src/hotspot/os_cpu/linux_arm/macroAssembler_linux_arm_32.cpp
--- openjdk-21-21.0.11+10/src/hotspot/os_cpu/linux_arm/macroAssembler_linux_arm_32.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/os_cpu/linux_arm/macroAssembler_linux_arm_32.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -247,9 +247,9 @@
Label loop;
assert_different_registers(memval_lo, memval_hi, result, oldval_lo,
oldval_hi, newval_lo, newval_hi, base);
- assert(memval_hi == memval_lo + 1 && memval_lo < R9, "cmpxchg_long: illegal registers");
- assert(oldval_hi == oldval_lo + 1 && oldval_lo < R9, "cmpxchg_long: illegal registers");
- assert(newval_hi == newval_lo + 1 && newval_lo < R9, "cmpxchg_long: illegal registers");
+ assert(memval_hi == as_Register(memval_lo->encoding() + 1) && memval_lo->encoding() < R9->encoding(), "cmpxchg_long: illegal registers");
+ assert(oldval_hi == as_Register(oldval_lo->encoding() + 1) && oldval_lo->encoding() < R9->encoding(), "cmpxchg_long: illegal registers");
+ assert(newval_hi == as_Register(newval_lo->encoding() + 1) && newval_lo->encoding() < R9->encoding(), "cmpxchg_long: illegal registers");
assert(result != R10, "cmpxchg_long: illegal registers");
assert(base != R10, "cmpxchg_long: illegal registers");
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/compiler/compileBroker.cpp openjdk-21-21.0.12+8/src/hotspot/share/compiler/compileBroker.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/compiler/compileBroker.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/compiler/compileBroker.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1033,7 +1033,9 @@
if (new_c2_count <= old_c2_count && new_c1_count <= old_c1_count) return;
// Now, we do the more expensive operations.
- julong free_memory = os::free_memory();
+ physical_memory_size_type free_memory = 0;
+ // Return value ignored - defaulting to 0 on failure.
+ (void)os::free_memory(free_memory);
// If SegmentedCodeCache is off, both values refer to the single heap (with type CodeBlobType::All).
size_t available_cc_np = CodeCache::unallocated_capacity(CodeBlobType::MethodNonProfiled),
available_cc_p = CodeCache::unallocated_capacity(CodeBlobType::MethodProfiled);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.cpp openjdk-21-21.0.12+8/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -30,6 +30,7 @@
#include "code/icBuffer.hpp"
#include "compiler/oopMap.hpp"
#include "gc/g1/g1Allocator.inline.hpp"
+#include "gc/g1/g1Analytics.hpp"
#include "gc/g1/g1Arguments.hpp"
#include "gc/g1/g1BarrierSet.hpp"
#include "gc/g1/g1BatchedTask.hpp"
@@ -492,6 +493,13 @@
gclocker_retry_count += 1;
}
+ // Has the gc overhead limit been reached in the meantime? If so, this mutator
+ // should receive null even when unsuccessfully scheduling a collection as well
+ // for global consistency.
+ if (gc_overhead_limit_exceeded()) {
+ return nullptr;
+ }
+
// We can reach here if we were unsuccessful in scheduling a
// collection (because another thread beat us to it) or if we were
// stalled due to the GC locker. In either can we should retry the
@@ -760,7 +768,12 @@
GCLocker::stall_until_clear();
gclocker_retry_count += 1;
}
-
+ // Has the gc overhead limit been reached in the meantime? If so, this mutator
+ // should receive null even when unsuccessfully scheduling a collection as well
+ // for global consistency.
+ if (gc_overhead_limit_exceeded()) {
+ return nullptr;
+ }
// We can reach here if we were unsuccessful in scheduling a
// collection (because another thread beat us to it) or if we were
@@ -981,27 +994,64 @@
}
}
+void G1CollectedHeap::update_gc_overhead_counter() {
+ assert(SafepointSynchronize::is_at_safepoint(), "precondition");
+
+ if (!UseGCOverheadLimit) {
+ return;
+ }
+
+ bool gc_time_over_limit = (_policy->analytics()->long_term_pause_time_ratio() * 100) >= GCTimeLimit;
+ double free_space_percent = percent_of(num_free_or_available_regions() * HeapRegion::GrainBytes, max_capacity());
+ bool free_space_below_limit = free_space_percent < GCHeapFreeLimit;
+
+ log_debug(gc)("GC Overhead Limit: GC Time %f Free Space %f Counter %zu",
+ (_policy->analytics()->long_term_pause_time_ratio() * 100),
+ free_space_percent,
+ _gc_overhead_counter);
+
+ if (gc_time_over_limit && free_space_below_limit) {
+ _gc_overhead_counter++;
+ } else {
+ _gc_overhead_counter = 0;
+ }
+}
+
+bool G1CollectedHeap::gc_overhead_limit_exceeded() {
+ return _gc_overhead_counter >= GCOverheadLimitThreshold;
+}
+
HeapWord* G1CollectedHeap::satisfy_failed_allocation_helper(size_t word_size,
bool do_gc,
bool maximal_compaction,
bool expect_null_mutator_alloc_region,
bool* gc_succeeded) {
*gc_succeeded = true;
- // Let's attempt the allocation first.
- HeapWord* result =
- attempt_allocation_at_safepoint(word_size,
- expect_null_mutator_alloc_region);
- if (result != nullptr) {
- return result;
- }
+ // Skip allocation if GC overhead limit has been exceeded to let the mutator run
+ // into an OOME. It can either exit "gracefully" or try to free up memory asap.
+ // For the latter situation, keep running GCs. If the mutator frees up enough
+ // memory quickly enough, the overhead(s) will go below the threshold(s) again
+ // and the VM may continue running.
+ // If we did not continue garbage collections, the (gc overhead) limit may decrease
+ // enough by itself to not count as exceeding the limit any more, in the worst
+ // case bouncing back-and-forth all the time.
+ if (!gc_overhead_limit_exceeded()) {
+ // Let's attempt the allocation first.
+ HeapWord* result =
+ attempt_allocation_at_safepoint(word_size,
+ expect_null_mutator_alloc_region);
+ if (result != nullptr) {
+ return result;
+ }
- // In a G1 heap, we're supposed to keep allocation from failing by
- // incremental pauses. Therefore, at least for now, we'll favor
- // expansion over collection. (This might change in the future if we can
- // do something smarter than full collection to satisfy a failed alloc.)
- result = expand_and_allocate(word_size);
- if (result != nullptr) {
- return result;
+ // In a G1 heap, we're supposed to keep allocation from failing by
+ // incremental pauses. Therefore, at least for now, we'll favor
+ // expansion over collection. (This might change in the future if we can
+ // do something smarter than full collection to satisfy a failed alloc.)
+ result = expand_and_allocate(word_size);
+ if (result != nullptr) {
+ return result;
+ }
}
if (do_gc) {
@@ -1025,6 +1075,10 @@
bool* succeeded) {
assert_at_safepoint_on_vm_thread();
+ // Update GC overhead limits after the initial garbage collection leading to this
+ // allocation attempt.
+ update_gc_overhead_counter();
+
// Attempts to allocate followed by Full GC.
HeapWord* result =
satisfy_failed_allocation_helper(word_size,
@@ -1062,6 +1116,10 @@
assert(!soft_ref_policy()->should_clear_all_soft_refs(),
"Flag should have been handled and cleared prior to this point");
+ if (gc_overhead_limit_exceeded()) {
+ log_info(gc)("GC Overhead Limit exceeded too often (%zu).", GCOverheadLimitThreshold);
+ }
+
// What else? We might try synchronous finalization later. If the total
// space available is large enough for the allocation, then a more
// complete compaction phase than we've tried so far might be
@@ -1230,6 +1288,7 @@
G1CollectedHeap::G1CollectedHeap() :
CollectedHeap(),
+ _gc_overhead_counter(0),
_service_thread(nullptr),
_periodic_gc_task(nullptr),
_free_arena_memory_task(nullptr),
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.hpp openjdk-21-21.0.12+8/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
--- openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/gc/g1/g1CollectedHeap.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -169,6 +169,17 @@
friend class G1CheckRegionAttrTableClosure;
private:
+ // GC Overhead Limit functionality related members.
+ //
+ // The goal is to return null for allocations prematurely (before really going
+ // OOME) in case both GC CPU usage (>= GCTimeLimit) and not much available free
+ // memory (<= GCHeapFreeLimit) so that applications can exit gracefully or try
+ // to keep running by easing off memory.
+ uintx _gc_overhead_counter; // The number of consecutive garbage collections we were over the limits.
+
+ void update_gc_overhead_counter();
+ bool gc_overhead_limit_exceeded();
+
G1ServiceThread* _service_thread;
G1ServiceTask* _periodic_gc_task;
G1MonotonicArenaFreeMemoryTask* _free_arena_memory_task;
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/gc/shared/gcInitLogger.cpp openjdk-21-21.0.12+8/src/hotspot/share/gc/shared/gcInitLogger.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/gc/shared/gcInitLogger.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/gc/shared/gcInitLogger.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -63,8 +63,8 @@
}
void GCInitLogger::print_memory() {
- julong memory = os::physical_memory();
- log_info_p(gc, init)("Memory: " JULONG_FORMAT "%s",
+ physical_memory_size_type memory = os::physical_memory();
+ log_info_p(gc, init)("Memory: " PHYS_MEM_TYPE_FORMAT "%s",
byte_size_in_proper_unit(memory), proper_unit_for_byte_size(memory));
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/gc/shared/gc_globals.hpp openjdk-21-21.0.12+8/src/hotspot/share/gc/shared/gc_globals.hpp
--- openjdk-21-21.0.11+10/src/hotspot/share/gc/shared/gc_globals.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/gc/shared/gc_globals.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -477,7 +477,7 @@
"Estimate of footprint other than Java Heap") \
range(0, max_uintx) \
\
- product(bool, UseGCOverheadLimit, true, \
+ product(bool, UseGCOverheadLimit, falseInDebug, \
"Use policy to limit of proportion of time spent in GC " \
"before an OutOfMemory error is thrown") \
\
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/gc/x/xLargePages.cpp openjdk-21-21.0.12+8/src/hotspot/share/gc/x/xLargePages.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/gc/x/xLargePages.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/gc/x/xLargePages.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -31,7 +31,8 @@
void XLargePages::initialize() {
pd_initialize();
- log_info_p(gc, init)("Memory: " JULONG_FORMAT "M", os::physical_memory() / M);
+ const size_t memory = os::physical_memory();
+ log_info_p(gc, init)("Memory: " PROPERFMT, PROPERFMTARGS(memory));
log_info_p(gc, init)("Large Page Support: %s", to_string());
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/gc/z/zLargePages.cpp openjdk-21-21.0.12+8/src/hotspot/share/gc/z/zLargePages.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/gc/z/zLargePages.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/gc/z/zLargePages.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -31,7 +31,8 @@
void ZLargePages::initialize() {
pd_initialize();
- log_info_p(gc, init)("Memory: " JULONG_FORMAT "M", os::physical_memory() / M);
+ const size_t memory = static_cast(os::physical_memory());
+ log_info_p(gc, init)("Memory: " PROPERFMT, PROPERFMTARGS(memory));
log_info_p(gc, init)("Large Page Support: %s", to_string());
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/jfr/jni/jfrJniMethod.cpp openjdk-21-21.0.12+8/src/hotspot/share/jfr/jni/jfrJniMethod.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/jfr/jni/jfrJniMethod.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/jfr/jni/jfrJniMethod.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -402,9 +402,9 @@
#ifdef LINUX
// We want the host memory, not the container limit.
// os::physical_memory() would return the container limit.
- return os::Linux::physical_memory();
+ return static_cast(os::Linux::physical_memory());
#else
- return os::physical_memory();
+ return static_cast(os::physical_memory());
#endif
JVM_END
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -35,6 +35,7 @@
#include "memory/resourceArea.hpp"
#include "oops/access.inline.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/os.hpp"
#include "utilities/align.hpp"
UnifiedOopRef DFSClosure::_reference_stack[max_dfs_depth];
@@ -68,9 +69,27 @@
rs.process();
}
+static address calculate_headroom_limit() {
+ static constexpr size_t required_headroom = K * 64;
+ const Thread* const t = Thread::current_or_null();
+ return t->stack_end() + required_headroom;
+}
+
DFSClosure::DFSClosure(EdgeStore* edge_store, JFRBitSet* mark_bits, const Edge* start_edge)
:_edge_store(edge_store), _mark_bits(mark_bits), _start_edge(start_edge),
- _max_depth(max_dfs_depth), _depth(0), _ignore_root_set(false) {
+ _max_depth(max_dfs_depth), _depth(0), _ignore_root_set(false),
+ _headroom_limit(calculate_headroom_limit()) {
+}
+
+bool DFSClosure::have_headroom() const {
+ const address sp = (address) os::current_stack_pointer();
+#ifdef ASSERT
+ const Thread* const t = Thread::current_or_null();
+ assert(t->is_VM_thread(), "invariant");
+ assert(t->is_in_full_stack(_headroom_limit), "invariant");
+ assert(t->is_in_full_stack(sp), "invariant");
+#endif
+ return sp > _headroom_limit;
}
void DFSClosure::closure_impl(UnifiedOopRef reference, const oop pointee) {
@@ -98,7 +117,7 @@
}
}
assert(_max_depth >= 1, "invariant");
- if (_depth < _max_depth - 1) {
+ if (_depth < _max_depth - 1 && have_headroom()) {
_depth++;
pointee->oop_iterate(this);
assert(_depth > 0, "invariant");
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.hpp openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.hpp
--- openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -46,12 +46,15 @@
size_t _max_depth;
size_t _depth;
bool _ignore_root_set;
+ const address _headroom_limit;
DFSClosure(EdgeStore* edge_store, JFRBitSet* mark_bits, const Edge* start_edge);
void add_chain();
void closure_impl(UnifiedOopRef reference, const oop pointee);
+ bool have_headroom() const;
+
public:
virtual ReferenceIterationMode reference_iteration_mode() { return DO_FIELDS_EXCEPT_REFERENT; }
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -236,12 +236,25 @@
// quick reject, will not fit
return;
}
- sample = _list->reuse(_priority_queue->pop());
+ ObjectSample* popped = _priority_queue->pop();
+ size_t popped_span = popped->span();
+ ObjectSample* previous = popped->prev();
+ sample = _list->reuse(popped);
+ assert(sample != nullptr, "invariant");
+ if (previous != nullptr) {
+ push_span(previous, popped_span);
+ sample->set_span(span);
+ } else {
+ // The removed sample was the youngest sample in the list, which means the new sample is now the youngest
+ // sample. It should cover the spans of both.
+ sample->set_span(span + popped_span);
+ }
} else {
sample = _list->get();
+ assert(sample != nullptr, "invariant");
+ sample->set_span(span);
}
- assert(sample != nullptr, "invariant");
sample->set_thread_id(thread_id);
if (virtual_thread) {
sample->set_thread_is_virtual();
@@ -255,7 +268,6 @@
sample->set_stack_trace_hash(stacktrace_hash);
}
- sample->set_span(allocated);
sample->set_object(cast_to_oop(obj));
sample->set_allocated(allocated);
sample->set_allocation_time(JfrTicks::now());
@@ -282,14 +294,18 @@
ObjectSample* const previous = sample->prev();
// push span onto previous
if (previous != nullptr) {
- _priority_queue->remove(previous);
- previous->add_span(sample->span());
- _priority_queue->push(previous);
+ push_span(previous, sample->span());
}
_priority_queue->remove(sample);
_list->release(sample);
}
+void ObjectSampler::push_span(ObjectSample* sample, size_t span) {
+ _priority_queue->remove(sample);
+ sample->add_span(span);
+ _priority_queue->push(sample);
+}
+
ObjectSample* ObjectSampler::last() const {
return _list->last();
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp
--- openjdk-21-21.0.11+10/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -64,6 +64,7 @@
void add(HeapWord* object, size_t size, traceid thread_id, bool virtual_thread, const JfrBlobHandle& bh, JavaThread* thread);
void scavenge();
void remove_dead(ObjectSample* sample);
+ void push_span(ObjectSample* sample, size_t span);
const ObjectSample* item_at(int index) const;
ObjectSample* item_at(int index);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp openjdk-21-21.0.12+8/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -515,10 +515,13 @@
* the total memory reported is the amount of memory configured for the guest OS by the hypervisor.
*/
TRACE_REQUEST_FUNC(PhysicalMemory) {
- u8 totalPhysicalMemory = os::physical_memory();
+ physical_memory_size_type totalPhysicalMemory = os::physical_memory();
EventPhysicalMemory event;
event.set_totalSize(totalPhysicalMemory);
- event.set_usedSize(totalPhysicalMemory - os::available_memory());
+ physical_memory_size_type avail_mem = 0;
+ // Return value ignored - defaulting to 0 on failure.
+ (void)os::available_memory(avail_mem);
+ event.set_usedSize(totalPhysicalMemory - avail_mem);
event.commit();
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/jfr/recorder/jfrRecorder.cpp openjdk-21-21.0.12+8/src/hotspot/share/jfr/recorder/jfrRecorder.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/jfr/recorder/jfrRecorder.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/jfr/recorder/jfrRecorder.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -227,7 +227,7 @@
}
bool JfrRecorder::on_create_vm_3() {
- assert(JvmtiEnvBase::get_phase() == JVMTI_PHASE_LIVE, "invalid init sequence");
+ JVMTI_ONLY( assert(JvmtiEnvBase::get_phase() == JVMTI_PHASE_LIVE, "invalid init sequence, phase is %d", (int)JvmtiEnvBase::get_phase()); )
return Arguments::is_dumping_archive() || launch_command_line_recordings(JavaThread::current());
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiAgentList.cpp openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiAgentList.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiAgentList.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiAgentList.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -200,6 +200,11 @@
// Invokes Agent_OnAttach for agents loaded dynamically during runtime.
void JvmtiAgentList::load_agent(const char* agent_name, bool is_absolute_path,
const char* options, outputStream* st) {
+ if (JvmtiEnvBase::get_phase() != JVMTI_PHASE_LIVE) {
+ st->print_cr("Dynamic agent loading is only permitted in the live phase");
+ return;
+ }
+
JvmtiAgent* const agent = new JvmtiAgent(agent_name, options, is_absolute_path, /* dynamic agent */ true);
if (agent->load(st)) {
add(agent);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiClassFileReconstituter.cpp openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiClassFileReconstituter.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiClassFileReconstituter.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiClassFileReconstituter.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -992,6 +992,11 @@
void JvmtiClassFileReconstituter::copy_bytecodes(const methodHandle& mh,
unsigned char* bytecodes) {
+ // We must copy bytecodes only from linked classes.
+ // Being linked guarantees we are not getting bytecodes at
+ // the same time the linking process is rewriting them.
+ guarantee(mh->method_holder()->is_linked(), "Bytecodes must be copied from a linked class");
+
// use a BytecodeStream to iterate over the bytecodes. JVM/fast bytecodes
// and the breakpoint bytecode are converted to their original bytecodes.
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiEnv.cpp openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiEnv.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiEnv.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiEnv.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -452,6 +452,18 @@
InstanceKlass* ik = InstanceKlass::cast(klass);
if (ik->get_cached_class_file_bytes() == nullptr) {
+ // Link the class to avoid races with the rewriter. This will call the verifier also
+ // on the class. Linking is also done in VM_RedefineClasses below, but we need
+ // to keep that for other VM_RedefineClasses callers.
+ JavaThread* THREAD = current_thread;
+ ik->link_class(THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ // Retransform/JVMTI swallows error messages. Using this class will rerun the verifier in a context
+ // that propagates the VerifyError, if thrown.
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INVALID_CLASS;
+ }
+
// Not cached, we need to reconstitute the class file from the
// VM representation. We don't attach the reconstituted class
// bytes to the InstanceKlass here because they have not been
@@ -3600,7 +3612,8 @@
JvmtiEnv::GetBytecodes(Method* method, jint* bytecode_count_ptr, unsigned char** bytecodes_ptr) {
NULL_CHECK(method, JVMTI_ERROR_INVALID_METHODID);
- methodHandle mh(Thread::current(), method);
+ JavaThread* current_thread = JavaThread::current();
+ methodHandle mh(current_thread, method);
jint size = (jint)mh->code_size();
jvmtiError err = allocate(size, bytecodes_ptr);
if (err != JVMTI_ERROR_NONE) {
@@ -3609,6 +3622,13 @@
(*bytecode_count_ptr) = size;
// get byte codes
+ // Make sure the class is verified and rewritten first.
+ JavaThread* THREAD = current_thread;
+ mh->method_holder()->link_class(THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INVALID_CLASS;
+ }
JvmtiClassFileReconstituter::copy_bytecodes(mh, *bytecodes_ptr);
return JVMTI_ERROR_NONE;
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiRedefineClasses.cpp openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiRedefineClasses.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiRedefineClasses.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/prims/jvmtiRedefineClasses.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1375,10 +1375,12 @@
// constant pools
HandleMark hm(current);
InstanceKlass* the_class = get_ik(_class_defs[i].klass);
-
+ physical_memory_size_type avail_mem = 0;
+ // Return value ignored - defaulting to 0 on failure.
+ (void)os::available_memory(avail_mem);
log_debug(redefine, class, load)
- ("loading name=%s kind=%d (avail_mem=" UINT64_FORMAT "K)",
- the_class->external_name(), _class_load_kind, os::available_memory() >> 10);
+ ("loading name=%s kind=%d (avail_mem=" PHYS_MEM_TYPE_FORMAT "K)",
+ the_class->external_name(), _class_load_kind, avail_mem >> 10);
ClassFileStream st((u1*)_class_defs[i].class_bytes,
_class_defs[i].class_byte_count,
@@ -1543,9 +1545,10 @@
return JVMTI_ERROR_INTERNAL;
}
}
-
+ // Return value ignored - defaulting to 0 on failure.
+ (void)os::available_memory(avail_mem);
log_debug(redefine, class, load)
- ("loaded name=%s (avail_mem=" UINT64_FORMAT "K)", the_class->external_name(), os::available_memory() >> 10);
+ ("loaded name=%s (avail_mem=" PHYS_MEM_TYPE_FORMAT "K)", the_class->external_name(), avail_mem >> 10);
}
return JVMTI_ERROR_NONE;
@@ -4453,9 +4456,12 @@
ResourceMark rm(current);
// increment the classRedefinedCount field in the_class and in any
// direct and indirect subclasses of the_class
+ physical_memory_size_type avail_mem = 0;
+ // Return value ignored - defaulting to 0 on failure.
+ (void)os::available_memory(avail_mem);
log_info(redefine, class, load)
- ("redefined name=%s, count=%d (avail_mem=" UINT64_FORMAT "K)",
- the_class->external_name(), java_lang_Class::classRedefinedCount(the_class->java_mirror()), os::available_memory() >> 10);
+ ("redefined name=%s, count=%d (avail_mem=" PHYS_MEM_TYPE_FORMAT "K)",
+ the_class->external_name(), java_lang_Class::classRedefinedCount(the_class->java_mirror()), avail_mem >> 10);
Events::log_redefinition(current, "redefined class name=%s, count=%d",
the_class->external_name(),
java_lang_Class::classRedefinedCount(the_class->java_mirror()));
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/prims/whitebox.cpp openjdk-21-21.0.12+8/src/hotspot/share/prims/whitebox.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/prims/whitebox.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/prims/whitebox.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -2408,8 +2408,8 @@
// Physical memory of the host machine (including containers)
WB_ENTRY(jlong, WB_HostPhysicalMemory(JNIEnv* env, jobject o))
- LINUX_ONLY(return os::Linux::physical_memory();)
- return os::physical_memory();
+ LINUX_ONLY(return static_cast(os::Linux::physical_memory());)
+ return static_cast(os::physical_memory());
WB_END
// Physical swap of the host machine (including containers), Linux only.
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/runtime/abstract_vm_version.cpp openjdk-21-21.0.12+8/src/hotspot/share/runtime/abstract_vm_version.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/runtime/abstract_vm_version.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/runtime/abstract_vm_version.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -262,6 +262,8 @@
#define HOTSPOT_BUILD_COMPILER "MS VC++ 17.13 (VS2022)"
#elif _MSC_VER == 1944
#define HOTSPOT_BUILD_COMPILER "MS VC++ 17.14 (VS2022)"
+ #elif _MSC_VER == 1950
+ #define HOTSPOT_BUILD_COMPILER "MS VC++ 18.0 (VS2026)"
#else
#define HOTSPOT_BUILD_COMPILER "unknown MS VC++:" XSTR(_MSC_VER)
#endif
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/runtime/arguments.cpp openjdk-21-21.0.12+8/src/hotspot/share/runtime/arguments.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/runtime/arguments.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/runtime/arguments.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1552,13 +1552,13 @@
!FLAG_IS_DEFAULT(MaxRAM));
if (override_coop_limit) {
if (FLAG_IS_DEFAULT(MaxRAM)) {
- phys_mem = os::physical_memory();
+ phys_mem = static_cast(os::physical_memory());
FLAG_SET_ERGO(MaxRAM, (uint64_t)phys_mem);
} else {
phys_mem = (julong)MaxRAM;
}
} else {
- phys_mem = FLAG_IS_DEFAULT(MaxRAM) ? MIN2(os::physical_memory(), (julong)MaxRAM)
+ phys_mem = FLAG_IS_DEFAULT(MaxRAM) ? MIN2(static_cast(os::physical_memory()), (julong)MaxRAM)
: (julong)MaxRAM;
}
@@ -1694,7 +1694,8 @@
// Thus, we need to make sure we're using a julong for intermediate
// calculations.
julong initHeapSize;
- julong total_memory = os::physical_memory();
+ physical_memory_size_type phys_mem = os::physical_memory();
+ julong total_memory = static_cast(phys_mem);
if (total_memory < (julong) 256 * M) {
jio_fprintf(defaultStream::error_stream(),
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.cpp openjdk-21-21.0.12+8/src/hotspot/share/runtime/os.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/runtime/os.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1174,12 +1174,13 @@
#endif // PRODUCT
get_summary_cpu_info(buf, buflen);
st->print("%s, ", buf);
- size_t mem = physical_memory()/G;
+ physical_memory_size_type phys_mem = physical_memory();
+ physical_memory_size_type mem = phys_mem/G;
if (mem == 0) { // for low memory systems
- mem = physical_memory()/M;
- st->print("%d cores, " SIZE_FORMAT "M, ", processor_count(), mem);
+ mem = phys_mem/M;
+ st->print("%d cores, " PHYS_MEM_TYPE_FORMAT "M, ", processor_count(), mem);
} else {
- st->print("%d cores, " SIZE_FORMAT "G, ", processor_count(), mem);
+ st->print("%d cores, " PHYS_MEM_TYPE_FORMAT "G, ", processor_count(), mem);
}
get_summary_os_info(buf, buflen);
st->print_raw(buf);
@@ -1900,17 +1901,17 @@
return true;
}
// Then actually look at the machine
- bool result = false;
- const unsigned int server_processors = 2;
- const julong server_memory = 2UL * G;
+ bool result = false;
+ const unsigned int server_processors = 2;
+ const physical_memory_size_type server_memory = 2UL * G;
// We seem not to get our full complement of memory.
// We allow some part (1/8?) of the memory to be "missing",
// based on the sizes of DIMMs, and maybe graphics cards.
- const julong missing_memory = 256UL * M;
-
+ const physical_memory_size_type missing_memory = 256UL * M;
+ physical_memory_size_type phys_mem = os::physical_memory();
/* Is this a server class machine? */
if ((os::active_processor_count() >= (int)server_processors) &&
- (os::physical_memory() >= (server_memory - missing_memory))) {
+ (phys_mem >= server_memory - missing_memory)) {
const unsigned int logical_processors =
VM_Version::logical_processors_per_package();
if (logical_processors > 1) {
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.hpp openjdk-21-21.0.12+8/src/hotspot/share/runtime/os.hpp
--- openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/runtime/os.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -320,10 +320,10 @@
// For example, on Linux, "available" memory (`MemAvailable` in `/proc/meminfo`) is greater
// than "free" memory (`MemFree` in `/proc/meminfo`) because Linux can free memory
// aggressively (e.g. clear caches) so that it becomes available.
- static julong available_memory();
- static julong free_memory();
+ [[nodiscard]] static bool available_memory(physical_memory_size_type& value);
+ [[nodiscard]] static bool free_memory(physical_memory_size_type& value);
- static julong physical_memory();
+ static physical_memory_size_type physical_memory();
static bool has_allocatable_memory_limit(size_t* limit);
static bool is_server_class_machine();
@@ -925,7 +925,7 @@
// provided buffer as a scratch buffer. The status message which will be written
// into the error log either is file location or a short error message, depending
// on the checking result.
- static void check_dump_limit(char* buffer, size_t bufferSize);
+ static void check_core_dump_prerequisites(char* buffer, size_t bufferSize, bool check_only = false);
// Get the default path to the core file
// Returns the length of the string
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/runtime/thread.cpp openjdk-21-21.0.12+8/src/hotspot/share/runtime/thread.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/runtime/thread.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/runtime/thread.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -36,6 +36,8 @@
#include "memory/resourceArea.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/atomic.hpp"
+#include "runtime/globals.hpp"
+#include "runtime/globals_extension.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/javaThread.inline.hpp"
#include "runtime/nonJavaThread.hpp"
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/runtime/threadSMR.cpp openjdk-21-21.0.12+8/src/hotspot/share/runtime/threadSMR.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/runtime/threadSMR.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/runtime/threadSMR.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -727,7 +727,8 @@
}
}
}
- } else if (!thread->is_exiting()) {
+ } else if (includes(thread) && !thread->is_exiting()) {
+ // The thread is protected by this list and has not yet exited
return thread;
}
return nullptr;
@@ -866,7 +867,7 @@
ThreadsList *old_list = xchg_java_thread_list(new_list);
free_list(old_list);
- if (ThreadIdTable::is_initialized()) {
+ if (ThreadIdTable::is_initialized_acquire()) {
jlong tid = SharedRuntime::get_java_tid(thread);
ThreadIdTable::add_thread(tid, thread);
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/runtime/threads.cpp openjdk-21-21.0.12+8/src/hotspot/share/runtime/threads.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/runtime/threads.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/runtime/threads.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -63,6 +63,7 @@
#include "runtime/flags/jvmFlagLimit.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/globals.hpp"
+#include "runtime/globals_extension.hpp"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/java.hpp"
#include "runtime/javaCalls.hpp"
@@ -682,6 +683,11 @@
log_info(os)("Initialized VM with process ID %d", os::current_process_id());
+ if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && CreateCoredumpOnCrash) {
+ char buffer[2*JVM_MAXPATHLEN];
+ os::check_core_dump_prerequisites(buffer, sizeof(buffer), true);
+ }
+
// Signal Dispatcher needs to be started before VMInit event is posted
os::initialize_jdk_signal_support(CHECK_JNI_ERR);
@@ -1038,7 +1044,7 @@
MutexLocker throttle_ml(UseThreadsLockThrottleLock ? ThreadsLockThrottle_lock : nullptr);
MonitorLocker ml(Threads_lock);
- if (ThreadIdTable::is_initialized()) {
+ if (ThreadIdTable::is_initialized_acquire()) {
// This cleanup must be done before the current thread's GC barrier
// is detached since we need to touch the threadObj oop.
jlong tid = SharedRuntime::get_java_tid(p);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/services/management.cpp openjdk-21-21.0.12+8/src/hotspot/share/services/management.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/services/management.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/services/management.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -978,7 +978,7 @@
return ClassLoadingService::class_method_data_size();
case JMM_OS_MEM_TOTAL_PHYSICAL_BYTES:
- return os::physical_memory();
+ return static_cast(os::physical_memory());
default:
return -1;
@@ -1130,6 +1130,7 @@
// create dummy snapshot
dump_result.add_thread_snapshot();
} else {
+ assert(dump_result.t_list()->includes(jt), "Must be protected");
dump_result.add_thread_snapshot(jt);
}
}
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/services/threadIdTable.cpp openjdk-21-21.0.12+8/src/hotspot/share/services/threadIdTable.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/services/threadIdTable.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/services/threadIdTable.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,6 +1,6 @@
/*
-* Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2019, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,7 @@
#include "precompiled.hpp"
#include "classfile/javaClasses.inline.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/handles.hpp"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/javaThread.inline.hpp"
#include "runtime/threadSMR.hpp"
@@ -83,24 +83,25 @@
// Lazily creates the table and populates it with the given
// thread list
void ThreadIdTable::lazy_initialize(const ThreadsList *threads) {
- if (!_is_initialized) {
+ if (!Atomic::load_acquire(&_is_initialized)) {
{
// There is no obvious benefit in allowing the thread table
// to be concurrently populated during initialization.
MutexLocker ml(ThreadIdTableCreate_lock);
- if (_is_initialized) {
+ if (Atomic::load(&_is_initialized)) {
return;
}
create_table(threads->length());
- _is_initialized = true;
+ Atomic::release_store(&_is_initialized, true);
}
+
for (uint i = 0; i < threads->length(); i++) {
JavaThread* thread = threads->thread_at(i);
- oop tobj = thread->threadObj();
+ Handle tobj = Handle(JavaThread::current(), thread->threadObj());
if (tobj != nullptr) {
- jlong java_tid = java_lang_Thread::thread_id(tobj);
MutexLocker ml(Threads_lock);
if (!thread->is_exiting()) {
+ jlong java_tid = java_lang_Thread::thread_id(tobj());
// Must be inside the lock to ensure that we don't add a thread to the table
// that has just passed the removal point in Threads::remove().
add_thread(java_tid, thread);
@@ -213,7 +214,7 @@
};
void ThreadIdTable::do_concurrent_work(JavaThread* jt) {
- assert(_is_initialized, "Thread table is not initialized");
+ assert(Atomic::load(&_is_initialized), "Thread table is not initialized");
_has_work = false;
double load_factor = get_load_factor();
log_debug(thread, table)("Concurrent work, load factor: %g", load_factor);
@@ -223,7 +224,8 @@
}
JavaThread* ThreadIdTable::add_thread(jlong tid, JavaThread* java_thread) {
- assert(_is_initialized, "Thread table is not initialized");
+ assert(Threads_lock->owned_by_self(), "Must hold Threads_lock");
+ assert(Atomic::load(&_is_initialized), "Thread table is not initialized");
Thread* thread = Thread::current();
ThreadIdTableLookup lookup(tid);
ThreadGet tg;
@@ -242,7 +244,7 @@
}
JavaThread* ThreadIdTable::find_thread_by_tid(jlong tid) {
- assert(_is_initialized, "Thread table is not initialized");
+ assert(Atomic::load(&_is_initialized), "Thread table is not initialized");
Thread* thread = Thread::current();
ThreadIdTableLookup lookup(tid);
ThreadGet tg;
@@ -251,7 +253,8 @@
}
bool ThreadIdTable::remove_thread(jlong tid) {
- assert(_is_initialized, "Thread table is not initialized");
+ assert(Threads_lock->owned_by_self(), "Must hold Threads_lock");
+ assert(Atomic::load(&_is_initialized), "Thread table is not initialized");
Thread* thread = Thread::current();
ThreadIdTableLookup lookup(tid);
return _local_table->remove(thread, lookup);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/services/threadIdTable.hpp openjdk-21-21.0.12+8/src/hotspot/share/services/threadIdTable.hpp
--- openjdk-21-21.0.11+10/src/hotspot/share/services/threadIdTable.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/services/threadIdTable.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,6 +1,6 @@
/*
-* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2019, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@
#define SHARE_SERVICES_THREADIDTABLE_HPP
#include "memory/allStatic.hpp"
+#include "runtime/atomic.hpp"
class JavaThread;
class ThreadsList;
@@ -41,7 +42,9 @@
public:
// Initialization
static void lazy_initialize(const ThreadsList* threads);
- static bool is_initialized() { return _is_initialized; }
+ static bool is_initialized_acquire() {
+ return Atomic::load_acquire(&_is_initialized);
+ }
// Lookup and list management
static JavaThread* find_thread_by_tid(jlong tid);
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/utilities/globalDefinitions.hpp openjdk-21-21.0.12+8/src/hotspot/share/utilities/globalDefinitions.hpp
--- openjdk-21-21.0.11+10/src/hotspot/share/utilities/globalDefinitions.hpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/utilities/globalDefinitions.hpp 2026-07-13 06:55:55.000000000 +0000
@@ -131,6 +131,7 @@
#define UINT64_FORMAT_X "0x%" PRIx64
#define UINT64_FORMAT_X_0 "0x%016" PRIx64
#define UINT64_FORMAT_W(width) "%" #width PRIu64
+#define PHYS_MEM_TYPE_FORMAT "%" PRIu64
// Format integers which change size between 32- and 64-bit.
#define SSIZE_FORMAT "%" PRIdPTR
@@ -426,6 +427,11 @@
#define HEAP_CHANGE_FORMAT_ARGS(_name_, _prev_used_, _prev_capacity_, _used_, _capacity_) \
(_name_), (_prev_used_) / K, (_prev_capacity_) / K, (_used_) / K, (_capacity_) / K
+// This typedef is to address the issue of running a 32-bit VM. In this case the amount
+// of physical memory may not fit in size_t, so we have to have a larger type. Once 32-bit
+// is deprecated, one can use size_t.
+typedef uint64_t physical_memory_size_type;
+
//----------------------------------------------------------------------------------------------------
// VM type definitions
diff -Nru openjdk-21-21.0.11+10/src/hotspot/share/utilities/vmError.cpp openjdk-21-21.0.12+8/src/hotspot/share/utilities/vmError.cpp
--- openjdk-21-21.0.11+10/src/hotspot/share/utilities/vmError.cpp 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/hotspot/share/utilities/vmError.cpp 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2020 SAP SE. All rights reserved.
* Copyright (c) 2023, Red Hat, Inc. and/or its affiliates.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -1704,7 +1704,7 @@
ShowMessageBoxOnError = false;
}
- os::check_dump_limit(buffer, sizeof(buffer));
+ os::check_core_dump_prerequisites(buffer, sizeof(buffer));
// reset signal handlers or exception filter; make sure recursive crashes
// are handled properly.
diff -Nru openjdk-21-21.0.11+10/src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java openjdk-21-21.0.12+8/src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java
--- openjdk-21-21.0.11+10/src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java 2026-07-13 06:55:55.000000000 +0000
@@ -154,22 +154,39 @@
@Override
public long getCpuShares() {
long sharesRaw = getLongVal("cpu.weight");
- if (sharesRaw == 100 || sharesRaw <= 0) {
+ // cg v2 value must be in range [1,10000]
+ if (sharesRaw == 100 || sharesRaw <= 0 || sharesRaw > 10000) {
return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
}
int shares = (int)sharesRaw;
// CPU shares (OCI) value needs to get translated into
// a proper Cgroups v2 value. See:
- // https://github.com/containers/crun/blob/master/crun.1.md#cpu-controller
+ // https://github.com/containers/crun/blob/1.24/crun.1.md#cpu-controller
//
// Use the inverse of (x == OCI value, y == cgroupsv2 value):
- // ((262142 * y - 1)/9999) + 2 = x
+ // y = 10^(log2(x)^2/612 + 125/612 * log2(x) - 7.0/34.0)
//
- int x = 262142 * shares - 1;
- double frac = x/9999.0;
- x = ((int)frac) + 2;
+ // By re-arranging it to the standard quadratic form:
+ // log2(x)^2 + 125 * log2(x) - (126 + 612 * log_10(y)) = 0
+ //
+ // Therefore, log2(x) = (-125 + sqrt( 125^2 - 4 * (-(126 + 612 * log_10(y)))))/2
+ //
+ // As a result we have the inverse (we can discount substraction of the
+ // square root value since those values result in very small numbers and the
+ // cpu shares values - OCI - are in range [2-262144])
+ //
+ // x = 2^((-125 + sqrt(16129 + 2448* log10(y)))/2)
+ //
+ double logMultiplicand = Math.log10(shares);
+ double discriminant = 16129 + 2448 * logMultiplicand;
+ double squareRoot = Math.sqrt(discriminant);
+ double exponent = (-125 + squareRoot)/2;
+ double scaledValue = Math.pow(2, exponent);
+
+ int x = (int)scaledValue;
if ( x <= PER_CPU_SHARES ) {
- return PER_CPU_SHARES; // mimic cgroups v1
+ // Return the back-mapped value.
+ return x;
}
int f = x/PER_CPU_SHARES;
int lower_multiple = f * PER_CPU_SHARES;
diff -Nru openjdk-21-21.0.11+10/src/java.base/share/classes/java/net/InetAddress.java openjdk-21-21.0.12+8/src/java.base/share/classes/java/net/InetAddress.java
--- openjdk-21-21.0.11+10/src/java.base/share/classes/java/net/InetAddress.java 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.base/share/classes/java/net/InetAddress.java 2026-07-13 06:55:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -194,8 +194,8 @@
* caching. Likewise, a system admin can configure a different
* negative caching TTL value when needed or extend the usage of the stale data.
*
- * Three Java security properties control the TTL values used for
- * positive and negative host name resolution caching:
+ *
Three Java {@linkplain java.security.Security security} properties control
+ * the TTL values used for positive and negative host name resolution caching:
*
*
* networkaddress.cache.ttl
diff -Nru openjdk-21-21.0.11+10/src/java.base/share/classes/java/net/doc-files/net-properties.html openjdk-21-21.0.12+8/src/java.base/share/classes/java/net/doc-files/net-properties.html
--- openjdk-21-21.0.11+10/src/java.base/share/classes/java/net/doc-files/net-properties.html 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.base/share/classes/java/net/doc-files/net-properties.html 2026-07-13 06:55:55.000000000 +0000
@@ -1,6 +1,6 @@
", 3);
+ if (cend < 0) return false;
+ i = (unsigned) cend + 3;
+ continue;
+ }
+ if (i + 9 <= len && !memcmp (svg + i, "", 3);
+ if (cend < 0) return false;
+ i = (unsigned) cend + 3;
+ continue;
+ }
+
+ bool closing = (i + 1 < len && svg[i + 1] == '/');
+ bool special = (i + 1 < len && (svg[i + 1] == '!' || svg[i + 1] == '?'));
+
+ unsigned gt = i + 1;
+ char quote = 0;
+ while (gt < len)
+ {
+ char c = svg[gt];
+ if (quote)
+ {
+ if (c == quote) quote = 0;
+ }
+ else
+ {
+ if (c == '"' || c == '\'')
+ quote = c;
+ else if (c == '>')
+ break;
+ }
+ gt++;
+ }
+ if (gt >= len)
+ return false;
+
+ if (special)
+ {
+ i = gt + 1;
+ continue;
+ }
+
+ unsigned p = i + (closing ? 2 : 1);
+ while (p < gt && isspace ((unsigned char) svg[p])) p++;
+ const char *name = svg + p;
+ unsigned name_len = 0;
+ while (p + name_len < gt)
+ {
+ unsigned char c = (unsigned char) name[name_len];
+ if (!(isalnum (c) || c == '_' || c == '-' || c == ':'))
+ break;
+ name_len++;
+ }
+ bool is_defs = (name_len == 4 && !memcmp (name, "defs", 4));
+
+ if (closing)
+ {
+ if (!depth)
+ {
+ i = gt + 1;
+ continue;
+ }
+
+ open_elem_t e = stack[--depth];
+ unsigned end = gt + 1;
+
+ if (e.id.len)
+ {
+ if (unlikely (!id_entries->push_or_fail (id_entry_t {e.id, (uint32_t) e.start, (uint32_t) end})))
+ return false;
+
+ if (e.in_defs_content)
+ {
+ if (unlikely (!defs_entries->push_or_fail ()))
+ return false;
+ auto &slot = defs_entries->tail ();
+ slot.id = e.id;
+ slot.start = e.start;
+ slot.end = end;
+ }
+
+ hb_codepoint_t gid;
+ if (parse_glyph_id_span (e.id, &gid))
+ {
+ if (unlikely (!glyph_spans->push_or_fail (glyph_entry_t {gid, (uint32_t) e.start, (uint32_t) end})))
+ return false;
+ }
+ }
+
+ if (e.is_defs && defs_depth)
+ defs_depth--;
+
+ i = end;
+ continue;
+ }
+
+ SVG::svg_id_span_t id = {};
+ parse_id_in_start_tag (svg, i, gt, &id);
+
+ unsigned r = gt;
+ while (r > i && isspace ((unsigned char) svg[r - 1])) r--;
+ bool self_closing = (r > i && svg[r - 1] == '/');
+
+ open_elem_t e = {};
+ e.start = i;
+ e.id = id;
+ e.in_defs_content = defs_depth > 0;
+ e.is_defs = is_defs;
+
+ if (self_closing)
+ {
+ unsigned end = gt + 1;
+ if (e.id.len)
+ {
+ if (unlikely (!id_entries->push_or_fail (id_entry_t {e.id, (uint32_t) e.start, (uint32_t) end})))
+ return false;
+
+ if (e.in_defs_content)
+ {
+ if (unlikely (!defs_entries->push_or_fail ()))
+ return false;
+ auto &slot = defs_entries->tail ();
+ slot.id = e.id;
+ slot.start = e.start;
+ slot.end = end;
+ }
+
+ hb_codepoint_t gid;
+ if (parse_glyph_id_span (e.id, &gid))
+ {
+ if (unlikely (!glyph_spans->push_or_fail (glyph_entry_t {gid, (uint32_t) e.start, (uint32_t) end})))
+ return false;
+ }
+ }
+ }
+ else
+ {
+ if (unlikely (depth >= MAX_DEPTH))
+ return false;
+ stack[depth++] = e;
+ if (is_defs)
+ defs_depth++;
+ }
+
+ i = gt + 1;
+ }
+
+ return true;
+}
+
+} /* namespace _hb_svg_cache_impl */
+
+inline
+SVG::accelerator_t::accelerator_t (hb_face_t *face)
+{
+ table = hb_sanitize_context_t ().reference_table (face);
+ doc_caches.init ();
+ unsigned doc_count = table->get_document_count ();
+ if (doc_count && unlikely (!doc_caches.resize (doc_count)))
+ doc_caches.clear ();
+ for (unsigned i = 0; i < doc_caches.length; i++)
+ doc_caches.arrayZ[i].set_relaxed (nullptr);
+}
+
+inline
+SVG::accelerator_t::~accelerator_t ()
+{
+ for (unsigned i = 0; i < doc_caches.length; i++)
+ destroy_doc_cache (doc_caches.arrayZ[i].get_relaxed ());
+ doc_caches.fini ();
+ table.destroy ();
+}
+
+inline void
+SVG::accelerator_t::destroy_doc_cache (svg_doc_cache_t *doc)
+{
+ if (!doc)
+ return;
+ doc->glyph_spans.fini ();
+ doc->defs_entries.fini ();
+ doc->id_spans.fini ();
+ hb_blob_destroy (doc->blob);
+ hb_free (doc);
+}
+
+inline SVG::svg_doc_cache_t *
+SVG::accelerator_t::make_doc_cache (hb_blob_t *image,
+ const char *svg,
+ unsigned len,
+ hb_codepoint_t start_glyph,
+ hb_codepoint_t end_glyph) const
+{
+ static const uint32_t INVALID_SPAN = 0xFFFFFFFFu;
+
+ auto *doc = (svg_doc_cache_t *) hb_malloc (sizeof (svg_doc_cache_t));
+ if (!doc)
+ return nullptr;
+
+ doc->blob = nullptr;
+ doc->svg = nullptr;
+ doc->len = 0;
+ doc->defs_entries.init ();
+ doc->start_glyph = HB_CODEPOINT_INVALID;
+ doc->end_glyph = HB_CODEPOINT_INVALID;
+ doc->glyph_spans.init ();
+ doc->id_spans.init ();
+
+ doc->blob = hb_blob_reference (image);
+ doc->svg = svg;
+ doc->len = len;
+ doc->start_glyph = start_glyph;
+ doc->end_glyph = end_glyph;
+
+ if (unlikely (start_glyph == HB_CODEPOINT_INVALID || end_glyph < start_glyph))
+ {
+ destroy_doc_cache (doc);
+ return nullptr;
+ }
+
+ unsigned glyph_count = end_glyph - start_glyph + 1;
+ if (!doc->glyph_spans.resize ((int) glyph_count))
+ {
+ destroy_doc_cache (doc);
+ return nullptr;
+ }
+ for (unsigned i = 0; i < glyph_count; i++)
+ doc->glyph_spans.arrayZ[i] = hb_pair_t (INVALID_SPAN, INVALID_SPAN);
+
+ hb_vector_t<_hb_svg_cache_impl::glyph_entry_t> glyph_spans;
+ glyph_spans.init ();
+ hb_vector_t<_hb_svg_cache_impl::id_entry_t> id_entries;
+ id_entries.init ();
+ if (!_hb_svg_cache_impl::parse_cache_entries_linear (svg, len,
+ &doc->defs_entries,
+ &glyph_spans,
+ &id_entries))
+ {
+ id_entries.fini ();
+ glyph_spans.fini ();
+ destroy_doc_cache (doc);
+ return nullptr;
+ }
+
+ for (unsigned i = 0; i < glyph_spans.length; i++)
+ {
+ const auto &span = glyph_spans.arrayZ[i];
+ if (unlikely (span.glyph < start_glyph || span.glyph > end_glyph))
+ continue;
+ doc->glyph_spans.arrayZ[span.glyph - start_glyph] = hb_pair_t (span.start, span.end);
+ }
+
+ for (unsigned i = 0; i < id_entries.length; i++)
+ {
+ const auto &e = id_entries.arrayZ[i];
+ hb_pair_t *out = nullptr;
+ if (doc->id_spans.has (e.id, &out))
+ continue;
+ if (unlikely (!doc->id_spans.set (e.id, hb_pair_t (e.start, e.end))))
+ {
+ id_entries.fini ();
+ glyph_spans.fini ();
+ destroy_doc_cache (doc);
+ return nullptr;
+ }
+ }
+
+ id_entries.fini ();
+ glyph_spans.fini ();
+ return doc;
+}
+
+inline const SVG::svg_doc_cache_t *
+SVG::accelerator_t::get_or_create_doc_cache (hb_blob_t *image,
+ const char *svg,
+ unsigned len,
+ unsigned doc_index,
+ hb_codepoint_t start_glyph,
+ hb_codepoint_t end_glyph) const
+{
+ if (doc_index >= doc_caches.length)
+ return nullptr;
+
+ auto &slot = doc_caches.arrayZ[doc_index];
+ auto *doc = slot.get_acquire ();
+ if (doc)
+ return doc;
+
+ auto *fresh = make_doc_cache (image, svg, len, start_glyph, end_glyph);
+ if (!fresh)
+ return nullptr;
+
+ auto *expected = (svg_doc_cache_t *) nullptr;
+ if (slot.cmpexch (expected, fresh))
+ return fresh;
+
+ destroy_doc_cache (fresh);
+ return expected;
+}
+
+inline const char *
+SVG::accelerator_t::doc_cache_get_svg (const svg_doc_cache_t *doc,
+ unsigned *len) const
+{
+ if (!doc)
+ {
+ if (len) *len = 0;
+ return nullptr;
+ }
+ if (len) *len = doc->len;
+ return doc->svg;
+}
+
+inline const hb_vector_t *
+SVG::accelerator_t::doc_cache_get_defs_entries (const svg_doc_cache_t *doc) const
+{
+ return doc ? &doc->defs_entries : nullptr;
+}
+
+inline bool
+SVG::accelerator_t::doc_cache_get_glyph_span (const svg_doc_cache_t *doc,
+ hb_codepoint_t glyph,
+ unsigned *start,
+ unsigned *end) const
+{
+ static const uint32_t INVALID_SPAN = 0xFFFFFFFFu;
+ if (!doc || doc->start_glyph == HB_CODEPOINT_INVALID ||
+ glyph < doc->start_glyph || glyph > doc->end_glyph)
+ return false;
+
+ const auto &span = doc->glyph_spans.arrayZ[glyph - doc->start_glyph];
+ if (span.first == INVALID_SPAN)
+ return false;
+ if (unlikely (span.first > span.second || span.second > doc->len))
+ return false;
+
+ if (start) *start = span.first;
+ if (end) *end = span.second;
+ return true;
+}
+
+inline bool
+SVG::accelerator_t::doc_cache_find_id_span (const svg_doc_cache_t *doc,
+ svg_id_span_t id,
+ unsigned *start,
+ unsigned *end) const
+{
+ if (!doc || !id.p || !id.len)
+ return false;
+ hb_pair_t *span = nullptr;
+ if (!doc->id_spans.has (id, &span))
+ return false;
+ if (unlikely (span->first > span->second || span->second > doc->len))
+ return false;
+ if (start) *start = span->first;
+ if (end) *end = span->second;
+ return true;
+}
+
+inline bool
+SVG::accelerator_t::doc_cache_find_id_cstr (const svg_doc_cache_t *doc,
+ const char *id,
+ unsigned *start,
+ unsigned *end) const
+{
+ if (!id) return false;
+ svg_id_span_t key = {id, (unsigned) strlen (id)};
+ return doc_cache_find_id_span (doc, key, start, end);
+}
+
struct SVG_accelerator_t : SVG::accelerator_t {
SVG_accelerator_t (hb_face_t *face) : SVG::accelerator_t (face) {}
};
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh 2026-07-13 06:55:55.000000000 +0000
@@ -616,7 +616,7 @@
public:
DEFINE_SIZE_MIN (4 + 4 * Types::size);
- unsigned int get_size () const
+ size_t get_size () const
{
return min_size +
(version.to_int () >= 0x00010002u ? markGlyphSetsDef.static_size : 0) +
@@ -755,7 +755,7 @@
ComponentGlyph = 4
};
- unsigned int get_size () const
+ size_t get_size () const
{
switch (u.version.major) {
case 1: return u.version1.get_size ();
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh 2026-07-13 06:55:55.000000000 +0000
@@ -51,7 +51,11 @@
};
static inline void
-reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent)
+reverse_cursive_minor_offset (hb_glyph_position_t *pos,
+ unsigned int len,
+ unsigned int i,
+ hb_direction_t direction,
+ unsigned int new_parent)
{
int chain = pos[i].attach_chain(), type = pos[i].attach_type();
if (likely (!chain || 0 == (type & ATTACH_TYPE_CURSIVE)))
@@ -61,18 +65,28 @@
unsigned int j = (int) i + chain;
+ if (unlikely (j >= len))
+ return;
+
/* Stop if we see new parent in the chain. */
if (j == new_parent)
return;
- reverse_cursive_minor_offset (pos, j, direction, new_parent);
+ int16_t reversed_chain = -chain;
+ /* The old edge was cleared above; if the reversed distance truncates,
+ * keep it detached instead of storing a poisoned chain.
+ */
+ if (unlikely (reversed_chain != -chain))
+ return;
+
+ reverse_cursive_minor_offset (pos, len, j, direction, new_parent);
if (HB_DIRECTION_IS_HORIZONTAL (direction))
pos[j].y_offset = -pos[i].y_offset;
else
pos[j].x_offset = -pos[i].x_offset;
- pos[j].attach_chain() = -chain;
+ pos[j].attach_chain() = reversed_chain;
pos[j].attach_type() = type;
}
@@ -228,7 +242,7 @@
* previous connection now attaches to new parent. Watch out for case
* where new parent is on the path from old chain...
*/
- reverse_cursive_minor_offset (pos, child, c->direction, parent);
+ reverse_cursive_minor_offset (pos, buffer->len, child, c->direction, parent);
pos[child].attach_chain() = (int) parent - (int) child;
if (pos[child].attach_chain() != (int) parent - (int) child)
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairSet.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairSet.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairSet.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairSet.hh 2026-07-13 06:55:55.000000000 +0000
@@ -24,11 +24,11 @@
public:
DEFINE_SIZE_MIN (2);
- static unsigned get_size (unsigned len1, unsigned len2)
+ static size_t get_size (unsigned len1, unsigned len2)
{
return Types::HBGlyphID::static_size + Value::static_size * (len1 + len2);
}
- static unsigned get_size (const ValueFormat valueFormats[2])
+ static size_t get_size (const ValueFormat valueFormats[2])
{
unsigned len1 = valueFormats[0].get_len ();
unsigned len2 = valueFormats[1].get_len ();
@@ -39,7 +39,7 @@
{
const ValueFormat *valueFormats;
unsigned int len1; /* valueFormats[0].get_len() */
- unsigned int stride; /* bytes */
+ size_t stride; /* bytes */
};
bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat1.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat1.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat1.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat1.hh 2026-07-13 06:55:55.000000000 +0000
@@ -100,7 +100,7 @@
if (likely (index == NOT_COVERED)) return false;
/* This is ugly... */
- hb_buffer_t buffer;
+ hb_buffer_t buffer {};
buffer.props.direction = direction;
OT::hb_ot_apply_context_t c (1, font, &buffer, table_blob);
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat2.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat2.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat2.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePosFormat2.hh 2026-07-13 06:55:55.000000000 +0000
@@ -104,7 +104,7 @@
if (unlikely (index >= valueCount)) return false;
/* This is ugly... */
- hb_buffer_t buffer;
+ hb_buffer_t buffer {};
buffer.props.direction = direction;
OT::hb_ot_apply_context_t c (1, font, &buffer, table_blob);
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh 2026-07-13 06:55:55.000000000 +0000
@@ -64,7 +64,7 @@
// be added to ValueFormat. As such, we use the faster hb_popcount8
// that only processes the lowest 8 bits.
unsigned int get_len () const { return hb_popcount8 ((uint8_t) *this); }
- unsigned int get_size () const { return get_len () * Value::static_size; }
+ size_t get_size () const { return get_len () * Value::static_size; }
hb_vector_t get_device_table_indices () const {
unsigned i = 0;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc 2026-07-13 06:55:55.000000000 +0000
@@ -228,28 +228,28 @@
#define PROCESS_TRANSFORM_COMPONENTS \
HB_STMT_START { \
- PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TRANSLATE_X, translateX); \
- PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TRANSLATE_Y, translateY); \
- PROCESS_TRANSFORM_COMPONENT (F4DOT12, HB_PI, HAVE_ROTATION, rotation); \
- PROCESS_TRANSFORM_COMPONENT (F6DOT10, 1.0f, HAVE_SCALE_X, scaleX); \
- PROCESS_TRANSFORM_COMPONENT (F6DOT10, 1.0f, HAVE_SCALE_Y, scaleY); \
- PROCESS_TRANSFORM_COMPONENT (F4DOT12, HB_PI, HAVE_SKEW_X, skewX); \
- PROCESS_TRANSFORM_COMPONENT (F4DOT12, HB_PI, HAVE_SKEW_Y, skewY); \
- PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TCENTER_X, tCenterX); \
- PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TCENTER_Y, tCenterY); \
+ PROCESS_TRANSFORM_COMPONENT ( 0, FWORD, HAVE_TRANSLATE_X, translateX); \
+ PROCESS_TRANSFORM_COMPONENT ( 0, FWORD, HAVE_TRANSLATE_Y, translateY); \
+ PROCESS_TRANSFORM_COMPONENT (12, F4DOT12, HAVE_ROTATION, rotation); \
+ PROCESS_TRANSFORM_COMPONENT (10, F6DOT10, HAVE_SCALE_X, scaleX); \
+ PROCESS_TRANSFORM_COMPONENT (10, F6DOT10, HAVE_SCALE_Y, scaleY); \
+ PROCESS_TRANSFORM_COMPONENT (12, F4DOT12, HAVE_SKEW_X, skewX); \
+ PROCESS_TRANSFORM_COMPONENT (12, F4DOT12, HAVE_SKEW_Y, skewY); \
+ PROCESS_TRANSFORM_COMPONENT ( 0, FWORD, HAVE_TCENTER_X, tCenterX); \
+ PROCESS_TRANSFORM_COMPONENT ( 0, FWORD, HAVE_TCENTER_Y, tCenterY); \
} HB_STMT_END
hb_transform_decomposed_t<> transform;
// Read transform components
-#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
+#define PROCESS_TRANSFORM_COMPONENT(shift, type, flag, name) \
if (flags & (unsigned) flags_t::flag) \
{ \
static_assert (type::static_size == HBINT16::static_size, ""); \
if (unlikely (unsigned (end - record) < HBINT16::static_size)) \
return hb_ubytes_t (); \
hb_barrier (); \
- transform.name = mult * * (const HBINT16 *) record; \
+ transform.name = * (const HBINT16 *) record; \
record += HBINT16::static_size; \
}
PROCESS_TRANSFORM_COMPONENTS;
@@ -270,9 +270,8 @@
{
// Only use coord_setter if there's actually any axis overrides.
coord_setter_t coord_setter (axisIndices ? component_coords : hb_array ());
- // Go backwards, to reduce coord_setter vector reallocations.
- for (unsigned i = axisIndices.length; i; i--)
- coord_setter[axisIndices[i - 1]] = axisValues[i - 1];
+ for (unsigned i = 0; i < axisIndices.length; i++)
+ coord_setter[axisIndices[i]] = roundf (axisValues[i]);
if (axisIndices)
component_coords = coord_setter.get_coords ();
@@ -281,39 +280,35 @@
{
float transformValues[9];
unsigned numTransformValues = 0;
-#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
+#define PROCESS_TRANSFORM_COMPONENT(shift, type, flag, name) \
if (flags & (unsigned) flags_t::flag) \
- transformValues[numTransformValues++] = transform.name / mult;
+ transformValues[numTransformValues++] = transform.name;
PROCESS_TRANSFORM_COMPONENTS;
#undef PROCESS_TRANSFORM_COMPONENT
varStore.get_delta (transformVarIdx, coords, hb_array (transformValues, numTransformValues), cache);
numTransformValues = 0;
-#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
+#define PROCESS_TRANSFORM_COMPONENT(shift, type, flag, name) \
if (flags & (unsigned) flags_t::flag) \
- transform.name = transformValues[numTransformValues++] * mult;
+ transform.name = transformValues[numTransformValues++];
PROCESS_TRANSFORM_COMPONENTS;
#undef PROCESS_TRANSFORM_COMPONENT
}
// Divide them by their divisors
-#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
- if (flags & (unsigned) flags_t::flag) \
- { \
- HBINT16 int_v; \
- int_v = roundf (transform.name); \
- type typed_v = * (const type *) &int_v; \
- float float_v = (float) typed_v; \
- transform.name = float_v; \
- }
+#define PROCESS_TRANSFORM_COMPONENT(shift, type, flag, name) \
+ if (shift && (flags & (unsigned) flags_t::flag)) \
+ transform.name *= 1.f / (1 << shift);
PROCESS_TRANSFORM_COMPONENTS;
#undef PROCESS_TRANSFORM_COMPONENT
if (!(flags & (unsigned) flags_t::HAVE_SCALE_Y))
transform.scaleY = transform.scaleX;
+ transform.rotation *= HB_PI;
+ transform.skewX *= HB_PI;
+ transform.skewY *= HB_PI;
+
total_transform.transform (transform.to_transform ());
- total_transform.scale (c.font->x_mult ? 1.f / c.font->x_multf : 0.f,
- c.font->y_mult ? 1.f / c.font->y_multf : 0.f);
bool same_coords = component_coords.length == coords.length &&
component_coords.arrayZ == coords.arrayZ;
@@ -348,14 +343,18 @@
{
if (c.draw_session)
{
+ hb_transform_t<> leaf_transform = transform;
+ leaf_transform.x0 *= c.font->x_multf;
+ leaf_transform.y0 *= c.font->y_multf;
+
// Build a transforming pen to apply the transform.
hb_draw_funcs_t *transformer_funcs = hb_transforming_pen_get_funcs ();
- hb_transforming_pen_context_t context {transform,
+ hb_transforming_pen_context_t context {leaf_transform,
c.draw_session->funcs,
c.draw_session->draw_data,
&c.draw_session->st};
hb_draw_session_t transformer_session {transformer_funcs, &context};
- hb_draw_session_t &shape_draw_session = transform.is_identity () ? *c.draw_session : transformer_session;
+ hb_draw_session_t &shape_draw_session = leaf_transform.is_identity () ? *c.draw_session : transformer_session;
if (c.font->face->table.glyf->get_path_at (c.font, glyph, shape_draw_session, coords, c.scratch.glyf_scratch)) return true;
#ifndef HB_NO_CFF
@@ -375,7 +374,10 @@
return false;
hb_extents_t<> comp_extents (glyph_extents);
- transform.transform_extents (comp_extents);
+ hb_transform_t<> leaf_transform = transform;
+ leaf_transform.x0 *= c.font->x_multf;
+ leaf_transform.y0 *= c.font->y_multf;
+ leaf_transform.transform_extents (comp_extents);
c.extents->union_ (comp_extents);
}
return true;
@@ -399,8 +401,6 @@
parent_cache :
(this+varStore).create_cache (&static_cache);
- transform.scale (c.font->x_multf, c.font->y_multf);
-
VarCompositeGlyph::get_path_at (c,
glyph,
coords, transform,
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/CompositeGlyph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/CompositeGlyph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/CompositeGlyph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/CompositeGlyph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -33,7 +33,7 @@
};
public:
- unsigned int get_size () const
+ size_t get_size () const
{
unsigned int size = min_size;
/* glyphIndex is 24bit instead of 16bit */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -384,20 +384,24 @@
{
#ifndef HB_NO_BEYOND_64K
if (glyf_accelerator.GVAR->has_data ())
- glyf_accelerator.GVAR->apply_deltas_to_points (gid,
- coords,
- points.as_array ().sub_array (old_length),
- scratch,
- gvar_cache,
- phantom_only && type == SIMPLE);
+ {
+ if (!glyf_accelerator.GVAR->apply_deltas_to_points (gid,
+ coords,
+ points.as_array ().sub_array (old_length),
+ scratch,
+ gvar_cache,
+ phantom_only && type == SIMPLE))
+ return false;
+ }
else
#endif
- glyf_accelerator.gvar->apply_deltas_to_points (gid,
- coords,
- points.as_array ().sub_array (old_length),
- scratch,
- gvar_cache,
- phantom_only && type == SIMPLE);
+ if (!glyf_accelerator.gvar->apply_deltas_to_points (gid,
+ coords,
+ points.as_array ().sub_array (old_length),
+ scratch,
+ gvar_cache,
+ phantom_only && type == SIMPLE))
+ return false;
}
#endif
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -186,6 +186,7 @@
/* One extra item at the end, for the instruction-count below. */
if (unlikely (!bytes.check_range (&endPtsOfContours[num_contours]))) return false;
unsigned int num_points = endPtsOfContours[num_contours - 1] + 1;
+ if (unlikely (num_points < (unsigned) num_contours)) return false;
unsigned old_length = points.length;
points.alloc (points.length + num_points + 4); // Allocate for phantom points, to avoid a possible copy
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh 2026-07-13 06:55:55.000000000 +0000
@@ -121,7 +121,7 @@
if (!use_short_loca)
{
- padded_offsets.resize (0);
+ padded_offsets.clear ();
for (auto &g : glyphs)
padded_offsets.push (g.length ());
}
@@ -226,7 +226,7 @@
if (gid >= num_glyphs) return false;
auto &all_points = scratch.all_points;
- all_points.resize (0);
+ all_points.clear ();
bool phantom_only = !consumer.is_consuming_contour_points ();
if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, scratch, nullptr, nullptr, nullptr, true, true, phantom_only, coords, gvar_cache)))
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/name/name.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/name/name.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/name/name.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/OT/name/name.hh 2026-07-13 06:55:55.000000000 +0000
@@ -312,7 +312,7 @@
{
static constexpr hb_tag_t tableTag = HB_OT_TAG_name;
- unsigned int get_size () const
+ size_t get_size () const
{ return min_size + count * nameRecordZ.item_size; }
template ::min_size;
if (vertex_len < min_size) return false;
hb_barrier ();
@@ -48,7 +48,7 @@
{
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
constexpr unsigned min_size = OT::ClassDefFormat2_4::min_size;
if (vertex_len < min_size) return false;
hb_barrier ();
@@ -114,7 +114,7 @@
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
if (vertex_len < OT::ClassDef::min_size) return false;
hb_barrier ();
switch (u.format.v)
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -36,7 +36,7 @@
const OT::Layout::Common::CoverageFormat1_3* thiz,
graph_t::vertex_t& vertex
) {
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
constexpr unsigned min_size = OT::Layout::Common::CoverageFormat1_3::min_size;
if (vertex_len < min_size) return false;
hb_barrier ();
@@ -47,7 +47,7 @@
const OT::Layout::Common::CoverageFormat2_4* thiz,
graph_t::vertex_t& vertex
) {
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
constexpr unsigned min_size = OT::Layout::Common::CoverageFormat2_4::min_size;
if (vertex_len < min_size) return false;
hb_barrier ();
@@ -158,7 +158,7 @@
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
if (vertex_len < OT::Layout::Common::Coverage::min_size) return false;
hb_barrier ();
switch (u.format.v)
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/graph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/graph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/graph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/graph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -814,6 +814,11 @@
if (unlikely (!check_success (!connected_roots.in_error ()))) break;
unsigned next_space = this->next_space ();
+ if (next_space >= HB_REPACKER_MAX_SPACES)
+ {
+ check_success (false);
+ break;
+ }
num_roots_for_space_.push (0);
for (unsigned root : connected_roots)
{
@@ -1062,6 +1067,12 @@
*/
unsigned duplicate (unsigned node_idx)
{
+ if (vertices_.length >= HB_REPACKER_MAX_VERTICES)
+ {
+ check_success (false);
+ return -1;
+ }
+
positions_invalid = true;
distance_invalid = true;
@@ -1221,6 +1232,12 @@
*/
unsigned new_node (char* head, char* tail)
{
+ if (vertices_.length >= HB_REPACKER_MAX_VERTICES)
+ {
+ check_success (false);
+ return -1;
+ }
+
positions_invalid = true;
distance_invalid = true;
@@ -1384,6 +1401,11 @@
void move_to_new_space (const hb_set_t& indices)
{
+ if (num_roots_for_space_.length >= HB_REPACKER_MAX_SPACES)
+ {
+ check_success (false);
+ return;
+ }
num_roots_for_space_.push (0);
unsigned new_space = num_roots_for_space_.length - 1;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -52,7 +52,7 @@
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
return vertex_len >= OT::ExtensionFormat1::static_size;
}
@@ -76,7 +76,7 @@
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
if (vertex_len < OT::Lookup::min_size) return false;
hb_barrier ();
return vertex_len >= this->get_size ();
@@ -390,7 +390,7 @@
{
bool sanitize (const graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
if (vertex_len < OT::LookupList::min_size) return false;
hb_barrier ();
return vertex_len >= OT::LookupList::item_size * this->len;
@@ -424,7 +424,7 @@
bool sanitize (const graph_t::vertex_t& vertex)
{
- int64_t len = vertex.obj.tail - vertex.obj.head;
+ size_t len = vertex.obj.tail - vertex.obj.head;
if (len < OT::GSUBGPOS::min_size) return false;
hb_barrier ();
return len >= get_size ();
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -38,7 +38,7 @@
{
bool sanitize (graph_t::vertex_t& vertex, unsigned class_count) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
if (vertex_len < AnchorMatrix::min_size) return false;
hb_barrier ();
@@ -126,7 +126,7 @@
{
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
unsigned min_size = MarkArray::min_size;
if (vertex_len < min_size) return false;
hb_barrier ();
@@ -207,7 +207,7 @@
{
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
return vertex_len >= MarkBasePosFormat1::static_size;
}
@@ -430,7 +430,6 @@
unsigned base_coverage_id =
graph.index_for_offset (sc.this_index, &baseCoverage);
graph.add_link (&(prime->baseCoverage), prime_id, base_coverage_id);
- graph.duplicate (prime_id, base_coverage_id);
auto mark_coverage = sc.c.graph.as_table (this_index,
&markCoverage);
@@ -493,7 +492,7 @@
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
if (vertex_len < u.format.v.get_size ()) return false;
hb_barrier ();
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh 2026-07-13 06:55:55.000000000 +0000
@@ -39,7 +39,7 @@
{
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
unsigned min_size = OT::Layout::GPOS_impl::PairPosFormat1_3::min_size;
if (vertex_len < min_size) return false;
hb_barrier ();
@@ -422,7 +422,6 @@
class_def_link->objidx = class_def_2_id;
class_def_link->position = 10;
graph.vertices_[class_def_2_id].add_parent (pair_pos_prime_id, false);
- graph.duplicate (pair_pos_prime_id, class_def_2_id);
return pair_pos_prime_id;
}
@@ -624,7 +623,7 @@
bool sanitize (graph_t::vertex_t& vertex) const
{
- int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+ size_t vertex_len = vertex.obj.tail - vertex.obj.head;
if (vertex_len < u.format.v.get_size ()) return false;
hb_barrier ();
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh 2026-07-13 06:55:55.000000000 +0000
@@ -108,7 +108,7 @@
will_overflow (graph_t& graph,
hb_vector_t* overflows = nullptr)
{
- if (overflows) overflows->resize (0);
+ if (overflows) overflows->clear ();
graph.update_positions ();
hb_hashmap_t record_set;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -861,7 +861,7 @@
{
friend struct kerx;
- unsigned int get_size () const { return u.header.length; }
+ size_t get_size () const { return u.header.length; }
unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; }
template
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -987,9 +987,16 @@
{
unsigned count = chain.get_subtable_count ();
- unsigned size = sizeof (hb_aat_layout_chain_accelerator_t) -
- HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t) +
- count * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t);
+ unsigned product;
+ if (unlikely (hb_unsigned_mul_overflows (count,
+ sizeof (hb_accelerate_subtables_context_t::hb_applicable_t), &product)))
+ return nullptr;
+
+ unsigned size;
+ if (unlikely (hb_unsigned_add_overflows (sizeof (hb_aat_layout_chain_accelerator_t) -
+ HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t), product, &size))) {
+ return nullptr;
+ }
/* The following is a calloc because when we are collecting subtables,
* some of them might be invalid and hence not collect; as a result,
@@ -1026,7 +1033,7 @@
template
friend struct Chain;
- unsigned int get_size () const { return length; }
+ size_t get_size () const { return length; }
unsigned int get_type () const { return coverage & 0xFF; }
unsigned int get_coverage () const { return coverage >> (sizeof (HBUINT) * 8 - 8); }
@@ -1236,7 +1243,7 @@
c->reverse_buffer ();
}
- unsigned int get_size () const { return length; }
+ size_t get_size () const { return length; }
template
typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-algs.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-algs.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-algs.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-algs.hh 2026-07-13 06:55:55.000000000 +0000
@@ -89,7 +89,16 @@
{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
template
-struct __attribute__((packed)) hb_packed_t { Type v; };
+struct __attribute__((packed)) hb_packed_t
+{
+ hb_packed_t () = default;
+ constexpr hb_packed_t (Type V) : v (V) {}
+ operator Type () const { return v; }
+ hb_packed_t & operator = (Type V) { v = V; return *this; }
+
+ private:
+ Type v;
+};
#ifndef HB_FAST_NUM_ACCESS
@@ -134,9 +143,9 @@
#if HB_FAST_NUM_ACCESS
{
if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
- ((hb_packed_t *) v)->v = V;
+ *((hb_packed_t *) v) = V;
else
- ((hb_packed_t *) v)->v = __builtin_bswap16 (V);
+ *((hb_packed_t *) v) = __builtin_bswap16 (V);
}
#else
: v {BE ? uint8_t ((V >> 8) & 0xFF) : uint8_t ((V ) & 0xFF),
@@ -147,9 +156,9 @@
{
#if HB_FAST_NUM_ACCESS
return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
- ((const hb_packed_t *) v)->v
+ (uint16_t) *((const hb_packed_t *) v)
:
- __builtin_bswap16 (((const hb_packed_t *) v)->v)
+ __builtin_bswap16 ((uint16_t) *((const hb_packed_t *) v))
;
#else
return (BE ? (v[0] << 8) : (v[0] ))
@@ -186,9 +195,9 @@
#if HB_FAST_NUM_ACCESS
{
if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
- ((hb_packed_t *) v)->v = V;
+ *((hb_packed_t *) v) = V;
else
- ((hb_packed_t *) v)->v = __builtin_bswap32 (V);
+ *((hb_packed_t *) v) = __builtin_bswap32 (V);
}
#else
: v {BE ? uint8_t ((V >> 24) & 0xFF) : uint8_t ((V ) & 0xFF),
@@ -200,9 +209,9 @@
constexpr operator Type () const {
#if HB_FAST_NUM_ACCESS
return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
- ((const hb_packed_t *) v)->v
+ (uint32_t) *((const hb_packed_t *) v)
:
- __builtin_bswap32 (((const hb_packed_t *) v)->v)
+ __builtin_bswap32 ((uint32_t) *((const hb_packed_t *) v))
;
#else
return (BE ? (v[0] << 24) : (v[0] ))
@@ -226,9 +235,9 @@
#if HB_FAST_NUM_ACCESS
{
if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
- ((hb_packed_t *) v)->v = V;
+ *((hb_packed_t *) v) = V;
else
- ((hb_packed_t *) v)->v = __builtin_bswap64 (V);
+ *((hb_packed_t *) v) = __builtin_bswap64 (V);
}
#else
: v {BE ? uint8_t ((V >> 56) & 0xFF) : uint8_t ((V ) & 0xFF),
@@ -244,9 +253,9 @@
constexpr operator Type () const {
#if HB_FAST_NUM_ACCESS
return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
- ((const hb_packed_t *) v)->v
+ (uint64_t) *((const hb_packed_t *) v)
:
- __builtin_bswap64 (((const hb_packed_t *) v)->v)
+ __builtin_bswap64 ((uint64_t) *((const hb_packed_t *) v))
;
#else
return (BE ? (uint64_t (v[0]) << 56) : (uint64_t (v[0]) ))
@@ -276,12 +285,12 @@
{
#if HB_FAST_NUM_ACCESS
{
- if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
- {
- ((hb_packed_t *) v)->v = V;
- return;
- }
- }
+ if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
+ {
+ *((hb_packed_t *) v) = V;
+ return;
+ }
+ }
#endif
union {
@@ -289,7 +298,7 @@
hb_packed_t i;
} u = {{V}};
- const HBInt I = u.i.v;
+ const HBInt I = (IntType) u.i;
for (unsigned i = 0; i < Bytes; i++)
v[i] = I.v[i];
}
@@ -297,10 +306,10 @@
/* c++14 constexpr */ operator Type () const
{
#if HB_FAST_NUM_ACCESS
- {
- if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
- return ((const hb_packed_t *) v)->v;
- }
+ {
+ if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
+ return (Type) *((const hb_packed_t *) v);
+ }
#endif
HBInt I;
@@ -312,7 +321,7 @@
hb_packed_t f;
} u = {{I}};
- return u.f.v;
+ return (Type) u.f;
}
private: uint8_t v[Bytes];
};
@@ -1191,6 +1200,21 @@
return (size > 0) && (count >= ((unsigned int) -1) / size);
}
+static inline bool
+hb_unsigned_add_overflows (unsigned int a, unsigned int b, unsigned *result = nullptr)
+{
+#if hb_has_builtin(__builtin_add_overflow)
+ unsigned stack_result;
+ if (!result)
+ result = &stack_result;
+ return __builtin_add_overflow (a, b, result);
+#endif
+
+ if (result)
+ *result = a + b;
+ return b > (unsigned int) -1 - a;
+}
+
/*
* Sort and search.
@@ -1315,15 +1339,12 @@
/* swap a, b iff a>b */
/* a and b must not be equal! */
/* __restrict is same as restrict but better support on old machines */
-template
+template
static inline int sort_r_cmpswap(char *__restrict a,
char *__restrict b, size_t w,
- int (*compar)(const void *_a,
- const void *_b,
- Ts... _ds),
- Ts... ds)
+ Compar compar)
{
- if(compar(a, b, ds...) > 0) {
+ if(compar(a, b) > 0) {
sort_r_swap(a, b, w);
return 1;
}
@@ -1348,23 +1369,17 @@
/* Implement recursive quicksort ourselves */
/* Note: quicksort is not stable, equivalent values may be swapped */
-template
+template
static inline void sort_r_simple(void *base, size_t nel, size_t w,
- int (*compar)(const void *_a,
- const void *_b,
- Ts... _ds),
- Ts... ds)
+ Compar compar)
{
char *b = (char *)base, *end = b + nel*w;
- /* for(size_t i=0; i b && sort_r_cmpswap(pj-w,pj,w,compar,ds...); pj -= w) {}
+ for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar); pj -= w) {}
}
}
else
@@ -1375,68 +1390,36 @@
char *pl, *ple, *pr, *pre, *pivot;
char *last = b+w*(nel-1), *tmp;
- /*
- Use median of second, middle and second-last items as pivot.
- First and last may have been swapped with pivot and therefore be extreme
- */
char *l[3];
l[0] = b + w;
l[1] = b+w*(nel/2);
l[2] = last - w;
- /* printf("pivots: %i, %i, %i\n", *(int*)l[0], *(int*)l[1], *(int*)l[2]); */
-
- if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
- if(compar(l[1],l[2],ds...) > 0) {
+ if(compar(l[0],l[1]) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
+ if(compar(l[1],l[2]) > 0) {
SORT_R_SWAP(l[1], l[2], tmp);
- if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
+ if(compar(l[0],l[1]) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
}
- /* swap mid value (l[1]), and last element to put pivot as last element */
if(l[1] != last) { sort_r_swap(l[1], last, w); }
- /*
- pl is the next item on the left to be compared to the pivot
- pr is the last item on the right that was compared to the pivot
- ple is the left position to put the next item that equals the pivot
- ple is the last right position where we put an item that equals the pivot
- v- end (beyond the array)
- EEEEEELLLLLLLLuuuuuuuuGGGGGGGEEEEEEEE.
- ^- b ^- ple ^- pl ^- pr ^- pre ^- last (where the pivot is)
- Pivot comparison key:
- E = equal, L = less than, u = unknown, G = greater than, E = equal
- */
pivot = last;
ple = pl = b;
pre = pr = last;
- /*
- Strategy:
- Loop into the list from the left and right at the same time to find:
- - an item on the left that is greater than the pivot
- - an item on the right that is less than the pivot
- Once found, they are swapped and the loop continues.
- Meanwhile items that are equal to the pivot are moved to the edges of the
- array.
- */
while(pl < pr) {
- /* Move left hand items which are equal to the pivot to the far left.
- break when we find an item that is greater than the pivot */
for(; pl < pr; pl += w) {
- cmp = compar(pl, pivot, ds...);
+ cmp = compar(pl, pivot);
if(cmp > 0) { break; }
else if(cmp == 0) {
if(ple < pl) { sort_r_swap(ple, pl, w); }
ple += w;
}
}
- /* break if last batch of left hand items were equal to pivot */
if(pl >= pr) { break; }
- /* Move right hand items which are equal to the pivot to the far right.
- break when we find an item that is less than the pivot */
for(; pl < pr; ) {
- pr -= w; /* Move right pointer onto an unprocessed item */
- cmp = compar(pr, pivot, ds...);
+ pr -= w;
+ cmp = compar(pr, pivot);
if(cmp == 0) {
pre -= w;
if(pr < pre) { sort_r_swap(pr, pre, w); }
@@ -1449,22 +1432,13 @@
}
}
- pl = pr; /* pr may have gone below pl */
+ pl = pr;
- /*
- Now we need to go from: EEELLLGGGGEEEE
- to: LLLEEEEEEEGGGG
- Pivot comparison key:
- E = equal, L = less than, u = unknown, G = greater than, E = equal
- */
sort_r_swap_blocks(b, ple-b, pl-ple);
sort_r_swap_blocks(pr, pre-pr, end-pre);
- /*for(size_t i=0; i static inline void
@@ -1664,6 +1624,13 @@
double min_y, double max_y,
double &ya, double &yb, double &y)
{
+ // Guard against degenerate interval
+ if (b - a <= 0.0)
+ {
+ y = ya;
+ return a;
+ }
+
unsigned n1_2 = (unsigned) (hb_max (ceil (log2 ((b - a) / epsilon)) - 1.0, 0.0));
const unsigned n0 = 1; // Hardwired
const double k1 = 0.2 / (b - a); // Hardwired.
@@ -1674,7 +1641,8 @@
{
double x1_2 = 0.5 * (a + b);
double r = scaled_epsilon - 0.5 * (b - a);
- double xf = (yb * a - ya * b) / (yb - ya);
+ // Guard against yb == ya to prevent division by zero
+ double xf = (yb != ya) ? (yb * a - ya * b) / (yb - ya) : x1_2;
double sigma = x1_2 - xf;
double b_a = b - a;
// This has k2 = 2 hardwired for efficiency.
@@ -1705,4 +1673,51 @@
}
+/*
+ * Scope guard: runs a callable at scope exit (RAII cleanup for
+ * non-HB-type resources — raw malloc'd buffers, paired init/end
+ * calls like inflateInit/inflateEnd, FT_Done_* handles, etc.).
+ *
+ * Prefer hb_unique_ptr_t etc. for HB types; this is
+ * for the long tail of cleanup that those wrappers don't cover.
+ *
+ * Usage:
+ * void *buf = hb_malloc (len);
+ * if (!buf) return false;
+ * HB_SCOPE_GUARD (hb_free (buf));
+ * ... multiple fallible operations ...
+ * return true; // buf freed automatically on any return path
+ */
+template
+struct hb_scope_guard_t
+{
+ explicit hb_scope_guard_t (F &&f) : f (std::move (f)), active (true) {}
+ hb_scope_guard_t (hb_scope_guard_t &&o) noexcept
+ : f (std::move (o.f)), active (o.active) { o.active = false; }
+ hb_scope_guard_t (const hb_scope_guard_t &) = delete;
+ hb_scope_guard_t &operator= (const hb_scope_guard_t &) = delete;
+ hb_scope_guard_t &operator= (hb_scope_guard_t &&) = delete;
+ ~hb_scope_guard_t () { if (active) f (); }
+
+ /* Release: dismiss the guard so the cleanup does NOT run. Use
+ * when transferring ownership out of the scope. */
+ void release () { active = false; }
+
+ private:
+ F f;
+ bool active;
+};
+
+template
+static inline hb_scope_guard_t hb_make_scope_guard (F &&f)
+{ return hb_scope_guard_t (std::forward (f)); }
+
+#define HB_SCOPE_GUARD_NAME_(line) hb_scope_guard_##line
+#define HB_SCOPE_GUARD_NAME(line) HB_SCOPE_GUARD_NAME_(line)
+#define HB_SCOPE_GUARD(stmt) \
+ auto HB_SCOPE_GUARD_NAME(__LINE__) = \
+ hb_make_scope_guard ([&]() { stmt; }); \
+ (void) HB_SCOPE_GUARD_NAME(__LINE__)
+
+
#endif /* HB_ALGS_HH */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-array.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-array.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-array.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-array.hh 2026-07-13 06:55:55.000000000 +0000
@@ -32,6 +32,8 @@
#include "hb-iter.hh"
#include "hb-null.hh"
+#include
+
template
struct hb_sorted_array_t;
@@ -219,26 +221,54 @@
return false;
}
- hb_sorted_array_t qsort (int (*cmp_)(const void*, const void*))
+ hb_sorted_array_t qsort (int (*cmp)(const void*, const void*))
{
- //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), "");
if (likely (length))
- hb_qsort (arrayZ, length, this->get_item_size (), cmp_);
+ hb_qsort (arrayZ, length, this->get_item_size (), cmp);
return hb_sorted_array_t (*this);
}
- hb_sorted_array_t qsort ()
+ /* std::sort wants a strict-weak `a < b` boolean, but our other
+ * qsort overload (and most existing call sites) follow the C
+ * qsort convention of returning negative / zero / positive ints.
+ * Adapt to either via overload resolution: bool passes through;
+ * any other arithmetic return type is treated as the int signed
+ * comparator. */
+ template static bool _qsort_lt (T v) { return v < 0; }
+ static bool _qsort_lt (bool v) { return v; }
+
+ template
+ hb_sorted_array_t qsort (Compar compar)
{
- //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), "");
if (likely (length))
- hb_qsort (arrayZ, length, this->get_item_size (), Type::cmp);
+ std::sort (arrayZ, arrayZ + length,
+ [&] (const Type &a, const Type &b)
+ { return _qsort_lt (compar (a, b)); });
return hb_sorted_array_t (*this);
}
+ private:
+ template ::value)>
+ hb_sorted_array_t _qsort (hb_priority<1>)
+ {
+ return qsort ([] (const Type &a, const Type &b) { return Type::cmp (&a, &b) < 0; });
+ }
+ hb_sorted_array_t _qsort (hb_priority<0>)
+ {
+ return qsort ((int(*)(const void*, const void*)) Type::cmp);
+ }
+ public:
+
+ hb_sorted_array_t qsort ()
+ {
+ return _qsort (hb_prioritize);
+ }
+
/*
* Other methods.
*/
- unsigned int get_size () const { return length * this->get_item_size (); }
+ size_t get_size () const { return length * this->get_item_size (); }
/*
* Reverse the order of items in this array in the range [start, end).
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh 2026-07-13 06:55:55.000000000 +0000
@@ -193,6 +193,9 @@
T *get_acquire () const { return v.load (std::memory_order_acquire); }
bool cmpexch (T *old, T *new_) { return v.compare_exchange_weak (old, new_, std::memory_order_acq_rel, std::memory_order_relaxed); }
+ hb_atomic_t &operator= (const hb_atomic_t& o) { set_relaxed (o.get_relaxed ()); return *this; }
+ hb_atomic_t &operator= (hb_atomic_t&& o){ set_relaxed (o.get_relaxed ()); o.set_relaxed ({}); return *this; }
+
operator bool () const { return get_acquire () != nullptr; }
T *operator->() const { return get_acquire (); }
template
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh 2026-07-13 06:55:55.000000000 +0000
@@ -115,7 +115,7 @@
void clear ()
{
forw_map.clear ();
- back_map.resize (0);
+ back_map.clear ();
}
/* Add a mapping from lhs to rhs with a unique value if lhs is unknown.
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh 2026-07-13 06:55:55.000000000 +0000
@@ -173,7 +173,14 @@
bool is_subset (const hb_bit_set_invertible_t &larger_set) const
{
if (unlikely (inverted != larger_set.inverted))
- return hb_all (hb_iter (s) | hb_map (larger_set.s));
+ {
+ if (inverted)
+ return hb_all (iter (), larger_set.s);
+ else
+ // larger set is inverted so larger_set.s is the set of things that are not present
+ // in larger_set, therefore if s has any of those it can't be a subset.
+ return !s.intersects (larger_set.s);
+ }
else
return unlikely (inverted) ? larger_set.s.is_subset (s) : s.is_subset (larger_set.s);
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh 2026-07-13 06:55:55.000000000 +0000
@@ -117,9 +117,15 @@
void clear ()
{
- resize (0);
- if (likely (successful))
- population = 0;
+ /* Early-out on already-empty. Protects the Null singleton
+ * (which is zero-initialized) from any writes. Any non-empty
+ * instance is a real heap object with writable storage, so
+ * clearing through the vector's always-safe clear() is fine
+ * even if we entered error state. */
+ if (!pages.length && !population) return;
+ pages.clear ();
+ page_map.clear ();
+ population = 0;
}
bool is_empty () const
{
@@ -438,23 +444,31 @@
return false;
uint32_t spi = 0;
- for (uint32_t lpi = 0; spi < page_map.length && lpi < larger_set.page_map.length; lpi++)
+ uint32_t lpi = 0;
+ while (spi < page_map.length && lpi < larger_set.page_map.length)
{
uint32_t spm = page_map.arrayZ[spi].major;
uint32_t lpm = larger_set.page_map.arrayZ[lpi].major;
auto sp = page_at (spi);
- if (spm < lpm && !sp.is_empty ())
- return false;
+ if (spm < lpm) {
+ if (!sp.is_empty ())
+ return false;
+ spi++;
+ continue;
+ }
- if (lpm < spm)
+ if (lpm < spm) {
+ lpi++;
continue;
+ }
auto lp = larger_set.page_at (lpi);
if (!sp.is_subset (lp))
return false;
spi++;
+ lpi++;
}
while (spi < page_map.length)
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-blob.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-blob.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-blob.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-blob.cc 2026-07-13 06:55:55.000000000 +0000
@@ -615,36 +615,20 @@
return likely (blob) ? blob : hb_blob_get_empty ();
}
-/**
- * hb_blob_create_from_file_or_fail:
- * @file_name: A filename
- *
- * Creates a new blob containing the data from the specified file.
- *
- * The filename is passed directly to the system on all platforms,
- * except on Windows, where the filename is interpreted as UTF-8.
- * Only if the filename is not valid UTF-8, it will be interpreted
- * according to the system codepage.
- *
- * Returns: An #hb_blob_t pointer with the content of the file,
- * or `NULL` if failed.
- *
- * Since: 2.8.2
- **/
-hb_blob_t *
-hb_blob_create_from_file_or_fail (const char *file_name)
-{
- /* Adopted from glib's gmappedfile.c with Matthias Clasen and
- Allison Lortie permission but changed a lot to suit our need. */
#if defined(HAVE_MMAP) && !defined(HB_NO_MMAP)
+static hb_blob_t *
+_hb_blob_try_mmap (const char *file_name)
+{
hb_mapped_file_t *file = (hb_mapped_file_t *) hb_calloc (1, sizeof (hb_mapped_file_t));
if (unlikely (!file)) return nullptr;
+ auto file_guard = hb_make_scope_guard ([&]() { hb_free (file); });
int fd = open (file_name, O_RDONLY | O_BINARY, 0);
- if (unlikely (fd == -1)) goto fail_without_close;
+ if (unlikely (fd == -1)) return nullptr;
+ auto fd_guard = hb_make_scope_guard ([&]() { close (fd); });
struct stat st;
- if (unlikely (fstat (fd, &st) == -1)) goto fail;
+ if (unlikely (fstat (fd, &st) == -1)) return nullptr;
file->length = (unsigned long) st.st_size;
@@ -662,38 +646,36 @@
file->contents = (char *) mmap (nullptr, file->length, PROT_READ,
MAP_PRIVATE | MAP_NORESERVE, fd, 0);
+ if (unlikely (file->contents == MAP_FAILED)) return nullptr;
- if (unlikely (file->contents == MAP_FAILED)) goto fail;
-
- close (fd);
-
+ file_guard.release ();
+ /* fd_guard closes fd on return (ownership ends after mmap). */
return hb_blob_create_or_fail (file->contents, file->length,
HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
(hb_destroy_func_t) _hb_mapped_file_destroy);
-
-fail:
- close (fd);
-fail_without_close:
- hb_free (file);
-
+}
#elif defined(_WIN32) && !defined(HB_NO_MMAP)
+static hb_blob_t *
+_hb_blob_try_mmap (const char *file_name)
+{
hb_mapped_file_t *file = (hb_mapped_file_t *) hb_calloc (1, sizeof (hb_mapped_file_t));
if (unlikely (!file)) return nullptr;
+ auto file_guard = hb_make_scope_guard ([&]() { hb_free (file); });
- HANDLE fd;
- int conversion;
unsigned int size = strlen (file_name) + 1;
- wchar_t * wchar_file_name = (wchar_t *) hb_malloc (sizeof (wchar_t) * size);
- if (unlikely (!wchar_file_name)) goto fail_without_close;
+ wchar_t *wchar_file_name = (wchar_t *) hb_malloc (sizeof (wchar_t) * size);
+ if (unlikely (!wchar_file_name)) return nullptr;
/* Assume file name is given in UTF-8 encoding */
- conversion = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, file_name, -1, wchar_file_name, size);
+ int conversion = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, file_name, -1, wchar_file_name, size);
if (conversion <= 0)
{
/* Conversion failed due to invalid UTF-8 characters,
Repeat conversion based on system code page */
- mbstowcs(wchar_file_name, file_name, size);
+ mbstowcs (wchar_file_name, file_name, size);
}
+
+ HANDLE fd;
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
{
CREATEFILE2_EXTENDED_PARAMETERS ceparams = { 0 };
@@ -713,7 +695,8 @@
#endif
hb_free (wchar_file_name);
- if (unlikely (fd == INVALID_HANDLE_VALUE)) goto fail_without_close;
+ if (unlikely (fd == INVALID_HANDLE_VALUE)) return nullptr;
+ auto fd_guard = hb_make_scope_guard ([&]() { CloseHandle (fd); });
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
{
@@ -726,35 +709,36 @@
file->length = (unsigned long) GetFileSize (fd, nullptr);
file->mapping = CreateFileMapping (fd, nullptr, PAGE_READONLY, 0, 0, nullptr);
#endif
- if (unlikely (!file->mapping)) goto fail;
+ if (unlikely (!file->mapping)) return nullptr;
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
file->contents = (char *) MapViewOfFileFromApp (file->mapping, FILE_MAP_READ, 0, 0);
#else
file->contents = (char *) MapViewOfFile (file->mapping, FILE_MAP_READ, 0, 0, 0);
#endif
- if (unlikely (!file->contents)) goto fail;
+ if (unlikely (!file->contents)) return nullptr;
- CloseHandle (fd);
+ file_guard.release ();
+ /* fd_guard closes fd on return. */
return hb_blob_create_or_fail (file->contents, file->length,
HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file,
(hb_destroy_func_t) _hb_mapped_file_destroy);
-
-fail:
- CloseHandle (fd);
-fail_without_close:
- hb_free (file);
-
+}
#endif
- /* The following tries to read a file without knowing its size beforehand
- It's used as a fallback for systems without mmap or to read from pipes */
+/* Read a file without knowing its size beforehand. Used as a fallback
+ * for systems without mmap or to read from pipes. */
+static hb_blob_t *
+_hb_blob_read_file (const char *file_name)
+{
unsigned long len = 0, allocated = BUFSIZ * 16;
char *data = (char *) hb_malloc (allocated);
if (unlikely (!data)) return nullptr;
+ auto data_guard = hb_make_scope_guard ([&]() { hb_free (data); });
FILE *fp = fopen (file_name, "rb");
- if (unlikely (!fp)) goto fread_fail_without_close;
+ if (unlikely (!fp)) return nullptr;
+ HB_SCOPE_GUARD (fclose (fp));
while (!feof (fp))
{
@@ -763,9 +747,9 @@
allocated *= 2;
/* Don't allocate and go more than ~536MB, our mmap reader still
can cover files like that but lets limit our fallback reader */
- if (unlikely (allocated > (2 << 28))) goto fread_fail;
+ if (unlikely (allocated > (2 << 28))) return nullptr;
char *new_data = (char *) hb_realloc (data, allocated);
- if (unlikely (!new_data)) goto fread_fail;
+ if (unlikely (!new_data)) return nullptr;
data = new_data;
}
@@ -775,19 +759,41 @@
#ifdef EINTR // armcc doesn't have it
if (unlikely (err == EINTR)) continue;
#endif
- if (unlikely (err)) goto fread_fail;
+ if (unlikely (err)) return nullptr;
len += addition;
}
- fclose (fp);
+ data_guard.release ();
return hb_blob_create_or_fail (data, len, HB_MEMORY_MODE_WRITABLE, data,
(hb_destroy_func_t) hb_free);
+}
-fread_fail:
- fclose (fp);
-fread_fail_without_close:
- hb_free (data);
- return nullptr;
+/**
+ * hb_blob_create_from_file_or_fail:
+ * @file_name: A filename
+ *
+ * Creates a new blob containing the data from the specified file.
+ *
+ * The filename is passed directly to the system on all platforms,
+ * except on Windows, where the filename is interpreted as UTF-8.
+ * Only if the filename is not valid UTF-8, it will be interpreted
+ * according to the system codepage.
+ *
+ * Returns: An #hb_blob_t pointer with the content of the file,
+ * or `NULL` if failed.
+ *
+ * Since: 2.8.2
+ **/
+hb_blob_t *
+hb_blob_create_from_file_or_fail (const char *file_name)
+{
+ /* Adopted from glib's gmappedfile.c with Matthias Clasen and
+ Allison Lortie permission but changed a lot to suit our need. */
+#if (defined(HAVE_MMAP) || defined(_WIN32)) && !defined(HB_NO_MMAP)
+ if (hb_blob_t *blob = _hb_blob_try_mmap (file_name))
+ return blob;
+#endif
+ return _hb_blob_read_file (file_name);
}
#endif /* !HB_NO_OPEN */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-blob.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-blob.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-blob.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-blob.hh 2026-07-13 06:55:55.000000000 +0000
@@ -50,6 +50,21 @@
}
}
+ void replace_buffer (const char *new_data,
+ unsigned new_length,
+ hb_memory_mode_t new_mode,
+ void *new_user_data,
+ hb_destroy_func_t new_destroy)
+ {
+ if (new_data != data)
+ destroy_user_data ();
+ data = new_data;
+ length = new_length;
+ mode = new_mode;
+ user_data = new_user_data;
+ destroy = new_destroy;
+ }
+
HB_INTERNAL bool try_make_writable ();
HB_INTERNAL bool try_make_writable_inplace ();
HB_INTERNAL bool try_make_writable_inplace_unix ();
@@ -67,6 +82,149 @@
void *user_data = nullptr;
hb_destroy_func_t destroy = nullptr;
+
+ /*
+ * Blob-recycling helpers.
+ *
+ * Encoders that produce a sized byte buffer and wrap it as an
+ * hb_blob_t can amortize malloc/blob-allocation across repeated
+ * renders by handing the output blob back via a recycle slot. On
+ * the next encode these helpers reuse (or realloc) the buffer and
+ * the same hb_blob_t handle is returned, skipping malloc/free
+ * and blob-handle churn across glyph-by-glyph encoding loops.
+ *
+ * Blobs managed by this machinery are identified by the address
+ * of recycle_data_destroy.
+ */
+
+ struct recycle_data_t
+ {
+ char *buf;
+ unsigned capacity;
+ };
+
+ static inline void recycle_data_destroy (void *user_data)
+ {
+ auto *bd = (recycle_data_t *) user_data;
+ hb_free (bd->buf);
+ hb_free (bd);
+ }
+
+ /* Acquire a buffer of at least @needed bytes. If @recycled is
+ * one of our blobs, reuse its buffer (or realloc it).
+ * *@out_capacity receives the actual capacity (>= @needed).
+ * *@out_replaced_buf is set to the recycled buf when realloc
+ * fails and a fresh buffer was allocated instead -- the caller
+ * must hb_free() that buf after recycle_finalize() runs. Returns
+ * nullptr on allocation failure. */
+ static inline char *
+ recycle_acquire (hb_blob_t *recycled,
+ unsigned needed,
+ unsigned *out_capacity,
+ char **out_replaced_buf)
+ {
+ *out_replaced_buf = nullptr;
+
+ if (recycled && recycled->destroy == recycle_data_destroy)
+ {
+ auto *bd = (recycle_data_t *) recycled->user_data;
+ if (bd->capacity >= needed)
+ {
+ *out_capacity = bd->capacity;
+ return bd->buf;
+ }
+ /* Grow with a 1.5x ramp to amortize repeated growth. */
+ unsigned alloc_bytes = needed;
+ if (unlikely (hb_unsigned_add_overflows (needed, needed / 2,
+ &alloc_bytes)))
+ alloc_bytes = needed;
+ char *new_buf = (char *) hb_realloc (bd->buf, alloc_bytes);
+ if (new_buf)
+ {
+ bd->buf = new_buf;
+ bd->capacity = alloc_bytes;
+ *out_capacity = alloc_bytes;
+ return new_buf;
+ }
+ /* Realloc failed. Fall through to a fresh hb_malloc and stash
+ * the old buf for the caller to free after recycle_finalize. */
+ *out_replaced_buf = bd->buf;
+ }
+
+ char *buf = (char *) hb_malloc (needed);
+ if (unlikely (!buf))
+ return nullptr;
+ *out_capacity = needed;
+ return buf;
+ }
+
+ /* Wrap @buf (of @capacity, with @length used) into an hb_blob_t.
+ * If @recycled is one of our blobs, update and return it (cheap);
+ * otherwise create a new blob. Pass @replaced_recycled_buf from
+ * recycle_acquire(). */
+ static inline hb_blob_t *
+ recycle_finalize (char *buf,
+ unsigned capacity,
+ unsigned length,
+ hb_blob_t *recycled,
+ char *replaced_recycled_buf)
+ {
+ if (recycled && recycled->destroy == recycle_data_destroy)
+ {
+ auto *bd = (recycle_data_t *) recycled->user_data;
+ if (replaced_recycled_buf && replaced_recycled_buf != buf)
+ hb_free (replaced_recycled_buf);
+ bd->buf = buf;
+ bd->capacity = capacity;
+ recycled->data = (const char *) buf;
+ recycled->length = length;
+ return recycled;
+ }
+
+ /* No recycled blob to update -- create a fresh one with our
+ * destroy closure so the next recycle round can reuse it. */
+ recycle_data_t *bd = (recycle_data_t *) hb_malloc (sizeof (*bd));
+ if (unlikely (!bd))
+ {
+ hb_free (buf);
+ return nullptr;
+ }
+ bd->buf = buf;
+ bd->capacity = capacity;
+
+ return hb_blob_create ((const char *) buf, length,
+ HB_MEMORY_MODE_WRITABLE,
+ bd, recycle_data_destroy);
+ }
+
+ /* Discard @buf returned by recycle_acquire without committing to
+ * a blob. Frees @buf if it was a fresh allocation; leaves any
+ * recycled buffer untouched. */
+ static inline void
+ recycle_abort (char *buf, hb_blob_t *recycled)
+ {
+ if (!buf) return;
+ if (recycled && recycled->destroy == recycle_data_destroy)
+ {
+ auto *bd = (recycle_data_t *) recycled->user_data;
+ if (buf == bd->buf) return; /* owned by the recycled blob */
+ }
+ hb_free (buf);
+ }
+
+ /* Stash @blob in @slot as the recycled output for the next
+ * encode. Destroys any previously stashed blob. Safe to call
+ * with @blob = nullptr or the empty-singleton blob (treated as
+ * "drop"). */
+ static inline void
+ recycle_stash (hb_blob_t **slot, hb_blob_t *blob)
+ {
+ hb_blob_destroy (*slot);
+ *slot = nullptr;
+ if (!blob || blob == hb_blob_get_empty ())
+ return;
+ *slot = blob;
+ }
};
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc 2026-07-13 06:55:55.000000000 +0000
@@ -114,6 +114,17 @@
*buf_consumed = 0;
hb_position_t x = 0, y = 0;
+
+ /* Calculate the advance of the previous glyphs */
+ if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+ {
+ for (unsigned int i = 0; i < start; i++)
+ {
+ x += pos[i].x_advance;
+ y += pos[i].y_advance;
+ }
+ }
+
for (unsigned int i = start; i < end; i++)
{
char b[1024];
@@ -151,7 +162,7 @@
p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster));
}
- if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
+ if (pos && !(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
{
p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
x+pos[i].x_offset, y+pos[i].y_offset));
@@ -272,6 +283,17 @@
*buf_consumed = 0;
hb_position_t x = 0, y = 0;
+
+ /* Calculate the advance of the previous glyphs */
+ if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+ {
+ for (unsigned int i = 0; i < start; i++)
+ {
+ x += pos[i].x_advance;
+ y += pos[i].y_advance;
+ }
+ }
+
for (unsigned int i = start; i < end; i++)
{
char b[1024];
@@ -297,7 +319,7 @@
p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster));
}
- if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
+ if (pos && !(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
{
if (x+pos[i].x_offset || y+pos[i].y_offset)
p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
@@ -417,9 +439,9 @@
* A human-readable, plain text format.
* The serialized glyphs will look something like:
*
- * ```
+ * |[
* [uni0651=0@518,0+0|uni0628=0+1897]
- * ```
+ * ]|
*
* - The serialized glyphs are delimited with `[` and `]`.
* - Glyphs are separated with `|`
@@ -435,10 +457,10 @@
* A machine-readable, structured format.
* The serialized glyphs will look something like:
*
- * ```
+ * |[
* [{"g":"uni0651","cl":0,"dx":518,"dy":0,"ax":0,"ay":0},
- * {"g":"uni0628","cl":0,"dx":0,"dy":0,"ax":1897,"ay":0}]
- * ```
+ * {"g":"uni0628","cl":0,"dx":0,"dy":0,"ax":1897,"ay":0}]
+ * ]|
*
* Each glyph is a JSON object, with the following properties:
* - `g`: the glyph name or glyph index if
@@ -530,9 +552,9 @@
* A human-readable, plain text format.
* The serialized codepoints will look something like:
*
- * ```
+ * |[
*
- * ```
+ * ]|
*
* - Glyphs are separated with `|`
* - Unicode codepoints are expressed as zero-padded four (or more)
@@ -550,9 +572,9 @@
*
* For example:
*
- * ```
+ * |[
* [{u:1617,cl:0},{u:1576,cl:1}]
- * ```
+ * ]|
*
* Return value:
* The number of serialized items.
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc 2026-07-13 06:55:55.000000000 +0000
@@ -101,9 +101,9 @@
/* Check that breaking up shaping at safe-to-break is indeed safe. */
- hb_buffer_t *fragment = hb_buffer_create_similar (buffer);
+ hb_unique_ptr_t fragment (hb_buffer_create_similar (buffer));
hb_buffer_set_flags (fragment, (hb_buffer_flags_t (hb_buffer_get_flags (fragment) & ~HB_BUFFER_FLAG_VERIFY)));
- hb_buffer_t *reconstruction = hb_buffer_create_similar (buffer);
+ hb_unique_ptr_t reconstruction (hb_buffer_create_similar (buffer));
hb_buffer_set_flags (reconstruction, (hb_buffer_flags_t (hb_buffer_get_flags (reconstruction) & ~HB_BUFFER_FLAG_VERIFY)));
unsigned int num_glyphs;
@@ -164,11 +164,7 @@
hb_buffer_append (fragment, text_buffer, text_start, text_end);
if (!hb_shape_full (font, fragment, features, num_features, shapers) ||
fragment->successful)
- {
- hb_buffer_destroy (reconstruction);
- hb_buffer_destroy (fragment);
return true;
- }
hb_buffer_append (reconstruction, fragment, 0, -1);
start = end;
@@ -193,9 +189,6 @@
}
}
- hb_buffer_destroy (reconstruction);
- hb_buffer_destroy (fragment);
-
return ret;
}
@@ -238,11 +231,13 @@
* the one from original buffer in step 1.
*/
- hb_buffer_t *fragments[2] {hb_buffer_create_similar (buffer),
- hb_buffer_create_similar (buffer)};
+ hb_unique_ptr_t fragments[2] {
+ hb_unique_ptr_t (hb_buffer_create_similar (buffer)),
+ hb_unique_ptr_t (hb_buffer_create_similar (buffer)),
+ };
hb_buffer_set_flags (fragments[0], (hb_buffer_flags_t (hb_buffer_get_flags (fragments[0]) & ~HB_BUFFER_FLAG_VERIFY)));
hb_buffer_set_flags (fragments[1], (hb_buffer_flags_t (hb_buffer_get_flags (fragments[1]) & ~HB_BUFFER_FLAG_VERIFY)));
- hb_buffer_t *reconstruction = hb_buffer_create_similar (buffer);
+ hb_unique_ptr_t reconstruction (hb_buffer_create_similar (buffer));
hb_buffer_set_flags (reconstruction, (hb_buffer_flags_t (hb_buffer_get_flags (reconstruction) & ~HB_BUFFER_FLAG_VERIFY)));
hb_segment_properties_t props;
hb_buffer_get_segment_properties (buffer, &props);
@@ -308,17 +303,16 @@
}
bool ret = true;
- hb_buffer_diff_flags_t diff;
/*
* Shape the two fragment streams.
*/
if (!hb_shape_full (font, fragments[0], features, num_features, shapers) ||
!fragments[0]->successful)
- goto out;
+ return ret;
if (!hb_shape_full (font, fragments[1], features, num_features, shapers) ||
!fragments[1]->successful)
- goto out;
+ return ret;
if (!forward)
{
@@ -363,7 +357,7 @@
/*
* Diff results.
*/
- diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
+ hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH)
{
buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed.");
@@ -375,11 +369,6 @@
}
}
-out:
- hb_buffer_destroy (reconstruction);
- hb_buffer_destroy (fragments[0]);
- hb_buffer_destroy (fragments[1]);
-
return ret;
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc 2026-07-13 06:55:55.000000000 +0000
@@ -547,12 +547,6 @@
hb_buffer_t::merge_clusters_impl (unsigned int start,
unsigned int end)
{
- if (!HB_BUFFER_CLUSTER_LEVEL_IS_MONOTONE (cluster_level))
- {
- unsafe_to_break (start, end);
- return;
- }
-
max_ops -= end - start;
if (unlikely (max_ops < 0))
successful = false;
@@ -581,15 +575,9 @@
set_cluster (info[i], cluster);
}
void
-hb_buffer_t::merge_out_clusters (unsigned int start,
- unsigned int end)
+hb_buffer_t::merge_out_clusters_impl (unsigned int start,
+ unsigned int end)
{
- if (!HB_BUFFER_CLUSTER_LEVEL_IS_MONOTONE (cluster_level))
- return;
-
- if (unlikely (end - start < 2))
- return;
-
max_ops -= end - start;
if (unlikely (max_ops < 0))
successful = false;
@@ -972,6 +960,9 @@
hb_buffer_set_content_type (hb_buffer_t *buffer,
hb_buffer_content_type_t content_type)
{
+ if (unlikely (hb_object_is_immutable (buffer)))
+ return;
+
buffer->content_type = content_type;
}
@@ -1822,6 +1813,9 @@
if (item_length == -1)
item_length = text_length - item_offset;
+ item_offset = hb_min (item_offset, (unsigned) text_length);
+ item_length = hb_clamp (item_length, 0, text_length - (int) item_offset);
+
if (unlikely (item_length < 0 ||
item_length > INT_MAX / 8 ||
!buffer->ensure (buffer->len + item_length * sizeof (T) / 4)))
@@ -2290,6 +2284,22 @@
* Debugging.
*/
+void
+hb_buffer_t::changed ()
+{
+#ifdef HB_NO_BUFFER_MESSAGE
+ return;
+#else
+ if (!message_depth)
+ return;
+
+ if (changed_func)
+ changed_func (this, changed_data);
+ else
+ update_digest ();
+#endif
+}
+
#ifndef HB_NO_BUFFER_MESSAGE
/**
* hb_buffer_set_message_func:
@@ -2307,7 +2317,8 @@
hb_buffer_message_func_t func,
void *user_data, hb_destroy_func_t destroy)
{
- if (unlikely (hb_object_is_immutable (buffer)))
+ if (unlikely (hb_object_is_immutable (buffer)) ||
+ unlikely (buffer->message_depth))
{
if (destroy)
destroy (user_data);
@@ -2327,6 +2338,23 @@
buffer->message_destroy = nullptr;
}
}
+/**
+ * hb_buffer_changed:
+ * @buffer: An #hb_buffer_t
+ *
+ * Called by a message callback after modifying buffer glyph indices,
+ * to update internal caches.
+ *
+ * If not called from inside a message callback, does nothing.
+ *
+ * Since: 13.0.0
+ **/
+void
+hb_buffer_changed (hb_buffer_t *buffer)
+{
+ buffer->changed ();
+}
+
bool
hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap)
{
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.h openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer.h
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.h 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer.h 2026-07-13 06:55:55.000000000 +0000
@@ -495,7 +495,7 @@
(1u << HB_BUFFER_CLUSTER_LEVEL_GRAPHEMES))))
/**
- * HB_BUFFER_CLUSTER_LEVEL_IS_CHARACTERS
+ * HB_BUFFER_CLUSTER_LEVEL_IS_CHARACTERS:
* @level: #hb_buffer_cluster_level_t to test
*
* Tests whether a cluster level does not group cluster values by graphemes.
@@ -505,7 +505,7 @@
*/
#define HB_BUFFER_CLUSTER_LEVEL_IS_CHARACTERS(level) \
((bool) ((1u << (unsigned) (level)) & \
- ((1u << HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARCATERS) | \
+ ((1u << HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS) | \
(1u << HB_BUFFER_CLUSTER_LEVEL_CHARACTERS))))
HB_EXTERN void
@@ -672,7 +672,12 @@
* @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
* @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
* @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
- * glyph offsets will reflect absolute glyph positions. Since: 1.8.0
+ * glyph offsets will reflect absolute glyph positions. Since: 1.8.0.
+ * Note: when this flag is used with a partial range of the buffer (i.e.
+ * @start is not 0), calculating the absolute positions has a cost
+ * proportional to @start. If the buffer is serialized in many small
+ * chunks, this can lead to quadratic behavior. It is recommended to
+ * use a larger @buf_size to minimize this cost.
* @HB_BUFFER_SERIALIZE_FLAG_DEFINED: All currently defined flags. Since: 4.4.0
*
* Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
@@ -865,6 +870,9 @@
hb_buffer_message_func_t func,
void *user_data, hb_destroy_func_t destroy);
+HB_EXTERN void
+hb_buffer_changed (hb_buffer_t *buffer);
+
HB_END_DECLS
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh 2026-07-13 06:55:55.000000000 +0000
@@ -130,9 +130,13 @@
*/
#ifndef HB_NO_BUFFER_MESSAGE
+ typedef void (*changed_func_t) (hb_buffer_t *buffer, void *user_data);
+
hb_buffer_message_func_t message_func;
void *message_data;
hb_destroy_func_t message_destroy;
+ changed_func_t changed_func;
+ void *changed_data;
unsigned message_depth; /* How deeply are we inside a message callback? */
#else
static constexpr unsigned message_depth = 0u;
@@ -398,10 +402,42 @@
{
if (end - start < 2)
return;
+ if (!HB_BUFFER_CLUSTER_LEVEL_IS_MONOTONE (cluster_level))
+ {
+ unsafe_to_break (start, end);
+ return;
+ }
+ merge_clusters_impl (start, end);
+ }
+ void merge_grapheme_clusters (unsigned int start, unsigned int end)
+ {
+ if (end - start < 2)
+ return;
+ if (!HB_BUFFER_CLUSTER_LEVEL_IS_GRAPHEMES (cluster_level))
+ {
+ unsafe_to_break (start, end);
+ return;
+ }
merge_clusters_impl (start, end);
}
HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end);
- HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
+ void merge_out_clusters (unsigned int start, unsigned int end)
+ {
+ if (end - start < 2)
+ return;
+ if (!HB_BUFFER_CLUSTER_LEVEL_IS_MONOTONE (cluster_level))
+ return;
+ merge_out_clusters_impl (start, end);
+ }
+ void merge_out_grapheme_clusters (unsigned int start, unsigned int end)
+ {
+ if (end - start < 2)
+ return;
+ if (!HB_BUFFER_CLUSTER_LEVEL_IS_GRAPHEMES (cluster_level))
+ return;
+ merge_out_clusters_impl (start, end);
+ }
+ HB_INTERNAL void merge_out_clusters_impl (unsigned int start, unsigned int end);
/* Merge clusters for deleting current glyph, and skip it. */
HB_INTERNAL void delete_glyph ();
HB_INTERNAL void delete_glyphs_inplace (bool (*filter) (const hb_glyph_info_t *info));
@@ -605,6 +641,7 @@
#endif
}
HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
+ HB_INTERNAL void changed ();
static void
set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0)
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cff-interp-common.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-cff-interp-common.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cff-interp-common.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-cff-interp-common.hh 2026-07-13 06:55:55.000000000 +0000
@@ -344,25 +344,25 @@
{
ELEM& operator [] (unsigned int i)
{
- if (unlikely (i >= count))
+ if (unlikely (i >= length))
{
set_error ();
return Crap (ELEM);
}
- return elements[i];
+ return arrayZ[i];
}
void push (const ELEM &v)
{
- if (likely (count < LIMIT))
- elements[count++] = v;
+ if (likely (length < LIMIT))
+ arrayZ[length++] = v;
else
set_error ();
}
ELEM &push ()
{
- if (likely (count < LIMIT))
- return elements[count++];
+ if (likely (length < LIMIT))
+ return arrayZ[length++];
else
{
set_error ();
@@ -372,8 +372,8 @@
ELEM& pop ()
{
- if (likely (count > 0))
- return elements[--count];
+ if (likely (length > 0))
+ return arrayZ[--length];
else
{
set_error ();
@@ -382,45 +382,44 @@
}
void pop (unsigned int n)
{
- if (likely (count >= n))
- count -= n;
+ if (likely (length >= n))
+ length -= n;
else
set_error ();
}
const ELEM& peek ()
{
- if (unlikely (count == 0))
+ if (unlikely (length == 0))
{
set_error ();
return Null (ELEM);
}
- return elements[count - 1];
+ return arrayZ[length - 1];
}
void unpop ()
{
- if (likely (count < LIMIT))
- count++;
+ if (likely (length < LIMIT))
+ length++;
else
set_error ();
}
- void clear () { count = 0; }
+ void clear () { length = 0; }
bool in_error () const { return (error); }
void set_error () { error = true; }
- unsigned int get_count () const { return count; }
- bool is_empty () const { return !count; }
+ unsigned int get_count () const { return length; }
+ bool is_empty () const { return !length; }
hb_array_t sub_array (unsigned start, unsigned length) const
- { return hb_array_t (elements).sub_array (start, length); }
+ { return hb_array_t (arrayZ).sub_array (start, length); }
- private:
bool error = false;
- unsigned int count = 0;
- ELEM elements[LIMIT];
+ unsigned int length = 0;
+ ELEM arrayZ[LIMIT];
};
/* argument stack */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cff2-interp-cs.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-cff2-interp-cs.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cff2-interp-cs.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-cff2-interp-cs.hh 2026-07-13 06:55:55.000000000 +0000
@@ -55,7 +55,7 @@
void reset_blends ()
{
numValues = valueIndex = 0;
- deltas.shrink (0);
+ deltas.clear ();
}
unsigned int numValues;
@@ -281,17 +281,18 @@
k = env.get_region_count ();
n = env.argStack.pop_uint ();
/* copy the blend values into blend array of the default values */
- unsigned int start = env.argStack.get_count () - ((k+1) * n);
- /* let an obvious error case fail, but note CFF2 spec doesn't forbid n==0 */
- if (unlikely (start > env.argStack.get_count ()))
+ unsigned int count = env.argStack.get_count ();
+ unsigned int total;
+ if (unlikely (hb_unsigned_mul_overflows (k + 1, n, &total) || total > count))
{
env.set_error ();
return;
}
+ unsigned int start = count - total;
for (unsigned int i = 0; i < n; i++)
{
const hb_array_t blends = env.argStack.sub_array (start + n + (i * k), k);
- process_arg_blend (env, env.argStack[start + i], blends, n, i);
+ process_arg_blend (env, env.argStack.arrayZ[start + i], blends, n, i);
}
/* pop off blend values leaving default values now adorned with blend values */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-config.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-config.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-config.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-config.hh 2026-07-13 06:55:55.000000000 +0000
@@ -43,6 +43,7 @@
#ifdef HB_TINY
#define HB_LEAN
#define HB_MINI
+#define HB_NO_SVG
#define HB_OPTIMIZE_SIZE
#define HB_OPTIMIZE_SIZE_MORE
#define HB_MINIMIZE_MEMORY_USAGE
@@ -60,9 +61,6 @@
#define HB_NO_BUFFER_SERIALIZE
#define HB_NO_BUFFER_VERIFY
#define HB_NO_BITMAP
-#define HB_NO_CFF
-#define HB_NO_COLOR
-#define HB_NO_DRAW
#define HB_NO_ERRNO
#define HB_NO_FACE_COLLECT_UNICODES
#define HB_NO_GETENV
@@ -78,13 +76,17 @@
#define HB_NO_NAME
#define HB_NO_OPEN
#define HB_NO_OT_FONT_GLYPH_NAMES
-#define HB_NO_OT_SHAPE_FRACTIONS
-#define HB_NO_PAINT
#define HB_NO_SETLOCALE
#define HB_NO_STYLE
-#define HB_NO_SUBSET_LAYOUT
#define HB_NO_VERTICAL
#define HB_NO_VAR
+
+#if !(defined(HB_HAS_CAIRO) || defined(HB_HAS_RASTER) || defined(HB_HAS_VECTOR) || defined(HB_HAS_GPU))
+#define HB_NO_COLOR
+#define HB_NO_DRAW
+#define HB_NO_PAINT
+#endif
+
#endif
#ifdef HB_MINI
@@ -92,8 +94,6 @@
#define HB_NO_LEGACY
#define HB_NO_BEYOND_64K
#define HB_NO_CUBIC_GLYF
-#define HB_NO_VAR_COMPOSITES
-#define HB_NO_VAR_HVF
#endif
#ifdef __OPTIMIZE_SIZE__
@@ -135,16 +135,17 @@
#define HB_NO_OT_FONT_BITMAP
#endif
-#ifdef HB_NO_CFF
-#define HB_NO_OT_FONT_CFF
-#define HB_NO_SUBSET_CFF
-#endif
-
#ifdef HB_NO_DRAW
+#define HB_NO_CFF
#define HB_NO_OUTLINE
#define HB_NO_PAINT
#endif
+#ifdef HB_NO_CFF
+#define HB_NO_OT_FONT_CFF
+#define HB_NO_SUBSET_CFF
+#endif
+
#ifdef HB_NO_LEGACY
#define HB_NO_CMAP_LEGACY_SUBTABLES
#define HB_NO_FALLBACK_SHAPE
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cplusplus.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-cplusplus.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cplusplus.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-cplusplus.hh 2026-07-13 06:55:55.000000000 +0000
@@ -138,52 +138,64 @@
static constexpr auto get_user_data = _get_user_data;
};
-#define HB_DEFINE_VTABLE(name) \
+#define HB_DEFINE_VTABLE(name, empty) \
template<> \
struct vtable \
: vtable_t {}
-HB_DEFINE_VTABLE (buffer);
-HB_DEFINE_VTABLE (blob);
-HB_DEFINE_VTABLE (face);
-HB_DEFINE_VTABLE (font);
-HB_DEFINE_VTABLE (font_funcs);
-HB_DEFINE_VTABLE (map);
-HB_DEFINE_VTABLE (set);
-HB_DEFINE_VTABLE (shape_plan);
-HB_DEFINE_VTABLE (unicode_funcs);
-HB_DEFINE_VTABLE (draw_funcs);
-HB_DEFINE_VTABLE (paint_funcs);
-
-#undef HB_DEFINE_VTABLE
+HB_DEFINE_VTABLE (buffer, &hb_buffer_get_empty);
+HB_DEFINE_VTABLE (blob, &hb_blob_get_empty);
+HB_DEFINE_VTABLE (face, &hb_face_get_empty);
+HB_DEFINE_VTABLE (font, &hb_font_get_empty);
+HB_DEFINE_VTABLE (font_funcs, &hb_font_funcs_get_empty);
+HB_DEFINE_VTABLE (map, &hb_map_get_empty);
+HB_DEFINE_VTABLE (set, &hb_set_get_empty);
+HB_DEFINE_VTABLE (shape_plan, &hb_shape_plan_get_empty);
+HB_DEFINE_VTABLE (unicode_funcs, &hb_unicode_funcs_get_empty);
+HB_DEFINE_VTABLE (draw_funcs, &hb_draw_funcs_get_empty);
+HB_DEFINE_VTABLE (paint_funcs, &hb_paint_funcs_get_empty);
#ifdef HB_SUBSET_H
-#define HB_DEFINE_VTABLE(name) \
- template<> \
- struct vtable \
- : vtable_t {}
+HB_DEFINE_VTABLE (subset_input, nullptr);
+HB_DEFINE_VTABLE (subset_plan, nullptr);
+#endif
-HB_DEFINE_VTABLE (subset_input);
-HB_DEFINE_VTABLE (subset_plan);
-#undef HB_DEFINE_VTABLE
+#ifdef HB_RASTER_H
+
+HB_DEFINE_VTABLE (raster_image, nullptr);
+HB_DEFINE_VTABLE (raster_draw, nullptr);
+HB_DEFINE_VTABLE (raster_paint, nullptr);
#endif
+#ifdef HB_VECTOR_H
+
+HB_DEFINE_VTABLE (vector_draw, nullptr);
+HB_DEFINE_VTABLE (vector_paint, nullptr);
+
+#endif
+
+
+#ifdef HB_GPU_H
+
+HB_DEFINE_VTABLE (gpu_draw, nullptr);
+
+#endif
+
+/* HB_DEFINE_VTABLE stays available for subsystem headers' paired tail
+ * blocks (see hb-raster.h, hb-vector.h, hb-gpu.h, hb-subset.h). */
+
+
} // namespace hb
/* Workaround for GCC < 7, see:
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-draw.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-draw.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-draw.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-draw.cc 2026-07-13 06:55:55.000000000 +0000
@@ -32,6 +32,8 @@
#include "hb-machinery.hh"
+#include
+
/**
* SECTION:hb-draw
@@ -116,25 +118,25 @@
void *user_data,
hb_destroy_func_t destroy)
{
+ auto destroy_guard = hb_make_scope_guard ([&]() {
+ if (destroy) destroy (user_data);
+ });
+
if (user_data && !dfuncs->user_data)
{
dfuncs->user_data = (decltype (dfuncs->user_data)) hb_calloc (1, sizeof (*dfuncs->user_data));
if (unlikely (!dfuncs->user_data))
- goto fail;
+ return false;
}
if (destroy && !dfuncs->destroy)
{
dfuncs->destroy = (decltype (dfuncs->destroy)) hb_calloc (1, sizeof (*dfuncs->destroy));
if (unlikely (!dfuncs->destroy))
- goto fail;
+ return false;
}
+ destroy_guard.release ();
return true;
-
-fail:
- if (destroy)
- (destroy) (user_data);
- return false;
}
#define HB_DRAW_FUNC_IMPLEMENT(name) \
@@ -460,6 +462,268 @@
}
+/**
+ * hb_draw_line:
+ * @dfuncs: draw functions
+ * @draw_data: associated draw data passed by the caller
+ * @st: current draw state
+ * @x0: start X coordinate
+ * @y0: start Y coordinate
+ * @w0: stroke width at the start
+ * @x1: end X coordinate
+ * @y1: end Y coordinate
+ * @w1: stroke width at the end
+ * @cap: end-cap shape (butt or square)
+ *
+ * Emits a tapered line segment as a filled trapezoid. @w0 and
+ * @w1 are the full stroke widths at the start and end points
+ * respectively; they may differ for a tapered stroke or match
+ * for a uniform one. Pass `NaN` for @w1 to use @w0 (uniform
+ * stroke) without repeating the value.
+ *
+ * With #HB_DRAW_LINE_CAP_SQUARE each endpoint is extended along
+ * the line direction by half its local stroke width, so four
+ * `hb_draw_line()` calls form a closed rectangle without gaps
+ * at the corners.
+ *
+ * Since: 14.2.0
+ **/
+void
+hb_draw_line (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float x0, float y0, float w0,
+ float x1, float y1, float w1,
+ hb_draw_line_cap_t cap)
+{
+ if (std::isnan (w1)) w1 = w0;
+ float dx = x1 - x0, dy = y1 - y0;
+ float len = sqrtf (dx * dx + dy * dy);
+ if (len <= 0.f)
+ return;
+ /* Unit tangent and normal to the line direction. */
+ float tx = dx / len;
+ float ty = dy / len;
+ float nx = -ty;
+ float ny = tx;
+ float h0 = 0.5f * w0;
+ float h1 = 0.5f * w1;
+ /* Square caps: extend each endpoint outward along the line
+ * tangent by half its local stroke width. */
+ if (cap == HB_DRAW_LINE_CAP_SQUARE)
+ {
+ x0 -= tx * h0; y0 -= ty * h0;
+ x1 += tx * h1; y1 += ty * h1;
+ }
+ /* Trapezoid corners (counter-clockwise). */
+ float ax = x0 + nx * h0, ay = y0 + ny * h0;
+ float bx = x1 + nx * h1, by = y1 + ny * h1;
+ float cx = x1 - nx * h1, cy = y1 - ny * h1;
+ float dx_ = x0 - nx * h0, dy_ = y0 - ny * h0;
+
+ hb_draw_move_to (dfuncs, draw_data, st, ax, ay);
+ hb_draw_line_to (dfuncs, draw_data, st, bx, by);
+ hb_draw_line_to (dfuncs, draw_data, st, cx, cy);
+ hb_draw_line_to (dfuncs, draw_data, st, dx_, dy_);
+ hb_draw_close_path (dfuncs, draw_data, st);
+}
+
+/* Emit an axis-aligned rectangle as a single closed contour.
+ * @ccw picks the winding direction (useful for cutting a hole
+ * out of another rectangle in a stroked rect). */
+static void
+_hb_draw_rect_contour (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float x, float y, float w, float h,
+ bool ccw)
+{
+ hb_draw_move_to (dfuncs, draw_data, st, x, y);
+ if (ccw)
+ {
+ hb_draw_line_to (dfuncs, draw_data, st, x + w, y);
+ hb_draw_line_to (dfuncs, draw_data, st, x + w, y + h);
+ hb_draw_line_to (dfuncs, draw_data, st, x, y + h);
+ }
+ else
+ {
+ hb_draw_line_to (dfuncs, draw_data, st, x, y + h);
+ hb_draw_line_to (dfuncs, draw_data, st, x + w, y + h);
+ hb_draw_line_to (dfuncs, draw_data, st, x + w, y);
+ }
+ hb_draw_close_path (dfuncs, draw_data, st);
+}
+
+/**
+ * hb_draw_rectangle:
+ * @dfuncs: draw functions
+ * @draw_data: associated draw data passed by the caller
+ * @st: current draw state
+ * @x: top-left X coordinate
+ * @y: top-left Y coordinate
+ * @w: width (may be negative)
+ * @h: height (may be negative)
+ * @stroke_width: stroke width, or `NaN` for a filled rectangle
+ *
+ * Emits an axis-aligned rectangle. If @stroke_width is a finite
+ * positive value, the rectangle is rendered as an outlined ring
+ * of that thickness centered on the edges; if @stroke_width is
+ * `NaN`, the rectangle is rendered filled.
+ *
+ * Note: stroked rectangles produce a bounding box covering the
+ * full outer rectangle, so if the pen is a GPU fragment-shader
+ * backend, the shader runs for every interior pixel even though
+ * only the outline contributes coverage. For very thin
+ * outlines where the interior is much larger than the stroke,
+ * emitting four hb_draw_line() segments (one per edge) is
+ * considerably cheaper per frame.
+ *
+ * Since: 14.2.0
+ **/
+void
+hb_draw_rectangle (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float x, float y,
+ float w, float h,
+ float stroke_width)
+{
+ if (std::isnan (stroke_width))
+ {
+ /* Filled rectangle with zero area is nothing to draw. */
+ if (w == 0.f || h == 0.f)
+ return;
+ _hb_draw_rect_contour (dfuncs, draw_data, st, x, y, w, h, /*ccw*/ true);
+ return;
+ }
+
+ if (stroke_width <= 0.f || !std::isfinite (stroke_width))
+ return;
+
+ /* Normalize to non-negative width/height so the stroke math
+ * below (outer grows by sw, inner shrinks by sw) produces the
+ * expected outer-contains-inner ring regardless of w/h signs. */
+ if (w < 0.f) { x += w; w = -w; }
+ if (h < 0.f) { y += h; h = -h; }
+ /* w or h == 0 is still meaningful when stroking: a stroked
+ * zero-height rect is a horizontal line of length w; zero
+ * width is a vertical line. Both degenerate to a single
+ * outer contour because the inner hole collapses. */
+
+ /* Stroke is centered on the edge: outer contour grows by
+ * stroke_width/2, inner contour shrinks by the same. */
+ float s = 0.5f * stroke_width;
+ /* Outer rectangle (CCW = adds coverage). */
+ _hb_draw_rect_contour (dfuncs, draw_data, st,
+ x - s, y - s,
+ w + stroke_width, h + stroke_width,
+ /*ccw*/ true);
+ /* Inner rectangle (CW = removes coverage for the hole). */
+ float iw = w - stroke_width;
+ float ih = h - stroke_width;
+ if (iw > 0.f && ih > 0.f)
+ _hb_draw_rect_contour (dfuncs, draw_data, st,
+ x + s, y + s, iw, ih,
+ /*ccw*/ false);
+}
+
+/* Circle approximated by 4 cubic Beziers, one per quadrant.
+ * The magic constant 0.5522847498307936 is
+ * (4/3) * (sqrt(2) - 1)
+ * and minimizes the max radial error to ~2.7e-4 of r. */
+static void
+_hb_draw_circle_contour (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float cx, float cy, float r,
+ bool ccw)
+{
+ static const float k = 0.5522847498307936f;
+ float ck = r * k;
+
+ hb_draw_move_to (dfuncs, draw_data, st, cx + r, cy);
+ if (ccw)
+ {
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx + r, cy + ck,
+ cx + ck, cy + r,
+ cx, cy + r);
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx - ck, cy + r,
+ cx - r, cy + ck,
+ cx - r, cy);
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx - r, cy - ck,
+ cx - ck, cy - r,
+ cx, cy - r);
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx + ck, cy - r,
+ cx + r, cy - ck,
+ cx + r, cy);
+ }
+ else
+ {
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx + r, cy - ck,
+ cx + ck, cy - r,
+ cx, cy - r);
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx - ck, cy - r,
+ cx - r, cy - ck,
+ cx - r, cy);
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx - r, cy + ck,
+ cx - ck, cy + r,
+ cx, cy + r);
+ hb_draw_cubic_to (dfuncs, draw_data, st,
+ cx + ck, cy + r,
+ cx + r, cy + ck,
+ cx + r, cy);
+ }
+ hb_draw_close_path (dfuncs, draw_data, st);
+}
+
+/**
+ * hb_draw_circle:
+ * @dfuncs: draw functions
+ * @draw_data: associated draw data passed by the caller
+ * @st: current draw state
+ * @cx: center X coordinate
+ * @cy: center Y coordinate
+ * @r: radius
+ * @stroke_width: stroke width, or `NaN` for a filled disc
+ *
+ * Emits a circle approximated by four cubic Bezier curves. If
+ * @stroke_width is a finite positive value, the circle is
+ * rendered as an outlined ring of that thickness centered on
+ * the nominal radius; if @stroke_width is `NaN`, the circle is
+ * rendered as a filled disc.
+ *
+ * Since: 14.2.0
+ **/
+void
+hb_draw_circle (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float cx, float cy,
+ float r,
+ float stroke_width)
+{
+ if (r <= 0.f)
+ return;
+
+ if (std::isnan (stroke_width))
+ {
+ _hb_draw_circle_contour (dfuncs, draw_data, st, cx, cy, r, /*ccw*/ true);
+ return;
+ }
+
+ if (stroke_width <= 0.f || !std::isfinite (stroke_width))
+ return;
+
+ float s = 0.5f * stroke_width;
+ _hb_draw_circle_contour (dfuncs, draw_data, st, cx, cy, r + s, /*ccw*/ true);
+ float ir = r - s;
+ if (ir > 0.f)
+ _hb_draw_circle_contour (dfuncs, draw_data, st, cx, cy, ir, /*ccw*/ false);
+}
+
+
static void
hb_draw_extents_move_to (hb_draw_funcs_t *dfuncs HB_UNUSED,
void *data,
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-draw.h openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-draw.h
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-draw.h 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-draw.h 2026-07-13 06:55:55.000000000 +0000
@@ -335,6 +335,58 @@
hb_draw_state_t *st);
+/* Shape helpers.
+ *
+ * Emit common primitives (tapered line, rectangle, circle) into
+ * any pen. The helpers are thin wrappers over the individual
+ * move_to / line_to / cubic_to / close_path calls: callers can
+ * always hand-roll the same shapes if they need a variation.
+ *
+ * For rect / circle the @stroke_width parameter selects between
+ * filled and stroked: a positive finite value is the stroke
+ * width of the outline; NaN means "filled" (no stroke).
+ */
+
+/**
+ * hb_draw_line_cap_t:
+ * @HB_DRAW_LINE_CAP_BUTT: No cap; the line ends exactly at
+ * its endpoint.
+ * @HB_DRAW_LINE_CAP_SQUARE: Square cap; the line is extended
+ * past its endpoint by half the local stroke width. Useful
+ * for composing closed shapes from line segments (e.g. a
+ * rectangle made from four lines).
+ *
+ * End-cap shape for hb_draw_line().
+ *
+ * Since: 14.2.0
+ **/
+typedef enum {
+ HB_DRAW_LINE_CAP_BUTT = 0,
+ HB_DRAW_LINE_CAP_SQUARE = 1,
+} hb_draw_line_cap_t;
+
+HB_EXTERN void
+hb_draw_line (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float x0, float y0, float w0,
+ float x1, float y1, float w1,
+ hb_draw_line_cap_t cap);
+
+HB_EXTERN void
+hb_draw_rectangle (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float x, float y,
+ float w, float h,
+ float stroke_width);
+
+HB_EXTERN void
+hb_draw_circle (hb_draw_funcs_t *dfuncs, void *draw_data,
+ hb_draw_state_t *st,
+ float cx, float cy,
+ float r,
+ float stroke_width);
+
+
HB_END_DECLS
#endif /* HB_DRAW_H */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc 2026-07-13 06:55:55.000000000 +0000
@@ -180,10 +180,8 @@
{
// Not much to do...
}
- sorted_tags.qsort ([] (const void* a, const void* b) {
- return * (hb_tag_t *) a < * (hb_tag_t *) b ? -1 :
- * (hb_tag_t *) a == * (hb_tag_t *) b ? 0 :
- +1;
+ sorted_tags.qsort ([] (const hb_tag_t &a, const hb_tag_t &b) {
+ return a < b;
});
auto array = sorted_tags.as_array ().sub_array (start_offset, table_count);
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-font.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-font.cc 2026-07-13 06:55:55.000000000 +0000
@@ -406,14 +406,15 @@
{
if (font->has_glyph_h_origin_func_set ())
{
+ hb_bool_t ret = true;
for (unsigned int i = 0; i < count; i++)
{
- font->get_glyph_h_origin (*first_glyph, first_x, first_y, false);
+ ret &= font->get_glyph_h_origin (*first_glyph, first_x, first_y, false);
first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
first_x = &StructAtOffsetUnaligned (first_x, x_stride);
first_y = &StructAtOffsetUnaligned (first_y, y_stride);
}
- return true;
+ return ret;
}
hb_bool_t ret = font->parent->get_glyph_h_origins (count,
@@ -448,14 +449,15 @@
{
if (font->has_glyph_v_origin_func_set ())
{
+ hb_bool_t ret = true;
for (unsigned int i = 0; i < count; i++)
{
- font->get_glyph_v_origin (*first_glyph, first_x, first_y, false);
+ ret &= font->get_glyph_v_origin (*first_glyph, first_x, first_y, false);
first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
first_x = &StructAtOffsetUnaligned (first_x, x_stride);
first_y = &StructAtOffsetUnaligned (first_y, y_stride);
}
- return true;
+ return ret;
}
hb_bool_t ret = font->parent->get_glyph_v_origins (count,
@@ -1001,25 +1003,25 @@
void *user_data,
hb_destroy_func_t destroy)
{
+ auto destroy_guard = hb_make_scope_guard ([&]() {
+ if (destroy) destroy (user_data);
+ });
+
if (user_data && !ffuncs->user_data)
{
ffuncs->user_data = (decltype (ffuncs->user_data)) hb_calloc (1, sizeof (*ffuncs->user_data));
if (unlikely (!ffuncs->user_data))
- goto fail;
+ return false;
}
if (destroy && !ffuncs->destroy)
{
ffuncs->destroy = (decltype (ffuncs->destroy)) hb_calloc (1, sizeof (*ffuncs->destroy));
if (unlikely (!ffuncs->destroy))
- goto fail;
+ return false;
}
+ destroy_guard.release ();
return true;
-
-fail:
- if (destroy)
- (destroy) (user_data);
- return false;
}
#define HB_FONT_FUNC_IMPLEMENT(get_,name) \
@@ -1625,11 +1627,12 @@
*
* Paints a color glyph.
*
- * This function is similar to, but lower-level than,
- * hb_font_paint_glyph(). It is suitable for clients that
- * need more control. If there are no color glyphs available,
- * it will return `false`. The client can then fall back to
- * hb_font_draw_glyph_or_fail() for the monochrome outline glyph.
+ * Succeeds if @glyph has color paint layers (COLRv0),
+ * a color paint graph (COLRv1), or a bitmap image that the
+ * font's callbacks render successfully. Returns `false` if
+ * the font has no color data for @glyph; the client can then
+ * fall back to hb_font_draw_glyph_or_fail() for the monochrome
+ * outline.
*
* The painting instructions are returned by way of calls to
* the callbacks of the @funcs object, with @paint_data passed
@@ -2414,6 +2417,10 @@
if (!parent)
parent = hb_font_get_empty ();
+ for (hb_font_t *p = parent; p && p != hb_font_get_empty(); p = p->parent)
+ if (p == font)
+ return; /* Would create a cycle - reject */
+
hb_font_t *old = font->parent;
font->parent = hb_font_reference (parent);
@@ -3183,7 +3190,7 @@
for (unsigned int i = input_coords_length; i < coords_length; i++)
design_coords[i] = axes[i].get_default ();
- hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized);
+ hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized);
_hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-font.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-font.hh 2026-07-13 06:55:55.000000000 +0000
@@ -172,13 +172,13 @@
/* Convert from parent-font user-space to our user-space */
hb_position_t parent_scale_x_distance (hb_position_t v)
{
- if (unlikely (parent && parent->x_scale != x_scale))
+ if (unlikely (parent && parent->x_scale && parent->x_scale != x_scale))
return (hb_position_t) (v * (int64_t) this->x_scale / this->parent->x_scale);
return v;
}
hb_position_t parent_scale_y_distance (hb_position_t v)
{
- if (unlikely (parent && parent->y_scale != y_scale))
+ if (unlikely (parent && parent->y_scale && parent->y_scale != y_scale))
return (hb_position_t) (v * (int64_t) this->y_scale / this->parent->y_scale);
return v;
}
@@ -903,15 +903,11 @@
}
else
{
- for (unsigned j = 0; j < n; j++)
- {
- origins[j].x = 0;
- origins[j].y = 0;
- }
+ mult = 0; /* Indicates all origins[].x and origins[].y values are 0, therefore we can skip adjusting offsets below */
}
}
- assert (mult == -1 || mult == +1);
+ assert (mult == -1 || mult == +1 || mult == 0);
if (mult == +1)
for (unsigned j = 0; j < n; j++)
{
@@ -919,13 +915,14 @@
add_offset (&pos->x_offset, &pos->y_offset,
origins[j].x, origins[j].y);
}
- else /* mult == -1 */
+ else if (mult == -1)
for (unsigned j = 0; j < n; j++)
{
hb_glyph_position_t *pos = &buf->pos[offset + j];
subtract_offset (&pos->x_offset, &pos->y_offset,
origins[j].x, origins[j].y);
}
+ /* else if (mult == 0) --> Do nothing */
offset += n;
}
@@ -970,15 +967,11 @@
}
else
{
- for (unsigned j = 0; j < n; j++)
- {
- origins[j].x = 0;
- origins[j].y = 0;
- }
+ mult = 0; /* Indicates all origins[].x and origins[].y values are 0, therefore we can skip adjusting offsets below */
}
}
- assert (mult == -1 || mult == +1);
+ assert (mult == -1 || mult == +1 || mult == 0);
if (mult == +1)
for (unsigned j = 0; j < n; j++)
{
@@ -986,13 +979,14 @@
add_offset (&pos->x_offset, &pos->y_offset,
origins[j].x, origins[j].y);
}
- else /* mult == -1 */
+ else if (mult == -1)
for (unsigned j = 0; j < n; j++)
{
hb_glyph_position_t *pos = &buf->pos[offset + j];
subtract_offset (&pos->x_offset, &pos->y_offset,
origins[j].x, origins[j].y);
}
+ /* else if (mult == 0) --> Do nothing */
offset += n;
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ft.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ft.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ft.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ft.cc 2026-07-13 06:55:55.000000000 +0000
@@ -766,6 +766,12 @@
hb_lock_t lock (ft_font->lock);
FT_Face ft_face = ft_font->ft_face;
+ if (!size)
+ {
+ char buf[128];
+ return !FT_Get_Glyph_Name (ft_face, glyph, buf, sizeof (buf)) && *buf;
+ }
+
hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size);
if (ret && (size && !*name))
ret = false;
@@ -1117,14 +1123,13 @@
buffer = (FT_Byte *) hb_malloc (length);
if (!buffer)
return nullptr;
+ auto buffer_guard = hb_make_scope_guard ([&]() { hb_free (buffer); });
error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
if (error)
- {
- hb_free (buffer);
return nullptr;
- }
+ buffer_guard.release ();
return hb_blob_create ((const char *) buffer, length,
HB_MEMORY_MODE_WRITABLE,
buffer, hb_free);
@@ -1693,6 +1698,13 @@
void
hb_ft_font_set_funcs (hb_font_t *font)
{
+ int load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
+ if (font->destroy == (hb_destroy_func_t) _hb_ft_font_destroy && font->user_data)
+ {
+ const hb_ft_font_t *existing_ft_font = (const hb_ft_font_t *) font->user_data;
+ load_flags = existing_ft_font->load_flags;
+ }
+
// In case of failure...
hb_font_set_funcs (font,
hb_font_funcs_get_empty (),
@@ -1740,7 +1752,7 @@
}
_hb_ft_font_set_funcs (font, ft_face, true);
- hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
+ hb_ft_font_set_load_flags (font, load_flags);
_hb_ft_hb_font_changed (font, ft_face);
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh 2026-07-13 06:55:55.000000000 +0000
@@ -28,16 +28,25 @@
#include "hb-algs.hh"
+#include
+
template
struct hb_extents_t
{
hb_extents_t () {}
- hb_extents_t (const hb_glyph_extents_t &extents) :
- xmin (hb_min (extents.x_bearing, extents.x_bearing + extents.width)),
- ymin (hb_min (extents.y_bearing, extents.y_bearing + extents.height)),
- xmax (hb_max (extents.x_bearing, extents.x_bearing + extents.width)),
- ymax (hb_max (extents.y_bearing, extents.y_bearing + extents.height)) {}
+ hb_extents_t (const hb_glyph_extents_t &extents)
+ {
+ double x0 = (double) extents.x_bearing;
+ double y0 = (double) extents.y_bearing;
+ double x1 = x0 + (double) extents.width;
+ double y1 = y0 + (double) extents.height;
+
+ xmin = (Float) hb_min (x0, x1);
+ ymin = (Float) hb_min (y0, y1);
+ xmax = (Float) hb_max (x0, x1);
+ ymax = (Float) hb_max (y0, y1);
+ }
hb_extents_t (Float xmin, Float ymin, Float xmax, Float ymax) :
xmin (xmin), ymin (ymin), xmax (xmax), ymax (ymax) {}
@@ -90,20 +99,37 @@
hb_glyph_extents_t to_glyph_extents (bool xneg = false, bool yneg = false) const
{
- hb_position_t x0 = (hb_position_t) roundf (xmin);
- hb_position_t y0 = (hb_position_t) roundf (ymin);
- hb_position_t x1 = (hb_position_t) roundf (xmax);
- hb_position_t y1 = (hb_position_t) roundf (ymax);
- return hb_glyph_extents_t {xneg ? x1 : x0,
- yneg ? y0 : y1,
- xneg ? x0 - x1 : x1 - x0,
- yneg ? y1 - y0 : y0 - y1};
+ double x0 = round ((double) xmin);
+ double y0 = round ((double) ymin);
+ double x1 = round ((double) xmax);
+ double y1 = round ((double) ymax);
+
+ if (unlikely (!std::isfinite (x0) ||
+ !std::isfinite (y0) ||
+ !std::isfinite (x1) ||
+ !std::isfinite (y1)))
+ return hb_glyph_extents_t {0, 0, 0, 0};
+
+ return hb_glyph_extents_t {
+ clamp_to_hb_position (xneg ? x1 : x0),
+ clamp_to_hb_position (yneg ? y0 : y1),
+ clamp_to_hb_position (xneg ? x0 - x1 : x1 - x0),
+ clamp_to_hb_position (yneg ? y1 - y0 : y0 - y1)
+ };
}
Float xmin = 0;
Float ymin = 0;
Float xmax = -1;
Float ymax = -1;
+
+ static hb_position_t
+ clamp_to_hb_position (double v)
+ {
+ return (hb_position_t) hb_clamp (v,
+ (double) hb_int_min (hb_position_t),
+ (double) hb_int_max (hb_position_t));
+ }
};
template
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-limits.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-limits.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-limits.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-limits.hh 2026-07-13 06:55:55.000000000 +0000
@@ -108,5 +108,34 @@
#define HB_MAX_COMPOSITE_OPERATIONS_PER_GLYPH 64
#endif
+#ifndef HB_SVG_MAX_PATH_SEGMENTS
+#define HB_SVG_MAX_PATH_SEGMENTS 262144
+#endif
+
+#ifndef HB_GPU_DRAW_MAX_CURVES
+#define HB_GPU_DRAW_MAX_CURVES 65536
+#endif
+
+#ifndef HB_SVG_MAX_DOCUMENT_SIZE
+#define HB_SVG_MAX_DOCUMENT_SIZE ((size_t) 16 << 20)
+#endif
+
+#ifndef HB_RASTER_MAX_BUFFER_SIZE
+#define HB_RASTER_MAX_BUFFER_SIZE ((size_t) 1 << 30)
+#endif
+
+
+#ifndef HB_REPACKER_MAX_ITERATIONS
+#define HB_REPACKER_MAX_ITERATIONS 500
+#endif
+
+#ifndef HB_REPACKER_MAX_VERTICES
+#define HB_REPACKER_MAX_VERTICES 100000
+#endif
+
+#ifndef HB_REPACKER_MAX_SPACES
+#define HB_REPACKER_MAX_SPACES 1024
+#endif
+
#endif /* HB_LIMITS_HH */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh 2026-07-13 06:55:55.000000000 +0000
@@ -110,7 +110,7 @@
#define DEFINE_SIZE_STATIC(size) \
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)) \
- unsigned int get_size () const { return (size); } \
+ size_t get_size () const { return (size); } \
static constexpr unsigned null_size = (size); \
static constexpr unsigned min_size = (size); \
static constexpr unsigned static_size = (size)
@@ -137,7 +137,7 @@
static constexpr unsigned min_size = (size)
#define DEFINE_SIZE_ARRAY_SIZED(size, array) \
- unsigned int get_size () const { return (size - (array).min_size + (array).get_size ()); } \
+ size_t get_size () const { return (size - (array).min_size + (array).get_size ()); } \
DEFINE_SIZE_ARRAY(size, array)
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-map.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-map.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-map.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-map.hh 2026-07-13 06:55:55.000000000 +0000
@@ -379,7 +379,11 @@
void clear ()
{
- if (unlikely (!successful)) return;
+ /* Early-out on already-empty. Protects the Null singleton
+ * (zero-initialized) from any writes. Any non-empty hashmap
+ * is a real heap instance with writable items, so clearing
+ * under !successful is safe. */
+ if (!population && !occupancy) return;
for (auto &_ : hb_iter (items, size ()))
{
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-number.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-number.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-number.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-number.cc 2026-07-13 06:55:55.000000000 +0000
@@ -23,6 +23,10 @@
*
*/
+#ifndef HB_NUMBER_CC
+#define HB_NUMBER_CC
+#ifdef HB_NUMBER_CC /* Pacify -Wunused-macros. */
+
#include "hb.hh"
#include "hb-number.hh"
#include "hb-number-parser.hh"
@@ -77,3 +81,6 @@
*pp = pend;
return !whole_buffer || end == pend;
}
+
+#endif /* HB_NUMBER_CC pacify */
+#endif /* HB_NUMBER_CC guard */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-object.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-object.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-object.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-object.hh 2026-07-13 06:55:55.000000000 +0000
@@ -272,6 +272,8 @@
obj->header.writable = false;
}
template
+static inline void hb_object_fini (Type *obj);
+template
static inline Type *hb_object_reference (Type *obj)
{
hb_object_trace (obj, HB_FUNC);
@@ -282,7 +284,7 @@
return obj;
}
template
-static inline bool hb_object_destroy (Type *obj)
+static inline bool hb_object_should_destroy (Type *obj)
{
hb_object_trace (obj, HB_FUNC);
if (unlikely (!obj || obj->header.is_inert ()))
@@ -290,12 +292,25 @@
assert (hb_object_is_valid (obj));
if (obj->header.ref_count.dec () != 1)
return false;
+ return true;
+}
+template
+static inline void hb_object_actually_destroy (Type *obj)
+{
hb_object_fini (obj);
if (!std::is_trivially_destructible::value)
obj->~Type ();
+}
+
+template
+static inline bool hb_object_destroy (Type *obj)
+{
+ if (!hb_object_should_destroy (obj))
+ return false;
+ hb_object_actually_destroy (obj);
return true;
}
template
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh 2026-07-13 06:55:55.000000000 +0000
@@ -148,7 +148,7 @@
/* 32-bit unsigned integer with variable encoding. */
struct HBUINT32VAR
{
- unsigned get_size () const
+ size_t get_size () const
{
unsigned b0 = v[0];
if (b0 < 0x80)
@@ -163,7 +163,7 @@
return 5;
}
- static unsigned get_size (uint32_t v)
+ static size_t get_size (uint32_t v)
{
if (v < 0x80)
return 1;
@@ -563,7 +563,7 @@
return arrayZ[i];
}
- static unsigned int get_size (unsigned int len)
+ static size_t get_size (unsigned int len)
{ return len * Type::static_size; }
template operator T * () { return arrayZ; }
@@ -725,7 +725,7 @@
return arrayZ[i];
}
- unsigned int get_size () const
+ size_t get_size () const
{ return len.static_size + len * Type::static_size; }
explicit operator bool () const { return len; }
@@ -909,7 +909,7 @@
hb_barrier ();
return arrayZ[i-1];
}
- unsigned int get_size () const
+ size_t get_size () const
{ return lenP1.static_size + get_length () * Type::static_size; }
unsigned get_length () const { return lenP1 ? lenP1 - 1 : 0; }
@@ -1003,7 +1003,7 @@
hb_barrier ();
return arrayZ[i];
}
- unsigned int get_size () const
+ size_t get_size () const
{ return lenM1.static_size + (lenM1 + 1) * Type::static_size; }
template
@@ -1197,7 +1197,7 @@
}
unsigned int get_length () const
{ return header.nUnits - last_is_terminator (); }
- unsigned int get_size () const
+ size_t get_size () const
{ return header.static_size + header.nUnits * header.unitSize; }
template
@@ -1275,11 +1275,22 @@
if (unlikely (!serialize_header (c, +it, data_size, min_off_size))) return_trace (false);
unsigned char *ret = c->allocate_size (data_size, false);
if (unlikely (!ret)) return_trace (false);
+ unsigned remaining = data_size;
for (const auto &_ : +it)
{
unsigned len = _.length;
+
if (!len)
continue;
+
+ if (unlikely (len > remaining)) {
+ // We have more bytes to write then the computed data size, so the size calculation
+ // must have encountered overflow.
+ return_trace (c->check_success (false, HB_SERIALIZE_ERROR_INT_OVERFLOW));
+ }
+
+ remaining -= len;
+
if (len <= 1)
{
*ret++ = *_.arrayZ;
@@ -1450,7 +1461,7 @@
return hb_ubytes_t (data_base () + offset0, offset1 - offset0);
}
- unsigned int get_size () const
+ size_t get_size () const
{
if (count)
return min_size + offSize.static_size + offset_array_size () + (offset_at (count) - 1);
@@ -1948,6 +1959,7 @@
return true;
}
+ public:
void skip (unsigned n)
{
while (n)
@@ -1961,6 +1973,7 @@
}
}
+ private:
template
void _add_to (hb_array_t out, float scale = 1.0f)
{
@@ -2035,14 +2048,6 @@
public:
void add_to (hb_array_t out, float scale = 1.0f)
{
- unsigned n = out.length;
-
- if (scale == 0.0f)
- {
- skip (n);
- return;
- }
-
#ifndef HB_OPTIMIZE_SIZE
// The following branch is supposed to speed things up by avoiding
// the multiplication in _add_to<> if scale is 1.0f.
@@ -2077,7 +2082,7 @@
template
struct Align
{
- unsigned get_size (const void *base) const
+ size_t get_size (const void *base) const
{
unsigned offset = (const char *) this - (const char *) base;
return (alignment - offset) & (alignment - 1);
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh 2026-07-13 06:55:55.000000000 +0000
@@ -201,7 +201,7 @@
hb_pair_t get_fd_range (hb_codepoint_t glyph) const
{ return {fds[glyph], glyph + 1}; }
- unsigned int get_size (unsigned int num_glyphs) const
+ size_t get_size (unsigned int num_glyphs) const
{ return HBUINT8::static_size * num_glyphs; }
HBUINT8 fds[HB_VAR_ARRAY];
@@ -229,7 +229,7 @@
template
struct FDSelect3_4
{
- unsigned int get_size () const
+ size_t get_size () const
{ return GID_TYPE::static_size * 2 + ranges.get_size (); }
bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const
@@ -304,7 +304,7 @@
return_trace (true);
}
- unsigned int get_size (unsigned int num_glyphs) const
+ size_t get_size (unsigned int num_glyphs) const
{
switch (format)
{
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.cc 2026-07-13 06:55:55.000000000 +0000
@@ -24,6 +24,10 @@
* Adobe Author(s): Michiharu Ariza
*/
+#ifndef HB_OT_CFF1_TABLE_CC
+#define HB_OT_CFF1_TABLE_CC
+#ifdef HB_OT_CFF1_TABLE_CC /* Pacify -Wunused-macros. */
+
#include "hb.hh"
#ifndef HB_NO_CFF
@@ -609,3 +613,6 @@
#endif
+
+#endif /* HB_OT_CFF1_TABLE_CC pacify */
+#endif /* HB_OT_CFF1_TABLE_CC guard */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -234,7 +234,7 @@
return_trace (true);
}
- unsigned int get_size () const
+ size_t get_size () const
{
unsigned int size = min_size;
switch (table_format ())
@@ -262,7 +262,7 @@
void get_supplement_codes (hb_codepoint_t sid, hb_vector_t &codes) const
{
- codes.resize (0);
+ codes.clear ();
if (has_supplement ())
suppEncData().get_codes (sid, codes);
}
@@ -344,7 +344,7 @@
return 0;
}
- static unsigned int get_size (unsigned int num_glyphs)
+ static size_t get_size (unsigned int num_glyphs)
{
assert (num_glyphs > 0);
return UnsizedArrayOf::get_size (num_glyphs - 1);
@@ -459,7 +459,7 @@
return 0;
}
- unsigned int get_size (unsigned int num_glyphs) const
+ size_t get_size (unsigned int num_glyphs) const
{
int glyph = (int) num_glyphs;
unsigned num_ranges = 0;
@@ -475,7 +475,7 @@
return get_size_for_ranges (num_ranges);
}
- static unsigned int get_size_for_ranges (unsigned int num_ranges)
+ static size_t get_size_for_ranges (unsigned int num_ranges)
{
return UnsizedArrayOf >::get_size (num_ranges);
}
@@ -563,7 +563,7 @@
return_trace (true);
}
- unsigned int get_size (unsigned int num_glyphs) const
+ size_t get_size (unsigned int num_glyphs) const
{
switch (format)
{
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc 2026-07-13 06:55:55.000000000 +0000
@@ -24,6 +24,10 @@
* Adobe Author(s): Michiharu Ariza
*/
+#ifndef HB_OT_CFF2_TABLE_CC
+#define HB_OT_CFF2_TABLE_CC
+#ifdef HB_OT_CFF2_TABLE_CC /* Pacify -Wunused-macros. */
+
#include "hb.hh"
#ifndef HB_NO_OT_FONT_CFF
@@ -228,3 +232,6 @@
}
#endif
+
+#endif /* HB_OT_CFF2_TABLE_CC pacify */
+#endif /* HB_OT_CFF2_TABLE_CC guard */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -58,7 +58,7 @@
return_trace (true);
}
- unsigned int get_size (unsigned int num_glyphs) const
+ size_t get_size (unsigned int num_glyphs) const
{
switch (format)
{
@@ -130,7 +130,7 @@
return_trace (true);
}
- unsigned int get_size () const { return HBUINT16::static_size + size; }
+ size_t get_size () const { return HBUINT16::static_size + size; }
HBUINT16 size;
ItemVariationStore varStore;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -237,8 +237,6 @@
struct CmapSubtableFormat4
{
-
-
template
@@ -521,9 +519,10 @@
struct accelerator_t
{
accelerator_t () {}
- accelerator_t (const CmapSubtableFormat4 *subtable) { init (subtable); }
+ accelerator_t (const CmapSubtableFormat4 *subtable) = delete;
- void init (const CmapSubtableFormat4 *subtable)
+ void init (const CmapSubtableFormat4 *subtable,
+ unsigned int subtable_data_size)
{
segCount = subtable->segCountX2 / 2;
endCount = subtable->values.arrayZ;
@@ -531,7 +530,11 @@
idDelta = startCount + segCount;
idRangeOffset = idDelta + segCount;
glyphIdArray = idRangeOffset + segCount;
- glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
+
+ unsigned int values_offset = 16 + 8 * segCount;
+ glyphIdArrayLength = subtable_data_size > values_offset
+ ? (subtable_data_size - values_offset) / 2
+ : 0;
}
bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
@@ -671,23 +674,36 @@
unsigned int glyphIdArrayLength;
};
- bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph,
+ unsigned int subtable_data_size) const
{
- accelerator_t accel (this);
+ accelerator_t accel;
+ accel.init (this, subtable_data_size);
return accel.get_glyph_func (&accel, codepoint, glyph);
}
- void collect_unicodes (hb_set_t *out) const
+ bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ { return false; }
+
+ void collect_unicodes (hb_set_t *out, unsigned int subtable_data_size) const
{
- accelerator_t accel (this);
+ accelerator_t accel;
+ accel.init (this, subtable_data_size);
accel.collect_unicodes (out);
}
+ void collect_unicodes (hb_set_t *out) const
+ { collect_unicodes (out, length); }
void collect_mapping (hb_set_t *unicodes, /* OUT */
- hb_map_t *mapping /* OUT */) const
+ hb_map_t *mapping, /* OUT */
+ unsigned int subtable_data_size) const
{
- accelerator_t accel (this);
+ accelerator_t accel;
+ accel.init (this, subtable_data_size);
accel.collect_mapping (unicodes, mapping);
}
+ void collect_mapping (hb_set_t *unicodes, /* OUT */
+ hb_map_t *mapping /* OUT */) const
+ { collect_mapping (unicodes, mapping, length); }
bool sanitize (hb_sanitize_context_t *c) const
{
@@ -696,14 +712,9 @@
return_trace (false);
hb_barrier ();
- if (unlikely (!c->check_range (this, length)))
- return_trace (false);
-
- return_trace (16 + 4 * (unsigned int) segCountX2 <= length);
+ return_trace (c->check_range (values, 2 + 4 * segCountX2));
}
-
-
protected:
HBUINT16 format; /* Format number is set to 4. */
HBUINT16 length; /* This is the length in bytes of the
@@ -1485,11 +1496,14 @@
/* Note: We intentionally do NOT implement subtable formats 2 and 8. */
bool get_glyph (hb_codepoint_t codepoint,
- hb_codepoint_t *glyph) const
+ hb_codepoint_t *glyph,
+ unsigned int subtable_data_size = 0) const
{
switch (u.format.v) {
case 0: hb_barrier (); return u.format0 .get_glyph (codepoint, glyph);
- case 4: hb_barrier (); return u.format4 .get_glyph (codepoint, glyph);
+ case 4: hb_barrier (); return subtable_data_size
+ ? u.format4.get_glyph (codepoint, glyph, subtable_data_size)
+ : false;
case 6: hb_barrier (); return u.format6 .get_glyph (codepoint, glyph);
case 10: hb_barrier (); return u.format10.get_glyph (codepoint, glyph);
case 12: hb_barrier (); return u.format12.get_glyph (codepoint, glyph);
@@ -1498,11 +1512,17 @@
default: return false;
}
}
- void collect_unicodes (hb_set_t *out, unsigned int num_glyphs = UINT_MAX) const
+ void collect_unicodes (hb_set_t *out,
+ unsigned int num_glyphs = UINT_MAX,
+ unsigned int subtable_data_size = 0) const
{
switch (u.format.v) {
case 0: hb_barrier (); u.format0 .collect_unicodes (out); return;
- case 4: hb_barrier (); u.format4 .collect_unicodes (out); return;
+ case 4: hb_barrier (); if (subtable_data_size)
+ u.format4.collect_unicodes (out, subtable_data_size);
+ else
+ u.format4.collect_unicodes (out);
+ return;
case 6: hb_barrier (); u.format6 .collect_unicodes (out); return;
case 10: hb_barrier (); u.format10.collect_unicodes (out); return;
case 12: hb_barrier (); u.format12.collect_unicodes (out, num_glyphs); return;
@@ -1514,11 +1534,16 @@
void collect_mapping (hb_set_t *unicodes, /* OUT */
hb_map_t *mapping, /* OUT */
- unsigned num_glyphs = UINT_MAX) const
+ unsigned num_glyphs = UINT_MAX,
+ unsigned int subtable_data_size = 0) const
{
switch (u.format.v) {
case 0: hb_barrier (); u.format0 .collect_mapping (unicodes, mapping); return;
- case 4: hb_barrier (); u.format4 .collect_mapping (unicodes, mapping); return;
+ case 4: hb_barrier (); if (subtable_data_size)
+ u.format4.collect_mapping (unicodes, mapping, subtable_data_size);
+ else
+ u.format4.collect_mapping (unicodes, mapping);
+ return;
case 6: hb_barrier (); u.format6 .collect_mapping (unicodes, mapping); return;
case 10: hb_barrier (); u.format10.collect_mapping (unicodes, mapping); return;
case 12: hb_barrier (); u.format12.collect_mapping (unicodes, mapping, num_glyphs); return;
@@ -1633,7 +1658,7 @@
CmapSubtable *cmapsubtable = c->push ();
unsigned origin_length = c->length ();
cmapsubtable->serialize (c, it, format, plan, &(base+subtable));
- if (c->length () - origin_length > 0 && !c->in_error()) *objidx = c->pop_pack ();
+ if (c->length () > origin_length && !c->in_error()) *objidx = c->pop_pack ();
else c->pop_discard ();
}
@@ -1662,6 +1687,7 @@
private:
hb_blob_ptr_t base_blob;
const char* base;
+ unsigned int table_length;
hb_hashmap_t> cached_unicodes;
public:
@@ -1686,15 +1712,18 @@
hb_free (cache);
}
- SubtableUnicodesCache(const void* cmap_base)
+ SubtableUnicodesCache(const void* cmap_base,
+ unsigned int table_length_ = 0)
: base_blob(),
base ((const char*) cmap_base),
+ table_length (table_length_),
cached_unicodes ()
{}
SubtableUnicodesCache(hb_blob_ptr_t base_blob_)
: base_blob(base_blob_),
base ((const char *) base_blob.get()),
+ table_length (base_blob.get_length ()),
cached_unicodes ()
{}
@@ -1725,7 +1754,10 @@
if (unlikely (s->in_error ()))
return hb_set_get_empty ();
- (base+record->subtable).collect_unicodes (s);
+ unsigned int subtable_data_size = record->subtable < table_length
+ ? table_length - (unsigned int) record->subtable
+ : 0;
+ (base+record->subtable).collect_unicodes (s, UINT_MAX, subtable_data_size);
if (unlikely (!cached_unicodes.set ((unsigned) ((const char *) record - base), hb::unique_ptr {s})))
return hb_set_get_empty ();
@@ -1737,7 +1769,7 @@
};
-static inline uint_fast16_t
+static inline uint16_t
_hb_symbol_pua_map (unsigned codepoint)
{
if (codepoint <= 0x00FFu)
@@ -1784,7 +1816,8 @@
EncodingRecIter encodingrec_iter,
const void *base,
hb_subset_plan_t *plan,
- bool drop_format_4 = false)
+ bool drop_format_4 = false,
+ unsigned int source_table_length = 0)
{
if (unlikely (!c->extend_min ((*this)))) return false;
this->version = 0;
@@ -1792,7 +1825,7 @@
unsigned format4objidx = 0, format12objidx = 0, format14objidx = 0;
auto snap = c->snapshot ();
- SubtableUnicodesCache local_unicodes_cache (base);
+ SubtableUnicodesCache local_unicodes_cache (base, source_table_length);
const SubtableUnicodesCache* unicodes_cache = &local_unicodes_cache;
if (plan->accelerator &&
@@ -1821,7 +1854,8 @@
encodingrec_iter,
base,
plan,
- true);
+ true,
+ source_table_length);
}
}
@@ -1838,9 +1872,11 @@
}
else if (format == 14) c->copy (_, it, 14u, base, plan, &format14objidx);
}
- c->check_assign(this->encodingRecord.len,
- (c->length () - cmap::min_size)/EncodingRecord::static_size,
- HB_SERIALIZE_ERROR_INT_OVERFLOW);
+ unsigned length = c->length ();
+ unsigned available = length > cmap::min_size ? length - cmap::min_size : 0;
+ c->check_assign(this->encodingRecord.len,
+ available / EncodingRecord::static_size,
+ HB_SERIALIZE_ERROR_INT_OVERFLOW);
// Fail if format 4 was dropped and there is no cmap12.
return !drop_format_4 || format12objidx;
@@ -1955,7 +1991,9 @@
it,
encodingrec_iter,
this,
- c->plan));
+ c->plan,
+ false,
+ c->source_blob->length));
}
const CmapSubtable *find_best_subtable (bool *symbol = nullptr,
@@ -2034,32 +2072,60 @@
this->get_glyph_data = subtable;
#ifndef HB_NO_CMAP_LEGACY_SUBTABLES
+ bool is_format4 = subtable->u.format.v == 4;
+ auto set_format4_getter = [this] (bool (*func) (const void *,
+ hb_codepoint_t,
+ hb_codepoint_t *))
+ {
+ this->format4_accel.init (&this->subtable->u.format4,
+ get_subtable_data_size (this->subtable));
+ this->get_glyph_data = &this->format4_accel;
+ this->get_glyph_funcZ = func;
+ };
if (unlikely (symbol))
{
switch ((unsigned) face->table.OS2->get_font_page ()) {
case OS2::font_page_t::FONT_PAGE_NONE:
- this->get_glyph_funcZ = get_glyph_from_symbol;
+ if (is_format4)
+ set_format4_getter (get_glyph_from_symbol);
+ else
+ this->get_glyph_funcZ = get_glyph_from_symbol;
break;
#ifndef HB_NO_OT_SHAPER_ARABIC_FALLBACK
case OS2::font_page_t::FONT_PAGE_SIMP_ARABIC:
- this->get_glyph_funcZ = get_glyph_from_symbol;
+ if (is_format4)
+ set_format4_getter (get_glyph_from_symbol);
+ else
+ this->get_glyph_funcZ = get_glyph_from_symbol;
break;
case OS2::font_page_t::FONT_PAGE_TRAD_ARABIC:
- this->get_glyph_funcZ = get_glyph_from_symbol;
+ if (is_format4)
+ set_format4_getter (get_glyph_from_symbol);
+ else
+ this->get_glyph_funcZ = get_glyph_from_symbol;
break;
#endif
default:
- this->get_glyph_funcZ = get_glyph_from;
+ if (is_format4)
+ set_format4_getter (get_glyph_from);
+ else
+ this->get_glyph_funcZ = get_glyph_from;
break;
}
}
else if (unlikely (macroman))
{
- this->get_glyph_funcZ = get_glyph_from_macroman;
+ if (is_format4)
+ set_format4_getter (get_glyph_from_macroman);
+ else
+ this->get_glyph_funcZ = get_glyph_from_macroman;
}
else if (unlikely (mac))
{
- this->get_glyph_funcZ = get_glyph_from_ascii;
+ if (is_format4)
+ set_format4_getter (get_glyph_from_ascii);
+ else
+ this->get_glyph_funcZ = get_glyph_from_ascii;
}
else
#endif
@@ -2074,7 +2140,8 @@
break;
case 4:
{
- this->format4_accel.init (&subtable->u.format4);
+ this->format4_accel.init (&subtable->u.format4,
+ get_subtable_data_size (subtable));
this->get_glyph_data = &this->format4_accel;
this->get_glyph_funcZ = this->format4_accel.get_glyph_func;
break;
@@ -2155,10 +2222,10 @@
}
void collect_unicodes (hb_set_t *out, unsigned int num_glyphs) const
- { subtable->collect_unicodes (out, num_glyphs); }
+ { subtable->collect_unicodes (out, num_glyphs, get_subtable_data_size (subtable)); }
void collect_mapping (hb_set_t *unicodes, hb_map_t *mapping,
unsigned num_glyphs = UINT_MAX) const
- { subtable->collect_mapping (unicodes, mapping, num_glyphs); }
+ { subtable->collect_mapping (unicodes, mapping, num_glyphs, get_subtable_data_size (subtable)); }
void collect_variation_selectors (hb_set_t *out) const
{ subtable_uvs->collect_variation_selectors (out); }
void collect_variation_unicodes (hb_codepoint_t variation_selector,
@@ -2169,7 +2236,7 @@
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
hb_codepoint_t codepoint,
hb_codepoint_t *glyph);
- typedef uint_fast16_t (*hb_pua_remap_func_t) (unsigned);
+ typedef uint16_t (*hb_pua_remap_func_t) (unsigned);
template
HB_INTERNAL static bool get_glyph_from (const void *obj,
@@ -2217,6 +2284,21 @@
return c && typed_obj->get_glyph (c, glyph);
}
+ unsigned int get_subtable_data_size (const CmapSubtable *subtable) const
+ {
+ unsigned int table_length = this->table.get_length ();
+ uintptr_t table_start = (uintptr_t) (const void *) this->table.get ();
+ uintptr_t subtable_addr = (uintptr_t) (const void *) subtable;
+ if (unlikely (subtable_addr < table_start))
+ return 0;
+
+ uintptr_t subtable_offset = subtable_addr - table_start;
+ if (unlikely (subtable_offset >= table_length))
+ return 0;
+
+ return table_length - (unsigned int) subtable_offset;
+ }
+
private:
hb_nonnull_ptr_t subtable;
hb_nonnull_ptr_t subtable_uvs;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-color.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-color.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-color.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-color.cc 2026-07-13 06:55:55.000000000 +0000
@@ -35,7 +35,9 @@
#include "OT/Color/COLR/COLR.hh"
#include "OT/Color/CPAL/CPAL.hh"
#include "OT/Color/sbix/sbix.hh"
+#ifndef HB_NO_SVG
#include "OT/Color/svg/svg.hh"
+#endif
/**
@@ -274,6 +276,7 @@
* SVG
*/
+#ifndef HB_NO_SVG
/**
* hb_ot_color_has_svg:
* @face: #hb_face_t to work upon.
@@ -291,6 +294,70 @@
}
/**
+ * hb_ot_color_get_svg_document_count:
+ * @face: #hb_face_t to work upon.
+ *
+ * Gets the number of SVG documents in the face `SVG` table.
+ *
+ * Return value: number of SVG documents in the face.
+ *
+ * Since: 12.1.0
+ */
+unsigned int
+hb_ot_color_get_svg_document_count (hb_face_t *face)
+{
+ return face->table.SVG->get_document_count ();
+}
+
+/**
+ * hb_ot_color_glyph_get_svg_document_index:
+ * @face: #hb_face_t to work upon.
+ * @glyph: glyph ID to query.
+ * @svg_document_index: (out) (nullable): output SVG document index.
+ *
+ * Gets the `SVG`-table document index associated with a glyph.
+ *
+ * Return value: `true` if @glyph maps to an SVG document, `false` otherwise.
+ *
+ * Since: 12.1.0
+ */
+hb_bool_t
+hb_ot_color_glyph_get_svg_document_index (hb_face_t *face,
+ hb_codepoint_t glyph,
+ unsigned int *svg_document_index)
+{
+ unsigned doc_index = 0;
+ hb_bool_t ret = face->table.SVG->get_glyph_document_index (glyph, &doc_index);
+ if (ret && svg_document_index)
+ *svg_document_index = doc_index;
+ return ret;
+}
+
+/**
+ * hb_ot_color_get_svg_document_glyph_range:
+ * @face: #hb_face_t to work upon.
+ * @svg_document_index: SVG document index.
+ * @start_glyph_id: (out) (nullable): output start glyph ID.
+ * @end_glyph_id: (out) (nullable): output end glyph ID.
+ *
+ * Gets the glyph range covered by an `SVG`-table document index.
+ *
+ * Return value: `true` if @svg_document_index is valid, `false` otherwise.
+ *
+ * Since: 13.0.0
+ */
+hb_bool_t
+hb_ot_color_get_svg_document_glyph_range (hb_face_t *face,
+ unsigned int svg_document_index,
+ hb_codepoint_t *start_glyph_id,
+ hb_codepoint_t *end_glyph_id)
+{
+ return face->table.SVG->get_document_glyph_range (svg_document_index,
+ start_glyph_id,
+ end_glyph_id);
+}
+
+/**
* hb_ot_color_glyph_reference_svg:
* @face: #hb_face_t to work upon
* @glyph: a svg glyph index
@@ -308,6 +375,7 @@
{
return face->table.SVG->reference_blob_for_glyph (glyph);
}
+#endif
/*
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-color.h openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-color.h
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-color.h 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-color.h 2026-07-13 06:55:55.000000000 +0000
@@ -136,6 +136,20 @@
HB_EXTERN hb_bool_t
hb_ot_color_has_svg (hb_face_t *face);
+HB_EXTERN unsigned int
+hb_ot_color_get_svg_document_count (hb_face_t *face);
+
+HB_EXTERN hb_bool_t
+hb_ot_color_glyph_get_svg_document_index (hb_face_t *face,
+ hb_codepoint_t glyph,
+ unsigned int *svg_document_index /* OUT */);
+
+HB_EXTERN hb_bool_t
+hb_ot_color_get_svg_document_glyph_range (hb_face_t *face,
+ unsigned int svg_document_index,
+ hb_codepoint_t *start_glyph_id, /* OUT */
+ hb_codepoint_t *end_glyph_id /* OUT */);
+
HB_EXTERN hb_blob_t *
hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph);
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-face-table-list.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-face-table-list.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-face-table-list.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-face-table-list.hh 2026-07-13 06:55:55.000000000 +0000
@@ -140,8 +140,10 @@
HB_OT_CORE_TABLE (OT, CPAL)
HB_OT_ACCELERATOR (OT, CBDT)
HB_OT_ACCELERATOR (OT, sbix)
+#ifndef HB_NO_SVG
HB_OT_ACCELERATOR (OT, SVG)
#endif
+#endif
/* OpenType math. */
#ifndef HB_NO_MATH
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc 2026-07-13 06:55:55.000000000 +0000
@@ -897,31 +897,29 @@
{
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
hb_draw_session_t draw_session {draw_funcs, draw_data};
- bool ret = false;
OT::hb_scalar_cache_t *gvar_cache = nullptr;
+#ifndef HB_NO_VAR
if (font->num_coords)
{
ot_font->check_serial (font);
gvar_cache = ot_font->draw.acquire_gvar_cache (*ot_font->ot_face->gvar);
}
+#endif
+ HB_SCOPE_GUARD (ot_font->draw.release_gvar_cache (gvar_cache));
#ifndef HB_NO_VAR_COMPOSITES
- if (font->face->table.VARC->get_path (font, glyph, draw_session)) { ret = true; goto done; }
+ if (font->face->table.VARC->get_path (font, glyph, draw_session)) return true;
#endif
// Keep the following in synch with VARC::get_path_at()
- if (font->face->table.glyf->get_path (font, glyph, draw_session, gvar_cache)) { ret = true; goto done; }
+ if (font->face->table.glyf->get_path (font, glyph, draw_session, gvar_cache)) return true;
#ifndef HB_NO_CFF
- if (font->face->table.cff2->get_path (font, glyph, draw_session)) { ret = true; goto done; }
- if (font->face->table.cff1->get_path (font, glyph, draw_session)) { ret = true; goto done; }
+ if (font->face->table.cff2->get_path (font, glyph, draw_session)) return true;
+ if (font->face->table.cff1->get_path (font, glyph, draw_session)) return true;
#endif
-done:
-
- ot_font->draw.release_gvar_cache (gvar_cache);
-
- return ret;
+ return false;
}
#endif
@@ -937,7 +935,9 @@
{
#ifndef HB_NO_COLOR
if (font->face->table.COLR->paint_glyph (font, glyph, paint_funcs, paint_data, palette, foreground)) return true;
+#ifndef HB_NO_SVG
if (font->face->table.SVG->paint_glyph (font, glyph, paint_funcs, paint_data)) return true;
+#endif
#ifndef HB_NO_OT_FONT_BITMAP
if (font->face->table.CBDT->paint_glyph (font, glyph, paint_funcs, paint_data)) return true;
if (font->face->table.sbix->paint_glyph (font, glyph, paint_funcs, paint_data)) return true;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-hdmx-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-hdmx-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-hdmx-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-hdmx-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -41,7 +41,7 @@
struct DeviceRecord
{
- static unsigned int get_size (unsigned count)
+ static size_t get_size (unsigned count)
{ return hb_ceil_to_4 (min_size + count * HBUINT8::static_size); }
template
struct KernSubTable
{
- unsigned int get_size () const { return u.header.length; }
+ size_t get_size () const { return u.header.length; }
unsigned int get_type () const { return u.header.format; }
int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh 2026-07-13 06:55:55.000000000 +0000
@@ -637,7 +637,7 @@
return characters.len;
}
- unsigned get_size () const
+ size_t get_size () const
{ return min_size + characters.len * HBUINT24::static_size; }
void collect_name_ids (hb_set_t *nameids_to_retain /* OUT */) const
@@ -1272,7 +1272,7 @@
TSubTable& get_subtable (unsigned int i)
{ return this+get_subtables ()[i]; }
- unsigned int get_size () const
+ size_t get_size () const
{
const HBUINT16 &markFilteringSet = StructAfter (subTable);
if (lookupFlag & LookupFlag::UseMarkFilteringSet)
@@ -2543,13 +2543,13 @@
struct hb_scalar_cache_t
{
private:
- static constexpr unsigned STATIC_LENGTH = 16;
+ static constexpr unsigned STATIC_LENGTH = 128;
static constexpr int INVALID = INT_MIN;
static constexpr float MULTIPLIER = 1 << ((sizeof (int) * 8) - 2);
static constexpr float DIVISOR = 1.f / MULTIPLIER;
public:
- hb_scalar_cache_t () : length (STATIC_LENGTH) { clear (); }
+ hb_scalar_cache_t () {}
hb_scalar_cache_t (const hb_scalar_cache_t&) = delete;
hb_scalar_cache_t (hb_scalar_cache_t&&) = delete;
@@ -2561,8 +2561,9 @@
{
if (!count) return (hb_scalar_cache_t *) &Null(hb_scalar_cache_t);
- if (scratch_cache && count <= scratch_cache->length)
+ if (scratch_cache && count <= STATIC_LENGTH)
{
+ scratch_cache->length = count;
scratch_cache->clear ();
return scratch_cache;
}
@@ -2790,7 +2791,7 @@
return !regions.in_error ();
}
- unsigned int get_size () const { return min_size + VarRegionAxis::static_size * axisCount * regionCount; }
+ size_t get_size () const { return min_size + VarRegionAxis::static_size * axisCount * regionCount; }
public:
HBUINT16 axisCount;
@@ -2870,7 +2871,7 @@
unsigned int get_row_size () const
{ return (wordCount () + regionIndices.len) * (longWords () ? 2 : 1); }
- unsigned int get_size () const
+ size_t get_size () const
{ return min_size
- regionIndices.min_size + regionIndices.get_size ()
+ itemCount * get_row_size ();
@@ -2970,7 +2971,9 @@
}
if (unlikely (!c->extend_min (this))) return_trace (false);
- itemCount = row_count;
+ if (unlikely (!c->check_assign (itemCount, row_count,
+ HB_SERIALIZE_ERROR_INT_OVERFLOW)))
+ return_trace (false);
int min_threshold = has_long ? -65536 : -128;
int max_threshold = has_long ? +65535 : +127;
@@ -3240,7 +3243,7 @@
struct MultiVarData
{
- unsigned int get_size () const
+ size_t get_size () const
{ return min_size
- regionIndices.min_size + regionIndices.get_size ()
+ StructAfter (regionIndices).get_size ();
@@ -3256,12 +3259,24 @@
auto values_iter = deltaSets.fetcher (inner);
unsigned regionCount = regionIndices.len;
+ unsigned skip = 0;
for (unsigned regionIndex = 0; regionIndex < regionCount; regionIndex++)
{
float scalar = regions.evaluate (regionIndices.arrayZ[regionIndex],
coords, coord_count,
cache);
- values_iter.add_to (out, scalar);
+ // We skip lazily. Helps with the tail end.
+ if (scalar == 0.0f)
+ skip += out.length;
+ else
+ {
+ if (skip)
+ {
+ values_iter.skip (skip);
+ skip = 0;
+ }
+ values_iter.add_to (out, scalar);
+ }
}
}
@@ -3623,7 +3638,7 @@
{
friend struct DeltaSetIndexMap;
- unsigned get_size () const
+ size_t get_size () const
{ return min_size + mapCount * get_width (); }
private:
@@ -4041,7 +4056,7 @@
bool evaluate (const int *coords, unsigned int coord_len,
Instancer *instancer) const
{
- signed value = defaultValue;
+ float value = defaultValue;
value += (*instancer)[varIdx];
return value > 0;
}
@@ -4789,7 +4804,7 @@
public:
- unsigned int get_size () const
+ size_t get_size () const
{
unsigned int f = deltaFormat;
if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh 2026-07-13 06:55:55.000000000 +0000
@@ -743,6 +743,10 @@
hb_vector_t match_positions;
uint32_t stack_match_positions[8];
+#ifndef HB_NO_BUFFER_MESSAGE
+ hb_buffer_t::changed_func_t orig_changed_func = nullptr;
+ void *orig_changed_data = nullptr;
+#endif
hb_ot_apply_context_t (unsigned int table_index_,
hb_font_t *font_,
@@ -773,6 +777,30 @@
{
init_iters ();
match_positions.set_storage (stack_match_positions);
+
+#ifndef HB_NO_BUFFER_MESSAGE
+ if (buffer->messaging ())
+ {
+ assert (buffer->changed_func == nullptr ||
+ buffer->changed_func == buffer_changed_trampoline);
+ orig_changed_func = buffer->changed_func;
+ orig_changed_data = buffer->changed_data;
+ buffer->changed_func = buffer_changed_trampoline;
+ buffer->changed_data = this;
+ }
+#endif
+ }
+ ~hb_ot_apply_context_t ()
+ {
+#ifndef HB_NO_BUFFER_MESSAGE
+ if (buffer->messaging ())
+ {
+ assert (buffer->changed_func == buffer_changed_trampoline);
+ assert (buffer->changed_data == this);
+ buffer->changed_func = orig_changed_func;
+ buffer->changed_data = orig_changed_data;
+ }
+#endif
}
void init_iters ()
@@ -801,6 +829,18 @@
return buffer->random_state;
}
+ static void buffer_changed_trampoline (hb_buffer_t *buffer HB_UNUSED, void *user_data)
+ {
+ ((hb_ot_apply_context_t *) user_data)->buffer_changed ();
+ }
+ void buffer_changed ()
+ {
+ buffer->update_digest ();
+ if (likely (has_glyph_classes))
+ for (unsigned i = 0; i < buffer->len; i++)
+ _set_glyph_class_props (buffer->info[i]);
+ }
+
HB_ALWAYS_INLINE
HB_HOT
bool match_properties_mark (const hb_glyph_info_t *info,
@@ -870,8 +910,7 @@
props |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
if (likely (has_glyph_classes))
{
- props &= HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
- _hb_glyph_info_set_glyph_props (&buffer->cur(), props | gdef_accel.get_glyph_props (glyph_index));
+ _set_glyph_class_props (buffer->cur(), props, glyph_index);
}
else if (class_guess)
{
@@ -881,6 +920,19 @@
else
_hb_glyph_info_set_glyph_props (&buffer->cur(), props);
}
+ void _set_glyph_class_props (hb_glyph_info_t &info,
+ unsigned int props,
+ hb_codepoint_t glyph_index)
+ {
+ props &= HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
+ _hb_glyph_info_set_glyph_props (&info, props | gdef_accel.get_glyph_props (glyph_index));
+ }
+ void _set_glyph_class_props (hb_glyph_info_t &info)
+ {
+ _set_glyph_class_props (info,
+ _hb_glyph_info_get_glyph_props (&info),
+ info.codepoint);
+ }
void replace_glyph (hb_codepoint_t glyph_index)
{
@@ -1813,23 +1865,25 @@
if (buffer->have_output)
c->buffer->sync_so_far ();
c->buffer->message (c->font,
- "recursing to lookup %u at %u",
+ "start recursing to lookup %u at %u",
(unsigned) lookupRecord[i].lookupListIndex,
buffer->idx);
}
- if (!c->recurse (lookupRecord[i].lookupListIndex))
- continue;
+ bool ret = c->recurse (lookupRecord[i].lookupListIndex);
if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
{
if (buffer->have_output)
c->buffer->sync_so_far ();
c->buffer->message (c->font,
- "recursed to lookup %u",
+ "end recursing to lookup %u",
(unsigned) lookupRecord[i].lookupListIndex);
}
+ if (!ret)
+ continue;
+
unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len ();
int delta = new_len - orig_len;
@@ -4590,7 +4644,7 @@
public:
DEFINE_SIZE_MIN (4 + 3 * Types::size);
- unsigned int get_size () const
+ size_t get_size () const
{
return min_size +
(version.to_int () >= 0x00010001u ? featureVars.static_size : 0);
@@ -4672,7 +4726,7 @@
struct GSUBGPOS
{
- unsigned int get_size () const
+ size_t get_size () const
{
switch (u.version.major) {
case 1: hb_barrier (); return u.version1.get_size ();
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc 2026-07-13 06:55:55.000000000 +0000
@@ -2072,21 +2072,25 @@
void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
{
GSUBProxy proxy (font->face);
+ char tag[5] = {0};
+ hb_tag_to_string (chosen_script[0], tag);
if (buffer->messaging () &&
- !buffer->message (font, "start table GSUB script tag '%c%c%c%c'", HB_UNTAG (chosen_script[0]))) return;
+ !buffer->message (font, "start table GSUB script tag '%s'", tag)) return;
apply (proxy, plan, font, buffer);
if (buffer->messaging ())
- (void) buffer->message (font, "end table GSUB script tag '%c%c%c%c'", HB_UNTAG (chosen_script[0]));
+ (void) buffer->message (font, "end table GSUB script tag '%s'", tag);
}
void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
{
GPOSProxy proxy (font->face);
+ char tag[5] = {0};
+ hb_tag_to_string (chosen_script[0], tag);
if (buffer->messaging () &&
- !buffer->message (font, "start table GPOS script tag '%c%c%c%c'", HB_UNTAG (chosen_script[1]))) return;
+ !buffer->message (font, "start table GPOS script tag '%s'", tag)) return;
apply (proxy, plan, font, buffer);
if (buffer->messaging ())
- (void) buffer->message (font, "end table GPOS script tag '%c%c%c%c'", HB_UNTAG (chosen_script[1]));
+ (void) buffer->message (font, "end table GPOS script tag '%s'", tag);
}
void
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-os2-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-os2-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-os2-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-os2-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -344,7 +344,7 @@
font_page_t get_font_page () const
{ return (font_page_t) (version == 0 ? fsSelection & 0xFF00 : 0); }
- unsigned get_size () const
+ size_t get_size () const
{
unsigned result = min_size;
if (version >= 1) result += v1X.get_size ();
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-post-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-post-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-post-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-post-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -194,7 +194,11 @@
for (unsigned int i = 0; i < count; i++)
gids[i] = i;
- hb_qsort (gids, count, sizeof (gids[0]), cmp_gids, (void *) this);
+ auto thiz = this;
+ hb_array_t (gids, count)
+ .qsort ([thiz] (const uint16_t &a, const uint16_t &b) {
+ return thiz->find_glyph_name (a).cmp (thiz->find_glyph_name (b)) > 0;
+ });
if (unlikely (!gids_sorted_by_name.cmpexch (nullptr, gids)))
{
@@ -235,14 +239,6 @@
return 0;
}
- static int cmp_gids (const void *pa, const void *pb, void *arg)
- {
- const accelerator_t *thiz = (const accelerator_t *) arg;
- uint16_t a = * (const uint16_t *) pa;
- uint16_t b = * (const uint16_t *) pb;
- return thiz->find_glyph_name (b).cmp (thiz->find_glyph_name (a));
- }
-
static int cmp_key (const void *pk, const void *po, void *arg)
{
const accelerator_t *thiz = (const accelerator_t *) arg;
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc 2026-07-13 06:55:55.000000000 +0000
@@ -322,6 +322,7 @@
/* First round, decompose */
bool all_simple = true;
+ if (buffer->message (font, "start decompose"))
{
buffer->clear_output ();
count = buffer->len;
@@ -364,6 +365,7 @@
}
while (buffer->idx < count && buffer->successful);
buffer->sync ();
+ (void) buffer->message (font, "end decompose");
}
@@ -420,7 +422,8 @@
if (!all_simple &&
buffer->successful &&
(mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS ||
- mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT))
+ mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT) &&
+ buffer->message (font, "start compose"))
{
/* As noted in the comment earlier, we don't try to combine
* ccc=0 chars with their previous Starter. */
@@ -470,6 +473,7 @@
starter = buffer->out_len - 1;
}
buffer->sync ();
+ (void) buffer->message (font, "end compose");
}
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc 2026-07-13 06:55:55.000000000 +0000
@@ -580,12 +580,8 @@
if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS))
return;
- if (HB_BUFFER_CLUSTER_LEVEL_IS_GRAPHEMES (buffer->cluster_level))
- foreach_grapheme (buffer, start, end)
- buffer->merge_clusters (start, end);
- else
- foreach_grapheme (buffer, start, end)
- buffer->unsafe_to_break (start, end);
+ foreach_grapheme (buffer, start, end)
+ buffer->merge_grapheme_clusters (start, end);
}
static void
@@ -1332,4 +1328,20 @@
}
+/**
+ * hb_ot_shape_get_buffer_format_serial:
+ *
+ * Returns the serial number of the current internal buffer format.
+ * See #HB_OT_SHAPE_BUFFER_FORMAT_SERIAL for more information.
+ *
+ * Return value: The current buffer-format serial number.
+ *
+ * Since: 13.2.0
+ **/
+unsigned int
+hb_ot_shape_get_buffer_format_serial (void)
+{
+ return HB_OT_SHAPE_BUFFER_FORMAT_SERIAL;
+}
+
#endif
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.h openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.h
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.h 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.h 2026-07-13 06:55:55.000000000 +0000
@@ -54,6 +54,21 @@
unsigned int *tag_count, /* IN/OUT */
hb_tag_t *tags /* OUT */);
+/**
+ * HB_OT_SHAPE_BUFFER_FORMAT_SERIAL:
+ *
+ * The serial number of the current internal buffer format.
+ *
+ * The serial number will increase when internal #hb_glyph_info_t and
+ * #hb_glyph_position_t members change their format.
+ *
+ * Since: 13.2.0
+ */
+#define HB_OT_SHAPE_BUFFER_FORMAT_SERIAL 1
+
+HB_EXTERN unsigned int
+hb_ot_shape_get_buffer_format_serial (void);
+
HB_END_DECLS
#endif /* HB_OT_SHAPE_H */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-pua.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-pua.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-pua.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-pua.hh 2026-07-13 06:55:55.000000000 +0000
@@ -9,41 +9,43 @@
#ifndef HB_OT_SHAPER_ARABIC_PUA_HH
#define HB_OT_SHAPER_ARABIC_PUA_HH
-static const uint8_t
-_hb_arabic_u8[464] =
+#include "hb.hh"
+
+#include
+
+static const uint8_t _hb_arabic_pua_u8[453]=
{
- 84, 86, 85, 85, 85, 85, 85,213, 16, 34, 34, 34, 34, 34, 35, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 36, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 82, 16, 0, 0, 0, 0, 1, 2, 3, 4,
- 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7,
- 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 0, 0, 0, 22, 0, 23, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, 37, 38, 39, 16, 34, 34, 34, 35, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 66, 16, 50, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68,101, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 71, 68, 68, 68, 68, 68, 68, 68,152,186, 76, 77, 68,254, 16, 50,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 5, 6,
- 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 10, 0,
- 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 3, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6, 0, 7, 0, 0, 8, 0, 0, 0, 9, 0, 0,
+ 10, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 0, 0,
+ 22, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 33,
+ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0,
+ 0, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,101, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,152,
+ 186, 12, 13, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4,
+ 5, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,
+ 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0,
+ 0, 0, 13, 0, 0, 0, 0, 0, 14, 0, 0, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 1, 24, 25, 26, 27, 28, 1, 1, 29, 30, 31, 32,
+ 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 0, 0, 0, 0, 0, 0,
+ 0, 39, 0, 0, 40, 41, 42, 0, 43, 44, 0, 0, 45, 46, 0, 47,
+ 48, 49, 0, 0, 0, 0, 50, 0, 0, 51, 52, 0, 53, 54, 55, 56,
+ 57, 58, 0, 0, 0, 0, 0, 59, 60, 61, 62, 63, 64, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 13, 0, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 23, 23, 29, 30, 31, 32, 33, 0, 0, 0, 0,
- 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 36, 37, 38, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 40,
- 41, 42, 0, 43, 44, 0, 0, 45, 46, 0, 47, 48, 49, 0, 0, 0,
- 0, 50, 0, 0, 51, 52, 0, 53, 54, 55, 56, 57, 58, 0, 0, 0,
- 0, 0, 59, 60, 61, 62, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 66,
- 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 0, 65, 0, 0, 66, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ 95, 96, 97, 98, 99,
};
-static const uint16_t
-_hb_arabic_u16[720] =
+static const uint16_t _hb_arabic_pua_u16[717]=
{
0, 0, 0, 0, 0, 0, 0, 0,61728,61729,61730, 0, 0,61733, 0, 0,
61736,61737,61738,61739,61790,61741,61742,61743,61872,61873,61874,61875,61876,61877,61878,61879,
@@ -65,52 +67,46 @@
61808,61813,61813,61811,61812,61816,61816,61814,61815,61818,61818,61817,61817,61820,61820,61819,
61819,61822,61822,61821,61821,61921,61921,61823,61823,61860,61859,61857,61858,61861,61861,61868,
61867,61864,61863,61862,61862,61888,61889,61886,61887,61890,61891,61885,61884, 0, 0, 0,
- 0, 0, 0, 0,61984,61985,61986, 0, 0,61989, 0, 0,61992,61993,61994,61995,
- 62046,61997,61998,61999, 0, 0,62010,62011, 0,62013, 0,62015, 0, 0, 0,62043,
- 0,62045, 0, 0, 0, 0, 0,61987, 0, 0, 0,61988, 0, 0, 0,61990,
- 0, 0, 0,61991,61996, 0, 0, 0, 0, 0, 0,62011, 0, 0, 0,62015,
- 0,62165,62021,62019,62170,62023,62169,62017,62028,62161,62032,62036,62040,62048,62052,62053,
- 62055,62057,62059,62064,62068,62072,62078,62114,62115,62122,62126,61952,61952,61952,61952,61952,
- 62047,62130,62134,62138,62142,62146,62150,62154,62155,62164,62160,62183,62184,62187,62180,62181,
- 62186,62185,62182,61952,61952,61952,61952, 0,62000,62001,62002,62003,62004,62005,62006,62007,
- 62008,62009, 0,62046,62046, 0, 0, 0,61964,61965,61966,61967,62012,62014, 0, 0,
- 61954, 0,61981, 0, 0, 0,61955, 0,61982, 0,61956, 0, 0, 0,62111, 0,
- 0, 0, 0,61970,61971,61972,61957, 0,61980, 0, 0, 0, 0, 0,61958, 0,
- 61983, 0, 0, 0, 0, 0,62191, 0,62188,62189,62192, 0, 0, 0,61973, 0,
- 0,62098, 0, 0,61974, 0, 0,62099, 0, 0,62101, 0, 0,61975, 0, 0,
- 62100, 0, 0, 0,62080,62081,62082,62102, 0,62083,62084,62085,62103, 0, 0, 0,
- 62106, 0,62107, 0,62108, 0, 0, 0,61976, 0, 0, 0, 0,62086,62087,62088,
- 62109,61978,62089,62090,62091,62110,62093,62094, 0,62104, 0, 0, 0, 0,62095,62096,
- 62097,62105, 0, 0,61977, 0, 0, 0, 0, 0,62075,62077,61968, 0, 0, 0,
- 0,62021,62022,62019,62020,62170,62171,62023,62024,62169,62168,62166,62167,62017,62018,62028,
- 62027,62025,62026,62161,62162,62032,62031,62029,62030,62036,62035,62033,62034,62040,62039,62037,
- 62038,62048,62044,62041,62042,62052,62051,62049,62050,62053,62054,62055,62056,62057,62058,62059,
- 62060,62064,62063,62061,62062,62068,62067,62065,62066,62072,62071,62069,62070,62078,62076,62073,
- 62074,62114,62113,62079,62193,62118,62117,62115,62116,62122,62121,62119,62120,62126,62125,62123,
- 62124,62130,62129,62127,62128,62134,62133,62131,62132,62138,62137,62135,62136,62142,62141,62139,
- 62140,62146,62145,62143,62144,62150,62149,62147,62148,62154,62153,62151,62152,62155,62156,62164,
- 62163,62160,62159,62157,62158,62176,62177,62174,62175,62178,62179,62172,62173, 0, 0, 0,
+ 0,61952,61952,61952,61952,61984,61985,61986, 0, 0,61989, 0, 0,61992,61993,61994,
+ 61995,62046,61997,61998,61999, 0, 0,62010,62011, 0,62013, 0,62015, 0, 0, 0,
+ 62043, 0,62045, 0, 0, 0, 0, 0,61987, 0, 0, 0,61988, 0, 0, 0,
+ 61990, 0, 0, 0,61991,61996, 0, 0, 0, 0, 0, 0,62011, 0, 0, 0,
+ 62015, 0,62165,62021,62019,62170,62023,62169,62017,62028,62161,62032,62036,62040,62048,62052,
+ 62053,62055,62057,62059,62064,62068,62072,62078,62114,62115,62122,62126,61952,62047,62130,62134,
+ 62138,62142,62146,62150,62154,62155,62164,62160,62183,62184,62187,62180,62181,62186,62185,62182,
+ 61952,61952,61952,61952, 0,62000,62001,62002,62003,62004,62005,62006,62007,62008,62009, 0,
+ 62046,62046, 0, 0, 0,61964,61965,61966,61967,62012,62014, 0, 0,61954, 0,61981,
+ 0, 0, 0,61955, 0,61982, 0,61956, 0, 0, 0,62111, 0, 0, 0, 0,
+ 61970,61971,61972,61957, 0,61980, 0, 0, 0, 0, 0,61958, 0,61983, 0, 0,
+ 0, 0, 0,62191, 0,62188,62189,62192, 0, 0, 0,61973, 0, 0,62098, 0,
+ 0,61974, 0, 0,62099, 0, 0,62101, 0, 0,61975, 0, 0,62100, 0, 0,
+ 0,62080,62081,62082,62102, 0,62083,62084,62085,62103, 0, 0, 0,62106, 0,62107,
+ 0,62108, 0, 0, 0,61976, 0, 0, 0, 0,62086,62087,62088,62109,61978,62089,
+ 62090,62091,62110,62093,62094, 0,62104, 0, 0, 0, 0,62095,62096,62097,62105, 0,
+ 0,61977, 0, 0, 0, 0, 0,62075,62077,61968, 0, 0, 0, 0,62021,62022,
+ 62019,62020,62170,62171,62023,62024,62169,62168,62166,62167,62017,62018,62028,62027,62025,62026,
+ 62161,62162,62032,62031,62029,62030,62036,62035,62033,62034,62040,62039,62037,62038,62048,62044,
+ 62041,62042,62052,62051,62049,62050,62053,62054,62055,62056,62057,62058,62059,62060,62064,62063,
+ 62061,62062,62068,62067,62065,62066,62072,62071,62069,62070,62078,62076,62073,62074,62114,62113,
+ 62079,62193,62118,62117,62115,62116,62122,62121,62119,62120,62126,62125,62123,62124,62130,62129,
+ 62127,62128,62134,62133,62131,62132,62138,62137,62135,62136,62142,62141,62139,62140,62146,62145,
+ 62143,62144,62150,62149,62147,62148,62154,62153,62151,62152,62155,62156,62164,62163,62160,62159,
+ 62157,62158,62176,62177,62174,62175,62178,62179,62172,62173, 0, 0, 0,
};
-static inline unsigned
-_hb_arabic_b2 (const uint8_t* a, unsigned i)
-{
- return (a[i>>2]>>((i&3u)<<1))&3u;
-}
-static inline unsigned
-_hb_arabic_b4 (const uint8_t* a, unsigned i)
+static inline uint8_t _hb_arabic_pua_b4 (const uint8_t* a, unsigned i)
{
- return (a[i>>1]>>((i&1u)<<2))&15u;
+ return (a[i>>1]>>((i&1)<<2))&15;
}
-static inline uint_fast16_t
-_hb_arabic_pua_simp_map (unsigned u)
+static inline uint16_t _hb_arabic_pua_simp_map (unsigned u)
{
- return u<65277u?_hb_arabic_u16[((_hb_arabic_u8[40+(((_hb_arabic_b4(8+_hb_arabic_u8,((_hb_arabic_b2(_hb_arabic_u8,u>>3>>4>>4))<<4)+((u>>3>>4)&15u)))<<4)+((u>>3)&15u))])<<3)+((u)&7u)]:0;
+ /* packtab: [2^2,2^4,2^4,2^3] */
+ return u<65277u ? (uint16_t)(_hb_arabic_pua_u16[((_hb_arabic_pua_u8[31u+((_hb_arabic_pua_b4(_hb_arabic_pua_u8,((((13835058055282164225ULL>>((((((((u)>>3))>>4))>>4))<<1))&3))<<4)+((((((u)>>3))>>4))&15)))<<4)+((((u)>>3))&15)])<<3)+((u)&7)]) : 0;
}
-static inline uint_fast16_t
-_hb_arabic_pua_trad_map (unsigned u)
+static inline uint16_t _hb_arabic_pua_trad_map (unsigned u)
{
- return u<65277u?_hb_arabic_u16[320+(((_hb_arabic_u8[208+(((_hb_arabic_b4(168+_hb_arabic_u8,((_hb_arabic_b4(136+_hb_arabic_u8,u>>2>>4>>4))<<4)+((u>>2>>4)&15u)))<<4)+((u>>2)&15u))])<<2)+((u)&3u))]:0;
+ /* packtab: [2^4,2^4,2^4,2^2] */
+ return u<65277u ? (uint16_t)(_hb_arabic_pua_u16[317u+((_hb_arabic_pua_u8[197u+((_hb_arabic_pua_b4(_hb_arabic_pua_u8+159u,((_hb_arabic_pua_b4(_hb_arabic_pua_u8+127u,((((((u)>>2))>>4))>>4)))<<4)+((((((u)>>2))>>4))&15)))<<4)+((((u)>>2))&15)])<<2)+((u)&3)]) : 0;
}
#endif /* HB_OT_SHAPER_ARABIC_PUA_HH */
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -16,222 +16,77 @@
#ifndef HB_OT_SHAPER_ARABIC_TABLE_HH
#define HB_OT_SHAPER_ARABIC_TABLE_HH
+#include "hb.hh"
-#define A JOINING_GROUP_ALAPH
-#define DR JOINING_GROUP_DALATH_RISH
-#define C JOINING_TYPE_C
-#define D JOINING_TYPE_D
-#define L JOINING_TYPE_L
-#define R JOINING_TYPE_R
-#define T JOINING_TYPE_T
-#define U JOINING_TYPE_U
-#define X JOINING_TYPE_X
+#include
-static const uint8_t joining_table[] =
+static const uint8_t _hb_arabic_joining_u8[737]=
{
+ 0, 16, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 96,135, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+ 0, 0, 0, 8, 16, 24, 32, 40, 48, 0, 56, 0, 64, 72, 80, 0,
+ 0, 0, 0, 88, 96,104, 0, 0, 0, 0, 0,112,120, 0, 0, 0,
+ 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 0,
+ 0,144, 0, 0, 0, 0, 0,152, 0, 0, 0, 0, 0, 0,160,168,
+ 176,184,192, 0, 0,200,208, 0, 0, 0, 0, 0, 0, 0, 0,216,
+ 224, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 10, 11, 12,
+ 1, 1, 13, 0, 0, 0, 14, 15, 1, 1, 2, 2, 4, 1, 1, 1,
+ 1, 16, 17, 18, 3, 0, 19, 0, 20, 0, 21, 22, 23, 1, 24, 0,
+ 0, 0, 25, 1, 26, 1, 27, 28, 4, 0, 29, 1, 1, 1, 30, 0,
+ 31, 32, 5, 33, 34, 35, 36, 2, 2, 37, 38, 6, 0, 1, 39, 40,
+ 5, 1, 7, 0, 0, 41, 0, 0, 0, 42, 43, 0, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 7, 44, 1, 1, 1, 1, 45, 0,
+ 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, 6, 0,
+ 0, 1, 1, 1, 1, 1, 1, 49, 0, 50, 51, 52, 53, 54, 55, 0,
+ 0, 56, 57, 58, 0, 0, 59, 0, 0, 60, 1, 1, 1, 61, 0, 0,
+ 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 1, 64, 0, 65, 0, 0, 0, 66, 1, 67, 0, 0, 0, 0, 0, 68,
+ 69, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 72, 73, 0, 0, 0, 0, 0, 0,119,119,119,119, 51, 51, 51,
+ 51, 34, 34, 34, 34,119,119, 7,119, 34, 51, 51, 51, 35, 51, 51,
+ 51, 0,119,119,119,115,119,119,119, 0, 0, 0,119,112, 7,119,
+ 119, 3, 34, 34, 35, 35, 51, 51, 35, 34, 50, 51, 51, 50,115,119,
+ 119,119,119,119, 51, 39, 34, 32, 34, 50, 35, 34, 34, 34, 34, 35,
+ 35, 51, 34, 39,119,119,119,119, 34,119, 51,115, 55,119,119,119,
+ 103,116, 51, 83, 37, 34, 51, 51, 50, 50, 53, 50, 83,119,119, 39,
+ 51, 35, 34, 51, 51, 51, 35, 50, 51, 35, 35, 50, 51,119, 51, 51,
+ 51, 51,115,119,119,119,115,119,119, 50, 51, 51, 34, 51, 51, 50,
+ 34,114,119,119,119, 3, 51, 51, 32, 35,114,119,119, 34, 50, 51,
+ 3, 48, 51, 51, 50, 51, 34, 2, 50, 35, 50, 51, 51,119,112,119,
+ 119,119,119,119, 48,119,115,119,112, 0, 0, 96, 54,115,115,119,
+ 119,119,119, 48,119,119,119,119, 7,119,119,119, 0, 51, 1,119,
+ 119, 51, 51, 35, 32, 32, 2, 16, 34, 34, 50, 51, 19, 51, 51, 35,
+ 51, 35, 0,114,119,119, 55, 51, 35, 35, 35, 34, 51, 35, 51, 50,
+ 34, 35,119,119,119, 39, 34, 50, 3, 49, 51, 51, 51, 51, 50,119,
+ 119,119, 50,115, 51, 51, 35, 51, 51, 51, 51, 3,119, 55, 51,114,
+ 119, 51, 51, 34, 51, 51,119,119,119, 3, 51, 34, 2, 35, 50, 35,
+ 51, 48, 34, 3, 0, 32, 19,119,119, 51, 51,119,119,119,103,119,
+ 119,
+};
-#define joining_offset_0x0600u 0
-
- /* Arabic */
-
- /* 0600 */ U,U,U,U,U,U,X,X,U,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 0620 */ D,U,R,R,R,R,D,R,D,R,D,D,D,D,D,R,R,R,R,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 0640 */ C,D,D,D,D,D,D,D,R,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 0660 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,D,D,X,R,R,R,U,R,R,R,D,D,D,D,D,D,D,D,
- /* 0680 */ D,D,D,D,D,D,D,D,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,D,D,D,D,D,D,
- /* 06A0 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 06C0 */ R,D,D,R,R,R,R,R,R,R,R,R,D,R,D,R,D,D,R,R,X,R,X,X,X,X,X,X,X,U,X,X,
- /* 06E0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,R,R,X,X,X,X,X,X,X,X,X,X,D,D,D,X,X,D,
-
- /* Syriac */
-
- /* 0700 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,T,A,X,D,D,D,DR,DR,R,R,R,D,D,D,D,R,D,
- /* 0720 */ D,D,D,D,D,D,D,D,R,D,DR,D,R,D,D,DR,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 0740 */ X,X,X,X,X,X,X,X,X,X,X,X,X,R,D,D,
-
- /* Arabic Supplement */
-
- /* 0740 */ D,D,D,D,D,D,D,D,D,R,R,R,D,D,D,D,
- /* 0760 */ D,D,D,D,D,D,D,D,D,D,D,R,R,D,D,D,D,R,D,R,R,D,D,D,R,R,D,D,D,D,D,D,
-
- /* FILLER */
-
- /* 0780 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 07A0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-
- /* NKo */
-
- /* 07C0 */ X,X,X,X,X,X,X,X,X,X,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 07E0 */ D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,C,X,X,X,X,X,
-
- /* FILLER */
-
- /* 0800 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 0820 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-
- /* Mandaic */
-
- /* 0840 */ R,D,D,D,D,D,R,R,D,R,D,D,D,D,D,D,D,D,D,D,R,D,R,R,R,X,X,X,X,X,X,X,
-
- /* Syriac Supplement */
-
- /* 0860 */ D,U,D,D,D,D,U,R,D,R,R,X,X,X,X,X,
-
- /* Arabic Extended-B */
-
- /* 0860 */ R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,
- /* 0880 */ R,R,R,C,C,C,D,U,U,D,D,D,D,D,R,D,U,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-
- /* Arabic Extended-A */
-
- /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,D,D,D,D,R,D,D,D,D,D,D,
- /* 08C0 */ D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 08E0 */ X,X,U,
-
-#define joining_offset_0x1806u 739
-
- /* Mongolian */
-
- /* 1800 */ U,D,X,X,C,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 1820 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 1840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,
- /* 1880 */ U,U,U,U,U,T,T,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 18A0 */ D,D,D,D,D,D,D,D,D,X,D,
-
-#define joining_offset_0x200cu 904
-
- /* General Punctuation */
-
- /* 2000 */ U,C,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 2020 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 2040 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 2060 */ X,X,X,X,X,X,U,U,U,U,
-
-#define joining_offset_0xa840u 998
-
- /* Phags-pa */
-
- /* A840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* A860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,L,U,
-
-#define joining_offset_0x10ac0u 1050
-
- /* Manichaean */
-
- /* 10AC0 */ D,D,D,D,D,R,U,R,U,R,R,U,U,L,R,R,R,R,R,D,D,D,D,L,D,D,D,D,D,R,D,D,
- /* 10AE0 */ D,R,U,U,R,X,X,X,X,X,X,D,D,D,D,R,
-
-#define joining_offset_0x10b80u 1098
-
- /* Psalter Pahlavi */
-
- /* 10B80 */ D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 10BA0 */ X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U,
-
-#define joining_offset_0x10d00u 1146
-
- /* Hanifi Rohingya */
-
- /* 10D00 */ L,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 10D20 */ D,D,R,D,
-
-#define joining_offset_0x10ec2u 1182
-
- /* Arabic Extended-C */
-
- /* 10EC0 */ R,D,D,X,D,D,
-
-#define joining_offset_0x10f30u 1188
-
- /* Sogdian */
-
- /* 10F20 */ D,D,D,R,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 10F40 */ D,D,D,D,D,U,X,X,X,X,X,X,X,X,X,X,X,D,D,D,R,X,X,X,X,X,X,X,X,X,X,X,
- /* 10F60 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-
- /* Old Uyghur */
-
- /* 10F60 */ D,D,D,D,R,R,D,D,D,D,D,D,D,D,D,D,
- /* 10F80 */ D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
- /* 10FA0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
-
- /* Chorasmian */
-
- /* 10FA0 */ D,U,D,D,R,R,R,U,D,R,R,D,D,R,D,D,
- /* 10FC0 */ U,D,R,R,D,U,U,U,U,R,D,L,
-
-#define joining_offset_0x110bdu 1344
-
- /* Kaithi */
-
- /* 110A0 */ U,X,X,
- /* 110C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,U,
-
-#define joining_offset_0x1e900u 1361
-
- /* Adlam */
-
- /* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
- /* 1E940 */ D,D,D,D,X,X,X,X,X,X,X,T,
-
-}; /* Table items: 1437; occupancy: 58% */
-
+static inline uint8_t _hb_arabic_joining_b4 (const uint8_t* a, unsigned i)
+{
+ return (a[i>>1]>>((i&1)<<2))&15;
+}
+static inline uint8_t _hb_arabic_joining_joining_type (unsigned u)
+{
+ /* packtab: [2^4,2^3,2^3,2^3] */
+ return u<125260u ? (uint8_t)(_hb_arabic_joining_b4(_hb_arabic_joining_u8+441u,((_hb_arabic_joining_u8[209u+_hb_arabic_joining_u8[123u+((_hb_arabic_joining_b4(_hb_arabic_joining_u8,((((((u)>>3))>>3))>>3)))<<3)+((((((u)>>3))>>3))&7)]+((((u)>>3))&7)])<<3)+((u)&7))) : 7;
+}
static unsigned int
joining_type (hb_codepoint_t u)
{
- switch (u >> 12)
- {
- case 0x0u:
- if (hb_in_range (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
- break;
-
- case 0x1u:
- if (hb_in_range (u, 0x1806u, 0x18AAu)) return joining_table[u - 0x1806u + joining_offset_0x1806u];
- break;
-
- case 0x2u:
- if (hb_in_range (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
- break;
-
- case 0xAu:
- if (hb_in_range (u, 0xA840u, 0xA873u)) return joining_table[u - 0xA840u + joining_offset_0xa840u];
- break;
-
- case 0x10u:
- if (hb_in_range (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
- if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
- if (hb_in_range (u, 0x10D00u, 0x10D23u)) return joining_table[u - 0x10D00u + joining_offset_0x10d00u];
- if (hb_in_range (u, 0x10EC2u, 0x10EC7u)) return joining_table[u - 0x10EC2u + joining_offset_0x10ec2u];
- if (hb_in_range (u, 0x10F30u, 0x10FCBu)) return joining_table[u - 0x10F30u + joining_offset_0x10f30u];
- break;
-
- case 0x11u:
- if (hb_in_range (u, 0x110BDu, 0x110CDu)) return joining_table[u - 0x110BDu + joining_offset_0x110bdu];
- break;
-
- case 0x1Eu:
- if (hb_in_range (u, 0x1E900u, 0x1E94Bu)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
- break;
-
- default:
- break;
- }
- return X;
+ return _hb_arabic_joining_joining_type (u);
}
-#undef A
-#undef DR
-#undef C
-#undef D
-#undef L
-#undef R
-#undef T
-#undef U
-#undef X
-
static const uint16_t shaping_table[][4] =
{
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc 2026-07-13 06:55:55.000000000 +0000
@@ -77,8 +77,8 @@
JOINING_GROUP_DALATH_RISH = 5,
NUM_STATE_MACHINE_COLS = 6,
- JOINING_TYPE_T = 7,
- JOINING_TYPE_X = 8 /* means: use general-category to choose between U or T. */
+ JOINING_TYPE_T = 6,
+ JOINING_TYPE_X = 7 /* means: use general-category to choose between U or T. */
};
#include "hb-ot-shaper-arabic-table.hh"
@@ -561,20 +561,29 @@
DEBUG_MSG (ARABIC, nullptr, "fixed tiles: count=%d width=%" PRId32, n_fixed, w_fixed);
DEBUG_MSG (ARABIC, nullptr, "repeating tiles: count=%d width=%" PRId32, n_repeating, w_repeating);
+ static constexpr unsigned STCH_MAX_GLYPHS = 256;
+
/* Number of additional times to repeat each repeating tile. */
- int n_copies = 0;
+ unsigned int n_copies = 0;
- hb_position_t w_remaining = w_total - w_fixed;
- if (sign * w_remaining > sign * w_repeating && sign * w_repeating > 0)
- n_copies = (sign * w_remaining) / (sign * w_repeating) - 1;
+ int64_t w_remaining_signed = (int64_t) w_total - w_fixed;
+ int64_t w_repeating_signed = w_repeating;
+ if (sign < 0)
+ {
+ w_remaining_signed = -w_remaining_signed;
+ w_repeating_signed = -w_repeating_signed;
+ }
+ hb_position_t w_remaining = (hb_position_t) (w_total - w_fixed);
+ if (w_remaining_signed > w_repeating_signed && w_repeating_signed > 0)
+ n_copies = w_remaining_signed / w_repeating_signed - 1;
/* See if we can improve the fit by adding an extra repeat and squeezing them together a bit. */
hb_position_t extra_repeat_overlap = 0;
- hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1);
+ int64_t shortfall = w_remaining_signed - w_repeating_signed * (n_copies + 1);
if (shortfall > 0 && n_repeating > 0)
{
++n_copies;
- hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
+ int64_t excess = (n_copies + 1) * w_repeating_signed - w_remaining_signed;
if (excess > 0)
{
extra_repeat_overlap = excess / (n_copies * n_repeating);
@@ -582,10 +591,25 @@
}
}
+ unsigned int max_copies = 0;
+ if (n_repeating > 0)
+ {
+ unsigned int base_glyphs = n_fixed + n_repeating;
+ if (base_glyphs < STCH_MAX_GLYPHS)
+ max_copies = (STCH_MAX_GLYPHS - base_glyphs) / n_repeating;
+ }
+ n_copies = hb_min (n_copies, max_copies);
+
if (step == MEASURE)
{
- extra_glyphs_needed += n_copies * n_repeating;
- DEBUG_MSG (ARABIC, nullptr, "will add extra %d copies of repeating tiles", n_copies);
+ unsigned int added_glyphs = 0;
+ if (unlikely (hb_unsigned_mul_overflows (n_copies, n_repeating, &added_glyphs) ||
+ hb_unsigned_add_overflows (extra_glyphs_needed, added_glyphs, &extra_glyphs_needed)))
+ {
+ extra_glyphs_needed = UINT_MAX;
+ break;
+ }
+ DEBUG_MSG (ARABIC, nullptr, "will add extra %u copies of repeating tiles", n_copies);
}
else
{
@@ -629,7 +653,9 @@
if (step == MEASURE)
{
- if (unlikely (!buffer->ensure (count + extra_glyphs_needed)))
+ unsigned int total_glyphs = 0;
+ if (unlikely (hb_unsigned_add_overflows (count, extra_glyphs_needed, &total_glyphs) ||
+ !buffer->ensure (total_glyphs)))
break;
}
else
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc 2026-07-13 06:55:55.000000000 +0000
@@ -298,7 +298,7 @@
end = start + 2;
if (unlikely (!buffer->successful))
break;
- buffer->merge_out_clusters (start, end);
+ buffer->merge_out_grapheme_clusters (start, end);
continue;
}
}
@@ -371,7 +371,7 @@
if (i < end)
info[i++].hangul_shaping_feature() = TJMO;
- buffer->merge_out_clusters (start, end);
+ buffer->merge_out_grapheme_clusters (start, end);
continue;
}
else if ((!tindex && buffer->idx + 1 < count && isT (buffer->cur(+1).codepoint)))
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc 2026-07-13 06:55:55.000000000 +0000
@@ -77,9 +77,9 @@
#define _OT_A OT_A /* 53 chars; A */
#define _OT_As OT_As /* 1 chars; As */
-#define _OT_C OT_C /* 478 chars; C */
+#define _OT_C OT_C /* 476 chars; C */
#define _OT_CM OT_CM /* 1 chars; CM */
-#define _OT_CS OT_CS /* 2 chars; CS */
+#define _OT_CS OT_CS /* 4 chars; CS */
#define _OT_DC OT_DOTTEDCIRCLE /* 1 chars; DOTTEDCIRCLE */
#define _OT_H OT_H /* 11 chars; H */
#define _OT_M OT_M /* 142 chars; M */
@@ -130,392 +130,112 @@
#define _(S,M) INDIC_COMBINE_CATEGORIES (_OT_##S, _POS_##M)
-static const uint16_t indic_table[] = {
+#include
+static const uint16_t _hb_indic_values[42]=
+{
+ _(A,SM), _(As,X), _(C,C), _(CM,C), _(CS,C), _(DC,C), _(GB,C), _(H,B),
+ _(H,T), _(H,X), _(M,A), _(M,AP), _(M,AS), _(M,B), _(M,BS), _(M,LM),
+ _(MH,X), _(ML,X), _(MP,AP), _(MR,X), _(MW,X), _(MY,X), _(N,X), _(PT,X),
+ _(R,C), _(Rf,X), _(Rt,X), _(S,SM), _(SM,BS), _(SM,SM), _(SP,SM), _(V,C),
+ _(VA,T), _(VB,B), _(VL,L), _(VR,R), _(VS,X), _(X,X), _(Xg,X), _(Yg,X),
+ _(ZWJ,X),_(ZWNJ,X),
+};
+static const uint8_t _hb_indic_u8[1220]=
+{
+ 1, 0, 50, 4, 5, 96, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,
+ 0, 0, 0, 0,208,224, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 0, 22, 23,
+ 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 0, 0,
+ 0, 27, 0, 0, 0, 0, 28, 29, 30, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 33, 0, 34,
+ 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 36, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 25, 2, 10, 0, 0, 0, 0, 26, 0,
+ 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 29, 11, 30, 1, 1, 1,
+ 4, 31, 32, 33, 34, 1, 6, 2, 35, 1, 12, 13, 7, 1, 1, 3,
+ 36, 14, 15, 37, 16, 17, 6, 2, 38, 39, 18, 40, 7, 1, 1, 3,
+ 41, 42, 43, 44, 45, 46, 19, 2, 47, 0, 18, 48, 49, 1, 1, 3,
+ 20, 14, 50, 51, 0, 0, 21, 2, 0, 52, 53, 13, 7, 1, 1, 3,
+ 20, 54, 15, 55, 56, 17, 6, 2, 57, 0, 58, 59, 60, 61, 62, 63,
+ 4, 64, 65, 66, 16, 0, 19, 2, 0, 0, 67, 8, 9, 1, 1, 3,
+ 4, 22, 68, 69, 70, 71, 23, 2, 0, 0, 12, 8, 9, 1, 1, 3,
+ 72, 22, 73, 74, 75, 76, 23, 2, 77, 0, 78, 8, 9, 1, 1, 1,
+ 4, 79, 80, 81, 82, 83, 21, 2, 0, 84, 85, 1, 1, 86, 87, 88,
+ 89, 90, 2, 91, 92, 93, 94, 95, 96, 1, 97, 98, 2, 99, 0, 0,
+ 0, 0, 1, 1, 1,100,101, 11,102,103,104,105,106,107, 2, 10,
+ 0, 0, 0, 0,108, 5, 5,109,110,111, 0,112,113, 0,114, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,115, 0,116, 0, 0, 0, 0, 0,
+ 0, 0, 0,117, 0, 0, 0, 0, 0,118, 0, 0, 0, 0, 5, 5,
+ 119,120, 0, 0, 0, 0,121, 1, 2,122, 0, 0, 0, 0, 1, 1,
+ 123,124, 24, 24, 0, 0, 0, 0, 0, 0,125, 0, 0, 0, 0, 0,
+ 0,126, 0, 0, 2, 2, 2, 10, 0, 0, 0, 0, 2, 2, 2, 2,
+ 4, 4, 4, 4, 10, 2, 2, 2, 26, 2, 2, 2, 8, 8, 8, 8,
+ 6, 18, 0, 4, 20, 14, 24, 2, 6, 6, 20, 6, 20, 6, 24, 2,
+ 4, 0, 0, 0, 6, 6, 6, 6, 66, 12, 14, 6, 6, 6, 20, 14,
+ 2, 0, 36, 50, 52, 18, 38, 68, 0, 0, 0, 32, 0, 0, 2, 16,
+ 56, 12, 14, 6, 0, 0, 0, 4, 44, 2, 16, 2, 6, 22, 0, 4,
+ 2, 0, 36, 28, 6, 28, 0, 4, 30, 30, 30, 30, 0, 0, 42, 0,
+ 34, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 42, 12, 12, 6, 6,
+ 6, 6, 24, 2, 2, 18, 36,112, 18, 18, 18, 18, 18, 18,114,116,
+ 118,120,122, 18, 0, 6, 6, 6, 44, 10, 0, 2, 54, 32, 46, 10,
+ 26, 0, 0, 0, 0, 0, 34, 70, 6, 20, 0, 14, 44, 2, 16, 10,
+ 2, 0, 72, 50,124, 48, 0, 32, 48, 32, 46, 0,126, 0, 0, 0,
+ 16, 2, 10, 10, 12, 2,128, 0, 6, 6, 6, 14, 6, 14, 24, 2,
+ 22, 22, 52, 74, 76, 32, 46, 0, 16, 58, 58, 78,130, 12, 14, 6,
+ 2, 0, 36,132,134, 32, 46, 0, 0, 0, 80,136, 16, 0, 0, 0,
+ 0, 70, 14, 6, 6, 20, 0, 6, 20, 6, 24, 0, 16, 10, 10, 2,
+ 0, 16, 10, 0, 2, 10, 0, 2, 2, 0, 0, 22, 76, 48, 0, 82,
+ 54, 22, 84, 0, 12, 12,138, 6, 28, 60, 38, 28, 86, 28, 88, 0,
+ 0, 0,140, 86, 2, 10, 16, 0, 26, 2, 16, 2, 28, 60, 38, 60,
+ 38, 18, 88, 0, 0, 0, 74, 38, 0, 0, 16, 10,142,144, 0, 0,
+ 12, 12,146, 6, 2,148,150, 22, 22, 22, 48, 82, 54, 22, 84,152,
+ 0, 0, 2,154, 0, 0, 0, 14, 0, 2, 2, 2, 2, 2, 26, 2,
+ 2,156, 2, 2, 90, 6, 6, 6, 6,158, 92, 94,160,162, 62, 58,
+ 164,166,168,170, 4, 4, 0, 10, 2, 6, 6, 96, 98, 26, 2,172,
+ 174,100,176,178,100,102,102, 2,104, 62,180, 2, 2,182,184,186,
+ 12, 12, 12,188, 4, 12,190, 0, 2, 26, 2, 2, 2, 90, 6, 6,
+ 6, 6, 0, 92, 62, 94, 98,192,194,196, 96,198,200,106,106,108,
+ 108,202, 0, 0, 42, 0,204, 0, 8,206, 8, 8,208, 40,210, 40,
+ 40, 2,212,214, 8, 34, 0, 0, 0, 0,216, 0, 4, 4, 4, 0,
+ 0, 34, 0, 0, 0, 0,110, 0, 0, 64,110, 0, 0, 0,218, 0,
+ 0, 42, 4, 34, 8, 40, 40, 40, 0, 0, 0,220, 2, 2,104, 16,
+ 4, 2, 2, 10, 16, 2, 4, 34, 0,222, 78, 2, 56, 12, 0, 0,
+ 0, 80, 72, 0, 37, 37, 2, 2, 6, 6, 31, 31, 0, 0, 2, 37,
+ 29, 29, 37, 31, 37, 2, 12, 12, 31, 37, 11, 11, 31, 2, 24, 2,
+ 14, 14, 36, 36, 37, 11, 6, 37, 22, 27, 12, 37, 27, 27, 37, 6,
+ 24, 37, 11, 7, 11, 37, 11, 15, 11, 12, 15, 37, 37, 29, 0, 22,
+ 14, 12, 32, 32, 30, 30, 6, 29, 37, 15, 29, 37, 22, 37, 37, 12,
+ 12, 11, 22, 22, 37, 22, 15, 15, 11, 8, 14, 37, 14, 8, 2, 31,
+ 35, 32, 32, 33, 35, 35, 33, 33, 35, 23, 23, 23, 2, 32, 26, 38,
+ 38, 38, 30, 37, 12, 15, 12, 7, 15, 12, 37, 0, 0, 29, 29, 12,
+ 18, 11, 37, 13, 37, 3, 37, 28, 11, 10, 10, 37, 10, 11, 29, 31,
+ 37, 14, 37, 4, 4, 29, 6, 31, 2, 12, 12, 27, 25, 37, 2, 11,
+ 2, 24, 31, 35, 33, 34, 0, 32, 29, 9, 1, 21, 19, 20, 16, 2,
+ 21, 21, 17, 2, 23, 2, 2, 35, 32, 2, 20, 35, 34, 32, 32, 29,
+ 2, 29, 29, 32, 32, 35, 35, 34, 34, 34, 38, 39, 39, 26, 9, 39,
+ 27, 39, 0, 37, 0, 27, 27, 0, 0, 4, 4, 0, 41, 40, 5, 37,
+ 31, 12, 2, 23,
+};
-#define indic_offset_0x0028u 0
-
-
- /* Basic Latin */
-
- /* 0028 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(GB,C), _(X,X), _(X,X),
- /* 0030 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0038 */ _(GB,C), _(GB,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x00b0u 24
-
-
- /* Latin-1 Supplement */
-
- /* 00B0 */ _(X,X), _(X,X),_(SP,SM),_(SP,SM), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 00B8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 00C0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 00C8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 00D0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(GB,C),
-
-#define indic_offset_0x0900u 64
-
-
- /* Devanagari */
-
- /* 0900 */_(SM,SM),_(SM,SM),_(SM,SM),_(SM,SM), _(V,C), _(V,C), _(V,C), _(V,C),
- /* 0908 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C),
- /* 0910 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0918 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0920 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0928 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0930 */ _(R,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0938 */ _(C,C), _(C,C), _(M,AS), _(M,AS), _(N,X), _(S,SM), _(M,AS), _(M,LM),
- /* 0940 */ _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(M,AS),
- /* 0948 */ _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(H,B), _(M,LM), _(M,AS),
- /* 0950 */ _(X,X), _(A,SM), _(A,SM),_(SM,SM),_(SM,SM), _(M,AS), _(M,AS), _(M,AS),
- /* 0958 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0960 */ _(V,C), _(V,C), _(M,AS), _(M,AS), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0968 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0970 */ _(X,X), _(X,X), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C),
- /* 0978 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
-
- /* Bengali */
-
- /* 0980 */ _(GB,C),_(SM,SM),_(SM,SM),_(SM,SM), _(X,X), _(V,C), _(V,C), _(V,C),
- /* 0988 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(X,X), _(V,C),
- /* 0990 */ _(V,C), _(X,X), _(X,X), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0998 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 09A0 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 09A8 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 09B0 */ _(R,C), _(X,X), _(C,C), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C),
- /* 09B8 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(S,SM), _(M,AP), _(M,LM),
- /* 09C0 */ _(M,AP), _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(X,X), _(X,X), _(M,LM),
- /* 09C8 */ _(M,LM), _(X,X), _(X,X), _(M,AP), _(M,AP), _(H,B), _(C,C), _(X,X),
- /* 09D0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP),
- /* 09D8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C), _(X,X), _(C,C),
- /* 09E0 */ _(V,C), _(V,C), _(M,AS), _(M,AS), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 09E8 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 09F0 */ _(R,C), _(C,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 09F8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(GB,C), _(X,X),_(SM,SM), _(X,X),
-
- /* Gurmukhi */
-
- /* 0A00 */ _(X,X),_(SM,SM),_(SM,SM),_(SM,SM), _(X,X), _(V,C), _(V,C), _(V,C),
- /* 0A08 */ _(V,C), _(V,C), _(V,C), _(X,X), _(X,X), _(X,X), _(X,X), _(V,C),
- /* 0A10 */ _(V,C), _(X,X), _(X,X), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0A18 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0A20 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0A28 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0A30 */ _(R,C), _(X,X), _(C,C), _(C,C), _(X,X), _(C,C), _(C,C), _(X,X),
- /* 0A38 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(X,X), _(M,AP), _(M,LM),
- /* 0A40 */_(MP,AP), _(M,AP), _(M,AP), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP),
- /* 0A48 */ _(M,AP), _(X,X), _(X,X), _(M,AP), _(M,AP), _(H,B), _(X,X), _(X,X),
- /* 0A50 */ _(X,X), _(M,B), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0A58 */ _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(X,X), _(C,C), _(X,X),
- /* 0A60 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0A68 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0A70 */_(SM,SM),_(SM,SM), _(C,C), _(C,C), _(X,X), _(CM,C), _(X,X), _(X,X),
- /* 0A78 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
- /* Gujarati */
-
- /* 0A80 */ _(X,X),_(SM,SM),_(SM,SM),_(SM,SM), _(X,X), _(V,C), _(V,C), _(V,C),
- /* 0A88 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(V,C),
- /* 0A90 */ _(V,C), _(V,C), _(X,X), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0A98 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0AA0 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0AA8 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0AB0 */ _(R,C), _(X,X), _(C,C), _(C,C), _(X,X), _(C,C), _(C,C), _(C,C),
- /* 0AB8 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(S,SM), _(M,AP), _(M,LM),
- /* 0AC0 */ _(M,AP), _(M,AP), _(M,AP), _(M,AP), _(M,AP), _(M,AS), _(X,X), _(M,AS),
- /* 0AC8 */ _(M,AS), _(M,AP), _(X,X), _(M,AP), _(M,AP), _(H,B), _(X,X), _(X,X),
- /* 0AD0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0AD8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0AE0 */ _(V,C), _(V,C), _(M,AP), _(M,AP), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0AE8 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0AF0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0AF8 */ _(X,X), _(C,C), _(A,SM), _(N,X), _(A,SM), _(N,X), _(N,X), _(N,X),
-
- /* Oriya */
-
- /* 0B00 */ _(X,X),_(SM,BS),_(SM,SM),_(SM,SM), _(X,X), _(V,C), _(V,C), _(V,C),
- /* 0B08 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(X,X), _(V,C),
- /* 0B10 */ _(V,C), _(X,X), _(X,X), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0B18 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0B20 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0B28 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0B30 */ _(R,C), _(X,X), _(C,C), _(C,C), _(X,X), _(C,C), _(C,C), _(C,C),
- /* 0B38 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(S,SM), _(M,AP), _(M,A),
- /* 0B40 */ _(M,AP), _(M,AS), _(M,AS), _(M,AS), _(M,AS), _(X,X), _(X,X), _(M,LM),
- /* 0B48 */ _(M,A), _(X,X), _(X,X), _(M,AP), _(M,AP), _(H,B), _(X,X), _(X,X),
- /* 0B50 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(N,X), _(M,A), _(M,AP),
- /* 0B58 */ _(X,X), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C), _(X,X), _(C,C),
- /* 0B60 */ _(V,C), _(V,C), _(M,AS), _(M,AS), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0B68 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0B70 */ _(X,X), _(C,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0B78 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
- /* Tamil */
-
- /* 0B80 */ _(X,X), _(X,X),_(SM,SM), _(X,X), _(X,X), _(V,C), _(V,C), _(V,C),
- /* 0B88 */ _(V,C), _(V,C), _(V,C), _(X,X), _(X,X), _(X,X), _(V,C), _(V,C),
- /* 0B90 */ _(V,C), _(X,X), _(V,C), _(V,C), _(V,C), _(C,C), _(X,X), _(X,X),
- /* 0B98 */ _(X,X), _(C,C), _(C,C), _(X,X), _(C,C), _(X,X), _(C,C), _(C,C),
- /* 0BA0 */ _(X,X), _(X,X), _(X,X), _(C,C), _(C,C), _(X,X), _(X,X), _(X,X),
- /* 0BA8 */ _(C,C), _(C,C), _(C,C), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C),
- /* 0BB0 */ _(R,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0BB8 */ _(C,C), _(C,C), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP), _(M,AP),
- /* 0BC0 */ _(M,AS), _(M,AP), _(M,AP), _(X,X), _(X,X), _(X,X), _(M,LM), _(M,LM),
- /* 0BC8 */ _(M,LM), _(X,X), _(M,AP), _(M,AP), _(M,AP), _(H,T), _(X,X), _(X,X),
- /* 0BD0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP),
- /* 0BD8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0BE0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0BE8 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0BF0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0BF8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
- /* Telugu */
-
- /* 0C00 */_(SM,SM),_(SM,SM),_(SM,SM),_(SM,SM),_(SM,SM), _(V,C), _(V,C), _(V,C),
- /* 0C08 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(V,C), _(V,C),
- /* 0C10 */ _(V,C), _(X,X), _(V,C), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0C18 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0C20 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0C28 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0C30 */ _(R,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0C38 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(S,SM), _(M,BS), _(M,BS),
- /* 0C40 */ _(M,BS), _(M,BS), _(M,BS), _(M,AS), _(M,AS), _(X,X), _(M,BS), _(M,BS),
- /* 0C48 */ _(M,BS), _(X,X), _(M,BS), _(M,BS), _(M,BS), _(H,T), _(X,X), _(X,X),
- /* 0C50 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(M,BS), _(M,BS), _(X,X),
- /* 0C58 */ _(C,C), _(C,C), _(C,C), _(X,X), _(X,X), _(C,C), _(X,X), _(X,X),
- /* 0C60 */ _(V,C), _(V,C), _(M,BS), _(M,BS), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0C68 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0C70 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0C78 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
- /* Kannada */
-
- /* 0C80 */ _(GB,C),_(SM,SM),_(SM,SM),_(SM,SM), _(X,X), _(V,C), _(V,C), _(V,C),
- /* 0C88 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(V,C), _(V,C),
- /* 0C90 */ _(V,C), _(X,X), _(V,C), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0C98 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0CA0 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0CA8 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0CB0 */ _(R,C), _(C,C), _(C,C), _(C,C), _(X,X), _(C,C), _(C,C), _(C,C),
- /* 0CB8 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(S,SM), _(M,BS), _(M,BS),
- /* 0CC0 */ _(M,BS), _(M,BS), _(M,BS), _(M,AS), _(M,AS), _(X,X), _(M,BS), _(M,AS),
- /* 0CC8 */ _(M,AS), _(X,X), _(M,AS), _(M,AS), _(M,BS), _(H,T), _(X,X), _(X,X),
- /* 0CD0 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AS), _(M,AS), _(X,X),
- /* 0CD8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C), _(X,X),
- /* 0CE0 */ _(V,C), _(V,C), _(M,BS), _(M,BS), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0CE8 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0CF0 */ _(X,X), _(CS,C), _(CS,C),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0CF8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
- /* Malayalam */
-
- /* 0D00 */_(SM,SM),_(SM,SM),_(SM,SM),_(SM,SM), _(GB,C), _(V,C), _(V,C), _(V,C),
- /* 0D08 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(V,C), _(V,C),
- /* 0D10 */ _(V,C), _(X,X), _(V,C), _(V,C), _(V,C), _(C,C), _(C,C), _(C,C),
- /* 0D18 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0D20 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0D28 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0D30 */ _(R,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 0D38 */ _(C,C), _(C,C), _(C,C), _(M,AS), _(M,AS), _(S,SM), _(M,AP), _(M,AP),
- /* 0D40 */ _(M,AP), _(M,AP), _(M,AP), _(M,AP), _(M,AP), _(X,X), _(M,LM), _(M,LM),
- /* 0D48 */ _(M,LM), _(X,X), _(M,AP), _(M,AP), _(M,AP), _(H,T), _(Rf,X), _(X,X),
- /* 0D50 */ _(X,X), _(X,X), _(X,X), _(X,X), _(C,C), _(C,C), _(C,C), _(M,AP),
- /* 0D58 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(V,C),
- /* 0D60 */ _(V,C), _(V,C), _(M,AP), _(M,AP), _(X,X), _(X,X), _(GB,C), _(GB,C),
- /* 0D68 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 0D70 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 0D78 */ _(X,X), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
-
-#define indic_offset_0x1000u 1216
-
-
- /* Myanmar */
-
- /* 1000 */ _(C,C), _(C,C), _(C,C), _(C,C), _(R,C), _(C,C), _(C,C), _(C,C),
- /* 1008 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 1010 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 1018 */ _(C,C), _(C,C), _(C,C), _(R,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 1020 */ _(C,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C),
- /* 1028 */ _(V,C), _(V,C), _(V,C), _(VR,R), _(VR,R), _(VA,T), _(VA,T), _(VB,B),
- /* 1030 */ _(VB,B), _(VL,L), _(A,SM), _(VA,T), _(VA,T), _(VA,T), _(A,SM), _(N,X),
- /* 1038 */_(SM,SM), _(H,X), _(As,X), _(MY,X), _(MR,X), _(MW,X), _(MH,X), _(C,C),
- /* 1040 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 1048 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(X,X), _(X,X), _(C,C), _(X,X),
- /* 1050 */ _(C,C), _(C,C), _(V,C), _(V,C), _(V,C), _(V,C), _(VR,R), _(VR,R),
- /* 1058 */ _(VB,B), _(VB,B), _(R,C), _(C,C), _(C,C), _(C,C), _(MY,X), _(MY,X),
- /* 1060 */ _(ML,X), _(C,C), _(VR,R), _(PT,X), _(PT,X), _(C,C), _(C,C), _(VR,R),
- /* 1068 */ _(VR,R), _(PT,X), _(PT,X), _(PT,X), _(PT,X), _(PT,X), _(C,C), _(C,C),
- /* 1070 */ _(C,C), _(VA,T), _(VA,T), _(VA,T), _(VA,T), _(C,C), _(C,C), _(C,C),
- /* 1078 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 1080 */ _(C,C), _(C,C), _(MW,X), _(VR,R), _(VL,L), _(VA,T), _(VA,T),_(SM,SM),
- /* 1088 */_(SM,SM),_(SM,SM),_(SM,SM),_(SM,SM),_(SM,SM),_(SM,SM), _(C,C),_(SM,SM),
- /* 1090 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 1098 */ _(GB,C), _(GB,C),_(SM,SM),_(SM,SM),_(SM,SM), _(VA,T), _(X,X), _(X,X),
-
-#define indic_offset_0x1780u 1376
-
-
- /* Khmer */
-
- /* 1780 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 1788 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 1790 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 1798 */ _(C,C), _(C,C), _(R,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* 17A0 */ _(C,C), _(C,C), _(C,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C),
- /* 17A8 */ _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C), _(V,C),
- /* 17B0 */ _(V,C), _(V,C), _(V,C), _(V,C), _(X,X), _(X,X), _(VR,R), _(VA,T),
- /* 17B8 */ _(VA,T), _(VA,T), _(VA,T), _(VB,B), _(VB,B), _(VB,B), _(VA,T), _(VR,R),
- /* 17C0 */ _(VR,R), _(VL,L), _(VL,L), _(VL,L), _(VR,R), _(VR,R), _(Xg,X), _(Yg,X),
- /* 17C8 */ _(Yg,X), _(Rt,X), _(Rt,X), _(Xg,X), _(Rt,X), _(Xg,X), _(Xg,X), _(Xg,X),
- /* 17D0 */ _(Xg,X), _(Xg,X), _(H,X), _(Yg,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 17D8 */ _(X,X), _(GB,C), _(X,X), _(X,X), _(S,SM), _(Yg,X), _(X,X), _(X,X),
- /* 17E0 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 17E8 */ _(GB,C), _(GB,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x1cd0u 1488
-
-
- /* Vedic Extensions */
-
- /* 1CD0 */ _(A,SM), _(A,SM), _(A,SM), _(X,X), _(A,SM), _(A,SM), _(A,SM), _(A,SM),
- /* 1CD8 */ _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM),
- /* 1CE0 */ _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM),
- /* 1CE8 */ _(A,SM), _(S,SM), _(S,SM), _(S,SM), _(S,SM), _(A,SM), _(S,SM), _(S,SM),
- /* 1CF0 */ _(S,SM), _(S,SM), _(C,C), _(C,C), _(A,SM), _(C,C), _(C,C), _(A,SM),
- /* 1CF8 */ _(A,SM), _(A,SM), _(GB,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x2008u 1536
-
-
- /* General Punctuation */
-
- /* 2008 */ _(X,X), _(X,X), _(X,X), _(X,X),_(ZWNJ,X),_(ZWJ,X), _(X,X), _(X,X),
- /* 2010 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(X,X), _(X,X),
- /* 2018 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 2020 */ _(X,X), _(X,X), _(GB,C), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x2070u 1568
-
-
- /* Superscripts and Subscripts */
-
- /* 2070 */ _(X,X), _(X,X), _(X,X), _(X,X),_(SP,SM), _(X,X), _(X,X), _(X,X),
- /* 2078 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
- /* 2080 */ _(X,X), _(X,X),_(SP,SM),_(SP,SM),_(SP,SM), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x25f8u 1592
-
-
- /* Geometric Shapes */
-
- /* 25F8 */ _(X,X), _(X,X), _(X,X), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(X,X),
-
-#define indic_offset_0xa8e0u 1600
-
-
- /* Devanagari Extended */
-
- /* A8E0 */ _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM),
- /* A8E8 */ _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM), _(A,SM),
- /* A8F0 */ _(A,SM), _(A,SM), _(S,SM), _(S,SM), _(S,SM), _(S,SM), _(S,SM), _(S,SM),
- /* A8F8 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(V,C), _(M,AS),
-
-#define indic_offset_0xa9e0u 1632
-
-
- /* Myanmar Extended-B */
-
- /* A9E0 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(VA,T), _(X,X), _(C,C),
- /* A9E8 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* A9F0 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* A9F8 */ _(GB,C), _(GB,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(X,X),
-
-#define indic_offset_0xaa60u 1664
-
-
- /* Myanmar Extended-A */
-
- /* AA60 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* AA68 */ _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
- /* AA70 */ _(X,X), _(C,C), _(C,C), _(C,C), _(GB,C), _(GB,C), _(GB,C), _(X,X),
- /* AA78 */ _(X,X), _(X,X), _(C,C), _(PT,X), _(N,X), _(N,X), _(C,C), _(C,C),
-
-#define indic_offset_0xfe00u 1696
-
-
- /* Variation Selectors */
-
- /* FE00 */ _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X),
- /* FE08 */ _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X), _(VS,X),
-
-#define indic_offset_0x11300u 1712
-
-
- /* Grantha */
-
- /* 11300 */ _(X,X),_(SM,SM),_(SM,SM),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x11338u 1720
-
- /* 11338 */ _(X,X), _(X,X), _(X,X), _(N,X), _(N,X), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x116d0u 1728
-
-
- /* Myanmar Extended-C */
-
- /* 116D0 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 116D8 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(GB,C),
- /* 116E0 */ _(GB,C), _(GB,C), _(GB,C), _(GB,C), _(X,X), _(X,X), _(X,X), _(X,X),
-
-}; /* Table items: 1752; occupancy: 71% */
+static inline uint8_t _hb_indic_b4 (const uint8_t* a, unsigned i)
+{
+ return (a[i>>1]>>((i&1)<<2))&15;
+}
+static inline uint8_t _hb_indic_get_categories_index (unsigned u)
+{
+ /* packtab: [2^4,2^3,2^3,2^2,2^1] */
+ return u<71396u ? (uint8_t)(_hb_indic_u8[996u+_hb_indic_u8[488u+((_hb_indic_u8[186u+((_hb_indic_u8[70u+((_hb_indic_b4(_hb_indic_u8,((((((((u)>>1))>>2))>>3))>>3)))<<3)+((((((((u)>>1))>>2))>>3))&7)])<<3)+((((((u)>>1))>>2))&7)])<<2)+((((u)>>1))&3)]+((u)&1)]) : 37;
+}
uint16_t
hb_indic_get_categories (hb_codepoint_t u)
{
- switch (u >> 12)
- {
- case 0x0u:
- if (unlikely (u == 0x00A0u)) return _(GB,C);
- if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
- if (hb_in_range (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
- if (hb_in_range (u, 0x0900u, 0x0D7Fu)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
- break;
-
- case 0x1u:
- if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
- if (hb_in_range (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
- if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
- break;
-
- case 0x2u:
- if (unlikely (u == 0x25CCu)) return _(DC,C);
- if (hb_in_range (u, 0x2008u, 0x2027u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
- if (hb_in_range (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
- if (hb_in_range (u, 0x25F8u, 0x25FFu)) return indic_table[u - 0x25F8u + indic_offset_0x25f8u];
- break;
-
- case 0xAu:
- if (hb_in_range (u, 0xA8E0u, 0xA8FFu)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
- if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
- if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
- break;
-
- case 0xFu:
- if (hb_in_range (u, 0xFE00u, 0xFE0Fu)) return indic_table[u - 0xFE00u + indic_offset_0xfe00u];
- break;
-
- case 0x11u:
- if (hb_in_range (u, 0x11300u, 0x11307u)) return indic_table[u - 0x11300u + indic_offset_0x11300u];
- if (hb_in_range (u, 0x11338u, 0x1133Fu)) return indic_table[u - 0x11338u + indic_offset_0x11338u];
- if (hb_in_range (u, 0x116D0u, 0x116E7u)) return indic_table[u - 0x116D0u + indic_offset_0x116d0u];
- break;
-
- default:
- break;
- }
- return _(X,X);
+ return _hb_indic_values[_hb_indic_get_categories_index (u)];
}
#undef _
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc 2026-07-13 06:55:55.000000000 +0000
@@ -356,13 +356,11 @@
sizeof (buffer->out_info[0]) * (end - start - 2));
buffer->out_info[start] = t;
}
- else
- {
- /* Since we decomposed, and NIKHAHIT is combining, merge clusters with the
- * previous cluster. */
- if (start)
- buffer->merge_out_clusters (start - 1, end);
- }
+
+ /* Since we decomposed, and NIKHAHIT is combining, merge clusters with the
+ * previous cluster. */
+ if (start)
+ buffer->merge_out_grapheme_clusters (start - 1, end);
}
buffer->sync ();
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -2,7 +2,7 @@
/*
* The following table is generated by running:
*
- * ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt ArabicShaping.txt DerivedCoreProperties.txt UnicodeData.txt Blocks.txt Scripts.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
+ * gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt ArabicShaping.txt DerivedCoreProperties.txt UnicodeData.txt Blocks.txt Scripts.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
*
* on files with these headers:
*
@@ -105,272 +105,272 @@
static const uint8_t hb_use_u8[3343]=
{
- 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 57, 58, 59, 195, 211, 62,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 15, 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 2, 2,
- 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 2, 2, 17,
- 18, 19, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21,
- 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 2, 33, 2, 2, 2,
- 2, 34, 35, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 2, 2, 2,
- 37, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 38, 2, 39, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 40, 41, 42, 43, 44, 45, 2, 46, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 47, 48, 2,
- 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 51, 2, 2, 2,
- 2, 2, 2, 2, 2, 52, 53, 2, 54, 2, 2, 55, 56, 2, 57, 58,
- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 2, 70, 71, 72, 73,
- 2, 74, 2, 75, 76, 77, 78, 79, 2, 80, 81, 82, 83, 2, 84, 85,
- 2, 86, 86, 86, 86, 86, 86, 86, 86, 87, 86, 86, 86, 86, 86, 86,
- 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
- 86, 86, 86, 86, 86, 86, 86, 86, 88, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 90, 91, 2, 2, 2, 92, 2, 2, 2, 93,
- 94, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 95, 95, 95, 96, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 97, 98, 2, 2, 2, 2, 2,
- 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 33, 3, 0, 0, 0, 4, 0, 80, 118, 128, 9, 10, 11, 192, 208, 14,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 7, 0, 0,
+ 8, 9, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 20,
+ 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, 36, 0, 0, 0,
+ 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0,
+ 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 42, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 43, 44, 45, 46, 47, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0,
+ 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0,
+ 0, 0, 0, 0, 0, 55, 56, 0, 57, 0, 0, 58, 59, 0, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 0, 73, 74, 75, 76,
+ 0, 77, 0, 78, 79, 80, 81, 82, 0, 83, 84, 85, 86, 0, 87, 88,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 89, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 90, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 92, 93, 0, 0, 0, 94, 0, 0, 0, 95,
+ 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 97, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 99, 0, 0, 0, 0, 0,
+ 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 101, 0, 0, 102, 0, 0, 0, 103, 0, 104, 0, 0, 0,
+ 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2, 2, 106, 107, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 100, 2, 2, 101, 2, 2, 2, 102, 2, 103, 2, 2, 2,
- 2, 2, 2, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 105, 105, 106, 107, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
- 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4,
- 0, 5, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11,
- 11, 11, 11, 0, 0, 0, 9, 12, 0, 2, 2, 2, 2, 13, 14, 0,
- 0, 11, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 17,
- 18, 19, 20, 21, 22, 16, 23, 24, 25, 12, 26, 27, 20, 2, 2, 2,
- 2, 2, 20, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2,
- 2, 28, 29, 30, 2, 2, 2, 9, 30, 9, 30, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 9, 2, 2, 2, 9, 9, 0, 2, 2, 0, 17,
- 18, 19, 20, 31, 32, 33, 32, 34, 0, 0, 0, 0, 35, 0, 0, 2,
- 30, 2, 0, 0, 0, 0, 0, 9, 36, 12, 15, 30, 2, 2, 9, 0,
- 30, 9, 2, 30, 9, 2, 0, 37, 18, 19, 31, 0, 27, 38, 27, 39,
- 0, 40, 0, 0, 0, 30, 2, 9, 9, 0, 0, 0, 2, 2, 2, 2,
- 2, 41, 42, 43, 0, 0, 0, 0, 0, 12, 15, 30, 2, 2, 2, 2,
- 30, 2, 30, 2, 2, 2, 2, 2, 2, 9, 2, 30, 2, 2, 0, 17,
- 18, 19, 20, 21, 27, 22, 35, 24, 0, 0, 0, 0, 0, 30, 41, 41,
- 44, 12, 29, 30, 2, 2, 2, 9, 30, 9, 2, 30, 2, 2, 0, 17,
- 45, 0, 0, 27, 22, 0, 0, 2, 30, 30, 0, 0, 0, 0, 0, 0,
- 0, 0, 46, 30, 2, 2, 9, 0, 2, 9, 2, 2, 0, 30, 9, 9,
- 2, 0, 30, 9, 0, 2, 9, 0, 2, 2, 2, 2, 2, 2, 0, 0,
- 23, 16, 47, 0, 48, 33, 48, 34, 0, 0, 0, 0, 35, 0, 0, 0,
- 0, 15, 29, 49, 2, 2, 2, 9, 2, 9, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 0, 17, 22, 16, 23, 47, 22, 38, 22, 39,
- 0, 0, 0, 27, 31, 2, 9, 0, 0, 10, 29, 30, 2, 2, 2, 9,
- 2, 2, 2, 30, 2, 2, 0, 17, 45, 0, 0, 35, 47, 0, 0, 0,
- 9, 50, 51, 0, 0, 0, 0, 0, 0, 11, 29, 2, 2, 2, 2, 9,
- 2, 2, 2, 2, 2, 2, 52, 53, 23, 19, 20, 31, 48, 33, 48, 34,
- 54, 0, 0, 0, 35, 0, 0, 0, 30, 12, 29, 30, 2, 2, 2, 2,
- 2, 2, 2, 2, 9, 0, 2, 2, 2, 2, 30, 2, 2, 2, 2, 30,
- 0, 2, 2, 2, 9, 0, 55, 0, 35, 23, 22, 31, 31, 18, 48, 48,
- 25, 0, 23, 0, 0, 0, 0, 0, 0, 2, 0, 2, 9, 0, 0, 0,
- 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 2, 56, 56, 57, 0, 0,
- 18, 2, 2, 2, 2, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9,
- 0, 58, 21, 59, 22, 22, 20, 20, 46, 21, 11, 31, 11, 2, 2, 60,
- 61, 61, 61, 61, 61, 62, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 63, 0, 0, 0, 0, 64, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 65, 45, 59, 66, 22, 22, 67, 68, 69, 70,
- 71, 2, 2, 2, 2, 2, 1, 0, 5, 2, 2, 2, 23, 20, 2, 2,
- 72, 71, 73, 74, 65, 73, 29, 29, 2, 52, 22, 53, 2, 2, 2, 2,
- 2, 2, 75, 76, 77, 29, 29, 78, 79, 2, 2, 2, 2, 2, 29, 45,
- 0, 2, 59, 80, 0, 0, 0, 0, 30, 2, 59, 47, 0, 0, 0, 0,
- 0, 2, 59, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 9,
- 2, 9, 59, 0, 0, 0, 0, 0, 0, 2, 2, 81, 45, 22, 59, 20,
- 48, 48, 48, 48, 15, 82, 83, 84, 85, 86, 87, 0, 0, 0, 0, 88,
- 0, 9, 0, 0, 30, 0, 89, 81, 90, 2, 2, 2, 2, 9, 0, 0,
- 0, 42, 42, 91, 92, 2, 2, 2, 2, 2, 2, 2, 2, 13, 9, 0,
- 0, 2, 2, 2, 2, 2, 2, 2, 9, 22, 80, 45, 22, 93, 61, 0,
- 0, 94, 95, 94, 94, 96, 97, 0, 0, 2, 2, 2, 2, 2, 2, 2,
- 0, 2, 2, 9, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0,
- 0, 2, 2, 2, 2, 29, 0, 0, 0, 2, 2, 2, 2, 2, 9, 0,
- 0, 2, 2, 2, 52, 98, 45, 0, 0, 2, 2, 99, 100, 101, 102, 61,
- 63, 103, 16, 45, 22, 59, 21, 80, 48, 48, 76, 11, 11, 11, 104, 46,
- 40, 11, 105, 74, 2, 2, 2, 2, 2, 2, 2, 106, 22, 20, 20, 22,
- 48, 48, 22, 107, 2, 2, 2, 9, 0, 0, 0, 0, 0, 0, 108, 109,
- 109, 109, 109, 0, 0, 0, 0, 0, 0, 105, 74, 2, 2, 2, 2, 2,
- 2, 60, 61, 59, 25, 22, 110, 61, 2, 2, 2, 2, 106, 22, 23, 45,
- 45, 101, 111, 0, 0, 0, 0, 0, 0, 2, 2, 61, 18, 48, 23, 112,
- 101, 101, 101, 113, 114, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 30,
- 2, 11, 46, 115, 115, 115, 11, 115, 115, 15, 115, 115, 115, 26, 0, 40,
- 0, 0, 0, 116, 51, 11, 5, 0, 0, 0, 0, 0, 0, 0, 117, 0,
- 0, 0, 0, 0, 0, 0, 6, 118, 119, 42, 42, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 119, 119, 120, 119, 119, 119, 119, 119, 119, 119,
- 119, 0, 0, 121, 0, 0, 0, 0, 0, 0, 7, 121, 0, 0, 0, 0,
- 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 122, 122, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0,
- 30, 0, 0, 0, 0, 0, 0, 0, 123, 0, 122, 122, 0, 0, 0, 0,
- 0, 2, 53, 2, 107, 2, 10, 2, 2, 2, 65, 19, 16, 0, 0, 31,
- 0, 2, 2, 0, 0, 0, 0, 0, 0, 29, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 124, 23, 23, 23, 23, 23, 23, 23, 125, 0, 0, 0, 0,
- 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 0, 0, 0, 0, 0,
- 52, 2, 2, 2, 22, 22, 126, 115, 0, 2, 2, 2, 127, 20, 59, 20,
- 112, 101, 128, 0, 0, 0, 0, 0, 0, 11, 129, 2, 2, 2, 2, 2,
- 2, 2, 130, 23, 22, 20, 48, 131, 132, 133, 0, 0, 0, 0, 0, 0,
- 0, 2, 2, 52, 30, 2, 2, 2, 2, 2, 2, 2, 2, 10, 22, 59,
- 98, 76, 134, 135, 136, 0, 0, 0, 0, 2, 137, 2, 2, 2, 2, 138,
- 0, 30, 2, 42, 5, 0, 79, 15, 2, 139, 20, 53, 127, 139, 2, 2,
- 140, 10, 9, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 141, 21,
- 25, 0, 0, 142, 143, 0, 0, 0, 0, 2, 65, 45, 23, 80, 47, 144,
- 0, 81, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0,
- 6, 119, 119, 119, 119, 120, 0, 0, 0, 2, 2, 2, 2, 2, 9, 2,
- 2, 2, 9, 2, 30, 2, 2, 2, 2, 2, 30, 2, 2, 2, 30, 9,
- 0, 127, 20, 27, 31, 0, 0, 145, 146, 2, 2, 30, 2, 30, 2, 2,
- 2, 2, 2, 2, 0, 14, 37, 0, 147, 2, 2, 13, 37, 0, 30, 2,
- 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 2, 2,
- 9, 2, 2, 11, 41, 0, 0, 0, 0, 2, 2, 2, 0, 27, 22, 22,
- 30, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 27, 38,
- 0, 2, 2, 2, 115, 115, 115, 115, 115, 148, 2, 9, 0, 0, 0, 0,
- 0, 2, 14, 14, 0, 0, 0, 0, 0, 9, 2, 2, 9, 2, 2, 2,
- 2, 30, 2, 9, 0, 30, 2, 0, 0, 149, 150, 151, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 22, 22, 20, 20, 20, 22, 22, 133, 0, 0, 0,
- 0, 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 2, 2, 2, 2,
- 2, 53, 52, 53, 0, 0, 0, 0, 153, 11, 74, 2, 2, 2, 2, 2,
- 2, 18, 19, 21, 16, 24, 37, 0, 0, 0, 31, 0, 0, 0, 0, 0,
- 0, 11, 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, 127, 20, 22, 154,
- 22, 21, 155, 156, 2, 2, 2, 2, 2, 0, 0, 65, 157, 0, 0, 0,
- 0, 2, 13, 0, 0, 0, 0, 0, 0, 2, 65, 25, 20, 20, 20, 22,
- 22, 107, 158, 0, 0, 56, 159, 31, 160, 30, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 23, 19, 22, 22, 161, 44, 0, 0, 0,
- 49, 127, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 9, 2, 2,
- 30, 2, 2, 2, 2, 2, 2, 2, 30, 2, 2, 2, 2, 2, 2, 2,
- 10, 18, 19, 21, 22, 162, 31, 0, 0, 11, 11, 30, 2, 2, 2, 9,
- 30, 9, 2, 30, 2, 2, 58, 17, 23, 16, 23, 47, 32, 33, 32, 34,
- 0, 0, 0, 0, 35, 0, 0, 0, 2, 2, 23, 0, 11, 11, 11, 46,
- 0, 11, 11, 46, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 30, 0,
- 9, 2, 2, 2, 30, 45, 59, 20, 20, 31, 33, 32, 32, 25, 163, 29,
- 164, 165, 37, 0, 0, 0, 0, 0, 0, 12, 26, 0, 0, 0, 0, 0,
- 0, 2, 2, 65, 25, 20, 20, 20, 22, 23, 125, 15, 17, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 0, 0, 166, 167, 0, 0, 0, 0, 0, 0,
- 0, 18, 19, 20, 20, 66, 98, 25, 160, 11, 168, 9, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 2, 2, 65, 25, 20, 20, 0, 48, 48, 11,
- 169, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 20,
- 0, 23, 19, 20, 20, 21, 16, 82, 169, 38, 0, 0, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 10, 170, 25, 20, 22, 22, 168, 9, 0, 0,
- 0, 2, 2, 2, 2, 2, 9, 43, 135, 23, 22, 20, 76, 21, 22, 0,
- 0, 2, 2, 2, 9, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 18,
- 19, 20, 21, 22, 104, 169, 37, 0, 0, 2, 2, 2, 9, 30, 0, 2,
- 2, 2, 2, 30, 9, 2, 2, 2, 2, 23, 23, 18, 32, 33, 12, 171,
- 165, 172, 173, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 65, 25, 20, 20, 0, 22, 23, 29, 107, 0, 33, 0, 0, 0, 0,
- 0, 52, 20, 22, 22, 22, 139, 2, 2, 2, 174, 140, 11, 15, 175, 61,
- 176, 0, 0, 1, 147, 0, 0, 0, 0, 52, 20, 22, 16, 19, 20, 2,
- 2, 2, 2, 158, 158, 158, 177, 177, 177, 177, 177, 177, 15, 178, 0, 30,
- 0, 16, 20, 16, 16, 0, 0, 0, 0, 22, 20, 20, 31, 22, 22, 11,
- 169, 0, 61, 61, 61, 61, 61, 61, 61, 66, 21, 82, 46, 0, 0, 0,
- 0, 2, 2, 2, 9, 2, 30, 2, 2, 52, 22, 22, 31, 0, 38, 22,
- 27, 11, 159, 179, 180, 0, 0, 0, 0, 2, 2, 2, 30, 9, 2, 2,
- 2, 2, 2, 2, 2, 2, 23, 23, 47, 22, 35, 82, 68, 0, 0, 0,
- 0, 2, 181, 66, 47, 0, 0, 0, 0, 11, 182, 2, 2, 2, 2, 2,
- 2, 2, 2, 23, 22, 20, 31, 0, 48, 16, 143, 0, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 156, 0, 0, 183, 183, 183, 183, 183, 183, 183,
- 183, 184, 184, 184, 185, 186, 184, 183, 183, 187, 183, 183, 188, 189, 189, 189,
- 189, 189, 189, 189, 0, 0, 0, 0, 0, 183, 183, 183, 183, 183, 190, 0,
- 0, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, 22, 22, 191, 192,
- 193, 11, 11, 11, 46, 0, 0, 0, 0, 29, 74, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 65, 47, 0, 2, 2, 2, 2, 2, 9, 0,
- 58, 194, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 0, 0, 0, 40, 115, 26, 0, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 2, 2, 2, 2, 2, 0, 58, 37, 0, 6, 119, 119, 119, 120, 0,
- 0, 11, 11, 11, 49, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0,
- 2, 2, 2, 2, 2, 2, 2, 2, 46, 2, 2, 2, 2, 2, 2, 11,
- 11, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2,
- 20, 2, 2, 44, 44, 44, 92, 0, 0, O, O, O, GB, B, B, O,
- SB, O, SE, GB, O, O, WJ,FMPst,FMPst, O, CGJ, B, O, B,VMAbv,VMAbv,
- VMAbv, O,VMAbv, B,CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst,
- VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, VPst,VMBlw, O, O,
- VAbv, GB,VMAbv,VMPst,VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O,
- VPst,FMAbv, O,CMBlw, O, VAbv, O, VAbv, H, O,VMBlw,VMAbv,CMAbv, GB, GB, O,
- MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, B, O, CS, CS,
- VMPst, B, VAbv, VAbv, B, R, O, HVM, O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv,
- VBlw, B, SUB, SUB, SUB, O, SUB, SUB, O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv,
- VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw,
- VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv,
- FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB,
- CMAbv,CMAbv, B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B,
- MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, H,
- B, O,SMAbv,SMAbv,SMAbv, VPst, IS, RK, RK, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,
- VMBlw,VMAbv, CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, O,FMPst, O, SB, SE, O,
- H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B,CMAbv, VAbv,
- MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, FPst, VBlw,
- B, VBlw,VMAbv, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O,
- IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, HN, VPre, VBlw, VAbv,
- IS,CMAbv, O, VPst, B, R, R,CMBlw, VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,VMPst,
- O,VMAbv,CMBlw, IS, R,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv,
- VPst, MPst, R, MPst,CMBlw, B,FMBlw, CS, SUB, SUB, GB, FBlw, FBlw,CMAbv, IS, VBlw,
- IS, R, MBlw, GB, VAbv, R,VMPst, G, G, J, J, J, SB, SE, J, HR,
- G, G, HM, HM, HM, G, O, MPre, MPre, MPst,VMAbv, MBlw, VBlw, O, VBlw,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4,
+ 4, 2, 2, 2, 2, 5, 2, 2, 2, 2, 6, 0, 2, 2, 2, 2,
+ 2, 5, 8, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2,
+ 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5,
+ 0, 2, 2, 2, 2, 5, 0, 0, 0, 2, 2, 2, 2, 2, 5, 0,
+ 0, 2, 8, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 74, 75,
+ 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+ 2, 0, 2, 2, 2, 2, 2, 2, 2, 17, 6, 13, 29, 33, 29, 45,
+ 0, 15, 11, 27, 7, 38, 7, 68, 0, 2, 2, 2, 2, 8, 2, 2,
+ 2, 10, 10, 10, 10, 80, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2,
+ 5, 2, 2, 5, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0,
+ 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 5, 2,
+ 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0,
+ 0, 9, 41, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 23, 6, 6, 6, 6, 6, 6, 6,
+ 6, 0, 0, 0, 0, 0, 0, 48, 0, 44, 0, 0, 0, 0, 0, 49,
+ 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 103, 2, 2, 2, 2, 2, 36, 9,
+ 9, 9, 9, 0, 0, 0, 5, 31, 0, 2, 2, 2, 2, 50, 51, 0,
+ 0, 9, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 32,
+ 19, 17, 6, 18, 7, 15, 11, 67, 22, 31, 52, 25, 6, 2, 2, 2,
+ 2, 104, 14, 8, 2, 2, 2, 5, 8, 5, 5, 0, 2, 2, 0, 32,
+ 19, 0, 0, 0, 34, 0, 0, 2, 8, 2, 0, 0, 0, 0, 0, 5,
+ 105, 31, 24, 8, 2, 2, 5, 0, 8, 5, 2, 8, 5, 2, 0, 35,
+ 19, 17, 13, 0, 25, 38, 25, 68, 0, 53, 0, 0, 0, 8, 2, 5,
+ 5, 54, 39, 77, 0, 0, 0, 0, 0, 31, 24, 8, 2, 2, 2, 2,
+ 8, 5, 2, 8, 2, 2, 0, 32, 19, 17, 6, 18, 25, 7, 34, 67,
+ 0, 0, 0, 0, 0, 8, 54, 54, 46, 31, 14, 8, 2, 2, 2, 5,
+ 8, 5, 2, 8, 2, 2, 0, 32, 20, 0, 0, 25, 7, 0, 0, 2,
+ 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 26, 8, 2, 2, 5, 0,
+ 2, 5, 2, 2, 0, 8, 5, 5, 2, 0, 8, 5, 0, 2, 5, 0,
+ 2, 2, 2, 2, 2, 2, 0, 0, 11, 15, 27, 0, 12, 33, 12, 45,
+ 0, 0, 0, 0, 34, 0, 0, 0, 0, 24, 14, 55, 2, 2, 2, 5,
+ 2, 2, 2, 2, 2, 2, 0, 32, 7, 0, 0, 25, 13, 2, 5, 0,
+ 0, 36, 14, 8, 2, 2, 2, 5, 2, 2, 2, 8, 2, 2, 0, 32,
+ 20, 0, 0, 34, 27, 0, 0, 0, 5, 106, 78, 0, 0, 0, 0, 0,
+ 0, 9, 14, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 30, 40,
+ 11, 17, 6, 13, 12, 33, 12, 45, 107, 0, 0, 0, 34, 0, 0, 0,
+ 8, 31, 14, 8, 2, 2, 2, 2, 2, 2, 2, 2, 5, 0, 2, 2,
+ 2, 2, 8, 2, 2, 2, 2, 8, 0, 2, 2, 2, 5, 0, 108, 0,
+ 34, 11, 7, 13, 13, 19, 12, 12, 22, 0, 11, 0, 0, 0, 0, 0,
+ 0, 2, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0,
+ 0, 2, 2, 69, 69, 109, 0, 0, 19, 56, 18, 21, 7, 7, 6, 6,
+ 26, 18, 9, 13, 9, 2, 2, 79, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 81, 0, 0, 0, 0, 110, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 23, 20, 21, 57, 7, 7, 111, 82, 112, 113,
+ 83, 2, 2, 2, 2, 2, 48, 0, 44, 2, 2, 2, 11, 6, 2, 2,
+ 114, 83, 84, 41, 23, 84, 14, 14, 2, 30, 7, 40, 2, 2, 2, 2,
+ 2, 2, 115, 58, 116, 14, 14, 117, 85, 2, 2, 2, 2, 2, 14, 20,
+ 0, 2, 21, 59, 0, 0, 0, 0, 8, 2, 21, 27, 0, 0, 0, 0,
+ 0, 2, 21, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 5,
+ 2, 5, 21, 0, 0, 0, 0, 0, 0, 2, 2, 4, 20, 7, 21, 6,
+ 12, 12, 12, 12, 24, 60, 118, 119, 120, 121, 122, 0, 0, 0, 0, 123,
+ 0, 5, 0, 0, 8, 0, 124, 4, 125, 39, 39, 126, 86, 2, 2, 2,
+ 2, 2, 2, 2, 2, 50, 5, 0, 0, 7, 59, 20, 7, 127, 10, 0,
+ 0, 70, 128, 70, 70, 129, 130, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+ 0, 2, 2, 2, 2, 14, 0, 0, 0, 2, 2, 2, 30, 71, 20, 0,
+ 0, 2, 2, 131, 132, 42, 133, 10, 81, 134, 15, 20, 7, 21, 18, 59,
+ 12, 12, 58, 9, 9, 9, 87, 26, 53, 9, 88, 41, 2, 2, 2, 2,
+ 2, 2, 2, 89, 7, 6, 6, 7, 12, 12, 7, 61, 2, 2, 2, 5,
+ 0, 0, 0, 0, 0, 0, 135, 62, 62, 62, 62, 0, 0, 0, 0, 0,
+ 0, 88, 41, 2, 2, 2, 2, 2, 2, 79, 10, 21, 22, 7, 136, 10,
+ 2, 2, 2, 2, 89, 7, 11, 20, 20, 42, 137, 0, 0, 0, 0, 0,
+ 0, 2, 2, 10, 19, 12, 11, 90, 42, 42, 42, 138, 139, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 0, 8, 2, 9, 26, 16, 16, 16, 9, 16,
+ 16, 24, 16, 16, 16, 52, 0, 53, 0, 0, 0, 140, 78, 9, 44, 0,
+ 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 49, 142,
+ 3, 39, 39, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
+ 72, 0, 0, 91, 0, 0, 0, 0, 0, 0, 76, 91, 0, 0, 0, 0,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
+ 0, 0, 0, 0, 63, 63, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0, 143, 0, 63, 63, 0, 0, 0, 0,
+ 0, 2, 40, 2, 61, 2, 36, 2, 2, 2, 23, 17, 15, 0, 0, 13,
+ 0, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 144, 11, 11, 11, 11,
+ 11, 11, 11, 92, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 2, 0, 0, 0, 0, 0, 30, 2, 2, 2, 7, 7, 145, 16,
+ 0, 2, 2, 2, 47, 6, 21, 6, 90, 42, 146, 0, 0, 0, 0, 0,
+ 0, 9, 147, 2, 2, 2, 2, 2, 2, 2, 148, 11, 7, 6, 12, 149,
+ 150, 93, 0, 0, 0, 0, 0, 0, 0, 2, 2, 30, 8, 2, 2, 2,
+ 2, 2, 2, 2, 2, 36, 7, 21, 71, 58, 151, 94, 152, 0, 0, 0,
+ 0, 2, 153, 2, 2, 2, 2, 154, 0, 8, 2, 39, 44, 0, 85, 24,
+ 2, 73, 6, 40, 47, 73, 2, 2, 95, 36, 5, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 155, 18, 22, 0, 0, 156, 96, 0, 0, 0,
+ 0, 2, 23, 20, 11, 59, 27, 157, 0, 0, 0, 0, 0, 0, 0, 0,
+ 49, 3, 3, 3, 3, 72, 0, 0, 0, 2, 5, 2, 8, 2, 2, 2,
+ 2, 2, 8, 2, 2, 2, 8, 5, 0, 47, 6, 25, 13, 0, 0, 158,
+ 159, 2, 2, 8, 2, 8, 2, 2, 2, 2, 2, 2, 0, 51, 35, 0,
+ 97, 2, 2, 50, 35, 0, 8, 2, 2, 0, 0, 0, 0, 8, 2, 2,
+ 5, 2, 2, 9, 54, 0, 0, 0, 0, 2, 2, 2, 0, 25, 7, 7,
+ 8, 2, 2, 2, 2, 2, 25, 38, 0, 2, 2, 2, 16, 16, 16, 16,
+ 16, 160, 2, 5, 0, 0, 0, 0, 0, 2, 51, 51, 0, 0, 0, 0,
+ 0, 5, 2, 2, 5, 2, 2, 2, 2, 8, 2, 5, 0, 8, 2, 0,
+ 0, 161, 162, 163, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 6,
+ 6, 6, 7, 7, 93, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 2, 2, 2, 2, 2, 40, 30, 40, 0, 0, 0, 0,
+ 164, 19, 17, 18, 15, 67, 35, 0, 0, 0, 13, 0, 0, 0, 0, 0,
+ 0, 9, 55, 2, 2, 2, 2, 2, 2, 2, 2, 2, 47, 6, 7, 165,
+ 7, 18, 166, 98, 2, 2, 2, 2, 2, 0, 0, 23, 167, 0, 0, 0,
+ 0, 2, 50, 0, 0, 0, 0, 0, 0, 2, 23, 22, 6, 6, 6, 7,
+ 7, 61, 64, 0, 0, 69, 99, 13, 100, 2, 2, 2, 2, 2, 2, 11,
+ 17, 7, 7, 168, 46, 0, 0, 0, 55, 47, 0, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 5, 5, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2,
+ 8, 2, 2, 2, 2, 2, 2, 2, 36, 19, 17, 18, 7, 169, 13, 0,
+ 0, 9, 9, 8, 2, 2, 2, 5, 8, 5, 2, 8, 2, 2, 56, 32,
+ 11, 15, 11, 27, 29, 33, 29, 45, 0, 0, 0, 0, 34, 0, 0, 0,
+ 2, 2, 11, 0, 9, 9, 9, 26, 0, 9, 9, 26, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 8, 0, 5, 2, 2, 2, 8, 20, 21, 6,
+ 6, 13, 33, 29, 29, 22, 170, 14, 171, 101, 35, 0, 0, 0, 0, 0,
+ 0, 31, 52, 0, 0, 0, 0, 0, 0, 2, 2, 23, 22, 6, 6, 6,
+ 7, 11, 92, 24, 32, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0,
+ 172, 173, 0, 0, 0, 0, 0, 0, 0, 19, 17, 6, 6, 57, 71, 22,
+ 100, 9, 102, 5, 0, 0, 0, 0, 0, 22, 6, 6, 0, 12, 12, 9,
+ 65, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 6,
+ 0, 11, 17, 6, 6, 18, 15, 60, 65, 38, 0, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 36, 174, 22, 6, 7, 7, 102, 5, 0, 0,
+ 0, 2, 2, 2, 2, 2, 5, 77, 94, 11, 7, 6, 58, 18, 7, 0,
+ 0, 2, 2, 2, 5, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 19,
+ 17, 6, 18, 7, 87, 65, 35, 0, 0, 2, 2, 2, 5, 8, 0, 2,
+ 2, 2, 2, 8, 5, 2, 2, 2, 2, 11, 11, 19, 29, 33, 31, 175,
+ 101, 176, 177, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2,
+ 2, 23, 22, 6, 6, 0, 7, 11, 14, 61, 0, 33, 0, 0, 0, 0,
+ 0, 30, 6, 7, 7, 7, 73, 2, 2, 2, 178, 95, 9, 24, 179, 10,
+ 180, 0, 0, 48, 97, 0, 0, 0, 0, 30, 6, 7, 15, 17, 6, 2,
+ 2, 2, 2, 64, 64, 64, 43, 43, 43, 43, 43, 43, 24, 181, 0, 8,
+ 0, 15, 6, 15, 15, 0, 0, 0, 0, 7, 6, 6, 13, 7, 7, 9,
+ 65, 0, 10, 10, 10, 10, 10, 10, 10, 57, 18, 60, 26, 0, 0, 0,
+ 0, 2, 2, 2, 5, 2, 8, 2, 2, 30, 7, 7, 13, 0, 38, 7,
+ 25, 9, 99, 182, 183, 0, 0, 0, 0, 2, 2, 2, 8, 5, 2, 2,
+ 2, 2, 2, 2, 2, 2, 11, 11, 27, 7, 34, 60, 82, 0, 0, 0,
+ 0, 2, 184, 57, 27, 0, 0, 0, 0, 9, 185, 2, 2, 2, 2, 2,
+ 2, 2, 2, 11, 7, 6, 13, 0, 12, 15, 96, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 98, 0, 0, 66, 66, 66, 186, 187, 66, 1,
+ 1, 188, 1, 1, 189, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 190, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 191, 192, 193, 9, 9, 9, 26, 0, 0, 0,
+ 0, 14, 41, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 23, 27,
+ 0, 2, 2, 2, 2, 2, 5, 0, 56, 194, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 0, 0, 53, 16, 52, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 2, 2, 2, 2, 2, 0, 56, 35, 0, 49, 3, 3, 3, 72, 0,
+ 0, 9, 9, 9, 55, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 26, 2, 2, 2, 2, 2, 2, 9,
+ 9, 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2, 2,
+ 6, 2, 2, 46, 46, 46, 86, 0, 0, O, O, G, G, B, B, WJ,
+ WJ, CGJ, CGJ, B, O, VBlw, VBlw, VAbv, VAbv, O, B,VMAbv,VMAbv, SUB, SUB, VPst,
+ VPst, VPre, VPre, VBlw, O,VMPst,VMPst, VAbv, VPst,VMBlw,VMBlw, VPst, VBlw, VBlw, VAbv, VPst,
+ VPre, VPst, VAbv, VAbv, VBlw, VPre, VPst, B, VPst,VMAbv,VMPst, O, VAbv,VMAbv, O, VPst,
+ O, N, N, O, VPre, B, VAbv, O,VMAbv,CMBlw, B, VPre, O, O, VPst,CMBlw,
+ O, B,VMAbv, HM, HM, VAbv, O, GB, GB, VAbv, B,VMPst, B, FAbv, FAbv, FBlw,
+ FBlw, GB, O, VPre, H,CMAbv,CMAbv, B, VBlw, O, GB, O, WJ, B,CMBlw,CMBlw,
+ CMBlw,VMBlw, O, O,VMBlw,VMAbv,CMAbv,VMAbv, B, O,CMBlw, VBlw, VPre, VPre, VAbv, VBlw,
+ VPst, VPst,VMAbv, H, B,SMAbv,SMAbv, SB, SE, R, R,VMPst, H, J, J, VPst,
+ H, VAbv, H, O,FMBlw, FPst, FPst, VAbv, VPre, WJ, O, VBlw, B, O, SB, O,
+ SE,FMPst,FMPst, O, MBlw, CS,VMPst, B, SUB, O, SUB, SUB, O,VMPst, IS, MBlw,
+ B, VPst,VMPst, B,VMPst,CMAbv, B, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, VBlw, FAbv,FMPst,
+ O, H,VMAbv, H, O, MPre, MAbv, VBlw,VMAbv, IS, O, O, IS,CMAbv, O,CMBlw,
+ VAbv, VPre,VMAbv, IS, R, H,CMBlw, O, CGJ, GB,VMAbv,FMAbv, O, O, CS, R,
+ O, HVM, O, O,CMAbv,FMBlw, O,VMAbv,VMBlw, VAbv, MPst, MPre, MBlw, MBlw, MBlw, MBlw,
+ VPst, VAbv,VMPst,VMPst,VMBlw,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv, IS,FMAbv, B,
+ FMAbv, B, CGJ, WJ, CGJ, GB,CMAbv, VAbv, SUB,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, B,
+ MPre, MBlw, SUB, MAbv, SUB, Sk, VPst, O,SMAbv, VPst, IS, RK, RK,VMPre,VMPre,FMAbv,
+ CMBlw,VMAbv, CS, O,FMAbv, ZWNJ, CGJ, O, H, MPst, VPst, VAbv,VMBlw, FPst, VPst, FAbv,
+ VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, VBlw, MPst, MBlw, O, B, FAbv, FAbv, FPst, B,
+ VPre, O,VMPst,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS,
+ B, O, HN, VPre, VBlw, VAbv, IS, VPst, B,VMAbv, H, VAbv,CMBlw,VMPst, O,VMAbv,
+ CMBlw,FMAbv, B, CS, CS,VMPst, VAbv,VMAbv, VPst, MPst, R, MPst,CMBlw, B,FMBlw, CS,
+ SUB, SUB, GB,CMAbv, IS, VBlw, IS, R, MBlw, GB, VAbv, R,VMPst, J, SB, SE,
+ J, HR, G, G, HM, G, O, MPre, MPre, MPst,VMAbv, MBlw, VBlw, O, VBlw,
};
static const uint16_t hb_use_u16[864]=
{
- 0, 0, 1, 2, 0, 3, 0, 3, 0, 0, 4, 5, 0, 6, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
- 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 12,
- 0, 0, 0, 0, 10, 13, 0, 0, 14, 10, 10, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 18, 26, 27, 21, 22, 28, 29, 30, 31, 32,
- 33, 34, 22, 35, 36, 0, 18, 37, 38, 21, 22, 39, 24, 40, 18, 41,
- 42, 43, 44, 45, 46, 47, 31, 0, 48, 49, 22, 50, 51, 52, 18, 0,
- 53, 49, 22, 54, 51, 55, 18, 56, 57, 49, 10, 58, 59, 60, 18, 0,
- 61, 62, 10, 63, 64, 65, 31, 66, 67, 68, 10, 69, 70, 10, 71, 72,
- 73, 74, 75, 76, 77, 0, 0, 0, 10, 10, 78, 79, 80, 81, 82, 83,
- 84, 85, 0, 0, 0, 0, 0, 0, 10, 86, 10, 87, 10, 88, 89, 90,
- 10, 10, 10, 91, 92, 93, 2, 0, 94, 0, 10, 10, 10, 10, 10, 95,
- 96, 10, 97, 0, 0, 0, 0, 0, 10, 98, 99,100, 31, 10,101,102,
- 10, 10,103, 10,104,105, 0, 0, 10,106, 10, 10, 10,107,108,109,
- 2, 2, 0, 0, 0, 0, 0, 0,110, 10, 10,111,112, 2,113,114,
- 115, 10,116, 10, 10, 10,117,118, 10, 10,119,120,121, 0, 0, 0,
- 0, 0, 0, 0, 0,122,123,124, 0, 0, 0, 0, 0, 0, 0,125,
- 126,127,128, 0, 0, 0,129,130,131, 0, 0, 0, 0, 0, 0,132,
- 0, 0, 0, 0,133, 0, 0, 0, 0, 0, 0, 0, 0, 0,134, 0,
- 0, 0, 0, 10, 10, 10,135,136, 0, 0,137, 0, 0, 0, 0, 0,
- 138, 10,139, 0, 10, 10, 10,140,141, 10, 10,142,143, 2,144,145,
- 10, 10,146, 10,147,148, 0, 0,149, 10, 10,150,151, 2,152, 98,
- 10, 10,153,154,155, 2, 10,156, 10, 10, 10,157,158, 0,159,160,
- 0, 0, 0, 0, 10, 10,161, 2,162, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 0,164,
- 0, 0, 0, 0, 0, 0, 0,165,165,166, 34,167, 0, 0, 0, 0,
- 168,169, 10,170, 95, 0, 0, 0, 0, 0, 0, 0, 70, 10,171, 0,
- 10,172,173, 0, 0, 0, 0, 0, 10, 10,174, 2, 9, 10,175, 10,
- 176, 0, 0, 0, 0, 0, 0, 0, 10, 10,177,172, 0, 0, 0, 0,
- 0, 0, 0, 10,178,179, 0, 10,180, 0, 0,181,182, 0, 0, 0,
- 183, 10, 10,184,185,186,187,188,189, 10, 10,190,191, 0, 0, 0,
- 192, 10,193,194,195, 10, 10,196,189, 10, 10,197,198,105,199,102,
- 10, 34,200,201,202, 0, 0, 0,203,204, 95, 10, 10,205,206, 2,
- 207, 21, 22,208,209,210,211,212,213, 10, 10,214,215,216,217, 0,
- 10, 10, 10,218,219,220,221, 0,199, 10, 10,222,223, 2, 0, 0,
- 10, 10,224,225,226,227, 0, 0, 10, 10, 10,228,229, 2, 0, 0,
- 10, 10,230,231, 2, 10,140, 0, 10,232,233,103,234, 0, 0, 0,
- 10, 10,235,236, 0, 0, 0, 0,237,238, 10,239,240, 2, 0, 0,
- 0, 0,241, 10, 10,242,243, 0,244, 10, 10,245,246,247, 10, 10,
- 248,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,
- 22, 10,224,251, 8, 10, 71, 19, 10,252, 74,253, 0, 0, 0, 0,
- 254, 10, 10,255,256, 2,257, 10,258,259, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 10,260,261, 49, 10,262,263,264, 0, 0,
- 265,265,265,265,265,265,265,265,265,265,265,266,267,268,265,265,
- 265,265,265,265,265,265,265,269, 10,270,271, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 10, 10, 10,272, 0, 0, 0, 0,
- 0, 0, 0, 0,273, 10,274, 2, 10, 10, 10, 10,275,276,277,277,
- 278,279, 0, 0, 0, 0,280, 0, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10,176, 0,281, 10, 10, 10, 10, 10, 10,105, 71,
- 95,282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,283,
- 10, 10, 71,284,285, 0, 0, 0, 0, 10,286, 0, 10, 10,287, 2,
- 0, 0, 0, 0, 0, 10,288, 2, 0, 0, 0, 0, 0, 10,289,105,
- 10, 10, 10, 10,290, 2, 0, 0,129,129,129,129,129,129,129,129,
- 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,129,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,
+ 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24,
+ 0, 0, 272, 32, 0, 120, 0, 120, 0, 0, 280, 288, 0, 296, 0, 0,
+ 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0,
+ 0, 0, 0, 0, 136, 24, 312, 320, 0, 0, 0, 0, 24, 328, 0, 0,
+ 336, 24, 24, 344, 352, 360, 56, 144, 368, 64, 48, 376, 152, 384, 56, 392,
+ 400, 64, 48, 408, 416, 424, 72, 432, 440, 112, 48, 448, 456, 0, 56, 464,
+ 472, 64, 48, 480, 152, 488, 56, 496, 504, 512, 520, 528, 536, 544, 72, 0,
+ 552, 80, 48, 560, 160, 568, 56, 0, 576, 80, 48, 584, 160, 592, 56, 600,
+ 608, 80, 24, 616, 624, 632, 56, 0, 640, 648, 24, 656, 664, 672, 72, 680,
+ 688, 696, 24, 704, 168, 24, 88, 712, 720, 176, 728, 736, 744, 0, 0, 0,
+ 24, 24, 752, 760, 768, 776, 784, 792, 800, 808, 0, 0, 0, 0, 0, 0,
+ 24, 816, 24, 824, 24, 832, 840, 848, 24, 24, 24, 856, 864, 872, 32, 0,
+ 880, 0, 24, 24, 24, 24, 24, 96, 888, 24, 896, 0, 0, 0, 0, 0,
+ 24, 184, 904, 912, 72, 24, 920, 192, 24, 24, 200, 24, 928, 104, 0, 0,
+ 24, 936, 24, 24, 24, 944, 952, 960, 32, 32, 0, 0, 0, 0, 0, 0,
+ 968, 24, 24, 976, 984, 32, 992,1000,1008, 24,1016, 24, 24, 24,1024,1032,
+ 24, 24,1040,1048,1056, 0, 0, 0, 0, 0, 0, 0, 0,1064,1072,1080,
+ 0, 0, 0, 0, 0, 0, 0,1088,1096,1104,1112, 0, 0, 0, 16,1120,
+ 1128, 0, 0, 0, 0, 0, 0,1136, 0, 0, 0, 0,1144, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,1152, 0, 0, 0, 0, 24, 24, 24,1160,1168,
+ 0, 0,1176, 0, 0, 0, 0, 0,1184, 24,1192, 0, 24, 24, 24, 208,
+ 1200, 24, 24,1208,1216, 32,1224,1232, 24, 24,1240, 24,1248,1256, 0, 0,
+ 1264, 24, 24,1272,1280, 32,1288, 184, 24, 24,1296,1304,1312, 32, 24,1320,
+ 24, 24, 24,1328,1336, 0,1344,1352, 0, 0, 0, 0, 24, 24,1360, 32,
+ 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1368,
+ 0, 0, 0, 0, 0, 0, 0,1376, 0, 0, 0, 0, 0, 0, 0, 216,
+ 216,1384, 112,1392, 0, 0, 0, 0,1400,1408, 24,1416, 96, 0, 0, 0,
+ 0, 0, 0, 0, 168, 24,1424, 0, 24, 224,1432, 0, 0, 0, 0, 0,
+ 24, 24,1440, 32, 136, 24,1448, 24, 232, 0, 0, 0, 0, 0, 0, 0,
+ 24, 24,1456, 224, 0, 0, 0, 0, 0, 0, 0, 24,1464,1472, 0, 24,
+ 1480, 0, 0,1488,1496, 0, 0, 0,1504, 24, 24,1512,1520,1528,1536,1544,
+ 240, 24, 24,1552,1560, 0, 0, 0,1568, 24,1576,1584,1592, 24, 24,1600,
+ 240, 24, 24,1608,1616, 104, 248, 192, 24, 112,1624,1632,1640, 0, 0, 0,
+ 1648,1656, 96, 24, 24,1664,1672, 32,1680, 64, 48,1688,1696,1704,1712,1720,
+ 1728, 24, 24,1736,1744,1752,1760, 0, 24, 24, 24,1768,1776,1784,1792, 0,
+ 248, 24, 24,1800,1808, 32, 0, 0, 24, 24, 256,1816,1824,1832, 0, 0,
+ 24, 24, 24,1840,1848, 32, 0, 0, 24, 24,1856,1864, 32, 24, 208, 0,
+ 24,1872,1880, 200,1888, 0, 0, 0, 24, 24,1896,1904, 0, 0, 0, 0,
+ 1912,1920, 24,1928,1936, 32, 0, 0, 0, 0,1944, 24, 24,1952,1960, 0,
+ 1968, 24, 24,1976,1984,1992, 24, 24,2000,2008, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,2016, 0, 48, 24, 256,2024, 128, 24, 88, 144,
+ 24,2032, 176,2040, 0, 0, 0, 0,2048, 24, 24,2056,2064, 32,2072, 24,
+ 2080,2088, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,2096,
+ 2104, 80, 24,2112,2120,2128, 0, 0, 8, 8, 8,2136,2144,2152, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8,2160, 24,2168,2176, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32, 0, 0, 0, 24, 24, 24,2184, 0, 0, 0, 0,
+ 0, 0, 0, 0,2192, 24,2200, 32, 24, 24, 24, 24,2208,2216, 264, 264,
+ 2224,2232, 0, 0, 0, 0,2240, 0, 24, 24, 24, 24, 24, 232, 0,2248,
+ 24, 24, 24, 24, 24, 24, 104, 88, 96,2256, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,2264, 24, 24, 88,2272,2280, 0, 0, 0,
+ 0, 24,2288, 0, 24, 24,2296, 32, 0, 0, 0, 0, 0, 24,2304, 32,
+ 0, 0, 0, 0, 0, 24,2312, 104, 24, 24, 24, 24,2320, 32, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 16,
};
static inline uint8_t hb_use_b4 (const uint8_t* a, unsigned i)
@@ -379,7 +379,8 @@
}
static inline uint8_t hb_use_get_category (unsigned u)
{
- return u<921600 ? hb_use_u8[2953u+((hb_use_u8[625u+((hb_use_u16[((hb_use_u8[113u+((hb_use_b4(hb_use_u8,((((((((u)>>1))>>3))>>3))>>5)))<<5)+((((((((u)>>1))>>3))>>3))&31)])<<3)+((((((u)>>1))>>3))&7)])<<3)+((((u)>>1))&7)])<<1)+((u)&1)] : O;
+ /* packtab: [2^4,2^5,2^3,2^3,2^1] */
+ return u<921600u ? (uint8_t)(hb_use_u8[2953u+((hb_use_u8[625u+hb_use_u16[((hb_use_u8[113u+((hb_use_b4(hb_use_u8,((((((((u)>>1))>>3))>>3))>>5)))<<5)+((((((((u)>>1))>>3))>>3))&31)])<<3)+((((((u)>>1))>>3))&7)]+((((u)>>1))&7)])<<1)+((u)&1)]) : O;
}
@@ -389,269 +390,269 @@
static const uint8_t hb_use_u8[3663]=
{
- 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 57, 58, 59, 195, 211, 62,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 15, 0, 1, 1, 2, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1,
- 11, 12, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1,
- 1, 20, 1, 1, 1, 1, 21, 1, 22, 1, 1, 1, 1, 1, 23, 24,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, 27, 28, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29,
- 30, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 32, 33, 1, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- 52, 53, 53, 53, 53, 54, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 56, 1, 1, 1, 1, 1, 1, 1, 1, 57, 58, 1, 59, 1,
- 60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 61, 62, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 63, 1, 1,
- 1, 1, 64, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 65, 66, 1, 67, 68, 1, 1, 1, 69, 1, 1, 1, 1, 1,
- 1, 70, 71, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 0, 1, 2, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 9, 0, 0, 0, 0,
- 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 37, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- 0, 56, 57, 58, 59, 60, 0, 0, 0, 61, 62, 63, 64, 56, 65, 66,
- 67, 68, 56, 56, 69, 70, 71, 0, 0, 72, 73, 74, 75, 56, 76, 77,
- 0, 78, 56, 79, 80, 81, 0, 0, 0, 82, 83, 84, 85, 86, 87, 56,
- 88, 56, 89, 90, 0, 0, 0, 91, 92, 0, 0, 0, 0, 0, 0, 0,
- 93, 94, 95, 0, 96, 97, 0, 0, 98, 0, 0, 0, 0, 0, 0, 99,
- 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 101, 56, 102, 0, 0, 0,
- 0, 0, 103, 0, 0, 0, 0, 0, 0, 104, 105, 56, 106, 107, 108, 109,
- 110, 56, 111, 112, 0, 113, 114, 115, 116, 56, 117, 118, 119, 56, 120, 121,
- 122, 0, 0, 0, 0, 0, 0, 56, 123, 124, 0, 0, 0, 0, 0, 0,
- 125, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 127, 128, 129, 0,
- 0, 130, 131, 132, 0, 0, 0, 51, 133, 0, 0, 0, 0, 134, 135, 0,
- 0, 56, 136, 7, 137, 138, 0, 0, 0, 0, 0, 0, 0, 56, 139, 0,
- 0, 0, 101, 140, 101, 141, 142, 143, 0, 144, 145, 146, 147, 148, 149, 150,
- 0, 151, 152, 153, 154, 148, 155, 156, 157, 158, 159, 160, 0, 161, 162, 163,
- 164, 165, 166, 167, 168, 169, 170, 171, 172, 56, 173, 174, 175, 176, 177, 178,
- 0, 0, 0, 0, 0, 56, 179, 180, 0, 56, 181, 182, 0, 56, 183, 184,
- 185, 186, 187, 188, 0, 0, 0, 0, 0, 56, 189, 0, 0, 0, 0, 0,
- 0, 190, 191, 192, 0, 0, 193, 194, 195, 196, 197, 198, 56, 199, 0, 0,
- 0, 0, 0, 0, 200, 0, 0, 0, 0, 201, 202, 203, 204, 205, 206, 0,
- 0, 207, 208, 209, 210, 211, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 212, 213, 214, 215, 0, 0, 0, 0, 0, 216, 216, 216, 216, 216, 216, 216,
- 216, 216, 217, 218, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
- 219, 220, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,
- 0, 56, 222, 0, 0, 0, 0, 0, 0, 0, 0, 223, 224, 0, 0, 0,
- 0, 56, 56, 225, 226, 227, 0, 0, 228, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 229, 230, 56, 56, 56, 231, 232, 0, 0,
- 0, 0, 0, 0, 233, 0, 0, 0, 0, 56, 234, 235, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 101, 236, 56, 237, 0, 0, 0, 0, 0, 0, 101,
- 238, 0, 0, 0, 0, 0, 0, 101, 239, 56, 56, 240, 0, 0, 0, 0,
- 0, 241, 241, 241, 241, 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, 242,
- 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4,
- 0, 5, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11,
- 11, 11, 11, 0, 0, 0, 9, 12, 0, 2, 2, 2, 2, 13, 14, 0,
- 0, 11, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 17,
- 18, 19, 20, 21, 22, 16, 23, 24, 25, 12, 26, 27, 20, 2, 2, 2,
- 2, 2, 20, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2,
- 2, 28, 29, 30, 2, 2, 2, 9, 30, 9, 30, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 9, 2, 2, 2, 9, 9, 0, 2, 2, 0, 17,
- 18, 19, 20, 31, 32, 33, 32, 34, 0, 0, 0, 0, 35, 0, 0, 2,
- 30, 2, 0, 0, 0, 0, 0, 9, 36, 12, 15, 30, 2, 2, 9, 0,
- 30, 9, 2, 30, 9, 2, 0, 37, 18, 19, 31, 0, 27, 38, 27, 39,
- 0, 40, 0, 0, 0, 30, 2, 9, 9, 0, 0, 0, 2, 2, 2, 2,
- 2, 41, 42, 43, 0, 0, 0, 0, 0, 12, 15, 30, 2, 2, 2, 2,
- 30, 2, 30, 2, 2, 2, 2, 2, 2, 9, 2, 30, 2, 2, 0, 17,
- 18, 19, 20, 21, 27, 22, 35, 24, 0, 0, 0, 0, 0, 30, 41, 41,
- 44, 12, 29, 30, 2, 2, 2, 9, 30, 9, 2, 30, 2, 2, 0, 17,
- 45, 0, 0, 27, 22, 0, 0, 2, 30, 30, 0, 0, 0, 0, 0, 0,
- 0, 0, 46, 30, 2, 2, 9, 0, 2, 9, 2, 2, 0, 30, 9, 9,
- 2, 0, 30, 9, 0, 2, 9, 0, 2, 2, 2, 2, 2, 2, 0, 0,
- 23, 16, 47, 0, 48, 33, 48, 34, 0, 0, 0, 0, 35, 0, 0, 0,
- 0, 15, 29, 49, 2, 2, 2, 9, 2, 9, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 0, 17, 22, 16, 23, 47, 22, 38, 22, 39,
- 0, 0, 0, 27, 31, 2, 9, 0, 0, 10, 29, 30, 2, 2, 2, 9,
- 2, 2, 2, 30, 2, 2, 0, 17, 45, 0, 0, 35, 47, 0, 0, 0,
- 9, 50, 51, 0, 0, 0, 0, 0, 0, 11, 29, 2, 2, 2, 2, 9,
- 2, 2, 2, 2, 2, 2, 52, 53, 23, 19, 20, 31, 48, 33, 48, 34,
- 54, 0, 0, 0, 35, 0, 0, 0, 30, 12, 29, 30, 2, 2, 2, 2,
- 2, 2, 2, 2, 9, 0, 2, 2, 2, 2, 30, 2, 2, 2, 2, 30,
- 0, 2, 2, 2, 9, 0, 55, 0, 35, 23, 22, 31, 31, 18, 48, 48,
- 25, 0, 23, 0, 0, 0, 0, 0, 0, 2, 0, 2, 9, 0, 0, 0,
- 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 2, 56, 56, 57, 0, 0,
- 18, 2, 2, 2, 2, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9,
- 0, 58, 21, 59, 22, 22, 20, 20, 46, 21, 11, 31, 11, 2, 2, 60,
- 61, 61, 61, 61, 61, 62, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 63, 0, 0, 0, 0, 64, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 65, 45, 59, 66, 22, 22, 67, 68, 69, 70,
- 71, 2, 2, 2, 2, 2, 1, 0, 5, 2, 2, 2, 23, 20, 2, 2,
- 72, 71, 73, 74, 65, 73, 29, 29, 2, 52, 22, 53, 2, 2, 2, 2,
- 2, 2, 75, 76, 77, 29, 29, 78, 79, 2, 2, 2, 2, 2, 29, 45,
- 0, 2, 59, 80, 0, 0, 0, 0, 30, 2, 59, 47, 0, 0, 0, 0,
- 0, 2, 59, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 9,
- 2, 9, 59, 0, 0, 0, 0, 0, 0, 2, 2, 81, 45, 22, 59, 20,
- 48, 48, 48, 48, 15, 82, 83, 84, 85, 86, 87, 0, 0, 0, 0, 88,
- 0, 9, 0, 0, 30, 0, 89, 81, 90, 2, 2, 2, 2, 9, 0, 0,
- 0, 42, 42, 91, 92, 2, 2, 2, 2, 2, 2, 2, 2, 13, 9, 0,
- 0, 2, 2, 2, 2, 2, 2, 2, 9, 22, 80, 45, 22, 93, 61, 0,
- 0, 94, 95, 94, 94, 96, 97, 0, 0, 2, 2, 2, 2, 2, 2, 2,
- 0, 2, 2, 9, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0,
- 0, 2, 2, 2, 2, 29, 0, 0, 0, 2, 2, 2, 2, 2, 9, 0,
- 0, 2, 2, 2, 52, 98, 45, 0, 0, 2, 2, 99, 100, 101, 102, 61,
- 63, 103, 16, 45, 22, 59, 21, 80, 48, 48, 76, 11, 11, 11, 104, 46,
- 40, 11, 105, 74, 2, 2, 2, 2, 2, 2, 2, 106, 22, 20, 20, 22,
- 48, 48, 22, 107, 2, 2, 2, 9, 0, 0, 0, 0, 0, 0, 108, 109,
- 109, 109, 109, 0, 0, 0, 0, 0, 0, 105, 74, 2, 2, 2, 2, 2,
- 2, 60, 61, 59, 25, 22, 110, 61, 2, 2, 2, 2, 106, 22, 23, 45,
- 45, 101, 111, 0, 0, 0, 0, 0, 0, 2, 2, 61, 18, 48, 23, 112,
- 101, 101, 101, 113, 114, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 30,
- 2, 11, 46, 115, 115, 115, 11, 115, 115, 15, 115, 115, 115, 26, 0, 40,
- 0, 0, 0, 116, 51, 11, 5, 0, 0, 0, 0, 0, 0, 0, 117, 0,
- 0, 0, 0, 0, 0, 0, 6, 118, 119, 42, 42, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 119, 119, 120, 119, 119, 119, 119, 119, 119, 119,
- 119, 0, 0, 121, 0, 0, 0, 0, 0, 0, 7, 121, 0, 0, 0, 0,
- 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 122, 122, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0,
- 30, 0, 0, 0, 0, 0, 0, 0, 123, 0, 122, 122, 0, 0, 0, 0,
- 0, 2, 53, 2, 107, 2, 10, 2, 2, 2, 65, 19, 16, 0, 0, 31,
- 0, 2, 2, 0, 0, 0, 0, 0, 0, 29, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 124, 23, 23, 23, 23, 23, 23, 23, 125, 0, 0, 0, 0,
- 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 0, 0, 0, 0, 0,
- 52, 2, 2, 2, 22, 22, 126, 115, 0, 2, 2, 2, 127, 20, 59, 20,
- 112, 101, 128, 0, 0, 0, 0, 0, 0, 11, 129, 2, 2, 2, 2, 2,
- 2, 2, 130, 23, 22, 20, 48, 131, 132, 133, 0, 0, 0, 0, 0, 0,
- 0, 2, 2, 52, 30, 2, 2, 2, 2, 2, 2, 2, 2, 10, 22, 59,
- 98, 76, 134, 135, 136, 0, 0, 0, 0, 2, 137, 2, 2, 2, 2, 138,
- 0, 30, 2, 42, 5, 0, 79, 15, 2, 139, 20, 53, 127, 139, 2, 2,
- 140, 10, 9, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 141, 21,
- 25, 0, 0, 142, 143, 0, 0, 0, 0, 2, 65, 45, 23, 80, 47, 144,
- 0, 81, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0,
- 6, 119, 119, 119, 119, 120, 0, 0, 0, 2, 2, 2, 2, 2, 9, 2,
- 2, 2, 9, 2, 30, 2, 2, 2, 2, 2, 30, 2, 2, 2, 30, 9,
- 0, 127, 20, 27, 31, 0, 0, 145, 146, 2, 2, 30, 2, 30, 2, 2,
- 2, 2, 2, 2, 0, 14, 37, 0, 147, 2, 2, 13, 37, 0, 30, 2,
- 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 2, 2,
- 9, 2, 2, 11, 41, 0, 0, 0, 0, 2, 2, 2, 0, 27, 22, 22,
- 30, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 27, 38,
- 0, 2, 2, 2, 115, 115, 115, 115, 115, 148, 2, 9, 0, 0, 0, 0,
- 0, 2, 14, 14, 0, 0, 0, 0, 0, 9, 2, 2, 9, 2, 2, 2,
- 2, 30, 2, 9, 0, 30, 2, 0, 0, 149, 150, 151, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 22, 22, 20, 20, 20, 22, 22, 133, 0, 0, 0,
- 0, 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 2, 2, 2, 2,
- 2, 53, 52, 53, 0, 0, 0, 0, 153, 11, 74, 2, 2, 2, 2, 2,
- 2, 18, 19, 21, 16, 24, 37, 0, 0, 0, 31, 0, 0, 0, 0, 0,
- 0, 11, 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, 127, 20, 22, 154,
- 22, 21, 155, 156, 2, 2, 2, 2, 2, 0, 0, 65, 157, 0, 0, 0,
- 0, 2, 13, 0, 0, 0, 0, 0, 0, 2, 65, 25, 20, 20, 20, 22,
- 22, 107, 158, 0, 0, 56, 159, 31, 160, 30, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 23, 19, 22, 22, 161, 44, 0, 0, 0,
- 49, 127, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 9, 2, 2,
- 30, 2, 2, 2, 2, 2, 2, 2, 30, 2, 2, 2, 2, 2, 2, 2,
- 10, 18, 19, 21, 22, 162, 31, 0, 0, 11, 11, 30, 2, 2, 2, 9,
- 30, 9, 2, 30, 2, 2, 58, 17, 23, 16, 23, 47, 32, 33, 32, 34,
- 0, 0, 0, 0, 35, 0, 0, 0, 2, 2, 23, 0, 11, 11, 11, 46,
- 0, 11, 11, 46, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 30, 0,
- 9, 2, 2, 2, 30, 45, 59, 20, 20, 31, 33, 32, 32, 25, 163, 29,
- 164, 165, 37, 0, 0, 0, 0, 0, 0, 12, 26, 0, 0, 0, 0, 0,
- 0, 2, 2, 65, 25, 20, 20, 20, 22, 23, 125, 15, 17, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 0, 0, 166, 167, 0, 0, 0, 0, 0, 0,
- 0, 18, 19, 20, 20, 66, 98, 25, 160, 11, 168, 9, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 2, 2, 65, 25, 20, 20, 0, 48, 48, 11,
- 169, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 20,
- 0, 23, 19, 20, 20, 21, 16, 82, 169, 38, 0, 0, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 10, 170, 25, 20, 22, 22, 168, 9, 0, 0,
- 0, 2, 2, 2, 2, 2, 9, 43, 135, 23, 22, 20, 76, 21, 22, 0,
- 0, 2, 2, 2, 9, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 18,
- 19, 20, 21, 22, 104, 169, 37, 0, 0, 2, 2, 2, 9, 30, 0, 2,
- 2, 2, 2, 30, 9, 2, 2, 2, 2, 23, 23, 18, 32, 33, 12, 171,
- 165, 172, 173, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 65, 25, 20, 20, 0, 22, 23, 29, 107, 0, 33, 0, 0, 0, 0,
- 0, 52, 20, 22, 22, 22, 139, 2, 2, 2, 174, 140, 11, 15, 175, 61,
- 176, 0, 0, 1, 147, 0, 0, 0, 0, 52, 20, 22, 16, 19, 20, 2,
- 2, 2, 2, 158, 158, 158, 177, 177, 177, 177, 177, 177, 15, 178, 0, 30,
- 0, 16, 20, 16, 16, 0, 0, 0, 0, 22, 20, 20, 31, 22, 22, 11,
- 169, 0, 61, 61, 61, 61, 61, 61, 61, 66, 21, 82, 46, 0, 0, 0,
- 0, 2, 2, 2, 9, 2, 30, 2, 2, 52, 22, 22, 31, 0, 38, 22,
- 27, 11, 159, 179, 180, 0, 0, 0, 0, 2, 2, 2, 30, 9, 2, 2,
- 2, 2, 2, 2, 2, 2, 23, 23, 47, 22, 35, 82, 68, 0, 0, 0,
- 0, 2, 181, 66, 47, 0, 0, 0, 0, 11, 182, 2, 2, 2, 2, 2,
- 2, 2, 2, 23, 22, 20, 31, 0, 48, 16, 143, 0, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 156, 0, 0, 183, 183, 183, 183, 183, 183, 183,
- 183, 184, 184, 184, 185, 186, 184, 183, 183, 187, 183, 183, 188, 189, 189, 189,
- 189, 189, 189, 189, 0, 0, 0, 0, 0, 183, 183, 183, 183, 183, 190, 0,
- 0, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, 22, 22, 191, 192,
- 193, 11, 11, 11, 46, 0, 0, 0, 0, 29, 74, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 65, 47, 0, 2, 2, 2, 2, 2, 9, 0,
- 58, 194, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 0, 0, 0, 40, 115, 26, 0, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 2, 2, 2, 2, 2, 0, 58, 37, 0, 6, 119, 119, 119, 120, 0,
- 0, 11, 11, 11, 49, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0,
- 2, 2, 2, 2, 2, 2, 2, 2, 46, 2, 2, 2, 2, 2, 2, 11,
- 11, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2,
- 20, 2, 2, 44, 44, 44, 92, 0, 0, O, O, O, GB, B, B, O,
- SB, O, SE, GB, O, O, WJ,FMPst,FMPst, O, CGJ, B, O, B,VMAbv,VMAbv,
- VMAbv, O,VMAbv, B,CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst,
- VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, VPst,VMBlw, O, O,
- VAbv, GB,VMAbv,VMPst,VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O,
- VPst,FMAbv, O,CMBlw, O, VAbv, O, VAbv, H, O,VMBlw,VMAbv,CMAbv, GB, GB, O,
- MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, B, O, CS, CS,
- VMPst, B, VAbv, VAbv, B, R, O, HVM, O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv,
- VBlw, B, SUB, SUB, SUB, O, SUB, SUB, O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv,
- VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw,
- VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv,
- FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB,
- CMAbv,CMAbv, B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B,
- MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, H,
- B, O,SMAbv,SMAbv,SMAbv, VPst, IS, RK, RK, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,
- VMBlw,VMAbv, CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, O,FMPst, O, SB, SE, O,
- H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B,CMAbv, VAbv,
- MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, FPst, VBlw,
- B, VBlw,VMAbv, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O,
- IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, HN, VPre, VBlw, VAbv,
- IS,CMAbv, O, VPst, B, R, R,CMBlw, VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,VMPst,
- O,VMAbv,CMBlw, IS, R,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv,
- VPst, MPst, R, MPst,CMBlw, B,FMBlw, CS, SUB, SUB, GB, FBlw, FBlw,CMAbv, IS, VBlw,
- IS, R, MBlw, GB, VAbv, R,VMPst, G, G, J, J, J, SB, SE, J, HR,
- G, G, HM, HM, HM, G, O, MPre, MPre, MPst,VMAbv, MBlw, VBlw, O, VBlw,
+ 33, 3, 0, 0, 0, 4, 0, 80, 118, 128, 9, 10, 11, 192, 208, 14,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 4, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 0,
+ 13, 14, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 19, 20, 21, 0,
+ 0, 22, 0, 0, 0, 0, 23, 0, 24, 0, 0, 0, 0, 0, 25, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31,
+ 32, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 34, 35, 0, 36, 37,
+ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 60, 0,
+ 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0,
+ 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 66, 67, 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0,
+ 0, 2, 71, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 12, 7, 7, 0, 13, 14,
+ 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 8, 17, 0, 0, 18, 0, 0, 0, 0,
+ 0, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 9, 46, 47, 48,
+ 49, 50, 51, 52, 9, 53, 54, 55, 56, 57, 58, 10, 59, 60, 61, 62,
+ 0, 3, 63, 64, 65, 66, 0, 0, 0, 67, 68, 69, 70, 3, 71, 72,
+ 6, 73, 3, 3, 74, 75, 76, 0, 0, 77, 78, 79, 80, 3, 81, 82,
+ 0, 83, 3, 84, 85, 86, 0, 0, 0, 87, 88, 89, 90, 91, 92, 3,
+ 93, 3, 94, 95, 0, 0, 0, 96, 97, 0, 0, 0, 0, 0, 0, 0,
+ 98, 99, 100, 0, 101, 102, 0, 0, 103, 0, 0, 0, 0, 0, 0, 104,
+ 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 5, 3, 106, 0, 0, 0,
+ 0, 0, 107, 0, 0, 0, 0, 0, 0, 108, 109, 3, 110, 111, 112, 113,
+ 114, 3, 115, 116, 0, 117, 118, 119, 120, 3, 121, 122, 123, 3, 124, 125,
+ 126, 0, 0, 0, 0, 0, 0, 3, 127, 128, 0, 0, 0, 0, 0, 0,
+ 129, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 131, 132, 133, 0,
+ 0, 134, 135, 136, 0, 0, 0, 10, 137, 0, 0, 0, 0, 138, 139, 0,
+ 0, 3, 140, 8, 141, 142, 0, 0, 0, 0, 0, 0, 0, 3, 143, 0,
+ 0, 0, 5, 144, 5, 145, 146, 147, 0, 148, 149, 150, 151, 11, 152, 153,
+ 0, 154, 155, 156, 157, 11, 158, 159, 160, 161, 162, 163, 0, 164, 165, 166,
+ 167, 168, 169, 170, 171, 172, 173, 174, 175, 3, 176, 177, 178, 179, 180, 181,
+ 0, 0, 0, 0, 0, 3, 182, 183, 0, 3, 184, 185, 0, 3, 186, 187,
+ 188, 189, 190, 191, 0, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 0,
+ 0, 193, 194, 195, 0, 0, 196, 197, 198, 199, 200, 201, 3, 202, 0, 0,
+ 0, 0, 0, 0, 203, 0, 0, 0, 0, 204, 205, 206, 207, 208, 209, 0,
+ 0, 210, 211, 212, 213, 214, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 215, 216, 217, 218, 0, 0, 0, 0, 0, 1, 219, 220, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 221, 222, 223, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 224, 0, 0, 0, 0, 0,
+ 0, 0, 0, 225, 226, 0, 0, 0, 0, 3, 3, 227, 228, 229, 0, 0,
+ 230, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 231,
+ 232, 3, 3, 3, 233, 234, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0,
+ 0, 3, 236, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 238, 3,
+ 239, 0, 0, 0, 0, 0, 0, 5, 240, 0, 0, 0, 0, 0, 0, 5,
+ 241, 3, 3, 242, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4,
+ 243, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4,
+ 4, 2, 2, 2, 2, 5, 2, 2, 2, 2, 6, 0, 2, 2, 2, 2,
+ 2, 5, 8, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2,
+ 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5,
+ 0, 2, 2, 2, 2, 5, 0, 0, 0, 2, 2, 2, 2, 2, 5, 0,
+ 0, 2, 8, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 74, 75,
+ 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+ 2, 0, 2, 2, 2, 2, 2, 2, 2, 17, 6, 13, 29, 33, 29, 45,
+ 0, 15, 11, 27, 7, 38, 7, 68, 0, 2, 2, 2, 2, 8, 2, 2,
+ 2, 10, 10, 10, 10, 80, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2,
+ 5, 2, 2, 5, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0,
+ 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 5, 2,
+ 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0,
+ 0, 9, 41, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 23, 6, 6, 6, 6, 6, 6, 6,
+ 6, 0, 0, 0, 0, 0, 0, 48, 0, 44, 0, 0, 0, 0, 0, 49,
+ 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 103, 2, 2, 2, 2, 2, 36, 9,
+ 9, 9, 9, 0, 0, 0, 5, 31, 0, 2, 2, 2, 2, 50, 51, 0,
+ 0, 9, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 32,
+ 19, 17, 6, 18, 7, 15, 11, 67, 22, 31, 52, 25, 6, 2, 2, 2,
+ 2, 104, 14, 8, 2, 2, 2, 5, 8, 5, 5, 0, 2, 2, 0, 32,
+ 19, 0, 0, 0, 34, 0, 0, 2, 8, 2, 0, 0, 0, 0, 0, 5,
+ 105, 31, 24, 8, 2, 2, 5, 0, 8, 5, 2, 8, 5, 2, 0, 35,
+ 19, 17, 13, 0, 25, 38, 25, 68, 0, 53, 0, 0, 0, 8, 2, 5,
+ 5, 54, 39, 77, 0, 0, 0, 0, 0, 31, 24, 8, 2, 2, 2, 2,
+ 8, 5, 2, 8, 2, 2, 0, 32, 19, 17, 6, 18, 25, 7, 34, 67,
+ 0, 0, 0, 0, 0, 8, 54, 54, 46, 31, 14, 8, 2, 2, 2, 5,
+ 8, 5, 2, 8, 2, 2, 0, 32, 20, 0, 0, 25, 7, 0, 0, 2,
+ 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 26, 8, 2, 2, 5, 0,
+ 2, 5, 2, 2, 0, 8, 5, 5, 2, 0, 8, 5, 0, 2, 5, 0,
+ 2, 2, 2, 2, 2, 2, 0, 0, 11, 15, 27, 0, 12, 33, 12, 45,
+ 0, 0, 0, 0, 34, 0, 0, 0, 0, 24, 14, 55, 2, 2, 2, 5,
+ 2, 2, 2, 2, 2, 2, 0, 32, 7, 0, 0, 25, 13, 2, 5, 0,
+ 0, 36, 14, 8, 2, 2, 2, 5, 2, 2, 2, 8, 2, 2, 0, 32,
+ 20, 0, 0, 34, 27, 0, 0, 0, 5, 106, 78, 0, 0, 0, 0, 0,
+ 0, 9, 14, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 30, 40,
+ 11, 17, 6, 13, 12, 33, 12, 45, 107, 0, 0, 0, 34, 0, 0, 0,
+ 8, 31, 14, 8, 2, 2, 2, 2, 2, 2, 2, 2, 5, 0, 2, 2,
+ 2, 2, 8, 2, 2, 2, 2, 8, 0, 2, 2, 2, 5, 0, 108, 0,
+ 34, 11, 7, 13, 13, 19, 12, 12, 22, 0, 11, 0, 0, 0, 0, 0,
+ 0, 2, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0,
+ 0, 2, 2, 69, 69, 109, 0, 0, 19, 56, 18, 21, 7, 7, 6, 6,
+ 26, 18, 9, 13, 9, 2, 2, 79, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 81, 0, 0, 0, 0, 110, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 23, 20, 21, 57, 7, 7, 111, 82, 112, 113,
+ 83, 2, 2, 2, 2, 2, 48, 0, 44, 2, 2, 2, 11, 6, 2, 2,
+ 114, 83, 84, 41, 23, 84, 14, 14, 2, 30, 7, 40, 2, 2, 2, 2,
+ 2, 2, 115, 58, 116, 14, 14, 117, 85, 2, 2, 2, 2, 2, 14, 20,
+ 0, 2, 21, 59, 0, 0, 0, 0, 8, 2, 21, 27, 0, 0, 0, 0,
+ 0, 2, 21, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 5,
+ 2, 5, 21, 0, 0, 0, 0, 0, 0, 2, 2, 4, 20, 7, 21, 6,
+ 12, 12, 12, 12, 24, 60, 118, 119, 120, 121, 122, 0, 0, 0, 0, 123,
+ 0, 5, 0, 0, 8, 0, 124, 4, 125, 39, 39, 126, 86, 2, 2, 2,
+ 2, 2, 2, 2, 2, 50, 5, 0, 0, 7, 59, 20, 7, 127, 10, 0,
+ 0, 70, 128, 70, 70, 129, 130, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+ 0, 2, 2, 2, 2, 14, 0, 0, 0, 2, 2, 2, 30, 71, 20, 0,
+ 0, 2, 2, 131, 132, 42, 133, 10, 81, 134, 15, 20, 7, 21, 18, 59,
+ 12, 12, 58, 9, 9, 9, 87, 26, 53, 9, 88, 41, 2, 2, 2, 2,
+ 2, 2, 2, 89, 7, 6, 6, 7, 12, 12, 7, 61, 2, 2, 2, 5,
+ 0, 0, 0, 0, 0, 0, 135, 62, 62, 62, 62, 0, 0, 0, 0, 0,
+ 0, 88, 41, 2, 2, 2, 2, 2, 2, 79, 10, 21, 22, 7, 136, 10,
+ 2, 2, 2, 2, 89, 7, 11, 20, 20, 42, 137, 0, 0, 0, 0, 0,
+ 0, 2, 2, 10, 19, 12, 11, 90, 42, 42, 42, 138, 139, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 0, 8, 2, 9, 26, 16, 16, 16, 9, 16,
+ 16, 24, 16, 16, 16, 52, 0, 53, 0, 0, 0, 140, 78, 9, 44, 0,
+ 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 49, 142,
+ 3, 39, 39, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
+ 72, 0, 0, 91, 0, 0, 0, 0, 0, 0, 76, 91, 0, 0, 0, 0,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
+ 0, 0, 0, 0, 63, 63, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0, 143, 0, 63, 63, 0, 0, 0, 0,
+ 0, 2, 40, 2, 61, 2, 36, 2, 2, 2, 23, 17, 15, 0, 0, 13,
+ 0, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 144, 11, 11, 11, 11,
+ 11, 11, 11, 92, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 2, 0, 0, 0, 0, 0, 30, 2, 2, 2, 7, 7, 145, 16,
+ 0, 2, 2, 2, 47, 6, 21, 6, 90, 42, 146, 0, 0, 0, 0, 0,
+ 0, 9, 147, 2, 2, 2, 2, 2, 2, 2, 148, 11, 7, 6, 12, 149,
+ 150, 93, 0, 0, 0, 0, 0, 0, 0, 2, 2, 30, 8, 2, 2, 2,
+ 2, 2, 2, 2, 2, 36, 7, 21, 71, 58, 151, 94, 152, 0, 0, 0,
+ 0, 2, 153, 2, 2, 2, 2, 154, 0, 8, 2, 39, 44, 0, 85, 24,
+ 2, 73, 6, 40, 47, 73, 2, 2, 95, 36, 5, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 155, 18, 22, 0, 0, 156, 96, 0, 0, 0,
+ 0, 2, 23, 20, 11, 59, 27, 157, 0, 0, 0, 0, 0, 0, 0, 0,
+ 49, 3, 3, 3, 3, 72, 0, 0, 0, 2, 5, 2, 8, 2, 2, 2,
+ 2, 2, 8, 2, 2, 2, 8, 5, 0, 47, 6, 25, 13, 0, 0, 158,
+ 159, 2, 2, 8, 2, 8, 2, 2, 2, 2, 2, 2, 0, 51, 35, 0,
+ 97, 2, 2, 50, 35, 0, 8, 2, 2, 0, 0, 0, 0, 8, 2, 2,
+ 5, 2, 2, 9, 54, 0, 0, 0, 0, 2, 2, 2, 0, 25, 7, 7,
+ 8, 2, 2, 2, 2, 2, 25, 38, 0, 2, 2, 2, 16, 16, 16, 16,
+ 16, 160, 2, 5, 0, 0, 0, 0, 0, 2, 51, 51, 0, 0, 0, 0,
+ 0, 5, 2, 2, 5, 2, 2, 2, 2, 8, 2, 5, 0, 8, 2, 0,
+ 0, 161, 162, 163, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 6,
+ 6, 6, 7, 7, 93, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 2, 2, 2, 2, 2, 40, 30, 40, 0, 0, 0, 0,
+ 164, 19, 17, 18, 15, 67, 35, 0, 0, 0, 13, 0, 0, 0, 0, 0,
+ 0, 9, 55, 2, 2, 2, 2, 2, 2, 2, 2, 2, 47, 6, 7, 165,
+ 7, 18, 166, 98, 2, 2, 2, 2, 2, 0, 0, 23, 167, 0, 0, 0,
+ 0, 2, 50, 0, 0, 0, 0, 0, 0, 2, 23, 22, 6, 6, 6, 7,
+ 7, 61, 64, 0, 0, 69, 99, 13, 100, 2, 2, 2, 2, 2, 2, 11,
+ 17, 7, 7, 168, 46, 0, 0, 0, 55, 47, 0, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 5, 5, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2,
+ 8, 2, 2, 2, 2, 2, 2, 2, 36, 19, 17, 18, 7, 169, 13, 0,
+ 0, 9, 9, 8, 2, 2, 2, 5, 8, 5, 2, 8, 2, 2, 56, 32,
+ 11, 15, 11, 27, 29, 33, 29, 45, 0, 0, 0, 0, 34, 0, 0, 0,
+ 2, 2, 11, 0, 9, 9, 9, 26, 0, 9, 9, 26, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 8, 0, 5, 2, 2, 2, 8, 20, 21, 6,
+ 6, 13, 33, 29, 29, 22, 170, 14, 171, 101, 35, 0, 0, 0, 0, 0,
+ 0, 31, 52, 0, 0, 0, 0, 0, 0, 2, 2, 23, 22, 6, 6, 6,
+ 7, 11, 92, 24, 32, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0,
+ 172, 173, 0, 0, 0, 0, 0, 0, 0, 19, 17, 6, 6, 57, 71, 22,
+ 100, 9, 102, 5, 0, 0, 0, 0, 0, 22, 6, 6, 0, 12, 12, 9,
+ 65, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 6,
+ 0, 11, 17, 6, 6, 18, 15, 60, 65, 38, 0, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 36, 174, 22, 6, 7, 7, 102, 5, 0, 0,
+ 0, 2, 2, 2, 2, 2, 5, 77, 94, 11, 7, 6, 58, 18, 7, 0,
+ 0, 2, 2, 2, 5, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 19,
+ 17, 6, 18, 7, 87, 65, 35, 0, 0, 2, 2, 2, 5, 8, 0, 2,
+ 2, 2, 2, 8, 5, 2, 2, 2, 2, 11, 11, 19, 29, 33, 31, 175,
+ 101, 176, 177, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2,
+ 2, 23, 22, 6, 6, 0, 7, 11, 14, 61, 0, 33, 0, 0, 0, 0,
+ 0, 30, 6, 7, 7, 7, 73, 2, 2, 2, 178, 95, 9, 24, 179, 10,
+ 180, 0, 0, 48, 97, 0, 0, 0, 0, 30, 6, 7, 15, 17, 6, 2,
+ 2, 2, 2, 64, 64, 64, 43, 43, 43, 43, 43, 43, 24, 181, 0, 8,
+ 0, 15, 6, 15, 15, 0, 0, 0, 0, 7, 6, 6, 13, 7, 7, 9,
+ 65, 0, 10, 10, 10, 10, 10, 10, 10, 57, 18, 60, 26, 0, 0, 0,
+ 0, 2, 2, 2, 5, 2, 8, 2, 2, 30, 7, 7, 13, 0, 38, 7,
+ 25, 9, 99, 182, 183, 0, 0, 0, 0, 2, 2, 2, 8, 5, 2, 2,
+ 2, 2, 2, 2, 2, 2, 11, 11, 27, 7, 34, 60, 82, 0, 0, 0,
+ 0, 2, 184, 57, 27, 0, 0, 0, 0, 9, 185, 2, 2, 2, 2, 2,
+ 2, 2, 2, 11, 7, 6, 13, 0, 12, 15, 96, 0, 0, 0, 0, 0,
+ 0, 2, 2, 2, 2, 2, 98, 0, 0, 66, 66, 66, 186, 187, 66, 1,
+ 1, 188, 1, 1, 189, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 190, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+ 7, 7, 7, 7, 7, 7, 191, 192, 193, 9, 9, 9, 26, 0, 0, 0,
+ 0, 14, 41, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 23, 27,
+ 0, 2, 2, 2, 2, 2, 5, 0, 56, 194, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 0, 0, 53, 16, 52, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 2, 2, 2, 2, 2, 0, 56, 35, 0, 49, 3, 3, 3, 72, 0,
+ 0, 9, 9, 9, 55, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 26, 2, 2, 2, 2, 2, 2, 9,
+ 9, 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2, 2,
+ 6, 2, 2, 46, 46, 46, 86, 0, 0, O, O, G, G, B, B, WJ,
+ WJ, CGJ, CGJ, B, O, VBlw, VBlw, VAbv, VAbv, O, B,VMAbv,VMAbv, SUB, SUB, VPst,
+ VPst, VPre, VPre, VBlw, O,VMPst,VMPst, VAbv, VPst,VMBlw,VMBlw, VPst, VBlw, VBlw, VAbv, VPst,
+ VPre, VPst, VAbv, VAbv, VBlw, VPre, VPst, B, VPst,VMAbv,VMPst, O, VAbv,VMAbv, O, VPst,
+ O, N, N, O, VPre, B, VAbv, O,VMAbv,CMBlw, B, VPre, O, O, VPst,CMBlw,
+ O, B,VMAbv, HM, HM, VAbv, O, GB, GB, VAbv, B,VMPst, B, FAbv, FAbv, FBlw,
+ FBlw, GB, O, VPre, H,CMAbv,CMAbv, B, VBlw, O, GB, O, WJ, B,CMBlw,CMBlw,
+ CMBlw,VMBlw, O, O,VMBlw,VMAbv,CMAbv,VMAbv, B, O,CMBlw, VBlw, VPre, VPre, VAbv, VBlw,
+ VPst, VPst,VMAbv, H, B,SMAbv,SMAbv, SB, SE, R, R,VMPst, H, J, J, VPst,
+ H, VAbv, H, O,FMBlw, FPst, FPst, VAbv, VPre, WJ, O, VBlw, B, O, SB, O,
+ SE,FMPst,FMPst, O, MBlw, CS,VMPst, B, SUB, O, SUB, SUB, O,VMPst, IS, MBlw,
+ B, VPst,VMPst, B,VMPst,CMAbv, B, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, VBlw, FAbv,FMPst,
+ O, H,VMAbv, H, O, MPre, MAbv, VBlw,VMAbv, IS, O, O, IS,CMAbv, O,CMBlw,
+ VAbv, VPre,VMAbv, IS, R, H,CMBlw, O, CGJ, GB,VMAbv,FMAbv, O, O, CS, R,
+ O, HVM, O, O,CMAbv,FMBlw, O,VMAbv,VMBlw, VAbv, MPst, MPre, MBlw, MBlw, MBlw, MBlw,
+ VPst, VAbv,VMPst,VMPst,VMBlw,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv, IS,FMAbv, B,
+ FMAbv, B, CGJ, WJ, CGJ, GB,CMAbv, VAbv, SUB,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, B,
+ MPre, MBlw, SUB, MAbv, SUB, Sk, VPst, O,SMAbv, VPst, IS, RK, RK,VMPre,VMPre,FMAbv,
+ CMBlw,VMAbv, CS, O,FMAbv, ZWNJ, CGJ, O, H, MPst, VPst, VAbv,VMBlw, FPst, VPst, FAbv,
+ VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, VBlw, MPst, MBlw, O, B, FAbv, FAbv, FPst, B,
+ VPre, O,VMPst,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS,
+ B, O, HN, VPre, VBlw, VAbv, IS, VPst, B,VMAbv, H, VAbv,CMBlw,VMPst, O,VMAbv,
+ CMBlw,FMAbv, B, CS, CS,VMPst, VAbv,VMAbv, VPst, MPst, R, MPst,CMBlw, B,FMBlw, CS,
+ SUB, SUB, GB,CMAbv, IS, VBlw, IS, R, MBlw, GB, VAbv, R,VMPst, J, SB, SE,
+ J, HR, G, G, HM, G, O, MPre, MPre, MPst,VMAbv, MBlw, VBlw, O, VBlw,
};
static const uint16_t hb_use_u16[488]=
{
- 0, 0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9, 10,
- 11, 12, 10, 13, 14, 10, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 18, 26, 27, 21, 22, 28, 29, 30, 31, 32, 33, 34, 22, 35,
- 36, 0, 18, 37, 38, 21, 22, 39, 24, 40, 18, 41, 42, 43, 44, 45,
- 46, 47, 31, 0, 48, 49, 22, 50, 51, 52, 18, 0, 53, 49, 22, 54,
- 51, 55, 18, 56, 57, 49, 10, 58, 59, 60, 61, 62, 10, 63, 64, 65,
- 31, 66, 67, 68, 10, 69, 70, 10, 71, 72, 73, 74, 75, 76, 77, 0,
- 10, 10, 78, 79, 80, 81, 82, 83, 84, 85, 10, 86, 10, 87, 10, 88,
- 89, 90, 10, 91, 92, 93, 2, 0, 94, 0, 10, 95, 96, 10, 97, 0,
- 10, 98, 99,100, 31, 10,101,102,103, 10,104,105, 10,106, 10,107,
- 108,109, 2, 2,110, 10, 10,111,112, 2,113,114,115, 10,116, 10,
- 117,118,119,120,121, 0, 0,122,123,124, 0,125,126,127,128, 0,
- 129,130,131, 0, 0,132,133, 0,134, 0, 0, 10,135,136,137, 0,
- 138, 10,139, 0, 10,140,141, 10, 10,142,143, 2,144,145,146, 10,
- 147,148,149, 10, 10,150,151, 2,152, 98,153,154,155, 2, 10,156,
- 10,157,158, 0,159,160,161, 2,162, 0, 0,163, 0,164, 0,165,
- 165,166, 34,167,168,169, 10,170, 95, 0,171, 0, 10,172,173, 0,
- 174, 2,175, 10,176, 0,177,172,178,179,180, 0, 0,181,182, 0,
- 183, 10, 10,184,185,186,187,188,189, 10, 10,190,191, 0,192, 10,
- 193,194,195, 10, 10,196, 10,197,198,105,199,102, 10, 34,200,201,
- 202, 0,203,204, 95, 10, 10,205,206, 2,207, 21, 22,208,209,210,
- 211,212,213, 10, 10,214,215,216,217, 0, 10,218,219,220,221, 0,
- 199, 10, 10,222,223, 2,224,225,226,227, 10,228,229, 2,230,231,
- 2, 10,140, 0, 10,232,233,103,234, 0,235,236,237,238, 10,239,
- 240, 2,241, 10, 10,242,243, 0,244, 10, 10,245,246,247,248,249,
- 250, 0, 22, 10,224,251, 8, 10, 71, 19, 10,252, 74,253,254, 10,
- 10,255,256, 2,257, 10,258,259, 10,260,261, 49, 10,262,263,264,
- 265,265,265,266,267,268,265,269, 10,270,271, 2, 10,272,273, 10,
- 274, 2,275,276,277,277,278,279,280, 0, 10,176, 0,281,105, 71,
- 95,282, 0,283, 71,284,285, 0,286, 0,287, 2,288, 2,289,105,
- 290, 2,129,129,162,162,162,129,
+ 0, 0, 8, 8, 16, 16, 24, 24, 40, 40, 0, 24, 32, 0, 0, 120,
+ 136, 24, 56, 0, 168, 24, 240, 24, 272, 32, 280, 288, 0, 296, 304, 0,
+ 128, 0, 312, 320, 24, 328, 336, 24, 24, 344, 352, 360, 56, 144, 368, 64,
+ 48, 376, 152, 384, 56, 392, 400, 64, 48, 408, 416, 424, 72, 432, 440, 112,
+ 48, 448, 456, 0, 56, 464, 472, 64, 48, 480, 152, 488, 56, 496, 504, 512,
+ 520, 528, 536, 544, 72, 0, 552, 80, 48, 560, 160, 568, 576, 80, 48, 584,
+ 160, 592, 56, 600, 608, 80, 24, 616, 624, 632, 640, 648, 24, 656, 664, 672,
+ 72, 680, 688, 696, 24, 704, 88, 712, 720, 176, 728, 736, 744, 0, 752, 760,
+ 768, 776, 784, 792, 800, 808, 24, 816, 24, 824, 24, 832, 840, 848, 24, 856,
+ 864, 872, 880, 0, 24, 96, 888, 24, 896, 0, 24, 184, 904, 912, 72, 24,
+ 920, 192, 200, 24, 928, 104, 24, 936, 24, 944, 952, 960, 32, 32, 968, 24,
+ 24, 976, 984, 32, 992,1000,1008, 24,1016, 24,1024,1032,1040,1048,1056, 0,
+ 0,1064,1072,1080, 0,1088,1096,1104,1112, 0, 16,1120,1128, 0, 0,1136,
+ 1144, 0,1152, 0,1160,1168,1176, 0,1184, 24,1192, 0, 24, 208,1200, 24,
+ 24,1208,1216, 32,1224,1232,1240, 24,1248,1256,1264, 24, 24,1272,1280, 32,
+ 1288, 184,1296,1304,1312, 32, 24,1320, 24,1328,1336, 0,1344,1352,1360, 32,
+ 40, 0, 0,1368, 0,1376, 0, 216, 216,1384, 112,1392,1400,1408, 24,1416,
+ 96, 0,1424, 0, 24, 224,1432, 0,1440, 32,1448, 24, 232, 0,1456, 224,
+ 1464,1472,1480, 0, 0,1488,1496, 0,1504, 24, 24,1512,1520,1528,1536,1544,
+ 24,1552,1560, 0,1568, 24,1576,1584,1592, 24, 24,1600, 24,1608,1616, 104,
+ 248, 192, 24, 112,1624,1632,1640, 0,1648,1656, 96, 24, 24,1664,1672, 32,
+ 1680, 64, 48,1688,1696,1704,1712,1720,1728, 24, 24,1736,1744,1752,1760, 0,
+ 24,1768,1776,1784,1792, 0, 248, 24, 24,1800,1808, 32, 256,1816,1824,1832,
+ 24,1840,1848, 32,1856,1864, 32, 24, 208, 0, 24,1872,1880, 200,1888, 0,
+ 1896,1904,1912,1920, 24,1928,1936, 32,1944, 24, 24,1952,1960, 0,1968, 24,
+ 24,1976,1984,1992,2000,2008,2016, 0, 48, 24, 256,2024, 128, 24, 88, 144,
+ 24,2032, 176,2040,2048, 24, 24,2056,2064, 32,2072, 24,2080,2088, 24,2096,
+ 2104, 80, 24,2112,2120,2128, 8,2136,2144,2152, 8,2160, 24,2168,2176, 32,
+ 24,2184,2192, 24,2200, 32,2208,2216, 264, 264,2224,2232,2240, 0, 24, 232,
+ 0,2248, 104, 88, 96,2256, 0,2264, 88,2272,2280, 0,2288, 0,2296, 32,
+ 2304, 32,2312, 104,2320, 32, 40, 16,
};
static inline uint8_t hb_use_b4 (const uint8_t* a, unsigned i)
@@ -660,7 +661,8 @@
}
static inline uint8_t hb_use_get_category (unsigned u)
{
- return u<921600 ? hb_use_u8[3273u+((hb_use_u8[945u+((hb_use_u16[((hb_use_u8[369u+((hb_use_u8[113u+((hb_use_b4(hb_use_u8,((((((((((u)>>1))>>3))>>1))>>3))>>4)))<<4)+((((((((((u)>>1))>>3))>>1))>>3))&15)])<<3)+((((((((u)>>1))>>3))>>1))&7)])<<1)+((((((u)>>1))>>3))&1)])<<3)+((((u)>>1))&7)])<<1)+((u)&1)] : O;
+ /* packtab: [2^4,2^4,2^3,2^1,2^3,2^1] */
+ return u<921600u ? (uint8_t)(hb_use_u8[3273u+((hb_use_u8[945u+hb_use_u16[((hb_use_u8[369u+((hb_use_u8[113u+((hb_use_b4(hb_use_u8,((((((((((u)>>1))>>3))>>1))>>3))>>4)))<<4)+((((((((((u)>>1))>>3))>>1))>>3))&15)])<<3)+((((((((u)>>1))>>3))>>1))&7)])<<1)+((((((u)>>1))>>3))&1)]+((((u)>>1))&7)])<<1)+((u)&1)]) : O;
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc 2026-07-13 06:55:55.000000000 +0000
@@ -2,7 +2,7 @@
/*
* The following functions are generated by running:
*
- * ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt
+ * gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt
*
* on files with these headers:
*
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh 2026-07-13 06:55:55.000000000 +0000
@@ -2,7 +2,7 @@
/*
* The following table is generated by running:
*
- * ./gen-tag-table.py languagetags language-subtag-registry
+ * gen-tag-table.py languagetags language-subtag-registry
*
* on files with these headers:
*
@@ -221,55 +221,201 @@
};
#ifndef HB_NO_LANGUAGE_LONG
+static const hb_tag_t ot_languages3_blocked[] = {
+ HB_TAG('a','b','a',' '), /* Abé != Abaza */
+ HB_TAG('a','f','k',' '), /* Nanubae != Afrikaans */
+ HB_TAG('a','g','w',' '), /* Kahua != Agaw */
+ HB_TAG('a','r','i',' '), /* Arikara != Aari */
+ HB_TAG('a','r','k',' '), /* Arikapú != Rakhine */
+ HB_TAG('b','a','g',' '), /* Tuki != Baghelkhandi */
+ HB_TAG('b','a','u',' '), /* Bada (Nigeria) != Baulé */
+ HB_TAG('b','b','r',' '), /* Girawa != Berber */
+ HB_TAG('b','c','h',' '), /* Bariai != Bench */
+ HB_TAG('b','i','l',' '), /* Bile != Bilen */
+ HB_TAG('b','k','f',' '), /* Beeke != Blackfoot */
+ HB_TAG('b','l','i',' '), /* Bolia != Baluchi */
+ HB_TAG('b','l','t',' '), /* Tai Dam != Balti */
+ HB_TAG('b','m','b',' '), /* Bembe != Bambara (Bamanankan) */
+ HB_TAG('b','m','l',' '), /* Bomboli != Bamileke */
+ HB_TAG('b','r','i',' '), /* Mokpwe != Braj Bhasha */
+ HB_TAG('b','r','m',' '), /* Barambu != Burmese */
+ HB_TAG('b','s','h',' '), /* Kati != Bashkir */
+ HB_TAG('b','t','i',' '), /* Burate != Beti */
+ HB_TAG('c','h','g',' '), /* Chagatai != Chaha Gurage */
+ HB_TAG('c','h','h',' '), /* Chinook != Chattisgarhi */
+ HB_TAG('c','r','r',' '), /* Carolina Algonquian != Carrier */
+ HB_TAG('c','r','t',' '), /* Iyojwa'ja Chorote != Crimean Tatar */
+ HB_TAG('c','s','l',' '), /* Chinese Sign Language != Church Slavonic */
+ HB_TAG('d','h','v',' '), /* Dehu != Divehi (Dhivehi, Maldivian) (deprecated) */
+ HB_TAG('d','n','k',' '), /* Dengka != Dinka */
+ HB_TAG('d','r','i',' '), /* C'Lela != Dari */
+ HB_TAG('d','u','n',' '), /* Dusun Deyah != Dungan */
+ HB_TAG('d','z','n',' '), /* Dzando != Dzongkha */
+ HB_TAG('e','c','r',' '), /* Eteocretan != Eastern Cree */
+ HB_TAG('e','u','q',' '), /* Basque [collection] != Basque */
+ HB_TAG('f','a','r',' '), /* Fataleka != Persian */
+ HB_TAG('f','o','s',' '), /* Siraya != Faroese */
+ HB_TAG('g','a','d',' '), /* Gaddang != Ga */
+ HB_TAG('g','a','e',' '), /* Guarequena != Scottish Gaelic */
+ HB_TAG('g','a','l',' '), /* Galolen != Galician */
+ HB_TAG('g','a','r',' '), /* Galeya != Garshuni */
+ HB_TAG('g','a','w',' '), /* Nobonob != Garhwali */
+ HB_TAG('g','m','z',' '), /* Mgbolizhia != Gumuz */
+ HB_TAG('g','r','o',' '), /* Groma != Garo */
+ HB_TAG('g','u','a',' '), /* Shiki != Guarani */
+ HB_TAG('h','a','l',' '), /* Halang != Halam (Falam Chin) */
+ HB_TAG('h','b','n',' '), /* Heiban != Hammer-Banna */
+ HB_TAG('i','r','i',' '), /* Rigwe != Irish */
+ HB_TAG('i','s','m',' '), /* Masimasi != Inari Sami */
+ HB_TAG('j','a','n',' '), /* Jandai != Japanese */
+ HB_TAG('j','i','i',' '), /* Jiiddu != Yiddish */
+ HB_TAG('j','u','d',' '), /* Worodougou != Ladino */
+ HB_TAG('j','u','l',' '), /* Jirel != Jula */
+ HB_TAG('k','a','c',' '), /* Kachin != Kachchi */
+ HB_TAG('k','e','b',' '), /* Kélé != Kebena */
+ HB_TAG('k','g','e',' '), /* Komering != Khutsuri Georgian */
+ HB_TAG('k','h','n',' '), /* Khandesi != Khamti Shan (Microsoft fonts) */
+ HB_TAG('k','h','s',' '), /* Kasua != Khanty-Shurishkar */
+ HB_TAG('k','h','v',' '), /* Khvarshi != Khanty-Vakhi */
+ HB_TAG('k','i','s',' '), /* Kis != Kisii */
+ HB_TAG('k','k','n',' '), /* Kon Keu != Kokni */
+ HB_TAG('k','l','m',' '), /* Migum != Kalmyk */
+ HB_TAG('k','m','n',' '), /* Awtuw != Kumaoni */
+ HB_TAG('k','m','o',' '), /* Kwoma != Komo */
+ HB_TAG('k','m','s',' '), /* Kamasau != Komso */
+ HB_TAG('k','n','r',' '), /* Kaningra != Kanuri */
+ HB_TAG('k','o','d',' '), /* Kodi != Kodagu */
+ HB_TAG('k','o','h',' '), /* Koyo != Korean Old Hangul */
+ HB_TAG('k','o','p',' '), /* Waube != Komi-Permyak */
+ HB_TAG('k','o','z',' '), /* Korak != Komi-Zyrian */
+ HB_TAG('k','p','l',' '), /* Kpala != Kpelle */
+ HB_TAG('k','r','k',' '), /* Kerek != Karakalpak */
+ HB_TAG('k','r','m',' '), /* Krim (retired code) != Karaim */
+ HB_TAG('k','r','n',' '), /* Sapo != Karen */
+ HB_TAG('k','s','i',' '), /* Krisa != Khasi */
+ HB_TAG('k','s','m',' '), /* Kumba != Kildin Sami */
+ HB_TAG('k','u','i',' '), /* Kuikúro-Kalapálo != Kui */
+ HB_TAG('k','u','l',' '), /* Kulere != Kulvi */
+ HB_TAG('k','u','y',' '), /* Kuuku-Ya'u != Kuy */
+ HB_TAG('k','y','k',' '), /* Kamayo != Koryak */
+ HB_TAG('l','a','h',' '), /* Lahnda [macrolanguage] != Lahuli */
+ HB_TAG('l','a','k',' '), /* Laka (Nigeria) (retired code) != Lak */
+ HB_TAG('l','a','m',' '), /* Lamba != Lambani */
+ HB_TAG('l','a','z',' '), /* Aribwatsa != Laz */
+ HB_TAG('l','d','k',' '), /* Leelau != Ladakhi */
+ HB_TAG('l','m','a',' '), /* East Limba != Low Mari */
+ HB_TAG('l','m','b',' '), /* Merei != Limbu */
+ HB_TAG('l','m','w',' '), /* Lake Miwok != Lomwe */
+ HB_TAG('l','s','b',' '), /* Burundian Sign Language != Lower Sorbian */
+ HB_TAG('l','t','h',' '), /* Thur != Lithuanian */
+ HB_TAG('l','v','i',' '), /* Lavi != Latvian */
+ HB_TAG('m','a','j',' '), /* Jalapa De Díaz Mazatec != Majang */
+ HB_TAG('m','a','p',' '), /* Austronesian [collection] != Mapudungun */
+ HB_TAG('m','a','w',' '), /* Mampruli != Marwari */
+ HB_TAG('m','b','n',' '), /* Macaguán != Mbundu */
+ HB_TAG('m','c','h',' '), /* Maquiritari != Manchu */
+ HB_TAG('m','c','r',' '), /* Menya != Moose Cree */
+ HB_TAG('m','d','e',' '), /* Maba (Chad) != Mende */
+ HB_TAG('m','i','z',' '), /* Coatzospan Mixtec != Mizo */
+ HB_TAG('m','k','r',' '), /* Malas != Makasar */
+ HB_TAG('m','l','e',' '), /* Manambu != Male */
+ HB_TAG('m','l','n',' '), /* Malango != Malinke */
+ HB_TAG('m','l','r',' '), /* Vame != Malayalam Reformed */
+ HB_TAG('m','n','d',' '), /* Mondé != Mandinka */
+ HB_TAG('m','n','g',' '), /* Eastern Mnong != Mongolian */
+ HB_TAG('m','n','x',' '), /* Manikion != Manx */
+ HB_TAG('m','o','k',' '), /* Morori != Moksha */
+ HB_TAG('m','o','r',' '), /* Moro != Moroccan */
+ HB_TAG('m','t','h',' '), /* Munggui != Maithili */
+ HB_TAG('m','t','s',' '), /* Yora != Maltese */
+ HB_TAG('m','u','n',' '), /* Munda [collection] != Mundari */
+ HB_TAG('n','a','s',' '), /* Naasioi != Naskapi */
+ HB_TAG('n','c','r',' '), /* Ncane != N-Cree */
+ HB_TAG('n','d','b',' '), /* Kenswei Nsei != Ndebele */
+ HB_TAG('n','d','g',' '), /* Ndengereko != Ndonga */
+ HB_TAG('n','g','r',' '), /* Engdewu != Nagari */
+ HB_TAG('n','i','s',' '), /* Nimi != Nisi */
+ HB_TAG('n','k','o',' '), /* Nkonya != N’Ko */
+ HB_TAG('n','s','m',' '), /* Sumi Naga != Northern Sami */
+ HB_TAG('n','t','o',' '), /* Ntomba != Esperanto */
+ HB_TAG('o','r','o',' '), /* Orokolo != Oromo */
+ HB_TAG('p','a','a',' '), /* Papuan [collection] != Palestinian Aramaic */
+ HB_TAG('p','a','l',' '), /* Pahlavi != Pali */
+ HB_TAG('p','a','s',' '), /* Papasena != Pashto */
+ HB_TAG('p','i','l',' '), /* Yom != Filipino */
+ HB_TAG('p','l','k',' '), /* Kohistani Shina != Polish */
+ HB_TAG('r','m','s',' '), /* Romanian Sign Language != Romansh */
+ HB_TAG('s','a','d',' '), /* Sandawe != Sadri */
+ HB_TAG('s','a','y',' '), /* Saya != Sayisi */
+ HB_TAG('s','g','o',' '), /* Songa (retired code) != Sango */
+ HB_TAG('s','i','b',' '), /* Sebop != Sibe */
+ HB_TAG('s','i','g',' '), /* Paasaal != Silte Gurage */
+ HB_TAG('s','k','s',' '), /* Maia != Skolt Sami */
+ HB_TAG('s','k','y',' '), /* Sikaiana != Slovak */
+ HB_TAG('s','l','a',' '), /* Slavic [collection] != Slavey */
+ HB_TAG('s','m','l',' '), /* Central Sama != Somali */
+ HB_TAG('s','n','h',' '), /* Shinabo (retired code) != Sinhala (Sinhalese) */
+ HB_TAG('s','o','g',' '), /* Sogdian != Sodo Gurage */
+ HB_TAG('s','r','b',' '), /* Sora != Serbian */
+ HB_TAG('s','r','k',' '), /* Serudung Murut != Saraiki */
+ HB_TAG('s','s','l',' '), /* Western Sisaala != South Slavey */
+ HB_TAG('s','s','m',' '), /* Semnam != Southern Sami */
+ HB_TAG('s','u','r',' '), /* Mwaghavul != Suri */
+ HB_TAG('s','v','e',' '), /* Serili != Swedish */
+ HB_TAG('s','w','k',' '), /* Malawi Sena != Swahili */
+ HB_TAG('t','a','j',' '), /* Eastern Tamang != Tajiki */
+ HB_TAG('t','g','n',' '), /* Tandaganon != Tongan */
+ HB_TAG('t','g','r',' '), /* Tareng != Tigre */
+ HB_TAG('t','g','y',' '), /* Togoyo != Tigrinya */
+ HB_TAG('t','k','m',' '), /* Takelma != Turkmen */
+ HB_TAG('t','m','n',' '), /* Taman (Indonesia) != Temne */
+ HB_TAG('t','n','a',' '), /* Tacana != Tswana */
+ HB_TAG('t','n','e',' '), /* Tinoc Kallahan (retired code) != Tundra Enets */
+ HB_TAG('t','n','g',' '), /* Tobanga != Tonga */
+ HB_TAG('t','r','k',' '), /* Turkic [collection] != Turkish */
+ HB_TAG('t','s','g',' '), /* Tausug != Tsonga */
+ HB_TAG('t','u','a',' '), /* Wiarumus != Turoyo Aramaic */
+ HB_TAG('t','u','l',' '), /* Tula != Tulu */
+ HB_TAG('t','u','v',' '), /* Turkana != Tuvin */
+ HB_TAG('v','i','t',' '), /* Viti != Vietnamese */
+ HB_TAG('w','a','g',' '), /* Wa'ema != Wagdi */
+ HB_TAG('x','b','d',' '), /* Bindal != Lü */
+ HB_TAG('y','a','k',' '), /* Yakama != Sakha */
+ HB_TAG('y','b','a',' '), /* Yala != Yoruba */
+ HB_TAG('y','i','m',' '), /* Yimchungru Naga != Yi Modern */
+ HB_TAG('z','n','d',' '), /* Zande [collection] != Zande */
+};
+
static const LangTag ot_languages3[] = {
{HB_TAG('a','a','e',' '), HB_TAG('S','Q','I',' ')}, /* Arbëreshë Albanian -> Albanian */
{HB_TAG('a','a','o',' '), HB_TAG('A','R','A',' ')}, /* Algerian Saharan Arabic -> Arabic */
-/*{HB_TAG('a','a','q',' '), HB_TAG('A','A','Q',' ')},*/ /* Eastern Abnaki -> Eastern Abenaki */
{HB_TAG('a','a','t',' '), HB_TAG('S','Q','I',' ')}, /* Arvanitika Albanian -> Albanian */
- {HB_TAG('a','b','a',' '), HB_TAG_NONE }, /* Abé != Abaza */
{HB_TAG('a','b','h',' '), HB_TAG('A','R','A',' ')}, /* Tajiki Arabic -> Arabic */
{HB_TAG('a','b','q',' '), HB_TAG('A','B','A',' ')}, /* Abaza */
{HB_TAG('a','b','s',' '), HB_TAG('C','P','P',' ')}, /* Ambonese Malay -> Creoles */
{HB_TAG('a','b','v',' '), HB_TAG('A','R','A',' ')}, /* Baharna Arabic -> Arabic */
- {HB_TAG('a','c','f',' '), HB_TAG('F','A','N',' ')}, /* Saint Lucian Creole French -> French Antillean */
- {HB_TAG('a','c','f',' '), HB_TAG('C','P','P',' ')}, /* Saint Lucian Creole French -> Creoles */
-/*{HB_TAG('a','c','h',' '), HB_TAG('A','C','H',' ')},*/ /* Acoli -> Acholi */
{HB_TAG('a','c','m',' '), HB_TAG('A','R','A',' ')}, /* Mesopotamian Arabic -> Arabic */
{HB_TAG('a','c','q',' '), HB_TAG('A','R','A',' ')}, /* Ta'izzi-Adeni Arabic -> Arabic */
- {HB_TAG('a','c','r',' '), HB_TAG('A','C','R',' ')}, /* Achi */
- {HB_TAG('a','c','r',' '), HB_TAG('M','Y','N',' ')}, /* Achi -> Mayan */
{HB_TAG('a','c','w',' '), HB_TAG('A','R','A',' ')}, /* Hijazi Arabic -> Arabic */
{HB_TAG('a','c','x',' '), HB_TAG('A','R','A',' ')}, /* Omani Arabic -> Arabic */
- {HB_TAG('a','c','y',' '), HB_TAG('A','C','Y',' ')}, /* Cypriot Arabic */
- {HB_TAG('a','c','y',' '), HB_TAG('A','R','A',' ')}, /* Cypriot Arabic -> Arabic */
{HB_TAG('a','d','a',' '), HB_TAG('D','N','G',' ')}, /* Adangme -> Dangme */
{HB_TAG('a','d','f',' '), HB_TAG('A','R','A',' ')}, /* Dhofari Arabic -> Arabic */
{HB_TAG('a','d','p',' '), HB_TAG('D','Z','N',' ')}, /* Adap (retired code) -> Dzongkha */
-/*{HB_TAG('a','d','y',' '), HB_TAG('A','D','Y',' ')},*/ /* Adyghe */
{HB_TAG('a','e','b',' '), HB_TAG('A','R','A',' ')}, /* Tunisian Arabic -> Arabic */
{HB_TAG('a','e','c',' '), HB_TAG('A','R','A',' ')}, /* Saidi Arabic -> Arabic */
{HB_TAG('a','f','b',' '), HB_TAG('A','R','A',' ')}, /* Gulf Arabic -> Arabic */
- {HB_TAG('a','f','k',' '), HB_TAG_NONE }, /* Nanubae != Afrikaans */
{HB_TAG('a','f','s',' '), HB_TAG('C','P','P',' ')}, /* Afro-Seminole Creole -> Creoles */
{HB_TAG('a','g','u',' '), HB_TAG('M','Y','N',' ')}, /* Aguacateco -> Mayan */
- {HB_TAG('a','g','w',' '), HB_TAG_NONE }, /* Kahua != Agaw */
{HB_TAG('a','h','g',' '), HB_TAG('A','G','W',' ')}, /* Qimant -> Agaw */
{HB_TAG('a','h','t',' '), HB_TAG('A','T','H',' ')}, /* Ahtena -> Athapaskan */
{HB_TAG('a','i','g',' '), HB_TAG('C','P','P',' ')}, /* Antigua and Barbuda Creole English -> Creoles */
- {HB_TAG('a','i','i',' '), HB_TAG('S','W','A',' ')}, /* Assyrian Neo-Aramaic -> Swadaya Aramaic */
- {HB_TAG('a','i','i',' '), HB_TAG('S','Y','R',' ')}, /* Assyrian Neo-Aramaic -> Syriac */
-/*{HB_TAG('a','i','o',' '), HB_TAG('A','I','O',' ')},*/ /* Aiton */
{HB_TAG('a','i','w',' '), HB_TAG('A','R','I',' ')}, /* Aari */
{HB_TAG('a','j','p',' '), HB_TAG('A','R','A',' ')}, /* South Levantine Arabic (retired code) -> Arabic */
{HB_TAG('a','j','t',' '), HB_TAG('A','R','A',' ')}, /* Judeo-Tunisian Arabic (retired code) -> Arabic */
- {HB_TAG('a','k','b',' '), HB_TAG('A','K','B',' ')}, /* Batak Angkola */
- {HB_TAG('a','k','b',' '), HB_TAG('B','T','K',' ')}, /* Batak Angkola -> Batak */
{HB_TAG('a','l','n',' '), HB_TAG('S','Q','I',' ')}, /* Gheg Albanian -> Albanian */
{HB_TAG('a','l','s',' '), HB_TAG('S','Q','I',' ')}, /* Tosk Albanian -> Albanian */
-/*{HB_TAG('a','l','t',' '), HB_TAG('A','L','T',' ')},*/ /* Southern Altai -> Altai */
{HB_TAG('a','m','f',' '), HB_TAG('H','B','N',' ')}, /* Hamer-Banna -> Hammer-Banna */
{HB_TAG('a','m','w',' '), HB_TAG('S','Y','R',' ')}, /* Western Neo-Aramaic -> Syriac */
-/*{HB_TAG('a','n','g',' '), HB_TAG('A','N','G',' ')},*/ /* Old English (ca. 450-1100) -> Anglo-Saxon */
{HB_TAG('a','o','a',' '), HB_TAG('C','P','P',' ')}, /* Angolar -> Creoles */
{HB_TAG('a','p','a',' '), HB_TAG('A','T','H',' ')}, /* Apache [collection] -> Athapaskan */
{HB_TAG('a','p','c',' '), HB_TAG('A','R','A',' ')}, /* Levantine Arabic -> Arabic */
@@ -280,61 +426,39 @@
{HB_TAG('a','p','m',' '), HB_TAG('A','T','H',' ')}, /* Mescalero-Chiricahua Apache -> Athapaskan */
{HB_TAG('a','p','w',' '), HB_TAG('A','T','H',' ')}, /* Western Apache -> Athapaskan */
{HB_TAG('a','r','b',' '), HB_TAG('A','R','A',' ')}, /* Standard Arabic -> Arabic */
- {HB_TAG('a','r','i',' '), HB_TAG_NONE }, /* Arikara != Aari */
- {HB_TAG('a','r','k',' '), HB_TAG_NONE }, /* Arikapú != Rakhine */
{HB_TAG('a','r','n',' '), HB_TAG('M','A','P',' ')}, /* Mapudungun */
{HB_TAG('a','r','q',' '), HB_TAG('A','R','A',' ')}, /* Algerian Arabic -> Arabic */
{HB_TAG('a','r','s',' '), HB_TAG('A','R','A',' ')}, /* Najdi Arabic -> Arabic */
- {HB_TAG('a','r','y',' '), HB_TAG('M','O','R',' ')}, /* Moroccan Arabic -> Moroccan */
- {HB_TAG('a','r','y',' '), HB_TAG('A','R','A',' ')}, /* Moroccan Arabic -> Arabic */
{HB_TAG('a','r','z',' '), HB_TAG('A','R','A',' ')}, /* Egyptian Arabic -> Arabic */
-/*{HB_TAG('a','s','t',' '), HB_TAG('A','S','T',' ')},*/ /* Asturian */
-/*{HB_TAG('a','t','h',' '), HB_TAG('A','T','H',' ')},*/ /* Athapascan [collection] -> Athapaskan */
{HB_TAG('a','t','j',' '), HB_TAG('R','C','R',' ')}, /* Atikamekw -> R-Cree */
-/*{HB_TAG('a','t','s',' '), HB_TAG('A','T','S',' ')},*/ /* Gros Ventre (Atsina) */
{HB_TAG('a','t','v',' '), HB_TAG('A','L','T',' ')}, /* Northern Altai -> Altai */
{HB_TAG('a','u','j',' '), HB_TAG('B','B','R',' ')}, /* Awjilah -> Berber */
{HB_TAG('a','u','z',' '), HB_TAG('A','R','A',' ')}, /* Uzbeki Arabic -> Arabic */
{HB_TAG('a','v','l',' '), HB_TAG('A','R','A',' ')}, /* Eastern Egyptian Bedawi Arabic -> Arabic */
-/*{HB_TAG('a','v','n',' '), HB_TAG('A','V','N',' ')},*/ /* Avatime */
-/*{HB_TAG('a','w','a',' '), HB_TAG('A','W','A',' ')},*/ /* Awadhi */
{HB_TAG('a','y','c',' '), HB_TAG('A','Y','M',' ')}, /* Southern Aymara -> Aymara */
{HB_TAG('a','y','h',' '), HB_TAG('A','R','A',' ')}, /* Hadrami Arabic -> Arabic */
{HB_TAG('a','y','l',' '), HB_TAG('A','R','A',' ')}, /* Libyan Arabic -> Arabic */
{HB_TAG('a','y','n',' '), HB_TAG('A','R','A',' ')}, /* Sanaani Arabic -> Arabic */
{HB_TAG('a','y','p',' '), HB_TAG('A','R','A',' ')}, /* North Mesopotamian Arabic -> Arabic */
{HB_TAG('a','y','r',' '), HB_TAG('A','Y','M',' ')}, /* Central Aymara -> Aymara */
- {HB_TAG('a','z','b',' '), HB_TAG('A','Z','B',' ')}, /* South Azerbaijani -> Torki */
- {HB_TAG('a','z','b',' '), HB_TAG('A','Z','E',' ')}, /* South Azerbaijani -> Azerbaijani */
{HB_TAG('a','z','d',' '), HB_TAG('N','A','H',' ')}, /* Eastern Durango Nahuatl -> Nahuatl */
{HB_TAG('a','z','j',' '), HB_TAG('A','Z','E',' ')}, /* North Azerbaijani -> Azerbaijani */
{HB_TAG('a','z','n',' '), HB_TAG('N','A','H',' ')}, /* Western Durango Nahuatl -> Nahuatl */
{HB_TAG('a','z','z',' '), HB_TAG('N','A','H',' ')}, /* Highland Puebla Nahuatl -> Nahuatl */
{HB_TAG('b','a','d',' '), HB_TAG('B','A','D','0')}, /* Banda [collection] */
- {HB_TAG('b','a','g',' '), HB_TAG_NONE }, /* Tuki != Baghelkhandi */
{HB_TAG('b','a','h',' '), HB_TAG('C','P','P',' ')}, /* Bahamas Creole English -> Creoles */
{HB_TAG('b','a','i',' '), HB_TAG('B','M','L',' ')}, /* Bamileke [collection] */
{HB_TAG('b','a','l',' '), HB_TAG('B','L','I',' ')}, /* Baluchi [macrolanguage] */
-/*{HB_TAG('b','a','n',' '), HB_TAG('B','A','N',' ')},*/ /* Balinese */
-/*{HB_TAG('b','a','r',' '), HB_TAG('B','A','R',' ')},*/ /* Bavarian */
- {HB_TAG('b','a','u',' '), HB_TAG_NONE }, /* Bada (Nigeria) != Baulé */
- {HB_TAG('b','b','c',' '), HB_TAG('B','B','C',' ')}, /* Batak Toba */
- {HB_TAG('b','b','c',' '), HB_TAG('B','T','K',' ')}, /* Batak Toba -> Batak */
{HB_TAG('b','b','j',' '), HB_TAG('B','M','L',' ')}, /* Ghomálá' -> Bamileke */
{HB_TAG('b','b','p',' '), HB_TAG('B','A','D','0')}, /* West Central Banda -> Banda */
- {HB_TAG('b','b','r',' '), HB_TAG_NONE }, /* Girawa != Berber */
{HB_TAG('b','b','z',' '), HB_TAG('A','R','A',' ')}, /* Babalia Creole Arabic (retired code) -> Arabic */
{HB_TAG('b','c','c',' '), HB_TAG('B','L','I',' ')}, /* Southern Balochi -> Baluchi */
- {HB_TAG('b','c','h',' '), HB_TAG_NONE }, /* Bariai != Bench */
{HB_TAG('b','c','i',' '), HB_TAG('B','A','U',' ')}, /* Baoulé -> Baulé */
{HB_TAG('b','c','l',' '), HB_TAG('B','I','K',' ')}, /* Central Bikol -> Bikol */
{HB_TAG('b','c','q',' '), HB_TAG('B','C','H',' ')}, /* Bench */
{HB_TAG('b','c','r',' '), HB_TAG('A','T','H',' ')}, /* Babine -> Athapaskan */
-/*{HB_TAG('b','d','c',' '), HB_TAG('B','D','C',' ')},*/ /* Emberá-Baudó */
-/*{HB_TAG('b','d','y',' '), HB_TAG('B','D','Y',' ')},*/ /* Bandjalang */
{HB_TAG('b','e','a',' '), HB_TAG('A','T','H',' ')}, /* Beaver -> Athapaskan */
{HB_TAG('b','e','b',' '), HB_TAG('B','T','I',' ')}, /* Bebele -> Beti */
-/*{HB_TAG('b','e','m',' '), HB_TAG('B','E','M',' ')},*/ /* Bemba (Zambia) */
{HB_TAG('b','e','r',' '), HB_TAG('B','B','R',' ')}, /* Berber [collection] */
{HB_TAG('b','e','w',' '), HB_TAG('C','P','P',' ')}, /* Betawi -> Creoles */
{HB_TAG('b','f','l',' '), HB_TAG('B','A','D','0')}, /* Banda-Ndélé -> Banda */
@@ -342,70 +466,35 @@
{HB_TAG('b','f','t',' '), HB_TAG('B','L','T',' ')}, /* Balti */
{HB_TAG('b','f','u',' '), HB_TAG('L','A','H',' ')}, /* Gahri -> Lahuli */
{HB_TAG('b','f','y',' '), HB_TAG('B','A','G',' ')}, /* Bagheli -> Baghelkhandi */
-/*{HB_TAG('b','g','c',' '), HB_TAG('B','G','C',' ')},*/ /* Haryanvi */
{HB_TAG('b','g','n',' '), HB_TAG('B','L','I',' ')}, /* Western Balochi -> Baluchi */
{HB_TAG('b','g','p',' '), HB_TAG('B','L','I',' ')}, /* Eastern Balochi -> Baluchi */
- {HB_TAG('b','g','q',' '), HB_TAG('B','G','Q',' ')}, /* Bagri */
- {HB_TAG('b','g','q',' '), HB_TAG('R','A','J',' ')}, /* Bagri -> Rajasthani */
{HB_TAG('b','g','r',' '), HB_TAG('Q','I','N',' ')}, /* Bawm Chin -> Chin */
{HB_TAG('b','h','b',' '), HB_TAG('B','H','I',' ')}, /* Bhili */
-/*{HB_TAG('b','h','i',' '), HB_TAG('B','H','I',' ')},*/ /* Bhilali -> Bhili */
{HB_TAG('b','h','k',' '), HB_TAG('B','I','K',' ')}, /* Albay Bicolano (retired code) -> Bikol */
-/*{HB_TAG('b','h','o',' '), HB_TAG('B','H','O',' ')},*/ /* Bhojpuri */
{HB_TAG('b','h','r',' '), HB_TAG('M','L','G',' ')}, /* Bara Malagasy -> Malagasy */
-/*{HB_TAG('b','i','k',' '), HB_TAG('B','I','K',' ')},*/ /* Bikol [macrolanguage] */
- {HB_TAG('b','i','l',' '), HB_TAG_NONE }, /* Bile != Bilen */
{HB_TAG('b','i','n',' '), HB_TAG('E','D','O',' ')}, /* Edo */
{HB_TAG('b','i','u',' '), HB_TAG('Q','I','N',' ')}, /* Biete -> Chin */
-/*{HB_TAG('b','j','j',' '), HB_TAG('B','J','J',' ')},*/ /* Kanauji */
{HB_TAG('b','j','n',' '), HB_TAG('M','L','Y',' ')}, /* Banjar -> Malay */
{HB_TAG('b','j','o',' '), HB_TAG('B','A','D','0')}, /* Mid-Southern Banda -> Banda */
{HB_TAG('b','j','q',' '), HB_TAG('M','L','G',' ')}, /* Southern Betsimisaraka Malagasy (retired code) -> Malagasy */
{HB_TAG('b','j','s',' '), HB_TAG('C','P','P',' ')}, /* Bajan -> Creoles */
{HB_TAG('b','j','t',' '), HB_TAG('B','L','N',' ')}, /* Balanta-Ganja -> Balante */
- {HB_TAG('b','k','f',' '), HB_TAG_NONE }, /* Beeke != Blackfoot */
{HB_TAG('b','k','o',' '), HB_TAG('B','M','L',' ')}, /* Kwa' -> Bamileke */
{HB_TAG('b','l','a',' '), HB_TAG('B','K','F',' ')}, /* Siksika -> Blackfoot */
{HB_TAG('b','l','e',' '), HB_TAG('B','L','N',' ')}, /* Balanta-Kentohe -> Balante */
{HB_TAG('b','l','g',' '), HB_TAG('I','B','A',' ')}, /* Balau (retired code) -> Iban */
- {HB_TAG('b','l','i',' '), HB_TAG_NONE }, /* Bolia != Baluchi */
- {HB_TAG('b','l','k',' '), HB_TAG('B','L','K',' ')}, /* Pa’o Karen */
- {HB_TAG('b','l','k',' '), HB_TAG('K','R','N',' ')}, /* Pa'o Karen -> Karen */
{HB_TAG('b','l','n',' '), HB_TAG('B','I','K',' ')}, /* Southern Catanduanes Bikol -> Bikol */
- {HB_TAG('b','l','t',' '), HB_TAG_NONE }, /* Tai Dam != Balti */
- {HB_TAG('b','m','b',' '), HB_TAG_NONE }, /* Bembe != Bambara (Bamanankan) */
- {HB_TAG('b','m','l',' '), HB_TAG_NONE }, /* Bomboli != Bamileke */
{HB_TAG('b','m','m',' '), HB_TAG('M','L','G',' ')}, /* Northern Betsimisaraka Malagasy -> Malagasy */
{HB_TAG('b','p','d',' '), HB_TAG('B','A','D','0')}, /* Banda-Banda -> Banda */
{HB_TAG('b','p','l',' '), HB_TAG('C','P','P',' ')}, /* Broome Pearling Lugger Pidgin -> Creoles */
{HB_TAG('b','p','q',' '), HB_TAG('C','P','P',' ')}, /* Banda Malay -> Creoles */
-/*{HB_TAG('b','p','y',' '), HB_TAG('B','P','Y',' ')},*/ /* Bishnupriya -> Bishnupriya Manipuri */
{HB_TAG('b','q','i',' '), HB_TAG('L','R','C',' ')}, /* Bakhtiari -> Luri */
{HB_TAG('b','q','k',' '), HB_TAG('B','A','D','0')}, /* Banda-Mbrès -> Banda */
{HB_TAG('b','r','a',' '), HB_TAG('B','R','I',' ')}, /* Braj -> Braj Bhasha */
{HB_TAG('b','r','c',' '), HB_TAG('C','P','P',' ')}, /* Berbice Creole Dutch -> Creoles */
-/*{HB_TAG('b','r','h',' '), HB_TAG('B','R','H',' ')},*/ /* Brahui */
- {HB_TAG('b','r','i',' '), HB_TAG_NONE }, /* Mokpwe != Braj Bhasha */
- {HB_TAG('b','r','m',' '), HB_TAG_NONE }, /* Barambu != Burmese */
-/*{HB_TAG('b','r','x',' '), HB_TAG('B','R','X',' ')},*/ /* Bodo (India) */
- {HB_TAG('b','s','h',' '), HB_TAG_NONE }, /* Kati != Bashkir */
-/*{HB_TAG('b','s','k',' '), HB_TAG('B','S','K',' ')},*/ /* Burushaski */
{HB_TAG('b','t','b',' '), HB_TAG('B','T','I',' ')}, /* Beti (Cameroon) (retired code) */
- {HB_TAG('b','t','d',' '), HB_TAG('B','T','D',' ')}, /* Batak Dairi (Pakpak) */
- {HB_TAG('b','t','d',' '), HB_TAG('B','T','K',' ')}, /* Batak Dairi -> Batak */
- {HB_TAG('b','t','i',' '), HB_TAG_NONE }, /* Burate != Beti */
{HB_TAG('b','t','j',' '), HB_TAG('M','L','Y',' ')}, /* Bacanese Malay -> Malay */
-/*{HB_TAG('b','t','k',' '), HB_TAG('B','T','K',' ')},*/ /* Batak [collection] */
- {HB_TAG('b','t','m',' '), HB_TAG('B','T','M',' ')}, /* Batak Mandailing */
- {HB_TAG('b','t','m',' '), HB_TAG('B','T','K',' ')}, /* Batak Mandailing -> Batak */
{HB_TAG('b','t','o',' '), HB_TAG('B','I','K',' ')}, /* Rinconada Bikol -> Bikol */
- {HB_TAG('b','t','s',' '), HB_TAG('B','T','S',' ')}, /* Batak Simalungun */
- {HB_TAG('b','t','s',' '), HB_TAG('B','T','K',' ')}, /* Batak Simalungun -> Batak */
- {HB_TAG('b','t','x',' '), HB_TAG('B','T','X',' ')}, /* Batak Karo */
- {HB_TAG('b','t','x',' '), HB_TAG('B','T','K',' ')}, /* Batak Karo -> Batak */
- {HB_TAG('b','t','z',' '), HB_TAG('B','T','Z',' ')}, /* Batak Alas-Kluet */
- {HB_TAG('b','t','z',' '), HB_TAG('B','T','K',' ')}, /* Batak Alas-Kluet -> Batak */
-/*{HB_TAG('b','u','g',' '), HB_TAG('B','U','G',' ')},*/ /* Buginese -> Bugis */
{HB_TAG('b','u','m',' '), HB_TAG('B','T','I',' ')}, /* Bulu (Cameroon) -> Beti */
{HB_TAG('b','v','e',' '), HB_TAG('M','L','Y',' ')}, /* Berau Malay -> Malay */
{HB_TAG('b','v','u',' '), HB_TAG('M','L','Y',' ')}, /* Bukit Malay -> Malay */
@@ -415,52 +504,26 @@
{HB_TAG('b','x','p',' '), HB_TAG('B','T','I',' ')}, /* Bebil -> Beti */
{HB_TAG('b','x','r',' '), HB_TAG('R','B','U',' ')}, /* Russia Buriat -> Russian Buriat */
{HB_TAG('b','y','n',' '), HB_TAG('B','I','L',' ')}, /* Bilin -> Bilen */
- {HB_TAG('b','y','v',' '), HB_TAG('B','Y','V',' ')}, /* Medumba */
- {HB_TAG('b','y','v',' '), HB_TAG('B','M','L',' ')}, /* Medumba -> Bamileke */
{HB_TAG('b','z','c',' '), HB_TAG('M','L','G',' ')}, /* Southern Betsimisaraka Malagasy -> Malagasy */
{HB_TAG('b','z','j',' '), HB_TAG('C','P','P',' ')}, /* Belize Kriol English -> Creoles */
{HB_TAG('b','z','k',' '), HB_TAG('C','P','P',' ')}, /* Nicaragua Creole English -> Creoles */
{HB_TAG('c','a','a',' '), HB_TAG('M','Y','N',' ')}, /* Chortí -> Mayan */
{HB_TAG('c','a','c',' '), HB_TAG('M','Y','N',' ')}, /* Chuj -> Mayan */
- {HB_TAG('c','a','f',' '), HB_TAG('C','R','R',' ')}, /* Southern Carrier -> Carrier */
- {HB_TAG('c','a','f',' '), HB_TAG('A','T','H',' ')}, /* Southern Carrier -> Athapaskan */
- {HB_TAG('c','a','k',' '), HB_TAG('C','A','K',' ')}, /* Kaqchikel */
- {HB_TAG('c','a','k',' '), HB_TAG('M','Y','N',' ')}, /* Kaqchikel -> Mayan */
-/*{HB_TAG('c','a','y',' '), HB_TAG('C','A','Y',' ')},*/ /* Cayuga */
-/*{HB_TAG('c','b','g',' '), HB_TAG('C','B','G',' ')},*/ /* Chimila */
- {HB_TAG('c','b','k',' '), HB_TAG('C','B','K',' ')}, /* Chavacano -> Zamboanga Chavacano */
- {HB_TAG('c','b','k',' '), HB_TAG('C','P','P',' ')}, /* Chavacano -> Creoles */
{HB_TAG('c','b','l',' '), HB_TAG('Q','I','N',' ')}, /* Bualkhaw Chin -> Chin */
{HB_TAG('c','c','l',' '), HB_TAG('C','P','P',' ')}, /* Cutchi-Swahili -> Creoles */
{HB_TAG('c','c','m',' '), HB_TAG('C','P','P',' ')}, /* Malaccan Creole Malay -> Creoles */
{HB_TAG('c','c','o',' '), HB_TAG('C','C','H','N')}, /* Comaltepec Chinantec -> Chinantec */
{HB_TAG('c','c','q',' '), HB_TAG('A','R','K',' ')}, /* Chaungtha (retired code) -> Rakhine */
{HB_TAG('c','d','o',' '), HB_TAG('Z','H','S',' ')}, /* Min Dong Chinese -> Chinese, Simplified */
-/*{HB_TAG('c','e','b',' '), HB_TAG('C','E','B',' ')},*/ /* Cebuano */
{HB_TAG('c','e','k',' '), HB_TAG('Q','I','N',' ')}, /* Eastern Khumi Chin -> Chin */
{HB_TAG('c','e','y',' '), HB_TAG('Q','I','N',' ')}, /* Ekai Chin -> Chin */
- {HB_TAG('c','f','m',' '), HB_TAG('H','A','L',' ')}, /* Halam (Falam Chin) */
- {HB_TAG('c','f','m',' '), HB_TAG('Q','I','N',' ')}, /* Falam Chin -> Chin */
-/*{HB_TAG('c','g','g',' '), HB_TAG('C','G','G',' ')},*/ /* Chiga */
{HB_TAG('c','h','f',' '), HB_TAG('M','Y','N',' ')}, /* Tabasco Chontal -> Mayan */
- {HB_TAG('c','h','g',' '), HB_TAG_NONE }, /* Chagatai != Chaha Gurage */
- {HB_TAG('c','h','h',' '), HB_TAG_NONE }, /* Chinook != Chattisgarhi */
{HB_TAG('c','h','j',' '), HB_TAG('C','C','H','N')}, /* Ojitlán Chinantec -> Chinantec */
{HB_TAG('c','h','k',' '), HB_TAG('C','H','K','0')}, /* Chuukese */
- {HB_TAG('c','h','m',' '), HB_TAG('H','M','A',' ')}, /* Mari (Russia) [macrolanguage] -> High Mari */
- {HB_TAG('c','h','m',' '), HB_TAG('L','M','A',' ')}, /* Mari (Russia) [macrolanguage] -> Low Mari */
{HB_TAG('c','h','n',' '), HB_TAG('C','P','P',' ')}, /* Chinook jargon -> Creoles */
-/*{HB_TAG('c','h','o',' '), HB_TAG('C','H','O',' ')},*/ /* Choctaw */
- {HB_TAG('c','h','p',' '), HB_TAG('C','H','P',' ')}, /* Chipewyan */
- {HB_TAG('c','h','p',' '), HB_TAG('S','A','Y',' ')}, /* Chipewyan -> Sayisi */
- {HB_TAG('c','h','p',' '), HB_TAG('A','T','H',' ')}, /* Chipewyan -> Athapaskan */
{HB_TAG('c','h','q',' '), HB_TAG('C','C','H','N')}, /* Quiotepec Chinantec -> Chinantec */
-/*{HB_TAG('c','h','r',' '), HB_TAG('C','H','R',' ')},*/ /* Cherokee */
-/*{HB_TAG('c','h','y',' '), HB_TAG('C','H','Y',' ')},*/ /* Cheyenne */
{HB_TAG('c','h','z',' '), HB_TAG('C','C','H','N')}, /* Ozumacín Chinantec -> Chinantec */
{HB_TAG('c','i','w',' '), HB_TAG('O','J','B',' ')}, /* Chippewa -> Ojibway */
-/*{HB_TAG('c','j','a',' '), HB_TAG('C','J','A',' ')},*/ /* Western Cham */
-/*{HB_TAG('c','j','m',' '), HB_TAG('C','J','M',' ')},*/ /* Eastern Cham */
{HB_TAG('c','j','y',' '), HB_TAG('Z','H','S',' ')}, /* Jinyu Chinese -> Chinese, Simplified */
{HB_TAG('c','k','a',' '), HB_TAG('Q','I','N',' ')}, /* Khumi Awa Chin (retired code) -> Chin */
{HB_TAG('c','k','b',' '), HB_TAG('K','U','R',' ')}, /* Central Kurdish -> Kurdish */
@@ -474,7 +537,6 @@
{HB_TAG('c','l','j',' '), HB_TAG('Q','I','N',' ')}, /* Laitu Chin -> Chin */
{HB_TAG('c','l','s',' '), HB_TAG('S','A','N',' ')}, /* Classical Sanskrit -> Sanskrit */
{HB_TAG('c','l','t',' '), HB_TAG('Q','I','N',' ')}, /* Lautu Chin -> Chin */
-/*{HB_TAG('c','m','i',' '), HB_TAG('C','M','I',' ')},*/ /* Emberá-Chamí */
{HB_TAG('c','m','n',' '), HB_TAG('Z','H','S',' ')}, /* Mandarin Chinese -> Chinese, Simplified */
{HB_TAG('c','m','r',' '), HB_TAG('Q','I','N',' ')}, /* Mro-Khimi Chin -> Chin */
{HB_TAG('c','n','b',' '), HB_TAG('Q','I','N',' ')}, /* Chinbon Chin -> Chin */
@@ -488,120 +550,63 @@
{HB_TAG('c','n','w',' '), HB_TAG('Q','I','N',' ')}, /* Ngawn Chin -> Chin */
{HB_TAG('c','o','a',' '), HB_TAG('M','L','Y',' ')}, /* Cocos Islands Malay -> Malay */
{HB_TAG('c','o','b',' '), HB_TAG('M','Y','N',' ')}, /* Chicomuceltec -> Mayan */
-/*{HB_TAG('c','o','o',' '), HB_TAG('C','O','O',' ')},*/ /* Comox */
-/*{HB_TAG('c','o','p',' '), HB_TAG('C','O','P',' ')},*/ /* Coptic */
{HB_TAG('c','o','q',' '), HB_TAG('A','T','H',' ')}, /* Coquille -> Athapaskan */
{HB_TAG('c','p','a',' '), HB_TAG('C','C','H','N')}, /* Palantla Chinantec -> Chinantec */
{HB_TAG('c','p','e',' '), HB_TAG('C','P','P',' ')}, /* English-based creoles and pidgins [collection] -> Creoles */
{HB_TAG('c','p','f',' '), HB_TAG('C','P','P',' ')}, /* French-based creoles and pidgins [collection] -> Creoles */
{HB_TAG('c','p','i',' '), HB_TAG('C','P','P',' ')}, /* Chinese Pidgin English -> Creoles */
-/*{HB_TAG('c','p','p',' '), HB_TAG('C','P','P',' ')},*/ /* Portuguese-based creoles and pidgins [collection] -> Creoles */
{HB_TAG('c','p','x',' '), HB_TAG('Z','H','S',' ')}, /* Pu-Xian Chinese -> Chinese, Simplified */
{HB_TAG('c','q','d',' '), HB_TAG('H','M','N',' ')}, /* Chuanqiandian Cluster Miao -> Hmong */
- {HB_TAG('c','q','u',' '), HB_TAG('Q','U','H',' ')}, /* Chilean Quechua (retired code) -> Quechua (Bolivia) */
- {HB_TAG('c','q','u',' '), HB_TAG('Q','U','Z',' ')}, /* Chilean Quechua (retired code) -> Quechua */
{HB_TAG('c','r','h',' '), HB_TAG('C','R','T',' ')}, /* Crimean Tatar */
{HB_TAG('c','r','i',' '), HB_TAG('C','P','P',' ')}, /* Sãotomense -> Creoles */
- {HB_TAG('c','r','j',' '), HB_TAG('E','C','R',' ')}, /* Southern East Cree -> Eastern Cree */
- {HB_TAG('c','r','j',' '), HB_TAG('Y','C','R',' ')}, /* Southern East Cree -> Y-Cree */
- {HB_TAG('c','r','j',' '), HB_TAG('C','R','E',' ')}, /* Southern East Cree -> Cree */
- {HB_TAG('c','r','k',' '), HB_TAG('W','C','R',' ')}, /* Plains Cree -> West-Cree */
- {HB_TAG('c','r','k',' '), HB_TAG('Y','C','R',' ')}, /* Plains Cree -> Y-Cree */
- {HB_TAG('c','r','k',' '), HB_TAG('C','R','E',' ')}, /* Plains Cree -> Cree */
- {HB_TAG('c','r','l',' '), HB_TAG('E','C','R',' ')}, /* Northern East Cree -> Eastern Cree */
- {HB_TAG('c','r','l',' '), HB_TAG('Y','C','R',' ')}, /* Northern East Cree -> Y-Cree */
- {HB_TAG('c','r','l',' '), HB_TAG('C','R','E',' ')}, /* Northern East Cree -> Cree */
- {HB_TAG('c','r','m',' '), HB_TAG('M','C','R',' ')}, /* Moose Cree */
- {HB_TAG('c','r','m',' '), HB_TAG('L','C','R',' ')}, /* Moose Cree -> L-Cree */
- {HB_TAG('c','r','m',' '), HB_TAG('C','R','E',' ')}, /* Moose Cree -> Cree */
{HB_TAG('c','r','p',' '), HB_TAG('C','P','P',' ')}, /* Creoles and pidgins [collection] -> Creoles */
- {HB_TAG('c','r','r',' '), HB_TAG_NONE }, /* Carolina Algonquian != Carrier */
{HB_TAG('c','r','s',' '), HB_TAG('C','P','P',' ')}, /* Seselwa Creole French -> Creoles */
- {HB_TAG('c','r','t',' '), HB_TAG_NONE }, /* Iyojwa'ja Chorote != Crimean Tatar */
- {HB_TAG('c','r','x',' '), HB_TAG('C','R','R',' ')}, /* Carrier */
- {HB_TAG('c','r','x',' '), HB_TAG('A','T','H',' ')}, /* Carrier -> Athapaskan */
{HB_TAG('c','s','a',' '), HB_TAG('C','C','H','N')}, /* Chiltepec Chinantec -> Chinantec */
-/*{HB_TAG('c','s','b',' '), HB_TAG('C','S','B',' ')},*/ /* Kashubian */
{HB_TAG('c','s','h',' '), HB_TAG('Q','I','N',' ')}, /* Asho Chin -> Chin */
{HB_TAG('c','s','j',' '), HB_TAG('Q','I','N',' ')}, /* Songlai Chin -> Chin */
- {HB_TAG('c','s','l',' '), HB_TAG_NONE }, /* Chinese Sign Language != Church Slavonic */
{HB_TAG('c','s','o',' '), HB_TAG('C','C','H','N')}, /* Sochiapam Chinantec -> Chinantec */
{HB_TAG('c','s','p',' '), HB_TAG('Z','H','S',' ')}, /* Southern Ping Chinese -> Chinese, Simplified */
{HB_TAG('c','s','v',' '), HB_TAG('Q','I','N',' ')}, /* Sumtu Chin -> Chin */
- {HB_TAG('c','s','w',' '), HB_TAG('N','C','R',' ')}, /* Swampy Cree -> N-Cree */
- {HB_TAG('c','s','w',' '), HB_TAG('N','H','C',' ')}, /* Swampy Cree -> Norway House Cree */
- {HB_TAG('c','s','w',' '), HB_TAG('C','R','E',' ')}, /* Swampy Cree -> Cree */
{HB_TAG('c','s','y',' '), HB_TAG('Q','I','N',' ')}, /* Siyin Chin -> Chin */
{HB_TAG('c','t','c',' '), HB_TAG('A','T','H',' ')}, /* Chetco -> Athapaskan */
{HB_TAG('c','t','d',' '), HB_TAG('Q','I','N',' ')}, /* Tedim Chin -> Chin */
{HB_TAG('c','t','e',' '), HB_TAG('C','C','H','N')}, /* Tepinapa Chinantec -> Chinantec */
-/*{HB_TAG('c','t','g',' '), HB_TAG('C','T','G',' ')},*/ /* Chittagonian */
{HB_TAG('c','t','h',' '), HB_TAG('Q','I','N',' ')}, /* Thaiphum Chin -> Chin */
{HB_TAG('c','t','l',' '), HB_TAG('C','C','H','N')}, /* Tlacoatzintepec Chinantec -> Chinantec */
-/*{HB_TAG('c','t','o',' '), HB_TAG('C','T','O',' ')},*/ /* Emberá-Catío */
{HB_TAG('c','t','s',' '), HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol -> Bikol */
-/*{HB_TAG('c','t','t',' '), HB_TAG('C','T','T',' ')},*/ /* Wayanad Chetti */
{HB_TAG('c','t','u',' '), HB_TAG('M','Y','N',' ')}, /* Chol -> Mayan */
{HB_TAG('c','u','c',' '), HB_TAG('C','C','H','N')}, /* Usila Chinantec -> Chinantec */
-/*{HB_TAG('c','u','k',' '), HB_TAG('C','U','K',' ')},*/ /* San Blas Kuna */
{HB_TAG('c','v','n',' '), HB_TAG('C','C','H','N')}, /* Valle Nacional Chinantec -> Chinantec */
- {HB_TAG('c','w','d',' '), HB_TAG('D','C','R',' ')}, /* Woods Cree */
- {HB_TAG('c','w','d',' '), HB_TAG('T','C','R',' ')}, /* Woods Cree -> TH-Cree */
- {HB_TAG('c','w','d',' '), HB_TAG('C','R','E',' ')}, /* Woods Cree -> Cree */
{HB_TAG('c','z','h',' '), HB_TAG('Z','H','S',' ')}, /* Huizhou Chinese -> Chinese, Simplified */
{HB_TAG('c','z','o',' '), HB_TAG('Z','H','S',' ')}, /* Min Zhong Chinese -> Chinese, Simplified */
{HB_TAG('c','z','t',' '), HB_TAG('Q','I','N',' ')}, /* Zotung Chin -> Chin */
-/*{HB_TAG('d','a','g',' '), HB_TAG('D','A','G',' ')},*/ /* Dagbani */
{HB_TAG('d','a','o',' '), HB_TAG('Q','I','N',' ')}, /* Daai Chin -> Chin */
{HB_TAG('d','a','p',' '), HB_TAG('N','I','S',' ')}, /* Nisi (India) (retired code) */
-/*{HB_TAG('d','a','r',' '), HB_TAG('D','A','R',' ')},*/ /* Dargwa */
-/*{HB_TAG('d','a','x',' '), HB_TAG('D','A','X',' ')},*/ /* Dayi */
{HB_TAG('d','c','r',' '), HB_TAG('C','P','P',' ')}, /* Negerhollands -> Creoles */
- {HB_TAG('d','e','n',' '), HB_TAG('S','L','A',' ')}, /* Slave (Athapascan) [macrolanguage] -> Slavey */
- {HB_TAG('d','e','n',' '), HB_TAG('A','T','H',' ')}, /* Slave (Athapascan) [macrolanguage] -> Athapaskan */
{HB_TAG('d','e','p',' '), HB_TAG('C','P','P',' ')}, /* Pidgin Delaware -> Creoles */
- {HB_TAG('d','g','o',' '), HB_TAG('D','G','O',' ')}, /* Dogri (individual language) */
- {HB_TAG('d','g','o',' '), HB_TAG('D','G','R',' ')}, /* Dogri (macrolanguage) */
{HB_TAG('d','g','r',' '), HB_TAG('A','T','H',' ')}, /* Tlicho -> Athapaskan */
{HB_TAG('d','h','d',' '), HB_TAG('M','A','W',' ')}, /* Dhundari -> Marwari */
-/*{HB_TAG('d','h','g',' '), HB_TAG('D','H','G',' ')},*/ /* Dhangu */
- {HB_TAG('d','h','v',' '), HB_TAG_NONE }, /* Dehu != Divehi (Dhivehi, Maldivian) (deprecated) */
{HB_TAG('d','i','b',' '), HB_TAG('D','N','K',' ')}, /* South Central Dinka -> Dinka */
{HB_TAG('d','i','k',' '), HB_TAG('D','N','K',' ')}, /* Southwestern Dinka -> Dinka */
{HB_TAG('d','i','n',' '), HB_TAG('D','N','K',' ')}, /* Dinka [macrolanguage] */
{HB_TAG('d','i','p',' '), HB_TAG('D','N','K',' ')}, /* Northeastern Dinka -> Dinka */
- {HB_TAG('d','i','q',' '), HB_TAG('D','I','Q',' ')}, /* Dimli */
- {HB_TAG('d','i','q',' '), HB_TAG('Z','Z','A',' ')}, /* Dimli -> Zazaki */
{HB_TAG('d','i','w',' '), HB_TAG('D','N','K',' ')}, /* Northwestern Dinka -> Dinka */
{HB_TAG('d','j','e',' '), HB_TAG('D','J','R',' ')}, /* Zarma */
{HB_TAG('d','j','k',' '), HB_TAG('C','P','P',' ')}, /* Eastern Maroon Creole -> Creoles */
{HB_TAG('d','j','r',' '), HB_TAG('D','J','R','0')}, /* Djambarrpuyngu */
{HB_TAG('d','k','s',' '), HB_TAG('D','N','K',' ')}, /* Southeastern Dinka -> Dinka */
{HB_TAG('d','n','g',' '), HB_TAG('D','U','N',' ')}, /* Dungan */
-/*{HB_TAG('d','n','j',' '), HB_TAG('D','N','J',' ')},*/ /* Dan */
- {HB_TAG('d','n','k',' '), HB_TAG_NONE }, /* Dengka != Dinka */
{HB_TAG('d','o','i',' '), HB_TAG('D','G','R',' ')}, /* Dogri (macrolanguage) [macrolanguage] */
{HB_TAG('d','r','h',' '), HB_TAG('M','N','G',' ')}, /* Darkhat (retired code) -> Mongolian */
- {HB_TAG('d','r','i',' '), HB_TAG_NONE }, /* C'Lela != Dari */
- {HB_TAG('d','r','w',' '), HB_TAG('D','R','I',' ')}, /* Darwazi (retired code) -> Dari */
- {HB_TAG('d','r','w',' '), HB_TAG('F','A','R',' ')}, /* Darwazi (retired code) -> Persian */
{HB_TAG('d','s','b',' '), HB_TAG('L','S','B',' ')}, /* Lower Sorbian */
{HB_TAG('d','t','y',' '), HB_TAG('N','E','P',' ')}, /* Dotyali -> Nepali */
-/*{HB_TAG('d','u','j',' '), HB_TAG('D','U','J',' ')},*/ /* Dhuwal (retired code) */
- {HB_TAG('d','u','n',' '), HB_TAG_NONE }, /* Dusun Deyah != Dungan */
{HB_TAG('d','u','p',' '), HB_TAG('M','L','Y',' ')}, /* Duano -> Malay */
{HB_TAG('d','w','k',' '), HB_TAG('K','U','I',' ')}, /* Dawik Kui -> Kui */
{HB_TAG('d','w','u',' '), HB_TAG('D','U','J',' ')}, /* Dhuwal */
{HB_TAG('d','w','y',' '), HB_TAG('D','U','J',' ')}, /* Dhuwaya -> Dhuwal */
{HB_TAG('d','y','u',' '), HB_TAG('J','U','L',' ')}, /* Dyula -> Jula */
- {HB_TAG('d','z','n',' '), HB_TAG_NONE }, /* Dzando != Dzongkha */
- {HB_TAG('e','c','r',' '), HB_TAG_NONE }, /* Eteocretan != Eastern Cree */
-/*{HB_TAG('e','f','i',' '), HB_TAG('E','F','I',' ')},*/ /* Efik */
{HB_TAG('e','k','k',' '), HB_TAG('E','T','I',' ')}, /* Standard Estonian -> Estonian */
{HB_TAG('e','k','y',' '), HB_TAG('K','R','N',' ')}, /* Eastern Kayah -> Karen */
- {HB_TAG('e','m','k',' '), HB_TAG('E','M','K',' ')}, /* Eastern Maninkakan */
- {HB_TAG('e','m','k',' '), HB_TAG('M','N','K',' ')}, /* Eastern Maninkakan -> Maninka */
-/*{HB_TAG('e','m','p',' '), HB_TAG('E','M','P',' ')},*/ /* Northern Emberá */
{HB_TAG('e','m','y',' '), HB_TAG('M','Y','N',' ')}, /* Epigraphic Mayan -> Mayan */
{HB_TAG('e','n','b',' '), HB_TAG('K','A','L',' ')}, /* Markweeta -> Kalenjin */
{HB_TAG('e','n','f',' '), HB_TAG('F','N','E',' ')}, /* Forest Enets */
@@ -609,52 +614,27 @@
{HB_TAG('e','s','g',' '), HB_TAG('G','O','N',' ')}, /* Aheri Gondi -> Gondi */
{HB_TAG('e','s','i',' '), HB_TAG('I','P','K',' ')}, /* North Alaskan Inupiatun -> Inupiat */
{HB_TAG('e','s','k',' '), HB_TAG('I','P','K',' ')}, /* Northwest Alaska Inupiatun -> Inupiat */
-/*{HB_TAG('e','s','u',' '), HB_TAG('E','S','U',' ')},*/ /* Central Yupik */
{HB_TAG('e','t','o',' '), HB_TAG('B','T','I',' ')}, /* Eton (Cameroon) -> Beti */
- {HB_TAG('e','u','q',' '), HB_TAG_NONE }, /* Basque [collection] != Basque */
{HB_TAG('e','v','e',' '), HB_TAG('E','V','N',' ')}, /* Even */
{HB_TAG('e','v','n',' '), HB_TAG('E','V','K',' ')}, /* Evenki */
{HB_TAG('e','w','o',' '), HB_TAG('B','T','I',' ')}, /* Ewondo -> Beti */
{HB_TAG('e','y','o',' '), HB_TAG('K','A','L',' ')}, /* Keiyo -> Kalenjin */
{HB_TAG('f','a','b',' '), HB_TAG('C','P','P',' ')}, /* Fa d'Ambu -> Creoles */
- {HB_TAG('f','a','n',' '), HB_TAG('F','A','N','0')}, /* Fang (Equatorial Guinea) */
- {HB_TAG('f','a','n',' '), HB_TAG('B','T','I',' ')}, /* Fang (Equatorial Guinea) -> Beti */
- {HB_TAG('f','a','r',' '), HB_TAG_NONE }, /* Fataleka != Persian */
- {HB_TAG('f','a','t',' '), HB_TAG('F','A','T',' ')}, /* Fanti */
- {HB_TAG('f','a','t',' '), HB_TAG('A','K','A',' ')}, /* Fanti -> Akan */
{HB_TAG('f','b','l',' '), HB_TAG('B','I','K',' ')}, /* West Albay Bikol -> Bikol */
{HB_TAG('f','f','m',' '), HB_TAG('F','U','L',' ')}, /* Maasina Fulfulde -> Fulah */
{HB_TAG('f','i','l',' '), HB_TAG('P','I','L',' ')}, /* Filipino */
- {HB_TAG('f','l','m',' '), HB_TAG('H','A','L',' ')}, /* Halam (Falam Chin) (retired code) */
- {HB_TAG('f','l','m',' '), HB_TAG('Q','I','N',' ')}, /* Falam Chin (retired code) -> Chin */
- {HB_TAG('f','m','p',' '), HB_TAG('F','M','P',' ')}, /* Fe’fe’ */
- {HB_TAG('f','m','p',' '), HB_TAG('B','M','L',' ')}, /* Fe'fe' -> Bamileke */
{HB_TAG('f','n','g',' '), HB_TAG('C','P','P',' ')}, /* Fanagalo -> Creoles */
-/*{HB_TAG('f','o','n',' '), HB_TAG('F','O','N',' ')},*/ /* Fon */
- {HB_TAG('f','o','s',' '), HB_TAG_NONE }, /* Siraya != Faroese */
{HB_TAG('f','p','e',' '), HB_TAG('C','P','P',' ')}, /* Fernando Po Creole English -> Creoles */
-/*{HB_TAG('f','r','c',' '), HB_TAG('F','R','C',' ')},*/ /* Cajun French */
-/*{HB_TAG('f','r','p',' '), HB_TAG('F','R','P',' ')},*/ /* Arpitan */
{HB_TAG('f','u','b',' '), HB_TAG('F','U','L',' ')}, /* Adamawa Fulfulde -> Fulah */
{HB_TAG('f','u','c',' '), HB_TAG('F','U','L',' ')}, /* Pulaar -> Fulah */
{HB_TAG('f','u','e',' '), HB_TAG('F','U','L',' ')}, /* Borgu Fulfulde -> Fulah */
- {HB_TAG('f','u','f',' '), HB_TAG('F','T','A',' ')}, /* Pular -> Futa */
- {HB_TAG('f','u','f',' '), HB_TAG('F','U','L',' ')}, /* Pular -> Fulah */
{HB_TAG('f','u','h',' '), HB_TAG('F','U','L',' ')}, /* Western Niger Fulfulde -> Fulah */
{HB_TAG('f','u','i',' '), HB_TAG('F','U','L',' ')}, /* Bagirmi Fulfulde -> Fulah */
{HB_TAG('f','u','q',' '), HB_TAG('F','U','L',' ')}, /* Central-Eastern Niger Fulfulde -> Fulah */
{HB_TAG('f','u','r',' '), HB_TAG('F','R','L',' ')}, /* Friulian */
- {HB_TAG('f','u','v',' '), HB_TAG('F','U','V',' ')}, /* Nigerian Fulfulde */
- {HB_TAG('f','u','v',' '), HB_TAG('F','U','L',' ')}, /* Nigerian Fulfulde -> Fulah */
{HB_TAG('g','a','a',' '), HB_TAG('G','A','D',' ')}, /* Ga */
{HB_TAG('g','a','c',' '), HB_TAG('C','P','P',' ')}, /* Mixed Great Andamanese -> Creoles */
- {HB_TAG('g','a','d',' '), HB_TAG_NONE }, /* Gaddang != Ga */
- {HB_TAG('g','a','e',' '), HB_TAG_NONE }, /* Guarequena != Scottish Gaelic */
-/*{HB_TAG('g','a','g',' '), HB_TAG('G','A','G',' ')},*/ /* Gagauz */
- {HB_TAG('g','a','l',' '), HB_TAG_NONE }, /* Galolen != Galician */
{HB_TAG('g','a','n',' '), HB_TAG('Z','H','S',' ')}, /* Gan Chinese -> Chinese, Simplified */
- {HB_TAG('g','a','r',' '), HB_TAG_NONE }, /* Galeya != Garshuni */
- {HB_TAG('g','a','w',' '), HB_TAG_NONE }, /* Nobonob != Garhwali */
{HB_TAG('g','a','x',' '), HB_TAG('O','R','O',' ')}, /* Borana-Arsi-Guji Oromo -> Oromo */
{HB_TAG('g','a','z',' '), HB_TAG('O','R','O',' ')}, /* West Central Oromo -> Oromo */
{HB_TAG('g','b','m',' '), HB_TAG('G','A','W',' ')}, /* Garhwali */
@@ -663,69 +643,46 @@
{HB_TAG('g','c','l',' '), HB_TAG('C','P','P',' ')}, /* Grenadian Creole English -> Creoles */
{HB_TAG('g','c','r',' '), HB_TAG('C','P','P',' ')}, /* Guianese Creole French -> Creoles */
{HB_TAG('g','d','a',' '), HB_TAG('R','A','J',' ')}, /* Gade Lohar -> Rajasthani */
-/*{HB_TAG('g','e','z',' '), HB_TAG('G','E','Z',' ')},*/ /* Geez */
{HB_TAG('g','g','o',' '), HB_TAG('G','O','N',' ')}, /* Southern Gondi (retired code) -> Gondi */
{HB_TAG('g','h','a',' '), HB_TAG('B','B','R',' ')}, /* Ghadamès -> Berber */
{HB_TAG('g','h','c',' '), HB_TAG('I','R','T',' ')}, /* Hiberno-Scottish Gaelic -> Irish Traditional */
{HB_TAG('g','h','k',' '), HB_TAG('K','R','N',' ')}, /* Geko Karen -> Karen */
{HB_TAG('g','h','o',' '), HB_TAG('B','B','R',' ')}, /* Ghomara -> Berber */
{HB_TAG('g','i','b',' '), HB_TAG('C','P','P',' ')}, /* Gibanawa -> Creoles */
-/*{HB_TAG('g','i','h',' '), HB_TAG('G','I','H',' ')},*/ /* Githabul */
{HB_TAG('g','i','l',' '), HB_TAG('G','I','L','0')}, /* Kiribati (Gilbertese) */
{HB_TAG('g','j','u',' '), HB_TAG('R','A','J',' ')}, /* Gujari -> Rajasthani */
- {HB_TAG('g','k','p',' '), HB_TAG('G','K','P',' ')}, /* Guinea Kpelle -> Kpelle (Guinea) */
- {HB_TAG('g','k','p',' '), HB_TAG('K','P','L',' ')}, /* Guinea Kpelle -> Kpelle */
{HB_TAG('g','l','d',' '), HB_TAG('N','A','N',' ')}, /* Nanai */
-/*{HB_TAG('g','l','k',' '), HB_TAG('G','L','K',' ')},*/ /* Gilaki */
- {HB_TAG('g','m','z',' '), HB_TAG_NONE }, /* Mgbolizhia != Gumuz */
{HB_TAG('g','n','b',' '), HB_TAG('Q','I','N',' ')}, /* Gangte -> Chin */
-/*{HB_TAG('g','n','n',' '), HB_TAG('G','N','N',' ')},*/ /* Gumatj */
{HB_TAG('g','n','o',' '), HB_TAG('G','O','N',' ')}, /* Northern Gondi -> Gondi */
{HB_TAG('g','n','w',' '), HB_TAG('G','U','A',' ')}, /* Western Bolivian Guaraní -> Guarani */
-/*{HB_TAG('g','o','g',' '), HB_TAG('G','O','G',' ')},*/ /* Gogo */
{HB_TAG('g','o','m',' '), HB_TAG('K','O','K',' ')}, /* Goan Konkani -> Konkani */
-/*{HB_TAG('g','o','n',' '), HB_TAG('G','O','N',' ')},*/ /* Gondi [macrolanguage] */
{HB_TAG('g','o','q',' '), HB_TAG('C','P','P',' ')}, /* Gorap -> Creoles */
{HB_TAG('g','o','x',' '), HB_TAG('B','A','D','0')}, /* Gobu -> Banda */
{HB_TAG('g','p','e',' '), HB_TAG('C','P','P',' ')}, /* Ghanaian Pidgin English -> Creoles */
- {HB_TAG('g','r','o',' '), HB_TAG_NONE }, /* Groma != Garo */
{HB_TAG('g','r','r',' '), HB_TAG('B','B','R',' ')}, /* Taznatit -> Berber */
{HB_TAG('g','r','t',' '), HB_TAG('G','R','O',' ')}, /* Garo */
{HB_TAG('g','r','u',' '), HB_TAG('S','O','G',' ')}, /* Kistane -> Sodo Gurage */
{HB_TAG('g','s','w',' '), HB_TAG('A','L','S',' ')}, /* Alsatian */
- {HB_TAG('g','u','a',' '), HB_TAG_NONE }, /* Shiki != Guarani */
-/*{HB_TAG('g','u','c',' '), HB_TAG('G','U','C',' ')},*/ /* Wayuu */
-/*{HB_TAG('g','u','f',' '), HB_TAG('G','U','F',' ')},*/ /* Gupapuyngu */
{HB_TAG('g','u','g',' '), HB_TAG('G','U','A',' ')}, /* Paraguayan Guaraní -> Guarani */
{HB_TAG('g','u','i',' '), HB_TAG('G','U','A',' ')}, /* Eastern Bolivian Guaraní -> Guarani */
{HB_TAG('g','u','k',' '), HB_TAG('G','M','Z',' ')}, /* Gumuz */
{HB_TAG('g','u','l',' '), HB_TAG('C','P','P',' ')}, /* Sea Island Creole English -> Creoles */
{HB_TAG('g','u','n',' '), HB_TAG('G','U','A',' ')}, /* Mbyá Guaraní -> Guarani */
-/*{HB_TAG('g','u','z',' '), HB_TAG('G','U','Z',' ')},*/ /* Gusii */
{HB_TAG('g','w','i',' '), HB_TAG('A','T','H',' ')}, /* Gwichʼin -> Athapaskan */
{HB_TAG('g','y','n',' '), HB_TAG('C','P','P',' ')}, /* Guyanese Creole English -> Creoles */
{HB_TAG('h','a','a',' '), HB_TAG('A','T','H',' ')}, /* Hän -> Athapaskan */
{HB_TAG('h','a','e',' '), HB_TAG('O','R','O',' ')}, /* Eastern Oromo -> Oromo */
{HB_TAG('h','a','i',' '), HB_TAG('H','A','I','0')}, /* Haida [macrolanguage] */
{HB_TAG('h','a','k',' '), HB_TAG('Z','H','S',' ')}, /* Hakka Chinese -> Chinese, Simplified */
- {HB_TAG('h','a','l',' '), HB_TAG_NONE }, /* Halang != Halam (Falam Chin) */
{HB_TAG('h','a','r',' '), HB_TAG('H','R','I',' ')}, /* Harari */
-/*{HB_TAG('h','a','w',' '), HB_TAG('H','A','W',' ')},*/ /* Hawaiian */
{HB_TAG('h','a','x',' '), HB_TAG('H','A','I','0')}, /* Southern Haida -> Haida */
-/*{HB_TAG('h','a','y',' '), HB_TAG('H','A','Y',' ')},*/ /* Haya */
-/*{HB_TAG('h','a','z',' '), HB_TAG('H','A','Z',' ')},*/ /* Hazaragi */
- {HB_TAG('h','b','n',' '), HB_TAG_NONE }, /* Heiban != Hammer-Banna */
{HB_TAG('h','c','a',' '), HB_TAG('C','P','P',' ')}, /* Andaman Creole Hindi -> Creoles */
{HB_TAG('h','d','n',' '), HB_TAG('H','A','I','0')}, /* Northern Haida -> Haida */
{HB_TAG('h','e','a',' '), HB_TAG('H','M','N',' ')}, /* Northern Qiandong Miao -> Hmong */
-/*{HB_TAG('h','e','i',' '), HB_TAG('H','E','I',' ')},*/ /* Heiltsuk */
-/*{HB_TAG('h','i','l',' '), HB_TAG('H','I','L',' ')},*/ /* Hiligaynon */
{HB_TAG('h','j','i',' '), HB_TAG('M','L','Y',' ')}, /* Haji -> Malay */
{HB_TAG('h','l','t',' '), HB_TAG('Q','I','N',' ')}, /* Matu Chin -> Chin */
{HB_TAG('h','m','a',' '), HB_TAG('H','M','N',' ')}, /* Southern Mashan Hmong -> Hmong */
{HB_TAG('h','m','c',' '), HB_TAG('H','M','N',' ')}, /* Central Huishui Hmong -> Hmong */
- {HB_TAG('h','m','d',' '), HB_TAG('H','M','D',' ')}, /* Large Flowery Miao -> A-Hmao */
- {HB_TAG('h','m','d',' '), HB_TAG('H','M','N',' ')}, /* Large Flowery Miao -> Hmong */
{HB_TAG('h','m','e',' '), HB_TAG('H','M','N',' ')}, /* Eastern Huishui Hmong -> Hmong */
{HB_TAG('h','m','g',' '), HB_TAG('H','M','N',' ')}, /* Southwestern Guiyang Hmong -> Hmong */
{HB_TAG('h','m','h',' '), HB_TAG('H','M','N',' ')}, /* Southwestern Huishui Hmong -> Hmong */
@@ -733,36 +690,27 @@
{HB_TAG('h','m','j',' '), HB_TAG('H','M','N',' ')}, /* Ge -> Hmong */
{HB_TAG('h','m','l',' '), HB_TAG('H','M','N',' ')}, /* Luopohe Hmong -> Hmong */
{HB_TAG('h','m','m',' '), HB_TAG('H','M','N',' ')}, /* Central Mashan Hmong -> Hmong */
-/*{HB_TAG('h','m','n',' '), HB_TAG('H','M','N',' ')},*/ /* Hmong [macrolanguage] */
{HB_TAG('h','m','p',' '), HB_TAG('H','M','N',' ')}, /* Northern Mashan Hmong -> Hmong */
{HB_TAG('h','m','q',' '), HB_TAG('H','M','N',' ')}, /* Eastern Qiandong Miao -> Hmong */
{HB_TAG('h','m','r',' '), HB_TAG('Q','I','N',' ')}, /* Hmar -> Chin */
{HB_TAG('h','m','s',' '), HB_TAG('H','M','N',' ')}, /* Southern Qiandong Miao -> Hmong */
{HB_TAG('h','m','w',' '), HB_TAG('H','M','N',' ')}, /* Western Mashan Hmong -> Hmong */
{HB_TAG('h','m','y',' '), HB_TAG('H','M','N',' ')}, /* Southern Guiyang Hmong -> Hmong */
- {HB_TAG('h','m','z',' '), HB_TAG('H','M','Z',' ')}, /* Hmong Shua -> Hmong Shuat */
- {HB_TAG('h','m','z',' '), HB_TAG('H','M','N',' ')}, /* Hmong Shua -> Hmong */
-/*{HB_TAG('h','n','d',' '), HB_TAG('H','N','D',' ')},*/ /* Southern Hindko -> Hindko */
{HB_TAG('h','n','e',' '), HB_TAG('C','H','H',' ')}, /* Chhattisgarhi -> Chattisgarhi */
{HB_TAG('h','n','j',' '), HB_TAG('H','M','N',' ')}, /* Hmong Njua -> Hmong */
{HB_TAG('h','n','m',' '), HB_TAG('Z','H','S',' ')}, /* Hainanese -> Chinese, Simplified */
{HB_TAG('h','n','o',' '), HB_TAG('H','N','D',' ')}, /* Northern Hindko -> Hindko */
{HB_TAG('h','o','c',' '), HB_TAG('H','O',' ',' ')}, /* Ho */
{HB_TAG('h','o','i',' '), HB_TAG('A','T','H',' ')}, /* Holikachuk -> Athapaskan */
- {HB_TAG('h','o','j',' '), HB_TAG('H','A','R',' ')}, /* Hadothi -> Harauti */
- {HB_TAG('h','o','j',' '), HB_TAG('R','A','J',' ')}, /* Hadothi -> Rajasthani */
{HB_TAG('h','r','a',' '), HB_TAG('Q','I','N',' ')}, /* Hrangkhol -> Chin */
{HB_TAG('h','r','m',' '), HB_TAG('H','M','N',' ')}, /* Horned Miao -> Hmong */
{HB_TAG('h','s','b',' '), HB_TAG('U','S','B',' ')}, /* Upper Sorbian */
{HB_TAG('h','s','n',' '), HB_TAG('Z','H','S',' ')}, /* Xiang Chinese -> Chinese, Simplified */
{HB_TAG('h','u','j',' '), HB_TAG('H','M','N',' ')}, /* Northern Guiyang Hmong -> Hmong */
{HB_TAG('h','u','p',' '), HB_TAG('A','T','H',' ')}, /* Hupa -> Athapaskan */
-/*{HB_TAG('h','u','r',' '), HB_TAG('H','U','R',' ')},*/ /* Halkomelem */
{HB_TAG('h','u','s',' '), HB_TAG('M','Y','N',' ')}, /* Huastec -> Mayan */
{HB_TAG('h','w','c',' '), HB_TAG('C','P','P',' ')}, /* Hawai'i Creole English -> Creoles */
{HB_TAG('h','y','w',' '), HB_TAG('H','Y','E',' ')}, /* Western Armenian -> Armenian */
-/*{HB_TAG('i','b','a',' '), HB_TAG('I','B','A',' ')},*/ /* Iban */
-/*{HB_TAG('i','b','b',' '), HB_TAG('I','B','B',' ')},*/ /* Ibibio */
{HB_TAG('i','b','y',' '), HB_TAG('I','J','O',' ')}, /* Ibani -> Ijo */
{HB_TAG('i','c','r',' '), HB_TAG('C','P','P',' ')}, /* Islander Creole English -> Creoles */
{HB_TAG('i','d','a',' '), HB_TAG('L','U','H',' ')}, /* Idakho-Isukha-Tiriki -> Luyia */
@@ -772,156 +720,71 @@
{HB_TAG('i','j','c',' '), HB_TAG('I','J','O',' ')}, /* Izon -> Ijo */
{HB_TAG('i','j','e',' '), HB_TAG('I','J','O',' ')}, /* Biseni -> Ijo */
{HB_TAG('i','j','n',' '), HB_TAG('I','J','O',' ')}, /* Kalabari -> Ijo */
-/*{HB_TAG('i','j','o',' '), HB_TAG('I','J','O',' ')},*/ /* Ijo [collection] */
{HB_TAG('i','j','s',' '), HB_TAG('I','J','O',' ')}, /* Southeast Ijo -> Ijo */
- {HB_TAG('i','k','e',' '), HB_TAG('I','N','U',' ')}, /* Eastern Canadian Inuktitut -> Inuktitut */
- {HB_TAG('i','k','e',' '), HB_TAG('I','N','U','K')}, /* Eastern Canadian Inuktitut -> Nunavik Inuktitut */
{HB_TAG('i','k','t',' '), HB_TAG('I','N','U',' ')}, /* Inuinnaqtun -> Inuktitut */
-/*{HB_TAG('i','l','o',' '), HB_TAG('I','L','O',' ')},*/ /* Iloko -> Ilokano */
{HB_TAG('i','n','g',' '), HB_TAG('A','T','H',' ')}, /* Degexit'an -> Athapaskan */
{HB_TAG('i','n','h',' '), HB_TAG('I','N','G',' ')}, /* Ingush */
- {HB_TAG('i','r','i',' '), HB_TAG_NONE }, /* Rigwe != Irish */
-/*{HB_TAG('i','r','u',' '), HB_TAG('I','R','U',' ')},*/ /* Irula */
- {HB_TAG('i','s','m',' '), HB_TAG_NONE }, /* Masimasi != Inari Sami */
{HB_TAG('i','t','z',' '), HB_TAG('M','Y','N',' ')}, /* Itzá -> Mayan */
{HB_TAG('i','x','l',' '), HB_TAG('M','Y','N',' ')}, /* Ixil -> Mayan */
{HB_TAG('j','a','c',' '), HB_TAG('M','Y','N',' ')}, /* Popti' -> Mayan */
{HB_TAG('j','a','k',' '), HB_TAG('M','L','Y',' ')}, /* Jakun -> Malay */
- {HB_TAG('j','a','m',' '), HB_TAG('J','A','M',' ')}, /* Jamaican Creole English -> Jamaican Creole */
- {HB_TAG('j','a','m',' '), HB_TAG('C','P','P',' ')}, /* Jamaican Creole English -> Creoles */
- {HB_TAG('j','a','n',' '), HB_TAG_NONE }, /* Jandai != Japanese */
{HB_TAG('j','a','x',' '), HB_TAG('M','L','Y',' ')}, /* Jambi Malay -> Malay */
{HB_TAG('j','b','e',' '), HB_TAG('B','B','R',' ')}, /* Judeo-Berber -> Berber */
{HB_TAG('j','b','n',' '), HB_TAG('B','B','R',' ')}, /* Nafusi -> Berber */
-/*{HB_TAG('j','b','o',' '), HB_TAG('J','B','O',' ')},*/ /* Lojban */
-/*{HB_TAG('j','c','t',' '), HB_TAG('J','C','T',' ')},*/ /* Krymchak */
-/*{HB_TAG('j','d','t',' '), HB_TAG('J','D','T',' ')},*/ /* Judeo-Tat */
{HB_TAG('j','g','o',' '), HB_TAG('B','M','L',' ')}, /* Ngomba -> Bamileke */
- {HB_TAG('j','i','i',' '), HB_TAG_NONE }, /* Jiiddu != Yiddish */
{HB_TAG('j','k','m',' '), HB_TAG('K','R','N',' ')}, /* Mobwa Karen -> Karen */
{HB_TAG('j','k','p',' '), HB_TAG('K','R','N',' ')}, /* Paku Karen -> Karen */
- {HB_TAG('j','u','d',' '), HB_TAG_NONE }, /* Worodougou != Ladino */
- {HB_TAG('j','u','l',' '), HB_TAG_NONE }, /* Jirel != Jula */
{HB_TAG('j','v','d',' '), HB_TAG('C','P','P',' ')}, /* Javindo -> Creoles */
{HB_TAG('k','a','a',' '), HB_TAG('K','R','K',' ')}, /* Karakalpak */
- {HB_TAG('k','a','b',' '), HB_TAG('K','A','B','0')}, /* Kabyle */
- {HB_TAG('k','a','b',' '), HB_TAG('B','B','R',' ')}, /* Kabyle -> Berber */
- {HB_TAG('k','a','c',' '), HB_TAG_NONE }, /* Kachin != Kachchi */
{HB_TAG('k','a','m',' '), HB_TAG('K','M','B',' ')}, /* Kamba (Kenya) */
{HB_TAG('k','a','r',' '), HB_TAG('K','R','N',' ')}, /* Karen [collection] */
-/*{HB_TAG('k','a','w',' '), HB_TAG('K','A','W',' ')},*/ /* Kawi (Old Javanese) */
-/*{HB_TAG('k','b','c',' '), HB_TAG('K','B','C',' ')},*/ /* Kadiwéu */
{HB_TAG('k','b','d',' '), HB_TAG('K','A','B',' ')}, /* Kabardian */
{HB_TAG('k','b','y',' '), HB_TAG('K','N','R',' ')}, /* Manga Kanuri -> Kanuri */
- {HB_TAG('k','c','a',' '), HB_TAG('K','H','K',' ')}, /* Khanty -> Khanty-Kazim */
- {HB_TAG('k','c','a',' '), HB_TAG('K','H','S',' ')}, /* Khanty -> Khanty-Shurishkar */
- {HB_TAG('k','c','a',' '), HB_TAG('K','H','V',' ')}, /* Khanty -> Khanty-Vakhi */
{HB_TAG('k','c','n',' '), HB_TAG('C','P','P',' ')}, /* Nubi -> Creoles */
-/*{HB_TAG('k','d','e',' '), HB_TAG('K','D','E',' ')},*/ /* Makonde */
{HB_TAG('k','d','r',' '), HB_TAG('K','R','M',' ')}, /* Karaim */
{HB_TAG('k','d','t',' '), HB_TAG('K','U','Y',' ')}, /* Kuy */
- {HB_TAG('k','e','a',' '), HB_TAG('K','E','A',' ')}, /* Kabuverdianu (Crioulo) */
- {HB_TAG('k','e','a',' '), HB_TAG('C','P','P',' ')}, /* Kabuverdianu -> Creoles */
- {HB_TAG('k','e','b',' '), HB_TAG_NONE }, /* Kélé != Kebena */
- {HB_TAG('k','e','k',' '), HB_TAG('K','E','K',' ')}, /* Kekchi */
- {HB_TAG('k','e','k',' '), HB_TAG('M','Y','N',' ')}, /* Kekchí -> Mayan */
{HB_TAG('k','e','x',' '), HB_TAG('K','K','N',' ')}, /* Kukna -> Kokni */
{HB_TAG('k','f','a',' '), HB_TAG('K','O','D',' ')}, /* Kodava -> Kodagu */
{HB_TAG('k','f','r',' '), HB_TAG('K','A','C',' ')}, /* Kachhi -> Kachchi */
{HB_TAG('k','f','x',' '), HB_TAG('K','U','L',' ')}, /* Kullu Pahari -> Kulvi */
{HB_TAG('k','f','y',' '), HB_TAG('K','M','N',' ')}, /* Kumaoni */
- {HB_TAG('k','g','e',' '), HB_TAG_NONE }, /* Komering != Khutsuri Georgian */
-/*{HB_TAG('k','g','f',' '), HB_TAG('K','G','F',' ')},*/ /* Kube */
{HB_TAG('k','h','a',' '), HB_TAG('K','S','I',' ')}, /* Khasi */
{HB_TAG('k','h','b',' '), HB_TAG('X','B','D',' ')}, /* Lü */
{HB_TAG('k','h','k',' '), HB_TAG('M','N','G',' ')}, /* Halh Mongolian -> Mongolian */
- {HB_TAG('k','h','n',' '), HB_TAG_NONE }, /* Khandesi != Khamti Shan (Microsoft fonts) */
- {HB_TAG('k','h','s',' '), HB_TAG_NONE }, /* Kasua != Khanty-Shurishkar */
- {HB_TAG('k','h','t',' '), HB_TAG('K','H','T',' ')}, /* Khamti -> Khamti Shan */
- {HB_TAG('k','h','t',' '), HB_TAG('K','H','N',' ')}, /* Khamti -> Khamti Shan (Microsoft fonts) */
- {HB_TAG('k','h','v',' '), HB_TAG_NONE }, /* Khvarshi != Khanty-Vakhi */
-/*{HB_TAG('k','h','w',' '), HB_TAG('K','H','W',' ')},*/ /* Khowar */
- {HB_TAG('k','i','s',' '), HB_TAG_NONE }, /* Kis != Kisii */
- {HB_TAG('k','i','u',' '), HB_TAG('K','I','U',' ')}, /* Kirmanjki */
- {HB_TAG('k','i','u',' '), HB_TAG('Z','Z','A',' ')}, /* Kirmanjki -> Zazaki */
{HB_TAG('k','j','b',' '), HB_TAG('M','Y','N',' ')}, /* Q'anjob'al -> Mayan */
-/*{HB_TAG('k','j','d',' '), HB_TAG('K','J','D',' ')},*/ /* Southern Kiwai */
{HB_TAG('k','j','h',' '), HB_TAG('K','H','A',' ')}, /* Khakas -> Khakass */
-/*{HB_TAG('k','j','j',' '), HB_TAG('K','J','J',' ')},*/ /* Khinalugh -> Khinalug */
- {HB_TAG('k','j','p',' '), HB_TAG('K','J','P',' ')}, /* Pwo Eastern Karen -> Eastern Pwo Karen */
- {HB_TAG('k','j','p',' '), HB_TAG('K','R','N',' ')}, /* Pwo Eastern Karen -> Karen */
{HB_TAG('k','j','t',' '), HB_TAG('K','R','N',' ')}, /* Phrae Pwo Karen -> Karen */
-/*{HB_TAG('k','j','z',' '), HB_TAG('K','J','Z',' ')},*/ /* Bumthangkha */
- {HB_TAG('k','k','n',' '), HB_TAG_NONE }, /* Kon Keu != Kokni */
{HB_TAG('k','k','z',' '), HB_TAG('A','T','H',' ')}, /* Kaska -> Athapaskan */
- {HB_TAG('k','l','m',' '), HB_TAG_NONE }, /* Migum != Kalmyk */
{HB_TAG('k','l','n',' '), HB_TAG('K','A','L',' ')}, /* Kalenjin [macrolanguage] */
{HB_TAG('k','m','b',' '), HB_TAG('M','B','N',' ')}, /* Kimbundu -> Mbundu */
-/*{HB_TAG('k','m','g',' '), HB_TAG('K','M','G',' ')},*/ /* Kâte */
- {HB_TAG('k','m','n',' '), HB_TAG_NONE }, /* Awtuw != Kumaoni */
- {HB_TAG('k','m','o',' '), HB_TAG_NONE }, /* Kwoma != Komo */
{HB_TAG('k','m','r',' '), HB_TAG('K','U','R',' ')}, /* Northern Kurdish -> Kurdish */
- {HB_TAG('k','m','s',' '), HB_TAG_NONE }, /* Kamasau != Komso */
{HB_TAG('k','m','v',' '), HB_TAG('C','P','P',' ')}, /* Karipúna Creole French -> Creoles */
{HB_TAG('k','m','w',' '), HB_TAG('K','M','O',' ')}, /* Komo (Democratic Republic of Congo) */
-/*{HB_TAG('k','m','z',' '), HB_TAG('K','M','Z',' ')},*/ /* Khorasani Turkish -> Khorasani Turkic */
{HB_TAG('k','n','c',' '), HB_TAG('K','N','R',' ')}, /* Central Kanuri -> Kanuri */
{HB_TAG('k','n','g',' '), HB_TAG('K','O','N','0')}, /* Koongo -> Kongo */
{HB_TAG('k','n','j',' '), HB_TAG('M','Y','N',' ')}, /* Western Kanjobal -> Mayan */
{HB_TAG('k','n','n',' '), HB_TAG('K','O','K',' ')}, /* Konkani */
- {HB_TAG('k','n','r',' '), HB_TAG_NONE }, /* Kaningra != Kanuri */
- {HB_TAG('k','o','d',' '), HB_TAG_NONE }, /* Kodi != Kodagu */
- {HB_TAG('k','o','h',' '), HB_TAG_NONE }, /* Koyo != Korean Old Hangul */
- {HB_TAG('k','o','i',' '), HB_TAG('K','O','P',' ')}, /* Komi-Permyak */
- {HB_TAG('k','o','i',' '), HB_TAG('K','O','M',' ')}, /* Komi-Permyak -> Komi */
-/*{HB_TAG('k','o','k',' '), HB_TAG('K','O','K',' ')},*/ /* Konkani [macrolanguage] */
- {HB_TAG('k','o','p',' '), HB_TAG_NONE }, /* Waube != Komi-Permyak */
-/*{HB_TAG('k','o','s',' '), HB_TAG('K','O','S',' ')},*/ /* Kosraean */
{HB_TAG('k','o','y',' '), HB_TAG('A','T','H',' ')}, /* Koyukon -> Athapaskan */
- {HB_TAG('k','o','z',' '), HB_TAG_NONE }, /* Korak != Komi-Zyrian */
{HB_TAG('k','p','e',' '), HB_TAG('K','P','L',' ')}, /* Kpelle [macrolanguage] */
- {HB_TAG('k','p','l',' '), HB_TAG_NONE }, /* Kpala != Kpelle */
{HB_TAG('k','p','p',' '), HB_TAG('K','R','N',' ')}, /* Paku Karen (retired code) -> Karen */
- {HB_TAG('k','p','v',' '), HB_TAG('K','O','Z',' ')}, /* Komi-Zyrian */
- {HB_TAG('k','p','v',' '), HB_TAG('K','O','M',' ')}, /* Komi-Zyrian -> Komi */
{HB_TAG('k','p','y',' '), HB_TAG('K','Y','K',' ')}, /* Koryak */
{HB_TAG('k','q','s',' '), HB_TAG('K','I','S',' ')}, /* Northern Kissi -> Kisii */
{HB_TAG('k','q','y',' '), HB_TAG('K','R','T',' ')}, /* Koorete */
- {HB_TAG('k','r','c',' '), HB_TAG('K','A','R',' ')}, /* Karachay-Balkar -> Karachay */
- {HB_TAG('k','r','c',' '), HB_TAG('B','A','L',' ')}, /* Karachay-Balkar -> Balkar */
- {HB_TAG('k','r','i',' '), HB_TAG('K','R','I',' ')}, /* Krio */
- {HB_TAG('k','r','i',' '), HB_TAG('C','P','P',' ')}, /* Krio -> Creoles */
- {HB_TAG('k','r','k',' '), HB_TAG_NONE }, /* Kerek != Karakalpak */
-/*{HB_TAG('k','r','l',' '), HB_TAG('K','R','L',' ')},*/ /* Karelian */
- {HB_TAG('k','r','m',' '), HB_TAG_NONE }, /* Krim (retired code) != Karaim */
- {HB_TAG('k','r','n',' '), HB_TAG_NONE }, /* Sapo != Karen */
{HB_TAG('k','r','t',' '), HB_TAG('K','N','R',' ')}, /* Tumari Kanuri -> Kanuri */
{HB_TAG('k','r','u',' '), HB_TAG('K','U','U',' ')}, /* Kurukh */
{HB_TAG('k','s','h',' '), HB_TAG('K','S','H','0')}, /* Kölsch -> Ripuarian */
- {HB_TAG('k','s','i',' '), HB_TAG_NONE }, /* Krisa != Khasi */
- {HB_TAG('k','s','m',' '), HB_TAG_NONE }, /* Kumba != Kildin Sami */
{HB_TAG('k','s','s',' '), HB_TAG('K','I','S',' ')}, /* Southern Kisi -> Kisii */
-/*{HB_TAG('k','s','u',' '), HB_TAG('K','S','U',' ')},*/ /* Khamyang */
- {HB_TAG('k','s','w',' '), HB_TAG('K','S','W',' ')}, /* S’gaw Karen */
- {HB_TAG('k','s','w',' '), HB_TAG('K','R','N',' ')}, /* S'gaw Karen -> Karen */
{HB_TAG('k','t','b',' '), HB_TAG('K','E','B',' ')}, /* Kambaata -> Kebena */
{HB_TAG('k','t','u',' '), HB_TAG('K','O','N',' ')}, /* Kituba (Democratic Republic of Congo) -> Kikongo */
{HB_TAG('k','t','w',' '), HB_TAG('A','T','H',' ')}, /* Kato -> Athapaskan */
- {HB_TAG('k','u','i',' '), HB_TAG_NONE }, /* Kuikúro-Kalapálo != Kui */
- {HB_TAG('k','u','l',' '), HB_TAG_NONE }, /* Kulere != Kulvi */
-/*{HB_TAG('k','u','m',' '), HB_TAG('K','U','M',' ')},*/ /* Kumyk */
{HB_TAG('k','u','u',' '), HB_TAG('A','T','H',' ')}, /* Upper Kuskokwim -> Athapaskan */
{HB_TAG('k','u','w',' '), HB_TAG('B','A','D','0')}, /* Kpagua -> Banda */
- {HB_TAG('k','u','y',' '), HB_TAG_NONE }, /* Kuuku-Ya'u != Kuy */
{HB_TAG('k','v','b',' '), HB_TAG('M','L','Y',' ')}, /* Kubu -> Malay */
{HB_TAG('k','v','l',' '), HB_TAG('K','R','N',' ')}, /* Kayaw -> Karen */
- {HB_TAG('k','v','q',' '), HB_TAG('K','V','Q',' ')}, /* Geba Karen */
- {HB_TAG('k','v','q',' '), HB_TAG('K','R','N',' ')}, /* Geba Karen -> Karen */
{HB_TAG('k','v','r',' '), HB_TAG('M','L','Y',' ')}, /* Kerinci -> Malay */
{HB_TAG('k','v','t',' '), HB_TAG('K','R','N',' ')}, /* Lahta Karen -> Karen */
{HB_TAG('k','v','u',' '), HB_TAG('K','R','N',' ')}, /* Yinbaw Karen -> Karen */
{HB_TAG('k','v','y',' '), HB_TAG('K','R','N',' ')}, /* Yintale Karen -> Karen */
-/*{HB_TAG('k','w','k',' '), HB_TAG('K','W','K',' ')},*/ /* Kwakʼwala */
{HB_TAG('k','w','w',' '), HB_TAG('C','P','P',' ')}, /* Kwinti -> Creoles */
{HB_TAG('k','w','y',' '), HB_TAG('K','O','N','0')}, /* San Salvador Kongo -> Kongo */
{HB_TAG('k','x','c',' '), HB_TAG('K','M','S',' ')}, /* Konso -> Komso */
@@ -930,195 +793,98 @@
{HB_TAG('k','x','k',' '), HB_TAG('K','R','N',' ')}, /* Zayein Karen -> Karen */
{HB_TAG('k','x','l',' '), HB_TAG('K','U','U',' ')}, /* Nepali Kurux (retired code) -> Kurukh */
{HB_TAG('k','x','u',' '), HB_TAG('K','U','I',' ')}, /* Kui (India) (retired code) */
- {HB_TAG('k','y','k',' '), HB_TAG_NONE }, /* Kamayo != Koryak */
- {HB_TAG('k','y','u',' '), HB_TAG('K','Y','U',' ')}, /* Western Kayah */
- {HB_TAG('k','y','u',' '), HB_TAG('K','R','N',' ')}, /* Western Kayah -> Karen */
{HB_TAG('l','a','c',' '), HB_TAG('M','Y','N',' ')}, /* Lacandon -> Mayan */
{HB_TAG('l','a','d',' '), HB_TAG('J','U','D',' ')}, /* Ladino */
- {HB_TAG('l','a','h',' '), HB_TAG_NONE }, /* Lahnda [macrolanguage] != Lahuli */
- {HB_TAG('l','a','k',' '), HB_TAG_NONE }, /* Laka (Nigeria) (retired code) != Lak */
- {HB_TAG('l','a','m',' '), HB_TAG_NONE }, /* Lamba != Lambani */
- {HB_TAG('l','a','z',' '), HB_TAG_NONE }, /* Aribwatsa != Laz */
{HB_TAG('l','b','e',' '), HB_TAG('L','A','K',' ')}, /* Lak */
{HB_TAG('l','b','j',' '), HB_TAG('L','D','K',' ')}, /* Ladakhi */
{HB_TAG('l','b','l',' '), HB_TAG('B','I','K',' ')}, /* Libon Bikol -> Bikol */
{HB_TAG('l','c','e',' '), HB_TAG('M','L','Y',' ')}, /* Loncong -> Malay */
{HB_TAG('l','c','f',' '), HB_TAG('M','L','Y',' ')}, /* Lubu -> Malay */
{HB_TAG('l','d','i',' '), HB_TAG('K','O','N','0')}, /* Laari -> Kongo */
- {HB_TAG('l','d','k',' '), HB_TAG_NONE }, /* Leelau != Ladakhi */
-/*{HB_TAG('l','e','f',' '), HB_TAG('L','E','F',' ')},*/ /* Lelemi */
-/*{HB_TAG('l','e','z',' '), HB_TAG('L','E','Z',' ')},*/ /* Lezghian -> Lezgi */
{HB_TAG('l','i','f',' '), HB_TAG('L','M','B',' ')}, /* Limbu */
-/*{HB_TAG('l','i','j',' '), HB_TAG('L','I','J',' ')},*/ /* Ligurian */
{HB_TAG('l','i','r',' '), HB_TAG('C','P','P',' ')}, /* Liberian English -> Creoles */
-/*{HB_TAG('l','i','s',' '), HB_TAG('L','I','S',' ')},*/ /* Lisu */
-/*{HB_TAG('l','i','v',' '), HB_TAG('L','I','V',' ')},*/ /* Liv */
{HB_TAG('l','i','w',' '), HB_TAG('M','L','Y',' ')}, /* Col -> Malay */
{HB_TAG('l','i','y',' '), HB_TAG('B','A','D','0')}, /* Banda-Bambari -> Banda */
-/*{HB_TAG('l','j','p',' '), HB_TAG('L','J','P',' ')},*/ /* Lampung Api -> Lampung */
{HB_TAG('l','k','b',' '), HB_TAG('L','U','H',' ')}, /* Kabras -> Luyia */
-/*{HB_TAG('l','k','i',' '), HB_TAG('L','K','I',' ')},*/ /* Laki */
{HB_TAG('l','k','o',' '), HB_TAG('L','U','H',' ')}, /* Khayo -> Luyia */
{HB_TAG('l','k','s',' '), HB_TAG('L','U','H',' ')}, /* Kisa -> Luyia */
{HB_TAG('l','l','d',' '), HB_TAG('L','A','D',' ')}, /* Ladin */
- {HB_TAG('l','m','a',' '), HB_TAG_NONE }, /* East Limba != Low Mari */
- {HB_TAG('l','m','b',' '), HB_TAG_NONE }, /* Merei != Limbu */
{HB_TAG('l','m','n',' '), HB_TAG('L','A','M',' ')}, /* Lambadi -> Lambani */
-/*{HB_TAG('l','m','o',' '), HB_TAG('L','M','O',' ')},*/ /* Lombard */
- {HB_TAG('l','m','w',' '), HB_TAG_NONE }, /* Lake Miwok != Lomwe */
{HB_TAG('l','n','a',' '), HB_TAG('B','A','D','0')}, /* Langbashe -> Banda */
{HB_TAG('l','n','l',' '), HB_TAG('B','A','D','0')}, /* South Central Banda -> Banda */
-/*{HB_TAG('l','o','m',' '), HB_TAG('L','O','M',' ')},*/ /* Loma (Liberia) */
{HB_TAG('l','o','u',' '), HB_TAG('C','P','P',' ')}, /* Louisiana Creole -> Creoles */
-/*{HB_TAG('l','p','o',' '), HB_TAG('L','P','O',' ')},*/ /* Lipo */
-/*{HB_TAG('l','r','c',' '), HB_TAG('L','R','C',' ')},*/ /* Northern Luri -> Luri */
{HB_TAG('l','r','i',' '), HB_TAG('L','U','H',' ')}, /* Marachi -> Luyia */
{HB_TAG('l','r','m',' '), HB_TAG('L','U','H',' ')}, /* Marama -> Luyia */
{HB_TAG('l','r','t',' '), HB_TAG('C','P','P',' ')}, /* Larantuka Malay -> Creoles */
- {HB_TAG('l','s','b',' '), HB_TAG_NONE }, /* Burundian Sign Language != Lower Sorbian */
{HB_TAG('l','s','m',' '), HB_TAG('L','U','H',' ')}, /* Saamia -> Luyia */
{HB_TAG('l','t','g',' '), HB_TAG('L','V','I',' ')}, /* Latgalian -> Latvian */
- {HB_TAG('l','t','h',' '), HB_TAG_NONE }, /* Thur != Lithuanian */
{HB_TAG('l','t','o',' '), HB_TAG('L','U','H',' ')}, /* Tsotso -> Luyia */
{HB_TAG('l','t','s',' '), HB_TAG('L','U','H',' ')}, /* Tachoni -> Luyia */
-/*{HB_TAG('l','u','a',' '), HB_TAG('L','U','A',' ')},*/ /* Luba-Lulua */
{HB_TAG('l','u','h',' '), HB_TAG('Z','H','S',' ')}, /* Leizhou Chinese -> Chinese, Simplified */
-/*{HB_TAG('l','u','o',' '), HB_TAG('L','U','O',' ')},*/ /* Luo (Kenya and Tanzania) */
- {HB_TAG('l','u','s',' '), HB_TAG('M','I','Z',' ')}, /* Lushai -> Mizo */
- {HB_TAG('l','u','s',' '), HB_TAG('Q','I','N',' ')}, /* Lushai -> Chin */
-/*{HB_TAG('l','u','t',' '), HB_TAG('L','U','T',' ')},*/ /* Lushootseed */
{HB_TAG('l','u','y',' '), HB_TAG('L','U','H',' ')}, /* Luyia [macrolanguage] */
{HB_TAG('l','u','z',' '), HB_TAG('L','R','C',' ')}, /* Southern Luri -> Luri */
- {HB_TAG('l','v','i',' '), HB_TAG_NONE }, /* Lavi != Latvian */
{HB_TAG('l','v','s',' '), HB_TAG('L','V','I',' ')}, /* Standard Latvian -> Latvian */
{HB_TAG('l','w','g',' '), HB_TAG('L','U','H',' ')}, /* Wanga -> Luyia */
{HB_TAG('l','z','h',' '), HB_TAG('Z','H','T',' ')}, /* Literary Chinese -> Chinese, Traditional */
{HB_TAG('l','z','z',' '), HB_TAG('L','A','Z',' ')}, /* Laz */
-/*{HB_TAG('m','a','d',' '), HB_TAG('M','A','D',' ')},*/ /* Madurese -> Madura */
-/*{HB_TAG('m','a','g',' '), HB_TAG('M','A','G',' ')},*/ /* Magahi */
{HB_TAG('m','a','i',' '), HB_TAG('M','T','H',' ')}, /* Maithili */
- {HB_TAG('m','a','j',' '), HB_TAG_NONE }, /* Jalapa De Díaz Mazatec != Majang */
{HB_TAG('m','a','k',' '), HB_TAG('M','K','R',' ')}, /* Makasar */
- {HB_TAG('m','a','m',' '), HB_TAG('M','A','M',' ')}, /* Mam */
- {HB_TAG('m','a','m',' '), HB_TAG('M','Y','N',' ')}, /* Mam -> Mayan */
{HB_TAG('m','a','n',' '), HB_TAG('M','N','K',' ')}, /* Mandingo [macrolanguage] -> Maninka */
- {HB_TAG('m','a','p',' '), HB_TAG_NONE }, /* Austronesian [collection] != Mapudungun */
- {HB_TAG('m','a','w',' '), HB_TAG_NONE }, /* Mampruli != Marwari */
- {HB_TAG('m','a','x',' '), HB_TAG('M','L','Y',' ')}, /* North Moluccan Malay -> Malay */
- {HB_TAG('m','a','x',' '), HB_TAG('C','P','P',' ')}, /* North Moluccan Malay -> Creoles */
{HB_TAG('m','b','f',' '), HB_TAG('C','P','P',' ')}, /* Baba Malay -> Creoles */
- {HB_TAG('m','b','n',' '), HB_TAG_NONE }, /* Macaguán != Mbundu */
-/*{HB_TAG('m','b','o',' '), HB_TAG('M','B','O',' ')},*/ /* Mbo (Cameroon) */
- {HB_TAG('m','c','h',' '), HB_TAG_NONE }, /* Maquiritari != Manchu */
{HB_TAG('m','c','m',' '), HB_TAG('C','P','P',' ')}, /* Malaccan Creole Portuguese -> Creoles */
- {HB_TAG('m','c','r',' '), HB_TAG_NONE }, /* Menya != Moose Cree */
{HB_TAG('m','c','t',' '), HB_TAG('B','T','I',' ')}, /* Mengisa -> Beti */
- {HB_TAG('m','d','e',' '), HB_TAG_NONE }, /* Maba (Chad) != Mende */
{HB_TAG('m','d','f',' '), HB_TAG('M','O','K',' ')}, /* Moksha */
-/*{HB_TAG('m','d','r',' '), HB_TAG('M','D','R',' ')},*/ /* Mandar */
{HB_TAG('m','d','y',' '), HB_TAG('M','L','E',' ')}, /* Male (Ethiopia) */
{HB_TAG('m','e','n',' '), HB_TAG('M','D','E',' ')}, /* Mende (Sierra Leone) */
{HB_TAG('m','e','o',' '), HB_TAG('M','L','Y',' ')}, /* Kedah Malay -> Malay */
-/*{HB_TAG('m','e','r',' '), HB_TAG('M','E','R',' ')},*/ /* Meru */
-/*{HB_TAG('m','e','v',' '), HB_TAG('M','E','V',' ')},*/ /* Mano */
- {HB_TAG('m','f','a',' '), HB_TAG('M','F','A',' ')}, /* Pattani Malay */
- {HB_TAG('m','f','a',' '), HB_TAG('M','L','Y',' ')}, /* Pattani Malay -> Malay */
{HB_TAG('m','f','b',' '), HB_TAG('M','L','Y',' ')}, /* Bangka -> Malay */
- {HB_TAG('m','f','e',' '), HB_TAG('M','F','E',' ')}, /* Morisyen */
- {HB_TAG('m','f','e',' '), HB_TAG('C','P','P',' ')}, /* Morisyen -> Creoles */
{HB_TAG('m','f','p',' '), HB_TAG('C','P','P',' ')}, /* Makassar Malay -> Creoles */
{HB_TAG('m','g','a',' '), HB_TAG('S','G','A',' ')}, /* Middle Irish (900-1200) -> Old Irish */
{HB_TAG('m','h','c',' '), HB_TAG('M','Y','N',' ')}, /* Mocho -> Mayan */
{HB_TAG('m','h','r',' '), HB_TAG('L','M','A',' ')}, /* Eastern Mari -> Low Mari */
{HB_TAG('m','h','v',' '), HB_TAG('A','R','K',' ')}, /* Arakanese (retired code) -> Rakhine */
- {HB_TAG('m','i','n',' '), HB_TAG('M','I','N',' ')}, /* Minangkabau */
- {HB_TAG('m','i','n',' '), HB_TAG('M','L','Y',' ')}, /* Minangkabau -> Malay */
- {HB_TAG('m','i','z',' '), HB_TAG_NONE }, /* Coatzospan Mixtec != Mizo */
{HB_TAG('m','k','n',' '), HB_TAG('C','P','P',' ')}, /* Kupang Malay -> Creoles */
- {HB_TAG('m','k','r',' '), HB_TAG_NONE }, /* Malas != Makasar */
{HB_TAG('m','k','u',' '), HB_TAG('M','N','K',' ')}, /* Konyanka Maninka -> Maninka */
-/*{HB_TAG('m','k','w',' '), HB_TAG('M','K','W',' ')},*/ /* Kituba (Congo) */
- {HB_TAG('m','l','e',' '), HB_TAG_NONE }, /* Manambu != Male */
- {HB_TAG('m','l','n',' '), HB_TAG_NONE }, /* Malango != Malinke */
- {HB_TAG('m','l','q',' '), HB_TAG('M','L','N',' ')}, /* Western Maninkakan -> Malinke */
- {HB_TAG('m','l','q',' '), HB_TAG('M','N','K',' ')}, /* Western Maninkakan -> Maninka */
- {HB_TAG('m','l','r',' '), HB_TAG_NONE }, /* Vame != Malayalam Reformed */
{HB_TAG('m','m','r',' '), HB_TAG('H','M','N',' ')}, /* Western Xiangxi Miao -> Hmong */
{HB_TAG('m','n','c',' '), HB_TAG('M','C','H',' ')}, /* Manchu */
- {HB_TAG('m','n','d',' '), HB_TAG_NONE }, /* Mondé != Mandinka */
- {HB_TAG('m','n','g',' '), HB_TAG_NONE }, /* Eastern Mnong != Mongolian */
{HB_TAG('m','n','h',' '), HB_TAG('B','A','D','0')}, /* Mono (Democratic Republic of Congo) -> Banda */
-/*{HB_TAG('m','n','i',' '), HB_TAG('M','N','I',' ')},*/ /* Manipuri */
- {HB_TAG('m','n','k',' '), HB_TAG('M','N','D',' ')}, /* Mandinka */
- {HB_TAG('m','n','k',' '), HB_TAG('M','N','K',' ')}, /* Mandinka -> Maninka */
{HB_TAG('m','n','p',' '), HB_TAG('Z','H','S',' ')}, /* Min Bei Chinese -> Chinese, Simplified */
{HB_TAG('m','n','s',' '), HB_TAG('M','A','N',' ')}, /* Mansi */
- {HB_TAG('m','n','w',' '), HB_TAG('M','O','N',' ')}, /* Mon */
- {HB_TAG('m','n','w',' '), HB_TAG('M','O','N','T')}, /* Mon -> Thailand Mon */
- {HB_TAG('m','n','x',' '), HB_TAG_NONE }, /* Manikion != Manx */
{HB_TAG('m','o','d',' '), HB_TAG('C','P','P',' ')}, /* Mobilian -> Creoles */
-/*{HB_TAG('m','o','h',' '), HB_TAG('M','O','H',' ')},*/ /* Mohawk */
- {HB_TAG('m','o','k',' '), HB_TAG_NONE }, /* Morori != Moksha */
{HB_TAG('m','o','p',' '), HB_TAG('M','Y','N',' ')}, /* Mopán Maya -> Mayan */
- {HB_TAG('m','o','r',' '), HB_TAG_NONE }, /* Moro != Moroccan */
-/*{HB_TAG('m','o','s',' '), HB_TAG('M','O','S',' ')},*/ /* Mossi */
{HB_TAG('m','p','e',' '), HB_TAG('M','A','J',' ')}, /* Majang */
{HB_TAG('m','q','g',' '), HB_TAG('M','L','Y',' ')}, /* Kota Bangun Kutai Malay -> Malay */
{HB_TAG('m','r','h',' '), HB_TAG('Q','I','N',' ')}, /* Mara Chin -> Chin */
{HB_TAG('m','r','j',' '), HB_TAG('H','M','A',' ')}, /* Western Mari -> High Mari */
{HB_TAG('m','s','c',' '), HB_TAG('M','N','K',' ')}, /* Sankaran Maninka -> Maninka */
{HB_TAG('m','s','h',' '), HB_TAG('M','L','G',' ')}, /* Masikoro Malagasy -> Malagasy */
- {HB_TAG('m','s','i',' '), HB_TAG('M','L','Y',' ')}, /* Sabah Malay -> Malay */
- {HB_TAG('m','s','i',' '), HB_TAG('C','P','P',' ')}, /* Sabah Malay -> Creoles */
- {HB_TAG('m','t','h',' '), HB_TAG_NONE }, /* Munggui != Maithili */
{HB_TAG('m','t','r',' '), HB_TAG('M','A','W',' ')}, /* Mewari -> Marwari */
- {HB_TAG('m','t','s',' '), HB_TAG_NONE }, /* Yora != Maltese */
{HB_TAG('m','u','d',' '), HB_TAG('C','P','P',' ')}, /* Mednyj Aleut -> Creoles */
{HB_TAG('m','u','i',' '), HB_TAG('M','L','Y',' ')}, /* Musi -> Malay */
- {HB_TAG('m','u','n',' '), HB_TAG_NONE }, /* Munda [collection] != Mundari */
{HB_TAG('m','u','p',' '), HB_TAG('R','A','J',' ')}, /* Malvi -> Rajasthani */
{HB_TAG('m','u','q',' '), HB_TAG('H','M','N',' ')}, /* Eastern Xiangxi Miao -> Hmong */
-/*{HB_TAG('m','u','s',' '), HB_TAG('M','U','S',' ')},*/ /* Creek -> Muscogee */
{HB_TAG('m','v','b',' '), HB_TAG('A','T','H',' ')}, /* Mattole -> Athapaskan */
{HB_TAG('m','v','e',' '), HB_TAG('M','A','W',' ')}, /* Marwari (Pakistan) */
{HB_TAG('m','v','f',' '), HB_TAG('M','N','G',' ')}, /* Peripheral Mongolian -> Mongolian */
{HB_TAG('m','w','k',' '), HB_TAG('M','N','K',' ')}, /* Kita Maninkakan -> Maninka */
-/*{HB_TAG('m','w','l',' '), HB_TAG('M','W','L',' ')},*/ /* Mirandese */
{HB_TAG('m','w','q',' '), HB_TAG('Q','I','N',' ')}, /* Mün Chin -> Chin */
{HB_TAG('m','w','r',' '), HB_TAG('M','A','W',' ')}, /* Marwari [macrolanguage] */
- {HB_TAG('m','w','w',' '), HB_TAG('M','W','W',' ')}, /* Hmong Daw */
- {HB_TAG('m','w','w',' '), HB_TAG('H','M','N',' ')}, /* Hmong Daw -> Hmong */
{HB_TAG('m','y','m',' '), HB_TAG('M','E','N',' ')}, /* Me’en */
-/*{HB_TAG('m','y','n',' '), HB_TAG('M','Y','N',' ')},*/ /* Mayan [collection] */
{HB_TAG('m','y','q',' '), HB_TAG('M','N','K',' ')}, /* Forest Maninka (retired code) -> Maninka */
{HB_TAG('m','y','v',' '), HB_TAG('E','R','Z',' ')}, /* Erzya */
{HB_TAG('m','z','b',' '), HB_TAG('B','B','R',' ')}, /* Tumzabt -> Berber */
-/*{HB_TAG('m','z','n',' '), HB_TAG('M','Z','N',' ')},*/ /* Mazanderani */
{HB_TAG('m','z','s',' '), HB_TAG('C','P','P',' ')}, /* Macanese -> Creoles */
- {HB_TAG('n','a','g',' '), HB_TAG('N','A','G',' ')}, /* Naga Pidgin -> Naga-Assamese */
- {HB_TAG('n','a','g',' '), HB_TAG('C','P','P',' ')}, /* Naga Pidgin -> Creoles */
-/*{HB_TAG('n','a','h',' '), HB_TAG('N','A','H',' ')},*/ /* Nahuatl [collection] */
{HB_TAG('n','a','n',' '), HB_TAG('Z','H','S',' ')}, /* Min Nan Chinese -> Chinese, Simplified */
-/*{HB_TAG('n','a','p',' '), HB_TAG('N','A','P',' ')},*/ /* Neapolitan */
- {HB_TAG('n','a','s',' '), HB_TAG_NONE }, /* Naasioi != Naskapi */
{HB_TAG('n','a','z',' '), HB_TAG('N','A','H',' ')}, /* Coatepec Nahuatl -> Nahuatl */
{HB_TAG('n','c','h',' '), HB_TAG('N','A','H',' ')}, /* Central Huasteca Nahuatl -> Nahuatl */
{HB_TAG('n','c','i',' '), HB_TAG('N','A','H',' ')}, /* Classical Nahuatl -> Nahuatl */
{HB_TAG('n','c','j',' '), HB_TAG('N','A','H',' ')}, /* Northern Puebla Nahuatl -> Nahuatl */
{HB_TAG('n','c','l',' '), HB_TAG('N','A','H',' ')}, /* Michoacán Nahuatl -> Nahuatl */
- {HB_TAG('n','c','r',' '), HB_TAG_NONE }, /* Ncane != N-Cree */
{HB_TAG('n','c','x',' '), HB_TAG('N','A','H',' ')}, /* Central Puebla Nahuatl -> Nahuatl */
- {HB_TAG('n','d','b',' '), HB_TAG_NONE }, /* Kenswei Nsei != Ndebele */
-/*{HB_TAG('n','d','c',' '), HB_TAG('N','D','C',' ')},*/ /* Ndau */
- {HB_TAG('n','d','g',' '), HB_TAG_NONE }, /* Ndengereko != Ndonga */
-/*{HB_TAG('n','d','s',' '), HB_TAG('N','D','S',' ')},*/ /* Low Saxon */
{HB_TAG('n','e','f',' '), HB_TAG('C','P','P',' ')}, /* Nefamese -> Creoles */
-/*{HB_TAG('n','e','w',' '), HB_TAG('N','E','W',' ')},*/ /* Newari */
-/*{HB_TAG('n','g','a',' '), HB_TAG('N','G','A',' ')},*/ /* Ngbaka */
{HB_TAG('n','g','l',' '), HB_TAG('L','M','W',' ')}, /* Lomwe */
{HB_TAG('n','g','m',' '), HB_TAG('C','P','P',' ')}, /* Ngatik Men's Creole -> Creoles */
{HB_TAG('n','g','o',' '), HB_TAG('S','X','T',' ')}, /* Ngoni (retired code) -> Sutu */
- {HB_TAG('n','g','r',' '), HB_TAG_NONE }, /* Engdewu != Nagari */
{HB_TAG('n','g','u',' '), HB_TAG('N','A','H',' ')}, /* Guerrero Nahuatl -> Nahuatl */
{HB_TAG('n','h','c',' '), HB_TAG('N','A','H',' ')}, /* Tabasco Nahuatl -> Nahuatl */
{HB_TAG('n','h','d',' '), HB_TAG('G','U','A',' ')}, /* Chiripá -> Guarani */
@@ -1137,12 +903,9 @@
{HB_TAG('n','h','y',' '), HB_TAG('N','A','H',' ')}, /* Northern Oaxaca Nahuatl -> Nahuatl */
{HB_TAG('n','h','z',' '), HB_TAG('N','A','H',' ')}, /* Santa María La Alta Nahuatl -> Nahuatl */
{HB_TAG('n','i','q',' '), HB_TAG('K','A','L',' ')}, /* Nandi -> Kalenjin */
- {HB_TAG('n','i','s',' '), HB_TAG_NONE }, /* Nimi != Nisi */
-/*{HB_TAG('n','i','u',' '), HB_TAG('N','I','U',' ')},*/ /* Niuean */
{HB_TAG('n','i','v',' '), HB_TAG('G','I','L',' ')}, /* Gilyak */
{HB_TAG('n','j','t',' '), HB_TAG('C','P','P',' ')}, /* Ndyuka-Trio Pidgin -> Creoles */
{HB_TAG('n','j','z',' '), HB_TAG('N','I','S',' ')}, /* Nyishi -> Nisi */
- {HB_TAG('n','k','o',' '), HB_TAG_NONE }, /* Nkonya != N’Ko */
{HB_TAG('n','k','x',' '), HB_TAG('I','J','O',' ')}, /* Nkoroo -> Ijo */
{HB_TAG('n','l','a',' '), HB_TAG('B','M','L',' ')}, /* Ngombale -> Bamileke */
{HB_TAG('n','l','e',' '), HB_TAG('L','U','H',' ')}, /* East Nyala -> Luyia */
@@ -1151,329 +914,147 @@
{HB_TAG('n','n','h',' '), HB_TAG('B','M','L',' ')}, /* Ngiemboon -> Bamileke */
{HB_TAG('n','n','z',' '), HB_TAG('B','M','L',' ')}, /* Nda'nda' -> Bamileke */
{HB_TAG('n','o','d',' '), HB_TAG('N','T','A',' ')}, /* Northern Thai -> Northern Tai */
-/*{HB_TAG('n','o','e',' '), HB_TAG('N','O','E',' ')},*/ /* Nimadi */
-/*{HB_TAG('n','o','g',' '), HB_TAG('N','O','G',' ')},*/ /* Nogai */
-/*{HB_TAG('n','o','p',' '), HB_TAG('N','O','P',' ')},*/ /* Numanggang */
-/*{HB_TAG('n','o','v',' '), HB_TAG('N','O','V',' ')},*/ /* Novial */
{HB_TAG('n','p','i',' '), HB_TAG('N','E','P',' ')}, /* Nepali */
{HB_TAG('n','p','l',' '), HB_TAG('N','A','H',' ')}, /* Southeastern Puebla Nahuatl -> Nahuatl */
{HB_TAG('n','q','o',' '), HB_TAG('N','K','O',' ')}, /* N’Ko */
{HB_TAG('n','s','k',' '), HB_TAG('N','A','S',' ')}, /* Naskapi */
- {HB_TAG('n','s','m',' '), HB_TAG_NONE }, /* Sumi Naga != Northern Sami */
-/*{HB_TAG('n','s','o',' '), HB_TAG('N','S','O',' ')},*/ /* Northern Sotho */
{HB_TAG('n','s','u',' '), HB_TAG('N','A','H',' ')}, /* Sierra Negra Nahuatl -> Nahuatl */
- {HB_TAG('n','t','o',' '), HB_TAG_NONE }, /* Ntomba != Esperanto */
{HB_TAG('n','u','e',' '), HB_TAG('B','A','D','0')}, /* Ngundu -> Banda */
-/*{HB_TAG('n','u','k',' '), HB_TAG('N','U','K',' ')},*/ /* Nuu-chah-nulth */
{HB_TAG('n','u','u',' '), HB_TAG('B','A','D','0')}, /* Ngbundu -> Banda */
{HB_TAG('n','u','z',' '), HB_TAG('N','A','H',' ')}, /* Tlamacazapa Nahuatl -> Nahuatl */
{HB_TAG('n','w','e',' '), HB_TAG('B','M','L',' ')}, /* Ngwe -> Bamileke */
{HB_TAG('n','y','d',' '), HB_TAG('L','U','H',' ')}, /* Nyore -> Luyia */
-/*{HB_TAG('n','y','m',' '), HB_TAG('N','Y','M',' ')},*/ /* Nyamwezi */
{HB_TAG('n','y','n',' '), HB_TAG('N','K','L',' ')}, /* Nyankole */
-/*{HB_TAG('n','z','a',' '), HB_TAG('N','Z','A',' ')},*/ /* Tigon Mbembe -> Mbembe Tigon */
-/*{HB_TAG('o','j','b',' '), HB_TAG('O','J','B',' ')},*/ /* Northwestern Ojibwa -> Ojibway */
{HB_TAG('o','j','c',' '), HB_TAG('O','J','B',' ')}, /* Central Ojibwa -> Ojibway */
{HB_TAG('o','j','g',' '), HB_TAG('O','J','B',' ')}, /* Eastern Ojibwa -> Ojibway */
- {HB_TAG('o','j','s',' '), HB_TAG('O','C','R',' ')}, /* Severn Ojibwa -> Oji-Cree */
- {HB_TAG('o','j','s',' '), HB_TAG('O','J','B',' ')}, /* Severn Ojibwa -> Ojibway */
{HB_TAG('o','j','w',' '), HB_TAG('O','J','B',' ')}, /* Western Ojibwa -> Ojibway */
{HB_TAG('o','k','d',' '), HB_TAG('I','J','O',' ')}, /* Okodia -> Ijo */
{HB_TAG('o','k','i',' '), HB_TAG('K','A','L',' ')}, /* Okiek -> Kalenjin */
{HB_TAG('o','k','m',' '), HB_TAG('K','O','H',' ')}, /* Middle Korean (10th-16th cent.) -> Korean Old Hangul */
{HB_TAG('o','k','r',' '), HB_TAG('I','J','O',' ')}, /* Kirike -> Ijo */
-/*{HB_TAG('o','n','e',' '), HB_TAG('O','N','E',' ')},*/ /* Oneida */
-/*{HB_TAG('o','n','o',' '), HB_TAG('O','N','O',' ')},*/ /* Onondaga */
{HB_TAG('o','n','x',' '), HB_TAG('C','P','P',' ')}, /* Onin Based Pidgin -> Creoles */
{HB_TAG('o','o','r',' '), HB_TAG('C','P','P',' ')}, /* Oorlams -> Creoles */
{HB_TAG('o','r','c',' '), HB_TAG('O','R','O',' ')}, /* Orma -> Oromo */
{HB_TAG('o','r','n',' '), HB_TAG('M','L','Y',' ')}, /* Orang Kanaq -> Malay */
- {HB_TAG('o','r','o',' '), HB_TAG_NONE }, /* Orokolo != Oromo */
{HB_TAG('o','r','r',' '), HB_TAG('I','J','O',' ')}, /* Oruma -> Ijo */
{HB_TAG('o','r','s',' '), HB_TAG('M','L','Y',' ')}, /* Orang Seletar -> Malay */
{HB_TAG('o','r','y',' '), HB_TAG('O','R','I',' ')}, /* Odia */
{HB_TAG('o','t','w',' '), HB_TAG('O','J','B',' ')}, /* Ottawa -> Ojibway */
{HB_TAG('o','u','a',' '), HB_TAG('B','B','R',' ')}, /* Tagargrent -> Berber */
- {HB_TAG('p','a','a',' '), HB_TAG_NONE }, /* Papuan [collection] != Palestinian Aramaic */
-/*{HB_TAG('p','a','g',' '), HB_TAG('P','A','G',' ')},*/ /* Pangasinan */
- {HB_TAG('p','a','l',' '), HB_TAG_NONE }, /* Pahlavi != Pali */
-/*{HB_TAG('p','a','m',' '), HB_TAG('P','A','M',' ')},*/ /* Pampanga -> Pampangan */
- {HB_TAG('p','a','p',' '), HB_TAG('P','A','P','0')}, /* Papiamento -> Papiamentu */
- {HB_TAG('p','a','p',' '), HB_TAG('C','P','P',' ')}, /* Papiamento -> Creoles */
- {HB_TAG('p','a','s',' '), HB_TAG_NONE }, /* Papasena != Pashto */
-/*{HB_TAG('p','a','u',' '), HB_TAG('P','A','U',' ')},*/ /* Palauan */
{HB_TAG('p','b','t',' '), HB_TAG('P','A','S',' ')}, /* Southern Pashto -> Pashto */
{HB_TAG('p','b','u',' '), HB_TAG('P','A','S',' ')}, /* Northern Pashto -> Pashto */
-/*{HB_TAG('p','c','c',' '), HB_TAG('P','C','C',' ')},*/ /* Bouyei */
-/*{HB_TAG('p','c','d',' '), HB_TAG('P','C','D',' ')},*/ /* Picard */
{HB_TAG('p','c','e',' '), HB_TAG('P','L','G',' ')}, /* Ruching Palaung -> Palaung */
{HB_TAG('p','c','k',' '), HB_TAG('Q','I','N',' ')}, /* Paite Chin -> Chin */
{HB_TAG('p','c','m',' '), HB_TAG('C','P','P',' ')}, /* Nigerian Pidgin -> Creoles */
-/*{HB_TAG('p','d','c',' '), HB_TAG('P','D','C',' ')},*/ /* Pennsylvania German */
{HB_TAG('p','d','u',' '), HB_TAG('K','R','N',' ')}, /* Kayan -> Karen */
{HB_TAG('p','e','a',' '), HB_TAG('C','P','P',' ')}, /* Peranakan Indonesian -> Creoles */
{HB_TAG('p','e','l',' '), HB_TAG('M','L','Y',' ')}, /* Pekal -> Malay */
{HB_TAG('p','e','s',' '), HB_TAG('F','A','R',' ')}, /* Iranian Persian -> Persian */
{HB_TAG('p','e','y',' '), HB_TAG('C','P','P',' ')}, /* Petjo -> Creoles */
- {HB_TAG('p','g','a',' '), HB_TAG('A','R','A',' ')}, /* Sudanese Creole Arabic -> Arabic */
- {HB_TAG('p','g','a',' '), HB_TAG('C','P','P',' ')}, /* Sudanese Creole Arabic -> Creoles */
-/*{HB_TAG('p','h','k',' '), HB_TAG('P','H','K',' ')},*/ /* Phake */
- {HB_TAG('p','i','h',' '), HB_TAG('P','I','H',' ')}, /* Pitcairn-Norfolk -> Norfolk */
- {HB_TAG('p','i','h',' '), HB_TAG('C','P','P',' ')}, /* Pitcairn-Norfolk -> Creoles */
- {HB_TAG('p','i','l',' '), HB_TAG_NONE }, /* Yom != Filipino */
{HB_TAG('p','i','s',' '), HB_TAG('C','P','P',' ')}, /* Pijin -> Creoles */
{HB_TAG('p','k','h',' '), HB_TAG('Q','I','N',' ')}, /* Pankhu -> Chin */
{HB_TAG('p','k','o',' '), HB_TAG('K','A','L',' ')}, /* Pökoot -> Kalenjin */
{HB_TAG('p','l','g',' '), HB_TAG('P','L','G','0')}, /* Pilagá */
- {HB_TAG('p','l','k',' '), HB_TAG_NONE }, /* Kohistani Shina != Polish */
{HB_TAG('p','l','l',' '), HB_TAG('P','L','G',' ')}, /* Shwe Palaung -> Palaung */
{HB_TAG('p','l','n',' '), HB_TAG('C','P','P',' ')}, /* Palenquero -> Creoles */
{HB_TAG('p','l','p',' '), HB_TAG('P','A','P',' ')}, /* Palpa (retired code) */
{HB_TAG('p','l','t',' '), HB_TAG('M','L','G',' ')}, /* Plateau Malagasy -> Malagasy */
{HB_TAG('p','m','l',' '), HB_TAG('C','P','P',' ')}, /* Lingua Franca -> Creoles */
-/*{HB_TAG('p','m','s',' '), HB_TAG('P','M','S',' ')},*/ /* Piemontese */
{HB_TAG('p','m','y',' '), HB_TAG('C','P','P',' ')}, /* Papuan Malay -> Creoles */
-/*{HB_TAG('p','n','b',' '), HB_TAG('P','N','B',' ')},*/ /* Western Panjabi */
{HB_TAG('p','o','c',' '), HB_TAG('M','Y','N',' ')}, /* Poqomam -> Mayan */
- {HB_TAG('p','o','h',' '), HB_TAG('P','O','H',' ')}, /* Poqomchi' -> Pocomchi */
- {HB_TAG('p','o','h',' '), HB_TAG('M','Y','N',' ')}, /* Poqomchi' -> Mayan */
-/*{HB_TAG('p','o','n',' '), HB_TAG('P','O','N',' ')},*/ /* Pohnpeian */
{HB_TAG('p','o','v',' '), HB_TAG('C','P','P',' ')}, /* Upper Guinea Crioulo -> Creoles */
{HB_TAG('p','p','a',' '), HB_TAG('B','A','G',' ')}, /* Pao (retired code) -> Baghelkhandi */
{HB_TAG('p','r','e',' '), HB_TAG('C','P','P',' ')}, /* Principense -> Creoles */
-/*{HB_TAG('p','r','o',' '), HB_TAG('P','R','O',' ')},*/ /* Old Provençal (to 1500) -> Provençal / Old Provençal */
{HB_TAG('p','r','p',' '), HB_TAG('G','U','J',' ')}, /* Parsi (retired code) -> Gujarati */
- {HB_TAG('p','r','s',' '), HB_TAG('D','R','I',' ')}, /* Dari */
- {HB_TAG('p','r','s',' '), HB_TAG('F','A','R',' ')}, /* Dari -> Persian */
{HB_TAG('p','s','e',' '), HB_TAG('M','L','Y',' ')}, /* Central Malay -> Malay */
{HB_TAG('p','s','t',' '), HB_TAG('P','A','S',' ')}, /* Central Pashto -> Pashto */
{HB_TAG('p','u','b',' '), HB_TAG('Q','I','N',' ')}, /* Purum -> Chin */
{HB_TAG('p','u','z',' '), HB_TAG('Q','I','N',' ')}, /* Purum Naga (retired code) -> Chin */
- {HB_TAG('p','w','o',' '), HB_TAG('P','W','O',' ')}, /* Pwo Western Karen -> Western Pwo Karen */
- {HB_TAG('p','w','o',' '), HB_TAG('K','R','N',' ')}, /* Pwo Western Karen -> Karen */
{HB_TAG('p','w','w',' '), HB_TAG('K','R','N',' ')}, /* Pwo Northern Karen -> Karen */
- {HB_TAG('q','u','b',' '), HB_TAG('Q','W','H',' ')}, /* Huallaga Huánuco Quechua -> Quechua (Peru) */
- {HB_TAG('q','u','b',' '), HB_TAG('Q','U','Z',' ')}, /* Huallaga Huánuco Quechua -> Quechua */
- {HB_TAG('q','u','c',' '), HB_TAG('Q','U','C',' ')}, /* K’iche’ */
- {HB_TAG('q','u','c',' '), HB_TAG('M','Y','N',' ')}, /* K'iche' -> Mayan */
- {HB_TAG('q','u','d',' '), HB_TAG('Q','V','I',' ')}, /* Calderón Highland Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','u','d',' '), HB_TAG('Q','U','Z',' ')}, /* Calderón Highland Quichua -> Quechua */
{HB_TAG('q','u','f',' '), HB_TAG('Q','U','Z',' ')}, /* Lambayeque Quechua -> Quechua */
- {HB_TAG('q','u','g',' '), HB_TAG('Q','V','I',' ')}, /* Chimborazo Highland Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','u','g',' '), HB_TAG('Q','U','Z',' ')}, /* Chimborazo Highland Quichua -> Quechua */
- {HB_TAG('q','u','h',' '), HB_TAG('Q','U','H',' ')}, /* South Bolivian Quechua -> Quechua (Bolivia) */
- {HB_TAG('q','u','h',' '), HB_TAG('Q','U','Z',' ')}, /* South Bolivian Quechua -> Quechua */
{HB_TAG('q','u','k',' '), HB_TAG('Q','U','Z',' ')}, /* Chachapoyas Quechua -> Quechua */
- {HB_TAG('q','u','l',' '), HB_TAG('Q','U','H',' ')}, /* North Bolivian Quechua -> Quechua (Bolivia) */
- {HB_TAG('q','u','l',' '), HB_TAG('Q','U','Z',' ')}, /* North Bolivian Quechua -> Quechua */
{HB_TAG('q','u','m',' '), HB_TAG('M','Y','N',' ')}, /* Sipacapense -> Mayan */
- {HB_TAG('q','u','p',' '), HB_TAG('Q','V','I',' ')}, /* Southern Pastaza Quechua -> Quechua (Ecuador) */
- {HB_TAG('q','u','p',' '), HB_TAG('Q','U','Z',' ')}, /* Southern Pastaza Quechua -> Quechua */
- {HB_TAG('q','u','r',' '), HB_TAG('Q','W','H',' ')}, /* Yanahuanca Pasco Quechua -> Quechua (Peru) */
- {HB_TAG('q','u','r',' '), HB_TAG('Q','U','Z',' ')}, /* Yanahuanca Pasco Quechua -> Quechua */
- {HB_TAG('q','u','s',' '), HB_TAG('Q','U','H',' ')}, /* Santiago del Estero Quichua -> Quechua (Bolivia) */
- {HB_TAG('q','u','s',' '), HB_TAG('Q','U','Z',' ')}, /* Santiago del Estero Quichua -> Quechua */
{HB_TAG('q','u','v',' '), HB_TAG('M','Y','N',' ')}, /* Sacapulteco -> Mayan */
- {HB_TAG('q','u','w',' '), HB_TAG('Q','V','I',' ')}, /* Tena Lowland Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','u','w',' '), HB_TAG('Q','U','Z',' ')}, /* Tena Lowland Quichua -> Quechua */
- {HB_TAG('q','u','x',' '), HB_TAG('Q','W','H',' ')}, /* Yauyos Quechua -> Quechua (Peru) */
- {HB_TAG('q','u','x',' '), HB_TAG('Q','U','Z',' ')}, /* Yauyos Quechua -> Quechua */
{HB_TAG('q','u','y',' '), HB_TAG('Q','U','Z',' ')}, /* Ayacucho Quechua -> Quechua */
-/*{HB_TAG('q','u','z',' '), HB_TAG('Q','U','Z',' ')},*/ /* Cusco Quechua -> Quechua */
- {HB_TAG('q','v','a',' '), HB_TAG('Q','W','H',' ')}, /* Ambo-Pasco Quechua -> Quechua (Peru) */
- {HB_TAG('q','v','a',' '), HB_TAG('Q','U','Z',' ')}, /* Ambo-Pasco Quechua -> Quechua */
{HB_TAG('q','v','c',' '), HB_TAG('Q','U','Z',' ')}, /* Cajamarca Quechua -> Quechua */
{HB_TAG('q','v','e',' '), HB_TAG('Q','U','Z',' ')}, /* Eastern Apurímac Quechua -> Quechua */
- {HB_TAG('q','v','h',' '), HB_TAG('Q','W','H',' ')}, /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */
- {HB_TAG('q','v','h',' '), HB_TAG('Q','U','Z',' ')}, /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua */
- {HB_TAG('q','v','i',' '), HB_TAG('Q','V','I',' ')}, /* Imbabura Highland Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','v','i',' '), HB_TAG('Q','U','Z',' ')}, /* Imbabura Highland Quichua -> Quechua */
- {HB_TAG('q','v','j',' '), HB_TAG('Q','V','I',' ')}, /* Loja Highland Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','v','j',' '), HB_TAG('Q','U','Z',' ')}, /* Loja Highland Quichua -> Quechua */
- {HB_TAG('q','v','l',' '), HB_TAG('Q','W','H',' ')}, /* Cajatambo North Lima Quechua -> Quechua (Peru) */
- {HB_TAG('q','v','l',' '), HB_TAG('Q','U','Z',' ')}, /* Cajatambo North Lima Quechua -> Quechua */
- {HB_TAG('q','v','m',' '), HB_TAG('Q','W','H',' ')}, /* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */
- {HB_TAG('q','v','m',' '), HB_TAG('Q','U','Z',' ')}, /* Margos-Yarowilca-Lauricocha Quechua -> Quechua */
- {HB_TAG('q','v','n',' '), HB_TAG('Q','W','H',' ')}, /* North Junín Quechua -> Quechua (Peru) */
- {HB_TAG('q','v','n',' '), HB_TAG('Q','U','Z',' ')}, /* North Junín Quechua -> Quechua */
- {HB_TAG('q','v','o',' '), HB_TAG('Q','V','I',' ')}, /* Napo Lowland Quechua -> Quechua (Ecuador) */
- {HB_TAG('q','v','o',' '), HB_TAG('Q','U','Z',' ')}, /* Napo Lowland Quechua -> Quechua */
- {HB_TAG('q','v','p',' '), HB_TAG('Q','W','H',' ')}, /* Pacaraos Quechua -> Quechua (Peru) */
- {HB_TAG('q','v','p',' '), HB_TAG('Q','U','Z',' ')}, /* Pacaraos Quechua -> Quechua */
{HB_TAG('q','v','s',' '), HB_TAG('Q','U','Z',' ')}, /* San Martín Quechua -> Quechua */
- {HB_TAG('q','v','w',' '), HB_TAG('Q','W','H',' ')}, /* Huaylla Wanca Quechua -> Quechua (Peru) */
- {HB_TAG('q','v','w',' '), HB_TAG('Q','U','Z',' ')}, /* Huaylla Wanca Quechua -> Quechua */
- {HB_TAG('q','v','z',' '), HB_TAG('Q','V','I',' ')}, /* Northern Pastaza Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','v','z',' '), HB_TAG('Q','U','Z',' ')}, /* Northern Pastaza Quichua -> Quechua */
- {HB_TAG('q','w','a',' '), HB_TAG('Q','W','H',' ')}, /* Corongo Ancash Quechua -> Quechua (Peru) */
- {HB_TAG('q','w','a',' '), HB_TAG('Q','U','Z',' ')}, /* Corongo Ancash Quechua -> Quechua */
{HB_TAG('q','w','c',' '), HB_TAG('Q','U','Z',' ')}, /* Classical Quechua -> Quechua */
- {HB_TAG('q','w','h',' '), HB_TAG('Q','W','H',' ')}, /* Huaylas Ancash Quechua -> Quechua (Peru) */
- {HB_TAG('q','w','h',' '), HB_TAG('Q','U','Z',' ')}, /* Huaylas Ancash Quechua -> Quechua */
- {HB_TAG('q','w','s',' '), HB_TAG('Q','W','H',' ')}, /* Sihuas Ancash Quechua -> Quechua (Peru) */
- {HB_TAG('q','w','s',' '), HB_TAG('Q','U','Z',' ')}, /* Sihuas Ancash Quechua -> Quechua */
{HB_TAG('q','w','t',' '), HB_TAG('A','T','H',' ')}, /* Kwalhioqua-Tlatskanai -> Athapaskan */
- {HB_TAG('q','x','a',' '), HB_TAG('Q','W','H',' ')}, /* Chiquián Ancash Quechua -> Quechua (Peru) */
- {HB_TAG('q','x','a',' '), HB_TAG('Q','U','Z',' ')}, /* Chiquián Ancash Quechua -> Quechua */
- {HB_TAG('q','x','c',' '), HB_TAG('Q','W','H',' ')}, /* Chincha Quechua -> Quechua (Peru) */
- {HB_TAG('q','x','c',' '), HB_TAG('Q','U','Z',' ')}, /* Chincha Quechua -> Quechua */
- {HB_TAG('q','x','h',' '), HB_TAG('Q','W','H',' ')}, /* Panao Huánuco Quechua -> Quechua (Peru) */
- {HB_TAG('q','x','h',' '), HB_TAG('Q','U','Z',' ')}, /* Panao Huánuco Quechua -> Quechua */
- {HB_TAG('q','x','l',' '), HB_TAG('Q','V','I',' ')}, /* Salasaca Highland Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','x','l',' '), HB_TAG('Q','U','Z',' ')}, /* Salasaca Highland Quichua -> Quechua */
- {HB_TAG('q','x','n',' '), HB_TAG('Q','W','H',' ')}, /* Northern Conchucos Ancash Quechua -> Quechua (Peru) */
- {HB_TAG('q','x','n',' '), HB_TAG('Q','U','Z',' ')}, /* Northern Conchucos Ancash Quechua -> Quechua */
- {HB_TAG('q','x','o',' '), HB_TAG('Q','W','H',' ')}, /* Southern Conchucos Ancash Quechua -> Quechua (Peru) */
- {HB_TAG('q','x','o',' '), HB_TAG('Q','U','Z',' ')}, /* Southern Conchucos Ancash Quechua -> Quechua */
{HB_TAG('q','x','p',' '), HB_TAG('Q','U','Z',' ')}, /* Puno Quechua -> Quechua */
- {HB_TAG('q','x','r',' '), HB_TAG('Q','V','I',' ')}, /* Cañar Highland Quichua -> Quechua (Ecuador) */
- {HB_TAG('q','x','r',' '), HB_TAG('Q','U','Z',' ')}, /* Cañar Highland Quichua -> Quechua */
- {HB_TAG('q','x','t',' '), HB_TAG('Q','W','H',' ')}, /* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */
- {HB_TAG('q','x','t',' '), HB_TAG('Q','U','Z',' ')}, /* Santa Ana de Tusi Pasco Quechua -> Quechua */
{HB_TAG('q','x','u',' '), HB_TAG('Q','U','Z',' ')}, /* Arequipa-La Unión Quechua -> Quechua */
- {HB_TAG('q','x','w',' '), HB_TAG('Q','W','H',' ')}, /* Jauja Wanca Quechua -> Quechua (Peru) */
- {HB_TAG('q','x','w',' '), HB_TAG('Q','U','Z',' ')}, /* Jauja Wanca Quechua -> Quechua */
{HB_TAG('r','a','g',' '), HB_TAG('L','U','H',' ')}, /* Logooli -> Luyia */
-/*{HB_TAG('r','a','j',' '), HB_TAG('R','A','J',' ')},*/ /* Rajasthani [macrolanguage] */
{HB_TAG('r','a','l',' '), HB_TAG('Q','I','N',' ')}, /* Ralte -> Chin */
-/*{HB_TAG('r','a','r',' '), HB_TAG('R','A','R',' ')},*/ /* Rarotongan */
{HB_TAG('r','b','b',' '), HB_TAG('P','L','G',' ')}, /* Rumai Palaung -> Palaung */
{HB_TAG('r','b','l',' '), HB_TAG('B','I','K',' ')}, /* Miraya Bikol -> Bikol */
{HB_TAG('r','c','f',' '), HB_TAG('C','P','P',' ')}, /* Réunion Creole French -> Creoles */
-/*{HB_TAG('r','e','j',' '), HB_TAG('R','E','J',' ')},*/ /* Rejang */
-/*{HB_TAG('r','h','g',' '), HB_TAG('R','H','G',' ')},*/ /* Rohingya */
-/*{HB_TAG('r','i','a',' '), HB_TAG('R','I','A',' ')},*/ /* Riang (India) */
- {HB_TAG('r','i','f',' '), HB_TAG('R','I','F',' ')}, /* Tarifit */
- {HB_TAG('r','i','f',' '), HB_TAG('B','B','R',' ')}, /* Tarifit -> Berber */
-/*{HB_TAG('r','i','t',' '), HB_TAG('R','I','T',' ')},*/ /* Ritharrngu -> Ritarungo */
{HB_TAG('r','k','i',' '), HB_TAG('A','R','K',' ')}, /* Rakhine */
-/*{HB_TAG('r','k','w',' '), HB_TAG('R','K','W',' ')},*/ /* Arakwal */
{HB_TAG('r','m','c',' '), HB_TAG('R','O','Y',' ')}, /* Carpathian Romani -> Romany */
{HB_TAG('r','m','f',' '), HB_TAG('R','O','Y',' ')}, /* Kalo Finnish Romani -> Romany */
{HB_TAG('r','m','l',' '), HB_TAG('R','O','Y',' ')}, /* Baltic Romani -> Romany */
{HB_TAG('r','m','n',' '), HB_TAG('R','O','Y',' ')}, /* Balkan Romani -> Romany */
{HB_TAG('r','m','o',' '), HB_TAG('R','O','Y',' ')}, /* Sinte Romani -> Romany */
- {HB_TAG('r','m','s',' '), HB_TAG_NONE }, /* Romanian Sign Language != Romansh */
{HB_TAG('r','m','w',' '), HB_TAG('R','O','Y',' ')}, /* Welsh Romani -> Romany */
- {HB_TAG('r','m','y',' '), HB_TAG('R','M','Y',' ')}, /* Vlax Romani */
- {HB_TAG('r','m','y',' '), HB_TAG('R','O','Y',' ')}, /* Vlax Romani -> Romany */
{HB_TAG('r','m','z',' '), HB_TAG('A','R','K',' ')}, /* Marma -> Rakhine */
{HB_TAG('r','o','m',' '), HB_TAG('R','O','Y',' ')}, /* Romany [macrolanguage] */
{HB_TAG('r','o','p',' '), HB_TAG('C','P','P',' ')}, /* Kriol -> Creoles */
{HB_TAG('r','t','c',' '), HB_TAG('Q','I','N',' ')}, /* Rungtu Chin -> Chin */
-/*{HB_TAG('r','t','m',' '), HB_TAG('R','T','M',' ')},*/ /* Rotuman */
{HB_TAG('r','u','e',' '), HB_TAG('R','S','Y',' ')}, /* Rusyn */
-/*{HB_TAG('r','u','p',' '), HB_TAG('R','U','P',' ')},*/ /* Aromanian */
{HB_TAG('r','w','r',' '), HB_TAG('M','A','W',' ')}, /* Marwari (India) */
- {HB_TAG('s','a','d',' '), HB_TAG_NONE }, /* Sandawe != Sadri */
{HB_TAG('s','a','h',' '), HB_TAG('Y','A','K',' ')}, /* Yakut -> Sakha */
{HB_TAG('s','a','m',' '), HB_TAG('P','A','A',' ')}, /* Samaritan Aramaic -> Palestinian Aramaic */
-/*{HB_TAG('s','a','s',' '), HB_TAG('S','A','S',' ')},*/ /* Sasak */
-/*{HB_TAG('s','a','t',' '), HB_TAG('S','A','T',' ')},*/ /* Santali */
- {HB_TAG('s','a','y',' '), HB_TAG_NONE }, /* Saya != Sayisi */
{HB_TAG('s','c','f',' '), HB_TAG('C','P','P',' ')}, /* San Miguel Creole French -> Creoles */
{HB_TAG('s','c','h',' '), HB_TAG('Q','I','N',' ')}, /* Sakachep -> Chin */
{HB_TAG('s','c','i',' '), HB_TAG('C','P','P',' ')}, /* Sri Lankan Creole Malay -> Creoles */
{HB_TAG('s','c','k',' '), HB_TAG('S','A','D',' ')}, /* Sadri */
-/*{HB_TAG('s','c','n',' '), HB_TAG('S','C','N',' ')},*/ /* Sicilian */
-/*{HB_TAG('s','c','o',' '), HB_TAG('S','C','O',' ')},*/ /* Scots */
- {HB_TAG('s','c','s',' '), HB_TAG('S','C','S',' ')}, /* North Slavey */
- {HB_TAG('s','c','s',' '), HB_TAG('S','L','A',' ')}, /* North Slavey -> Slavey */
- {HB_TAG('s','c','s',' '), HB_TAG('A','T','H',' ')}, /* North Slavey -> Athapaskan */
{HB_TAG('s','d','c',' '), HB_TAG('S','R','D',' ')}, /* Sassarese Sardinian -> Sardinian */
{HB_TAG('s','d','h',' '), HB_TAG('K','U','R',' ')}, /* Southern Kurdish -> Kurdish */
{HB_TAG('s','d','n',' '), HB_TAG('S','R','D',' ')}, /* Gallurese Sardinian -> Sardinian */
{HB_TAG('s','d','s',' '), HB_TAG('B','B','R',' ')}, /* Sened -> Berber */
-/*{HB_TAG('s','e','e',' '), HB_TAG('S','E','E',' ')},*/ /* Seneca */
{HB_TAG('s','e','h',' '), HB_TAG('S','N','A',' ')}, /* Sena */
{HB_TAG('s','e','k',' '), HB_TAG('A','T','H',' ')}, /* Sekani -> Athapaskan */
-/*{HB_TAG('s','e','l',' '), HB_TAG('S','E','L',' ')},*/ /* Selkup */
{HB_TAG('s','e','z',' '), HB_TAG('Q','I','N',' ')}, /* Senthang Chin -> Chin */
- {HB_TAG('s','f','m',' '), HB_TAG('S','F','M',' ')}, /* Small Flowery Miao */
- {HB_TAG('s','f','m',' '), HB_TAG('H','M','N',' ')}, /* Small Flowery Miao -> Hmong */
-/*{HB_TAG('s','g','a',' '), HB_TAG('S','G','A',' ')},*/ /* Old Irish (to 900) */
{HB_TAG('s','g','c',' '), HB_TAG('K','A','L',' ')}, /* Kipsigis -> Kalenjin */
- {HB_TAG('s','g','o',' '), HB_TAG_NONE }, /* Songa (retired code) != Sango */
-/*{HB_TAG('s','g','s',' '), HB_TAG('S','G','S',' ')},*/ /* Samogitian */
{HB_TAG('s','g','w',' '), HB_TAG('C','H','G',' ')}, /* Sebat Bet Gurage -> Chaha Gurage */
- {HB_TAG('s','h','i',' '), HB_TAG('S','H','I',' ')}, /* Tachelhit */
- {HB_TAG('s','h','i',' '), HB_TAG('B','B','R',' ')}, /* Tachelhit -> Berber */
{HB_TAG('s','h','l',' '), HB_TAG('Q','I','N',' ')}, /* Shendu -> Chin */
-/*{HB_TAG('s','h','n',' '), HB_TAG('S','H','N',' ')},*/ /* Shan */
{HB_TAG('s','h','u',' '), HB_TAG('A','R','A',' ')}, /* Chadian Arabic -> Arabic */
{HB_TAG('s','h','y',' '), HB_TAG('B','B','R',' ')}, /* Tachawit -> Berber */
- {HB_TAG('s','i','b',' '), HB_TAG_NONE }, /* Sebop != Sibe */
-/*{HB_TAG('s','i','d',' '), HB_TAG('S','I','D',' ')},*/ /* Sidamo */
- {HB_TAG('s','i','g',' '), HB_TAG_NONE }, /* Paasaal != Silte Gurage */
{HB_TAG('s','i','z',' '), HB_TAG('B','B','R',' ')}, /* Siwi -> Berber */
-/*{HB_TAG('s','j','a',' '), HB_TAG('S','J','A',' ')},*/ /* Epena */
{HB_TAG('s','j','c',' '), HB_TAG('Z','H','S',' ')}, /* Shaojiang Chinese -> Chinese, Simplified */
{HB_TAG('s','j','d',' '), HB_TAG('K','S','M',' ')}, /* Kildin Sami */
-/*{HB_TAG('s','j','e',' '), HB_TAG('S','J','E',' ')},*/ /* Pite Sami */
{HB_TAG('s','j','o',' '), HB_TAG('S','I','B',' ')}, /* Xibe -> Sibe */
{HB_TAG('s','j','s',' '), HB_TAG('B','B','R',' ')}, /* Senhaja De Srair -> Berber */
-/*{HB_TAG('s','j','u',' '), HB_TAG('S','J','U',' ')},*/ /* Ume Sami */
{HB_TAG('s','k','g',' '), HB_TAG('M','L','G',' ')}, /* Sakalava Malagasy -> Malagasy */
{HB_TAG('s','k','r',' '), HB_TAG('S','R','K',' ')}, /* Saraiki */
- {HB_TAG('s','k','s',' '), HB_TAG_NONE }, /* Maia != Skolt Sami */
{HB_TAG('s','k','w',' '), HB_TAG('C','P','P',' ')}, /* Skepi Creole Dutch -> Creoles */
- {HB_TAG('s','k','y',' '), HB_TAG_NONE }, /* Sikaiana != Slovak */
- {HB_TAG('s','l','a',' '), HB_TAG_NONE }, /* Slavic [collection] != Slavey */
{HB_TAG('s','m','a',' '), HB_TAG('S','S','M',' ')}, /* Southern Sami */
{HB_TAG('s','m','d',' '), HB_TAG('M','B','N',' ')}, /* Sama (retired code) -> Mbundu */
{HB_TAG('s','m','j',' '), HB_TAG('L','S','M',' ')}, /* Lule Sami */
- {HB_TAG('s','m','l',' '), HB_TAG_NONE }, /* Central Sama != Somali */
{HB_TAG('s','m','n',' '), HB_TAG('I','S','M',' ')}, /* Inari Sami */
{HB_TAG('s','m','s',' '), HB_TAG('S','K','S',' ')}, /* Skolt Sami */
{HB_TAG('s','m','t',' '), HB_TAG('Q','I','N',' ')}, /* Simte -> Chin */
{HB_TAG('s','n','b',' '), HB_TAG('I','B','A',' ')}, /* Sebuyau (retired code) -> Iban */
- {HB_TAG('s','n','h',' '), HB_TAG_NONE }, /* Shinabo (retired code) != Sinhala (Sinhalese) */
-/*{HB_TAG('s','n','k',' '), HB_TAG('S','N','K',' ')},*/ /* Soninke */
- {HB_TAG('s','o','g',' '), HB_TAG_NONE }, /* Sogdian != Sodo Gurage */
-/*{HB_TAG('s','o','p',' '), HB_TAG('S','O','P',' ')},*/ /* Songe */
{HB_TAG('s','p','v',' '), HB_TAG('O','R','I',' ')}, /* Sambalpuri -> Odia */
{HB_TAG('s','p','y',' '), HB_TAG('K','A','L',' ')}, /* Sabaot -> Kalenjin */
- {HB_TAG('s','r','b',' '), HB_TAG_NONE }, /* Sora != Serbian */
{HB_TAG('s','r','c',' '), HB_TAG('S','R','D',' ')}, /* Logudorese Sardinian -> Sardinian */
- {HB_TAG('s','r','k',' '), HB_TAG_NONE }, /* Serudung Murut != Saraiki */
{HB_TAG('s','r','m',' '), HB_TAG('C','P','P',' ')}, /* Saramaccan -> Creoles */
{HB_TAG('s','r','n',' '), HB_TAG('C','P','P',' ')}, /* Sranan Tongo -> Creoles */
{HB_TAG('s','r','o',' '), HB_TAG('S','R','D',' ')}, /* Campidanese Sardinian -> Sardinian */
-/*{HB_TAG('s','r','r',' '), HB_TAG('S','R','R',' ')},*/ /* Serer */
{HB_TAG('s','r','s',' '), HB_TAG('A','T','H',' ')}, /* Sarsi -> Athapaskan */
{HB_TAG('s','s','h',' '), HB_TAG('A','R','A',' ')}, /* Shihhi Arabic -> Arabic */
- {HB_TAG('s','s','l',' '), HB_TAG_NONE }, /* Western Sisaala != South Slavey */
- {HB_TAG('s','s','m',' '), HB_TAG_NONE }, /* Semnam != Southern Sami */
{HB_TAG('s','t','a',' '), HB_TAG('C','P','P',' ')}, /* Settla -> Creoles */
-/*{HB_TAG('s','t','q',' '), HB_TAG('S','T','Q',' ')},*/ /* Saterfriesisch -> Saterland Frisian */
-/*{HB_TAG('s','t','r',' '), HB_TAG('S','T','R',' ')},*/ /* Straits Salish */
{HB_TAG('s','t','v',' '), HB_TAG('S','I','G',' ')}, /* Silt'e -> Silte Gurage */
-/*{HB_TAG('s','u','k',' '), HB_TAG('S','U','K',' ')},*/ /* Sukuma */
{HB_TAG('s','u','q',' '), HB_TAG('S','U','R',' ')}, /* Suri */
- {HB_TAG('s','u','r',' '), HB_TAG_NONE }, /* Mwaghavul != Suri */
-/*{HB_TAG('s','v','a',' '), HB_TAG('S','V','A',' ')},*/ /* Svan */
{HB_TAG('s','v','c',' '), HB_TAG('C','P','P',' ')}, /* Vincentian Creole English -> Creoles */
- {HB_TAG('s','v','e',' '), HB_TAG_NONE }, /* Serili != Swedish */
{HB_TAG('s','w','b',' '), HB_TAG('C','M','R',' ')}, /* Maore Comorian -> Comorian */
{HB_TAG('s','w','c',' '), HB_TAG('S','W','K',' ')}, /* Congo Swahili -> Swahili */
{HB_TAG('s','w','h',' '), HB_TAG('S','W','K',' ')}, /* Swahili */
- {HB_TAG('s','w','k',' '), HB_TAG_NONE }, /* Malawi Sena != Swahili */
{HB_TAG('s','w','n',' '), HB_TAG('B','B','R',' ')}, /* Sawknah -> Berber */
{HB_TAG('s','w','v',' '), HB_TAG('M','A','W',' ')}, /* Shekhawati -> Marwari */
-/*{HB_TAG('s','x','u',' '), HB_TAG('S','X','U',' ')},*/ /* Upper Saxon */
{HB_TAG('s','y','c',' '), HB_TAG('S','Y','R',' ')}, /* Classical Syriac -> Syriac */
-/*{HB_TAG('s','y','l',' '), HB_TAG('S','Y','L',' ')},*/ /* Sylheti */
-/*{HB_TAG('s','y','r',' '), HB_TAG('S','Y','R',' ')},*/ /* Syriac [macrolanguage] */
-/*{HB_TAG('s','z','l',' '), HB_TAG('S','Z','L',' ')},*/ /* Silesian */
{HB_TAG('t','a','a',' '), HB_TAG('A','T','H',' ')}, /* Lower Tanana -> Athapaskan */
-/*{HB_TAG('t','a','b',' '), HB_TAG('T','A','B',' ')},*/ /* Tabassaran -> Tabasaran */
- {HB_TAG('t','a','j',' '), HB_TAG_NONE }, /* Eastern Tamang != Tajiki */
- {HB_TAG('t','a','q',' '), HB_TAG('T','A','Q',' ')}, /* Tamasheq */
- {HB_TAG('t','a','q',' '), HB_TAG('T','M','H',' ')}, /* Tamasheq -> Tamashek */
- {HB_TAG('t','a','q',' '), HB_TAG('B','B','R',' ')}, /* Tamasheq -> Berber */
{HB_TAG('t','a','s',' '), HB_TAG('C','P','P',' ')}, /* Tay Boi -> Creoles */
{HB_TAG('t','a','u',' '), HB_TAG('A','T','H',' ')}, /* Upper Tanana -> Athapaskan */
-/*{HB_TAG('t','b','v',' '), HB_TAG('T','B','V',' ')},*/ /* Tobo */
{HB_TAG('t','c','b',' '), HB_TAG('A','T','H',' ')}, /* Tanacross -> Athapaskan */
{HB_TAG('t','c','e',' '), HB_TAG('A','T','H',' ')}, /* Southern Tutchone -> Athapaskan */
{HB_TAG('t','c','h',' '), HB_TAG('C','P','P',' ')}, /* Turks And Caicos Creole English -> Creoles */
@@ -1481,115 +1062,54 @@
{HB_TAG('t','c','s',' '), HB_TAG('C','P','P',' ')}, /* Torres Strait Creole -> Creoles */
{HB_TAG('t','c','y',' '), HB_TAG('T','U','L',' ')}, /* Tulu */
{HB_TAG('t','c','z',' '), HB_TAG('Q','I','N',' ')}, /* Thado Chin -> Chin */
-/*{HB_TAG('t','d','c',' '), HB_TAG('T','D','C',' ')},*/ /* Emberá-Tadó */
-/*{HB_TAG('t','d','d',' '), HB_TAG('T','D','D',' ')},*/ /* Tai Nüa -> Dehong Dai */
{HB_TAG('t','d','x',' '), HB_TAG('M','L','G',' ')}, /* Tandroy-Mahafaly Malagasy -> Malagasy */
{HB_TAG('t','e','c',' '), HB_TAG('K','A','L',' ')}, /* Terik -> Kalenjin */
{HB_TAG('t','e','m',' '), HB_TAG('T','M','N',' ')}, /* Timne -> Temne */
-/*{HB_TAG('t','e','t',' '), HB_TAG('T','E','T',' ')},*/ /* Tetum */
{HB_TAG('t','e','z',' '), HB_TAG('B','B','R',' ')}, /* Tetserret -> Berber */
{HB_TAG('t','f','n',' '), HB_TAG('A','T','H',' ')}, /* Tanaina -> Athapaskan */
{HB_TAG('t','g','h',' '), HB_TAG('C','P','P',' ')}, /* Tobagonian Creole English -> Creoles */
{HB_TAG('t','g','j',' '), HB_TAG('N','I','S',' ')}, /* Tagin -> Nisi */
- {HB_TAG('t','g','n',' '), HB_TAG_NONE }, /* Tandaganon != Tongan */
- {HB_TAG('t','g','r',' '), HB_TAG_NONE }, /* Tareng != Tigre */
{HB_TAG('t','g','x',' '), HB_TAG('A','T','H',' ')}, /* Tagish -> Athapaskan */
- {HB_TAG('t','g','y',' '), HB_TAG_NONE }, /* Togoyo != Tigrinya */
-/*{HB_TAG('t','h','p',' '), HB_TAG('T','H','P',' ')},*/ /* Thompson */
{HB_TAG('t','h','t',' '), HB_TAG('A','T','H',' ')}, /* Tahltan -> Athapaskan */
- {HB_TAG('t','h','v',' '), HB_TAG('T','H','V',' ')}, /* Tahaggart Tamahaq */
- {HB_TAG('t','h','v',' '), HB_TAG('T','M','H',' ')}, /* Tahaggart Tamahaq -> Tamashek */
- {HB_TAG('t','h','v',' '), HB_TAG('B','B','R',' ')}, /* Tahaggart Tamahaq -> Berber */
- {HB_TAG('t','h','z',' '), HB_TAG('T','H','Z',' ')}, /* Tayart Tamajeq */
- {HB_TAG('t','h','z',' '), HB_TAG('T','M','H',' ')}, /* Tayart Tamajeq -> Tamashek */
- {HB_TAG('t','h','z',' '), HB_TAG('B','B','R',' ')}, /* Tayart Tamajeq -> Berber */
{HB_TAG('t','i','a',' '), HB_TAG('B','B','R',' ')}, /* Tidikelt Tamazight -> Berber */
{HB_TAG('t','i','g',' '), HB_TAG('T','G','R',' ')}, /* Tigre */
-/*{HB_TAG('t','i','v',' '), HB_TAG('T','I','V',' ')},*/ /* Tiv */
-/*{HB_TAG('t','j','l',' '), HB_TAG('T','J','L',' ')},*/ /* Tai Laing */
{HB_TAG('t','j','o',' '), HB_TAG('B','B','R',' ')}, /* Temacine Tamazight -> Berber */
{HB_TAG('t','k','g',' '), HB_TAG('M','L','G',' ')}, /* Tesaka Malagasy -> Malagasy */
- {HB_TAG('t','k','m',' '), HB_TAG_NONE }, /* Takelma != Turkmen */
-/*{HB_TAG('t','l','i',' '), HB_TAG('T','L','I',' ')},*/ /* Tlingit */
-/*{HB_TAG('t','l','y',' '), HB_TAG('T','L','Y',' ')},*/ /* Talysh */
{HB_TAG('t','m','g',' '), HB_TAG('C','P','P',' ')}, /* Ternateño -> Creoles */
- {HB_TAG('t','m','h',' '), HB_TAG('T','M','H',' ')}, /* Tamashek [macrolanguage] */
- {HB_TAG('t','m','h',' '), HB_TAG('B','B','R',' ')}, /* Tamashek [macrolanguage] -> Berber */
- {HB_TAG('t','m','n',' '), HB_TAG_NONE }, /* Taman (Indonesia) != Temne */
{HB_TAG('t','m','w',' '), HB_TAG('M','L','Y',' ')}, /* Temuan -> Malay */
- {HB_TAG('t','n','a',' '), HB_TAG_NONE }, /* Tacana != Tswana */
- {HB_TAG('t','n','e',' '), HB_TAG_NONE }, /* Tinoc Kallahan (retired code) != Tundra Enets */
- {HB_TAG('t','n','f',' '), HB_TAG('D','R','I',' ')}, /* Tangshewi (retired code) -> Dari */
- {HB_TAG('t','n','f',' '), HB_TAG('F','A','R',' ')}, /* Tangshewi (retired code) -> Persian */
- {HB_TAG('t','n','g',' '), HB_TAG_NONE }, /* Tobanga != Tonga */
{HB_TAG('t','o','d',' '), HB_TAG('T','O','D','0')}, /* Toma */
{HB_TAG('t','o','i',' '), HB_TAG('T','N','G',' ')}, /* Tonga (Zambia) */
{HB_TAG('t','o','j',' '), HB_TAG('M','Y','N',' ')}, /* Tojolabal -> Mayan */
{HB_TAG('t','o','l',' '), HB_TAG('A','T','H',' ')}, /* Tolowa -> Athapaskan */
{HB_TAG('t','o','r',' '), HB_TAG('B','A','D','0')}, /* Togbo-Vara Banda -> Banda */
- {HB_TAG('t','p','i',' '), HB_TAG('T','P','I',' ')}, /* Tok Pisin */
- {HB_TAG('t','p','i',' '), HB_TAG('C','P','P',' ')}, /* Tok Pisin -> Creoles */
{HB_TAG('t','r','f',' '), HB_TAG('C','P','P',' ')}, /* Trinidadian Creole English -> Creoles */
- {HB_TAG('t','r','k',' '), HB_TAG_NONE }, /* Turkic [collection] != Turkish */
- {HB_TAG('t','r','u',' '), HB_TAG('T','U','A',' ')}, /* Turoyo -> Turoyo Aramaic */
- {HB_TAG('t','r','u',' '), HB_TAG('S','Y','R',' ')}, /* Turoyo -> Syriac */
- {HB_TAG('t','s','g',' '), HB_TAG_NONE }, /* Tausug != Tsonga */
-/*{HB_TAG('t','s','j',' '), HB_TAG('T','S','J',' ')},*/ /* Tshangla */
{HB_TAG('t','t','c',' '), HB_TAG('M','Y','N',' ')}, /* Tektiteko -> Mayan */
{HB_TAG('t','t','m',' '), HB_TAG('A','T','H',' ')}, /* Northern Tutchone -> Athapaskan */
- {HB_TAG('t','t','q',' '), HB_TAG('T','T','Q',' ')}, /* Tawallammat Tamajaq */
- {HB_TAG('t','t','q',' '), HB_TAG('T','M','H',' ')}, /* Tawallammat Tamajaq -> Tamashek */
- {HB_TAG('t','t','q',' '), HB_TAG('B','B','R',' ')}, /* Tawallammat Tamajaq -> Berber */
- {HB_TAG('t','u','a',' '), HB_TAG_NONE }, /* Wiarumus != Turoyo Aramaic */
- {HB_TAG('t','u','l',' '), HB_TAG_NONE }, /* Tula != Tulu */
-/*{HB_TAG('t','u','m',' '), HB_TAG('T','U','M',' ')},*/ /* Tumbuka */
-/*{HB_TAG('t','u','s',' '), HB_TAG('T','U','S',' ')},*/ /* Tuscarora */
{HB_TAG('t','u','u',' '), HB_TAG('A','T','H',' ')}, /* Tututni -> Athapaskan */
- {HB_TAG('t','u','v',' '), HB_TAG_NONE }, /* Turkana != Tuvin */
{HB_TAG('t','u','y',' '), HB_TAG('K','A','L',' ')}, /* Tugen -> Kalenjin */
-/*{HB_TAG('t','v','l',' '), HB_TAG('T','V','L',' ')},*/ /* Tuvalu */
{HB_TAG('t','v','y',' '), HB_TAG('C','P','P',' ')}, /* Timor Pidgin -> Creoles */
{HB_TAG('t','x','c',' '), HB_TAG('A','T','H',' ')}, /* Tsetsaut -> Athapaskan */
{HB_TAG('t','x','y',' '), HB_TAG('M','L','G',' ')}, /* Tanosy Malagasy -> Malagasy */
{HB_TAG('t','y','v',' '), HB_TAG('T','U','V',' ')}, /* Tuvinian -> Tuvin */
-/*{HB_TAG('t','y','z',' '), HB_TAG('T','Y','Z',' ')},*/ /* Tày */
{HB_TAG('t','z','h',' '), HB_TAG('M','Y','N',' ')}, /* Tzeltal -> Mayan */
{HB_TAG('t','z','j',' '), HB_TAG('M','Y','N',' ')}, /* Tz'utujil -> Mayan */
- {HB_TAG('t','z','m',' '), HB_TAG('T','Z','M',' ')}, /* Central Atlas Tamazight -> Tamazight */
- {HB_TAG('t','z','m',' '), HB_TAG('B','B','R',' ')}, /* Central Atlas Tamazight -> Berber */
- {HB_TAG('t','z','o',' '), HB_TAG('T','Z','O',' ')}, /* Tzotzil */
- {HB_TAG('t','z','o',' '), HB_TAG('M','Y','N',' ')}, /* Tzotzil -> Mayan */
{HB_TAG('u','b','l',' '), HB_TAG('B','I','K',' ')}, /* Buhi'non Bikol -> Bikol */
-/*{HB_TAG('u','d','i',' '), HB_TAG('U','D','I',' ')},*/ /* Udi */
-/*{HB_TAG('u','d','m',' '), HB_TAG('U','D','M',' ')},*/ /* Udmurt */
{HB_TAG('u','k','i',' '), HB_TAG('K','U','I',' ')}, /* Kui (India) */
{HB_TAG('u','l','n',' '), HB_TAG('C','P','P',' ')}, /* Unserdeutsch -> Creoles */
-/*{HB_TAG('u','m','b',' '), HB_TAG('U','M','B',' ')},*/ /* Umbundu */
{HB_TAG('u','n','r',' '), HB_TAG('M','U','N',' ')}, /* Mundari */
{HB_TAG('u','r','k',' '), HB_TAG('M','L','Y',' ')}, /* Urak Lawoi' -> Malay */
{HB_TAG('u','s','p',' '), HB_TAG('M','Y','N',' ')}, /* Uspanteco -> Mayan */
{HB_TAG('u','z','n',' '), HB_TAG('U','Z','B',' ')}, /* Northern Uzbek -> Uzbek */
{HB_TAG('u','z','s',' '), HB_TAG('U','Z','B',' ')}, /* Southern Uzbek -> Uzbek */
{HB_TAG('v','a','p',' '), HB_TAG('Q','I','N',' ')}, /* Vaiphei -> Chin */
-/*{HB_TAG('v','e','c',' '), HB_TAG('V','E','C',' ')},*/ /* Venetian */
{HB_TAG('v','i','c',' '), HB_TAG('C','P','P',' ')}, /* Virgin Islands Creole English -> Creoles */
- {HB_TAG('v','i','t',' '), HB_TAG_NONE }, /* Viti != Vietnamese */
{HB_TAG('v','k','k',' '), HB_TAG('M','L','Y',' ')}, /* Kaur -> Malay */
{HB_TAG('v','k','p',' '), HB_TAG('C','P','P',' ')}, /* Korlai Creole Portuguese -> Creoles */
{HB_TAG('v','k','t',' '), HB_TAG('M','L','Y',' ')}, /* Tenggarong Kutai Malay -> Malay */
{HB_TAG('v','l','s',' '), HB_TAG('F','L','E',' ')}, /* Vlaams -> Dutch (Flemish) */
{HB_TAG('v','m','w',' '), HB_TAG('M','A','K',' ')}, /* Makhuwa */
- {HB_TAG('v','r','o',' '), HB_TAG('V','R','O',' ')}, /* Võro */
- {HB_TAG('v','r','o',' '), HB_TAG('E','T','I',' ')}, /* Võro -> Estonian */
{HB_TAG('v','s','n',' '), HB_TAG('S','A','N',' ')}, /* Vedic Sanskrit -> Sanskrit */
- {HB_TAG('w','a','g',' '), HB_TAG_NONE }, /* Wa'ema != Wagdi */
-/*{HB_TAG('w','a','r',' '), HB_TAG('W','A','R',' ')},*/ /* Waray (Philippines) -> Waray-Waray */
-/*{HB_TAG('w','b','l',' '), HB_TAG('W','B','L',' ')},*/ /* Wakhi */
{HB_TAG('w','b','m',' '), HB_TAG('W','A',' ',' ')}, /* Wa */
- {HB_TAG('w','b','r',' '), HB_TAG('W','A','G',' ')}, /* Wagdi */
- {HB_TAG('w','b','r',' '), HB_TAG('R','A','J',' ')}, /* Wagdi -> Rajasthani */
-/*{HB_TAG('w','c','i',' '), HB_TAG('W','C','I',' ')},*/ /* Waci Gbe */
-/*{HB_TAG('w','d','t',' '), HB_TAG('W','D','T',' ')},*/ /* Wendat */
{HB_TAG('w','e','a',' '), HB_TAG('K','R','N',' ')}, /* Wewaw -> Karen */
{HB_TAG('w','e','s',' '), HB_TAG('C','P','P',' ')}, /* Cameroon Pidgin -> Creoles */
{HB_TAG('w','e','u',' '), HB_TAG('Q','I','N',' ')}, /* Rawngtu Chin -> Chin */
@@ -1599,62 +1119,31 @@
{HB_TAG('w','n','i',' '), HB_TAG('C','M','R',' ')}, /* Ndzwani Comorian -> Comorian */
{HB_TAG('w','r','y',' '), HB_TAG('M','A','W',' ')}, /* Merwari -> Marwari */
{HB_TAG('w','s','g',' '), HB_TAG('G','O','N',' ')}, /* Adilabad Gondi -> Gondi */
-/*{HB_TAG('w','t','m',' '), HB_TAG('W','T','M',' ')},*/ /* Mewati */
{HB_TAG('w','u','u',' '), HB_TAG('Z','H','S',' ')}, /* Wu Chinese -> Chinese, Simplified */
- {HB_TAG('w','y','a',' '), HB_TAG('W','D','T',' ')}, /* Wyandot (retired code) -> Wendat */
- {HB_TAG('w','y','a',' '), HB_TAG('W','Y','N',' ')}, /* Wyandot (retired code) */
-/*{HB_TAG('w','y','n',' '), HB_TAG('W','Y','N',' ')},*/ /* Wyandot */
- {HB_TAG('x','a','l',' '), HB_TAG('K','L','M',' ')}, /* Kalmyk */
- {HB_TAG('x','a','l',' '), HB_TAG('T','O','D',' ')}, /* Kalmyk -> Todo */
{HB_TAG('x','a','n',' '), HB_TAG('S','E','K',' ')}, /* Xamtanga -> Sekota */
- {HB_TAG('x','b','d',' '), HB_TAG_NONE }, /* Bindal != Lü */
-/*{HB_TAG('x','j','b',' '), HB_TAG('X','J','B',' ')},*/ /* Minjungbal -> Minjangbal */
-/*{HB_TAG('x','k','f',' '), HB_TAG('X','K','F',' ')},*/ /* Khengkha */
{HB_TAG('x','m','g',' '), HB_TAG('B','M','L',' ')}, /* Mengaka -> Bamileke */
- {HB_TAG('x','m','m',' '), HB_TAG('M','L','Y',' ')}, /* Manado Malay -> Malay */
- {HB_TAG('x','m','m',' '), HB_TAG('C','P','P',' ')}, /* Manado Malay -> Creoles */
{HB_TAG('x','m','v',' '), HB_TAG('M','L','G',' ')}, /* Antankarana Malagasy -> Malagasy */
{HB_TAG('x','m','w',' '), HB_TAG('M','L','G',' ')}, /* Tsimihety Malagasy -> Malagasy */
{HB_TAG('x','n','j',' '), HB_TAG('S','X','T',' ')}, /* Ngoni (Tanzania) -> Sutu */
{HB_TAG('x','n','q',' '), HB_TAG('S','X','T',' ')}, /* Ngoni (Mozambique) -> Sutu */
{HB_TAG('x','n','r',' '), HB_TAG('D','G','R',' ')}, /* Kangri -> Dogri (macrolanguage) */
-/*{HB_TAG('x','o','g',' '), HB_TAG('X','O','G',' ')},*/ /* Soga */
- {HB_TAG('x','p','e',' '), HB_TAG('X','P','E',' ')}, /* Liberia Kpelle -> Kpelle (Liberia) */
- {HB_TAG('x','p','e',' '), HB_TAG('K','P','L',' ')}, /* Liberia Kpelle -> Kpelle */
- {HB_TAG('x','s','l',' '), HB_TAG('S','S','L',' ')}, /* South Slavey */
- {HB_TAG('x','s','l',' '), HB_TAG('S','L','A',' ')}, /* South Slavey -> Slavey */
- {HB_TAG('x','s','l',' '), HB_TAG('A','T','H',' ')}, /* South Slavey -> Athapaskan */
{HB_TAG('x','s','t',' '), HB_TAG('S','I','G',' ')}, /* Silt'e (retired code) -> Silte Gurage */
-/*{HB_TAG('x','u','b',' '), HB_TAG('X','U','B',' ')},*/ /* Betta Kurumba -> Bette Kuruma */
-/*{HB_TAG('x','u','j',' '), HB_TAG('X','U','J',' ')},*/ /* Jennu Kurumba -> Jennu Kuruma */
{HB_TAG('x','u','p',' '), HB_TAG('A','T','H',' ')}, /* Upper Umpqua -> Athapaskan */
{HB_TAG('x','w','o',' '), HB_TAG('T','O','D',' ')}, /* Written Oirat -> Todo */
{HB_TAG('y','a','j',' '), HB_TAG('B','A','D','0')}, /* Banda-Yangere -> Banda */
- {HB_TAG('y','a','k',' '), HB_TAG_NONE }, /* Yakama != Sakha */
-/*{HB_TAG('y','a','o',' '), HB_TAG('Y','A','O',' ')},*/ /* Yao */
-/*{HB_TAG('y','a','p',' '), HB_TAG('Y','A','P',' ')},*/ /* Yapese */
- {HB_TAG('y','b','a',' '), HB_TAG_NONE }, /* Yala != Yoruba */
{HB_TAG('y','b','b',' '), HB_TAG('B','M','L',' ')}, /* Yemba -> Bamileke */
{HB_TAG('y','b','d',' '), HB_TAG('A','R','K',' ')}, /* Yangbye (retired code) -> Rakhine */
{HB_TAG('y','c','r',' '), HB_TAG('C','P','P',' ')}, /* Yilan Creole -> Creoles */
{HB_TAG('y','d','d',' '), HB_TAG('J','I','I',' ')}, /* Eastern Yiddish -> Yiddish */
-/*{HB_TAG('y','g','p',' '), HB_TAG('Y','G','P',' ')},*/ /* Gepo */
{HB_TAG('y','i','h',' '), HB_TAG('J','I','I',' ')}, /* Western Yiddish -> Yiddish */
- {HB_TAG('y','i','m',' '), HB_TAG_NONE }, /* Yimchungru Naga != Yi Modern */
-/*{HB_TAG('y','n','a',' '), HB_TAG('Y','N','A',' ')},*/ /* Aluo */
{HB_TAG('y','o','s',' '), HB_TAG('Q','I','N',' ')}, /* Yos (retired code) -> Chin */
{HB_TAG('y','u','a',' '), HB_TAG('M','Y','N',' ')}, /* Yucateco -> Mayan */
{HB_TAG('y','u','e',' '), HB_TAG('Z','H','H',' ')}, /* Yue Chinese -> Chinese, Traditional, Hong Kong SAR */
-/*{HB_TAG('y','u','f',' '), HB_TAG('Y','U','F',' ')},*/ /* Havasupai-Walapai-Yavapai */
-/*{HB_TAG('y','w','q',' '), HB_TAG('Y','W','Q',' ')},*/ /* Wuding-Luquan Yi */
{HB_TAG('z','c','h',' '), HB_TAG('Z','H','A',' ')}, /* Central Hongshuihe Zhuang -> Zhuang */
{HB_TAG('z','d','j',' '), HB_TAG('C','M','R',' ')}, /* Ngazidja Comorian -> Comorian */
-/*{HB_TAG('z','e','a',' '), HB_TAG('Z','E','A',' ')},*/ /* Zeeuws -> Zealandic */
{HB_TAG('z','e','h',' '), HB_TAG('Z','H','A',' ')}, /* Eastern Hongshuihe Zhuang -> Zhuang */
{HB_TAG('z','e','n',' '), HB_TAG('B','B','R',' ')}, /* Zenaga -> Berber */
{HB_TAG('z','g','b',' '), HB_TAG('Z','H','A',' ')}, /* Guibei Zhuang -> Zhuang */
- {HB_TAG('z','g','h',' '), HB_TAG('Z','G','H',' ')}, /* Standard Moroccan Tamazight */
- {HB_TAG('z','g','h',' '), HB_TAG('B','B','R',' ')}, /* Standard Moroccan Tamazight -> Berber */
{HB_TAG('z','g','m',' '), HB_TAG('Z','H','A',' ')}, /* Minz Zhuang -> Zhuang */
{HB_TAG('z','g','n',' '), HB_TAG('Z','H','A',' ')}, /* Guibian Zhuang -> Zhuang */
{HB_TAG('z','h','d',' '), HB_TAG('Z','H','A',' ')}, /* Dai Zhuang -> Zhuang */
@@ -1666,7 +1155,6 @@
{HB_TAG('z','l','q',' '), HB_TAG('Z','H','A',' ')}, /* Liuqian Zhuang -> Zhuang */
{HB_TAG('z','m','i',' '), HB_TAG('M','L','Y',' ')}, /* Negeri Sembilan Malay -> Malay */
{HB_TAG('z','m','z',' '), HB_TAG('B','A','D','0')}, /* Mbandja -> Banda */
- {HB_TAG('z','n','d',' '), HB_TAG_NONE }, /* Zande [collection] != Zande */
{HB_TAG('z','n','e',' '), HB_TAG('Z','N','D',' ')}, /* Zande */
{HB_TAG('z','o','m',' '), HB_TAG('Q','I','N',' ')}, /* Zou -> Chin */
{HB_TAG('z','q','e',' '), HB_TAG('Z','H','A',' ')}, /* Qiubei Zhuang -> Zhuang */
@@ -1677,9 +1165,439 @@
{HB_TAG('z','y','j',' '), HB_TAG('Z','H','A',' ')}, /* Youjiang Zhuang -> Zhuang */
{HB_TAG('z','y','n',' '), HB_TAG('Z','H','A',' ')}, /* Yongnan Zhuang -> Zhuang */
{HB_TAG('z','y','p',' '), HB_TAG('Q','I','N',' ')}, /* Zyphe Chin -> Chin */
-/*{HB_TAG('z','z','a',' '), HB_TAG('Z','Z','A',' ')},*/ /* Zazaki [macrolanguage] */
{HB_TAG('z','z','j',' '), HB_TAG('Z','H','A',' ')}, /* Zuojiang Zhuang -> Zhuang */
};
+
+static const hb_tag_t ot_languages3_multi_values[] = {
+ HB_TAG('F','A','N',' '), /* Saint Lucian Creole French -> French Antillean */
+ HB_TAG('C','P','P',' '), /* Saint Lucian Creole French -> Creoles */
+ HB_TAG('A','C','R',' '), /* Achi */
+ HB_TAG('M','Y','N',' '), /* Achi -> Mayan */
+ HB_TAG('A','C','Y',' '), /* Cypriot Arabic */
+ HB_TAG('A','R','A',' '), /* Cypriot Arabic -> Arabic */
+ HB_TAG('S','W','A',' '), /* Assyrian Neo-Aramaic -> Swadaya Aramaic */
+ HB_TAG('S','Y','R',' '), /* Assyrian Neo-Aramaic -> Syriac */
+ HB_TAG('A','K','B',' '), /* Batak Angkola */
+ HB_TAG('B','T','K',' '), /* Batak Angkola -> Batak */
+ HB_TAG('M','O','R',' '), /* Moroccan Arabic -> Moroccan */
+ HB_TAG('A','R','A',' '), /* Moroccan Arabic -> Arabic */
+ HB_TAG('A','Z','B',' '), /* South Azerbaijani -> Torki */
+ HB_TAG('A','Z','E',' '), /* South Azerbaijani -> Azerbaijani */
+ HB_TAG('B','B','C',' '), /* Batak Toba */
+ HB_TAG('B','T','K',' '), /* Batak Toba -> Batak */
+ HB_TAG('B','G','Q',' '), /* Bagri */
+ HB_TAG('R','A','J',' '), /* Bagri -> Rajasthani */
+ HB_TAG('B','L','K',' '), /* Pa’o Karen */
+ HB_TAG('K','R','N',' '), /* Pa'o Karen -> Karen */
+ HB_TAG('B','T','D',' '), /* Batak Dairi (Pakpak) */
+ HB_TAG('B','T','K',' '), /* Batak Dairi -> Batak */
+ HB_TAG('B','T','M',' '), /* Batak Mandailing */
+ HB_TAG('B','T','K',' '), /* Batak Mandailing -> Batak */
+ HB_TAG('B','T','S',' '), /* Batak Simalungun */
+ HB_TAG('B','T','K',' '), /* Batak Simalungun -> Batak */
+ HB_TAG('B','T','X',' '), /* Batak Karo */
+ HB_TAG('B','T','K',' '), /* Batak Karo -> Batak */
+ HB_TAG('B','T','Z',' '), /* Batak Alas-Kluet */
+ HB_TAG('B','T','K',' '), /* Batak Alas-Kluet -> Batak */
+ HB_TAG('B','Y','V',' '), /* Medumba */
+ HB_TAG('B','M','L',' '), /* Medumba -> Bamileke */
+ HB_TAG('C','R','R',' '), /* Southern Carrier -> Carrier */
+ HB_TAG('A','T','H',' '), /* Southern Carrier -> Athapaskan */
+ HB_TAG('C','A','K',' '), /* Kaqchikel */
+ HB_TAG('M','Y','N',' '), /* Kaqchikel -> Mayan */
+ HB_TAG('C','B','K',' '), /* Chavacano -> Zamboanga Chavacano */
+ HB_TAG('C','P','P',' '), /* Chavacano -> Creoles */
+ HB_TAG('H','A','L',' '), /* Halam (Falam Chin) */
+ HB_TAG('Q','I','N',' '), /* Falam Chin -> Chin */
+ HB_TAG('H','M','A',' '), /* Mari (Russia) [macrolanguage] -> High Mari */
+ HB_TAG('L','M','A',' '), /* Mari (Russia) [macrolanguage] -> Low Mari */
+ HB_TAG('C','H','P',' '), /* Chipewyan */
+ HB_TAG('S','A','Y',' '), /* Chipewyan -> Sayisi */
+ HB_TAG('A','T','H',' '), /* Chipewyan -> Athapaskan */
+ HB_TAG('Q','U','H',' '), /* Chilean Quechua (retired code) -> Quechua (Bolivia) */
+ HB_TAG('Q','U','Z',' '), /* Chilean Quechua (retired code) -> Quechua */
+ HB_TAG('E','C','R',' '), /* Southern East Cree -> Eastern Cree */
+ HB_TAG('Y','C','R',' '), /* Southern East Cree -> Y-Cree */
+ HB_TAG('C','R','E',' '), /* Southern East Cree -> Cree */
+ HB_TAG('W','C','R',' '), /* Plains Cree -> West-Cree */
+ HB_TAG('Y','C','R',' '), /* Plains Cree -> Y-Cree */
+ HB_TAG('C','R','E',' '), /* Plains Cree -> Cree */
+ HB_TAG('E','C','R',' '), /* Northern East Cree -> Eastern Cree */
+ HB_TAG('Y','C','R',' '), /* Northern East Cree -> Y-Cree */
+ HB_TAG('C','R','E',' '), /* Northern East Cree -> Cree */
+ HB_TAG('M','C','R',' '), /* Moose Cree */
+ HB_TAG('L','C','R',' '), /* Moose Cree -> L-Cree */
+ HB_TAG('C','R','E',' '), /* Moose Cree -> Cree */
+ HB_TAG('C','R','R',' '), /* Carrier */
+ HB_TAG('A','T','H',' '), /* Carrier -> Athapaskan */
+ HB_TAG('N','C','R',' '), /* Swampy Cree -> N-Cree */
+ HB_TAG('N','H','C',' '), /* Swampy Cree -> Norway House Cree */
+ HB_TAG('C','R','E',' '), /* Swampy Cree -> Cree */
+ HB_TAG('D','C','R',' '), /* Woods Cree */
+ HB_TAG('T','C','R',' '), /* Woods Cree -> TH-Cree */
+ HB_TAG('C','R','E',' '), /* Woods Cree -> Cree */
+ HB_TAG('S','L','A',' '), /* Slave (Athapascan) [macrolanguage] -> Slavey */
+ HB_TAG('A','T','H',' '), /* Slave (Athapascan) [macrolanguage] -> Athapaskan */
+ HB_TAG('D','G','O',' '), /* Dogri (individual language) */
+ HB_TAG('D','G','R',' '), /* Dogri (macrolanguage) */
+ HB_TAG('D','I','Q',' '), /* Dimli */
+ HB_TAG('Z','Z','A',' '), /* Dimli -> Zazaki */
+ HB_TAG('D','R','I',' '), /* Darwazi (retired code) -> Dari */
+ HB_TAG('F','A','R',' '), /* Darwazi (retired code) -> Persian */
+ HB_TAG('E','M','K',' '), /* Eastern Maninkakan */
+ HB_TAG('M','N','K',' '), /* Eastern Maninkakan -> Maninka */
+ HB_TAG('F','A','N','0'), /* Fang (Equatorial Guinea) */
+ HB_TAG('B','T','I',' '), /* Fang (Equatorial Guinea) -> Beti */
+ HB_TAG('F','A','T',' '), /* Fanti */
+ HB_TAG('A','K','A',' '), /* Fanti -> Akan */
+ HB_TAG('H','A','L',' '), /* Halam (Falam Chin) (retired code) */
+ HB_TAG('Q','I','N',' '), /* Falam Chin (retired code) -> Chin */
+ HB_TAG('F','M','P',' '), /* Fe’fe’ */
+ HB_TAG('B','M','L',' '), /* Fe'fe' -> Bamileke */
+ HB_TAG('F','T','A',' '), /* Pular -> Futa */
+ HB_TAG('F','U','L',' '), /* Pular -> Fulah */
+ HB_TAG('F','U','V',' '), /* Nigerian Fulfulde */
+ HB_TAG('F','U','L',' '), /* Nigerian Fulfulde -> Fulah */
+ HB_TAG('G','K','P',' '), /* Guinea Kpelle -> Kpelle (Guinea) */
+ HB_TAG('K','P','L',' '), /* Guinea Kpelle -> Kpelle */
+ HB_TAG('H','M','D',' '), /* Large Flowery Miao -> A-Hmao */
+ HB_TAG('H','M','N',' '), /* Large Flowery Miao -> Hmong */
+ HB_TAG('H','M','Z',' '), /* Hmong Shua -> Hmong Shuat */
+ HB_TAG('H','M','N',' '), /* Hmong Shua -> Hmong */
+ HB_TAG('H','A','R',' '), /* Hadothi -> Harauti */
+ HB_TAG('R','A','J',' '), /* Hadothi -> Rajasthani */
+ HB_TAG('I','N','U',' '), /* Eastern Canadian Inuktitut -> Inuktitut */
+ HB_TAG('I','N','U','K'), /* Eastern Canadian Inuktitut -> Nunavik Inuktitut */
+ HB_TAG('J','A','M',' '), /* Jamaican Creole English -> Jamaican Creole */
+ HB_TAG('C','P','P',' '), /* Jamaican Creole English -> Creoles */
+ HB_TAG('K','A','B','0'), /* Kabyle */
+ HB_TAG('B','B','R',' '), /* Kabyle -> Berber */
+ HB_TAG('K','H','K',' '), /* Khanty -> Khanty-Kazim */
+ HB_TAG('K','H','S',' '), /* Khanty -> Khanty-Shurishkar */
+ HB_TAG('K','H','V',' '), /* Khanty -> Khanty-Vakhi */
+ HB_TAG('K','E','A',' '), /* Kabuverdianu (Crioulo) */
+ HB_TAG('C','P','P',' '), /* Kabuverdianu -> Creoles */
+ HB_TAG('K','E','K',' '), /* Kekchi */
+ HB_TAG('M','Y','N',' '), /* Kekchí -> Mayan */
+ HB_TAG('K','H','T',' '), /* Khamti -> Khamti Shan */
+ HB_TAG('K','H','N',' '), /* Khamti -> Khamti Shan (Microsoft fonts) */
+ HB_TAG('K','I','U',' '), /* Kirmanjki */
+ HB_TAG('Z','Z','A',' '), /* Kirmanjki -> Zazaki */
+ HB_TAG('K','J','P',' '), /* Pwo Eastern Karen -> Eastern Pwo Karen */
+ HB_TAG('K','R','N',' '), /* Pwo Eastern Karen -> Karen */
+ HB_TAG('K','O','P',' '), /* Komi-Permyak */
+ HB_TAG('K','O','M',' '), /* Komi-Permyak -> Komi */
+ HB_TAG('K','O','Z',' '), /* Komi-Zyrian */
+ HB_TAG('K','O','M',' '), /* Komi-Zyrian -> Komi */
+ HB_TAG('K','A','R',' '), /* Karachay-Balkar -> Karachay */
+ HB_TAG('B','A','L',' '), /* Karachay-Balkar -> Balkar */
+ HB_TAG('K','R','I',' '), /* Krio */
+ HB_TAG('C','P','P',' '), /* Krio -> Creoles */
+ HB_TAG('K','S','W',' '), /* S’gaw Karen */
+ HB_TAG('K','R','N',' '), /* S'gaw Karen -> Karen */
+ HB_TAG('K','V','Q',' '), /* Geba Karen */
+ HB_TAG('K','R','N',' '), /* Geba Karen -> Karen */
+ HB_TAG('K','Y','U',' '), /* Western Kayah */
+ HB_TAG('K','R','N',' '), /* Western Kayah -> Karen */
+ HB_TAG('M','I','Z',' '), /* Lushai -> Mizo */
+ HB_TAG('Q','I','N',' '), /* Lushai -> Chin */
+ HB_TAG('M','A','M',' '), /* Mam */
+ HB_TAG('M','Y','N',' '), /* Mam -> Mayan */
+ HB_TAG('M','L','Y',' '), /* North Moluccan Malay -> Malay */
+ HB_TAG('C','P','P',' '), /* North Moluccan Malay -> Creoles */
+ HB_TAG('M','F','A',' '), /* Pattani Malay */
+ HB_TAG('M','L','Y',' '), /* Pattani Malay -> Malay */
+ HB_TAG('M','F','E',' '), /* Morisyen */
+ HB_TAG('C','P','P',' '), /* Morisyen -> Creoles */
+ HB_TAG('M','I','N',' '), /* Minangkabau */
+ HB_TAG('M','L','Y',' '), /* Minangkabau -> Malay */
+ HB_TAG('M','L','N',' '), /* Western Maninkakan -> Malinke */
+ HB_TAG('M','N','K',' '), /* Western Maninkakan -> Maninka */
+ HB_TAG('M','N','D',' '), /* Mandinka */
+ HB_TAG('M','N','K',' '), /* Mandinka -> Maninka */
+ HB_TAG('M','O','N',' '), /* Mon */
+ HB_TAG('M','O','N','T'), /* Mon -> Thailand Mon */
+ HB_TAG('M','L','Y',' '), /* Sabah Malay -> Malay */
+ HB_TAG('C','P','P',' '), /* Sabah Malay -> Creoles */
+ HB_TAG('M','W','W',' '), /* Hmong Daw */
+ HB_TAG('H','M','N',' '), /* Hmong Daw -> Hmong */
+ HB_TAG('N','A','G',' '), /* Naga Pidgin -> Naga-Assamese */
+ HB_TAG('C','P','P',' '), /* Naga Pidgin -> Creoles */
+ HB_TAG('O','C','R',' '), /* Severn Ojibwa -> Oji-Cree */
+ HB_TAG('O','J','B',' '), /* Severn Ojibwa -> Ojibway */
+ HB_TAG('P','A','P','0'), /* Papiamento -> Papiamentu */
+ HB_TAG('C','P','P',' '), /* Papiamento -> Creoles */
+ HB_TAG('A','R','A',' '), /* Sudanese Creole Arabic -> Arabic */
+ HB_TAG('C','P','P',' '), /* Sudanese Creole Arabic -> Creoles */
+ HB_TAG('P','I','H',' '), /* Pitcairn-Norfolk -> Norfolk */
+ HB_TAG('C','P','P',' '), /* Pitcairn-Norfolk -> Creoles */
+ HB_TAG('P','O','H',' '), /* Poqomchi' -> Pocomchi */
+ HB_TAG('M','Y','N',' '), /* Poqomchi' -> Mayan */
+ HB_TAG('D','R','I',' '), /* Dari */
+ HB_TAG('F','A','R',' '), /* Dari -> Persian */
+ HB_TAG('P','W','O',' '), /* Pwo Western Karen -> Western Pwo Karen */
+ HB_TAG('K','R','N',' '), /* Pwo Western Karen -> Karen */
+ HB_TAG('Q','W','H',' '), /* Huallaga Huánuco Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Huallaga Huánuco Quechua -> Quechua */
+ HB_TAG('Q','U','C',' '), /* K’iche’ */
+ HB_TAG('M','Y','N',' '), /* K'iche' -> Mayan */
+ HB_TAG('Q','V','I',' '), /* Calderón Highland Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Calderón Highland Quichua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Chimborazo Highland Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Chimborazo Highland Quichua -> Quechua */
+ HB_TAG('Q','U','H',' '), /* South Bolivian Quechua -> Quechua (Bolivia) */
+ HB_TAG('Q','U','Z',' '), /* South Bolivian Quechua -> Quechua */
+ HB_TAG('Q','U','H',' '), /* North Bolivian Quechua -> Quechua (Bolivia) */
+ HB_TAG('Q','U','Z',' '), /* North Bolivian Quechua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Southern Pastaza Quechua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Southern Pastaza Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Yanahuanca Pasco Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Yanahuanca Pasco Quechua -> Quechua */
+ HB_TAG('Q','U','H',' '), /* Santiago del Estero Quichua -> Quechua (Bolivia) */
+ HB_TAG('Q','U','Z',' '), /* Santiago del Estero Quichua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Tena Lowland Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Tena Lowland Quichua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Yauyos Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Yauyos Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Ambo-Pasco Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Ambo-Pasco Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Imbabura Highland Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Imbabura Highland Quichua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Loja Highland Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Loja Highland Quichua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Cajatambo North Lima Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Cajatambo North Lima Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Margos-Yarowilca-Lauricocha Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* North Junín Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* North Junín Quechua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Napo Lowland Quechua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Napo Lowland Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Pacaraos Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Pacaraos Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Huaylla Wanca Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Huaylla Wanca Quechua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Northern Pastaza Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Northern Pastaza Quichua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Corongo Ancash Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Corongo Ancash Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Huaylas Ancash Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Huaylas Ancash Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Sihuas Ancash Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Sihuas Ancash Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Chiquián Ancash Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Chiquián Ancash Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Chincha Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Chincha Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Panao Huánuco Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Panao Huánuco Quechua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Salasaca Highland Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Salasaca Highland Quichua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Northern Conchucos Ancash Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Northern Conchucos Ancash Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Southern Conchucos Ancash Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Southern Conchucos Ancash Quechua -> Quechua */
+ HB_TAG('Q','V','I',' '), /* Cañar Highland Quichua -> Quechua (Ecuador) */
+ HB_TAG('Q','U','Z',' '), /* Cañar Highland Quichua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Santa Ana de Tusi Pasco Quechua -> Quechua */
+ HB_TAG('Q','W','H',' '), /* Jauja Wanca Quechua -> Quechua (Peru) */
+ HB_TAG('Q','U','Z',' '), /* Jauja Wanca Quechua -> Quechua */
+ HB_TAG('R','I','F',' '), /* Tarifit */
+ HB_TAG('B','B','R',' '), /* Tarifit -> Berber */
+ HB_TAG('R','M','Y',' '), /* Vlax Romani */
+ HB_TAG('R','O','Y',' '), /* Vlax Romani -> Romany */
+ HB_TAG('S','C','S',' '), /* North Slavey */
+ HB_TAG('S','L','A',' '), /* North Slavey -> Slavey */
+ HB_TAG('A','T','H',' '), /* North Slavey -> Athapaskan */
+ HB_TAG('S','F','M',' '), /* Small Flowery Miao */
+ HB_TAG('H','M','N',' '), /* Small Flowery Miao -> Hmong */
+ HB_TAG('S','H','I',' '), /* Tachelhit */
+ HB_TAG('B','B','R',' '), /* Tachelhit -> Berber */
+ HB_TAG('T','A','Q',' '), /* Tamasheq */
+ HB_TAG('T','M','H',' '), /* Tamasheq -> Tamashek */
+ HB_TAG('B','B','R',' '), /* Tamasheq -> Berber */
+ HB_TAG('T','H','V',' '), /* Tahaggart Tamahaq */
+ HB_TAG('T','M','H',' '), /* Tahaggart Tamahaq -> Tamashek */
+ HB_TAG('B','B','R',' '), /* Tahaggart Tamahaq -> Berber */
+ HB_TAG('T','H','Z',' '), /* Tayart Tamajeq */
+ HB_TAG('T','M','H',' '), /* Tayart Tamajeq -> Tamashek */
+ HB_TAG('B','B','R',' '), /* Tayart Tamajeq -> Berber */
+ HB_TAG('T','M','H',' '), /* Tamashek [macrolanguage] */
+ HB_TAG('B','B','R',' '), /* Tamashek [macrolanguage] -> Berber */
+ HB_TAG('D','R','I',' '), /* Tangshewi (retired code) -> Dari */
+ HB_TAG('F','A','R',' '), /* Tangshewi (retired code) -> Persian */
+ HB_TAG('T','P','I',' '), /* Tok Pisin */
+ HB_TAG('C','P','P',' '), /* Tok Pisin -> Creoles */
+ HB_TAG('T','U','A',' '), /* Turoyo -> Turoyo Aramaic */
+ HB_TAG('S','Y','R',' '), /* Turoyo -> Syriac */
+ HB_TAG('T','T','Q',' '), /* Tawallammat Tamajaq */
+ HB_TAG('T','M','H',' '), /* Tawallammat Tamajaq -> Tamashek */
+ HB_TAG('B','B','R',' '), /* Tawallammat Tamajaq -> Berber */
+ HB_TAG('T','Z','M',' '), /* Central Atlas Tamazight -> Tamazight */
+ HB_TAG('B','B','R',' '), /* Central Atlas Tamazight -> Berber */
+ HB_TAG('T','Z','O',' '), /* Tzotzil */
+ HB_TAG('M','Y','N',' '), /* Tzotzil -> Mayan */
+ HB_TAG('V','R','O',' '), /* Võro */
+ HB_TAG('E','T','I',' '), /* Võro -> Estonian */
+ HB_TAG('W','A','G',' '), /* Wagdi */
+ HB_TAG('R','A','J',' '), /* Wagdi -> Rajasthani */
+ HB_TAG('W','D','T',' '), /* Wyandot (retired code) -> Wendat */
+ HB_TAG('W','Y','N',' '), /* Wyandot (retired code) */
+ HB_TAG('K','L','M',' '), /* Kalmyk */
+ HB_TAG('T','O','D',' '), /* Kalmyk -> Todo */
+ HB_TAG('M','L','Y',' '), /* Manado Malay -> Malay */
+ HB_TAG('C','P','P',' '), /* Manado Malay -> Creoles */
+ HB_TAG('X','P','E',' '), /* Liberia Kpelle -> Kpelle (Liberia) */
+ HB_TAG('K','P','L',' '), /* Liberia Kpelle -> Kpelle */
+ HB_TAG('S','S','L',' '), /* South Slavey */
+ HB_TAG('S','L','A',' '), /* South Slavey -> Slavey */
+ HB_TAG('A','T','H',' '), /* South Slavey -> Athapaskan */
+ HB_TAG('Z','G','H',' '), /* Standard Moroccan Tamazight */
+ HB_TAG('B','B','R',' '), /* Standard Moroccan Tamazight -> Berber */
+};
+
+static const LangTagRange ot_languages3_multi[] = {
+ {HB_TAG('a','c','f',' '), 0, 2}, /* Saint Lucian Creole French -> French Antillean */
+ {HB_TAG('a','c','r',' '), 2, 2}, /* Achi */
+ {HB_TAG('a','c','y',' '), 4, 2}, /* Cypriot Arabic */
+ {HB_TAG('a','i','i',' '), 6, 2}, /* Assyrian Neo-Aramaic -> Swadaya Aramaic */
+ {HB_TAG('a','k','b',' '), 8, 2}, /* Batak Angkola */
+ {HB_TAG('a','r','y',' '), 10, 2}, /* Moroccan Arabic -> Moroccan */
+ {HB_TAG('a','z','b',' '), 12, 2}, /* South Azerbaijani -> Torki */
+ {HB_TAG('b','b','c',' '), 14, 2}, /* Batak Toba */
+ {HB_TAG('b','g','q',' '), 16, 2}, /* Bagri */
+ {HB_TAG('b','l','k',' '), 18, 2}, /* Pa’o Karen */
+ {HB_TAG('b','t','d',' '), 20, 2}, /* Batak Dairi (Pakpak) */
+ {HB_TAG('b','t','m',' '), 22, 2}, /* Batak Mandailing */
+ {HB_TAG('b','t','s',' '), 24, 2}, /* Batak Simalungun */
+ {HB_TAG('b','t','x',' '), 26, 2}, /* Batak Karo */
+ {HB_TAG('b','t','z',' '), 28, 2}, /* Batak Alas-Kluet */
+ {HB_TAG('b','y','v',' '), 30, 2}, /* Medumba */
+ {HB_TAG('c','a','f',' '), 32, 2}, /* Southern Carrier -> Carrier */
+ {HB_TAG('c','a','k',' '), 34, 2}, /* Kaqchikel */
+ {HB_TAG('c','b','k',' '), 36, 2}, /* Chavacano -> Zamboanga Chavacano */
+ {HB_TAG('c','f','m',' '), 38, 2}, /* Halam (Falam Chin) */
+ {HB_TAG('c','h','m',' '), 40, 2}, /* Mari (Russia) [macrolanguage] -> High Mari */
+ {HB_TAG('c','h','p',' '), 42, 3}, /* Chipewyan */
+ {HB_TAG('c','q','u',' '), 45, 2}, /* Chilean Quechua (retired code) -> Quechua (Bolivia) */
+ {HB_TAG('c','r','j',' '), 47, 3}, /* Southern East Cree -> Eastern Cree */
+ {HB_TAG('c','r','k',' '), 50, 3}, /* Plains Cree -> West-Cree */
+ {HB_TAG('c','r','l',' '), 53, 3}, /* Northern East Cree -> Eastern Cree */
+ {HB_TAG('c','r','m',' '), 56, 3}, /* Moose Cree */
+ {HB_TAG('c','r','x',' '), 59, 2}, /* Carrier */
+ {HB_TAG('c','s','w',' '), 61, 3}, /* Swampy Cree -> N-Cree */
+ {HB_TAG('c','w','d',' '), 64, 3}, /* Woods Cree */
+ {HB_TAG('d','e','n',' '), 67, 2}, /* Slave (Athapascan) [macrolanguage] -> Slavey */
+ {HB_TAG('d','g','o',' '), 69, 2}, /* Dogri (individual language) */
+ {HB_TAG('d','i','q',' '), 71, 2}, /* Dimli */
+ {HB_TAG('d','r','w',' '), 73, 2}, /* Darwazi (retired code) -> Dari */
+ {HB_TAG('e','m','k',' '), 75, 2}, /* Eastern Maninkakan */
+ {HB_TAG('f','a','n',' '), 77, 2}, /* Fang (Equatorial Guinea) */
+ {HB_TAG('f','a','t',' '), 79, 2}, /* Fanti */
+ {HB_TAG('f','l','m',' '), 81, 2}, /* Halam (Falam Chin) (retired code) */
+ {HB_TAG('f','m','p',' '), 83, 2}, /* Fe’fe’ */
+ {HB_TAG('f','u','f',' '), 85, 2}, /* Pular -> Futa */
+ {HB_TAG('f','u','v',' '), 87, 2}, /* Nigerian Fulfulde */
+ {HB_TAG('g','k','p',' '), 89, 2}, /* Guinea Kpelle -> Kpelle (Guinea) */
+ {HB_TAG('h','m','d',' '), 91, 2}, /* Large Flowery Miao -> A-Hmao */
+ {HB_TAG('h','m','z',' '), 93, 2}, /* Hmong Shua -> Hmong Shuat */
+ {HB_TAG('h','o','j',' '), 95, 2}, /* Hadothi -> Harauti */
+ {HB_TAG('i','k','e',' '), 97, 2}, /* Eastern Canadian Inuktitut -> Inuktitut */
+ {HB_TAG('j','a','m',' '), 99, 2}, /* Jamaican Creole English -> Jamaican Creole */
+ {HB_TAG('k','a','b',' '), 101, 2}, /* Kabyle */
+ {HB_TAG('k','c','a',' '), 103, 3}, /* Khanty -> Khanty-Kazim */
+ {HB_TAG('k','e','a',' '), 106, 2}, /* Kabuverdianu (Crioulo) */
+ {HB_TAG('k','e','k',' '), 108, 2}, /* Kekchi */
+ {HB_TAG('k','h','t',' '), 110, 2}, /* Khamti -> Khamti Shan */
+ {HB_TAG('k','i','u',' '), 112, 2}, /* Kirmanjki */
+ {HB_TAG('k','j','p',' '), 114, 2}, /* Pwo Eastern Karen -> Eastern Pwo Karen */
+ {HB_TAG('k','o','i',' '), 116, 2}, /* Komi-Permyak */
+ {HB_TAG('k','p','v',' '), 118, 2}, /* Komi-Zyrian */
+ {HB_TAG('k','r','c',' '), 120, 2}, /* Karachay-Balkar -> Karachay */
+ {HB_TAG('k','r','i',' '), 122, 2}, /* Krio */
+ {HB_TAG('k','s','w',' '), 124, 2}, /* S’gaw Karen */
+ {HB_TAG('k','v','q',' '), 126, 2}, /* Geba Karen */
+ {HB_TAG('k','y','u',' '), 128, 2}, /* Western Kayah */
+ {HB_TAG('l','u','s',' '), 130, 2}, /* Lushai -> Mizo */
+ {HB_TAG('m','a','m',' '), 132, 2}, /* Mam */
+ {HB_TAG('m','a','x',' '), 134, 2}, /* North Moluccan Malay -> Malay */
+ {HB_TAG('m','f','a',' '), 136, 2}, /* Pattani Malay */
+ {HB_TAG('m','f','e',' '), 138, 2}, /* Morisyen */
+ {HB_TAG('m','i','n',' '), 140, 2}, /* Minangkabau */
+ {HB_TAG('m','l','q',' '), 142, 2}, /* Western Maninkakan -> Malinke */
+ {HB_TAG('m','n','k',' '), 144, 2}, /* Mandinka */
+ {HB_TAG('m','n','w',' '), 146, 2}, /* Mon */
+ {HB_TAG('m','s','i',' '), 148, 2}, /* Sabah Malay -> Malay */
+ {HB_TAG('m','w','w',' '), 150, 2}, /* Hmong Daw */
+ {HB_TAG('n','a','g',' '), 152, 2}, /* Naga Pidgin -> Naga-Assamese */
+ {HB_TAG('o','j','s',' '), 154, 2}, /* Severn Ojibwa -> Oji-Cree */
+ {HB_TAG('p','a','p',' '), 156, 2}, /* Papiamento -> Papiamentu */
+ {HB_TAG('p','g','a',' '), 158, 2}, /* Sudanese Creole Arabic -> Arabic */
+ {HB_TAG('p','i','h',' '), 160, 2}, /* Pitcairn-Norfolk -> Norfolk */
+ {HB_TAG('p','o','h',' '), 162, 2}, /* Poqomchi' -> Pocomchi */
+ {HB_TAG('p','r','s',' '), 164, 2}, /* Dari */
+ {HB_TAG('p','w','o',' '), 166, 2}, /* Pwo Western Karen -> Western Pwo Karen */
+ {HB_TAG('q','u','b',' '), 168, 2}, /* Huallaga Huánuco Quechua -> Quechua (Peru) */
+ {HB_TAG('q','u','c',' '), 170, 2}, /* K’iche’ */
+ {HB_TAG('q','u','d',' '), 172, 2}, /* Calderón Highland Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','u','g',' '), 174, 2}, /* Chimborazo Highland Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','u','h',' '), 176, 2}, /* South Bolivian Quechua -> Quechua (Bolivia) */
+ {HB_TAG('q','u','l',' '), 178, 2}, /* North Bolivian Quechua -> Quechua (Bolivia) */
+ {HB_TAG('q','u','p',' '), 180, 2}, /* Southern Pastaza Quechua -> Quechua (Ecuador) */
+ {HB_TAG('q','u','r',' '), 182, 2}, /* Yanahuanca Pasco Quechua -> Quechua (Peru) */
+ {HB_TAG('q','u','s',' '), 184, 2}, /* Santiago del Estero Quichua -> Quechua (Bolivia) */
+ {HB_TAG('q','u','w',' '), 186, 2}, /* Tena Lowland Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','u','x',' '), 188, 2}, /* Yauyos Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','a',' '), 190, 2}, /* Ambo-Pasco Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','h',' '), 192, 2}, /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','i',' '), 194, 2}, /* Imbabura Highland Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','v','j',' '), 196, 2}, /* Loja Highland Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','v','l',' '), 198, 2}, /* Cajatambo North Lima Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','m',' '), 200, 2}, /* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','n',' '), 202, 2}, /* North Junín Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','o',' '), 204, 2}, /* Napo Lowland Quechua -> Quechua (Ecuador) */
+ {HB_TAG('q','v','p',' '), 206, 2}, /* Pacaraos Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','w',' '), 208, 2}, /* Huaylla Wanca Quechua -> Quechua (Peru) */
+ {HB_TAG('q','v','z',' '), 210, 2}, /* Northern Pastaza Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','w','a',' '), 212, 2}, /* Corongo Ancash Quechua -> Quechua (Peru) */
+ {HB_TAG('q','w','h',' '), 214, 2}, /* Huaylas Ancash Quechua -> Quechua (Peru) */
+ {HB_TAG('q','w','s',' '), 216, 2}, /* Sihuas Ancash Quechua -> Quechua (Peru) */
+ {HB_TAG('q','x','a',' '), 218, 2}, /* Chiquián Ancash Quechua -> Quechua (Peru) */
+ {HB_TAG('q','x','c',' '), 220, 2}, /* Chincha Quechua -> Quechua (Peru) */
+ {HB_TAG('q','x','h',' '), 222, 2}, /* Panao Huánuco Quechua -> Quechua (Peru) */
+ {HB_TAG('q','x','l',' '), 224, 2}, /* Salasaca Highland Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','x','n',' '), 226, 2}, /* Northern Conchucos Ancash Quechua -> Quechua (Peru) */
+ {HB_TAG('q','x','o',' '), 228, 2}, /* Southern Conchucos Ancash Quechua -> Quechua (Peru) */
+ {HB_TAG('q','x','r',' '), 230, 2}, /* Cañar Highland Quichua -> Quechua (Ecuador) */
+ {HB_TAG('q','x','t',' '), 232, 2}, /* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */
+ {HB_TAG('q','x','w',' '), 234, 2}, /* Jauja Wanca Quechua -> Quechua (Peru) */
+ {HB_TAG('r','i','f',' '), 236, 2}, /* Tarifit */
+ {HB_TAG('r','m','y',' '), 238, 2}, /* Vlax Romani */
+ {HB_TAG('s','c','s',' '), 240, 3}, /* North Slavey */
+ {HB_TAG('s','f','m',' '), 243, 2}, /* Small Flowery Miao */
+ {HB_TAG('s','h','i',' '), 245, 2}, /* Tachelhit */
+ {HB_TAG('t','a','q',' '), 247, 3}, /* Tamasheq */
+ {HB_TAG('t','h','v',' '), 250, 3}, /* Tahaggart Tamahaq */
+ {HB_TAG('t','h','z',' '), 253, 3}, /* Tayart Tamajeq */
+ {HB_TAG('t','m','h',' '), 256, 2}, /* Tamashek [macrolanguage] */
+ {HB_TAG('t','n','f',' '), 258, 2}, /* Tangshewi (retired code) -> Dari */
+ {HB_TAG('t','p','i',' '), 260, 2}, /* Tok Pisin */
+ {HB_TAG('t','r','u',' '), 262, 2}, /* Turoyo -> Turoyo Aramaic */
+ {HB_TAG('t','t','q',' '), 264, 3}, /* Tawallammat Tamajaq */
+ {HB_TAG('t','z','m',' '), 267, 2}, /* Central Atlas Tamazight -> Tamazight */
+ {HB_TAG('t','z','o',' '), 269, 2}, /* Tzotzil */
+ {HB_TAG('v','r','o',' '), 271, 2}, /* Võro */
+ {HB_TAG('w','b','r',' '), 273, 2}, /* Wagdi */
+ {HB_TAG('w','y','a',' '), 275, 2}, /* Wyandot (retired code) -> Wendat */
+ {HB_TAG('x','a','l',' '), 277, 2}, /* Kalmyk */
+ {HB_TAG('x','m','m',' '), 279, 2}, /* Manado Malay -> Malay */
+ {HB_TAG('x','p','e',' '), 281, 2}, /* Liberia Kpelle -> Kpelle (Liberia) */
+ {HB_TAG('x','s','l',' '), 283, 3}, /* South Slavey */
+ {HB_TAG('z','g','h',' '), 286, 2}, /* Standard Moroccan Tamazight */
+};
#endif
/**
@@ -3205,7 +3123,7 @@
case HB_TAG('Z','H','T','M'): /* Chinese, Traditional, Macao SAR */
return hb_language_from_string ("zh-MO", -1); /* Chinese [macrolanguage]; Macao */
case HB_TAG('Z','Z','A',' '): /* Zazaki */
- return hb_language_from_string ("zza", -1); /* Zazaki [macrolanguage] */
+ return hb_language_from_string ("zza", -1); /* Zaza [macrolanguage] */
default:
return HB_LANGUAGE_INVALID;
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-tag.cc openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-tag.cc
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-tag.cc 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-tag.cc 2026-07-13 06:55:55.000000000 +0000
@@ -234,6 +234,29 @@
(lang_str[spec_len] == '\0' || lang_str[spec_len] == '-');
}
+static bool
+bfind_tag (const hb_tag_t *array,
+ unsigned len,
+ hb_tag_t key)
+{
+ unsigned min = 0;
+ unsigned max = len;
+
+ while (min < max)
+ {
+ unsigned mid = min + (max - min) / 2;
+ hb_tag_t val = array[mid];
+ if (key < val)
+ max = mid;
+ else if (key > val)
+ min = mid + 1;
+ else
+ return true;
+ }
+
+ return false;
+}
+
struct LangTag
{
hb_tag_t language;
@@ -247,6 +270,20 @@
{ return cmp (that->language); }
};
+struct LangTagRange
+{
+ hb_tag_t language;
+ uint16_t offset;
+ uint8_t count;
+
+ int cmp (hb_tag_t a) const
+ {
+ return a < this->language ? -1 : a > this->language ? +1 : 0;
+ }
+ int cmp (const LangTagRange *that) const
+ { return cmp (that->language); }
+};
+
#include "hb-ot-tag-table.hh"
/* The corresponding languages IDs for the following IDs are unclear,
@@ -307,46 +344,84 @@
lang_str = s + 1;
}
#endif
- const LangTag *ot_languages = nullptr;
- unsigned ot_languages_len = 0;
const char *dash = strchr (lang_str, '-');
unsigned first_len = dash ? dash - lang_str : limit - lang_str;
+ hb_tag_t lang_tag = hb_tag_from_string (lang_str, first_len);
+
if (first_len == 2)
{
- ot_languages = ot_languages2;
- ot_languages_len = ARRAY_LENGTH (ot_languages2);
+ static hb_atomic_t last_tag_idx_2 = 0; /* Poor man's cache. */
+ unsigned tag_idx = last_tag_idx_2;
+
+ if (likely (tag_idx < ARRAY_LENGTH (ot_languages2) &&
+ ot_languages2[tag_idx].language == lang_tag) ||
+ hb_sorted_array (ot_languages2).bfind (lang_tag, &tag_idx))
+ {
+ last_tag_idx_2 = tag_idx;
+ unsigned int i;
+ while (tag_idx != 0 &&
+ ot_languages2[tag_idx].language == ot_languages2[tag_idx - 1].language)
+ tag_idx--;
+ for (i = 0;
+ i < *count &&
+ tag_idx + i < ARRAY_LENGTH (ot_languages2) &&
+ ot_languages2[tag_idx + i].tag != HB_TAG_NONE &&
+ ot_languages2[tag_idx + i].language == ot_languages2[tag_idx].language;
+ i++)
+ tags[i] = ot_languages2[tag_idx + i].tag;
+ *count = i;
+ return;
+ }
}
#ifndef HB_NO_LANGUAGE_LONG
else if (first_len == 3)
{
- ot_languages = ot_languages3;
- ot_languages_len = ARRAY_LENGTH (ot_languages3);
- }
-#endif
+ static hb_atomic_t last_tag_idx_3 = 0; /* Poor man's cache. */
+ unsigned tag_idx = last_tag_idx_3;
- hb_tag_t lang_tag = hb_tag_from_string (lang_str, first_len);
+ if (likely (tag_idx < ARRAY_LENGTH (ot_languages3) &&
+ ot_languages3[tag_idx].language == lang_tag) ||
+ hb_sorted_array (ot_languages3).bfind (lang_tag, &tag_idx))
+ {
+ last_tag_idx_3 = tag_idx;
+ if (*count)
+ {
+ tags[0] = ot_languages3[tag_idx].tag;
+ *count = 1;
+ }
+ else
+ *count = 0;
+ return;
+ }
- static hb_atomic_t last_tag_idx = 0; /* Poor man's cache. */
- unsigned tag_idx = last_tag_idx;
+ static hb_atomic_t last_tag_idx_3_multi = 0; /* Poor man's cache. */
+ unsigned multi_tag_idx = last_tag_idx_3_multi;
- if (likely (tag_idx < ot_languages_len && ot_languages[tag_idx].language == lang_tag) ||
- hb_sorted_array (ot_languages, ot_languages_len).bfind (lang_tag, &tag_idx))
- {
- last_tag_idx = tag_idx;
- unsigned int i;
- while (tag_idx != 0 &&
- ot_languages[tag_idx].language == ot_languages[tag_idx - 1].language)
- tag_idx--;
- for (i = 0;
- i < *count &&
- tag_idx + i < ot_languages_len &&
- ot_languages[tag_idx + i].tag != HB_TAG_NONE &&
- ot_languages[tag_idx + i].language == ot_languages[tag_idx].language;
- i++)
- tags[i] = ot_languages[tag_idx + i].tag;
- *count = i;
+ if (likely (multi_tag_idx < ARRAY_LENGTH (ot_languages3_multi) &&
+ ot_languages3_multi[multi_tag_idx].language == lang_tag) ||
+ hb_sorted_array (ot_languages3_multi).bfind (lang_tag, &multi_tag_idx))
+ {
+ last_tag_idx_3_multi = multi_tag_idx;
+ const LangTagRange &range = ot_languages3_multi[multi_tag_idx];
+ unsigned int i;
+ for (i = 0; i < *count && i < range.count; i++)
+ tags[i] = ot_languages3_multi_values[range.offset + i];
+ *count = i;
+ return;
+ }
+
+ if (bfind_tag (ot_languages3_blocked, ARRAY_LENGTH (ot_languages3_blocked), lang_tag))
+ {
+ *count = 0;
+ return;
+ }
+
+ /* Assume it's ISO-639-3 and upper-case and use it. */
+ tags[0] = lang_tag & ~0x20202000u;
+ *count = 1;
return;
}
+#endif
}
#ifndef HB_NO_LANGUAGE_LONG
@@ -525,6 +600,13 @@
hb_tag_to_string (ot_languages3[i].language, buf);
return hb_language_from_string (buf, 3);
}
+ for (i = 0; i < ARRAY_LENGTH (ot_languages3_multi); i++)
+ for (unsigned int j = 0; j < ot_languages3_multi[i].count; j++)
+ if (ot_languages3_multi_values[ot_languages3_multi[i].offset + j] == tag)
+ {
+ hb_tag_to_string (ot_languages3_multi[i].language, buf);
+ return hb_language_from_string (buf, 3);
+ }
#endif
/* Return a custom language in the form of "x-hbot-AABBCCDD".
@@ -642,6 +724,23 @@
abort();
}
}
+ for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages3_multi); i++)
+ {
+ int c = ot_languages3_multi[i].cmp (&ot_languages3_multi[i - 1]);
+ if (c > 0)
+ {
+ fprintf (stderr, "ot_languages3_multi not sorted at index %u: %08x %d %08x\n",
+ i, ot_languages3_multi[i-1].language, c, ot_languages3_multi[i].language);
+ abort();
+ }
+ }
+ for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages3_blocked); i++)
+ if (ot_languages3_blocked[i] < ot_languages3_blocked[i - 1])
+ {
+ fprintf (stderr, "ot_languages3_blocked not sorted at index %u: %08x < %08x\n",
+ i, ot_languages3_blocked[i], ot_languages3_blocked[i - 1]);
+ abort();
+ }
#endif
}
diff -Nru openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh
--- openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh 2026-04-17 19:09:35.000000000 +0000
+++ openjdk-21-21.0.12+8/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh 2026-07-13 06:55:55.000000000 +0000
@@ -40,7 +40,7 @@
struct TupleVariationHeader
{
friend struct tuple_delta_t;
- unsigned get_size (unsigned axis_count_times_2) const
+ size_t get_size (unsigned axis_count_times_2) const
{
// This function is super hot in mega-var-fonts with hundreds of masters.
unsigned ti = tupleIndex;
@@ -409,6 +409,13 @@
return;
}
+ if (!axis_limit.is_point () &&
+ !(-1.0 <= axis_limit.minimum &&
+ axis_limit.minimum <= axis_limit.middle &&
+ axis_limit.middle <= axis_limit.maximum &&
+ axis_limit.maximum <= +1.0))
+ return;
+
rebase_tent_result_t &solutions = scratch.first;
rebase_tent (*tent, axis_limit, axis_triple_distances, solutions, scratch.second);
for (unsigned i = 0; i < solutions.length; i++)
@@ -927,7 +934,7 @@
return_trace (c->check_struct (this));
}
- unsigned get_size (unsigned axis_count_times_2) const
+ size_t get_size (unsigned axis_count_times_2) const
{
unsigned total_size = min_size;
unsigned count = tupleVarCount.get_count ();
@@ -1700,6 +1707,16 @@
const hb_map_t& get_varidx_map () const
{ return varidx_map; }
+ bool add_vardata_encoding_for_testing (hb_vector_t*> &&rows,
+ unsigned num_cols)
+ {
+ encodings.push (delta_row_encoding_t (std::move (rows), num_cols));
+ return !encodings.in_error ();
+ }
+
+ bool compile_varidx_map_for_testing (const hb_hashmap_t*>& front_mapping)
+ { return compile_varidx_map (front_mapping); }
+
bool instantiate (const ItemVariationStore& varStore,
const hb_subset_plan_t *plan,
bool optimize=true,
@@ -2046,27 +2063,46 @@
{
/* full encoding_row -> new VarIdxes mapping */
hb_hashmap_t*, unsigned> back_mapping;
+ hb_vector_t