Skip to content

Run Flutter widget code on Codename One - #5883

Open
shai-almog wants to merge 525 commits into
masterfrom
flutter-dart-transpilation
Open

shai-almog wants to merge 525 commits into
masterfrom
flutter-dart-transpilation

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Compiles Dart widget source to Java at build time and runs it on Codename One's own renderer. There is no Dart VM in the result, no embedded engine and no platform view — a Dart screen becomes ordinary Codename One components, so it inherits the theme, the event thread, the accessibility tree and the native build.

Two entry points, which are the two things a user actually wants to do:

  • FlutterUI.wrap(widget) returns a Container that goes anywhere an ordinary component does, for putting one Dart screen inside an existing app. It deliberately does not install the Material base theme, so it will not restyle the screen around it.
  • FlutterUI.runApp(widget) mounts the tree as the whole UI, and does install it.

The build wiring is the archetype's own: the transcode-flutter goal is already bound and is a silent no-op until src/main/flutter exists. No Dart SDK is involved — the transpiler is Java and the Dart is input, never executed.

Benchmark

scripts/flutter-bench builds one application two ways — the Flutter toolchain's release build, and the identical Dart source transpiled by Codename One — and publishes size, start-up and idle memory per platform to the PR and to port status.

Neither application is vendored. prepare.sh takes the gallery from the Flutter SDK CI clones and copies the same 159 files into both trees, so the comparison cannot drift: there is no second copy for an edit to land on. An earlier round of this work compared two different galleries and every number it produced was meaningless. The Codename One side is generated from the shipping archetype with the runtime dependency enabled — the two steps the guide tells a user to take — so a change that breaks the documented wiring breaks the benchmark too.

Three measurement decisions, each because the obvious alternative flattered us:

  • Start-up is a bracket. Flutter's FIRSTCONTENT is a UI-thread callback that runs before that frame is rasterised, while our FIRSTFRAME fires once the form is on screen. Comparing them charges one runtime for rasterising its first screen and not the other — which is what the harness this replaces did. Flutter's figure is reported as a range and the ratio uses the end least favourable to us.
  • Executable code is every Mach-O in the bundle, not the main executable. On iOS a Flutter application's own code is not in the executable at all: Runner is a thin launcher and the Dart image sits in Frameworks/App.framework. Sizing the executable compared our whole runtime against their stub.
  • Assets are staged from Flutter's own built bundle. Staging the whole asset package ships files Flutter tree-shakes away; staging only the 1x images ships fewer than Flutter does.

And two refusals rather than a substituted number:

  • iOS start-up and memory are not measured. Dart cannot AOT-compile for the simulator, so a simulator run would time Flutter's JIT debug engine against our release build. Sizes come from release device bundles, which need no signing.
  • Desktop is the native ports only — AppKit, clang-cl, GTK3/Cairo — never JavaSE, whose bundled JVM and dependency directory are not the same kind of artifact as Flutter's native bundle.

Nothing contacts the build server: the *-source and local-* targets build on the runner. Only our own numbers are gated, so a Flutter SDK upgrade that grows their build cannot turn ours red.

Fidelity work in this PR

  • RoundBorder draws itself when there is no shadow and no uiid mode, instead of going through a component-sized offscreen image. The cache hides the cost for a static shape; for one that animates its size it does not — a circle growing to 1618×1618 threw away a 10MB surface per frame.
  • A paint-only shift needs a box it can paint into. Component.paintInternalImpl clips every component to its own rectangle, so FractionalTranslation drew most of itself into the discarded region — the feature-discovery circle rendered as a quadrant with two straight edges meeting at its centre.
  • FittedBox was a pass-through. Flutter lays its child out unbounded and scales the result, which is why text inside one shrinks instead of wrapping.
  • Card rebuilt its border every time, and RoundRectBorder caches its shadow against the border instance, so every rebuild re-rendered it with a gaussian blur. With the cache off it also translates the live Graphics by the shadow offset and never undoes it, so cards drifted 9px down and 4px across, accumulating down the page.

Verification

  • 398 flutter-runtime tests, plus 21 new tests for the benchmark's arithmetic
  • Parity sweep 48/48 routes: device mean 2.06%, median 1.66%; /demo/card 14.98% → 2.30%, /demo/grid-lists 26.30% → 0.32%
  • prepare.sh verified end to end; the generated project builds 563 Java files from 159 Dart files, which also exercises the documented user path
  • actionlint 74/74, copyright and control-character gates clean against the merge base

Not yet proven

No benchmark platform adapter has been exercised end to end — run_bench.py --list reports that rather than implying otherwise, and the first CI run is the thing to review. The native compile steps (xcodebuild, gradle, clang-cl, GTK3) have not run on a runner.

This is also the first mention of the feature in docs/, which has carried none until now.

Comment thread scripts/flutter-bench/benchlib.py Fixed
@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Flutter vs Codename One

Same application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor.

android

9 interleaved rounds; host load 0.45, 1.71, 1.5

Metric Codename One Flutter Ratio Winner
Installed size 78.2 MB 95.8 MB 1.23x Codename One
Executable code 4.6 MB 20.6 MB 4.48x Codename One
Download size (zipped) 78.2 MB 95.8 MB 1.23x Codename One
Cold start to first frame on screen 465 ms 1848 ms 3.91x Codename One
Memory at rest 43.4 MB 77.5 MB 1.79x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 89 ms 187 ms 2.10x
longArithmetic 64 ms 58 ms 0.91x
mathTranscendental 225 ms 352 ms 1.56x
arraySequential 27 ms 36 ms 1.33x
arrayRandom 270 ms 315 ms 1.17x
objectAllocation 66 ms 48 ms 0.73x
valueEscape 7 ms 7 ms 1.00x
hashMapChurn 137 ms 304 ms 2.22x
stringBuilding 96 ms 131 ms 1.36x
recursion 85 ms 277 ms 3.26x
quicksortBench 128 ms 156 ms 1.22x
Geometric mean 1.40x

Gate: within tolerance against scripts/flutter-bench/baseline.

Android sizes are for the arm64-v8a slice a phone is delivered, on both sides; Flutter's release apk carries three ABIs and would otherwise count its engine about three times.
Android start-up and memory come from an x86_64 emulator with a software GPU. They compare the two runtimes on one machine; they are not phone timings, and a renderer that leans on the GPU is penalised more there.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

ios

9 interleaved rounds; host load 42.79, 42.91, 29.18

Metric Codename One Flutter Ratio Winner
Installed size 107.5 MB 110.5 MB 1.03x Codename One
Executable code 16.4 MB 19.1 MB 1.16x Codename One
Download size (zipped) 79.7 MB 81.9 MB 1.03x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon.

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -11.23%; Installed size -1.90%; Download size (zipped) -0.92% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 5883 --reason "<why these moved>" baseline-ios.json, then commit the overlay it writes.

iOS start-up and memory are not measured here: Flutter cannot AOT-compile for the simulator, so a simulator run would time a JIT debug build against a release build. Sizes come from release device bundles; timings need signed hardware.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

javascript

9 interleaved rounds; host load 2.49, 1.3, 0.54

Metric Codename One Flutter Ratio Winner
Installed size 103.3 MB 122.5 MB 1.19x Codename One
Executable code 12.4 MB 25.2 MB 2.03x Codename One
Download size (zipped) 76.1 MB 84.1 MB 1.11x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 651 ms wrong result Flutter: wrong result
longArithmetic 4550 ms did not run Flutter: did not run
mathTranscendental 556 ms did not run Flutter: did not run
arraySequential 239 ms 82 ms 0.34x
arrayRandom 919 ms wrong result Flutter: wrong result
objectAllocation 38 ms 27 ms 0.71x
valueEscape 148 ms 7 ms 0.05x
hashMapChurn 990 ms 249 ms 0.25x
stringBuilding 533 ms 106 ms 0.20x
recursion 507 ms 489 ms 0.96x
quicksortBench 405 ms wrong result Flutter: wrong result
Geometric mean 0.29x

Gate: within tolerance against scripts/flutter-bench/baseline; BEHIND FLUTTER on Compute (geomean of the VM workloads) (reported, not gated: a loss to Flutter on the web is currently accepted).

the JavaScript adapter needs a Chrome DevTools driver; sizes are reported and timings are not
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

linux

9 interleaved rounds; host load 0.24, 2.86, 2.36

Metric Codename One Flutter Ratio Winner
Installed size 110.6 MB 143.8 MB 1.30x Codename One
Executable code 13.6 MB 16.1 MB 1.19x Codename One
Download size (zipped) 80.6 MB 92.9 MB 1.15x Codename One
Cold start to first frame on screen 153 ms 245 ms 1.61x Codename One
Memory at rest 87.6 MB 225.9 MB 2.59x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 74 ms 183 ms 2.47x
longArithmetic 56 ms 55 ms 0.98x
mathTranscendental 253 ms 276 ms 1.09x
arraySequential 16 ms 35 ms 2.19x
arrayRandom 243 ms 316 ms 1.30x
objectAllocation 24 ms 38 ms 1.58x
valueEscape 5 ms 7 ms 1.40x
hashMapChurn 55 ms 358 ms 6.51x
stringBuilding 33 ms 110 ms 3.33x
recursion 87 ms 257 ms 2.95x
quicksortBench 138 ms 149 ms 1.08x
Geometric mean 1.90x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -2.14%; Installed size -0.29%; Download size (zipped) -0.18% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 5883 --reason "<why these moved>" baseline-linux.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

macos

9 interleaved rounds; host load 8.24, 21.08, 20.38

Metric Codename One Flutter Ratio Winner
Installed size 122.8 MB 139.4 MB 1.14x Codename One
Executable code 31.7 MB 47.9 MB 1.51x Codename One
Download size (zipped) 85.1 MB 93.3 MB 1.10x Codename One
Cold start to first frame on screen 369 ms 469 ms 1.55x Codename One
Memory at rest 36.4 MB 54.4 MB 1.50x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 101 ms 258 ms 2.55x
longArithmetic 63 ms 67 ms 1.06x
mathTranscendental 335 ms 337 ms 1.01x
arraySequential 12 ms 49 ms 4.08x
arrayRandom 314 ms 335 ms 1.07x
objectAllocation 52 ms 28 ms 0.54x
valueEscape 6 ms 13 ms 2.17x
hashMapChurn 39 ms 167 ms 4.28x
stringBuilding 23 ms 112 ms 4.87x
recursion 150 ms 274 ms 1.83x
quicksortBench 133 ms 141 ms 1.06x
Geometric mean 1.78x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -10.22%; Installed size -2.85%; Download size (zipped) -1.63% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 5883 --reason "<why these moved>" baseline-macos.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

windows

9 interleaved rounds

Metric Codename One Flutter Ratio Winner
Installed size 107.1 MB 121.1 MB 1.13x Codename One
Executable code 10.9 MB 14.1 MB 1.29x Codename One
Download size (zipped) 77.6 MB 86.4 MB 1.11x Codename One
Cold start to first frame on screen 125 ms 216 ms 1.68x Codename One
Memory at rest 56.3 MB 93.0 MB 1.64x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 8 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 65 ms 187 ms 2.88x
longArithmetic 45 ms 48 ms 1.07x
mathTranscendental 138 ms 154 ms 1.12x
arraySequential 8 ms 32 ms 4.00x
arrayRandom 204 ms 248 ms 1.22x
objectAllocation 34 ms 37 ms 1.09x
valueEscape 0 ms 10 ms too fast to time
hashMapChurn 34 ms 237 ms 6.97x
stringBuilding 22 ms 86 ms 3.91x
recursion 131 ms 175 ms 1.34x
quicksortBench 126 ms 119 ms 0.94x
Geometric mean 1.90x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -14.02%; Installed size -1.74%; Download size (zipped) -1.05% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 5883 --reason "<why these moved>" baseline-windows.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

Codename One wins 26 of 26 measured metrics across 6 platform(s).

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Native fidelity (Android, Material 3)

54 pairs compared -- median 95.6%, worst 91.3% (FlatButton_pressed_dark), 25th pct 94.9%, mean 95.7%.

Distribution -- >=99%: 2 | 95-99%: 37 | 90-95%: 15 | <90%: 0

Component State Appearance Material Fidelity SSIM mean delta vs base Geometry
FlatButton pressed dark normal 91.3% 0.899 3.10 0.0 ok
Tabs normal light normal 92.3% 0.914 3.05 0.0 ok
Button pressed dark normal 92.6% 0.949 4.32 0.0 ok
FlatButton normal dark normal 93.2% 0.938 2.69 0.0 ok
Button disabled dark normal 93.3% 0.928 2.20 0.0 ok
Button pressed light normal 93.3% 0.952 3.68 0.0 ok
FlatButton normal light normal 93.7% 0.941 2.29 0.0 ok
FlatButton pressed light normal 93.8% 0.942 2.56 0.0 ok
FloatingActionButton pressed light normal 94.4% 0.927 2.82 0.0 OFF (h 0.88)
RadioButton normal dark normal 94.5% 0.963 2.19 0.0 ok
RadioButton normal light normal 94.7% 0.964 1.85 0.0 ok
CheckBox selected dark normal 94.7% 0.950 2.60 0.0 ok
RadioButton selected dark normal 94.8% 0.963 2.42 0.0 ok
CheckBox normal dark normal 94.9% 0.952 2.69 0.0 ok
Button normal dark normal 94.9% 0.949 3.16 0.0 ok
CheckBox normal light normal 95.0% 0.953 2.30 0.0 ok
Toolbar normal dark normal 95.1% 0.906 1.60 0.0 ok
RaisedButton pressed dark normal 95.2% 0.950 2.39 0.0 ok
CheckBox disabled dark normal 95.2% 0.954 1.47 0.0 ok
CheckBox disabled light normal 95.2% 0.956 1.34 0.0 ok
Tabs normal dark normal 95.2% 0.913 3.65 0.0 ok
RadioButton disabled dark normal 95.3% 0.963 1.18 0.0 ok
RadioButton selected light normal 95.3% 0.964 1.84 0.0 ok
CheckBox selected light normal 95.4% 0.952 2.06 0.0 ok
Switch selected light normal 95.4% 0.966 1.59 0.0 ok
Switch selected dark normal 95.5% 0.966 1.86 0.0 ok
RadioButton disabled light normal 95.5% 0.966 1.08 0.0 ok
Switch disabled dark normal 95.6% 0.961 0.85 0.0 ok
Dialog normal light normal 95.7% 0.930 2.30 0.0 ok
RaisedButton pressed light normal 95.8% 0.958 2.16 0.0 ok
Button normal light normal 95.8% 0.953 2.46 0.0 ok
Dialog normal dark normal 95.8% 0.932 2.30 0.0 ok
Switch normal light normal 96.0% 0.961 1.45 0.0 ok
FloatingActionButton normal light normal 96.1% 0.937 1.14 0.0 ok
FloatingActionButton pressed dark normal 96.2% 0.951 2.45 0.0 ok
Switch normal dark normal 96.2% 0.962 1.39 0.0 ok
TextField disabled dark normal 96.2% 0.965 0.76 0.0 ok
RaisedButton normal dark normal 96.4% 0.952 1.78 0.0 ok
Switch disabled light normal 96.4% 0.970 0.61 0.0 ok
Button disabled light normal 96.8% 0.960 1.06 0.0 ok
ProgressBar normal dark normal 96.9% 0.967 2.03 0.0 OFF (h 1.50)
RaisedButton disabled dark normal 97.0% 0.955 0.89 0.0 ok
FloatingActionButton normal dark normal 97.1% 0.952 1.43 0.0 ok
ProgressBar normal light normal 97.3% 0.974 1.53 0.0 OFF (h 1.50)
RaisedButton disabled light normal 97.3% 0.961 0.79 0.0 ok
TextField disabled light normal 97.3% 0.965 0.79 0.0 ok
RaisedButton normal light normal 97.3% 0.961 1.40 0.0 ok
TextField normal dark normal 97.6% 0.958 1.83 0.0 ok
TextField normal light normal 97.6% 0.958 1.63 0.0 ok
Slider normal dark normal 98.4% 0.990 0.87 0.0 ok
Toolbar normal light normal 98.7% 0.974 1.28 0.0 ok
Slider normal light normal 99.0% 0.991 0.47 0.0 ok
Slider disabled dark normal 99.6% 0.993 0.22 0.0 ok
Slider disabled light normal 99.6% 0.993 0.18 0.0 ok
Geometry vs native (bbox offset / size ratio / center offset / corner radius) -- gated separately from the visual score
Component State Appearance bbox dx,dy (px) w ratio h ratio center off (px) radius native->cn1 (px)
FloatingActionButton pressed light +0,+0 0.929 0.881 4.0 -
FloatingActionButton normal light +0,+0 0.946 0.912 2.9 -
Button pressed dark +0,+0 0.947 0.975 2.6 -
Button disabled dark +0,+0 0.947 0.975 2.6 -
Button pressed light +0,+0 0.947 0.975 2.6 -
Button normal dark +0,+0 0.947 0.975 2.6 -
RaisedButton pressed dark +0,+0 0.945 0.975 2.6 -
RaisedButton pressed light +0,+0 0.945 0.975 2.6 -
Button normal light +0,+0 0.947 0.975 2.6 -
RaisedButton normal dark +0,+0 0.945 0.975 2.6 -
Button disabled light +0,+0 0.947 0.975 2.6 -
RaisedButton disabled dark +0,+0 0.945 0.975 2.6 -
RaisedButton disabled light +0,+0 0.945 0.975 2.6 -
RaisedButton normal light +0,+0 0.945 0.975 2.6 -
RadioButton normal dark +1,+1 1.029 1.000 2.2 -
RadioButton normal light +1,+1 1.029 1.000 2.2 -
RadioButton selected dark +1,+1 1.029 1.000 2.2 -
RadioButton disabled dark +1,+1 1.029 1.000 2.2 -
RadioButton selected light +1,+1 1.029 1.000 2.2 -
Switch selected light +0,+0 1.080 1.063 2.2 -
RadioButton disabled light +1,+1 1.029 1.000 2.2 -
CheckBox selected dark +1,+1 1.013 1.000 1.8 -
CheckBox normal dark +1,+1 1.013 1.000 1.8 -
CheckBox normal light +1,+1 1.013 1.000 1.8 -
CheckBox disabled dark +1,+1 1.013 1.000 1.8 -
CheckBox disabled light +1,+1 1.013 1.000 1.8 -
CheckBox selected light +1,+1 1.013 1.000 1.8 -
Switch selected dark +0,+0 1.060 1.031 1.6 -
Switch disabled dark +0,-1 1.060 1.031 1.6 -
Dialog normal light +0,+0 1.007 0.982 1.6 -
Dialog normal dark +0,+0 1.007 0.982 1.6 -
Switch normal light +0,-1 1.060 1.031 1.6 -
Switch normal dark +0,-1 1.060 1.031 1.6 -
Switch disabled light +0,-1 1.060 1.031 1.6 -
FloatingActionButton pressed dark +0,+0 0.963 0.963 1.4 -
FloatingActionButton normal dark +0,+0 0.963 0.963 1.4 -
Toolbar normal light -1,+1 1.000 1.000 1.4 -
FlatButton pressed dark +0,+0 0.977 0.975 1.1 -
FlatButton normal dark +0,+0 0.977 0.975 1.1 -
FlatButton normal light +0,+0 0.977 0.975 1.1 -
FlatButton pressed light +0,+0 0.977 0.975 1.1 -
TextField normal dark +0,+0 1.015 1.036 1.1 -
TextField normal light +0,+0 1.015 1.036 1.1 -
Toolbar normal dark +0,+0 1.000 1.032 1.0 -
ProgressBar normal dark +0,+0 1.000 1.500 1.0 -
ProgressBar normal light +0,+0 1.000 1.500 1.0 -
TextField disabled dark +0,+0 1.015 1.018 0.7 -
TextField disabled light +0,+0 1.015 1.018 0.7 -
Tabs normal light +0,+1 1.000 0.984 0.5 -
Slider normal dark +1,+0 0.996 1.000 0.5 -
Slider normal light +1,+0 0.996 1.000 0.5 -
Tabs normal dark +0,+0 1.000 1.000 0.0 -
Slider disabled dark +0,+0 1.000 1.000 0.0 -
Slider disabled light +0,+0 1.000 1.000 0.0 -

Side-by-side comparisons (worst first)

  • FlatButton_pressed_dark -- 91.25% fidelity (SSIM 0.8985) (no change)

    native FlatButton_pressed_dark cn1 FlatButton_pressed_dark
    Left: native widget. Right: Codename One render.

  • Tabs_normal_light -- 92.28% fidelity (SSIM 0.9140) (no change)

    native Tabs_normal_light cn1 Tabs_normal_light
    Left: native widget. Right: Codename One render.

  • Button_pressed_dark -- 92.61% fidelity (SSIM 0.9485) (no change)

    native Button_pressed_dark cn1 Button_pressed_dark
    Left: native widget. Right: Codename One render.

  • FlatButton_normal_dark -- 93.24% fidelity (SSIM 0.9381) (no change)

    native FlatButton_normal_dark cn1 FlatButton_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_disabled_dark -- 93.26% fidelity (SSIM 0.9278) (no change)

    native Button_disabled_dark cn1 Button_disabled_dark
    Left: native widget. Right: Codename One render.

  • Button_pressed_light -- 93.34% fidelity (SSIM 0.9521) (no change)

    native Button_pressed_light cn1 Button_pressed_light
    Left: native widget. Right: Codename One render.

  • FlatButton_normal_light -- 93.72% fidelity (SSIM 0.9410) (no change)

    native FlatButton_normal_light cn1 FlatButton_normal_light
    Left: native widget. Right: Codename One render.

  • FlatButton_pressed_light -- 93.77% fidelity (SSIM 0.9424) (no change)

    native FlatButton_pressed_light cn1 FlatButton_pressed_light
    Left: native widget. Right: Codename One render.

  • FloatingActionButton_pressed_light -- 94.44% fidelity (SSIM 0.9273) (no change)

    native FloatingActionButton_pressed_light cn1 FloatingActionButton_pressed_light
    Left: native widget. Right: Codename One render.

  • RadioButton_normal_dark -- 94.46% fidelity (SSIM 0.9630) (no change)

    native RadioButton_normal_dark cn1 RadioButton_normal_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_normal_light -- 94.69% fidelity (SSIM 0.9643) (no change)

    native RadioButton_normal_light cn1 RadioButton_normal_light
    Left: native widget. Right: Codename One render.

  • CheckBox_selected_dark -- 94.71% fidelity (SSIM 0.9502) (no change)

    native CheckBox_selected_dark cn1 CheckBox_selected_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_selected_dark -- 94.79% fidelity (SSIM 0.9630) (no change)

    native RadioButton_selected_dark cn1 RadioButton_selected_dark
    Left: native widget. Right: Codename One render.

  • CheckBox_normal_dark -- 94.93% fidelity (SSIM 0.9516) (no change)

    native CheckBox_normal_dark cn1 CheckBox_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_normal_dark -- 94.94% fidelity (SSIM 0.9491) (no change)

    native Button_normal_dark cn1 Button_normal_dark
    Left: native widget. Right: Codename One render.

  • CheckBox_normal_light -- 95.03% fidelity (SSIM 0.9531) (no change)

    native CheckBox_normal_light cn1 CheckBox_normal_light
    Left: native widget. Right: Codename One render.

  • Toolbar_normal_dark -- 95.07% fidelity (SSIM 0.9059) (no change)

    native Toolbar_normal_dark cn1 Toolbar_normal_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_pressed_dark -- 95.19% fidelity (SSIM 0.9501) (no change)

    native RaisedButton_pressed_dark cn1 RaisedButton_pressed_dark
    Left: native widget. Right: Codename One render.

  • CheckBox_disabled_dark -- 95.20% fidelity (SSIM 0.9538) (no change)

    native CheckBox_disabled_dark cn1 CheckBox_disabled_dark
    Left: native widget. Right: Codename One render.

  • CheckBox_disabled_light -- 95.21% fidelity (SSIM 0.9562) (no change)

    native CheckBox_disabled_light cn1 CheckBox_disabled_light
    Left: native widget. Right: Codename One render.

  • Tabs_normal_dark -- 95.23% fidelity (SSIM 0.9125) (no change)

    native Tabs_normal_dark cn1 Tabs_normal_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_disabled_dark -- 95.29% fidelity (SSIM 0.9630) (no change)

    native RadioButton_disabled_dark cn1 RadioButton_disabled_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_selected_light -- 95.33% fidelity (SSIM 0.9642) (no change)

    native RadioButton_selected_light cn1 RadioButton_selected_light
    Left: native widget. Right: Codename One render.

  • CheckBox_selected_light -- 95.37% fidelity (SSIM 0.9524) (no change)

    native CheckBox_selected_light cn1 CheckBox_selected_light
    Left: native widget. Right: Codename One render.

  • Switch_selected_light -- 95.37% fidelity (SSIM 0.9658) (no change)

    native Switch_selected_light cn1 Switch_selected_light
    Left: native widget. Right: Codename One render.

  • Switch_selected_dark -- 95.45% fidelity (SSIM 0.9656) (no change)

    native Switch_selected_dark cn1 Switch_selected_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_disabled_light -- 95.46% fidelity (SSIM 0.9657) (no change)

    native RadioButton_disabled_light cn1 RadioButton_disabled_light
    Left: native widget. Right: Codename One render.

  • Switch_disabled_dark -- 95.57% fidelity (SSIM 0.9613) (no change)

    native Switch_disabled_dark cn1 Switch_disabled_dark
    Left: native widget. Right: Codename One render.

  • Dialog_normal_light -- 95.65% fidelity (SSIM 0.9300) (no change)

    native Dialog_normal_light cn1 Dialog_normal_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_pressed_light -- 95.78% fidelity (SSIM 0.9578) (no change)

    native RaisedButton_pressed_light cn1 RaisedButton_pressed_light
    Left: native widget. Right: Codename One render.

  • Button_normal_light -- 95.79% fidelity (SSIM 0.9528) (no change)

    native Button_normal_light cn1 Button_normal_light
    Left: native widget. Right: Codename One render.

  • Dialog_normal_dark -- 95.79% fidelity (SSIM 0.9322) (no change)

    native Dialog_normal_dark cn1 Dialog_normal_dark
    Left: native widget. Right: Codename One render.

  • Switch_normal_light -- 95.97% fidelity (SSIM 0.9612) (no change)

    native Switch_normal_light cn1 Switch_normal_light
    Left: native widget. Right: Codename One render.

  • FloatingActionButton_normal_light -- 96.09% fidelity (SSIM 0.9367) (no change)

    native FloatingActionButton_normal_light cn1 FloatingActionButton_normal_light
    Left: native widget. Right: Codename One render.

  • FloatingActionButton_pressed_dark -- 96.16% fidelity (SSIM 0.9513) (no change)

    native FloatingActionButton_pressed_dark cn1 FloatingActionButton_pressed_dark
    Left: native widget. Right: Codename One render.

  • Switch_normal_dark -- 96.17% fidelity (SSIM 0.9616) (no change)

    native Switch_normal_dark cn1 Switch_normal_dark
    Left: native widget. Right: Codename One render.

  • TextField_disabled_dark -- 96.21% fidelity (SSIM 0.9648) (no change)

    native TextField_disabled_dark cn1 TextField_disabled_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_normal_dark -- 96.41% fidelity (SSIM 0.9516) (no change)

    native RaisedButton_normal_dark cn1 RaisedButton_normal_dark
    Left: native widget. Right: Codename One render.

  • Switch_disabled_light -- 96.43% fidelity (SSIM 0.9698) (no change)

    native Switch_disabled_light cn1 Switch_disabled_light
    Left: native widget. Right: Codename One render.

  • Button_disabled_light -- 96.80% fidelity (SSIM 0.9596) (no change)

    native Button_disabled_light cn1 Button_disabled_light
    Left: native widget. Right: Codename One render.

  • ProgressBar_normal_dark -- 96.91% fidelity (SSIM 0.9669) (no change)

    native ProgressBar_normal_dark cn1 ProgressBar_normal_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_disabled_dark -- 97.02% fidelity (SSIM 0.9549) (no change)

    native RaisedButton_disabled_dark cn1 RaisedButton_disabled_dark
    Left: native widget. Right: Codename One render.

  • FloatingActionButton_normal_dark -- 97.07% fidelity (SSIM 0.9521) (no change)

    native FloatingActionButton_normal_dark cn1 FloatingActionButton_normal_dark
    Left: native widget. Right: Codename One render.

  • ProgressBar_normal_light -- 97.26% fidelity (SSIM 0.9739) (no change)

    native ProgressBar_normal_light cn1 ProgressBar_normal_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_disabled_light -- 97.26% fidelity (SSIM 0.9611) (no change)

    native RaisedButton_disabled_light cn1 RaisedButton_disabled_light
    Left: native widget. Right: Codename One render.

  • TextField_disabled_light -- 97.29% fidelity (SSIM 0.9649) (no change)

    native TextField_disabled_light cn1 TextField_disabled_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_normal_light -- 97.32% fidelity (SSIM 0.9613) (no change)

    native RaisedButton_normal_light cn1 RaisedButton_normal_light
    Left: native widget. Right: Codename One render.

  • TextField_normal_dark -- 97.61% fidelity (SSIM 0.9583) (no change)

    native TextField_normal_dark cn1 TextField_normal_dark
    Left: native widget. Right: Codename One render.

  • TextField_normal_light -- 97.62% fidelity (SSIM 0.9582) (no change)

    native TextField_normal_light cn1 TextField_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_normal_dark -- 98.39% fidelity (SSIM 0.9900) (no change)

    native Slider_normal_dark cn1 Slider_normal_dark
    Left: native widget. Right: Codename One render.

  • Toolbar_normal_light -- 98.69% fidelity (SSIM 0.9739) (no change)

    native Toolbar_normal_light cn1 Toolbar_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_normal_light -- 98.95% fidelity (SSIM 0.9908) (no change)

    native Slider_normal_light cn1 Slider_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_disabled_dark -- 99.56% fidelity (SSIM 0.9927) (no change)

    native Slider_disabled_dark cn1 Slider_disabled_dark
    Left: native widget. Right: Codename One render.

  • Slider_disabled_light -- 99.59% fidelity (SSIM 0.9932) (no change)

    native Slider_disabled_light cn1 Slider_disabled_light
    Left: native widget. Right: Codename One render.

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 56ms / native 5ms = 11.2x speedup
SIMD float-mul (64K x300) java 72ms / native 4ms = 18.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 72.000 ms
Base64 CN1 decode 90.000 ms
Base64 SIMD encode 111.000 ms
Base64 encode ratio (SIMD/CN1) 1.542x (54.2% slower)
Base64 SIMD decode 139.000 ms
Base64 decode ratio (SIMD/CN1) 1.544x (54.4% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.286x (71.4% faster)
Image applyMask (SIMD off) 17.000 ms
Image applyMask (SIMD on) 19.000 ms
Image applyMask ratio (SIMD on/off) 1.118x (11.8% slower)
Image modifyAlpha (SIMD off) 37.000 ms
Image modifyAlpha (SIMD on) 24.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.649x (35.1% faster)
Image modifyAlpha removeColor (SIMD off) 36.000 ms
Image modifyAlpha removeColor (SIMD on) 53.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.472x (47.2% slower)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 1 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-1-authenticamd)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.26x (base 1.22x, +3.4%) 0.74x (base 0.94x, -21.1%) ok
translator (self) 4 0.51x (base 0.60x, -16.1%) 0.55x (base 0.54x, +1.5%) ok
intArithmetic 4 1.10x (base 1.10x, +0.0%) 0.06x (base 0.06x, -0.6%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.05x (base 0.05x, +0.7%) ok
mathTranscendental 4 0.79x (base 0.79x, -0.2%) 0.06x (base 0.06x, +0.2%) ok
arraySequential 4 1.34x (base 1.36x, -1.9%) 0.39x (base 0.39x, +0.2%) ok
arrayRandom 4 0.96x (base 1.06x, -9.1%) 0.23x (base 0.23x, -0.1%) ok
objectAllocation 4 1.52x (base 1.56x, -2.8%) 0.30x (base 0.39x, -21.7%) ok
valueEscape 4 0.10x (base 0.10x, +0.4%) 0.04x (base 0.04x, -1.5%) ok
hashMapChurn 4 1.80x (base 1.80x, +0.1%) 0.09x (base 0.09x, +1.8%) ok
stringBuilding 4 1.21x (base 1.22x, -0.2%) 0.32x (base 0.32x, +0.5%) ok
recursion 4 1.45x (base 1.49x, -2.8%) 0.06x (base 0.06x, -1.2%) ok
quicksort 4 1.09x (base 1.13x, -3.6%) 0.12x (base 0.12x, -0.3%) ok

Result: no regression

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 170 screenshots: 170 matched.

Native Android coverage

  • 📊 Line coverage: 16.03% (26023/162381 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 14.39% (122329/850200), branch 9.92% (8479/85437), complexity 7.83% (6534/83500), method 11.60% (4651/40093), class 19.80% (961/4853)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 16.03% (26023/162381 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 14.39% (122329/850200), branch 9.92% (8479/85437), complexity 7.83% (6534/83500), method 11.60% (4651/40093), class 19.80% (961/4853)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 201ms / native 127ms = 1.5x speedup
SIMD float-mul (64K x300) java 117ms / native 113ms = 1.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 75.000 ms
Base64 CN1 decode 85.000 ms
Base64 native encode 428.000 ms
Base64 encode ratio (CN1/native) 0.175x (82.5% faster)
Base64 native decode 280.000 ms
Base64 decode ratio (CN1/native) 0.304x (69.6% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 29ms / native 2ms = 14.5x speedup
SIMD float-mul (64K x300) java 28ms / native 2ms = 14.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 51.000 ms
Base64 CN1 decode 49.000 ms
Base64 SIMD encode 56.000 ms
Base64 encode ratio (SIMD/CN1) 1.098x (9.8% slower)
Base64 SIMD decode 55.000 ms
Base64 decode ratio (SIMD/CN1) 1.122x (12.2% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.800x (20.0% faster)
Image applyMask (SIMD off) 14.000 ms
Image applyMask (SIMD on) 15.000 ms
Image applyMask ratio (SIMD on/off) 1.071x (7.1% slower)
Image modifyAlpha (SIMD off) 21.000 ms
Image modifyAlpha (SIMD on) 10.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.476x (52.4% faster)
Image modifyAlpha removeColor (SIMD off) 20.000 ms
Image modifyAlpha removeColor (SIMD on) 14.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.700x (30.0% faster)

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 9V74 80-Core Processor (baseline linux-x64@amd-epyc-9v74-80-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.93x (base 0.90x, +4.2%) 0.87x (base 0.96x, -9.3%) ok
translator (self) 4 0.54x (base 0.52x, +4.3%) 0.42x (base 0.43x, -2.6%) ok
intArithmetic 4 1.10x (base 1.10x, -0.0%) 0.05x (base 0.06x, -0.5%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.05x (base 0.06x, -1.2%) ok
mathTranscendental 4 1.09x (base 1.09x, -0.6%) 0.06x (base 0.07x, -16.2%) ok
arraySequential 4 2.86x (base 2.81x, +1.7%) 0.37x (base 0.35x, +5.5%) ok
arrayRandom 4 1.08x (base 1.02x, +5.3%) 0.21x (base 0.21x, -1.7%) ok
objectAllocation 4 1.21x (base 1.21x, +0.7%) 0.30x (base 0.39x, -22.0%) ok
valueEscape 4 0.10x (base 0.10x, -0.0%) 0.05x (base 0.06x, -21.7%) ok
hashMapChurn 4 1.09x (base 1.10x, -0.3%) 0.10x (base 0.10x, -2.3%) ok
stringBuilding 4 1.52x (base 1.49x, +2.2%) 0.26x (base 0.26x, +0.2%) ok
recursion 4 1.25x (base 1.24x, +0.4%) 0.07x (base 0.06x, +33.0%) ok
quicksort 4 1.09x (base 1.07x, +2.0%) 0.11x (base 0.11x, +0.7%) ok

Result: no regression

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 1.01x (base 0.93x, +8.9%) 0.74x (base 0.87x, -14.3%) ok
translator (self) 4 0.71x (base 0.70x, +2.4%) 0.39x (base 0.45x, -12.7%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.03x (base 0.03x, -1.1%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, -3.4%) ok
mathTranscendental 4 1.10x (base 1.10x, +0.0%) 0.03x (base 0.03x, +1.2%) ok
arraySequential 4 0.36x (base 0.36x, -0.6%) 0.37x (base 0.37x, -0.2%) ok
arrayRandom 4 0.93x (base 0.94x, -0.4%) 0.20x (base 0.20x, -0.5%) ok
objectAllocation 4 1.90x (base 1.77x, +7.4%) 0.38x (base 0.38x, -0.0%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, -2.0%) ok
hashMapChurn 4 0.84x (base 0.84x, +0.3%) 0.12x (base 0.12x, -3.5%) ok
stringBuilding 4 1.50x (base 1.36x, +10.3%) 0.26x (base 0.26x, -0.1%) ok
recursion 4 1.55x (base 1.43x, +7.9%) 0.03x (base 0.04x, -5.2%) ok
quicksort 4 1.00x (base 0.99x, +0.7%) 0.09x (base 0.09x, +0.4%) ok

Result: no regression

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 49ms / native 2ms = 24.5x speedup
SIMD float-mul (64K x300) java 48ms / native 2ms = 24.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 70.000 ms
Base64 SIMD encode 73.000 ms
Base64 encode ratio (SIMD/CN1) 1.217x (21.7% slower)
Base64 SIMD decode 74.000 ms
Base64 decode ratio (SIMD/CN1) 1.057x (5.7% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.400x (60.0% faster)
Image applyMask (SIMD off) 19.000 ms
Image applyMask (SIMD on) 19.000 ms
Image applyMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image modifyAlpha (SIMD off) 16.000 ms
Image modifyAlpha (SIMD on) 11.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.688x (31.3% faster)
Image modifyAlpha removeColor (SIMD off) 21.000 ms
Image modifyAlpha removeColor (SIMD on) 12.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.571x (42.9% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.16x (base 1.11x, +4.9%) 0.73x (base 0.97x, -25.5%) ok
translator (self) 4 0.82x (base 0.84x, -2.1%) 0.46x (base 0.45x, +3.0%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.06x (base 0.06x, +0.6%) ok
longArithmetic 4 0.80x (base 0.80x, +0.1%) 0.06x (base 0.06x, +1.0%) ok
mathTranscendental 4 0.72x (base 0.72x, -0.2%) 0.06x (base 0.06x, -0.4%) ok
arraySequential 4 0.36x (base 0.46x, -21.2%) 0.39x (base 0.39x, -0.2%) ok
arrayRandom 4 0.94x (base 0.94x, +0.3%) 0.23x (base 0.23x, -0.1%) ok
objectAllocation 4 1.84x (base 2.81x, -34.5%) 0.31x (base 0.43x, -27.2%) ok
valueEscape 4 0.76x (base 0.76x, +0.1%) 0.05x (base 0.05x, +0.1%) ok
hashMapChurn 4 1.00x (base 0.98x, +1.7%) 0.11x (base 0.12x, -9.2%) ok
stringBuilding 4 1.54x (base 1.43x, +7.9%) 0.27x (base 0.27x, -0.5%) ok
recursion 4 1.45x (base 1.46x, -1.2%) 0.06x (base 0.07x, -1.1%) ok
quicksort 4 1.00x (base 1.00x, +0.2%) 0.12x (base 0.12x, -0.5%) ok

Result: no regression

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found
  • Paragraph capitalization: No paragraph capitalization issues
  • LanguageTool: No grammar matches
  • Image references: No unused images detected

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 841 total, 0 failed, 57 skipped

Benchmark Results

  • Execution Time: 6406 ms

  • Hotspots (Top 20 sampled methods):

    • 8.18% java.util.ArrayList.indexOf (87 samples)
    • 7.71% java.lang.System.identityHashCode (82 samples)
    • 6.87% com.codename1.tools.translator.bytecodes.Invoke.findMethodUp (73 samples)
    • 6.49% com.codename1.tools.translator.IteratorEscape.mangle (69 samples)
    • 5.83% java.lang.Object.hashCode (62 samples)
    • 3.48% com.codename1.tools.translator.BytecodeMethod.equals (37 samples)
    • 3.20% java.lang.StringBuilder.append (34 samples)
    • 2.35% java.lang.String.equals (25 samples)
    • 2.16% com.codename1.tools.translator.classfile.analysis.Frame.execute (23 samples)
    • 1.98% com.codename1.tools.translator.JavascriptReachability.enqueueResolved (21 samples)
    • 1.69% java.util.HashMap.hash (18 samples)
    • 1.60% com.codename1.tools.translator.classfile.analysis.Frame.merge (17 samples)
    • 1.51% com.codename1.tools.translator.Parser.cullMethods (16 samples)
    • 1.41% java.util.AbstractCollection.containsAll (15 samples)
    • 1.32% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (14 samples)
    • 1.22% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (13 samples)
    • 1.13% com.codename1.tools.translator.IteratorEscape.ctorOnlyStoresParamsIntoThis (12 samples)
    • 1.03% java.io.FileOutputStream.writeBytes (11 samples)
    • 1.03% com.codename1.tools.translator.BytecodeMethod.optimize (11 samples)
    • 1.03% com.codename1.tools.translator.ByteCodeClass.hasDeclaredNonAbstractMethod (11 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Native fidelity (ios-27-metal)

68 pairs compared -- median 94.6%, worst 74.5% (Toolbar_normal_dark), 25th pct 91.7%, mean 93.3%.

Distribution -- >=99%: 0 | 95-99%: 31 | 90-95%: 25 | <90%: 12

Component State Appearance Material Fidelity SSIM mean delta vs base Geometry
Toolbar normal dark glass 74.5% 0.930 7.16 0.0 ok
Button normal dark glass 79.3% 0.938 7.66 0.0 OFF (off 11px)
Button disabled dark glass 79.6% 0.942 7.41 0.0 OFF (off 11px)
RaisedButton disabled dark glass 81.2% 0.954 6.32 0.0 ok
Tabs normal dark glass 86.2% 0.900 6.73 +0.3 ok
Button pressed dark glass 86.3% 0.948 5.27 0.0 OFF (off 11px)
Tabs normal light glass 86.4% 0.895 7.61 +0.3 ok
TextField normal light normal 86.5% 0.950 3.38 0.0 ok
Toolbar normal light glass 86.9% 0.949 3.85 0.0 ok
TextField disabled light normal 89.4% 0.954 2.56 0.0 ok
Button normal light glass 89.5% 0.959 4.54 0.0 OFF (off 11px)
Button pressed light glass 89.5% 0.959 4.33 0.0 OFF (off 11px)
Spinner normal dark normal 90.7% 0.880 3.47 0.0 ok
FlatButton normal dark glass 90.9% 0.981 2.38 0.0 ok
Button disabled light glass 91.6% 0.962 3.21 0.0 OFF (off 11px)
Spinner normal light normal 91.6% 0.910 4.20 0.0 ok
CheckBox normal light normal 91.7% 0.994 0.72 0.0 ok
RadioButton normal light normal 91.7% 0.994 0.72 0.0 ok
Slider disabled dark normal 92.1% 0.943 2.45 0.0 ok
Switch selected light normal 92.1% 0.981 1.47 0.0 ok
CheckBox disabled light normal 92.3% 0.995 0.52 0.0 ok
RadioButton disabled light normal 92.3% 0.995 0.52 0.0 ok
FlatButton pressed dark glass 92.4% 0.982 1.37 0.0 ok
RaisedButton disabled light glass 92.4% 0.960 2.43 0.0 ok
Slider normal dark normal 92.5% 0.944 2.63 0.0 ok
TabsGeom normal light normal 93.1% 0.885 6.48 +0.1 OFF (off 6px)
FlatButton pressed light glass 93.3% 0.981 1.90 0.0 ok
TabsGeom normal dark normal 93.8% 0.893 4.47 +0.1 ok
FlatButton normal light glass 93.9% 0.981 1.88 0.0 ok
Slider disabled light normal 94.0% 0.963 1.75 0.0 OFF (h 4.50)
RaisedButton pressed dark glass 94.1% 0.966 2.29 0.0 ok
RaisedButton normal dark glass 94.1% 0.966 2.32 0.0 ok
RadioButton selected light normal 94.3% 0.990 0.95 0.0 ok
RaisedButton pressed light glass 94.5% 0.963 2.16 0.0 ok
GlassPanelPhoto normal dark glass 94.6% 0.951 13.16 0.0 ok
RaisedButton normal light glass 94.6% 0.963 2.17 0.0 ok
GlassPanelPhoto normal light glass 94.7% 0.951 11.57 0.0 ok
Slider normal light normal 95.1% 0.959 1.56 0.0 ok
CheckBox disabled dark normal 95.4% 0.992 0.25 0.0 ok
RadioButton disabled dark normal 95.4% 0.992 0.25 0.0 ok
Switch normal light normal 95.5% 0.986 0.70 0.0 ok
CheckBox selected light normal 95.8% 0.995 0.65 0.0 ok
CheckBox normal dark normal 95.8% 0.992 0.39 0.0 ok
RadioButton normal dark normal 95.8% 0.992 0.39 0.0 ok
Switch selected dark normal 95.9% 0.985 1.02 0.0 ok
TextField normal dark normal 96.0% 0.937 4.53 0.0 ok
RadioButton selected dark normal 96.1% 0.989 0.67 0.0 ok
Switch disabled light normal 96.4% 0.990 0.53 0.0 ok
TextField disabled dark normal 96.4% 0.940 3.39 0.0 ok
Switch normal dark normal 96.8% 0.986 0.82 0.0 ok
TabOne normal light normal 96.9% 0.948 2.57 0.0 OFF (off 6px, w 0.86)
GlassIcon normal dark normal 97.2% 0.955 3.32 0.0 ok
GlassText normal dark normal 97.3% 0.956 3.27 +0.1 ok
GlassPanelGrey normal dark normal 97.4% 0.959 3.41 0.0 ok
TabOne normal dark normal 97.4% 0.953 1.49 0.0 OFF (w 0.86)
ProgressBar normal dark normal 97.5% 0.997 0.60 0.0 ok
ProgressBar normal light normal 97.6% 0.999 0.61 0.0 ok
GlassPanelRed normal dark normal 97.7% 0.980 6.75 0.0 ok
CheckBox selected dark normal 97.9% 0.995 0.37 0.0 ok
Dialog normal dark normal 97.9% 0.961 1.38 0.0 ok
GlassPanelGrad normal dark normal 97.9% 0.975 4.86 0.0 ok
Dialog normal light normal 98.0% 0.963 1.42 0.0 ok
Switch disabled dark normal 98.0% 0.987 0.41 0.0 ok
GlassIcon normal light normal 98.2% 0.975 3.65 0.0 ok
GlassText normal light normal 98.3% 0.978 3.58 +0.1 ok
GlassPanelGrad normal light normal 98.4% 0.988 5.52 0.0 ok
GlassPanelGrey normal light normal 98.7% 0.987 3.64 0.0 ok
GlassPanelRed normal light normal 98.8% 0.990 4.14 0.0 ok
Geometry vs native (bbox offset / size ratio / center offset / corner radius) -- gated separately from the visual score
Component State Appearance bbox dx,dy (px) w ratio h ratio center off (px) radius native->cn1 (px)
Button normal dark +0,-6 1.094 1.067 10.9 90.5 -> 45.2
Button disabled dark +0,-6 1.094 1.067 10.9 92.0 -> 45.2
Button pressed dark +0,-6 1.094 1.080 10.8 79.4 -> 45.3
Button normal light +0,+0 1.094 1.000 10.5 45.7 -> 45.3
Button pressed light +0,+0 1.094 1.000 10.5 87.5 -> 45.4
Button disabled light +0,+0 1.094 1.000 10.5 49.1 -> 45.3
TabsGeom normal light +3,+0 0.990 1.069 6.1 79.8 -> 83.6
TabOne normal light +19,+0 0.863 1.069 6.1 80.9 -> 83.6
TabsGeom normal dark +3,+0 0.990 1.064 5.6 98.6 -> 99.1
TabOne normal dark +19,+0 0.863 1.064 5.6 95.2 -> 95.6
Tabs normal light +4,+0 0.988 1.064 5.5 85.9 -> 87.9
GlassIcon normal dark +1,+8 0.998 0.976 5.5 102.3 -> 102.4
GlassText normal dark +1,+8 0.998 0.976 5.5 102.3 -> 102.4
Tabs normal dark +4,+0 0.987 1.058 5.1 92.9 -> 93.7
Toolbar normal dark +6,-3 0.983 1.009 3.5 90.3 -> 55.5
Toolbar normal light +6,+7 0.984 0.926 3.2 70.9 -> 56.1
RaisedButton disabled dark +0,-6 1.009 1.079 2.7 89.6 -> 46.1
Switch selected light +0,+0 1.028 1.026 2.7 -
Slider disabled light +0,-29 1.000 4.500 2.5 -
Switch normal light +0,+0 1.023 1.013 2.1 -
Switch disabled light +0,+0 1.023 1.013 2.1 -
Switch normal dark +0,+0 1.023 1.013 2.1 -
Switch disabled dark +0,+0 1.023 1.013 2.1 -
Spinner normal light +11,-8 0.978 1.052 1.6 -
RaisedButton disabled light +0,+0 1.014 1.011 1.6 71.9 -> 96.6
FlatButton normal light +0,+0 0.980 1.011 1.6 86.2 -> 51.8
Switch selected dark +0,+0 1.017 1.013 1.6 -
Spinner normal dark +12,-8 0.977 1.052 1.5 -
CheckBox normal light +0,+0 0.977 0.977 1.4 -
RadioButton normal light +0,+0 0.977 0.977 1.4 -
RadioButton selected light +0,+0 0.977 0.977 1.4 -
CheckBox selected light +0,+0 0.977 0.977 1.4 -
CheckBox normal dark +0,+0 0.977 0.977 1.4 -
RadioButton normal dark +0,+0 0.977 0.977 1.4 -
RadioButton selected dark +0,+0 0.977 0.977 1.4 -
CheckBox selected dark +0,+0 0.977 0.977 1.4 -
FlatButton pressed light +1,+0 0.973 1.011 1.1 94.6 -> 65.6
RaisedButton pressed dark +0,+0 1.009 1.011 1.1 44.6 -> 44.3
RaisedButton normal dark +0,+0 1.009 1.011 1.1 44.5 -> 44.3
CheckBox disabled dark +1,+0 0.966 0.977 1.1 -
RadioButton disabled dark +1,+0 0.966 0.977 1.1 -
RaisedButton pressed light +0,+0 1.009 1.000 1.0 43.3 -> 44.3
RaisedButton normal light +0,+0 1.009 1.000 1.0 43.3 -> 44.1
FlatButton normal dark +4,+0 0.952 1.011 0.7 86.1 -> 95.7
FlatButton pressed dark +4,+0 0.952 1.011 0.7 94.7 -> 97.9
GlassPanelPhoto normal light +1,+1 0.997 0.995 0.7 35.1 -> 33.5
GlassPanelGrey normal light +1,+1 0.997 0.995 0.7 30.0 -> 27.4
Slider disabled dark +0,-1 1.000 1.015 0.5 -
CheckBox disabled light +1,+0 0.977 0.988 0.5 -
RadioButton disabled light +1,+0 0.977 0.988 0.5 -
Slider normal light +0,+1 1.000 0.964 0.5 -
GlassPanelGrey normal dark +1,+2 0.998 0.986 0.5 101.8 -> 102.4
ProgressBar normal dark +0,+0 1.000 0.900 0.5 -
ProgressBar normal light +0,+0 1.000 0.900 0.5 -
GlassPanelGrad normal dark +1,+0 0.998 0.995 0.5 102.0 -> 102.1
GlassIcon normal light +1,+0 0.998 1.005 0.5 91.7 -> 92.8
GlassText normal light +1,+0 0.998 1.005 0.5 91.7 -> 92.8
GlassPanelGrad normal light +1,+0 0.998 1.005 0.5 24.3 -> 26.8
GlassPanelRed normal light +1,+0 0.998 1.005 0.5 24.4 -> 25.7
TextField normal light +0,+0 1.000 1.000 0.0 13.4 -> 40.0
TextField disabled light +0,+0 1.000 1.000 0.0 13.9 -> 40.4
Slider normal dark +0,+0 1.000 1.000 0.0 -
GlassPanelPhoto normal dark +2,+1 0.996 0.991 0.0 67.3 -> 67.5
TextField normal dark +0,+0 1.000 1.000 0.0 6.4 -> 15.1
TextField disabled dark +0,+0 1.000 1.000 0.0 6.4 -> 15.9
GlassPanelRed normal dark +1,-2 0.998 1.020 0.0 102.2 -> 102.5
Dialog normal dark +0,+0 1.000 1.000 0.0 -
Dialog normal light +0,+0 1.000 1.000 0.0 -

Side-by-side comparisons (worst first)

  • Toolbar_normal_dark -- 74.49% fidelity (SSIM 0.9295) (no change)

    native Toolbar_normal_dark cn1 Toolbar_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_normal_dark -- 79.28% fidelity (SSIM 0.9380) (no change)

    native Button_normal_dark cn1 Button_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_disabled_dark -- 79.63% fidelity (SSIM 0.9423) (no change)

    native Button_disabled_dark cn1 Button_disabled_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_disabled_dark -- 81.15% fidelity (SSIM 0.9544) (no change)

    native RaisedButton_disabled_dark cn1 RaisedButton_disabled_dark
    Left: native widget. Right: Codename One render.

  • Tabs_normal_dark -- 86.22% fidelity (SSIM 0.8999) (+0.33 vs baseline)

    native Tabs_normal_dark cn1 Tabs_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_pressed_dark -- 86.28% fidelity (SSIM 0.9483) (no change)

    native Button_pressed_dark cn1 Button_pressed_dark
    Left: native widget. Right: Codename One render.

  • Tabs_normal_light -- 86.43% fidelity (SSIM 0.8954) (+0.31 vs baseline)

    native Tabs_normal_light cn1 Tabs_normal_light
    Left: native widget. Right: Codename One render.

  • TextField_normal_light -- 86.49% fidelity (SSIM 0.9502) (no change)

    native TextField_normal_light cn1 TextField_normal_light
    Left: native widget. Right: Codename One render.

  • Toolbar_normal_light -- 86.94% fidelity (SSIM 0.9488) (no change)

    native Toolbar_normal_light cn1 Toolbar_normal_light
    Left: native widget. Right: Codename One render.

  • TextField_disabled_light -- 89.39% fidelity (SSIM 0.9540) (no change)

    native TextField_disabled_light cn1 TextField_disabled_light
    Left: native widget. Right: Codename One render.

  • Button_normal_light -- 89.45% fidelity (SSIM 0.9588) (no change)

    native Button_normal_light cn1 Button_normal_light
    Left: native widget. Right: Codename One render.

  • Button_pressed_light -- 89.45% fidelity (SSIM 0.9588) (no change)

    native Button_pressed_light cn1 Button_pressed_light
    Left: native widget. Right: Codename One render.

  • Spinner_normal_dark -- 90.72% fidelity (SSIM 0.8800) (no change)

    native Spinner_normal_dark cn1 Spinner_normal_dark
    Left: native widget. Right: Codename One render.

  • FlatButton_normal_dark -- 90.88% fidelity (SSIM 0.9805) (no change)

    native FlatButton_normal_dark cn1 FlatButton_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_disabled_light -- 91.57% fidelity (SSIM 0.9621) (no change)

    native Button_disabled_light cn1 Button_disabled_light
    Left: native widget. Right: Codename One render.

  • Spinner_normal_light -- 91.58% fidelity (SSIM 0.9097) (no change)

    native Spinner_normal_light cn1 Spinner_normal_light
    Left: native widget. Right: Codename One render.

  • CheckBox_normal_light -- 91.66% fidelity (SSIM 0.9935) (no change)

    native CheckBox_normal_light cn1 CheckBox_normal_light
    Left: native widget. Right: Codename One render.

  • RadioButton_normal_light -- 91.66% fidelity (SSIM 0.9935) (no change)

    native RadioButton_normal_light cn1 RadioButton_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_disabled_dark -- 92.13% fidelity (SSIM 0.9434) (no change)

    native Slider_disabled_dark cn1 Slider_disabled_dark
    Left: native widget. Right: Codename One render.

  • Switch_selected_light -- 92.13% fidelity (SSIM 0.9806) (no change)

    native Switch_selected_light cn1 Switch_selected_light
    Left: native widget. Right: Codename One render.

  • CheckBox_disabled_light -- 92.31% fidelity (SSIM 0.9948) (no change)

    native CheckBox_disabled_light cn1 CheckBox_disabled_light
    Left: native widget. Right: Codename One render.

  • RadioButton_disabled_light -- 92.31% fidelity (SSIM 0.9948) (no change)

    native RadioButton_disabled_light cn1 RadioButton_disabled_light
    Left: native widget. Right: Codename One render.

  • FlatButton_pressed_dark -- 92.38% fidelity (SSIM 0.9821) (no change)

    native FlatButton_pressed_dark cn1 FlatButton_pressed_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_disabled_light -- 92.40% fidelity (SSIM 0.9596) (no change)

    native RaisedButton_disabled_light cn1 RaisedButton_disabled_light
    Left: native widget. Right: Codename One render.

  • Slider_normal_dark -- 92.52% fidelity (SSIM 0.9441) (no change)

    native Slider_normal_dark cn1 Slider_normal_dark
    Left: native widget. Right: Codename One render.

  • TabsGeom_normal_light -- 93.13% fidelity (SSIM 0.8851) (+0.14 vs baseline)

    native TabsGeom_normal_light cn1 TabsGeom_normal_light
    Left: native widget. Right: Codename One render.

  • FlatButton_pressed_light -- 93.29% fidelity (SSIM 0.9811) (no change)

    native FlatButton_pressed_light cn1 FlatButton_pressed_light
    Left: native widget. Right: Codename One render.

  • TabsGeom_normal_dark -- 93.81% fidelity (SSIM 0.8925) (+0.14 vs baseline)

    native TabsGeom_normal_dark cn1 TabsGeom_normal_dark
    Left: native widget. Right: Codename One render.

  • FlatButton_normal_light -- 93.91% fidelity (SSIM 0.9811) (no change)

    native FlatButton_normal_light cn1 FlatButton_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_disabled_light -- 93.96% fidelity (SSIM 0.9625) (no change)

    native Slider_disabled_light cn1 Slider_disabled_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_pressed_dark -- 94.08% fidelity (SSIM 0.9659) (no change)

    native RaisedButton_pressed_dark cn1 RaisedButton_pressed_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_normal_dark -- 94.13% fidelity (SSIM 0.9660) (no change)

    native RaisedButton_normal_dark cn1 RaisedButton_normal_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_selected_light -- 94.26% fidelity (SSIM 0.9903) (no change)

    native RadioButton_selected_light cn1 RadioButton_selected_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_pressed_light -- 94.53% fidelity (SSIM 0.9633) (no change)

    native RaisedButton_pressed_light cn1 RaisedButton_pressed_light
    Left: native widget. Right: Codename One render.

  • GlassPanelPhoto_normal_dark -- 94.60% fidelity (SSIM 0.9505) (no change)

    native GlassPanelPhoto_normal_dark cn1 GlassPanelPhoto_normal_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_normal_light -- 94.64% fidelity (SSIM 0.9632) (no change)

    native RaisedButton_normal_light cn1 RaisedButton_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelPhoto_normal_light -- 94.66% fidelity (SSIM 0.9507) (no change)

    native GlassPanelPhoto_normal_light cn1 GlassPanelPhoto_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_normal_light -- 95.09% fidelity (SSIM 0.9588) (no change)

    native Slider_normal_light cn1 Slider_normal_light
    Left: native widget. Right: Codename One render.

  • CheckBox_disabled_dark -- 95.41% fidelity (SSIM 0.9924) (no change)

    native CheckBox_disabled_dark cn1 CheckBox_disabled_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_disabled_dark -- 95.41% fidelity (SSIM 0.9924) (no change)

    native RadioButton_disabled_dark cn1 RadioButton_disabled_dark
    Left: native widget. Right: Codename One render.

  • Switch_normal_light -- 95.51% fidelity (SSIM 0.9863) (no change)

    native Switch_normal_light cn1 Switch_normal_light
    Left: native widget. Right: Codename One render.

  • CheckBox_selected_light -- 95.80% fidelity (SSIM 0.9951) (no change)

    native CheckBox_selected_light cn1 CheckBox_selected_light
    Left: native widget. Right: Codename One render.

  • CheckBox_normal_dark -- 95.84% fidelity (SSIM 0.9922) (no change)

    native CheckBox_normal_dark cn1 CheckBox_normal_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_normal_dark -- 95.84% fidelity (SSIM 0.9922) (no change)

    native RadioButton_normal_dark cn1 RadioButton_normal_dark
    Left: native widget. Right: Codename One render.

  • Switch_selected_dark -- 95.90% fidelity (SSIM 0.9850) (no change)

    native Switch_selected_dark cn1 Switch_selected_dark
    Left: native widget. Right: Codename One render.

  • TextField_normal_dark -- 96.00% fidelity (SSIM 0.9370) (no change)

    native TextField_normal_dark cn1 TextField_normal_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_selected_dark -- 96.13% fidelity (SSIM 0.9894) (no change)

    native RadioButton_selected_dark cn1 RadioButton_selected_dark
    Left: native widget. Right: Codename One render.

  • Switch_disabled_light -- 96.35% fidelity (SSIM 0.9896) (no change)

    native Switch_disabled_light cn1 Switch_disabled_light
    Left: native widget. Right: Codename One render.

  • TextField_disabled_dark -- 96.35% fidelity (SSIM 0.9395) (no change)

    native TextField_disabled_dark cn1 TextField_disabled_dark
    Left: native widget. Right: Codename One render.

  • Switch_normal_dark -- 96.80% fidelity (SSIM 0.9855) (no change)

    native Switch_normal_dark cn1 Switch_normal_dark
    Left: native widget. Right: Codename One render.

  • TabOne_normal_light -- 96.90% fidelity (SSIM 0.9480) (no change)

    native TabOne_normal_light cn1 TabOne_normal_light
    Left: native widget. Right: Codename One render.

  • GlassIcon_normal_dark -- 97.18% fidelity (SSIM 0.9547) (no change)

    native GlassIcon_normal_dark cn1 GlassIcon_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassText_normal_dark -- 97.27% fidelity (SSIM 0.9563) (+0.06 vs baseline)

    native GlassText_normal_dark cn1 GlassText_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassPanelGrey_normal_dark -- 97.35% fidelity (SSIM 0.9588) (no change)

    native GlassPanelGrey_normal_dark cn1 GlassPanelGrey_normal_dark
    Left: native widget. Right: Codename One render.

  • TabOne_normal_dark -- 97.36% fidelity (SSIM 0.9531) (no change)

    native TabOne_normal_dark cn1 TabOne_normal_dark
    Left: native widget. Right: Codename One render.

  • ProgressBar_normal_dark -- 97.47% fidelity (SSIM 0.9973) (no change)

    native ProgressBar_normal_dark cn1 ProgressBar_normal_dark
    Left: native widget. Right: Codename One render.

  • ProgressBar_normal_light -- 97.60% fidelity (SSIM 0.9989) (no change)

    native ProgressBar_normal_light cn1 ProgressBar_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelRed_normal_dark -- 97.73% fidelity (SSIM 0.9795) (no change)

    native GlassPanelRed_normal_dark cn1 GlassPanelRed_normal_dark
    Left: native widget. Right: Codename One render.

  • CheckBox_selected_dark -- 97.85% fidelity (SSIM 0.9945) (no change)

    native CheckBox_selected_dark cn1 CheckBox_selected_dark
    Left: native widget. Right: Codename One render.

  • Dialog_normal_dark -- 97.86% fidelity (SSIM 0.9614) (no change)

    native Dialog_normal_dark cn1 Dialog_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassPanelGrad_normal_dark -- 97.91% fidelity (SSIM 0.9752) (no change)

    native GlassPanelGrad_normal_dark cn1 GlassPanelGrad_normal_dark
    Left: native widget. Right: Codename One render.

  • Dialog_normal_light -- 97.95% fidelity (SSIM 0.9634) (no change)

    native Dialog_normal_light cn1 Dialog_normal_light
    Left: native widget. Right: Codename One render.

  • Switch_disabled_dark -- 98.01% fidelity (SSIM 0.9869) (no change)

    native Switch_disabled_dark cn1 Switch_disabled_dark
    Left: native widget. Right: Codename One render.

  • GlassIcon_normal_light -- 98.16% fidelity (SSIM 0.9750) (no change)

    native GlassIcon_normal_light cn1 GlassIcon_normal_light
    Left: native widget. Right: Codename One render.

  • GlassText_normal_light -- 98.31% fidelity (SSIM 0.9779) (+0.06 vs baseline)

    native GlassText_normal_light cn1 GlassText_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelGrad_normal_light -- 98.41% fidelity (SSIM 0.9876) (no change)

    native GlassPanelGrad_normal_light cn1 GlassPanelGrad_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelGrey_normal_light -- 98.70% fidelity (SSIM 0.9865) (no change)

    native GlassPanelGrey_normal_light cn1 GlassPanelGrey_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelRed_normal_light -- 98.78% fidelity (SSIM 0.9900) (no change)

    native GlassPanelRed_normal_light cn1 GlassPanelRed_normal_light
    Left: native widget. Right: Codename One render.

@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-11T05:05:23.023143Z 8c2e73d Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f2af86e5ba

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/flutter-bench/run_bench.py Outdated
Comment thread .github/workflows/flutter-bench.yml Outdated
Comment thread maven/dart-runtime/src/main/java/dart/async/Future.java Outdated
Comment thread scripts/flutter-bench/platforms.py Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DateTime.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DartUri.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/math/DartMath.java Outdated
Comment thread scripts/flutter-bench/platforms.py Fixed
Comment thread scripts/flutter-bench/platforms.py Fixed
@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Native fidelity (iOS Modern, Metal)

68 pairs compared -- median 95.0%, worst 83.5% (Tabs_normal_dark), 25th pct 92.5%, mean 94.6%.

Distribution -- >=99%: 3 | 95-99%: 31 | 90-95%: 29 | <90%: 5

Component State Appearance Material Fidelity SSIM mean delta vs base Geometry
Tabs normal dark glass 83.5% 0.884 11.66 0.0 ok
Tabs normal light glass 86.4% 0.896 8.00 0.0 ok
Toolbar normal light glass 87.6% 0.951 4.24 0.0 ok
Toolbar normal dark glass 87.7% 0.950 3.69 0.0 ok
Button pressed dark glass 89.9% 0.958 4.21 0.0 OFF (off 12px, w 1.10)
TextField normal light normal 90.0% 0.958 2.78 -0.4 ok
Spinner normal dark normal 90.8% 0.881 3.39 -0.7 ok
TextField disabled light normal 91.1% 0.962 2.24 -0.2 ok
Spinner normal light normal 91.6% 0.910 4.11 -0.2 ok
RaisedButton disabled light glass 91.8% 0.961 3.09 +0.2 ok
Button normal dark glass 91.8% 0.958 3.52 0.0 OFF (off 12px, w 1.10)
Slider disabled dark normal 92.1% 0.943 2.45 -0.3 ok
Switch selected light normal 92.1% 0.981 1.47 0.0 ok
CheckBox normal light normal 92.2% 0.994 0.68 0.0 ok
RadioButton normal light normal 92.2% 0.994 0.68 0.0 ok
FlatButton normal dark glass 92.2% 0.983 2.21 +4.3 ok
Button normal light glass 92.4% 0.961 3.65 0.0 OFF (off 12px, w 1.10)
Slider normal dark normal 92.5% 0.944 2.63 -0.2 ok
RaisedButton disabled dark glass 92.7% 0.965 2.72 +1.3 ok
CheckBox disabled light normal 92.7% 0.995 0.50 0.0 ok
RadioButton disabled light normal 92.7% 0.995 0.50 0.0 ok
Button pressed light glass 92.9% 0.962 3.29 0.0 OFF (off 12px, w 1.10)
FlatButton pressed dark glass 92.9% 0.985 1.26 +2.3 ok
TabsGeom normal dark normal 93.0% 0.892 8.75 0.0 ok
TabsGeom normal light normal 93.0% 0.886 7.09 0.0 ok
FlatButton pressed light glass 93.2% 0.982 1.90 +4.3 ok
Button disabled dark glass 93.5% 0.962 2.47 0.0 OFF (off 12px, w 1.10)
Slider disabled light normal 94.0% 0.963 1.75 -0.1 OFF (h 4.50)
FlatButton normal light glass 94.2% 0.983 1.79 +1.3 ok
Button disabled light glass 94.4% 0.964 2.36 0.0 OFF (off 12px, w 1.10)
RaisedButton pressed dark glass 94.6% 0.965 2.07 +1.5 ok
RaisedButton normal dark glass 94.6% 0.966 2.08 +1.7 ok
RaisedButton pressed light glass 94.8% 0.967 2.22 +2.0 ok
RadioButton selected light normal 94.8% 0.992 0.86 0.0 ok
RaisedButton normal light glass 95.0% 0.967 2.19 +2.4 ok
Slider normal light normal 95.1% 0.959 1.56 0.0 ok
Switch normal light normal 95.5% 0.986 0.70 0.0 ok
CheckBox disabled dark normal 95.8% 0.993 0.25 0.0 ok
RadioButton disabled dark normal 95.8% 0.993 0.25 0.0 ok
CheckBox selected light normal 95.8% 0.994 0.67 0.0 ok
Switch selected dark normal 95.9% 0.985 1.02 0.0 ok
Switch disabled light normal 96.4% 0.990 0.53 0.0 ok
CheckBox normal dark normal 96.5% 0.993 0.35 0.0 ok
RadioButton normal dark normal 96.5% 0.993 0.35 0.0 ok
GlassPanelPhoto normal light glass 96.7% 0.980 7.95 +0.6 ok
GlassPanelPhoto normal dark glass 96.8% 0.983 8.78 +0.6 ok
TabOne normal dark normal 96.8% 0.953 4.44 +0.7 ok
Switch normal dark normal 96.8% 0.986 0.82 0.0 ok
RadioButton selected dark normal 96.8% 0.991 0.57 0.0 ok
TextField normal dark normal 96.9% 0.949 3.30 -0.2 ok
TextField disabled dark normal 97.2% 0.953 2.37 -0.2 ok
ProgressBar normal dark normal 97.5% 0.997 0.60 +3.0 ok
TabOne normal light normal 97.5% 0.961 2.90 +1.9 ok
ProgressBar normal light normal 97.6% 0.999 0.61 +2.2 ok
CheckBox selected dark normal 97.8% 0.993 0.38 0.0 ok
Dialog normal dark normal 97.9% 0.961 1.38 +0.9 ok
Dialog normal light normal 98.0% 0.963 1.42 +0.9 ok
Switch disabled dark normal 98.0% 0.987 0.41 +2.5 ok
GlassIcon normal dark normal 98.6% 0.984 3.55 0.0 ok
GlassText normal dark normal 98.6% 0.985 3.48 0.0 ok
GlassIcon normal light normal 98.7% 0.986 3.54 0.0 ok
GlassText normal light normal 98.7% 0.987 3.54 0.0 ok
GlassPanelGrad normal light normal 98.9% 0.994 4.38 +0.7 ok
GlassPanelGrad normal dark normal 99.0% 0.993 3.84 +0.5 ok
GlassPanelGrey normal dark normal 99.0% 0.992 3.30 +0.6 ok
GlassPanelGrey normal light normal 99.1% 0.994 3.29 +0.7 ok
GlassPanelRed normal dark normal 99.1% 0.993 3.22 +0.5 ok
GlassPanelRed normal light normal 99.1% 0.994 3.49 +0.7 ok
Geometry vs native (bbox offset / size ratio / center offset / corner radius) -- gated separately from the visual score
Component State Appearance bbox dx,dy (px) w ratio h ratio center off (px) radius native->cn1 (px)
Button pressed dark +0,+0 1.104 1.000 11.5 45.4 -> 45.3
Button normal dark +0,+0 1.104 1.000 11.5 45.8 -> 45.2
Button normal light +0,+0 1.104 1.000 11.5 44.5 -> 45.3
Button pressed light +0,+0 1.104 1.000 11.5 48.1 -> 45.4
Button disabled dark +0,+0 1.104 1.000 11.5 45.1 -> 45.2
Button disabled light +0,+0 1.104 1.000 11.5 44.0 -> 45.3
TabOne normal dark -3,+0 1.007 0.948 4.9 80.3 -> 77.3
TabOne normal light -3,+0 1.007 0.948 4.9 79.1 -> 77.0
Toolbar normal light +4,+7 0.987 0.926 3.5 62.5 -> 56.1
Toolbar normal dark +4,+7 0.987 0.919 3.2 60.5 -> 55.5
Switch selected light +0,+0 1.028 1.026 2.7 -
RaisedButton disabled dark +0,+0 1.024 1.011 2.6 49.8 -> 46.1
Slider disabled light +0,-29 1.000 4.500 2.5 -
CheckBox disabled light +1,-3 1.000 1.023 2.2 -
RadioButton disabled light +1,-3 1.000 1.023 2.2 -
CheckBox disabled dark +1,-3 1.000 1.023 2.2 -
RadioButton disabled dark +1,-3 1.000 1.023 2.2 -
RaisedButton disabled light +0,+0 1.019 1.011 2.1 54.1 -> 96.6
RaisedButton pressed dark +0,+0 1.019 1.011 2.1 44.5 -> 44.3
RaisedButton normal dark +0,+0 1.019 1.011 2.1 44.4 -> 44.3
RaisedButton pressed light +0,+0 1.019 1.011 2.1 44.7 -> 44.3
RaisedButton normal light +0,+0 1.019 1.011 2.1 44.5 -> 44.1
Switch normal light +0,+0 1.023 1.013 2.1 -
Switch disabled light +0,+0 1.023 1.013 2.1 -
Switch normal dark +0,+0 1.023 1.013 2.1 -
Switch disabled dark +0,+0 1.023 1.013 2.1 -
CheckBox normal dark +0,-2 1.000 1.000 2.0 -
RadioButton normal dark +0,-2 1.000 1.000 2.0 -
RadioButton selected dark +0,-2 1.000 1.000 2.0 -
CheckBox selected dark +0,-2 1.000 1.000 2.0 -
Tabs normal dark +9,+0 0.973 1.012 1.8 79.7 -> 80.7
Tabs normal light +9,+0 0.973 1.012 1.8 79.2 -> 80.3
TabsGeom normal dark +9,+0 0.973 1.012 1.8 80.5 -> 80.9
TabsGeom normal light +9,+0 0.973 1.012 1.8 79.3 -> 80.6
FlatButton normal dark +4,+0 0.966 1.011 1.6 91.8 -> 95.7
FlatButton pressed dark +4,+0 0.966 1.011 1.6 95.3 -> 97.9
Switch selected dark +0,+0 1.017 1.013 1.6 -
CheckBox normal light +0,-2 1.000 1.011 1.5 -
RadioButton normal light +0,-2 1.000 1.011 1.5 -
RadioButton selected light +0,-2 1.000 1.011 1.5 -
CheckBox selected light +0,-2 1.000 1.011 1.5 -
Spinner normal light +11,-9 0.978 1.055 1.1 -
GlassIcon normal dark +0,+1 0.999 1.000 1.1 92.1 -> 91.5
GlassText normal dark +0,+1 0.999 1.000 1.1 92.1 -> 91.5
Spinner normal dark +12,-9 0.977 1.055 1.0 -
GlassPanelGrey normal dark +0,+1 1.000 1.000 1.0 26.4 -> 26.9
TextField disabled light +0,+1 0.999 0.996 0.7 13.9 -> 38.7
FlatButton normal light +0,+0 0.993 1.011 0.7 91.9 -> 51.8
Slider disabled dark +0,-1 1.000 1.015 0.5 -
FlatButton pressed light +1,+0 0.986 1.011 0.5 95.4 -> 65.6
Slider normal light +0,+1 1.000 0.964 0.5 -
GlassPanelPhoto normal light +0,+0 1.000 1.005 0.5 25.6 -> 31.4
GlassPanelPhoto normal dark +0,+0 1.000 1.005 0.5 23.0 -> 27.0
ProgressBar normal dark +0,+0 1.000 0.900 0.5 -
ProgressBar normal light +0,+0 1.000 0.900 0.5 -
GlassIcon normal light +0,+0 1.000 1.005 0.5 91.6 -> 92.3
GlassText normal light +0,+0 1.000 1.005 0.5 91.6 -> 92.3
GlassPanelGrad normal light +0,+0 1.000 1.005 0.5 22.3 -> 25.9
GlassPanelGrad normal dark +1,+1 0.998 0.995 0.5 25.7 -> 22.5
GlassPanelGrey normal light +0,+0 1.000 1.005 0.5 22.4 -> 26.0
GlassPanelRed normal dark +1,+1 0.998 0.995 0.5 26.6 -> 22.8
GlassPanelRed normal light +0,+0 1.000 1.005 0.5 22.1 -> 26.1
TextField normal light +0,+0 1.000 1.000 0.0 13.4 -> 40.5
Slider normal dark +0,+0 1.000 1.000 0.0 -
TextField normal dark +0,+0 1.000 1.000 0.0 6.4 -> 15.1
TextField disabled dark +0,+0 1.000 1.000 0.0 6.4 -> 15.9
Dialog normal dark +0,+0 1.000 1.000 0.0 -
Dialog normal light +0,+0 1.000 1.000 0.0 -

Side-by-side comparisons (worst first)

  • Tabs_normal_dark -- 83.45% fidelity (SSIM 0.8842) (no change)

    native Tabs_normal_dark cn1 Tabs_normal_dark
    Left: native widget. Right: Codename One render.

  • Tabs_normal_light -- 86.44% fidelity (SSIM 0.8961) (no change)

    native Tabs_normal_light cn1 Tabs_normal_light
    Left: native widget. Right: Codename One render.

  • Toolbar_normal_light -- 87.64% fidelity (SSIM 0.9511) (no change)

    native Toolbar_normal_light cn1 Toolbar_normal_light
    Left: native widget. Right: Codename One render.

  • Toolbar_normal_dark -- 87.70% fidelity (SSIM 0.9495) (no change)

    native Toolbar_normal_dark cn1 Toolbar_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_pressed_dark -- 89.93% fidelity (SSIM 0.9576) (no change)

    native Button_pressed_dark cn1 Button_pressed_dark
    Left: native widget. Right: Codename One render.

  • TextField_normal_light -- 90.03% fidelity (SSIM 0.9576) (-0.37 vs baseline)

    native TextField_normal_light cn1 TextField_normal_light
    Left: native widget. Right: Codename One render.

  • Spinner_normal_dark -- 90.78% fidelity (SSIM 0.8814) (-0.69 vs baseline)

    native Spinner_normal_dark cn1 Spinner_normal_dark
    Left: native widget. Right: Codename One render.

  • TextField_disabled_light -- 91.13% fidelity (SSIM 0.9619) (-0.22 vs baseline)

    native TextField_disabled_light cn1 TextField_disabled_light
    Left: native widget. Right: Codename One render.

  • Spinner_normal_light -- 91.58% fidelity (SSIM 0.9099) (-0.21 vs baseline)

    native Spinner_normal_light cn1 Spinner_normal_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_disabled_light -- 91.76% fidelity (SSIM 0.9613) (+0.15 vs baseline)

    native RaisedButton_disabled_light cn1 RaisedButton_disabled_light
    Left: native widget. Right: Codename One render.

  • Button_normal_dark -- 91.84% fidelity (SSIM 0.9583) (no change)

    native Button_normal_dark cn1 Button_normal_dark
    Left: native widget. Right: Codename One render.

  • Slider_disabled_dark -- 92.13% fidelity (SSIM 0.9434) (-0.31 vs baseline)

    native Slider_disabled_dark cn1 Slider_disabled_dark
    Left: native widget. Right: Codename One render.

  • Switch_selected_light -- 92.13% fidelity (SSIM 0.9806) (no change)

    native Switch_selected_light cn1 Switch_selected_light
    Left: native widget. Right: Codename One render.

  • CheckBox_normal_light -- 92.16% fidelity (SSIM 0.9938) (no change)

    native CheckBox_normal_light cn1 CheckBox_normal_light
    Left: native widget. Right: Codename One render.

  • RadioButton_normal_light -- 92.16% fidelity (SSIM 0.9938) (no change)

    native RadioButton_normal_light cn1 RadioButton_normal_light
    Left: native widget. Right: Codename One render.

  • FlatButton_normal_dark -- 92.21% fidelity (SSIM 0.9833) (+4.25 vs baseline)

    native FlatButton_normal_dark cn1 FlatButton_normal_dark
    Left: native widget. Right: Codename One render.

  • Button_normal_light -- 92.37% fidelity (SSIM 0.9609) (no change)

    native Button_normal_light cn1 Button_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_normal_dark -- 92.52% fidelity (SSIM 0.9441) (-0.22 vs baseline)

    native Slider_normal_dark cn1 Slider_normal_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_disabled_dark -- 92.65% fidelity (SSIM 0.9653) (+1.25 vs baseline)

    native RaisedButton_disabled_dark cn1 RaisedButton_disabled_dark
    Left: native widget. Right: Codename One render.

  • CheckBox_disabled_light -- 92.71% fidelity (SSIM 0.9953) (no change)

    native CheckBox_disabled_light cn1 CheckBox_disabled_light
    Left: native widget. Right: Codename One render.

  • RadioButton_disabled_light -- 92.71% fidelity (SSIM 0.9953) (no change)

    native RadioButton_disabled_light cn1 RadioButton_disabled_light
    Left: native widget. Right: Codename One render.

  • Button_pressed_light -- 92.88% fidelity (SSIM 0.9617) (no change)

    native Button_pressed_light cn1 Button_pressed_light
    Left: native widget. Right: Codename One render.

  • FlatButton_pressed_dark -- 92.90% fidelity (SSIM 0.9849) (+2.31 vs baseline)

    native FlatButton_pressed_dark cn1 FlatButton_pressed_dark
    Left: native widget. Right: Codename One render.

  • TabsGeom_normal_dark -- 93.02% fidelity (SSIM 0.8921) (+0.01 vs baseline)

    native TabsGeom_normal_dark cn1 TabsGeom_normal_dark
    Left: native widget. Right: Codename One render.

  • TabsGeom_normal_light -- 93.02% fidelity (SSIM 0.8861) (no change)

    native TabsGeom_normal_light cn1 TabsGeom_normal_light
    Left: native widget. Right: Codename One render.

  • FlatButton_pressed_light -- 93.20% fidelity (SSIM 0.9819) (+4.33 vs baseline)

    native FlatButton_pressed_light cn1 FlatButton_pressed_light
    Left: native widget. Right: Codename One render.

  • Button_disabled_dark -- 93.52% fidelity (SSIM 0.9618) (no change)

    native Button_disabled_dark cn1 Button_disabled_dark
    Left: native widget. Right: Codename One render.

  • Slider_disabled_light -- 93.96% fidelity (SSIM 0.9625) (-0.05 vs baseline)

    native Slider_disabled_light cn1 Slider_disabled_light
    Left: native widget. Right: Codename One render.

  • FlatButton_normal_light -- 94.18% fidelity (SSIM 0.9825) (+1.32 vs baseline)

    native FlatButton_normal_light cn1 FlatButton_normal_light
    Left: native widget. Right: Codename One render.

  • Button_disabled_light -- 94.35% fidelity (SSIM 0.9636) (no change)

    native Button_disabled_light cn1 Button_disabled_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_pressed_dark -- 94.56% fidelity (SSIM 0.9653) (+1.46 vs baseline)

    native RaisedButton_pressed_dark cn1 RaisedButton_pressed_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_normal_dark -- 94.57% fidelity (SSIM 0.9659) (+1.69 vs baseline)

    native RaisedButton_normal_dark cn1 RaisedButton_normal_dark
    Left: native widget. Right: Codename One render.

  • RaisedButton_pressed_light -- 94.80% fidelity (SSIM 0.9665) (+2.04 vs baseline)

    native RaisedButton_pressed_light cn1 RaisedButton_pressed_light
    Left: native widget. Right: Codename One render.

  • RadioButton_selected_light -- 94.84% fidelity (SSIM 0.9916) (no change)

    native RadioButton_selected_light cn1 RadioButton_selected_light
    Left: native widget. Right: Codename One render.

  • RaisedButton_normal_light -- 95.01% fidelity (SSIM 0.9673) (+2.40 vs baseline)

    native RaisedButton_normal_light cn1 RaisedButton_normal_light
    Left: native widget. Right: Codename One render.

  • Slider_normal_light -- 95.09% fidelity (SSIM 0.9588) (-0.04 vs baseline)

    native Slider_normal_light cn1 Slider_normal_light
    Left: native widget. Right: Codename One render.

  • Switch_normal_light -- 95.51% fidelity (SSIM 0.9863) (no change)

    native Switch_normal_light cn1 Switch_normal_light
    Left: native widget. Right: Codename One render.

  • CheckBox_disabled_dark -- 95.76% fidelity (SSIM 0.9928) (no change)

    native CheckBox_disabled_dark cn1 CheckBox_disabled_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_disabled_dark -- 95.76% fidelity (SSIM 0.9928) (no change)

    native RadioButton_disabled_dark cn1 RadioButton_disabled_dark
    Left: native widget. Right: Codename One render.

  • CheckBox_selected_light -- 95.80% fidelity (SSIM 0.9938) (no change)

    native CheckBox_selected_light cn1 CheckBox_selected_light
    Left: native widget. Right: Codename One render.

  • Switch_selected_dark -- 95.90% fidelity (SSIM 0.9850) (no change)

    native Switch_selected_dark cn1 Switch_selected_dark
    Left: native widget. Right: Codename One render.

  • Switch_disabled_light -- 96.35% fidelity (SSIM 0.9896) (+0.04 vs baseline)

    native Switch_disabled_light cn1 Switch_disabled_light
    Left: native widget. Right: Codename One render.

  • CheckBox_normal_dark -- 96.52% fidelity (SSIM 0.9927) (no change)

    native CheckBox_normal_dark cn1 CheckBox_normal_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_normal_dark -- 96.52% fidelity (SSIM 0.9927) (no change)

    native RadioButton_normal_dark cn1 RadioButton_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassPanelPhoto_normal_light -- 96.72% fidelity (SSIM 0.9804) (+0.64 vs baseline)

    native GlassPanelPhoto_normal_light cn1 GlassPanelPhoto_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelPhoto_normal_dark -- 96.76% fidelity (SSIM 0.9832) (+0.59 vs baseline)

    native GlassPanelPhoto_normal_dark cn1 GlassPanelPhoto_normal_dark
    Left: native widget. Right: Codename One render.

  • TabOne_normal_dark -- 96.77% fidelity (SSIM 0.9526) (+0.73 vs baseline)

    native TabOne_normal_dark cn1 TabOne_normal_dark
    Left: native widget. Right: Codename One render.

  • Switch_normal_dark -- 96.80% fidelity (SSIM 0.9855) (no change)

    native Switch_normal_dark cn1 Switch_normal_dark
    Left: native widget. Right: Codename One render.

  • RadioButton_selected_dark -- 96.81% fidelity (SSIM 0.9908) (no change)

    native RadioButton_selected_dark cn1 RadioButton_selected_dark
    Left: native widget. Right: Codename One render.

  • TextField_normal_dark -- 96.88% fidelity (SSIM 0.9492) (-0.20 vs baseline)

    native TextField_normal_dark cn1 TextField_normal_dark
    Left: native widget. Right: Codename One render.

  • TextField_disabled_dark -- 97.19% fidelity (SSIM 0.9526) (-0.15 vs baseline)

    native TextField_disabled_dark cn1 TextField_disabled_dark
    Left: native widget. Right: Codename One render.

  • ProgressBar_normal_dark -- 97.47% fidelity (SSIM 0.9973) (+3.03 vs baseline)

    native ProgressBar_normal_dark cn1 ProgressBar_normal_dark
    Left: native widget. Right: Codename One render.

  • TabOne_normal_light -- 97.51% fidelity (SSIM 0.9608) (+1.89 vs baseline)

    native TabOne_normal_light cn1 TabOne_normal_light
    Left: native widget. Right: Codename One render.

  • ProgressBar_normal_light -- 97.60% fidelity (SSIM 0.9989) (+2.19 vs baseline)

    native ProgressBar_normal_light cn1 ProgressBar_normal_light
    Left: native widget. Right: Codename One render.

  • CheckBox_selected_dark -- 97.79% fidelity (SSIM 0.9932) (no change)

    native CheckBox_selected_dark cn1 CheckBox_selected_dark
    Left: native widget. Right: Codename One render.

  • Dialog_normal_dark -- 97.86% fidelity (SSIM 0.9614) (+0.89 vs baseline)

    native Dialog_normal_dark cn1 Dialog_normal_dark
    Left: native widget. Right: Codename One render.

  • Dialog_normal_light -- 97.95% fidelity (SSIM 0.9634) (+0.86 vs baseline)

    native Dialog_normal_light cn1 Dialog_normal_light
    Left: native widget. Right: Codename One render.

  • Switch_disabled_dark -- 98.01% fidelity (SSIM 0.9869) (+2.48 vs baseline)

    native Switch_disabled_dark cn1 Switch_disabled_dark
    Left: native widget. Right: Codename One render.

  • GlassIcon_normal_dark -- 98.59% fidelity (SSIM 0.9841) (no change)

    native GlassIcon_normal_dark cn1 GlassIcon_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassText_normal_dark -- 98.64% fidelity (SSIM 0.9848) (+0.05 vs baseline)

    native GlassText_normal_dark cn1 GlassText_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassIcon_normal_light -- 98.67% fidelity (SSIM 0.9860) (no change)

    native GlassIcon_normal_light cn1 GlassIcon_normal_light
    Left: native widget. Right: Codename One render.

  • GlassText_normal_light -- 98.74% fidelity (SSIM 0.9874) (+0.05 vs baseline)

    native GlassText_normal_light cn1 GlassText_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelGrad_normal_light -- 98.91% fidelity (SSIM 0.9935) (+0.67 vs baseline)

    native GlassPanelGrad_normal_light cn1 GlassPanelGrad_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelGrad_normal_dark -- 98.98% fidelity (SSIM 0.9928) (+0.55 vs baseline)

    native GlassPanelGrad_normal_dark cn1 GlassPanelGrad_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassPanelGrey_normal_dark -- 98.99% fidelity (SSIM 0.9917) (+0.57 vs baseline)

    native GlassPanelGrey_normal_dark cn1 GlassPanelGrey_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassPanelGrey_normal_light -- 99.05% fidelity (SSIM 0.9936) (+0.67 vs baseline)

    native GlassPanelGrey_normal_light cn1 GlassPanelGrey_normal_light
    Left: native widget. Right: Codename One render.

  • GlassPanelRed_normal_dark -- 99.09% fidelity (SSIM 0.9926) (+0.52 vs baseline)

    native GlassPanelRed_normal_dark cn1 GlassPanelRed_normal_dark
    Left: native widget. Right: Codename One render.

  • GlassPanelRed_normal_light -- 99.10% fidelity (SSIM 0.9939) (+0.67 vs baseline)

    native GlassPanelRed_normal_light cn1 GlassPanelRed_normal_light
    Left: native widget. Right: Codename One render.

@shai-almog

shai-almog commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 163 screenshots: 163 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog

shai-almog commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 236 screenshots: 236 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9bd3a88194

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/flutter-bench/run_bench.py Outdated
Comment thread maven/dart-runtime/src/main/java/dart/async/Future.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/async/Future.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/async/Future.java Outdated
Comment thread Ports/iOSPort/nativeSources/IOSNative.m Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DateTime.java Outdated
Comment thread maven/flutter-runtime/src/main/resources/META-INF/dart/gallery_animation.dart Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DartUri.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/RegExp.java Outdated
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 311de5406f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/dart-runtime/src/main/java/dart/async/Future.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DartUri.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DateTime.java Outdated
Comment thread maven/flutter-runtime/src/main/java/com/codename1/flutter/Key.java Outdated
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9808bc8c30

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/dart-runtime/src/main/java/dart/async/Future.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DString.java
Comment thread maven/dart-runtime/src/main/java/dart/runtime/DartRuntime.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/runtime/DartRuntime.java
@shai-almog

shai-almog commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 179 screenshots: 179 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 234 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 78ms / native 3ms = 26.0x speedup
SIMD float-mul (64K x300) java 76ms / native 3ms = 25.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 64.000 ms
Base64 CN1 decode 88.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 5.000 ms
Image createMask ratio (SIMD on/off) 0.556x (44.4% faster)
Image applyMask (SIMD off) 78.000 ms
Image applyMask (SIMD on) 73.000 ms
Image applyMask ratio (SIMD on/off) 0.936x (6.4% faster)
Image modifyAlpha (SIMD off) 104.000 ms
Image modifyAlpha (SIMD on) 91.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.875x (12.5% faster)
Image modifyAlpha removeColor (SIMD off) 61.000 ms
Image modifyAlpha removeColor (SIMD on) 46.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.754x (24.6% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

1 improvement past the baseline, which fails until rebaselined:

  • hello (HelloCodenameOne) on all 3 CPUs: RAM 0.95x against a 1.34x baseline (-28.9%, tolerance 20%)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.86x (base 0.96x, -9.6%) 0.95x (base 1.34x, -28.9%) IMPROVED: rebaseline (RAM -28.9%)
translator (self) 3 0.65x (base 0.62x, +4.6%) 0.62x (base 0.57x, +9.8%) ok
intArithmetic 3 1.06x (base 1.03x, +2.3%) 0.12x (base 0.12x, +0.5%) ok
longArithmetic 3 1.01x (base 1.03x, -1.3%) 0.11x (base 0.07x, +58.7%) ok
mathTranscendental 3 0.99x (base 1.01x, -1.9%) 0.12x (base 0.12x, -0.3%) ok
arraySequential 3 0.44x (base 0.42x, +3.7%) 0.53x (base 0.53x, -0.2%) ok
arrayRandom 3 0.98x (base 0.99x, -0.8%) 0.32x (base 0.32x, -0.0%) ok
objectAllocation 3 1.04x (base 1.11x, -5.6%) 0.89x (base 0.81x, +9.8%) ok
valueEscape 3 0.51x (base 0.51x, +0.1%) 0.09x (base 0.09x, +4.2%) ok
hashMapChurn 3 1.09x (base 1.18x, -7.6%) 0.07x (base 0.07x, +11.5%) ok
stringBuilding 3 0.97x (base 0.84x, +15.5%) 0.46x (base 0.46x, -1.3%) ok
recursion 3 1.41x (base 1.24x, +13.8%) 0.12x (base 0.12x, -0.3%) ok
quicksort 3 1.00x (base 1.01x, -1.6%) 0.11x (base 0.11x, -0.2%) ok

A change that moves performance ON PURPOSE records the new baseline in vm/selfhost/perf-baseline/pr/5883.json, with the reason, from this job's perf-results.json. The rebaseline is then part of this pull request's diff:

python3 vm/selfhost/calibrate-perf-baseline.py --pr 5883 --reason "<why these benchmarks moved>" perf-results.json

Result: improved past the baseline: rebaseline required

shai-almog and others added 6 commits October 8, 2026 11:49
run-gc-verify.sh's nograce self-test caught nothing (0 of 5) on 5efe54b
and on HEAD. Not because #5940 made grace unnecessary -- concurrent cycles
still keep every fresh object by grace -- but because DeadFieldElimination
(#5903) deletes instance fields nothing reads, and GraceAudit's Node fields
were write-only: the translated Node had no fields, the fresh node held
nothing, and skipping the grace pass lost nothing. Swept every driver and
fixture with javap for write-only fields and fixed the gate ones:

- GraceAudit: Node and Filler fields read. nograce caught 5/5 (macOS and
  Linux arm64), clean run 239 passes; refs checked 13k -> 219k.
- SbEscape: Holder.ref was write-only, so the stack builder was never
  published and self-test6 reported "NOTHING noticed" on every tree. Now
  caught (5 reports), control clean.
- GcVerifyApp (the GcHeapIntegrity gate): Node had no fields, so its first
  hazard was gone; the gate and its nograce half only worked through the
  array/map hazards. Fields read; clean and nograce-caught at 1 and 4
  markers on Linux arm64, RESULT matches the JVM.
- LegacyGrace, BulkCopyBarrier, GcUncooperativeThreadApp: reference fields
  that had been reduced to leaves.

halfblock (self-test4) is probabilistic per run and cannot be made
deterministic from the driver: System.gc() is a request, the driver also
runs in run-gauntlet.sh against a JVM (no verifier-only native), and a
hybrid minor never traces the old held map. Measured 7/20 per run at the
old 4MB trigger, 18/20 at 1MB macOS, 20/20 Linux arm64. It now runs at 1MB
with up to 10 attempts, stopping at the first catch and reporting which
attempt it was, and 10 controls that must all be clean. Rationale is in the
script.

run-gc-verify.sh: GC-VERIFY GREEN twice on macOS (it was FAILED before:
self-test, self-test4, self-test6). GcHeapIntegrity and
GcUncooperativeThread integration tests pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ared

Root-caused the observation from the halfblock work: 64 WeakReferences to
unreachable int[8] referents, stack scrubbed, none cleared after many
forced collections. Not a reference-processing bug and not a stray root.

The referents sit on the thread's current allocation page for that size
class. No sweep touches an owned page (BIBOP-INVARIANTS R5), so they stay
mark -1, and cn1GcSweepReclaimsObj -- which must answer exactly what the
sweep frees -- keeps them in a concurrent cycle. Measured (Linux arm64,
1 and 4 markers): 0/64 cleared after 20 concurrent cycles; 64/64 once the
thread filled and retired the page; 64/64 under CN1_GC_HYBRID_FORCE=1,
whose stop-the-world cycles retire held threads' pages. Identical on
master 6478b2f and before #5940 (6516c1c^). The JVM clears all 64.

Not avoidable in a concurrent cycle (the owner bumps the page while it
runs, and the barriers' fresh filter relies on grace there) and bounded to
one page per size class per thread. No gate depends on it: RefPolicy's
payloads are legacy-heap, GcMarkCompletenessTest checks codegen only, and
the JS weak-ref tests run on the JavaScript port. Recorded in a comment at
cn1GcSweepReclaimsObj and in vm/CLAUDE.md so a future test retires the page
before asserting a clear.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…AM rows

- Developer guide and the initializr skill reference now say Dart support is
  experimental: some widget callbacks and parameters are accepted and ignored.
- READINESS.md gap list re-checked against source: three of four text-field
  gaps and the vertical drag callbacks are resolved; Image.scaled is back on the
  point sampler since 3eb1c18.
- flutter-bench code size: javascript +15,693 bytes, android +25,396 bytes,
  from frozen const collections, locale/Directionality and typed fields for
  untyped collection literals (1f97b4f, 358604f).
- macos-arm64 objectAllocation RAM ratio 0.708 -> 0.958: master measures the
  same (6478b2f, its build-macos is red with this verdict); inherited, not
  caused here.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Conflicts:
- perf-baseline.yml: both sides diff against the merge's first parent; kept
  ours, which also runs the flutter-bench check.
- archetype common/pom.xml: kept both generate-sources executions,
  transcode-flutter and master's compile-android-res.
- SimpleDateFormatTest: master's header and month-name test plus our
  time-zone tests (content auto-merged; add/add header only).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#5961 rebaselined the same row to 0.814 from eight runs (tolerance 0.3), which
covers this branch's 0.958; two overlays moving one row fail the gate.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
+148,467 code bytes (+1.16%) arrived with master's JavaScript text selection
and startup fix, classic Android apps and backend security; measured on run
37824086148.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c5c1affc36

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread CodenameOne/src/com/codename1/l10n/SimpleDateFormat.java Outdated
…mangles '-'

- Navigator: pushReplacementNamed on the implicit base makes the replacement
  the new non-poppable base; every route-taking path accepts the common Route
  type (CupertinoPageRoute, PageRouteBuilder), not only MaterialPageRoute.
- dart-transpiler: lib/main.dart wins among several libraries with main();
  ambiguity without it is a diagnostic naming the candidates.
- Lazy statics follow Dart: a non-late static read during its own
  initialization throws; a late one re-runs the initializer, and late final
  throws if bound meanwhile. The parser dropped `late` on top-level variables.
- SimpleDateFormat.equals compares zone ID, raw offset and DST use.
- ReachabilityCull.mangle folds '-' like every other mangler; master's
  HyphenatedNamesIntegrationTest hit the CN1_CULL_TRAP stub.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0b14bca2eb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/dart-runtime/src/main/java/dart/core/DateTime.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/RegExp.java
Comment thread maven/dart-runtime/src/main/java/dart/core/DString.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DartUri.java Outdated
Comment thread CodenameOne/src/com/codename1/ui/spinner/InternalPickerWidget.java
shai-almog and others added 2 commits October 9, 2026 12:44
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… and themes

- ReachabilityCull: a method whose every Class.forName takes a string literal
  allocates only the named classes present in the app; an absent name (Kotlin's
  kotlin.jvm.internal.Reflection probing kotlin-reflect) allocates nothing, as
  forName throws ClassNotFoundException. It used to widen to every no-arg class,
  which defeated the cull for any app bundling the Kotlin stdlib and raised the
  translator's peak RSS ~130 MB on the hello suite once master added Kotlin tests.
- DateTime validates Dart's +/-8.64e15 ms range before converting to micros.
- DString case conversion applies Unicode's unconditional full mappings
  (sharp s -> SS) and Final_Sigma, per code point, locale independent.
- DartUri component decoding is strict UTF-8 and throws FormatException.
- RegExp documents why unicode: true is accepted though inert.
- NativeThemes keeps a theme opened by its bare openLayered("/Name").
- InternalPickerWidget: DurationSpinner3D's value is a Long of milliseconds.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e8d2fa7df3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/dart-runtime/src/main/java/dart/core/DateTime.java Outdated
Comment thread maven/dart-runtime/src/main/java/dart/core/DartSet.java
Comment thread maven/dart-runtime/src/main/java/dart/core/DartIterable.java
shai-almog and others added 4 commits October 10, 2026 05:20
…ration, Indic conjuncts

- DateTime.add/subtract and the field constructors' microsecond argument validate
  the result against Dart's range, detecting long overflow from the signs.
- Dart == on a nullable numeric or bool operand goes through DartRuntime.eq
  instead of Java's ==, which unboxed null (NPE) and compared boxes by reference.
- AnimationController.duration is nullable with no default, as in Flutter:
  forward/reverse/repeat and a duration-less animateTo throw FlutterError;
  fling keeps a fallback since Flutter's spring needs none.
- Characters implements UAX #29 GB9c, so consonant + virama + consonant is one
  grapheme cluster (maxLength no longer splits a conjunct).
- Pushback in code: NaN set elements (DartSet) and lazy sync* (DartIterable);
  the sync* limitation is now listed in READINESS.md and the conversion skill.
- flutter-bench: JavaScript sizes get a 0.5% tolerance, as Android code has.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
cn1GcTryResumeActive raised threadActive with a relaxed store, issued a
standalone seq_cst fence and re-read threadBlockedByGC relaxed. The fence is
MFENCE on x86-64 (several times a locked instruction on AMD Zen) and a full
DMB on arm64, on a path the allocation pacing parks and allocation-path
safepoints pass constantly. Since the handshake landed (27ef65f) the
self-hosted translator measured 0.63x of JDK 25 on a Linux x64 EPYC 7763
perf-gate runner where master measured 0.47-0.50x, memory unchanged.

A seq_cst store and a seq_cst load give the same store-load ordering against
the collector's seq_cst fence (one total order covers both): XCHG plus a plain
load on x86-64, STLR plus LDAR on arm64. GcHeapIntegrityIntegrationTest's
resume-window fault gate still passes (the handshake catches the block, the
old protocol is still caught).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8c2e73d8d0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +154 to +155
long wall = (daysFromCivil(y, m, 1) + day - 1) * DAY_MS
+ hour * 3600000L + minute * 60000L + second * 1000L + millisecond;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Guard field-based DateTime construction against overflow

When any date component is very large, this unchecked arithmetic can wrap into an apparently valid epoch before millisToMicros performs its range check. For example, DateTime.utc(9223372036854775807, 1, 1, 0, 0, 0, 0, 0) currently becomes a date around year -2 instead of rejecting the out-of-range input, silently corrupting externally supplied dates. Normalize and combine the components with checked arithmetic, then reject results outside the supported DateTime range.

Useful? React with 👍 / 👎.

Comment on lines +300 to +304
if (w.getMaxLength() != null && w.getMaxLength().longValue() >= 0) {
// The native cap counts UTF-16 units, and maxLength counts characters: a
// single emoji can be eleven units. It is therefore only a generous upper
// bound; userEdited enforces the real limit on character boundaries.
tf.setMaxSize((int) Math.min(Integer.MAX_VALUE, w.getMaxLength().longValue() * 16));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Remove the native cap from unlimited text fields

When maxLength is null or negative, this branch leaves the Codename One editor's default maxSize of 124 in place, so a fresh Flutter TextField that is supposed to accept unlimited input stops accepting characters after 124 UTF-16 units. The same omission leaves the previous native cap installed when a rebuilt field changes from a finite limit to unlimited; explicitly restore an unlimited native maximum in the else case.

Useful? React with 👍 / 👎.

Comment on lines +275 to +279
@Override
protected void updateComponent(Component c) {
if (field != null) {
apply(field);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Rebuild text-field decoration children on updates

When a rebuild changes prefixIcon or suffixIcon, this update path only reapplies properties to the existing editor, while the icon labels and surrounding row were created once by decorated() and are never synchronized. A password field that swaps visibility and visibility_off after toggling obscurity therefore keeps displaying the original glyph, and adding or removing an icon has no effect; rebuild or update the decoration child structure when these widgets change.

Useful? React with 👍 / 👎.

Comment on lines +72 to +74
for (OverlayEntry e : newEntries) {
insert(e, below, above);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve entry order when inserting above an overlay anchor

When insertAll is called with an above anchor, every iteration recomputes the same anchorIndex + 1, so later entries are inserted in front of earlier ones. For example, inserting [a, b] above an existing entry produces anchor, b, a, reversing both paint and hit-test order from the caller's list; advance a shared insertion index or iterate in reverse for this case.

Useful? React with 👍 / 👎.

shai-almog and others added 9 commits October 11, 2026 08:28
The Linux hello perf gate showed the self-hosted translator's peak RSS ~60MB
above master on ParparVM (arm64 hello RAM 1.01x vs 0.87x). Measured on JDK 25
with Epsilon GC over the recorded hello translation, the branch allocated
~3.84GB against master's ~3.68GB, and all of the difference was the
reachability cull: with -Dcn1.reachabilityCull=false it matched master. Live
heap was flat (~410MB) in every arm, so it was churn, which ParparVM's
concurrent collector turns into peak RSS.

The largest allocation site was MethodDependencyGraph.getCallers copying the
caller set into a fresh ArrayList on every lookup; the dead-method passes look
up every surviving method's callers each iteration, and the cull adds a
follow-up pass. Both callers only read it. As an unmodifiable view, the same
translation allocates ~3.26GB (below master), live heap unchanged, identical
output (2315 .c files).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adds MethodChannel/EventChannel so a transpiled Flutter app's platform
code ports to plain Java by changing imports, matching Android's
io.flutter.plugin.common shape:

- com.codename1.flutter.platform (new): MethodChannel with nested
  MethodCallHandler/Result, EventChannel with nested
  StreamHandler/EventSink, MethodCall, PlatformException,
  MissingPluginException. Mirrors the real Android API; the constructor
  drops BinaryMessenger since there is no transport to abstract
  in-process.
- com.codename1.flutter.services (new): the Dart-side MethodChannel/
  EventChannel the package:flutter/services.dart stub binds to.
  setMethodCallHandler is concretely typed Funcs.Func1<MethodCall,
  Object> rather than Object: the transpiler emits every Dart closure
  literal as a bare, untyped Java lambda with no wrapping (confirmed
  empirically -- Future.then/catchError/whenComplete are the only
  names the emitter special-cases), so the real parameter must be a
  genuine functional interface or the generated call fails to compile.
- FlutterChannelRegistry: the in-process, by-name directory both
  packages share, so either side may register first.
- dart.async.Stream/StreamSubscription/StreamController (dart-runtime):
  a minimal broadcast-only Stream, needed because EventChannel.
  receiveBroadcastStream() returns one. listen()'s onData is
  concretely Funcs.VoidFunc1<T> for the same bare-lambda reason as
  setMethodCallHandler.
- Stub files (flutter-runtime META-INF/dart, loaded from the classpath
  like every runtime stub): flutter_services.dart and
  dart_async_stream.dart.
- Test harness: BehaviorTest/TestSupport now support a *.stub.dart
  file (loaded into the StubRegistry instead of parsed as a program
  source) paired with a *.java file, so a fixture can declare and
  compile its own hand-written Java class for Dart to call into --
  used by the new flutter_services_channels behavior fixture, which
  proves package:flutter/services.dart compiles unchanged and runs
  both directions (Dart invoking Java, Java invoking Dart, errors,
  MissingPluginException, async replies, and an event stream with
  cancel -> onCancel) against a real Java handler.
- Developer guide snippets (compiled, not illustrative): Java
  MethodCallHandler/invokeMethod/StreamHandler examples and a
  LibGreetingLib stand-in for a transpiled top-level function, plus
  the matching Dart-side services.dart usage.

Not implemented: Stream's single-subscription buffering, sync:true's
exact semantics distinction, fromIterable/periodic/asyncMap/transform/
distinct/take/skip/timeout/expand, and StreamSubscription.pause(resumeSignal)
-- all documented on dart.async.Stream's class comment.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The sibling of cn1:import-android-project. Pointed at a Flutter project
(-Dcn1.flutter.import=<dir>), it:

- copies lib/** into common/src/main/flutter, keeping a .flutter-import-files
  hash record so a re-import keeps local edits and prunes what upstream deleted;
- copies every asset and font pubspec.yaml declares, including directory keys
  and assets that live in pub packages, located through
  .dart_tool/package_config.json or pubspec.lock plus the pub cache -- what
  benchcn1's stage-assets.sh did by hand;
- reports each pub dependency as covered (the runtime implements its API, or it
  is an asset-only package whose files were copied) or not;
- writes the entry class that runs the Dart main(), saving the project's own as
  .pre-flutter-import, and carries the pubspec name/version into the settings;
- wires common/pom.xml: uncomments the archetype's codenameone-flutter-runtime
  dependency (or inserts it) and adds the transcode-flutter execution to a pom
  generated before it was bound, naming the XML to paste when it cannot.

Against the Flutter Gallery: 161 Dart files and 193 assets, three asset
packages resolved from the pub cache, collection,
flutter_staggered_grid_view and nested reported as not covered.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A Java handler answering result.success(87) handed Dart an Integer -- what
ported Kotlin Int code produces -- where transpiled Dart expects a Long, and a
java.util.List where it calls DartList methods; on iOS the cast is unchecked,
so that is a native crash. Flutter's codec does this conversion on a real
platform channel. FlutterChannelRegistry.toDart now maps Integer/Short/Byte to
Long, Float to Double and Java lists and maps to DartList/DartMap
(recursively) for every value Java hands to Dart: invokeMethod arguments,
results, events and error details.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…<->Dart calls

The chapter now leads with what a team moving from Flutter gets: four charts
(installed size, executable code, cold start, memory at rest) from the
flutter-bench run on every platform, where Codename One is ahead on every
measured metric, followed by why the comparison is tilted toward Flutter (it
runs Flutter's own showcase through a runtime that reimplements Flutter's
widget model) and which platforms are not measured in full and why.

- Side-by-side gallery screenshots (Flutter left, Codename One right) for five
  demos, replacing the single text-field shot.
- "Importing a Flutter application": cn1:import-flutter-project replaces the
  manual dependency/copy steps.
- "Migrating an entire application" / "Migrating a single form" replace the
  two "use case" sections; the latter explains how a Dart widget class is
  constructed from Java.
- "Calling between Java and Dart": MethodChannel both ways and EventChannel
  with the Java platform API that mirrors io.flutter.plugin.common, the value
  mapping, calling Dart top-level functions directly, and shared notifiers.
- scripts/flutter-bench/render_doc_charts.py renders the charts from the
  benchmark's result files through benchlib.verdict, so they show the
  published report's own statistics.
- The porting skill teaches the import goal and channels.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…cator color gaps

Fixes three rendering gaps found by diffing the transpiled Flutter Gallery
against Flutter's own rendering:

- CupertinoButton never resolved CupertinoTheme.of(context).primaryColor /
  primaryContrastingColor (packages/flutter/lib/src/cupertino/button.dart),
  so it rendered as a plain Material TextButton/ElevatedButton -- purple
  text and a grey pill with a drop shadow instead of iOS blue with no
  shadow. It now builds an explicit ButtonStyle (color, elevation 0,
  BorderRadius.circular(8) for .filled) and ButtonRenderElement honours
  that style's foreground/background/elevation instead of always falling
  back to the Material ColorScheme.

- TextField ignored enabled:false entirely. Per Material 2's
  InputDecorator._getActiveColor, a disabled field now recolours its
  label/hint, input text and underline to ThemeData.disabledColor (black38
  default) and washes a filled field's fill lighter.

- TabBar's indicatorColor/indicatorWeight/indicatorSize setters were
  no-ops and unselectedLabelColor fell back to labelColor, so no indicator
  ever painted and every tab label was the same colour. TabBar now stacks
  each tab over a 2dp indicator strip (ThemeData.indicatorColor, default
  white) painted only for the selected tab, and defaults
  unselectedLabelColor to labelColor.withAlpha(0xB2) when the bar states a
  labelColor but no unselectedLabelColor of its own, matching
  _TabBarState's real resolution.

Added CupertinoButtonThemeTest, TextFieldDisabledStyleTest and
TabBarIndicatorTest; updated TabBarLabelTest for the new per-tab Column
(label + indicator strip) wrapper. All 552 flutter-runtime tests pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ixes, add the gallery home

Captured in the phone skin from one simulator run against the fixed runtime.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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