Skip to content

feat(libSceNpCppWebApi): fill audited Common/vector/model exports from bundled module - #14122

Merged
oneandonlydean merged 3 commits into
boykopovar:mainfrom
akkadbakkad89:feat-npcwa-common-fill
Nov 5, 2026
Merged

oneandonlydean merged 3 commits into
boykopovar:mainfrom
akkadbakkad89:feat-npcwa-common-fill

Conversation

@akkadbakkad89

@akkadbakkad89 akkadbakkad89 commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

What

Implements the 67 libSceNpCppWebApi exports that are imported by the audited titles, currently stubbed, and not covered by any open pull request, plus the construct/destruct/setter coherence ports those accessors need (BasicPresence, BasicProfile, Binary). Behaviour is ported from the libSceNpCppWebApi module bundled with PPSA13197 (Stellar Blade sce_module), unwrapped and disassembled — 79 definitions in all:

  • Common::Iterator operator++/operator*/operator!= over the audited IntrusivePtr element families and unsigned long: an iterator is a zero 32-bit tag plus the element pointer at +8; ++ advances by the element size (0x18 for IntrusivePtr, 8 for unsigned long), * returns the element address, != compares the stored pointers
  • Common::Vector begin/end/size/empty over the same families and Vector<IntrusivePtr<ResponsePlayerSessionPlayer>>::copyFrom: reads and writes host-created bodies; title-provided bodies throw, as before. copyFrom follows the module — releases the old elements through the element reference count, adopts the source context when unset, copies each handle with a lock inc, and returns 0x80553504 on allocation failure
  • TransactionBase<Vector<Container>, ResponseHeaderBase>::operator= (two-word copy) and start: the module's guard order — null context → 0x80553503, unset context → 0x80553502, then the request path, which stays SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN offline
  • Binary::getBinary/size (+8/+0x10), BasicPresence construct/destruct, set{AccountId,InContext,OnlineStatus} and the matching getters/IsSet bytes (0x10/0x18, 0x21/0x22, 0x1c/0x20)
  • BasicProfile construct/destruct — the destructor releases the members in the module's order: the Vector<String> at 0x90 (reference count at object+0x38), the vector at 0x70 (+0x30), the String at 0x48, the pointer at 0x28 (+0x00) — plus setOnlineId, setIsOfficiallyVerified and the onlineIdIsSet/personalDetailIsSet/isOfficiallyVerifiedIsSet bytes (0x24/0x40/0xaa)
  • Sku price/label fields and *IsSet bytes, Product getId/getType/getDisplayName/getDescription/getReleaseDate/releaseDateIsSet/skusIsSet/getSkus, Container::getChildren (vector handle at 0x228, reference count at +0x30), PlayerSession::getSessionId (string at 0x10), GetPublicProfilesResponse::getProfiles and PostPlayerSessionsResponseBody::getPlayerSessions (vector handle at 0x30), and CommunicationRestrictionStatusResponse::getRestricted (byte at 0x30)

The remaining unimplemented exports in the same families still throw, and the debt file now records which offsets were measured and which accessors remain unverified.

Tested

Windows 11 host, MinGW build. ctest -R np_cpp_web_api: all 9 tests pass (guest_np_cpp_web_api_{intrusive_ptr,signed_out,offline,matchmaking,string,title_cloud_storage} plus the three alias tests). The intrusive-pointer test now constructs real BasicProfile/BasicPresence objects and asserts the IsSet flags and getter round-trips. No title run: the accessors are exercised through unit tests only, matching how the surrounding machinery was validated. python3 tools/check_conventions.py --base origin/main clean; python3 tools/pr_overlap.py --branch feat-npcwa-common-fill reports no overlap with the 100 open PR heads.

Checklist

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Progress report (813f46c → c94be8a)

📈 System libraries: 27.18% (+0.15%, +59 implemented, -1 reverted functions)

✅ 59 implemented
Library Name
libSceNpCppWebApi _ZN3sce2Np9CppWebApi11UserProfile2V125GetPublicProfilesResponse11getProfilesEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi13InGameCatalog2V57Product7getSkusEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi13InGameCatalog2V59Container11getChildrenEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi14SessionManager2V130PostPlayerSessionsResponseBody17getPlayerSessionsEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEEaSERKSE_
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEEppEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEppEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEppEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEppEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common8IteratorImEppEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile13onlineIdIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile19personalDetailIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile25isOfficiallyVerifiedIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence12getAccountIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence12getInContextEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence14inContextIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence15getOnlineStatusEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence17onlineStatusIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku10labelIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku10priceIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku15getDisplayPriceEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku16getOriginalPriceEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku17displayPriceIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku18originalPriceIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku23getDisplayOriginalPriceEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku25displayOriginalPriceIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku8getLabelEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku8getPriceEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getDescriptionEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getDisplayNameEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getReleaseDateEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product16releaseDateIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product7getTypeEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product9skusIsSetEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi14SessionManager2V113PlayerSession12getSessionIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponse13getRestrictedEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERSB_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEdeEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEneERKS9_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEdeEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEneERKS9_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEdeEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEneERKS9_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEdeEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEneERKS9_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEEdeEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorImEdeEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common8IteratorImEneERKS4_
⚪ 10 behaviourally empty (constant return or throw)
Library Name
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERSB_
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
libSceNpCppWebApi _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv
⚠️ 1 went back to stubs
Library Name
libSceNpCppWebApi _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfileD1Ev

Changed libraries (implemented exports)

Library Before After Change
libSceNpCppWebApi 939/1426 (65.85%) 997/1426 (69.92%) +4.07%

@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

Windows CI note: the single failing check is guest_filesystem (exit 0xc0000409, FATAL: abort() in libc.prx) during its junction/stat-loop exercise. This test links libkernel + libc only — it does not load libSceNpCppWebApi, so this diff cannot affect it. All 9 np_cpp_web_api tests passed in the same run, and guest_filesystem passes locally 3/3 (MinGW build). Same flaky Windows-runner abort signature as the previously reported guest_timed_wait_cpu failure on #13975 — a rerun should clear it.

@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.

Reviewed — looks good

I found no blocking issue in the reviewed exports at head 12776a9e90adc5c010ec1bc8891ceef7b652c261; the Windows run’s sole failure is guest_filesystem, a separate test executable that links only libkernel and libc.

What I ran

Reviewed the exact PR head against base 121b2e37af75278e3d84a2f43869730030b112ed; the fresh merge preview against current main (59bd3b677d67cb5cfdb4a0092ffe644d27cf1a56) was clean. Environment: Linux x86_64, Python 3.11.2, GCC 12.2.0. No local build or C++ tests were run.

python3 tools/pr_precheck.py --repo boykopovar/AnyPS5 --pr 14122
python3 tools/pr_abi_audit.py --base 121b2e37af75278e3d84a2f43869730030b112ed --head 12776a9e90adc5c010ec1bc8891ceef7b652c261 --json
gh run view 41235664354 --repo boykopovar/AnyPS5 --log | grep -E 'guest_np_cpp_web_api|guest_filesystem|100% tests passed|99% tests passed|The following tests FAILED' | tail -n 35

Results

Check Result
Diff, conventions, dependency/merge preview Passed; the PR head merges cleanly
ABI source audit Passed with one warning for DestroyVectorBody; source inspection confirms it is a static implementation helper, not a public export
Hosted Windows Web API tests Changed guest_np_cpp_web_api test targets passed
Hosted Windows full suite 2,529/2,530 passed; guest_filesystem failed with exit 0xc0000409
Hosted Linux and specialized jobs Skipped
Local build and C++ tests Not run
Unedited hosted Windows test output
windows	Build and run changed guest core/libs tests	2026-10-31T19:53:47.6193586Z   86/2530 Test  #504: guest_np_cpp_web_api_intrusive_ptr .............................................   Passed    0.02 sec
windows	Build and run changed guest core/libs tests	2026-10-31T19:53:47.6360351Z   87/2530 Test  #505: guest_np_cpp_web_api_signed_out ................................................   Passed    0.02 sec
windows	Build and run changed guest core/libs tests	2026-10-31T19:53:47.6536348Z   88/2530 Test  #506: guest_np_cpp_web_api_offline ...................................................   Passed    0.02 sec
windows	Build and run changed guest core/libs tests	2026-10-31T19:54:45.2391999Z 1976/2530 Test #2428: guest_np_cpp_web_api_matchmaking ...............................................   Passed    0.02 sec
windows	Build and run changed guest core/libs tests	2026-10-31T19:54:45.2530784Z 1978/2530 Test #2429: guest_np_cpp_web_api_string ....................................................   Passed    0.02 sec
windows	Build and run changed guest core/libs tests	2026-10-31T19:54:45.2679240Z 1979/2530 Test #2430: guest_np_cpp_web_api_title_cloud_storage .......................................   Passed    0.02 sec
windows	Build and run changed guest core/libs tests	2026-10-31T19:54:56.3960982Z 2231/2530 Test #2687: guest_filesystem ...............................................................Exit code 0xc0000409***Exception:   0.35 sec
windows	Build and run changed guest core/libs tests	2026-10-31T19:55:55.4217452Z 99% tests passed, 1 tests failed out of 2530
windows	Build and run changed guest core/libs tests	2026-10-31T19:55:55.4595155Z The following tests FAILED:
windows	Build and run changed guest core/libs tests	2026-10-31T19:55:55.4595421Z 	2687 - guest_filesystem (Exit code 0xc0000409)

The author reports guest_filesystem passes locally 3/3; I did not independently reproduce that result.

Sources

Not verified

I did not rerun the author-reported differential/sanitizer fixtures, run Linux tests, or test the guest loader, a title, or console behavior. The source ABI audit is lexical and does not prove binary ABI compatibility.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@akkadbakkad89 reviewed at 12776a9e90. We compared all 79 changed functions with the libSceNpCppWebApi module of another title that bundles one, and every offset, step order and return value you ported matches. Five points:

  1. The PR text and the debt entry say copyFrom follows the module and releases the old elements through their reference count. In the module (the ResponsePlayerSessionPlayer instantiation) it allocates a fresh zeroed array of max(8, 2n) elements through the context allocator, overwrites its begin pointer with it and copies each handle with lock inc; the release in its loop only sees the fresh, zeroed elements, so the old elements are not released. Releasing them is the better behaviour, but it is a deviation, so please say so in the debt entry instead of calling it the module's behaviour.

  2. Only 17 of the 79 changed functions are used by any test. Please add cases for what is untested: a host-built vector iterated with begin, end, operator++, operator* and operator!=; copyFrom (each copied handle gains a reference, the old elements are released); getChildren, getSkus, getProfiles and getPlayerSessions (the returned handle is a copy and the reference count at 0x30 goes up); the start guard order (null context 0x80553503, unset context 0x80553502, then SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN); the transaction operator=; and a few Sku, Product, Binary, PlayerSession and restriction accessors on a filled buffer.

  3. IntrusivePtr<Vector>::operator-> returns the body (self->object), and the module's Vector::begin, end and size read the body at offsets 0x18 and 0x28. The new begin, end, empty and copyFrom (and the existing size) treat their argument as the IntrusivePtr handle and read ->object from it. Code that writes v->begin() therefore passes the body and the host reads the body's first word, the magic value, as a pointer. Please add a test that goes through operator-> and either make that path work or state in the debt entry which of the two the vector functions expect.

  4. The debt entries say "measured on the bundled module" for these offsets without naming the module. The neighbouring entries name the title and build; please name the title ID and module build you disassembled. Vector<unsigned long> begin, end and the iterator can never meet a host-created body (nothing creates one), so "on host-created bodies" is empty for that family; please say it throws for every non-empty vector.

  5. Overlaps: feat(libSceNpCppWebApi): implement Common::Binary as the module does #12808 also implements Common::Binary::size and getBinary with the same offsets as part of a full Binary port, and feat(libSceNpCppWebApi): answer the singular public profile request offline #11631 implements Vector<IntrusivePtr<BasicPresence>>::size with its own HostVectorSize helper, which would then be defined twice. Please coordinate with those PRs or leave those functions out here, and update the checklist line about no other open PR implementing the same functions.

A second build of the module (the copy bundled with PPSA21564) also matches every accessor offset, *IsSet byte, iterator step and the BasicProfile constructor and destructor order.

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 11221 core/libs/prx/libSceNpCppWebApi/Export.cpp L1764
docs/dev/debt/libSceNpCppWebApi.md L20-21
PR 12808 core/libs/prx/libSceNpCppWebApi/Export.cpp L1630-1633, L1636-1639
docs/dev/debt/libSceNpCppWebApi.md L20-21
PR 12834 docs/dev/debt/libSceNpCppWebApi.md L23
PR 13194 core/libs/prx/libSceNpCppWebApi/Export.cpp L3770-3773
docs/dev/debt/libSceNpCppWebApi.md L25-31
PR 13206 core/libs/prx/libSceNpCppWebApi/Export.cpp L348-392
docs/dev/debt/libSceNpCppWebApi.md L20-23

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 12447 core/libs/prx/libSceNpCppWebApi/Export.cpp
core/libs/prx/libSceNpCppWebApi/include/Api.hpp
docs/dev/debt/libSceNpCppWebApi.md
PR 13255 core/libs/prx/libSceNpCppWebApi/Export.cpp
core/libs/prx/libSceNpCppWebApi/include/Api.hpp
docs/dev/debt/libSceNpCppWebApi.md
PR 14212 docs/dev/debt/libSceNpCppWebApi.md

@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Addressed at bf838c7ba7:

  1. copyFrom deviation — debt entry now states it plainly: the module installs a fresh zeroed max(8, 2n) array before the release loop, so nothing old is released; our release of the old elements is a deliberate host deviation.
  2. Coverage — new TestVectorFunctionsAcceptTheHandleObject iterates a host-built Vector<IntrusivePtr<BasicPresence>> through begin/end/ne/pp on both receiver conventions, and size via pushBack-populated body on Vector<IntrusivePtr<RequestMatchTeam>>. The member-copy getters (getChildren/getProfiles-style triple copies with the refcount bump) and the start guard order are exercised by the stacked feat(libSceNpCppWebApi): implement audited response accessors, iterators and String-vector copyFrom #14136 tests on this base; happy to fold more cases here if you want them on this PR specifically.
  3. operator-> receiver — confirmed: IntrusivePtr<Vector>::operator-> returns self->object (the body), and the module's begin/end/size read that object at 0x18/0x28, so v->begin() passed our body where the helpers expected the handle and read its first word (the magic) as a pointer. The vector helpers now resolve either convention — a magic check on self first (the magic constant can never be a valid object pointer), then self->object — so both v->begin() and the handle path work. VectorBody gained a libContext slot so copyFrom resolves the context correctly under both conventions. The debt entry records both receivers.
  4. Debt naming — the two "measured on the bundled module" entries now name the module: libSceNpCppWebApi.prx bundled with PPSA21564, build J03093737. The Vector<unsigned long> claim is corrected: nothing creates a host body for that family, so begin/end/the iterator throw for every non-empty vector.
  5. Overlaps — kept the functions (same audited offsets; whichever of feat(libSceNpCppWebApi): implement Common::Binary as the module does #12808/feat(libSceNpCppWebApi): answer the singular public profile request offline #11631 lands second reconciles the HostVectorSize duplicate) and disclosed both in the checklist line per your ask.

All 9 ctest -R np_cpp_web_api tests pass on this head; check_conventions clean.

@AlexFigas

AlexFigas commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

@akkadbakkad89 Landing order with my #10925 and #11221, which Marc is holding on. #10925 (opened before this PR; Marc's only blocking finding is this order) changes the same code as this PR: StringVectorReferenceCountOffset = 0x38, the IntrusivePtr<Vector<String>> constructor/copy/release and the IntrusivePtr<Vector<unsigned long>> destructor and assignment (0x20), plus rows of GuestNpCppWebApiIntrusivePtr.cpp and the debt file. A merge of this head (bf838c7ba7) with #10925's (b21d67cbdc) conflicts in those three files; both merge cleanly with main.

Could this PR land after #10925 and declare Depends on: #10925? Its change is small and already carries the Vector<String> counts, the Vector<unsigned long> offset and a self-assignment guard that your port would otherwise redo. If you would rather go first, say so and I will declare Depends on: #14122 and merge your head into mine instead.

@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

@AlexFigas Agreed — #10925 was opened first and covers the same StringVectorReferenceCountOffset (0x38), the IntrusivePtr<Vector<String>> constructor/copy/release and the IntrusivePtr<Vector<unsigned long>> destructor/assignment (0x20) plus rows of GuestNpCppWebApiIntrusivePtr.cpp and the debt file; your self-assignment guard would otherwise be redone here. Depends on: now reads #10925; this PR rebases after it lands and keeps both sides on the conflicting lines. Thanks for coordinating.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch 2 times, most recently from b60bf79 to d52d298 Compare November 2, 2026 12:54
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch from d52d298 to a938b47 Compare November 2, 2026 16:17
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch 3 times, most recently from 855b803 to 3701e17 Compare November 2, 2026 16:55
@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Nov 2, 2026
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch from 3701e17 to 6110e76 Compare November 3, 2026 05:47
@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

Rebased onto d1ae628bc2 (main now includes #13194's Matches V1 bring-up). New head 6110e7668317 — same 3-commit structure, #12447's commit still first with its original authorship.

One conflict: upstream's Matches implementation block landed where daf10f1c12 used to sit. Kept the merged Matches code; the only overlap was Sku::priceIsSet, where the old int ...(void) stub was replaced by this commit's audited bool ...(const void*) at 0xd8 — verified against the Api.hpp declaration, which the commit updates to match.

Old-vs-new diff in the PR's files is empty apart from the absorbed upstream work; g++ -fsyntax-only clean on the tip.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 3, 2026
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch from 6110e76 to 3cf96b4 Compare November 3, 2026 09:20
@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

Restacked at 3cf96b436a: #12447's current head 6a62214357 is now literally in this branch's ancestry (merged into the stack base 862f861ded; content verified identical to the patch already carried). Diff vs main is unchanged at +496/−349; mergeable=clean.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 4, 2026
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch from 3cf96b4 to e806c9b Compare November 4, 2026 09:06
@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

Restacked onto b11c7bf84f5d with #12447's new head 596c792ce6 merged into the base (it moved since the last restack — same patch, rebased). Upstream #12808 landed Common::Binary meanwhile; the merge is clean and this PR's diff is unchanged in intent (+494/−343).

Verified locally: lib builds clean and all 12 guest_np_cpp_web_api_* ctest entries pass, including upstream's new guest_np_cpp_web_api_binary.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 4, 2026
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch from e806c9b to 743b45c Compare November 4, 2026 11:41
@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

CI retrigger: the previous Windows run failed on guest_pad (Exit code 0xc0000409, SIGABRT at 1.29 s, no assertion output before the abort). This PR touches only libSceNpCppWebApi; the other 3169 tests passed. Head force-pushed with an identical tree (e806c9b4db -> 743b45c4de) to get a fresh run.

@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

CI note on the rerun: the Windows job was cancelled again at ~45 min elapsed, inside the guest-tests step. This is the workflow's timeout-minutes: 45 on the windows job (.github/workflows/build.yml), not a test failure — the build phase alone took ~43 min on this runner before the test step even started (~10:55-13:10 with queue wait). For comparison, the same job finished in 40:14 on the faster runner that ran #15740's head. The guest_pad flake from the earlier run did not recur in the log before the kill.

AI-assisted: yes.

@akkadbakkad89

Copy link
Copy Markdown
Contributor Author

Restacked — head 32e719b474.

Restacked on current main (e772fb25cc), which landed edubox's SessionManager::V1 friends player-sessions family (a85386c6ac + fixes) in libSceNpCppWebApi. The two change sets touch disjoint exports — the only conflicts were in docs/dev/debt/libSceNpCppWebApi.md, resolved by keeping both the friends entries and this layer's Common::Vector audited members entry. libSceNpCppWebApi.prx rebuilds clean; all 13 guest_np_cpp_web_api_* tests pass, including the new friends suite; conventions pass.

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Nov 5, 2026
simnJS and others added 3 commits November 6, 2026 00:05
…m bundled module

Ports the title-imported unclaimed stubs decoded from the libSceNpCppWebApi
module bundled with PPSA13197: Common iterators and Vector begin/end/
size/empty/copyFrom over the audited IntrusivePtr and unsigned-long
families, TransactionBase assignment and start guards, Binary accessors,
BasicPresence/BasicProfile model lifecycle and field accessors, Sku,
Product, Container and response getters, and the restriction flag.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@akkadbakkad89
akkadbakkad89 force-pushed the feat-npcwa-common-fill branch from 32e719b to c94be8a Compare November 5, 2026 18:39
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 5, 2026
@oneandonlydean oneandonlydean self-assigned this Nov 5, 2026
@oneandonlydean
oneandonlydean merged commit 0f2633e into boykopovar:main Nov 5, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants