Skip to content
Permalink
Browse files
8253725: Jextract fails to extract big monolithic headers
Reviewed-by: jvernee
  • Loading branch information
mcimadamore committed Sep 28, 2020
1 parent 746bd36 commit a8244b73bb29074791e26b596969d8bb9c695491
Showing with 995 additions and 799 deletions.
  1. +5 −6 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/ClassConstantHelper.java
  2. +7 −3 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/ConstantHelper.java
  3. +88 −0 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/FunctionalInterfaceBuilder.java
  4. +0 −285 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/HeaderBuilder.java
  5. +153 −0 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/HeaderFileBuilder.java
  6. +93 −73 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/JavaSourceBuilder.java
  7. +2 −2 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/MultiFileConstantHelper.java
  8. +64 −0 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/NestedClassBuilder.java
  9. +27 −27 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/OutputFactory.java
  10. +146 −213 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/SourceConstantHelper.java
  11. +70 −0 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/StringSourceBuilder.java
  12. +146 −190 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/StructBuilder.java
  13. +106 −0 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/ToplevelBuilder.java
  14. +87 −0 src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/TypedefBuilder.java
  15. +1 −0 test/jdk/tools/jextract/ConstantsTest.java
@@ -151,7 +151,7 @@ public ClassConstantHelper(ClassWriter cw, ClassDesc CD_constantsHelper, String
}

public static ConstantHelper make(String packageName, String className, ClassDesc runtimeHelper, ClassDesc cString,
String[] libraryNames, String baseClassName, boolean isFinal) {
String[] libraryNames, String baseClassName) {
String qualName = Utils.qualifiedClassName(packageName, className);
String qualBaseName = baseClassName != null ? Utils.qualifiedClassName(packageName, baseClassName) : null;
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
@@ -195,18 +195,17 @@ public static ConstantHelper make(String packageName, String className, ClassDes

ClassConstantHelper helper = new ClassConstantHelper(cw, CD_constantsHelper, internalClassName,
MH_downcallHandle, MH_lookupGlobalVariable, MH_makeCString, LIBRARIES);
helper.classBegin(qualBaseName, isFinal);
helper.classBegin(qualBaseName);
return helper;
}

private static String toInternalName(String className) {
return className.replace('.', '/');
}

private void classBegin(String baseClassName, boolean isFinal) {
private void classBegin(String baseClassName) {
String baseName = baseClassName != null ? toInternalName(baseClassName) : INTR_OBJECT;
int mods = isFinal? ACC_FINAL : 0;
cw.visit(V15, mods, internalClassName, null, baseName, null);
cw.visit(V15, 0, internalClassName, null, baseName, null);
}

private static DirectMethodHandleDesc findRuntimeHelperBootstrap(ClassDesc runtimeHelper, String name, MethodType type) {
@@ -289,7 +288,7 @@ public DirectMethodHandleDesc addConstant(String name, Class<?> type, Object val
}

@Override
public List<JavaFileObject> getClasses() {
public List<JavaFileObject> build() {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
cw = null;
@@ -44,14 +44,18 @@ interface ConstantHelper {
DirectMethodHandleDesc addSegment(String javaName, String nativeName, MemoryLayout layout);
DirectMethodHandleDesc addFunctionDesc(String javaName, FunctionDescriptor fDesc);
DirectMethodHandleDesc addConstant(String name, Class<?> type, Object value);
List<JavaFileObject> getClasses();
List<JavaFileObject> build();

static ConstantHelper make(boolean source, String packageName, String headerClassName, ClassDesc runtimeHelper,
ClassDesc cString, String[] libraryNames) {
return new MultiFileConstantHelper(headerClassName,
(simpleClassName, baseClassName, isFinal) -> source
? SourceConstantHelper.make(packageName, simpleClassName, libraryNames, baseClassName, isFinal)
: ClassConstantHelper.make(packageName, simpleClassName, runtimeHelper, cString, libraryNames, baseClassName, isFinal),
? SourceConstantHelper.make(packageName, simpleClassName, libraryNames, baseClassName)
: ClassConstantHelper.make(packageName, simpleClassName, runtimeHelper, cString, libraryNames, baseClassName),
source ? CONSTANTS_PER_CLASS_SOURCES : CONSTANTS_PER_CLASS_CLASSES);
}

interface ConstantHelperFactory {
ConstantHelper make(String headerClassName);
}
}
@@ -0,0 +1,88 @@
/*
* Copyright (c) 2020, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

package jdk.internal.jextract.impl;

import jdk.incubator.foreign.*;
import jdk.incubator.jextract.Type;

import java.lang.invoke.MethodType;

public class FunctionalInterfaceBuilder extends NestedClassBuilder {

private final String fiAnno;
private final MethodType fiType;
private final FunctionDescriptor fiDesc;

FunctionalInterfaceBuilder(JavaSourceBuilder enclosing, String className, MethodType fiType,
FunctionDescriptor fiDesc, Type funcType) {
super(enclosing, Kind.INTERFACE, className);
this.fiType = fiType;
this.fiDesc = fiDesc;
this.fiAnno = annotationWriter.getCAnnotation(funcType);
}

@Override
JavaSourceBuilder classEnd() {
emitFunctionalInterfaceMethod();
emitFunctionalFactories();
return super.classEnd();
}

void emitFunctionalInterfaceMethod() {
builder.incrAlign();
builder.indent();
builder.append(fiType.returnType().getName() + " apply(");
String delim = "";
for (int i = 0 ; i < fiType.parameterCount(); i++) {
builder.append(delim + fiType.parameterType(i).getName() + " x" + i);
delim = ", ";
}
builder.append(");\n");
builder.decrAlign();
}

private void emitFunctionalFactories() {
builder.incrAlign();
builder.indent();
builder.append(PUB_MODS + " " + fiAnno + " MemorySegment allocate(" + className + " fi) {\n");
builder.incrAlign();
builder.indent();
builder.append("return RuntimeHelper.upcallStub(" + className + ".class, fi, " + functionGetCallString(className, fiDesc) + ", " +
"\"" + fiType.toMethodDescriptorString() + "\");\n");
builder.decrAlign();
builder.indent();
builder.append("}\n");
builder.indent();
builder.append(PUB_MODS + " " + fiAnno + " MemorySegment allocate(" + className + " fi, NativeScope scope) {\n");
builder.incrAlign();
builder.indent();
builder.append("return scope.register(allocate(fi));\n");
builder.decrAlign();
builder.indent();
builder.append("}\n");
builder.decrAlign();
}
}

0 comments on commit a8244b7

Please sign in to comment.