Skip to content

Package a backend with the JDK the developer already has - #5859

Merged
shai-almog merged 3 commits into
masterfrom
backend-package-any-jdk
Sep 18, 2026
Merged

shai-almog merged 3 commits into
masterfrom
backend-package-any-jdk

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

The bug

cn1:backend-package demanded a JDK 8 and refused to run without one, so a
developer on a current JDK was told to install a compiler from 2014 to build a
server.

The premise, written into resolveJdk8 and into the test that guarded it, was
that a newer javac emits class files the translator cannot read. It does not:
the compile passes -source 1.8 -target 1.8, so the output is class file
version 52 whichever javac produces it.

Measured rather than assumed. Compiling vm/backend/src + impl/parparvm
against the vm/JavaAPI bootclasspath under javac 8, 17, 21 and 25 gives the
same 119 classes at major version 52 in every case, with no invokedynamic
string concatenation on any of them. The bootclasspath still bites identically
too -- a probe referencing java.nio.file and java.util.concurrent.ForkJoinPool
fails to compile under all four, so the property that confines a backend to the
server-safe surface is not weakened by this change.

The fix

BackendPackageMojo -- resolveJdk takes any JDK 8 or newer and prefers
the one already running Maven, so an ordinary project configures nothing.
-Dcn1.backend.jdk names another. cn1.backend.jdk8 and JDK_8_HOME keep
selecting one, because projects and CI jobs were required to set them and
dropping a requirement must not break the setups made to satisfy it. Below 8 is
refused by reading javac -version; a javac that cannot be asked its version is
accepted, because the compile that follows reports what is really wrong with it.
A javac that has dropped -source 8 -- 21 and 25 already warn that it is
obsolete -- has its own wording rewritten with a remedy, since it names none.

JavaSourceCompiler -- a second defect the first one was hiding. It compiled
every generated source in-process with no -source/-target, so the class file
version was the running JDK's default. Everything the annotation processors
generate is Codename One code that gets translated: an app's routers, mappers and
bindings through ParparVM, a backend's entry point through this goal. On a JDK 25
the generated BackendApplication therefore came out at version 69 and the
translator died with Unsupported class file major version 69, naming ASM and a
class the developer never wrote. It now emits Java 8 bytecode by default, and an
overload takes an explicit level for the one fixture in the tree that needs a
newer language than 8 -- a record.

The missing check

Nothing had ever run this goal, which is why the demand went unexamined for as
long as it did: cn1app-archetype-test.sh stopped at process-classes, and the
platform builds sit behind their own SDK checks.

It now packages the generated backend natively with JDK_8_HOME removed from
the environment
-- left set, the goal would take that path and the check would
pass while the developer's build still failed -- then starts the binary and
asserts that /healthz answers. "The file exists" would have passed on a binary
that cannot start. archetype-smoke.yml installs a JDK 21 for it and requires
clang, because a skipped check reads exactly like a passing one.

Verification

End to end, not by unit test alone. A freshly generated project packaged on a
JDK 25 with JDK_8_HOME unset produces a 5.4MB native binary that answers
/healthz with ok and /echo?say=works with {"say":"works"}.

  • plugin suite 2393/2393 on JDK 8, 21 and 25
  • SpotBugs: 0 findings
  • copyright, control-character and ASCII gates clean over the branch range

RecordMappingTest carried a truncated copyright header on master. The gate is
diff-scoped, so editing the file would have failed CI; it now has the complete
one.

Deliberately unchanged

  • The Java 8 language level. The backend module's sources are compiled twice
    -- once by Maven, once against the JavaAPI bootclasspath -- and ParparVM reads
    class file version 52. That is a real constraint, not a leftover. -source 8
    is already warned obsolete on 21 and 25, so a JDK that removes it breaks the
    archetype's app module too; that deserves its own pass.
  • A compile-scoped dependency carrying its own main still fails translation
    with "Multiple main classes". The archetype scopes sqlite-jdbc to runtime,
    so it does not bite today. Separate bug on the same goal.

🤖 Generated with Claude Code

`cn1:backend-package` demanded a JDK 8 and refused to run without one, so a
developer on a current JDK was told to install a compiler from 2014 to build a
server. The premise was that a newer javac emits class files the translator
cannot read. It does not: the compile passes `-source 1.8 -target 1.8`, so the
output is class file version 52 whichever javac produces it, and the JavaAPI
bootclasspath that confines a backend to the server-safe surface is enforced
identically -- a `java.nio.file` reference still fails to compile under javac 8,
17, 21 and 25 alike.

`resolveJdk` now takes any JDK 8 or newer and prefers the one already running
Maven, so an ordinary project configures nothing. `-Dcn1.backend.jdk` names
another; `cn1.backend.jdk8` and `JDK_8_HOME` keep selecting one, because
projects and CI jobs were required to set them. Below 8 is refused by reading
`javac -version`, and a javac that has dropped `-source 8` -- 21 and 25 already
warn that it is obsolete -- gets its own wording rewritten with a remedy, since
it names none.

Dropping the demand exposed a second defect it had been hiding.
`JavaSourceCompiler` compiled every generated source in-process with no
`-source`/`-target`, so the class file version was the running JDK's default.
Everything the annotation processors generate is Codename One code that gets
translated -- an app's routers, mappers and bindings through ParparVM, a
backend's entry point through this goal -- and on a JDK 25 the generated
`BackendApplication` came out at version 69 and the translator died with
"Unsupported class file major version 69", naming ASM and a class the developer
never wrote. It now emits Java 8 bytecode by default. An overload takes an
explicit level for the one fixture in the tree that needs a newer language than
8, a record.

Nothing had ever run this goal, which is why the demand went unexamined for as
long as it did: the archetype test stopped at `process-classes` and the platform
builds sit behind their own SDK checks. It now packages the generated backend
natively with `JDK_8_HOME` removed from the environment, starts the binary and
asserts that `/healthz` answers. The workflow installs a JDK 21 for it and
requires clang, because a skipped check reads exactly like a passing one.

Verified end to end rather than by unit test alone: a freshly generated project
packaged on a JDK 25 with `JDK_8_HOME` unset produces a native binary that
answers `/healthz` with `ok` and `/echo?say=works` with `{"say":"works"}`. The
plugin suite is 2393/2393 on JDK 8, 21 and 25, and SpotBugs reports nothing.

Unchanged on purpose: the module's sources are still compiled at Java 8, because
that is the bytecode the translator reads.

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

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 18, 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-09-18T12:05:08.535380Z df8eb63 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.

@github-actions

github-actions Bot commented Sep 18, 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)

The packaging check added with the previous commit translated perfectly well on
the JDK 21 it was given, then failed compiling the generated C on
"'curl/curl.h' file not found". clang alone cannot build a backend binary: it
links -lcurl -lssl -lcrypto -lnghttp2 -- outbound TLS is libcurl's, the auth
primitives are OpenSSL's, the HTTP/2 framing is nghttp2's -- and the natives
that call them need those headers to compile at all.

The same four packages are installed for the same reason in parparvm-tests.yml,
where their absence used to make every test that builds a server binary compile,
fail at the link and SKIP, reporting the job green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 18, 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)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ ios: 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.

@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: df8eb631bf

ℹ️ 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".

/// generated source that cannot be translated is of no use to a build.
public static void compile(Map<String, String> sources, File outputClassDir, List<File> extraClasspath)
throws IOException {
compile(sources, outputClassDir, extraClasspath, GENERATED_SOURCE_LEVEL);

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 Compile generated sources with the selected JDK

When Maven runs on a JDK that no longer accepts -source 8, setting -Dcn1.backend.jdk to a compatible JDK does not provide the advertised workaround: the initial backend compilation uses the selected executable, but generateControllers() subsequently reaches this overload, which delegates to ToolProvider.getSystemJavaCompiler() from the JDK running Maven and forces source level 8 again. Projects with generated controllers or DAOs therefore still fail after following the new error message; the generated-source compilation must also use the selected JDK.

Useful? React with 👍 / 👎.

Comment thread .github/workflows/archetype-smoke.yml Outdated
Comment on lines +72 to +73
- name: Install xvfb and clang
run: bash scripts/ci/apt-get-install.sh xvfb clang

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Install the native backend development libraries

The new smoke test always links a backend, but this step installs only clang; the generated C includes <nghttp2/nghttp2.h> and the link command requires curl, OpenSSL, and nghttp2. The same Ubuntu environment is handled in .github/workflows/parparvm-tests.yml by explicitly installing libcurl4-openssl-dev, libssl-dev, and libnghttp2-dev, with a comment noting that clang alone is insufficient. On a runner without those development packages—particularly the nghttp2 headers—the newly required packaging check fails before it can test the JDK behavior.

Useful? React with 👍 / 👎.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

…ackend

Two review findings, one of them a defect in the previous commit's error
message.

The message told a developer whose javac has dropped `-source 8` to point
`-Dcn1.backend.jdk` at one that has not. That property selects the two FORKED
steps -- the javac that compiles for translation and the java that runs the
translator -- and nothing else. generateControllers compiles the generated
router and entry point IN PROCESS, through ToolProvider.getSystemJavaCompiler(),
which is the Maven JVM's own compiler and asks for `-source 1.8` as well, so
following the advice would have moved the failure one step and no further.

The message now names the JDK running Maven, which fixes all three steps at
once, and says why the property is not the whole answer. The wording is held
there by a test, because a remedy that does not work is worse than none.

Routing the in-process compile through the selected JDK would not be an
improvement. A release that removes `-source 8` removes it from the Maven JVM
too, and this build needs a javac that emits class file version 52 in many more
places than one mojo -- codenameone-core still compiles at 1.5 -- so the whole
toolchain moves on that day, not this call. That is recorded at
JavaSourceCompiler, where the constraint lives.

The second finding was the libcurl/OpenSSL/nghttp2 headers, already fixed for
the archetype-smoke workflow. It reached `ant.yml` as well, which runs the same
script through integration-tests/all.sh and which the previous commit missed:
that leg failed on 'curl/curl.h' file not found after translating perfectly
well. It gets the same four packages, and CN1_BACKEND_PACKAGE_REQUIRED so the
check cannot skip silently there either. It has no CN1_BACKEND_PACKAGE_JDK, so
it packages with JAVA_HOME -- a JDK 8 -- which is the other half of the matrix
archetype-smoke covers on a JDK 21.

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

shai-almog commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 151 screenshots: 151 matched.

Native Android coverage

  • 📊 Line coverage: 9.24% (9184/99417 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.99% (47211/525067), branch 3.55% (1767/49739), complexity 3.52% (1868/53026), method 5.43% (1514/27888), class 10.89% (407/3736)
    • 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)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 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)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 9.24% (9184/99417 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.99% (47211/525067), branch 3.55% (1767/49739), complexity 3.52% (1868/53026), method 5.43% (1514/27888), class 10.89% (407/3736)
    • 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)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 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)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 123ms / native 86ms = 1.4x speedup
SIMD float-mul (64K x300) java 130ms / native 56ms = 2.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 65.000 ms
Base64 CN1 decode 56.000 ms
Base64 native encode 383.000 ms
Base64 encode ratio (CN1/native) 0.170x (83.0% faster)
Base64 native decode 237.000 ms
Base64 decode ratio (CN1/native) 0.236x (76.4% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 63ms / native 3ms = 21.0x speedup
SIMD float-mul (64K x300) java 74ms / native 3ms = 24.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 168.000 ms
Base64 CN1 decode 133.000 ms
Base64 native encode 681.000 ms
Base64 encode ratio (CN1/native) 0.247x (75.3% faster)
Base64 native decode 248.000 ms
Base64 decode ratio (CN1/native) 0.536x (46.4% faster)
Base64 SIMD encode 66.000 ms
Base64 encode ratio (SIMD/CN1) 0.393x (60.7% faster)
Base64 SIMD decode 57.000 ms
Base64 decode ratio (SIMD/CN1) 0.429x (57.1% faster)
Base64 encode ratio (SIMD/native) 0.097x (90.3% faster)
Base64 decode ratio (SIMD/native) 0.230x (77.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.222x (77.8% faster)
Image applyMask (SIMD off) 47.000 ms
Image applyMask (SIMD on) 32.000 ms
Image applyMask ratio (SIMD on/off) 0.681x (31.9% faster)
Image modifyAlpha (SIMD off) 30.000 ms
Image modifyAlpha (SIMD on) 37.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.233x (23.3% slower)
Image modifyAlpha removeColor (SIMD off) 59.000 ms
Image modifyAlpha removeColor (SIMD on) 50.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.847x (15.3% faster)

@shai-almog

shai-almog commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

shai-almog commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@shai-almog

shai-almog commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 54ms / native 3ms = 18.0x speedup
SIMD float-mul (64K x300) java 54ms / native 3ms = 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 active (NEON-accelerated)
Base64 CN1 encode 157.000 ms
Base64 CN1 decode 92.000 ms
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) 44.000 ms
Image applyMask (SIMD on) 38.000 ms
Image applyMask ratio (SIMD on/off) 0.864x (13.6% faster)
Image modifyAlpha (SIMD off) 46.000 ms
Image modifyAlpha (SIMD on) 34.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.739x (26.1% faster)
Image modifyAlpha removeColor (SIMD off) 60.000 ms
Image modifyAlpha removeColor (SIMD on) 28.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.467x (53.3% faster)

@shai-almog

shai-almog commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 105000 ms
Simulator Boot (Run) 0 ms
App Install 35000 ms
App Launch 5000 ms
Test Execution 432000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 133ms / native 4ms = 33.2x speedup
SIMD float-mul (64K x300) java 193ms / native 5ms = 38.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 218.000 ms
Base64 CN1 decode 220.000 ms
Base64 native encode 684.000 ms
Base64 encode ratio (CN1/native) 0.319x (68.1% faster)
Base64 native decode 418.000 ms
Base64 decode ratio (CN1/native) 0.526x (47.4% faster)
Base64 SIMD encode 150.000 ms
Base64 encode ratio (SIMD/CN1) 0.688x (31.2% faster)
Base64 SIMD decode 81.000 ms
Base64 decode ratio (SIMD/CN1) 0.368x (63.2% faster)
Base64 encode ratio (SIMD/native) 0.219x (78.1% faster)
Base64 decode ratio (SIMD/native) 0.194x (80.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 12.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.250x (75.0% faster)
Image applyMask (SIMD off) 250.000 ms
Image applyMask (SIMD on) 119.000 ms
Image applyMask ratio (SIMD on/off) 0.476x (52.4% faster)
Image modifyAlpha (SIMD off) 219.000 ms
Image modifyAlpha (SIMD on) 94.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.429x (57.1% faster)
Image modifyAlpha removeColor (SIMD off) 56.000 ms
Image modifyAlpha removeColor (SIMD on) 147.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 2.625x (162.5% slower)

@shai-almog
shai-almog merged commit 8054d81 into master Sep 18, 2026
51 of 54 checks passed
@shai-almog
shai-almog deleted the backend-package-any-jdk branch September 18, 2026 14:33
@shai-almog

shai-almog commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

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

@github-actions

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

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

Benchmark Results

  • Execution Time: 18280 ms

  • Hotspots (Top 20 sampled methods):

    • 6.55% java.util.ArrayList.indexOf (97 samples)
    • 6.08% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (90 samples)
    • 5.00% com.codename1.tools.translator.Parser.cn1EnsureSubclassIndex (74 samples)
    • 4.39% java.lang.StringBuilder.append (65 samples)
    • 2.97% org.objectweb.asm.tree.analysis.Analyzer.findSubroutine (44 samples)
    • 2.77% java.lang.System.identityHashCode (41 samples)
    • 2.43% org.objectweb.asm.tree.analysis.Analyzer.analyze (36 samples)
    • 2.43% com.codename1.tools.translator.BytecodeMethod.equals (36 samples)
    • 2.30% com.codename1.tools.translator.Parser.classIndex (34 samples)
    • 2.30% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (34 samples)
    • 2.16% java.lang.String.equals (32 samples)
    • 1.82% java.util.HashMap.putVal (27 samples)
    • 1.69% com.codename1.tools.translator.BytecodeMethod.optimize (25 samples)
    • 1.35% com.codename1.tools.translator.NativeSymbolIndex.<init> (20 samples)
    • 1.28% java.lang.Object.hashCode (19 samples)
    • 1.28% java.lang.StringCoding.encode (19 samples)
    • 1.22% java.util.IdentityHashMap$KeySet.toArray (18 samples)
    • 1.22% org.objectweb.asm.ClassReader.readCode (18 samples)
    • 1.01% java.util.HashMap.hash (15 samples)
    • 0.95% java.util.TreeMap.getEntry (14 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.

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