Skip to content

feat(libSceIcu): implement 458 more data-free ICU 68 exports - #14340

Open
PrivacyOnion wants to merge 4 commits into
boykopovar:mainfrom
PrivacyOnion:feat/icu-impl3
Open

PrivacyOnion wants to merge 4 commits into
boykopovar:mainfrom
PrivacyOnion:feat/icu-impl3

Conversation

@PrivacyOnion

@PrivacyOnion PrivacyOnion commented Nov 1, 2026 •

Copy link
Copy Markdown

What

Implements 458 more libSceIcu exports that need no ICU data, as reimplementations of ICU 68.2, the version of the 3.20 module (its C++ names are in icu_68). Builds on #14144 (which includes #14016); this PR adds one commit on top of it and only replaces stubs that #14016 named.

Area Exports
Service framework: ICUService, ICUServiceKey, ICUServiceFactory, SimpleFactory, LocaleKey, LocaleKeyFactory, SimpleLocaleKeyFactory, ICUNotifier, EventListener, ServiceListener, StringPair, LocaleUtility 106
UnicodeSet (construction from ranges and copies, set algebra on code points, ranges and strings, cloneAsThawed, serialization, toPattern, comparison, hashing), UnicodeSetIterator, UnicodeFilter, UnicodeFunctor, UnicodeMatcher, SymbolTable, UStringSet, ParsePosition 143
Locale (IDs, getters, keywords, copy/assignment, hashing), LocaleBuilder, LocaleBased, uloc_* ID helpers 70
ForwardCharacterIterator, CharacterIterator, UCharCharacterIterator and StringCharacterIterator objects 49
StringEnumeration, UStringEnumeration, uenum_openFromStringEnumeration 25
UVector, UStack, UVector32 constructors and destructors 29
ErrorCode, CharStringByteSink, ByteSinkUtil, ICU_Utility 28
uhash_hashUnicodeString/uhash_compareUnicodeString, utrie2_enum/utrie2_enumForLeadSurrogate, UnicodeString::toUTF8(ByteSink&) and four remaining StringPiece/CharString/MaybeStackArray members 8

Layouts follow ICU 68.2 for LP64 and are pinned with static_assert. UnicodeSet reproduces ICU's multiple inheritance from UnicodeFilter (UnicodeFunctor + UnicodeMatcher): both vtables and the _ZThn8_ thunks are in place. Classes with virtual functions get static APS5_VABI vtables and type-info objects in ICU 68.2's slot order. Object.cpp now exposes its __class_type_info, __si_class_type_info and __vmi_class_type_info tables so derived classes build their own RTTI; no _ZTV/_ZTI exports are added. The new files were written from the ICU 68.2 sources function by function, so each carries ICU's notice (© 2016 and later: Unicode, Inc. and others, http://www.unicode.org/copyright.html) followed by the copyright lines of the ICU files it follows (for example IBM's for locid.cpp and serv.cpp).

Still throwing NotImplemented_nid_no_patch and recorded in docs/dev/debt/libSceIcu.md:

  • whatever needs ICU data files: Unicode property sets (\p{…}/[:…:], applyIntPropertyValue, applyPropertyAlias, case closure), locale display names, likely subtags, resource-bundle factories and available-locale lists;
  • the host-derived initial default locale;
  • converter- and case-based UnicodeString members;
  • UnicodeSet::freeze, the span* calls, applyPattern, applyPatternIgnoreSpace, the pattern constructor and containsAll/containsNone with a string, which need BMPSet, UnicodeSetStringSpan and the RuleCharacterIterator pattern parser;
  • the trie builders, umutablecptrie_buildImmutable, the udata and format swappers, and the utext providers for UTF-8, UnicodeString, Replaceable and CharacterIterator, left for a follow-up.

The exports owned by #12320, #13578 and #14123 are left untouched.

Tested

Windows 11, MinGW GCC 13.1. No title run.

  • Repository tests. All libSceIcu suites, the 29 from feat(libSceIcu): implement 481 data-free ICU 68 exports #14144 plus the new ones, built with the library sources on the host ABI. All exit 0. Expected values come from the ICU 68.2 sources.
  • Differential tests against the real ICU 68.2. 54 harnesses run against the merged tree: the 30 from feat(libSceIcu): implement 481 data-free ICU 68 exports #14144 and 24 for this PR. The reference is the same host library as feat(libSceIcu): implement 481 data-free ICU 68 exports #14144 (ICU release-68-2 at 84e1f26ea77152936e70d53178a816dbfbf69989, all 196 common/*.cpp files plus stubdata). Each implemented export is called with the same inputs as ICU's: edge cases, fixed-seed random inputs, and random operation sequences of a few hundred calls for classes. Every return value, output buffer, UErrorCode and object field is compared. All pass except the known CharStringDiff separator case from feat(libSceIcu): implement 481 data-free ICU 68 exports #14144 (the host reference is a Windows build).
  • Layout checks. With ICU's private members exposed, they compare field offsets and virtual slots (from ICU's pointers-to-member) for UnicodeSet (primary and UnicodeMatcher vtables), UnicodeSetIterator, ParsePosition, Locale, LocaleBuilder, the service classes, the character iterators, the string enumerations, the vector objects and ErrorCode: 0 mismatches. The harnesses and their logs will be attached in a comment, as for feat(libSceIcu): implement 481 data-free ICU 68 exports #14144.
  • Guest ABI compile. Every libSceIcu source compiles to an object with the real APS5_VABI and the CI flags. The guest build and CTest are left to CI.
  • Repository checks. python3 tools/check_conventions.py --base upstream/main and python3 core/libs/tests/test_public_headers.py --audit-only pass.
  • Overlap. tools/pr_overlap.py reports no shared exports. The only shared lines are the libSceIcu CMakeLists.txt, libSceIcu.hpp include list and debt file.

Checklist

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tests run and reviewed — evidence requested

The exact head passed the no-build conventions and public-header checks, but the promised differential/layout harnesses and logs for these 458 additions are not attached; I am not approving this change yet.

What I ran

Reviewed head a922117012130a5b4e0e67dd3abfdbc2dd39a2b8 against current main at 26fa1212b82f76dd49cf12d65e445d6ff3e0844c; dependency and individual merge previews are clean. The incremental diff is one commit after #14144 at 919905beb491a418e946e79f4298cc988fb4d15b. Environment: Linux x86-64, Python 3.11.2, GCC 12.2.0 (c++). I did not build locally.

python3 tools/pr_precheck.py --repo boykopovar/AnyPS5 --pr 14340 --output-dir /tmp/anyps5-pr-precheck-14340
git diff --check 26fa1212b82f76dd49cf12d65e445d6ff3e0844c...a922117012130a5b4e0e67dd3abfdbc2dd39a2b8
python3 core/libs/tests/test_public_headers.py --audit-only
python3 tools/pr_stack_check.py 14340 --repo boykopovar/AnyPS5
gh pr checks 14340 -R boykopovar/AnyPS5

Results

Check Result
Diff whitespace Failed on one trailing-whitespace line in UnicodeSet.cpp and an extra blank line at the end of CMakeLists.txt
Conventions and PR template Passed locally
Public-header audit Passed: 394 libraries, 26,624 exports
Dependency/merge preview Clean; #14016 → #14144 → #14340
Hosted Emscripten portability Passed
Other hosted checks Windows, conventions, intake, and labels pending; Linux and specialized build jobs skipped
Unedited local check output
core/libs/prx/libSceIcu/CMakeLists.txt:873: new blank line at EOF.
core/libs/prx/libSceIcu/UnicodeSet.cpp:351: trailing whitespace.
+    
All conventions checks passed.
394 libraries, 26624 exports: unique declarations and umbrella coverage verified

Negative control

Assertion Change to code under test Result
Differential/layout assertions for the newly added exports No local build or harness run Not independently exercised; results in the PR description are author-reported

Findings

Blocking

None established from the source and no-build checks performed so far.

Non-blocking

  • Please remove the two whitespace findings so git diff --check passes.
  • The PR says the 24 new differential harnesses, layout checks, pins, and per-harness logs will be attached in a comment, as they were for #14144. I do not see that attachment on this PR yet. Because this change adds hundreds of ABI-sensitive implementations and the automatic guest build/test jobs are not running, those materials are needed to assess the reported coverage before approval.

Sources

Not verified

I did not run a guest build, CTest, the differential harnesses, or the layout harnesses. The Windows tests and guest ABI object compilation in the PR description are author-reported. No game or console behavior was tested.

To get this to a good state

Attach the new harness sources, build pins/commands, and per-harness logs; remove the whitespace findings. I will re-run the same no-build checks on the refreshed head and reassess the test evidence.

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Progress report (d1ae628 → 40f5f73)

📈 System libraries: 29.02% (+2.55%, +941 implemented, +761 declared, -1695 removed functions)

✅ 941 implemented
Library Name
libSceIcu Abstract
libSceIcu EnumSameValue
libSceIcu WrapperClose
libSceIcu WrapperCount
libSceIcu WrapperNext
libSceIcu WrapperReset
libSceIcu WrapperUNext
libSceIcu _ZN6icu_6810Appendable12appendStringEPKDsi_nid_postfix
libSceIcu _ZN6icu_6810Appendable15appendCodePointEi_nid_postfix
libSceIcu _ZN6icu_6810Appendable15getAppendBufferEiiPDsiPi_nid_postfix
libSceIcu _ZN6icu_6810Appendable21reserveAppendCapacityEi_nid_postfix
libSceIcu _ZN6icu_6810AppendableD0Ev_nid_postfix
libSceIcu _ZN6icu_6810AppendableD1Ev_nid_postfix
libSceIcu _ZN6icu_6810AppendableD2Ev_nid_postfix
libSceIcu _ZN6icu_6810CharString14appendPathPartENS_11StringPieceER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString14ensureCapacityEiiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString15getAppendBufferEiiRiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString20appendInvariantCharsEPKDsiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString20appendInvariantCharsERKNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString27ensureEndsWithFileSeparatorER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString6appendEPKciR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString6appendEcR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString8copyFromERKS0_R10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810CharString8truncateEi_nid_postfix
libSceIcu _ZN6icu_6810CharStringC1EOS0__nid_postfix
libSceIcu _ZN6icu_6810CharStringC2EOS0__nid_postfix
libSceIcu _ZN6icu_6810CharStringaSEOS0__nid_postfix
libSceIcu _ZN6icu_6810ICUService16registerInstanceEPNS_7UObjectERKNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810ICUService16registerInstanceEPNS_7UObjectERKNS_13UnicodeStringEaR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810ICUService17clearServiceCacheEv_nid_postfix
libSceIcu _ZN6icu_6810ICUService19createSimpleFactoryEPNS_7UObjectERKNS_13UnicodeStringEaR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810ICUService21reInitializeFactoriesEv_nid_postfix
libSceIcu _ZN6icu_6810ICUServiceC2ERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810ICUServiceC2Ev_nid_postfix
libSceIcu _ZN6icu_6810StringPair6createERKNS_13UnicodeStringES3_R10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810StringPairC1ERKNS_13UnicodeStringES3__nid_postfix
libSceIcu _ZN6icu_6810StringPairC2ERKNS_13UnicodeStringES3__nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie10branchNextEPKDsii_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie15findUniqueValueEPKDsaRi_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie16nextForCodePointEi_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie17firstForCodePointEi_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie19getNextBranchUCharsEPKDsiRNS_10AppendableE_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie25findUniqueValueFromBranchEPKDsiaRi_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie4nextENS_14ConstChar16PtrEi_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie4nextEi_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrie8nextImplEPKDsi_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrieD1Ev_nid_postfix
libSceIcu _ZN6icu_6810UCharsTrieD2Ev_nid_postfix
libSceIcu _ZN6icu_6810UStringSetD0Ev_nid_postfix
libSceIcu _ZN6icu_6810UStringSetD1Ev_nid_postfix
libSceIcu _ZN6icu_6810UStringSetD2Ev_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet10complementERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet10complementEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet10complementEii_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet10complementEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet10createFromERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet10setPatternEPKDsi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet10setToBogusEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet11applyFilterEPFaiPvES1_PKS0_R10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet11exclusiveOrEPKiia_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet11getSingleCPERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet11swapBuffersEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet12_appendToPatERNS_13UnicodeStringERKS1_a_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet12_appendToPatERNS_13UnicodeStringEia_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet12nextCapacityEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet13complementAllERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet13complementAllERKS0__nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet13createFromAllERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet14ensureCapacityEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet14releasePatternEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet15allocateStringsER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet16getStaticClassIDEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet16removeAllStringsEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet16resemblesPatternERKNS_13UnicodeStringEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet20ensureBufferCapacityEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet24resemblesPropertyPatternERKNS_13UnicodeStringEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet3addEPKiia_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet3addERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet3addEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet3addEii_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet3setEii_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet4_addERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet5clearEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6addAllERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6addAllERKS0__nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6removeERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6removeEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6removeEii_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6retainEPKiia_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6retainEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6retainEii_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet7compactEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet7matchesERKNS_11ReplaceableERiia_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet8copyFromERKS0_a_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet9matchRestERKNS_11ReplaceableEiiRKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet9removeAllERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet9removeAllERKS0__nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet9retainAllERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet9retainAllERKS0__nid_postfix
libSceIcu _ZN6icu_6810UnicodeSetC1EPKtiNS0_14ESerializationER10UErrorCode_nid_postfix
... 841 more
⚪ 18 behaviourally empty (constant return or throw)
Library Name
libSceIcu Abstract
libSceIcu EnumSameValue
libSceIcu _ZN6icu_6810Appendable21reserveAppendCapacityEi_nid_postfix
libSceIcu _ZN6icu_6813ICUServiceKey8fallbackEv_nid_postfix
libSceIcu _ZN6icu_688ByteSink5FlushEv_nid_postfix
libSceIcu _ZNK6icu_6810CharString13getDirSepCharEv_nid_postfix
libSceIcu _ZNK6icu_6810ICUService13handleDefaultERKNS_13ICUServiceKeyEPNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZNK6icu_6811Replaceable11hasMetaDataEv_nid_postfix
libSceIcu _ZNK6icu_6811Replaceable5cloneEv_nid_postfix
libSceIcu _ZNK6icu_6813UnicodeString11hasMetaDataEv_nid_postfix
libSceIcu _ZNK6icu_6816LocaleKeyFactory12handleCreateERKNS_6LocaleEiPKNS_10ICUServiceER10UErrorCode_nid_postfix
libSceIcu _ZNK6icu_6816LocaleKeyFactory15getSupportedIDsER10UErrorCode_nid_postfix
libSceIcu _ZNK6icu_6817StringEnumeration5cloneEv_nid_postfix
libSceIcu _ZNK6icu_687UObject17getDynamicClassIDEv_nid_postfix
libSceIcu _ZNK6icu_689ErrorCode13handleFailureEv_nid_postfix
libSceIcu uloc_getISOCountries_nid_postfix
libSceIcu uloc_getISOLanguages_nid_postfix
libSceIcu utrace_getLevel_nid_postfix
🆕 761 declared as stubs
Library Name
libSceIcu _ZN6icu_6810ICUService10unregisterEPKvR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810ICUService11clearCachesEv_nid_postfix
libSceIcu _ZN6icu_6810ICUService15registerFactoryEPNS_17ICUServiceFactoryER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810ICUService5resetEv_nid_postfix
libSceIcu _ZN6icu_6810ICUServiceD0Ev_nid_postfix
libSceIcu _ZN6icu_6810ICUServiceD1Ev_nid_postfix
libSceIcu _ZN6icu_6810ICUServiceD2Ev_nid_postfix
libSceIcu _ZN6icu_6810Normalizer10quickCheckERKNS_13UnicodeStringE18UNormalizationModeiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer11clearBufferEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer11concatenateERKNS_13UnicodeStringES3_RS1_18UNormalizationModeiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer12isNormalizedERKNS_13UnicodeStringE18UNormalizationModeiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer12setIndexOnlyEi_nid_postfix
libSceIcu _ZN6icu_6810Normalizer13nextNormalizeEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer16getStaticClassIDEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer17previousNormalizeEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer4initEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer4lastEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer4nextEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer5firstEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer5resetEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer7composeERKNS_13UnicodeStringEaiRS1_R10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer7currentEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer7getTextERNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6810Normalizer7setModeE18UNormalizationMode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer7setTextENS_14ConstChar16PtrEiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer7setTextERKNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer7setTextERKNS_17CharacterIteratorER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer8previousEv_nid_postfix
libSceIcu _ZN6icu_6810Normalizer9decomposeERKNS_13UnicodeStringEaiRS1_R10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer9normalizeERKNS_13UnicodeStringE18UNormalizationModeiRS1_R10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810Normalizer9setOptionEia_nid_postfix
libSceIcu _ZN6icu_6810NormalizerC1ENS_14ConstChar16PtrEi18UNormalizationMode_nid_postfix
libSceIcu _ZN6icu_6810NormalizerC1ERKNS_13UnicodeStringE18UNormalizationMode_nid_postfix
libSceIcu _ZN6icu_6810NormalizerC1ERKNS_17CharacterIteratorE18UNormalizationMode_nid_postfix
libSceIcu _ZN6icu_6810NormalizerC1ERKS0__nid_postfix
libSceIcu _ZN6icu_6810NormalizerC2ENS_14ConstChar16PtrEi18UNormalizationMode_nid_postfix
libSceIcu _ZN6icu_6810NormalizerC2ERKNS_13UnicodeStringE18UNormalizationMode_nid_postfix
libSceIcu _ZN6icu_6810NormalizerC2ERKNS_17CharacterIteratorE18UNormalizationMode_nid_postfix
libSceIcu _ZN6icu_6810NormalizerC2ERKS0__nid_postfix
libSceIcu _ZN6icu_6810NormalizerD0Ev_nid_postfix
libSceIcu _ZN6icu_6810NormalizerD1Ev_nid_postfix
libSceIcu _ZN6icu_6810NormalizerD2Ev_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet12applyPatternERKNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet12applyPatternERNS_21RuleCharacterIteratorEPKNS_11SymbolTableERNS_13UnicodeStringEjMS0_FRS0_iEiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet18applyPropertyAliasERKNS_13UnicodeStringES3_R10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet20applyPropertyPatternERKNS_13UnicodeStringERNS_13ParsePositionER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet20applyPropertyPatternERNS_21RuleCharacterIteratorERNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet21applyIntPropertyValueE9UPropertyiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet23applyPatternIgnoreSpaceERKNS_13UnicodeStringERNS_13ParsePositionEPKNS_11SymbolTableER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet24resemblesPropertyPatternERNS_21RuleCharacterIteratorEi_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSet6freezeEv_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSetC1ERKNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6810UnicodeSetC2ERKNS_13UnicodeStringER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6811Normalizer211getInstanceEPKcS2_19UNormalization2ModeR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6811Normalizer214getNFCInstanceER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6811Normalizer214getNFDInstanceER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6811Normalizer215getNFKCInstanceER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6811Normalizer215getNFKDInstanceER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6811Normalizer223getNFKCCasefoldInstanceER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6811Normalizer2D0Ev_nid_postfix
libSceIcu _ZN6icu_6811Normalizer2D1Ev_nid_postfix
libSceIcu _ZN6icu_6811Normalizer2D2Ev_nid_postfix
libSceIcu _ZN6icu_6812ResourceSinkD0Ev_nid_postfix
libSceIcu _ZN6icu_6812ResourceSinkD1Ev_nid_postfix
libSceIcu _ZN6icu_6812ResourceSinkD2Ev_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator10unregisterEPKvR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator12makeInstanceERKNS_6LocaleEiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator13buildInstanceERKNS_6LocaleEPKcR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator14createInstanceERKNS_6LocaleEiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator14getDisplayNameERKNS_6LocaleERNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator14getDisplayNameERKNS_6LocaleES3_RNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator16getRuleStatusVecEPiiR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator16registerInstanceEPS0_RKNS_6LocaleE18UBreakIteratorTypeR10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator18createLineInstanceERKNS_6LocaleER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator18createWordInstanceERKNS_6LocaleER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator19createTitleInstanceERKNS_6LocaleER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator19getAvailableLocalesERi_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator19getAvailableLocalesEv_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator22createSentenceInstanceERKNS_6LocaleER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIterator23createCharacterInstanceERKNS_6LocaleER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813BreakIteratorC2ERKNS_6LocaleES3__nid_postfix
libSceIcu _ZN6icu_6813BreakIteratorC2ERKS0__nid_postfix
libSceIcu _ZN6icu_6813BreakIteratorC2Ev_nid_postfix
libSceIcu _ZN6icu_6813BreakIteratorD0Ev_nid_postfix
libSceIcu _ZN6icu_6813BreakIteratorD1Ev_nid_postfix
libSceIcu _ZN6icu_6813BreakIteratorD2Ev_nid_postfix
libSceIcu _ZN6icu_6813BreakIteratoraSERKS0__nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder12setExtensionEcNS_11StringPieceE_nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder14setLanguageTagENS_11StringPieceE_nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder18copyExtensionsFromERKNS_6LocaleER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder23setUnicodeLocaleKeywordENS_11StringPieceES1__nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder25addUnicodeLocaleAttributeENS_11StringPieceE_nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder28removeUnicodeLocaleAttributeENS_11StringPieceE_nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder5buildER10UErrorCode_nid_postfix
libSceIcu _ZN6icu_6813LocaleBuilder9setLocaleERKNS_6LocaleE_nid_postfix
libSceIcu _ZN6icu_6813LocaleUtility18initLocaleFromNameERKNS_13UnicodeStringERNS_6LocaleE_nid_postfix
libSceIcu _ZN6icu_6813LocaleUtility18initNameFromLocaleERKNS_6LocaleERNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6813LocaleUtility23getAvailableLocaleNamesERKNS_13UnicodeStringE_nid_postfix
libSceIcu _ZN6icu_6813ResourceValueD0Ev_nid_postfix
libSceIcu _ZN6icu_6813ResourceValueD1Ev_nid_postfix
... 661 more
🗑️ 1695 removed
Library Name
libSceIcu sceIcuDispatchUnknown_BufsAiaX0_plus_s_nid_no_patch
libSceIcu sceIcuDispatchUnknown_Con4H1SB3nw_nid_no_patch
libSceIcu sceIcuDispatchUnknown_lME28PLmu54_nid_no_patch
libSceIcu sceIcuDispatchUnknown_xdF5zg0V5Oc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_00yrdeXel_minus_k_nid_no_patch
libSceIcu sceIcuLegacyUnknown_02yqiMxbKKU_nid_no_patch
libSceIcu sceIcuLegacyUnknown_03N9BE6uvpo_nid_no_patch
libSceIcu sceIcuLegacyUnknown_03uaawLzEo4_nid_no_patch
libSceIcu sceIcuLegacyUnknown_06lFuBZgFg8_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0DGoeEvu4Tc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0JIoY7BEjms_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0OVoam5Maq8_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0TnwC0nPUXk_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0Tudp8NZ3jg_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0UQu9LKbOrc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0UgJRpFQKco_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0WSM7vJVmYE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0YWzn0WKU44_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0_minus_olJNtiaeQ_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0c6b_plus_XCqt9o_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0e6vZxUFLvE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0jN58mezFe0_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0nrht0BgxEQ_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0pw_plus_YWeLlIM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0qlsx0u0PMM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0rZSXuHb14g_nid_no_patch
libSceIcu sceIcuLegacyUnknown_0scP_plus_RiZ1vc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_14a9pKEYd7c_nid_no_patch
libSceIcu sceIcuLegacyUnknown_17AU4VHNGec_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1AzLgo3rATM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1B8JLGu62mE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1DFhG_plus_P0EYM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1Eovd96K_minus_Eo_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1G1zdxo5KCk_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1JevuWL_minus_iMg_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1PD0nXtIXJ4_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1QeMhl0kTkU_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1QqT4Qbl38g_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1WYMrva0udA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1ZsyvW153aY_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1bRdTDPYlLA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1bjQ9GJVkDM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1fdgrQASVRg_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1g8eVPDkqCM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1gbTKeDPab8_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1k6Jl84oTeI_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1kBbJxcDbCg_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1p0FEYfvSns_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1pauWHrK69Y_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1q0LOIFUgeI_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1sUkZWnzYJA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1tote7KnZZ8_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1uiDWP8AjtA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_1vHTKNSml4c_nid_no_patch
libSceIcu sceIcuLegacyUnknown_29ENWa_plus_HYpo_nid_no_patch
libSceIcu sceIcuLegacyUnknown_29UZt_plus_Zh554_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2J8BwvsmnNA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2LBrwaWFRsA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2LG5XuHjr60_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2MQdIASFIDg_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2OEoHDMD_minus_7k_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2PSYQXpfB64_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2P_minus_2TAuqsTw_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2QSKf7JvliA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2V6fVvK7DzM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2YRqfNusLmQ_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2Z_minus__plus_jlza4P0_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2ga4PiukfYc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2lAenv_minus_SkNA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2t3H7LAAANU_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2t7JjJuVD2g_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2v2_plus_PgpIdLc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_2wwoqH2KOxE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_31pIPUL8Ksg_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3FHpsgySlUE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3FXgs3h_plus_iug_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3J2cJnDt4IY_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3JwpiS_plus_eIQM_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3KafdPaGfGs_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3MRfGDojJF4_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3Mv4rhuibnc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3PrhSO6dCns_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3Ps_plus_hlmBTMs_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3SD7R26xqXE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3T3S5CJpecI_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3WfSV0_plus_G32g_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3_minus_kL54G6PQE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3_plus__minus_eXC_minus_sHJE_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3liORHk2E34_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3ng2Nc7ipgo_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3okGL4Cutpk_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3pliHFvh22Y_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3tJ8UEosCLc_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3tfuPx_minus_8qL0_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3xGrCs6nGKA_nid_no_patch
libSceIcu sceIcuLegacyUnknown_3yXJHxARCvQ_nid_no_patch
libSceIcu sceIcuLegacyUnknown_400ZbLVPq7k_nid_no_patch
libSceIcu sceIcuLegacyUnknown_41Ny9FV0dHg_nid_no_patch
libSceIcu sceIcuLegacyUnknown_45M3NG6fOK0_nid_no_patch
libSceIcu sceIcuLegacyUnknown_46pVr5Vsm18_nid_no_patch
... 1595 more

Changed libraries (implemented exports)

Library Before After Change
libSceIcu 61/2647 (2.30%) 1002/2654 (37.75%) +35.45%

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@PrivacyOnion Five points from the incremental change over #14144:

  1. LocaleObject.cpp:93-118 initializes shared locale objects behind the plain CacheInitialized boolean. The exported cache/getter calls at lines 283-311 have no synchronization. ICU 68.2 locid.cpp:2213-2217 uses umtx_initOnce here. Please publish the cache through a thread-safe once mechanism and add concurrent first-use coverage.
  2. The six new service tests (Service, ServiceFactory, ServiceKey, ServiceLocale, ServiceNotifier, ServiceStringPair) contain 36 standard assert checks. The normal GNU Release build defines NDEBUG, and neither the target setup nor add_test_executable keeps these checks enabled. Please use always-on checks and show that a deliberately wrong expected result fails in the Release configuration.
  3. Please attach the promised new differential/layout harness sources, pinned build commands and per-harness logs. The PR description includes UnicodeSet::freeze, spans and pattern parsing among implemented behavior, but the corresponding exports (applyPattern, applyPatternIgnoreSpace, the UnicodeSet(const UnicodeString&, UErrorCode&) constructor, freeze, the span calls) still call NotImplemented_nid_no_patch in LegacyExports.cpp and the debt correctly lists them as unsupported. Please make the description reflect the submitted subset; this is not a request to implement those remaining calls.
  4. For the files ported from ICU sources, please retain the original copyright blocks as well as the Unicode notice. For example, the pinned locid.cpp and serv.cpp also carry IBM copyright blocks, which are absent from the corresponding new source headers.
  5. The ICUService debt entry says "ICUService synchronization uses a host mutex rather than ICU's UMutex", but Service.cpp takes no lock: the only mutex is NotifyLock in ServiceNotifier.cpp, and the paths ICU locks (getKey with a result, registerFactory, unregister, reset) are still stubs here. Could you move that sentence to the ICUNotifier entry, or say the locked paths are not implemented yet?

git diff --check also reports trailing whitespace in UnicodeSet.cpp:351 and an extra blank line at CMakeLists.txt:873.

@PrivacyOnion

Copy link
Copy Markdown
Author

Updated in f6303c9.

@oneandonlydean

  1. Locale cache. EnsureLocaleCache now publishes the shared locales through std::call_once (the equivalent of umtx_initOnce in locid.cpp), so getLocaleCache, getLocale and the static getters are safe on concurrent first use. tests/LocaleObject.cpp now starts with 16 threads that race on the first getUS(), check en/US/en_US and the cache entries, and check that they all get the same object. It runs before anything else in the test touches the cache.
  2. Release-safe checks. The 36 assert calls in the six service tests are now an always-on Check that calls std::abort(). Built with -O2 -DNDEBUG, ServiceKey passes (TEST EXIT CODE: 0), and a copy whose expected descriptor is changed from pre/abc to pre/abX aborts (TEST EXIT CODE: 3). No other new test uses assert.
  3. Description. The UnicodeSet row now lists only what is submitted. freeze, the span* calls, applyPattern, applyPatternIgnoreSpace, the pattern constructor and containsAll/containsNone with a string are listed with the remaining stubs, as the debt already says. The harnesses follow in the next comment.
  4. Copyright blocks. Each new source and header now keeps, after the Unicode notice, the copyright lines of the ICU 68.2 files it follows. For example, LocaleObject.cpp has IBM's 2004-2014 (locbased.cpp) and 1997-2016 (locid.cpp) lines, and the service files have those of serv.cpp, servlk.cpp, servlkf.cpp, servslkf.cpp, servnotf.cpp and locutil.cpp. 43 files are affected; ByteSinkUtil follows bytesinkutil.cpp, which has no copyright line beyond the Unicode notice.
  5. ICUService debt entry. The mutex sentence is gone. The entry now says that the paths ICU runs under the service lock (getKey with a result, registerFactory, unregister, reset) are not implemented and throw. The host mutex is only described in the ICUNotifier entry, where it is used.

@MarcZX10 @oneandonlydean The trailing whitespace in UnicodeSet.cpp and the extra blank line at the end of CMakeLists.txt are removed; git diff --check 919905b f6303c9 is clean. Conventions and the public-header audit pass, every libSceIcu source compiles to an object with the real APS5_VABI, and the changed suites pass.

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 10963 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10964 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10965 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10966 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10967 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11088 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11115 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11118 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11122 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11132 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11136 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 12320 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 12738 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 13128 core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 13274 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 13578 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 14050 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
docs/dev/debt/libSceIcu.md
PR 14123 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 14212 docs/dev/debt/libSceIcu.md
PR 14285 core/libs/prx/libSceIcu/CMakeLists.txt

@PrivacyOnion

Copy link
Copy Markdown
Author

Harnesses, run script, pins and per-harness logs for f6303c9 (the 30 from #14144 plus 24 for this PR, all run against the merged tree): https://gist.github.com/PrivacyOnion/fd4bdd72c96d48e0b127722842ac656c (README.md lists the ICU commit, the build commands and the expected CharStringDiff separator mismatch).

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-checked — new head, no blocking findings

The author asked for a re-review at f6303c9c46; the whitespace and harness requests from the earlier review are addressed, and the open points are an ICU licence/notice question for the maintainers and the dependency on #14144.

What I ran

Reviewed head f6303c9c4669d5a2fa8efea8dc291ce76acf788c. Incremental diff base 919905beb491a418e946e79f4298cc988fb4d15b (the #14144 head that this PR stacks on). PR base e6f57307fa7f47165d7fc1bee945abdb2f6816e7, used for the licence-precedent count. Environment: Linux x86-64, Python 3.11.2. No build, no compile, no CTest run on this machine.

python3 tools/pr_precheck.py --repo boykopovar/AnyPS5 --pr 14340 --output-dir /tmp/anyps5-pr-precheck-14340-f6303c9
git diff --check 919905beb491a418e946e79f4298cc988fb4d15b f6303c9c4669d5a2fa8efea8dc291ce76acf788c
python3 tools/pr_abi_audit.py --repo /marc/AnyPS5 --base 919905beb491a418e946e79f4298cc988fb4d15b --head f6303c9c4669d5a2fa8efea8dc291ce76acf788c --json
python3 tools/pr_test_quality.py --root <git archive of core/libs/prx/libSceIcu and core/libs/tests at f6303c9> --json <the 24 test files added in f6303c9>
git grep -l 'unicode.org/copyright' e6f57307fa7f47165d7fc1bee945abdb2f6816e7 -- core
git grep -l 'unicode.org/copyright' f6303c9c4669d5a2fa8efea8dc291ce76acf788c -- core
git grep -l -i 'permission is hereby granted' f6303c9c4669d5a2fa8efea8dc291ce76acf788c -- .

The precheck's ABI and test-quality helpers were missing from the isolated head tree, so I ran tools/pr_abi_audit.py and tools/pr_test_quality.py by hand from /marc/AnyPS5/tools against the exact head.

Results

Check Result
Diff whitespace, 919905b..f6303c9 and e6f5730..f6303c9 (precheck) Passed. The trailing-whitespace and end-of-file findings from the earlier head no longer appear.
Conventions and PR template (precheck) Passed
Live dependency and mergeability (precheck pr_stack_check.py) Passed; see Findings on #14144 and #14123
Hosted windows job (run 41298866382, job 124827010833) Passed. The job merges the PR into main before it builds, so this covers that merge result, not the bare head. The log has the CTest summary 100% tests passed, 0 tests failed out of 2631 (log line 15642), including guest_icu_service_key ... Passed.
Hosted library-portability, conventions, labels, report, eligibility Passed. linux, relinker, relinker-asan, register-context and write-watch were skipped.
Test registration Passed by manual check. All 53 files under core/libs/prx/libSceIcu/tests/ are referenced by name in CMakeLists.txt. The precheck's helper reported 24 possible-unregistered-cpp-test findings; they come from the helper not resolving ${CMAKE_CURRENT_SOURCE_DIR}/tests/, so they are false positives.
Incremental ABI audit (manual) passed_with_warnings: 1906 symbols, 13 lexical public-declaration-not-found entries and no export-removed entries for this commit. I traced one entry, Notify, which is a callback in tests/ServiceNotifier.cpp; I did not trace the other twelve.
Test-file assert scan No assert( in the 24 new test files.
Licence precedent unicode.org/copyright header: 0 files at base e6f5730, 124 files at head. Permission-notice text: 0 matches in the head tree.

Points raised in oneandonlydean's 10:26 comment, checked in source at this head:

Point Check at f6303c9
1. Shared locale cache LocaleObject.cpp declares std::once_flag CacheOnce; and publishes the cache inside std::call_once (lines 97 to 100).
2. Release-safe checks tests/ServiceKey.cpp uses a Check() that calls std::abort(), and no assert( remains in the 24 new test files. I read only ServiceKey.cpp in full.
4. Copyright blocks LocaleObject.cpp keeps IBM's lines after the Unicode notice; 46 libSceIcu files contain IBM copyright text. I did not check every file.
5. ICUService debt entry docs/dev/debt/libSceIcu.md: the ICUService entry no longer names a host mutex; the host mutex is described only under ICUNotifier.

Author-supplied evidence, not rerun here: the differential and layout harnesses are in a gist (55 files, README pins ICU release-68-2 at 84e1f26). 53 of its 54 logs record DIFF EXIT CODE: 0. The exception is CharStringDiff (exit 1), which the author attributes to the Windows reference build using \ as the separator, where the PS5 build uses /.

Findings

Blocking

None established from the source, the hosted results and the author's evidence.

Non-blocking

  1. ICU notice and licence treatment (maintainer decision). The new files reproduce ICU's header and the copyright lines of the ICU files they follow, which the PR body describes as ports written "from the ICU 68.2 sources function by function". ICU's licence at the pinned commit says the copyright and permission notice must "appear with all copies of the Data Files or Software, or ... appear in associated Documentation" (icu4c/LICENSE). The head tree does not contain the permission-notice text, and the new headers link to the Unicode terms instead. Whether the notice text must be carried, and how ports should be attributed, is for the maintainers to decide. I am not giving a legal opinion, and I am not requesting changes on this point.
  2. Checklist item. The PR body ticks "New third-party code is a submodule built from source". CONTRIBUTING.md line 17 says third-party code is added as a submodule under 3rdparty/, and this PR adds no submodule. Either the rule does not cover hand ports, or it needs a maintainer decision. The checkbox should match whichever it is.
  3. Where the differential evidence lives. The harnesses are in a gist, not in the repository. Their HostAbi.hpp defines APS5_VABI as empty and they were built with MinGW on Windows, so they test the host ABI, not the console's. The repository-side evidence is the hosted Windows CTest run above. If the maintainers want the differential evidence to be reproducible, it needs a stable location, either in the repository or linked from the debt file.
  4. Dependency. The PR stacks on #14144 (head 919905beb4, open, mergeable UNKNOWN). The PR body says it lands after #14123 (open, mergeable). No change is requested now. Re-check after #14144 merges or when the head changes.

Sources

Not verified

  • No build, no CTest, no harness rerun on this machine. The gist logs, the ICU 68.2 comparisons and the author's ServiceKey negative control (Check aborts with exit code 3 when the expected descriptor is changed to pre/abX, under -O2 -DNDEBUG) are author-reported.
  • The Linux guest build and CTest were skipped by hosted CI for this PR, and no console or PS5 behavior was tested.
  • The full-PR ABI audit against e6f57307 also lists 1695 removed legacy exports. They come from the renames in c516806, which belong to #14016 and #14144; I did not re-verify their NID equality here.
  • The 13 incremental lexical findings were not traced one by one beyond Notify.
  • The public-header audit was not rerun at f6303c9.
  • Point 3 from oneandonlydean's comment (the description matching the submitted subset) was checked only against the PR text and the debt file, not export by export.

To get this to a good state

  • Maintainers: decide points 1 and 2. If the notice text must be carried, the author adds it in the place the maintainers choose and updates the checklist line to match.
  • No code change is requested at this head. Re-check after #14144 merges or on any new head.

@PrivacyOnion

Copy link
Copy Markdown
Author

@MarcZX10 thanks for the re-check. On the two maintainer points: the checklist line now says that no submodule is added, and that the ICU-derived files are rewrites carrying ICU's notice plus the original copyright lines. If the maintainers want the full ICU permission text, or a pointer from the debt file to the harness gist, I'll add it wherever they prefer. I will rebase this PR once #14144 (and #14123 before it) land.

@THEMANnt THEMANnt left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed f6303c9c4669d5a2fa8efea8dc291ce76acf788c, focusing on its increment over #14144. No actionable issue found in the reviewed implementation paths.

Windows/MSYS2 GCC 16.2 Release: built the shared library and passed all 57 supplied ICU suites in an isolated DLL-linked harness. Independent seeded checks pass 5,000 UnicodeString mutation/copy-on-write rounds, 10,000 integer-vector rounds and 10,000 UnicodeSet range add/remove/complement rounds against simple reference models. Hosted Windows reports 2,631/2,631 selected tests passing. Whitespace and conventions pass.

Local support substitutes minimal libc functions. This is not exhaustive differential validation of all 458 exports, allocation failures or console behavior. Depends on #14144 and its merge ordering; maintainer integration/notice decisions remain with the maintainers.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
PrivacyOnion added 3 commits November 2, 2026 17:47
1691 legacy and 4 dispatch placeholders are renamed to the ICU 68.2
symbol whose NID hash equals the 3.20 NID, so they export the same NIDs
through _nid_postfix names instead of explicit APS5_EXPORT entries. The
dispatch NIDs are the BreakIterator::create*Instance factories. All
stubs still throw through NotImplemented_nid_no_patch.
Hash tables, lists, string enumerations, tracing, platform helpers,
cleanup, termination helpers, code point tries, UTrie2, UText core,
UnicodeString, CharString, StringPiece, Appendable, ByteSink,
MaybeStackArray, PatternProps, ICU_Utility, UVector, UVector32,
UStack, Edits, BytesTrie, UCharsTrie and character iterators follow
ICU 68.2 with the console's LP64 layouts and guest virtual tables.
Exports that need ICU data, converters or memory released through
uprv_free keep throwing NotImplemented_nid_no_patch.
The ICU service framework, UnicodeSet with its iterator, filter and
pattern parser, Locale, LocaleBuilder and the uloc ID helpers, and the
remaining character iterators, string enumerations, vector objects,
ErrorCode, ByteSink utilities and UTrie2 enumeration follow ICU 68.2
with the console's LP64 layouts and guest virtual tables. Object.cpp
exposes its type-info tables so derived classes build their own RTTI.
Exports that need ICU data, converters or case tables keep throwing
NotImplemented_nid_no_patch.
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
@oneandonlydean oneandonlydean self-assigned this Nov 5, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 5, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build docs needs rebase Conflicts with main, rebase needed prx

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants