< prev index next >

src/java.base/share/classes/jdk/internal/foreign/abi/LinkerOptions.java

Print this page
*** 61,11 ***
              LinkerOptionImpl opImpl = (LinkerOptionImpl) option;
              validator.accept(opImpl, desc);
              optionMap.put(option.getClass(), opImpl);
          }
  
!         return new LinkerOptions(optionMap);
      }
  
      public static LinkerOptions empty() {
          return EMPTY;
      }
--- 61,15 ---
              LinkerOptionImpl opImpl = (LinkerOptionImpl) option;
              validator.accept(opImpl, desc);
              optionMap.put(option.getClass(), opImpl);
          }
  
!         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;
      }

*** 95,13 ***
  
      public int firstVariadicArgIndex() {
          return getOption(FirstVariadicArg.class).index();
      }
  
!     public boolean isTrivial() {
!         IsTrivial it = getOption(IsTrivial.class);
!         return it != null;
      }
  
      @Override
      public boolean equals(Object o) {
          if (this == o) return true;
--- 99,13 ---
  
      public int firstVariadicArgIndex() {
          return getOption(FirstVariadicArg.class).index();
      }
  
!     public boolean isCritical() {
!         Critical c = getOption(Critical.class);
!         return c != null;
      }
  
      @Override
      public boolean equals(Object o) {
          if (this == o) return true;

*** 113,11 ***
      public int hashCode() {
          return Objects.hash(optionsMap);
      }
  
      public sealed interface LinkerOptionImpl extends Linker.Option
!             permits CaptureCallState, FirstVariadicArg, IsTrivial {
          default void validateForDowncall(FunctionDescriptor descriptor) {
              throw new IllegalArgumentException("Not supported for downcall: " + this);
          }
  
          default void validateForUpcall(FunctionDescriptor descriptor) {
--- 117,11 ---
      public int hashCode() {
          return Objects.hash(optionsMap);
      }
  
      public sealed interface LinkerOptionImpl extends Linker.Option
!             permits CaptureCallState, FirstVariadicArg, Critical {
          default void validateForDowncall(FunctionDescriptor descriptor) {
              throw new IllegalArgumentException("Not supported for downcall: " + this);
          }
  
          default void validateForUpcall(FunctionDescriptor descriptor) {

*** 139,12 ***
          public void validateForDowncall(FunctionDescriptor descriptor) {
              // done during construction
          }
      }
  
!     public record IsTrivial() implements LinkerOptionImpl {
!         public static IsTrivial INSTANCE = new IsTrivial();
  
          @Override
          public void validateForDowncall(FunctionDescriptor descriptor) {
              // always allowed
          }
--- 143,12 ---
          public void validateForDowncall(FunctionDescriptor descriptor) {
              // done during construction
          }
      }
  
!     public record Critical() implements LinkerOptionImpl {
!         public static Critical INSTANCE = new Critical();
  
          @Override
          public void validateForDowncall(FunctionDescriptor descriptor) {
              // always allowed
          }
< prev index next >