Memory layouts are "flattened out" so that there is no reuse of previously defined layouts. This makes it harder to understand how layouts are related to each other and consumes unnecessary resources.
For example, jextracting "ifreq.h" will result in the following code:
```
static final StructLayout $struct$LAYOUT = MemoryLayout.structLayout(
MemoryLayout.sequenceLayout(16, Constants$root.C_CHAR$LAYOUT).withName("ifr_name"),
MemoryLayout.unionLayout(
MemoryLayout.structLayout(
Constants$root.C_CHAR$LAYOUT.withName("sa_len"),
Constants$root.C_CHAR$LAYOUT.withName("sa_family"),
MemoryLayout.sequenceLayout(14, Constants$root.C_CHAR$LAYOUT).withName("sa_data")
).withName("ifru_addr"),
MemoryLayout.structLayout(
Constants$root.C_CHAR$LAYOUT.withName("sa_len"),
Constants$root.C_CHAR$LAYOUT.withName("sa_family"),
MemoryLayout.sequenceLayout(14, Constants$root.C_CHAR$LAYOUT).withName("sa_data")
).withName("ifru_dstaddr"),
MemoryLayout.structLayout(
Constants$root.C_CHAR$LAYOUT.withName("sa_len"),
Constants$root.C_CHAR$LAYOUT.withName("sa_family"),
MemoryLayout.sequenceLayout(14, Constants$root.C_CHAR$LAYOUT).withName("sa_data")
).withName("ifru_broadaddr"),
Constants$root.C_SHORT$LAYOUT.withName("ifru_flags"),
Constants$root.C_INT$LAYOUT.withName("ifru_metric"),
Constants$root.C_INT$LAYOUT.withName("ifru_mtu"),
Constants$root.C_INT$LAYOUT.withName("ifru_phys"),
Constants$root.C_INT$LAYOUT.withName("ifru_media"),
Constants$root.C_INT$LAYOUT.withName("ifru_intval"),
Constants$root.C_POINTER$LAYOUT.withName("ifru_data"),
MemoryLayout.structLayout(
Constants$root.C_INT$LAYOUT.withName("ifdm_current"),
Constants$root.C_INT$LAYOUT.withName("ifdm_min"),
Constants$root.C_INT$LAYOUT.withName("ifdm_max")
).withName("ifru_devmtu"),
MemoryLayout.structLayout(
Constants$root.C_INT$LAYOUT.withName("ifk_module_id"),
Constants$root.C_INT$LAYOUT.withName("ifk_type"),
MemoryLayout.unionLayout(
Constants$root.C_POINTER$LAYOUT.withName("ifk_ptr"),
Constants$root.C_INT$LAYOUT.withName("ifk_value")
).withName("ifk_data")
).withName("ifru_kpi"),
Constants$root.C_INT$LAYOUT.withName("ifru_wake_flags"),
Constants$root.C_INT$LAYOUT.withName("ifru_route_refcnt"),
MemoryLayout.sequenceLayout(2, Constants$root.C_INT$LAYOUT).withName("ifru_cap"),
Constants$root.C_INT$LAYOUT.withName("ifru_functional_type")
).withName("ifr_ifru")
).withName("ifreq");
```
But the top three union members are defined like this in C:
```
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
```
and so, it would be better to generate:
```
public static final UnionLayout LAYOUT = MemoryLayout.unionLayout(
sockaddr.$struct$LAYOUT.withName("ifru_addr"),
sockaddr.$struct$LAYOUT.withName("ifru_dstaddr"),
sockaddr.$struct$LAYOUT.withName("ifru_broadaddr"),
```
For example, jextracting "ifreq.h" will result in the following code:
```
static final StructLayout $struct$LAYOUT = MemoryLayout.structLayout(
MemoryLayout.sequenceLayout(16, Constants$root.C_CHAR$LAYOUT).withName("ifr_name"),
MemoryLayout.unionLayout(
MemoryLayout.structLayout(
Constants$root.C_CHAR$LAYOUT.withName("sa_len"),
Constants$root.C_CHAR$LAYOUT.withName("sa_family"),
MemoryLayout.sequenceLayout(14, Constants$root.C_CHAR$LAYOUT).withName("sa_data")
).withName("ifru_addr"),
MemoryLayout.structLayout(
Constants$root.C_CHAR$LAYOUT.withName("sa_len"),
Constants$root.C_CHAR$LAYOUT.withName("sa_family"),
MemoryLayout.sequenceLayout(14, Constants$root.C_CHAR$LAYOUT).withName("sa_data")
).withName("ifru_dstaddr"),
MemoryLayout.structLayout(
Constants$root.C_CHAR$LAYOUT.withName("sa_len"),
Constants$root.C_CHAR$LAYOUT.withName("sa_family"),
MemoryLayout.sequenceLayout(14, Constants$root.C_CHAR$LAYOUT).withName("sa_data")
).withName("ifru_broadaddr"),
Constants$root.C_SHORT$LAYOUT.withName("ifru_flags"),
Constants$root.C_INT$LAYOUT.withName("ifru_metric"),
Constants$root.C_INT$LAYOUT.withName("ifru_mtu"),
Constants$root.C_INT$LAYOUT.withName("ifru_phys"),
Constants$root.C_INT$LAYOUT.withName("ifru_media"),
Constants$root.C_INT$LAYOUT.withName("ifru_intval"),
Constants$root.C_POINTER$LAYOUT.withName("ifru_data"),
MemoryLayout.structLayout(
Constants$root.C_INT$LAYOUT.withName("ifdm_current"),
Constants$root.C_INT$LAYOUT.withName("ifdm_min"),
Constants$root.C_INT$LAYOUT.withName("ifdm_max")
).withName("ifru_devmtu"),
MemoryLayout.structLayout(
Constants$root.C_INT$LAYOUT.withName("ifk_module_id"),
Constants$root.C_INT$LAYOUT.withName("ifk_type"),
MemoryLayout.unionLayout(
Constants$root.C_POINTER$LAYOUT.withName("ifk_ptr"),
Constants$root.C_INT$LAYOUT.withName("ifk_value")
).withName("ifk_data")
).withName("ifru_kpi"),
Constants$root.C_INT$LAYOUT.withName("ifru_wake_flags"),
Constants$root.C_INT$LAYOUT.withName("ifru_route_refcnt"),
MemoryLayout.sequenceLayout(2, Constants$root.C_INT$LAYOUT).withName("ifru_cap"),
Constants$root.C_INT$LAYOUT.withName("ifru_functional_type")
).withName("ifr_ifru")
).withName("ifreq");
```
But the top three union members are defined like this in C:
```
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
```
and so, it would be better to generate:
```
public static final UnionLayout LAYOUT = MemoryLayout.unionLayout(
sockaddr.$struct$LAYOUT.withName("ifru_addr"),
sockaddr.$struct$LAYOUT.withName("ifru_dstaddr"),
sockaddr.$struct$LAYOUT.withName("ifru_broadaddr"),
```
- duplicates
-
CODETOOLS-7903534 Deduplicate MemoryLayout definitions
-
- Closed
-