Skip to content

Keyboard: explicit Next/Done action for any constraint, and a landscape number pad that can be left - #6217

Merged
shai-almog merged 5 commits into
masterfrom
keyboard-action-numeric
Nov 12, 2026
Merged

shai-almog merged 5 commits into
masterfrom
keyboard-action-numeric

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Discussion #6212.

  • nextButton / doneButton client properties choose the virtual keyboard's action independently of the input constraint, on Android and iOS. Fields that set neither behave as before.
    • nextButton offers Next and moves on without calling the Done listener. With nothing following, the field offers Done.
    • doneButton offers Done and ends editing even when another field follows. It wins if both are set.
  • iOS: number, decimal and phone pads have no Return key, and their toolbar was dropped in landscape on every device, leaving no Next or Done at all. The toolbar now stays for those keyboards. An iPad gets it for a field that set either property.
  • Android: removes leftover debug output from InPlaceEditView.endEditing and fixes the precedence of its Done-event condition.
  • Developer guide section "Choosing next or done", and javadoc on TextArea.setDoneListener.

Tested by TextEditUtilKeyboardActionTest (iOS decisions and the editingUpdate wiring, plus the native end codes read from METALView.m). The Android port has no unit-test harness, so the IME selection is untested. Not run on a device.

🤖 Generated with Claude Code

shai-almog and others added 4 commits November 11, 2026 19:02
…toolbar in landscape

Discussion #6212. A field's keyboard action could not be chosen apart from
its constraint: on Android a Done listener forced Done even with a field
following, and on iOS a number pad in landscape had neither a Return key
nor a toolbar.

- nextButton / doneButton client properties choose the action on Android
  and iOS. Defaults are unchanged. An explicit Next moves on without
  firing the Done listener.
- iOS: the toolbar stays in landscape for keyboards with no Return key,
  and an iPad gets it for a field that chose its action.
- Android: remove leftover debug output from endEditing and fix the
  precedence of the Done-event condition.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
- Android: remove the last debug println in endEditing.
- iOS: clear the next component when there is no form to ask, so a
  stale successor cannot make a nextButton field skip its Done listener.
- Docs: a nextButton field usually has no Done to fire a listener with;
  say so, and stop implying the iPad toolbar is floating-keyboard only.
- Test: hold the native end codes to the Java constants by reading
  METALView.m, and cover the explicit flag and the end-code predicate.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
- iOS: drop the branch added for a stale next component. editStringAt
  returns before it when the component has no top level, so it could not
  run and the bug its comment described could not happen.
- Docs: nextButton does not beat doneButton or a missing successor; say
  what it does beat.
- Test: drive IOSImplementation.editingUpdate itself, so the Done-event
  and advance wiring is held and not only the helpers.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 11, 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 (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@github-actions

github-actions Bot commented Nov 11, 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)
    • ✅ compose-compat: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ python-runtime: 0 findings (no issues)
    • ✅ python-transpiler: 0 findings (no issues)
    • ✅ swing-compat: 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 Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 43ms / native 3ms = 14.3x speedup
SIMD float-mul (64K x300) java 44ms / native 2ms = 22.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 61.000 ms
Base64 CN1 decode 81.000 ms
Base64 SIMD encode 87.000 ms
Base64 encode ratio (SIMD/CN1) 1.426x (42.6% slower)
Base64 SIMD decode 78.000 ms
Base64 decode ratio (SIMD/CN1) 0.963x (3.7% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.250x (75.0% faster)
Image applyMask (SIMD off) 19.000 ms
Image applyMask (SIMD on) 20.000 ms
Image applyMask ratio (SIMD on/off) 1.053x (5.3% slower)
Image modifyAlpha (SIMD off) 25.000 ms
Image modifyAlpha (SIMD on) 13.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.520x (48.0% faster)
Image modifyAlpha removeColor (SIMD off) 26.000 ms
Image modifyAlpha removeColor (SIMD on) 17.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.654x (34.6% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 17 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-17-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 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (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.81x (base 1.38x, +31.4%) 0.72x (base 0.82x, -11.6%) ok
translator (self) 4 0.86x (base 0.89x, -2.8%) 0.52x (base 0.55x, -5.3%) ok
intArithmetic 4 1.10x (base 1.10x, +0.4%) 0.06x (base 0.06x, -0.8%) ok
longArithmetic 4 1.08x (base 1.08x, -0.0%) 0.06x (base 0.06x, +1.2%) ok
mathTranscendental 4 0.85x (base 0.85x, +0.5%) 0.06x (base 0.06x, +4.6%) ok
arraySequential 4 1.81x (base 1.72x, +5.4%) 0.38x (base 0.38x, +0.1%) ok
arrayRandom 4 1.02x (base 1.01x, +0.5%) 0.23x (base 0.23x, +0.7%) ok
objectAllocation 4 1.25x (base 1.25x, -0.0%) 0.34x (base 0.29x, +15.6%) ok
valueEscape 4 0.10x (base 0.10x, -1.3%) 0.05x (base 0.04x, +3.8%) ok
hashMapChurn 4 1.30x (base 1.39x, -6.9%) 0.10x (base 0.10x, +7.2%) ok
stringBuilding 4 1.40x (base 1.36x, +3.4%) 0.32x (base 0.28x, +15.8%) ok
recursion 4 1.38x (base 1.43x, -3.4%) 0.06x (base 0.06x, +3.4%) ok
quicksort 4 1.11x (base 1.11x, -0.2%) 0.12x (base 0.12x, +0.9%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 57ms / native 2ms = 28.5x speedup
SIMD float-mul (64K x300) java 59ms / native 3ms = 19.6x 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 46.000 ms
Base64 CN1 decode 68.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.571x (42.9% faster)
Image applyMask (SIMD off) 57.000 ms
Image applyMask (SIMD on) 78.000 ms
Image applyMask ratio (SIMD on/off) 1.368x (36.8% slower)
Image modifyAlpha (SIMD off) 64.000 ms
Image modifyAlpha (SIMD on) 35.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.547x (45.3% faster)
Image modifyAlpha removeColor (SIMD off) 51.000 ms
Image modifyAlpha removeColor (SIMD on) 28.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.549x (45.1% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

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

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 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (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 1.12x (base 0.96x, +16.8%) 0.88x (base 0.93x, -5.2%) ok
translator (self) 3 0.63x (base 0.62x, +1.6%) 0.68x (base 0.78x, -13.3%) ok
intArithmetic 3 1.04x (base 1.03x, +0.8%) 0.12x (base 0.12x, +1.7%) ok
longArithmetic 3 1.06x (base 1.03x, +3.7%) 0.12x (base 0.07x, +66.6%) ok
mathTranscendental 3 0.97x (base 1.01x, -3.5%) 0.12x (base 0.12x, +1.3%) ok
arraySequential 3 0.44x (base 0.42x, +3.9%) 0.53x (base 0.53x, -0.1%) ok
arrayRandom 3 0.98x (base 0.99x, -0.8%) 0.32x (base 0.32x, +0.2%) ok
objectAllocation 3 1.03x (base 1.11x, -7.0%) 0.81x (base 0.72x, +11.8%) ok
valueEscape 3 0.51x (base 0.51x, +0.8%) 0.09x (base 0.09x, +0.8%) ok
hashMapChurn 3 1.11x (base 1.18x, -5.4%) 0.07x (base 0.07x, +6.2%) ok
stringBuilding 3 0.92x (base 0.84x, +9.7%) 0.45x (base 0.46x, -1.8%) ok
recursion 3 1.21x (base 1.24x, -2.0%) 0.12x (base 0.12x, +0.5%) ok
quicksort 3 0.94x (base 1.01x, -7.2%) 0.11x (base 0.11x, +1.5%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 51ms / native 3ms = 17.0x speedup
SIMD float-mul (64K x300) java 49ms / native 3ms = 16.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 gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 62.000 ms
Base64 CN1 decode 69.000 ms
Base64 SIMD encode 76.000 ms
Base64 encode ratio (SIMD/CN1) 1.226x (22.6% slower)
Base64 SIMD decode 68.000 ms
Base64 decode ratio (SIMD/CN1) 0.986x (1.4% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 0.000 ms
Image createMask ratio (SIMD on/off) 0.000x (100.0% faster)
Image applyMask (SIMD off) 16.000 ms
Image applyMask (SIMD on) 14.000 ms
Image applyMask ratio (SIMD on/off) 0.875x (12.5% faster)
Image modifyAlpha (SIMD off) 15.000 ms
Image modifyAlpha (SIMD on) 9.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.600x (40.0% faster)
Image modifyAlpha removeColor (SIMD off) 19.000 ms
Image modifyAlpha removeColor (SIMD on) 8.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.421x (57.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 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (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.44x (base 1.45x, -0.7%) 0.78x (base 0.75x, +3.3%) ok
translator (self) 4 0.88x (base 0.84x, +5.4%) 0.51x (base 0.51x, +0.6%) ok
intArithmetic 4 1.04x (base 1.04x, -0.1%) 0.06x (base 0.06x, +3.3%) ok
longArithmetic 4 0.79x (base 0.80x, -0.2%) 0.06x (base 0.06x, +3.7%) ok
mathTranscendental 4 0.73x (base 0.72x, +1.7%) 0.07x (base 0.06x, +2.2%) ok
arraySequential 4 0.37x (base 0.46x, -18.5%) 0.39x (base 0.39x, -0.0%) ok
arrayRandom 4 0.94x (base 0.94x, +0.2%) 0.23x (base 0.23x, +0.3%) ok
objectAllocation 4 1.74x (base 1.82x, -4.4%) 0.33x (base 0.43x, -23.2%) ok
valueEscape 4 0.76x (base 0.76x, +0.1%) 0.05x (base 0.05x, +3.0%) ok
hashMapChurn 4 0.99x (base 0.98x, +1.0%) 0.12x (base 0.12x, -3.2%) ok
stringBuilding 4 1.54x (base 1.43x, +8.0%) 0.27x (base 0.27x, -0.4%) ok
recursion 4 1.42x (base 1.46x, -2.8%) 0.07x (base 0.07x, +1.5%) ok
quicksort 4 1.01x (base 1.00x, +0.5%) 0.12x (base 0.12x, +0.7%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 195 screenshots: 195 matched.

Native Android coverage

  • 📊 Line coverage: 19.18% (56169/292885 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.13% (270599/1492353), branch 12.38% (19676/158943), complexity 10.36% (15846/153017), method 15.74% (11411/72518), class 27.93% (2247/8045)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 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/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 19.18% (56169/292885 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.13% (270599/1492353), branch 12.38% (19676/158943), complexity 10.36% (15846/153017), method 15.74% (11411/72518), class 27.93% (2247/8045)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 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/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 372ms / native 95ms = 3.9x speedup
SIMD float-mul (64K x300) java 166ms / native 50ms = 3.3x 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 78.000 ms
Base64 CN1 decode 90.000 ms
Base64 native encode 469.000 ms
Base64 encode ratio (CN1/native) 0.166x (83.4% faster)
Base64 native decode 340.000 ms
Base64 decode ratio (CN1/native) 0.265x (73.5% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 9V45 96-Core Processor (baseline linux-x64@amd-epyc-9v45-96-core-processor)

1 performance regression:

  • recursion on all 4 CPUs: time 4.59x against a 1.34x baseline (+242.6%, 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 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (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.07x (base 0.92x, +16.9%) 0.84x (base 0.84x, +0.3%) ok
translator (self) 4 0.67x (base 0.64x, +4.2%) 0.54x (base 0.55x, -1.7%) ok
intArithmetic 4 1.00x (base 1.00x, +0.0%) 0.04x (base 0.06x, -31.5%) ok
longArithmetic 4 1.00x (base 0.99x, +0.4%) 0.04x (base 0.07x, -48.0%) ok
mathTranscendental 4 1.19x (base 1.20x, -1.1%) 0.04x (base 0.06x, -28.4%) ok
arraySequential 4 2.95x (base 2.91x, +1.7%) 0.36x (base 0.36x, +1.1%) ok
arrayRandom 4 0.98x (base 1.04x, -5.4%) 0.20x (base 0.23x, -11.1%) ok
objectAllocation 4 1.56x (base 1.61x, -3.3%) 0.24x (base 0.24x, +0.2%) ok
valueEscape 4 0.10x (base 0.12x, -14.5%) 0.03x (base 0.04x, -21.2%) ok
hashMapChurn 4 1.28x (base 1.31x, -2.2%) 0.09x (base 0.09x, +2.2%) ok
stringBuilding 4 1.54x (base 1.58x, -2.5%) 0.26x (base 0.22x, +19.9%) ok
recursion 4 4.59x (base 1.34x, +242.6%) 0.04x (base 0.08x, -48.4%) REGRESSION (time +242.6%)
quicksort 4 1.09x (base 1.06x, +2.8%) 0.10x (base 0.11x, -10.4%) ok

A change that moves performance ON PURPOSE records the new baseline in vm/selfhost/perf-baseline/pr/6217.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 6217 --reason "<why these benchmarks moved>" perf-results.json

Result: performance regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 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 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (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.15x (base 1.02x, +12.5%) 0.77x (base 0.66x, +17.1%) ok
translator (self) 4 0.79x (base 0.70x, +13.0%) 0.46x (base 0.43x, +5.9%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.03x (base 0.03x, +4.7%) ok
longArithmetic 4 0.79x (base 0.79x, -0.3%) 0.03x (base 0.03x, +5.1%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.8%) ok
arraySequential 4 0.36x (base 0.36x, -0.8%) 0.37x (base 0.37x, +0.1%) ok
arrayRandom 4 0.94x (base 0.94x, +0.2%) 0.20x (base 0.20x, +0.7%) ok
objectAllocation 4 2.00x (base 1.77x, +12.9%) 0.36x (base 0.37x, -3.3%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +5.7%) ok
hashMapChurn 4 0.86x (base 0.84x, +1.5%) 0.12x (base 0.12x, -3.0%) ok
stringBuilding 4 1.52x (base 1.57x, -3.0%) 0.26x (base 0.26x, -0.1%) ok
recursion 4 1.56x (base 1.43x, +8.5%) 0.04x (base 0.04x, +3.3%) ok
quicksort 4 1.00x (base 0.99x, +0.7%) 0.10x (base 0.09x, +2.8%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 68ms / native 7ms = 9.7x speedup
SIMD float-mul (64K x300) java 56ms / native 3ms = 18.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 62.000 ms
Base64 CN1 decode 67.000 ms
Base64 native encode 929.000 ms
Base64 encode ratio (CN1/native) 0.067x (93.3% faster)
Base64 native decode 383.000 ms
Base64 decode ratio (CN1/native) 0.175x (82.5% faster)
Base64 SIMD encode 68.000 ms
Base64 encode ratio (SIMD/CN1) 1.097x (9.7% slower)
Base64 SIMD decode 61.000 ms
Base64 decode ratio (SIMD/CN1) 0.910x (9.0% faster)
Base64 encode ratio (SIMD/native) 0.073x (92.7% faster)
Base64 decode ratio (SIMD/native) 0.159x (84.1% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 14.000 ms
Image createMask (SIMD on) 14.000 ms
Image createMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image applyMask (SIMD off) 112.000 ms
Image applyMask (SIMD on) 95.000 ms
Image applyMask ratio (SIMD on/off) 0.848x (15.2% faster)
Image modifyAlpha (SIMD off) 52.000 ms
Image modifyAlpha (SIMD on) 52.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.000x (0.0% slower)
Image modifyAlpha removeColor (SIMD off) 86.000 ms
Image modifyAlpha removeColor (SIMD on) 78.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.907x (9.3% faster)

@shai-almog

shai-almog commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 193 screenshots: 193 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 75000 ms
Simulator Boot (Run) 1000 ms
App Install 20000 ms
App Launch 8000 ms
Test Execution 466000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 442ms / native 5ms = 88.4x speedup
SIMD float-mul (64K x300) java 278ms / native 12ms = 23.1x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 119.000 ms
Base64 CN1 decode 104.000 ms
Base64 native encode 788.000 ms
Base64 encode ratio (CN1/native) 0.151x (84.9% faster)
Base64 native decode 2050.000 ms
Base64 decode ratio (CN1/native) 0.051x (94.9% faster)
Base64 SIMD encode 134.000 ms
Base64 encode ratio (SIMD/CN1) 1.126x (12.6% slower)
Base64 SIMD decode 64.000 ms
Base64 decode ratio (SIMD/CN1) 0.615x (38.5% faster)
Base64 encode ratio (SIMD/native) 0.170x (83.0% faster)
Base64 decode ratio (SIMD/native) 0.031x (96.9% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 25.000 ms
Image createMask ratio (SIMD on/off) 3.125x (212.5% slower)
Image applyMask (SIMD off) 360.000 ms
Image applyMask (SIMD on) 426.000 ms
Image applyMask ratio (SIMD on/off) 1.183x (18.3% slower)
Image modifyAlpha (SIMD off) 31.000 ms
Image modifyAlpha (SIMD on) 74.000 ms
Image modifyAlpha ratio (SIMD on/off) 2.387x (138.7% slower)
Image modifyAlpha removeColor (SIMD off) 117.000 ms
Image modifyAlpha removeColor (SIMD on) 490.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 4.188x (318.8% slower)

@shai-almog

shai-almog commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

The doc-snippets gate compiles every snippet the way the Playground runs
it: the javadoc one used an undeclared variable and the guide one called
a method outside its tagged region.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@shai-almog
shai-almog merged commit 7b22e6c into master Nov 12, 2026
48 of 50 checks passed
@shai-almog
shai-almog deleted the keyboard-action-numeric branch November 12, 2026 08:25
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