Files

63 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Regenerates output/. Needs JDK 25 and a JDK 28 early-access build (default location below; see output/00-environment.txt).
# Early-access builds change weekly: expect these transcripts to need regenerating, and re-read the post's status callout.
set -uo pipefail
cd "$(dirname "$0")/.."
J28=${JDK28:-/tmp/tools/jdk28}; J25=${JDK25:-/tmp/tools/jdk-25.0.4.1+1}; OUT=$PWD/output; W=/tmp/jdk28-preview-work; rm -rf "$W"; mkdir -p "$W" "$OUT"
q() { grep -v -E '^Picked up'; }
ver() { "$1/bin/java" -version 2>&1 | q | sed -n '1p;3p'; }
{ echo "# 00-environment"; echo "--- JDK 28 early-access:"; ver "$J28"; echo "--- JDK 25:"; ver "$J25"; } > "$OUT/00-environment.txt"
{ echo "# 01-value-classes: ValueClasses.java on JDK 28 with --enable-preview"
"$J28/bin/javac" --enable-preview --release 28 -d "$W" src/ValueClasses.java 2>&1 | q | grep -v '^Note:'
"$J28/bin/java" --enable-preview -cp "$W" ValueClasses 2>&1 | q
echo "--- IntegerIdentity.java: same source, three runs"
"$J25/bin/javac" -d "$W/i25" src/IntegerIdentity.java 2>&1 | q; "$J28/bin/javac" --enable-preview --release 28 -d "$W/i28" src/IntegerIdentity.java 2>&1 | q | grep -v '^Note:'
echo "JDK 25: $("$J25/bin/java" -cp "$W/i25" IntegerIdentity 2>&1 | q)"
echo "JDK 28, no preview: $("$J28/bin/java" -cp "$W/i25" IntegerIdentity 2>&1 | q)"
echo "JDK 28, --enable-preview: $("$J28/bin/java" --enable-preview -cp "$W/i28" IntegerIdentity 2>&1 | q)"
} > "$OUT/01-value-classes.txt"
{ echo "# 02-forgot-the-preview-flag"
echo "--- javac ValueClasses.java (no --enable-preview):"; "$J28/bin/javac" -d "$W/n" src/ValueClasses.java 2>&1 | q | head -4
echo "--- java ValueClasses (compiled with the flag, run without):"; "$J28/bin/java" -cp "$W" ValueClasses 2>&1 | q | head -2
} > "$OUT/02-forgot-the-preview-flag.txt"
"$J28/bin/javac" --enable-preview --release 28 -d "$W/s" src/StrictFieldProbe.java 2>&1 | q >/dev/null
{ echo "# 03-strict-init-flags (javap -v -p, field flags only)"
for c in 'StrictFieldProbe$Money' 'StrictFieldProbe$Legacy'; do echo "--- $c"; "$J28/bin/javap" -v -p -cp "$W/s" "$c" 2>&1 | q | grep -A2 -E '^ (final )?long cents;' | grep -E 'cents|flags' ; done
} > "$OUT/03-strict-init-flags.txt"
{ echo "# 04-pem-encodings (JEP 542): PemRoundTrip.java"
echo "--- JDK 28, no flags:"; "$J28/bin/javac" -d "$W/p28" src/PemRoundTrip.java 2>&1 | q; "$J28/bin/java" -cp "$W/p28" PemRoundTrip 2>&1 | q
echo "--- JDK 25, no flags:"; "$J25/bin/javac" -d "$W/p25" src/PemRoundTrip.java 2>&1 | q | head -3
echo "--- JDK 25, --enable-preview:"; "$J25/bin/javac" --enable-preview --release 25 -d "$W/p25" src/PemRoundTrip.java 2>&1 | q | grep -v '^Note:'; "$J25/bin/java" --enable-preview -cp "$W/p25" PemRoundTrip 2>&1 | q
} > "$OUT/04-pem-encodings.txt"
{ echo "# 05-json-incubator (JEP 540): JsonDemo.java on JDK 28"
echo "--- module and API surface:"; "$J28/bin/java" --describe-module jdk.incubator.json 2>&1 | q | head -3
"$J28/bin/javap" --module jdk.incubator.json -public jdk.incubator.json.Json 2>&1 | q | grep -E 'parse|toDisplay'
echo "--- without --add-modules:"; "$J28/bin/javac" -d "$W/j" src/JsonDemo.java 2>&1 | q | head -2
echo "--- with --add-modules jdk.incubator.json:"
"$J28/bin/javac" --add-modules jdk.incubator.json -d "$W/j" src/JsonDemo.java 2>&1 | q | grep -v -E '^(Note:|warning:|1 warning)'
"$J28/bin/java" --add-modules jdk.incubator.json -cp "$W/j" JsonDemo 2>&1 | q | grep -v '^WARNING'
} > "$OUT/05-json-incubator.txt"
{ echo "# 06-shenandoah (JEP 535: generational mode by default)"
echo "--- JDK 28 EA build, -XX:+UseShenandoahGC:"; "$J28/bin/java" -XX:+UseShenandoahGC -Xlog:gc=info -version 2>&1 | q | head -2
echo "--- JDK 25 Temurin, -XX:+UseShenandoahGC -Xlog:gc*:"; "$J25/bin/java" -XX:+UseShenandoahGC -Xlog:gc*=info -version 2>&1 | q | grep -E 'Using Shenandoah|Mode:'
} > "$OUT/06-shenandoah.txt"
cat > "$OUT/07-jep-status.txt" <<'EOT'
# 07-jep-status (quoted from published articles on 2026-09-28; NOT produced by running code; status changes weekly)
InfoQ, "JDK 27 and JDK 28: What We Know So Far" (https://www.infoq.com/news/2026/08/java-27-so-far/), August 2026:
Targeted to JDK 28: JEP 541 Deprecate the macOS/x64 Port for Removal; JEP 540 Simple JSON API (Incubator);
JEP 539 Strict Field Initialization in the JVM (Preview); JEP 535 Shenandoah GC: Generational Mode by Default; JEP 401 Value Objects (Preview)
Proposed to target: JEP 542 PEM Encodings of Cryptographic Objects
"Scheduled for a GA release in March 2027"
Inside.java, 2026-09-20 (https://inside.java/2026/09/20/jep401-target-jdk28/): "JEP targeted to JDK 28: 401: Value Objects (Preview)"
EOT
ls -1 "$OUT"