A string created from a text source in the default horizontal form (0x10)
reported 0x10. TEKKEN: DARK RESURRECTION (PPSA31371) passes the reported form
to sceFontCreateWritingLine, which only accepts 0x11 and 0x12, so the call
failed and the layout width was 0.
On firmware 13.42 sceFontCreateString decides the direction for a default-form
source and sceFontStringGetWritingForm returns the stored form. The string
gets 0x12 when its first strong character is left to right, 0x11 when it is
right to left, and 0x12 when it has none. Left-to-right and right-to-left marks
count as strong, embeddings and overrides do not, and text between an isolate
initiator and its PDI is skipped. Explicit 0x11 and 0x12 sources keep their
form.
The test follows the table reported on the pull request. Which characters are
strong is decided by Unicode block ranges here, not by the full bidi class
tables.
scePthreadMutexTimedlock on a mutex the caller holds, and
scePthreadRwlockTimedrdlock and scePthreadRwlockTimedwrlock on a rwlock
it holds for writing, returned EDEADLK at once. The console returns
ETIMEDOUT, as the prosper console oracle measured. They now sleep until
the timeout and return ETIMEDOUT, as FreeBSD libthr does. The POSIX
timed locks call these and change with them.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
sceUsbdGetDevice, sceUsbdGetDeviceSpeed, sceUsbdGetMaxPacketSize,
sceUsbdGetMaxIsoPacketSize, sceUsbdOpenDeviceWithVidPid,
sceUsbdSetInterfaceAltSetting, sceUsbdClearHalt and
sceUsbdDetachKernelDriver follow FreeBSD 11.4 libusb10.c over the host
libusb. The packet sizes and the alternate setting checks are done as
FreeBSD does them, so the library records which interfaces are claimed,
and a device stays known while a handle to it is open.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A compound statement that is not a conditional, loop or lambda always runs, so its calls are collected like the body's own and its exits stop the scan. An export whose only throw sits in such a block stays a stub and fails a strict audit.
A conditional return, co_return or goto before the throwing call leaves a path that succeeds, so the audit stops collecting calls at it and the export, or a helper it calls, is partial. A guard that throws still leaves every path throwing, so it stays a stub.
The previous check called any stub call inside an #if block partial,
so an export that throws in every #if, #elif and #else alternative was
reported as partial. Each combination of preprocessor branches is now
expanded into its own body, an #if without #else gets an empty
alternative, and the export is a stub when every combination reaches
the throw. More than 256 combinations in one function, or unbalanced
directives, are reported as errors.
A NotImplemented_nid_no_patch call inside an #if, #ifdef or #ifndef block
opened in the export's own body runs only on some hosts, so the export
is partial, not a stub. An export wrapped in a preprocessor block from
outside its body keeps its class.
An export whose body reaches NotImplemented_nid_no_patch on every path,
directly or through a helper that always reaches it, stays a stub. One
that reaches it only under a condition (if, else, loop, switch, ternary,
short-circuit or lambda) is now classified as partial, so implemented
exports with guards for unknown behaviour are no longer counted as stubs.
progress.py and the progress page are unchanged.
vfscanf, which vscanf and scanf also go through, read without switching
the stream to reading first. On Windows a vfscanf directly after fwrite
on an r+ stream returned bytes of the write buffer, as fscanf did before
a7e6e597d. It now calls SwitchToReading as fscanf does.