Skip to content

Commit a8244b7

Browse files
committedSep 28, 2020
8253725: Jextract fails to extract big monolithic headers
Reviewed-by: jvernee
1 parent 746bd36 commit a8244b7

15 files changed

+995
-799
lines changed
 

‎src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/ClassConstantHelper.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public ClassConstantHelper(ClassWriter cw, ClassDesc CD_constantsHelper, String
151151
}
152152

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

196196
ClassConstantHelper helper = new ClassConstantHelper(cw, CD_constantsHelper, internalClassName,
197197
MH_downcallHandle, MH_lookupGlobalVariable, MH_makeCString, LIBRARIES);
198-
helper.classBegin(qualBaseName, isFinal);
198+
helper.classBegin(qualBaseName);
199199
return helper;
200200
}
201201

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

206-
private void classBegin(String baseClassName, boolean isFinal) {
206+
private void classBegin(String baseClassName) {
207207
String baseName = baseClassName != null ? toInternalName(baseClassName) : INTR_OBJECT;
208-
int mods = isFinal? ACC_FINAL : 0;
209-
cw.visit(V15, mods, internalClassName, null, baseName, null);
208+
cw.visit(V15, 0, internalClassName, null, baseName, null);
210209
}
211210

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

291290
@Override
292-
public List<JavaFileObject> getClasses() {
291+
public List<JavaFileObject> build() {
293292
cw.visitEnd();
294293
byte[] bytes = cw.toByteArray();
295294
cw = null;

‎src/jdk.incubator.jextract/share/classes/jdk/internal/jextract/impl/ConstantHelper.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,18 @@ interface ConstantHelper {
4444
DirectMethodHandleDesc addSegment(String javaName, String nativeName, MemoryLayout layout);
4545
DirectMethodHandleDesc addFunctionDesc(String javaName, FunctionDescriptor fDesc);
4646
DirectMethodHandleDesc addConstant(String name, Class<?> type, Object value);
47-
List<JavaFileObject> getClasses();
47+
List<JavaFileObject> build();
4848

4949
static ConstantHelper make(boolean source, String packageName, String headerClassName, ClassDesc runtimeHelper,
5050
ClassDesc cString, String[] libraryNames) {
5151
return new MultiFileConstantHelper(headerClassName,
5252
(simpleClassName, baseClassName, isFinal) -> source
53-
? SourceConstantHelper.make(packageName, simpleClassName, libraryNames, baseClassName, isFinal)
54-
: ClassConstantHelper.make(packageName, simpleClassName, runtimeHelper, cString, libraryNames, baseClassName, isFinal),
53+
? SourceConstantHelper.make(packageName, simpleClassName, libraryNames, baseClassName)
54+
: ClassConstantHelper.make(packageName, simpleClassName, runtimeHelper, cString, libraryNames, baseClassName),
5555
source ? CONSTANTS_PER_CLASS_SOURCES : CONSTANTS_PER_CLASS_CLASSES);
5656
}
57+
58+
interface ConstantHelperFactory {
59+
ConstantHelper make(String headerClassName);
60+
}
5761
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
26+
package jdk.internal.jextract.impl;
27+
28+
import jdk.incubator.foreign.*;
29+
import jdk.incubator.jextract.Type;
30+
31+
import java.lang.invoke.MethodType;
32+
33+
public class FunctionalInterfaceBuilder extends NestedClassBuilder {
34+
35+
private final String fiAnno;
36+
private final MethodType fiType;
37+
private final FunctionDescriptor fiDesc;
38+
39+
FunctionalInterfaceBuilder(JavaSourceBuilder enclosing, String className, MethodType fiType,
40+
FunctionDescriptor fiDesc, Type funcType) {
41+
super(enclosing, Kind.INTERFACE, className);
42+
this.fiType = fiType;
43+
this.fiDesc = fiDesc;
44+
this.fiAnno = annotationWriter.getCAnnotation(funcType);
45+
}
46+
47+
@Override
48+
JavaSourceBuilder classEnd() {
49+
emitFunctionalInterfaceMethod();
50+
emitFunctionalFactories();
51+
return super.classEnd();
52+
}
53+
54+
void emitFunctionalInterfaceMethod() {
55+
builder.incrAlign();
56+
builder.indent();
57+
builder.append(fiType.returnType().getName() + " apply(");
58+
String delim = "";
59+
for (int i = 0 ; i < fiType.parameterCount(); i++) {
60+
builder.append(delim + fiType.parameterType(i).getName() + " x" + i);
61+
delim = ", ";
62+
}
63+
builder.append(");\n");
64+
builder.decrAlign();
65+
}
66+
67+
private void emitFunctionalFactories() {
68+
builder.incrAlign();
69+
builder.indent();
70+
builder.append(PUB_MODS + " " + fiAnno + " MemorySegment allocate(" + className + " fi) {\n");
71+
builder.incrAlign();
72+
builder.indent();
73+
builder.append("return RuntimeHelper.upcallStub(" + className + ".class, fi, " + functionGetCallString(className, fiDesc) + ", " +
74+
"\"" + fiType.toMethodDescriptorString() + "\");\n");
75+
builder.decrAlign();
76+
builder.indent();
77+
builder.append("}\n");
78+
builder.indent();
79+
builder.append(PUB_MODS + " " + fiAnno + " MemorySegment allocate(" + className + " fi, NativeScope scope) {\n");
80+
builder.incrAlign();
81+
builder.indent();
82+
builder.append("return scope.register(allocate(fi));\n");
83+
builder.decrAlign();
84+
builder.indent();
85+
builder.append("}\n");
86+
builder.decrAlign();
87+
}
88+
}

0 commit comments

Comments
 (0)