< prev index next >

test/hotspot/jtreg/runtime/cds/AOTMapReader.java

Print this page
*** 1,7 ***
  /*
!  * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.
--- 1,7 ---
  /*
!  * Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.

*** 193,10 ***
--- 193,21 ---
  
      // (two addresses)
      //  - final 'key' 'Ljava/lang/Object;' @16 0x00000007ffc68260 (0xfff8d04c) java.lang.String
      static Pattern oopFieldPattern2 = Pattern.compile(" - [^']* '([^']+)'.*@([0-9]+) 0x([0-9a-f]+) [(]0x([0-9a-f]+)[)] (.*)");
  
+     // - Flat inline type element 'java/lang/Integer': - Index   1 offset  24:
+     // or
+     // - Flat inline type field 'java/lang/Integer':
+     static Pattern flatFieldPattern = Pattern.compile(" - Flat inline type field '([^']+)':\\s*(null)?\\s*$");
+     static Pattern flatElementPattern = Pattern.compile(" - Flat inline type element '([^']+)':\\s*- Index\\s+(\\d+)\\s+offset\\s+(\\d+):\\s*(null)?\\s*$");
+ 
+     static Pattern flatNullFreeFieldPattern = Pattern.compile(" - Flat inline null-free type field '([^']+)':\\s*$");
+     static Pattern flatNullFreeElementPattern = Pattern.compile(" - Flat inline null-free type element '([^']+)':\\s*- Index\\s+(\\d+)\\s+offset\\s+(\\d+):\\s*$");
+ 
+     static Pattern nullMarkerPattern = Pattern.compile(" - \\[null_marker\\] @[0-9]+ Field marked as (.*)");
+ 
      // (injected module_entry)
      //  - injected 'module_entry' 'J' @16 0 (0x0000000000000000)
      static Pattern moduleEntryPattern = Pattern.compile("- injected 'module_entry' 'J' @[0-9]+[ ]+([0-9]+)");
  
      // -------------------------------------------------------------------------------

*** 220,10 ***
--- 231,60 ---
      private static void parseHeapObject(String className, String oop, String narrowOop) throws IOException {
          HeapObject heapObject = parseHeapObjectImpl(className, oop, narrowOop);
          mapFile.add(heapObject);
      }
  
+     private static void parseFlatNullFree(Matcher m) throws IOException {
+         if (line == null || !line.matches("^\s*-.*")) {
+             throw new RuntimeException("Malformed logging of flat field: " + line);
+         } else if ((m = match(line, flatFieldPattern)) != null) {
+             parseFlatField(m);
+         } else if ((m = match(line, flatElementPattern)) != null) {
+             parseFlatElement(m);
+         } else {
+             // Nested field
+         }
+     }
+ 
+     private static void parseFlatFieldOrElementHelper(Matcher m, String value) throws IOException {
+         nextLine();
+         while (line == null || (m = match(line, nullMarkerPattern)) == null) {
+             parseFlatNullFree(m);
+             nextLine();
+         }
+ 
+         String nullMarker = m.group(1);
+         if (nullMarker == null) {
+             throw new RuntimeException("missing null_marker: " + line);
+         } else {
+             nullMarker = nullMarker.replace(" ", "");
+             if (value.equals("null") != nullMarker.equals("null")) {
+                 throw new RuntimeException("Incorrect null_marker value: " + value + " vs " + nullMarker);
+             }
+         }
+     }
+ 
+     private static void parseFlatElement(Matcher m) throws IOException {
+         String value = m.group(4);
+         if (value != null) {
+             value = value.replace(" ", ""); // Remove spaces
+         } else {
+             value = "";
+         }
+         parseFlatFieldOrElementHelper(m, value);
+     }
+ 
+     private static void parseFlatField(Matcher m) throws IOException {
+         String value = m.group(2);
+         if (value != null) {
+             value = value.replace(" ", ""); // Remove spaces
+         } else {
+             value = "";
+         }
+         parseFlatFieldOrElementHelper(m, value);
+     }
+ 
      private static HeapObject parseHeapObjectImpl(String className, String oop, String narrowOop) throws IOException {
          HeapObject heapObject = new HeapObject(className, oop, narrowOop);
          Matcher m;
  
          nextLine();

*** 241,18 ***
              if ((m = match(line, fieldsWordsPattern)) == null) {
                  throw new RuntimeException("Expected field size info");
              }
              while (true) {
                  nextLine();
!                 if (line == null || !line.startsWith(" - ")) {
                      return heapObject;
                  }
                  if (!line.contains("marked metadata pointer")) {
                      if ((m = match(line, oopFieldPattern2)) != null) {
                          heapObject.addOopField(m.group(1), m.group(2), m.group(3), m.group(4));
                      } else if ((m = match(line, oopFieldPattern1)) != null) {
                          heapObject.addOopField(m.group(1), m.group(2), m.group(3), null);
                      } else if ((m = match(line, moduleEntryPattern)) != null) {
                          String value = m.group(1);
                          if (!value.equals("0")) {
                              throw new RuntimeException("module_entry should be 0 but found: " + line);
                          }
--- 302,25 ---
              if ((m = match(line, fieldsWordsPattern)) == null) {
                  throw new RuntimeException("Expected field size info");
              }
              while (true) {
                  nextLine();
!                 if (line == null || !line.matches("^\s*-.*")) {
                      return heapObject;
                  }
                  if (!line.contains("marked metadata pointer")) {
                      if ((m = match(line, oopFieldPattern2)) != null) {
                          heapObject.addOopField(m.group(1), m.group(2), m.group(3), m.group(4));
                      } else if ((m = match(line, oopFieldPattern1)) != null) {
                          heapObject.addOopField(m.group(1), m.group(2), m.group(3), null);
+                     } else if ((m = match(line, flatFieldPattern)) != null) {
+                         parseFlatField(m);
+                     } else if ((m = match(line, flatElementPattern)) != null) {
+                         parseFlatElement(m);
+                     } else if ((m = match(line, flatNullFreeFieldPattern)) != null ||
+                                (m = match(line, flatNullFreeElementPattern)) != null) {
+                         parseFlatNullFree(m);
                      } else if ((m = match(line, moduleEntryPattern)) != null) {
                          String value = m.group(1);
                          if (!value.equals("0")) {
                              throw new RuntimeException("module_entry should be 0 but found: " + line);
                          }

*** 271,13 ***
          } else if ((m = match(line, objArrayKlassPattern)) != null) {
              heapObject.setKlass(m.group(1), m.group(3));
              // TODO: read all the array elements
              while (true) {
                  nextLine();
!                 if (line == null || !line.startsWith(" - ")) {
                      return heapObject;
                  }
              }
          } else {
              throw new RuntimeException("Expected klass info");
          }
      }
--- 339,19 ---
          } else if ((m = match(line, objArrayKlassPattern)) != null) {
              heapObject.setKlass(m.group(1), m.group(3));
              // TODO: read all the array elements
              while (true) {
                  nextLine();
!                 if (line == null || !line.matches("^\s*-.*")) { // Check for "-" with leading spaces
                      return heapObject;
                  }
+ 
+                 if ((m = match(line, flatElementPattern)) != null) {
+                     parseFlatElement(m);
+                 } else if ((m = match(line, flatNullFreeElementPattern)) != null) {
+                     parseFlatNullFree(m);
+                 }
              }
          } else {
              throw new RuntimeException("Expected klass info");
          }
      }
< prev index next >