Skip to content

Commit e42e5b9

Browse files
committed
Fixing gates.
1 parent 3152325 commit e42e5b9

31 files changed

+163
-34
lines changed

sdk/mx.sdk/mx_sdk.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,4 +417,3 @@ def nativebridge_benchmark(args):
417417
finally:
418418
if not parsed_args.isolate_library and not parsed_args.target_folder:
419419
shutil.rmtree(target_dir)
420-

sdk/src/org.graalvm.nativebridge.processor.test/src/org/graalvm/nativebridge/processor/test/common/InvalidMarshallerConfig6Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

sdk/src/org.graalvm.nativebridge.processor.test/src/org/graalvm/nativebridge/processor/test/common/InvalidMethod3Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

sdk/src/org.graalvm.nativebridge.processor/src/org/graalvm/nativebridge/processor/AbstractBridgeGenerator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ AbstractTypeCache getTypeCache() {
7878
void configureMultipleDefinitions(@SuppressWarnings("unused") List<DefinitionData> otherDefinitions) {
7979
}
8080

81+
@SuppressWarnings("unused")
82+
void generateFields(CodeBuilder builder, CharSequence targetClassSimpleName) {
83+
}
84+
8185
abstract void generateAPI(CodeBuilder builder, CharSequence targetClassSimpleName);
8286

8387
abstract void generateImpl(CodeBuilder builder, CharSequence targetClassSimpleName);

sdk/src/org.graalvm.nativebridge.processor/src/org/graalvm/nativebridge/processor/CodeBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

sdk/src/org.graalvm.nativebridge.processor/src/org/graalvm/nativebridge/processor/NativeBridgeProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ protected boolean doProcess(Set<? extends TypeElement> annotations, RoundEnviron
156156
CharSequence targetClassSimpleName = annotatedElement.getSimpleName() + "Gen";
157157
builder.classStart(EnumSet.of(Modifier.FINAL), targetClassSimpleName, null, Collections.emptyList());
158158
builder.indent();
159+
for (AbstractBridgeGenerator generator : generators) {
160+
generator.generateFields(builder, targetClassSimpleName);
161+
}
159162
for (AbstractBridgeGenerator generator : generators) {
160163
generator.generateAPI(builder, targetClassSimpleName);
161164
}

sdk/src/org.graalvm.nativebridge.processor/src/org/graalvm/nativebridge/processor/NativeToHotSpotServiceGenerator.java

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
import org.graalvm.nativebridge.processor.AbstractServiceParser.MethodData;
6060
import org.graalvm.nativebridge.processor.NativeToHotSpotServiceParser.TypeCache;
6161

62+
import javax.lang.model.element.AnnotationMirror;
63+
import javax.lang.model.element.Element;
6264
import javax.lang.model.element.Modifier;
6365
import javax.lang.model.element.VariableElement;
6466
import javax.lang.model.type.ArrayType;
@@ -72,6 +74,8 @@ public class NativeToHotSpotServiceGenerator extends AbstractNativeServiceGenera
7274
private static final String END_POINT_CLASS_FIELD = "endPointClass";
7375
private static final String START_POINT_SIMPLE_NAME = "NativeToHSStartPoint";
7476
private static final String REFERENCE_ISOLATE_ADDRESS_NAME = "referenceIsolateAddress";
77+
private static final String INCLUDE_NATIVE_TO_HOTSPOT = "INCLUDE_NATIVE_TO_HOTSPOT";
78+
private static final String INCLUDE_NATIVE_TO_NATIVE = "INCLUDE_NATIVE_TO_NATIVE";
7579

7680
private final TypeCache typeCache;
7781
private final FactoryMethodInfo factoryMethod;
@@ -82,6 +86,32 @@ public class NativeToHotSpotServiceGenerator extends AbstractNativeServiceGenera
8286
this.factoryMethod = resolveFactoryMethod(FACTORY_METHOD_NAME, START_POINT_SIMPLE_NAME, END_POINT_SIMPLE_NAME, definitionData.peerConstructorParams.get(0));
8387
}
8488

89+
@Override
90+
void generateFields(CodeBuilder builder, CharSequence targetClassSimpleName) {
91+
DeclaredType hotSpotToNativePredicate = lookupIncludePredicate(typeCache.generateHSToNativeFactory);
92+
DeclaredType nativeToNativePredicate = lookupIncludePredicate(typeCache.generateNativeToNativeFactory);
93+
Set<Modifier> modifiers = EnumSet.of(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL);
94+
if (needsIncludeField(hotSpotToNativePredicate)) {
95+
builder.lineStart().writeModifiers(modifiers).space().write(typeCache.booleanSupplier).space().write(INCLUDE_NATIVE_TO_HOTSPOT).write(" = ").newInstance(hotSpotToNativePredicate).lineEnd(
96+
";");
97+
}
98+
if (!types.isSameType(hotSpotToNativePredicate, nativeToNativePredicate) && needsIncludeField(nativeToNativePredicate)) {
99+
builder.lineStart().writeModifiers(modifiers).space().write(typeCache.booleanSupplier).space().write(INCLUDE_NATIVE_TO_NATIVE).write(" = ").newInstance(nativeToNativePredicate).lineEnd(
100+
";");
101+
}
102+
}
103+
104+
private DeclaredType lookupIncludePredicate(DeclaredType forFactoryAnnotation) {
105+
Element factory = getDefinition().factory.asElement();
106+
AbstractServiceParser parser = getParser();
107+
AnnotationMirror mirror = parser.processor.getAnnotation(factory, forFactoryAnnotation);
108+
return (DeclaredType) parser.getAnnotationValueWithDefaults(mirror, "include");
109+
}
110+
111+
boolean needsIncludeField(DeclaredType predicate) {
112+
return !types.isSameType(predicate, typeCache.alwaysIncluded) && !types.isSameType(predicate, typeCache.notIncludedAutomatically);
113+
}
114+
85115
@Override
86116
void generateAPI(CodeBuilder builder, CharSequence targetClassSimpleName) {
87117
if (!getDefinition().hasCustomDispatch()) {
@@ -117,14 +147,50 @@ void generateCommonCustomDispatchFactoryReturn(CodeBuilder builder) {
117147

118148
@Override
119149
void generateCommonFactoryReturn(CodeBuilder builder, List<CharSequence> parameters) {
150+
DeclaredType hotSpotToNativePredicate = lookupIncludePredicate(typeCache.generateHSToNativeFactory);
151+
DeclaredType nativeToNativePredicate = lookupIncludePredicate(typeCache.generateNativeToNativeFactory);
152+
if (types.isSameType(hotSpotToNativePredicate, typeCache.alwaysIncluded) || types.isSameType(nativeToNativePredicate, typeCache.alwaysIncluded)) {
153+
generateCreateStartPoint(builder, parameters);
154+
} else if (types.isSameType(hotSpotToNativePredicate, typeCache.notIncludedAutomatically) && types.isSameType(nativeToNativePredicate, typeCache.notIncludedAutomatically)) {
155+
generateThrowException(builder, parameters);
156+
} else {
157+
CodeBuilder hotSpotToNativeIncluded = needsIncludeField(hotSpotToNativePredicate) ? new CodeBuilder(builder).invoke(INCLUDE_NATIVE_TO_HOTSPOT, "getAsBoolean") : null;
158+
CodeBuilder nativeToNativeIncluded = !types.isSameType(hotSpotToNativePredicate, nativeToNativePredicate) && needsIncludeField(nativeToNativePredicate)
159+
? new CodeBuilder(builder).invoke(INCLUDE_NATIVE_TO_NATIVE, "getAsBoolean")
160+
: null;
161+
builder.lineStart("if (");
162+
if (hotSpotToNativeIncluded != null) {
163+
builder.write(hotSpotToNativeIncluded.build());
164+
if (nativeToNativeIncluded != null) {
165+
builder.write(" || ");
166+
}
167+
}
168+
if (nativeToNativeIncluded != null) {
169+
builder.write(nativeToNativeIncluded.build());
170+
}
171+
builder.lineEnd(") {");
172+
builder.indent();
173+
generateCreateStartPoint(builder, parameters);
174+
builder.dedent();
175+
builder.line("} else {");
176+
builder.indent();
177+
generateThrowException(builder, parameters);
178+
builder.dedent();
179+
builder.line("}");
180+
}
181+
}
182+
183+
private void generateCreateStartPoint(CodeBuilder builder, List<CharSequence> parameters) {
120184
CharSequence hsPeerVar = parameters.getLast();
121185
CharSequence hsIsolateThreadVar = "isolateThread";
122186
CodeBuilder hsIsolate = new CodeBuilder(builder).invoke(hsPeerVar, "getIsolate");
123187
builder.lineStart().write(typeCache.hsIsolateThread).space().write(hsIsolateThreadVar).write(" = ").invoke(hsIsolate.build(), "enter").lineEnd(";");
124188
builder.line("try {");
125189
builder.indent();
126-
parameters.add(new CodeBuilder(builder).invoke(hsIsolateThreadVar, "getJNIEnv").build());
127-
builder.lineStart("return ").invoke(null, AbstractBridgeGenerator.FACTORY_METHOD_NAME, parameters.toArray(new CharSequence[0])).lineEnd(";");
190+
CharSequence[] constructorParameters = new CharSequence[parameters.size() + 1];
191+
parameters.toArray(constructorParameters);
192+
constructorParameters[constructorParameters.length - 1] = new CodeBuilder(builder).invoke(hsIsolateThreadVar, "getJNIEnv").build();
193+
builder.lineStart("return ").invoke(null, AbstractBridgeGenerator.FACTORY_METHOD_NAME, constructorParameters).lineEnd(";");
128194
builder.dedent();
129195
builder.line("} finally {");
130196
builder.indent();
@@ -133,6 +199,13 @@ void generateCommonFactoryReturn(CodeBuilder builder, List<CharSequence> paramet
133199
builder.line("}");
134200
}
135201

202+
private void generateThrowException(CodeBuilder builder, List<CharSequence> parameters) {
203+
CharSequence hsPeerVar = parameters.getLast();
204+
CharSequence message = new CodeBuilder(builder).invokeStatic(typeCache.string, "format",
205+
"\"Invalid peer: `%s`, native to hotspot start points are disabled by the factory include attribute.\"", hsPeerVar).build();
206+
builder.lineStart("throw ").newInstance(typeCache.illegalArgumentException, message).lineEnd(";");
207+
}
208+
136209
@Override
137210
MarshallerSnippet marshallerSnippets(MarshallerData marshallerData) {
138211
return NativeToHotSpotMarshallerSnippet.forData(this, marshallerData);

sdk/src/org.graalvm.nativebridge.processor/src/org/graalvm/nativebridge/processor/NativeToHotSpotServiceParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ static Configuration createConfiguration(NativeTypeCache typeCache) {
8181

8282
static final class TypeCache extends NativeTypeCache {
8383

84+
final DeclaredType alwaysIncluded;
85+
final DeclaredType booleanSupplier;
8486
final DeclaredType currentIsolate;
8587
final DeclaredType jNIEntryPoint;
8688
final DeclaredType jNIExceptionHandler;
@@ -89,10 +91,13 @@ static final class TypeCache extends NativeTypeCache {
8991
final DeclaredType jNIClassCache;
9092
final DeclaredType jNIMethod;
9193
final DeclaredType jValue;
94+
final DeclaredType notIncludedAutomatically;
9295
final DeclaredType runtimeException;
9396

9497
TypeCache(NativeBridgeProcessor processor) {
9598
super(processor);
99+
this.alwaysIncluded = (DeclaredType) processor.getType("org.graalvm.nativeimage.c.function.CEntryPoint.AlwaysIncluded");
100+
this.booleanSupplier = (DeclaredType) processor.getType("java.util.function.BooleanSupplier");
96101
this.currentIsolate = (DeclaredType) processor.getType("org.graalvm.nativeimage.CurrentIsolate");
97102
this.jNIEntryPoint = (DeclaredType) processor.getType("org.graalvm.jniutils.JNIEntryPoint");
98103
this.jNIExceptionHandler = (DeclaredType) processor.getType("org.graalvm.jniutils.JNIExceptionWrapper.ExceptionHandler");
@@ -101,6 +106,7 @@ static final class TypeCache extends NativeTypeCache {
101106
this.jNIClassCache = (DeclaredType) processor.getType("org.graalvm.nativebridge.JNIClassCache");
102107
this.jNIMethod = (DeclaredType) processor.getType("org.graalvm.jniutils.JNICalls.JNIMethod");
103108
this.jValue = (DeclaredType) processor.getType("org.graalvm.jniutils.JNI.JValue");
109+
this.notIncludedAutomatically = (DeclaredType) processor.getType("org.graalvm.nativeimage.c.function.CEntryPoint.NotIncludedAutomatically");
104110
this.runtimeException = (DeclaredType) processor.getType("java.lang.RuntimeException");
105111
}
106112
}

sdk/src/org.graalvm.nativebridge.processor/src/org/graalvm/nativebridge/processor/ProcessToProcessServiceGenerator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,7 @@ private void generateProcessStartMethod(CodeBuilder builder, CacheSnippet cacheS
221221
generateSendReceive(builder, scopeVar, binaryOutputVar, binaryInputVar);
222222
builder.dedent();
223223
generateStartPointExceptionHandlers(builder, methodData, receiver, processIsolateVar, throwableMarshallerVar);
224-
CharSequence resultVar = generateUnmarshallResult(builder, methodData, processIsolateVar, binaryInputVar, resFieldName, false);
225-
assert resultVar == resFieldName;
224+
generateUnmarshallResult(builder, methodData, processIsolateVar, binaryInputVar, resFieldName, false);
226225
builder.lineStart().write(cacheSnippets.writeCache(builder, cacheFieldName, receiver, resFieldName)).lineEnd(";");
227226
generateLeave(builder, scopeVar);
228227
builder.dedent();

sdk/src/org.graalvm.nativebridge/src/org/graalvm/nativebridge/BinaryInput.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0

0 commit comments

Comments
 (0)