< prev index next > src/java.base/share/classes/jdk/internal/foreign/abi/LinkerOptions.java
Print this page
LinkerOptionImpl opImpl = (LinkerOptionImpl) option;
validator.accept(opImpl, desc);
optionMap.put(option.getClass(), opImpl);
}
- return new LinkerOptions(optionMap);
+ LinkerOptions linkerOptions = new LinkerOptions(optionMap);
+ if (linkerOptions.hasCapturedCallState() && linkerOptions.isCritical()) {
+ throw new IllegalArgumentException("Incompatible linker options: captureCallState, critical");
+ }
+ return linkerOptions;
}
public static LinkerOptions empty() {
return EMPTY;
}
public int firstVariadicArgIndex() {
return getOption(FirstVariadicArg.class).index();
}
- public boolean isTrivial() {
- IsTrivial it = getOption(IsTrivial.class);
- return it != null;
+ public boolean isCritical() {
+ Critical c = getOption(Critical.class);
+ return c != null;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
public int hashCode() {
return Objects.hash(optionsMap);
}
public sealed interface LinkerOptionImpl extends Linker.Option
- permits CaptureCallState, FirstVariadicArg, IsTrivial {
+ permits CaptureCallState, FirstVariadicArg, Critical {
default void validateForDowncall(FunctionDescriptor descriptor) {
throw new IllegalArgumentException("Not supported for downcall: " + this);
}
default void validateForUpcall(FunctionDescriptor descriptor) {
public void validateForDowncall(FunctionDescriptor descriptor) {
// done during construction
}
}
- public record IsTrivial() implements LinkerOptionImpl {
- public static IsTrivial INSTANCE = new IsTrivial();
+ public record Critical() implements LinkerOptionImpl {
+ public static Critical INSTANCE = new Critical();
@Override
public void validateForDowncall(FunctionDescriptor descriptor) {
// always allowed
}
< prev index next >