Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8314879

Deduplicate MemoryLayout definitions

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Duplicate
    • Icon: P3 P3
    • None
    • None
    • tools

      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"),
      ```

            Unassigned Unassigned
            pminborg Per-Ake Minborg
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: