From d8f73a7bc8f93081bc77afcdf29bf5b768334b8d Mon Sep 17 00:00:00 2001 From: Davide Angelocola Date: Wed, 24 Jun 2026 08:38:06 +0200 Subject: [PATCH] refactor(fbs): collapse fbsrt runtime into generated fbs package Move FbsBuilder/FbsStruct/FbsTable from io.github.dfa1.vortex.fbsrt into the generated io.github.dfa1.vortex.fbs package so readers, builders, and runtime base classes share one package. FbsTable/FbsStruct stay package-private; FbsBuilder public for the writer module. Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 5 ++++- .../src/main/java/io/github/dfa1/vortex/fbs/FbsArray.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsArrayNode.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsArraySpec.java | 2 -- .../java/io/github/dfa1/vortex/fbs/FbsArrayStats.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsBinary.java | 2 -- core/src/main/java/io/github/dfa1/vortex/fbs/FbsBool.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsBuffer.java | 2 -- .../io/github/dfa1/vortex/{fbsrt => fbs}/FbsBuilder.java | 2 +- .../io/github/dfa1/vortex/fbs/FbsCompressionSpec.java | 2 -- .../src/main/java/io/github/dfa1/vortex/fbs/FbsDType.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsDecimal.java | 2 -- .../java/io/github/dfa1/vortex/fbs/FbsEncryptionSpec.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsExtension.java | 2 -- .../java/io/github/dfa1/vortex/fbs/FbsFileStatistics.java | 2 -- .../java/io/github/dfa1/vortex/fbs/FbsFixedSizeList.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsFooter.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsLayout.java | 2 -- .../java/io/github/dfa1/vortex/fbs/FbsLayoutSpec.java | 2 -- core/src/main/java/io/github/dfa1/vortex/fbs/FbsList.java | 2 -- core/src/main/java/io/github/dfa1/vortex/fbs/FbsNull.java | 2 -- .../java/io/github/dfa1/vortex/fbs/FbsPostscript.java | 2 -- .../io/github/dfa1/vortex/fbs/FbsPostscriptSegment.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsPrimitive.java | 2 -- .../java/io/github/dfa1/vortex/fbs/FbsSegmentSpec.java | 2 -- .../io/github/dfa1/vortex/{fbsrt => fbs}/FbsStruct.java | 6 ++++-- .../main/java/io/github/dfa1/vortex/fbs/FbsStruct_.java | 2 -- .../io/github/dfa1/vortex/{fbsrt => fbs}/FbsTable.java | 8 +++++--- .../src/main/java/io/github/dfa1/vortex/fbs/FbsUnion.java | 2 -- core/src/main/java/io/github/dfa1/vortex/fbs/FbsUtf8.java | 2 -- .../main/java/io/github/dfa1/vortex/fbs/FbsVariant.java | 2 -- docs/adr/0017-in-house-flatbuffers-codegen.md | 2 +- .../main/java/io/github/dfa1/vortex/fbsgen/CodeGen.java | 8 ++------ .../java/io/github/dfa1/vortex/reader/ArrayStatsTest.java | 2 +- .../dfa1/vortex/reader/FlatSegmentBoundsSecurityTest.java | 2 +- .../dfa1/vortex/reader/FlatSegmentDecoderDecodeTest.java | 2 +- .../dfa1/vortex/reader/LayoutDepthBombSecurityTest.java | 2 +- .../java/io/github/dfa1/vortex/reader/MalformedFiles.java | 2 +- .../vortex/reader/PostscriptParserBigSegmentTest.java | 2 +- .../vortex/reader/PostscriptParserBlobBoundsTest.java | 2 +- .../reader/PostscriptParserParseBlobsBoundsTest.java | 2 +- .../io/github/dfa1/vortex/reader/ZipBombSecurityTest.java | 2 +- .../java/io/github/dfa1/vortex/writer/VortexWriter.java | 2 +- 43 files changed, 27 insertions(+), 78 deletions(-) rename core/src/main/java/io/github/dfa1/vortex/{fbsrt => fbs}/FbsBuilder.java (99%) rename core/src/main/java/io/github/dfa1/vortex/{fbsrt => fbs}/FbsStruct.java (95%) rename core/src/main/java/io/github/dfa1/vortex/{fbsrt => fbs}/FbsTable.java (97%) diff --git a/CLAUDE.md b/CLAUDE.md index ff1a491f..0bca850d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,7 +70,10 @@ Regenerate after editing `.fbs`/`.proto` (both generators are in-house, no exter Both schema languages are compiled in-process to MemorySegment-native Java, with no `flatc`/`protoc` and no `com.google.flatbuffers`/`protobuf-java` runtime (ADR 0017): - **`.fbs` → `fbs-gen`** (`io.github.dfa1.vortex.fbsgen`): generates readers extending - `FbsTable`/`FbsStruct` and builders over `FbsBuilder` (all in `io.github.dfa1.vortex.fbsrt`). + `FbsTable`/`FbsStruct` and builders over `FbsBuilder`, all in the same generated package + `io.github.dfa1.vortex.fbs`. The runtime base classes `FbsTable`/`FbsStruct` are + package-private (only generated readers extend them); `FbsBuilder` is public because the + writer module assembles FlatBuffers with it. - **`.proto` → `proto-gen`**: one record per message with static `decode(MemorySegment, long, long)` + `encode()` operating directly on a segment. diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArray.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArray.java index 1f08f5fb..0531cff5 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArray.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArray.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayNode.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayNode.java index d867d095..3bbc8a73 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayNode.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayNode.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArraySpec.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArraySpec.java index 03b16e38..756516a5 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArraySpec.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArraySpec.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayStats.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayStats.java index 85d8d1a3..bc56c13e 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayStats.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsArrayStats.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBinary.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBinary.java index cbb5d19b..7dfc8f66 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBinary.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBinary.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBool.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBool.java index 45034548..4b352377 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBool.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBool.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBuffer.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBuffer.java index 53c06d77..ea463c7f 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBuffer.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBuffer.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsStruct; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsBuilder.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBuilder.java similarity index 99% rename from core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsBuilder.java rename to core/src/main/java/io/github/dfa1/vortex/fbs/FbsBuilder.java index eb15e704..b85d1974 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsBuilder.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsBuilder.java @@ -1,4 +1,4 @@ -package io.github.dfa1.vortex.fbsrt; +package io.github.dfa1.vortex.fbs; import static io.github.dfa1.vortex.encoding.PTypeIO.LE_DOUBLE; import static io.github.dfa1.vortex.encoding.PTypeIO.LE_FLOAT; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsCompressionSpec.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsCompressionSpec.java index 733886ff..f7608b6a 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsCompressionSpec.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsCompressionSpec.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDType.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDType.java index 1afeed14..8609e331 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDType.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDType.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDecimal.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDecimal.java index 8e93aa6d..3084c802 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDecimal.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsDecimal.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsEncryptionSpec.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsEncryptionSpec.java index ccb2d419..5cf41a9a 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsEncryptionSpec.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsEncryptionSpec.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsExtension.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsExtension.java index fec4f2b0..66acdef2 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsExtension.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsExtension.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFileStatistics.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFileStatistics.java index bc5c37e3..26804e1b 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFileStatistics.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFileStatistics.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFixedSizeList.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFixedSizeList.java index c46dca1b..5c24489b 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFixedSizeList.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFixedSizeList.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFooter.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFooter.java index 9155a50c..f5f6535f 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFooter.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsFooter.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayout.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayout.java index 666b46ca..7364100f 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayout.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayout.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayoutSpec.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayoutSpec.java index a7b7aae3..9fccdb2e 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayoutSpec.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsLayoutSpec.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsList.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsList.java index 9473ba2f..d6d4b7e2 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsList.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsList.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsNull.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsNull.java index 295a62a1..59a95374 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsNull.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsNull.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscript.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscript.java index b0f670ef..f728afa2 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscript.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscript.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscriptSegment.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscriptSegment.java index 8d197d83..b3829109 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscriptSegment.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPostscriptSegment.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPrimitive.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPrimitive.java index ee51d67b..b320819b 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPrimitive.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsPrimitive.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsSegmentSpec.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsSegmentSpec.java index be3aab2f..9c055489 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsSegmentSpec.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsSegmentSpec.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsStruct; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsStruct.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsStruct.java similarity index 95% rename from core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsStruct.java rename to core/src/main/java/io/github/dfa1/vortex/fbs/FbsStruct.java index 22553f6f..dfd6d4ba 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsStruct.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsStruct.java @@ -1,4 +1,4 @@ -package io.github.dfa1.vortex.fbsrt; +package io.github.dfa1.vortex.fbs; import static io.github.dfa1.vortex.encoding.PTypeIO.LE_DOUBLE; import static io.github.dfa1.vortex.encoding.PTypeIO.LE_FLOAT; @@ -15,7 +15,9 @@ /// vtable: every field lives at a compile-time-constant byte offset from the /// struct position, and every field is always present. Generated accessors read /// directly at `position + fieldOffset`. -public class FbsStruct { +/// +/// Package-private: only the generated struct accessors in this package extend it. +class FbsStruct { /// The backing buffer. protected MemorySegment seg; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsStruct_.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsStruct_.java index a88bbb88..a95d99ae 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsStruct_.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsStruct_.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsTable.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsTable.java similarity index 97% rename from core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsTable.java rename to core/src/main/java/io/github/dfa1/vortex/fbs/FbsTable.java index 2e6d2cd1..46c8088b 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbsrt/FbsTable.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsTable.java @@ -1,4 +1,4 @@ -package io.github.dfa1.vortex.fbsrt; +package io.github.dfa1.vortex.fbs; import static io.github.dfa1.vortex.encoding.PTypeIO.LE_DOUBLE; import static io.github.dfa1.vortex.encoding.PTypeIO.LE_FLOAT; @@ -28,7 +28,9 @@ /// expected to have framed the FlatBuffer from a trusted region. File-level framing /// (segment offsets/lengths, trailer, postscript) is range-checked upstream by the /// reader's `IoBounds`; intra-FlatBuffer fields are not. -public class FbsTable { +/// +/// Package-private: only the generated table accessors in this package extend it. +class FbsTable { /// The backing buffer (typically a zero-copy slice of the mmap'd file). protected MemorySegment seg; @@ -54,7 +56,7 @@ protected final void init(MemorySegment segment, long position) { /// @param segment buffer whose first 4 bytes hold the uoffset to the root table /// @param start byte position of the buffer start within `segment` /// @return the absolute position of the root table - public static long rootPosition(MemorySegment segment, long start) { + static long rootPosition(MemorySegment segment, long start) { return start + segment.get(LE_INT, start); } diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUnion.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUnion.java index 8b123769..7176d308 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUnion.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUnion.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUtf8.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUtf8.java index 020ef830..59e91631 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUtf8.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsUtf8.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsVariant.java b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsVariant.java index 8458fbce..3fa51b87 100644 --- a/core/src/main/java/io/github/dfa1/vortex/fbs/FbsVariant.java +++ b/core/src/main/java/io/github/dfa1/vortex/fbs/FbsVariant.java @@ -2,8 +2,6 @@ package io.github.dfa1.vortex.fbs; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; -import io.github.dfa1.vortex.fbsrt.FbsTable; import java.lang.foreign.MemorySegment; import javax.annotation.processing.Generated; diff --git a/docs/adr/0017-in-house-flatbuffers-codegen.md b/docs/adr/0017-in-house-flatbuffers-codegen.md index 5f5e7863..fa14d6c9 100644 --- a/docs/adr/0017-in-house-flatbuffers-codegen.md +++ b/docs/adr/0017-in-house-flatbuffers-codegen.md @@ -131,7 +131,7 @@ the in-house path matches byte-for-byte on the full integration suite. ## Known limitations -- **No intra-FlatBuffer bounds checks** in the `fbsrt` read path (e.g. +- **No intra-FlatBuffer bounds checks** in the `FbsTable`/`FbsStruct` read path (e.g. `FbsTable.readStringAt` allocates `new byte[len]` with `len` from the blob). Same posture as the previous `com.google.flatbuffers` runtime; file-level framing is range-checked upstream by `IoBounds`, intra-FlatBuffer fields are not. Trusted-blob diff --git a/fbs-gen/src/main/java/io/github/dfa1/vortex/fbsgen/CodeGen.java b/fbs-gen/src/main/java/io/github/dfa1/vortex/fbsgen/CodeGen.java index 86488867..a92db5df 100644 --- a/fbs-gen/src/main/java/io/github/dfa1/vortex/fbsgen/CodeGen.java +++ b/fbs-gen/src/main/java/io/github/dfa1/vortex/fbsgen/CodeGen.java @@ -19,8 +19,6 @@ /// The wire layout is the standard FlatBuffers binary format — see [FbsTable]/[FbsBuilder]. public final class CodeGen { - private static final String RUNTIME_PACKAGE = "io.github.dfa1.vortex.fbsrt"; - /// Prefix applied to every emitted Java class name so the generated wire-format /// classes (`Array`, `DType`, `Bool`, `List`, …) do not collide with project or JDK /// types of the same name. Schema files keep the upstream (unprefixed) names; the @@ -75,8 +73,7 @@ private static String className(String schemaName) { private String emitTable(Ast.TableDecl table) { String name = className(table.name()); StringBuilder sb = new StringBuilder(); - sb.append(preamble("import " + RUNTIME_PACKAGE + ".FbsBuilder;\nimport " + RUNTIME_PACKAGE - + ".FbsTable;\nimport java.lang.foreign.MemorySegment;\n")); + sb.append(preamble("import java.lang.foreign.MemorySegment;\n")); sb.append("/// Reader and builder for the `").append(table.name()).append("` FlatBuffers table.\n"); sb.append(GENERATED_ANNOTATION); sb.append("public final class ").append(name).append(" extends FbsTable {\n\n"); @@ -257,8 +254,7 @@ private String emitStruct(Ast.StructDecl struct) { String name = className(struct.name()); TypeRegistry.StructLayout layout = registry.layoutOf(struct); StringBuilder sb = new StringBuilder(); - sb.append(preamble("import " + RUNTIME_PACKAGE + ".FbsBuilder;\nimport " + RUNTIME_PACKAGE - + ".FbsStruct;\nimport java.lang.foreign.MemorySegment;\n")); + sb.append(preamble("import java.lang.foreign.MemorySegment;\n")); sb.append("/// Reader and builder for the `").append(struct.name()).append("` FlatBuffers struct (inline, ") .append(layout.size()).append(" bytes).\n"); sb.append(GENERATED_ANNOTATION); diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/ArrayStatsTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/ArrayStatsTest.java index 096d5a3d..cc4f27a9 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/ArrayStatsTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/ArrayStatsTest.java @@ -1,6 +1,6 @@ package io.github.dfa1.vortex.reader; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.core.VortexException; import io.github.dfa1.vortex.proto.ProtoScalarValue; import org.junit.jupiter.api.Nested; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentBoundsSecurityTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentBoundsSecurityTest.java index e939c36c..aa87cb95 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentBoundsSecurityTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentBoundsSecurityTest.java @@ -1,7 +1,7 @@ package io.github.dfa1.vortex.reader; import io.github.dfa1.vortex.encoding.PTypeIO; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.core.DType; import io.github.dfa1.vortex.core.VortexException; import io.github.dfa1.vortex.fbs.FbsArray; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentDecoderDecodeTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentDecoderDecodeTest.java index 0b810a80..7bc67b6c 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentDecoderDecodeTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/FlatSegmentDecoderDecodeTest.java @@ -2,7 +2,7 @@ import io.github.dfa1.vortex.fbs.FbsArrayNode; import io.github.dfa1.vortex.fbs.FbsBuffer; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.core.DType; import io.github.dfa1.vortex.reader.array.Array; import io.github.dfa1.vortex.reader.array.UnknownArray; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/LayoutDepthBombSecurityTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/LayoutDepthBombSecurityTest.java index 8c0b4992..15f5984f 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/LayoutDepthBombSecurityTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/LayoutDepthBombSecurityTest.java @@ -1,6 +1,6 @@ package io.github.dfa1.vortex.reader; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import static io.github.dfa1.vortex.reader.MalformedFiles.buildFooter; import static io.github.dfa1.vortex.reader.MalformedFiles.buildI64Dtype; import static io.github.dfa1.vortex.reader.MalformedFiles.buildPostscript; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/MalformedFiles.java b/reader/src/test/java/io/github/dfa1/vortex/reader/MalformedFiles.java index c90d3c03..8dd7e466 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/MalformedFiles.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/MalformedFiles.java @@ -1,6 +1,6 @@ package io.github.dfa1.vortex.reader; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.fbs.FbsArraySpec; import io.github.dfa1.vortex.fbs.FbsFooter; import io.github.dfa1.vortex.fbs.FbsLayout; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBigSegmentTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBigSegmentTest.java index 558ec7e7..c90f2a53 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBigSegmentTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBigSegmentTest.java @@ -1,6 +1,6 @@ package io.github.dfa1.vortex.reader; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.fbs.FbsArraySpec; import io.github.dfa1.vortex.fbs.FbsLayoutSpec; import org.junit.jupiter.api.Test; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBlobBoundsTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBlobBoundsTest.java index 5c98158e..519acb5c 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBlobBoundsTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserBlobBoundsTest.java @@ -1,6 +1,6 @@ package io.github.dfa1.vortex.reader; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.core.VortexException; import io.github.dfa1.vortex.fbs.FbsArraySpec; import io.github.dfa1.vortex.fbs.FbsFooter; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserParseBlobsBoundsTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserParseBlobsBoundsTest.java index 49239a0c..8a975e6d 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserParseBlobsBoundsTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/PostscriptParserParseBlobsBoundsTest.java @@ -2,7 +2,7 @@ import java.lang.foreign.MemorySegment; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.core.DType; import io.github.dfa1.vortex.core.VortexException; import io.github.dfa1.vortex.fbs.FbsArraySpec; diff --git a/reader/src/test/java/io/github/dfa1/vortex/reader/ZipBombSecurityTest.java b/reader/src/test/java/io/github/dfa1/vortex/reader/ZipBombSecurityTest.java index 17ad3ee4..26462d38 100644 --- a/reader/src/test/java/io/github/dfa1/vortex/reader/ZipBombSecurityTest.java +++ b/reader/src/test/java/io/github/dfa1/vortex/reader/ZipBombSecurityTest.java @@ -1,6 +1,6 @@ package io.github.dfa1.vortex.reader; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import static io.github.dfa1.vortex.reader.MalformedFiles.buildFooter; import static io.github.dfa1.vortex.reader.MalformedFiles.buildI64Dtype; import static io.github.dfa1.vortex.reader.MalformedFiles.buildFlatLayout; diff --git a/writer/src/main/java/io/github/dfa1/vortex/writer/VortexWriter.java b/writer/src/main/java/io/github/dfa1/vortex/writer/VortexWriter.java index d405d77b..73844e98 100644 --- a/writer/src/main/java/io/github/dfa1/vortex/writer/VortexWriter.java +++ b/writer/src/main/java/io/github/dfa1/vortex/writer/VortexWriter.java @@ -1,6 +1,6 @@ package io.github.dfa1.vortex.writer; -import io.github.dfa1.vortex.fbsrt.FbsBuilder; +import io.github.dfa1.vortex.fbs.FbsBuilder; import io.github.dfa1.vortex.writer.encode.DateTimePartsData; import io.github.dfa1.vortex.writer.encode.FixedSizeListData; import io.github.dfa1.vortex.writer.encode.ListData;