Skip to content

Release: merge release into main - #132

Merged
b-re-w merged 319 commits into
mainfrom
release
Oct 25, 2026
Merged

b-re-w merged 319 commits into
mainfrom
release

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Automated sync of develop (f366e37) into release. Markdown outside README.md and docs/ subfolders is removed by .github/scripts/release/sync-release.sh.

@github-actions
github-actions Bot force-pushed the release branch 18 times, most recently from 7c42aae to d9ec535 Compare October 3, 2026 17:04
b-re-w added 2 commits October 4, 2026 04:29
…es/ removed (#108)

KSP consumers under python-multiplatform-ksp/fixtures, artifact-walker consumers
under python-multiplatform-gradle-plugin/fixtures (root-build projects, the plugin
being an included build), Compose host consumers under python-multiplatform-compose/fixtures.
Tests unchanged except the derived module-name strings that follow the new project paths.
Refactor: Fixtures live inside the modules they test; root ksp-fixtures/ removed
b-re-w added 2 commits October 4, 2026 05:05
…ttings

binary/ held eleven CPython 3.13.0 archives (547 MB) that no build step reads; CPython
is fetched by Gradle. .claude/settings.json is per-machine Claude Code configuration;
it is now ignored and stays on disk.
Chore: Remove unreferenced binary/ and stop tracking local .claude settings
b-re-w added 2 commits October 4, 2026 15:19
…el backend decision (#185)

INTENT 1.5 promotes kernels from exploration to commitment. Design 5 now says:
tile-first with SIMT fallback, our own IR shaped to map onto MLIR, emitters per
target with MSL emitted directly, the MLIR wheel as an optional build-time helper,
torchnative's device layer as the runtime and wgpu for the web only. The two
investigations behind it are recorded under docs/investigations.
Docs: TypedPython commits to GPU kernels and CPU SIMD (#185)
b-re-w and others added 30 commits October 25, 2026 19:58
Build: one published version for library, KSP and plugin (#70)
…ework and stdlib staging (#90)

On a module with Kotlin/Native iOS targets the plugin registers downloadPython_ios (the pinned iOS
support archive, into the consumer's build/ only, verified against a SHA-256 baked in from
python-checksums.properties; a mismatch fails the build), preparePythonXcframework (Sync into
build/xcode-frameworks plus -framework Python -F<slice> on every iOS framework binary and the link
dependency; pythonBindings { ios { linkPythonFramework.set(false) } } turns it off),
stageIosPythonHome_<slice> / stageIosPythonHome / stageIosPythonHomeForXcode (the library's names and
stdout contract), and installPythonXcodeScript (install-python.sh with the consumer's task baked in).
fixtures/ios-consumer builds a simulator app from the plugin alone and probes stdlib, an extension
module and the payload from the bundle.
Plugin: consumer iOS wiring (Python.xcframework + stdlib staging) (#90)
… compare by Kotlin object identity (#322)

The walker binds Owner.<Companion> as a STATIC_GETTER whose generated Kotlin names the companion
(kotlinc emits GETSTATIC), typed as Owner when the companion directly implements it, and exempt from
the rule that drops a constructor beside an Owner.x key. A proxy class falls back to its same-named
module's statics, and one Python name stays one thing: the proxy class wins over a module of the same
name unless a declaration of that name is bound in the parent (#78's callable module), in the adapter
and in PythonProxySource. Proxies are == when they hold the same Kotlin object (identity hash; is not
guaranteed; Kotlin equals is not used). register_empty also takes the proxy class and a Python
callable. Stubs render the handle as a class attribute.
Binder: companion objects as values; proxy identity equality (#322)
…itting an unresolved call (#319)

Kotlin cannot name a root-package declaration from a named package, and every generated fragment
lives in one: a public top-level function with no package produced 'Unresolved reference' and broke
the consumer's compile. The processor now warns, naming the declaration and the fix (add a package),
and skips it.
KSP: skip root-package declarations with a warning (#319)
…on its parent (#323)

When the import system creates pkg.Owner through the finder it binds the module onto pkg after the
loader returns, shadowing the proxy class pkg.Owner (a companion makes Owner both). The parent's
module type now guards __setattr__ with class_wins_over_module, in the adapter and in
PythonProxySource's per-module types, so the class stays and its __getattr__ serves the module's
statics; 'import pkg.Owner as M' binds the class. Reads are unchanged.
…-keeps-class

Binder: explicit submodule import keeps the proxy class (#323)
…cate stdlib-staging tasks are removed (#321)

sample drops its own Python.xcframework Sync and -framework Python linker options (the plugin's
preparePythonXcframework does both) and its Xcode phase runs :sample:installPythonXcodeScript and the
installed script. python-multiplatform's stageIosPythonHome* tasks had no user left and are removed;
its downloadPython_ios stays (the library's cinterop and iOS tests use it). install-python.sh carries a
placeholder the install task bakes, and a raw run without PYTHON_HOME_TASK stops with a message
instead of calling a task that no longer exists.
Build: sample iOS via the plugin; remove the library's duplicate staging (#321)
…Main metadata compiles again (#329)

pthread_mutex_init is not in the POSIX surface Kotlin/Native commonizes across Apple and Linux, so
compileNativeMainKotlinMetadata (which publishing runs) failed although every per-target compile
passed. The critical sections are a few array operations and never call Python, so a CAS spin lock
is bounded.
Fix: commonizable PlatformMutex on native (#329)
…ub collisions, inherited overload sets in stubs

TypedPython CI: vd was assigned only under __APPLE__, so GCC rejected it as unused (#296); it is
now declared in that branch. Kotlin-name stubs: a companion handle typed as its own type stays a
type path (no attribute that mypy reads as a variable), and an owner-typed one is written only when
no nested class of that name is rendered, on the class and the module path (#322). A subclass that
overrides one overload of an inherited name now renders the full set Kotlin resolution sees, in
the supertype's order (CornerBasedShape.copy / createOutline, from #307's foundation.shape walk).
Fix: develop CI red (TypedPython CI, Kotlin-name stubs)
…hisisthepy, apps under io.github.thisisthepy (#95)

Maven group io.github.thisisthepy -> org.thisisthepy (library, KSP, compose, Gradle plugin) and plugin
ID org.thisisthepy.python.multiplatform.bindings; the sample's application/bundle ID and desktop
package move to io.github.thisisthepy.python.multiplatform.demo (namespace too; sample code uses no R
or BuildConfig). Code packages stay. Generated fragments, named from group and path, become
Fragment_org_thisisthepy_*; SPEC L-0 records it. A recorded log line in the GraalVM verification
note keeps its old name.
…hepy

Build: org.thisisthepy coordinates, io.github.thisisthepy app IDs (#95)
…attempt

On the macOS CI runner one baseline measurement did not predict the next call's length, so every
timer landed after the call and the test failed without any defect. Each of up to 12 attempts now
measures first. A mutant without the region field-read guard still fails it.
…obust

Test: robust timing in the region signal-handler test
… interpreter on change (#152, option i)

A function holding a list copy-in or entry globals no longer starves other threads, signals and the
free-threaded stop-the-world for the length of its loops. From the second TP_POLL_INTERVAL chunk on it
writes its lists back, ends their critical section, polls, re-takes it, copies in again and re-checks
lengths, exact element types and entry globals. Unchanged: it continues compiled. Changed: an
OSR-style exit. The frontend generates, per loop, a Python continuation from the function's own
source (resume.py: the rest of the function from that iteration, enclosing loops via a first-iteration
flag, range bounds as evaluated, original lines and name); the impl boxes every live local and calls
it, and the call returns what it returns. The wrapper hands the context to its impl through tp_tls
so only that call polls with those lists. Functions whose locals cannot all be handed over (virtual
objects, regions) keep the no-poll rule.
TypedPython: OSR-style exit for snapshot holders (#152, option i)
…rray.tobytes()

tobytes() is a memcpy that may copy byte-wise and tear an element itself, so the test could report a
torn element the compiled stores never wrote (Linux CI on 52f641a). The interpreter's a[i] is one
aligned 8-byte load, which is the access the SPEC compares compiled element access with.
Test: per-element reader in the torn-element buffer test
…using it (#161 option B)

withGIL's and withPython's blocks become crossinline (a public API change, user-approved) so the
outermost scope on a virtual thread can run inside a native frame: C's bsearch over one element calls
its comparator, an FFM upcall that runs the scope, so the virtual thread cannot unmount between
PyGILState_Ensure and Release. The result or exception is carried out of the upcall. Platform threads,
Android, native and wasm run the block directly. Panama gains the (long, long) -> int upcall shape;
its reachability descriptor is generated from the @UpcallShape marker.
Binder: pin virtual threads in withGIL; crossinline block (#161 option B)
On a v* tag (or by hand for an existing tag) desktop-release.yml assembles, on macOS, a Maven
repository zip (library desktop artifact with every desktop libpython, KSP processor and gate zip,
Gradle plugin and marker; built with -Dmaven.repo.local, never ~/.m2), the typedpython wheel, the gate
zip, an examples zip and SHA256SUMS; runs both examples from those assets alone (a Kotlin app calling
Python, and typedpython demo); and only then creates or updates the pre-release. Nothing goes to
Maven Central. The tag must equal v<pythonVersion>-<libraryVersionSuffix>.
CI: desktop preview GitHub Release (no Maven), with examples
The owner abolished the .tmp/ rule on 2026-10-26.
Docs: temp files in scratchpad or .cache/, not .tmp/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant