< prev index next >

src/jdk.incubator.jextract/share/classes/jdk/incubator/jextract/tool/HandleSourceFactory.java

Print this page

        

@@ -76,10 +76,28 @@
         this.libraryPaths = libraryPaths;
         this.clsName = clsName;
         this.pkgName = pkgName;
     }
 
+    private static String getCLangConstantsHolder() {
+        String prefix = "jdk.incubator.foreign.MemoryLayouts.";
+        String arch = System.getProperty("os.arch");
+        String os = System.getProperty("os.name");
+        if (arch.equals("amd64") || arch.equals("x86_64")) {
+            if (os.startsWith("Windows")) {
+                return prefix + "WinABI";
+            } else {
+                return prefix + "SysV";
+            }
+        } else if (arch.equals("aarch64")) {
+            return prefix + "AArch64ABI";
+        }
+        throw new UnsupportedOperationException("Unsupported os or arch: " + os + ", " + arch);
+    }
+
+    private static final String C_LANG_CONSTANTS_HOLDER = getCLangConstantsHolder();
+
     public JavaFileObject[] generate(Declaration.Scoped decl) {
         builder.addPackagePrefix(pkgName);
         builder.classBegin(clsName);
         builder.addLibraries(libraryNames.toArray(new String[0]),
                 libraryPaths != null ? libraryPaths.toArray(new String[0]) : null);

@@ -97,11 +115,11 @@
         try {
             return new JavaFileObject[] {
                     fileFromString(pkgName, clsName, src),
                     fileFromString(pkgName,"RuntimeHelper", (pkgName.isEmpty()? "" : "package " + pkgName + ";\n") +
                             Files.readAllLines(Paths.get(runtimeHelper.toURI()))
-                            .stream().collect(Collectors.joining("\n")))
+                            .stream().collect(Collectors.joining("\n")).replace("${C_LANG}", C_LANG_CONSTANTS_HOLDER))
             };
         } catch (IOException ex) {
             throw new UncheckedIOException(ex);
         } catch (URISyntaxException ex2) {
             throw new RuntimeException(ex2);
< prev index next >