[foreign-memaccess+abi] RFR: 8291826: Rework MemoryLayout Sealed Hierarchy
Per Minborg
duke at openjdk.org
Thu Aug 18 14:05:19 UTC 2022
This PR is a significant refactor of the `MemoryLayout` sealed hierarchy and whose purpose is described more in detail in https://bugs.openjdk.org/browse/JDK-8291826. In short, the main purpose is to allow pattern matching.
The objective of the PR is to fix the issues described above while retaining as much API compatibility as possible with the pre-PR API. No changes were needed in any of the existing tests for example.
The old sealed hierarchy prevented pattern matching with totality to be used and implied a number of other problems as illustrated in the picture below:
![graphviz (33)](https://user-images.githubusercontent.com/7457876/185412743-febeb3cf-aebc-4e2e-b78f-3b8ef87b0510.png)
Red nodes cannot be used in pattern matching. Light red nodes are implementations that are visible in the API. White nodes are interfaces.
After this PR has been integrated, an improved sealed hierarchy will exist as depicted here:
![graphviz (34)](https://user-images.githubusercontent.com/7457876/185413448-8435b23f-5ac4-4999-8b0a-0d6051a0d9be.png)
Gray "Impl" nodes are internal and not exported by the `java.base` module. White nodes are interfaces.
Below, the "Principal Totalities" for the new API are outlined:
var v0 = switch (memoryLayout) {
case MemoryLayout ml -> 0;
};
var v1 = switch (memoryLayout) {
case GroupLayout gl -> 0;
case PaddingLayout pl -> 0; // leaf
case SequenceLayout sl -> 0; // leaf
case ValueLayout vl -> 0;
};
var v2 = switch (memoryLayout) {
case PaddingLayout pl -> 0; // leaf
case SequenceLayout sl -> 0; // leaf
case ValueLayout vl -> 0;
case StructLayout sl -> 0; // leaf
case UnionLayout ul -> 0; // leaf
};
var v3 = switch (memoryLayout) {
case PaddingLayout pl -> 0; // leaf
case SequenceLayout sl -> 0; // leaf
case StructLayout sl -> 0; // leaf
case UnionLayout ul -> 0; // leaf
case OfAddress oa -> 0; // leaf
case OfBoolean ob -> 0; // leaf
case OfByte ob -> 0; // leaf
case OfChar oc -> 0; // leaf
case OfDouble od -> 0; // leaf
case OfFloat of -> 0; // leaf
case OfInt oi -> 0; // leaf
case OfLong ol -> 0; // leaf
case OfShort os -> 0; // leaf
};
var v4 = switch (memoryLayout) {
case GroupLayout gl -> 0;
case PaddingLayout pl -> 0; // leaf
case SequenceLayout sl -> 0; // leaf
case OfAddress oa -> 0; // leaf
case OfBoolean ob -> 0; // leaf
case OfByte ob -> 0; // leaf
case OfChar oc -> 0; // leaf
case OfDouble od -> 0; // leaf
case OfFloat of -> 0; // leaf
case OfInt oi -> 0; // leaf
case OfLong ol -> 0; // leaf
case OfShort os -> 0; // leaf
};
Additional improvements can be made later in a separate PR, including removing/improving some of the internal abstract classes.
-------------
Commit messages:
- Add tests and update return types
- Rework MemoryLayout Sealed Hierarchy
Changes: https://git.openjdk.org/panama-foreign/pull/710/files
Webrev: https://webrevs.openjdk.org/?repo=panama-foreign&pr=710&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8291826
Stats: 2702 lines in 21 files changed: 1793 ins; 732 del; 177 mod
Patch: https://git.openjdk.org/panama-foreign/pull/710.diff
Fetch: git fetch https://git.openjdk.org/panama-foreign pull/710/head:pull/710
PR: https://git.openjdk.org/panama-foreign/pull/710
More information about the panama-dev
mailing list