Интерфейс Linker.Option
- Вложенный интерфейс:
LinkerPREVIEW
public static sealed interface Linker.Option
Option — это предварительный API платформы Java. - С:
- 20
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static Linker.OptionPREVIEW |
captureCallState |
Возвращает опцию линковщика, используемую для сохранения частей состояния выполнения сразу после вызова внешней функции, связанной с обработчиком метода вызова вниз, прежде чем оно может быть перезаписано платформой Java или считано обычными средствами. |
static StructLayoutPREVIEW |
captureStateLayout() |
Возвращает макет структуры, представляющий макет сегмента состояния захвата, который передается обработчику вызова вниз, связанному с captureCallState(String...). |
static Linker.OptionPREVIEW |
firstVariadicArg |
Возвращает опцию линковщика, используемую для обозначения индекса, указывающего начало аргументов с переменным числом, переданных функции, описанной функцией-описателем, связанной с запросом линковки вызова вниз. |
static Linker.OptionPREVIEW |
isTrivial() |
Возвращает опцию линковщика, используемую для обозначения внешней функции как тривиальной. |
Подробное описание методов
firstVariadicArg
static Linker.OptionPREVIEW firstVariadicArg(int index)
Значение index должно соответствовать 0 <= index <= N, где N — количество макетов аргументов функции-описателя, используемых совместно с этой опцией линковщика. Когда index:
-
0, все аргументы, передаваемые функции, передаются как аргументы с переменным числом -
N, ни один из аргументов, передаваемых функции, не передаётся как аргументы с переменным числом -
n, где0 < m < N, аргументыm..Nпередаются как аргументы с переменным числом
- Примечание реализации:
- Значение индекса проверяется при выполнении запроса линковки, когда доступна функция-описатель, относительно которой проверяется индекс.
- Параметры:
-
index— индекс макета первого аргумента с переменным числом в функции-описателе, связанной с запросом линковки вызова вниз. - Возвращает:
- опцию линковщика, используемую для обозначения индекса, указывающего начало аргументов с переменным числом, переданных функции, описанной функцией-описателем, связанной с запросом линковки вызова вниз
captureCallState
static Linker.OptionPREVIEW captureCallState(String... capturedState)
Состояние выполнения захватывается обработчиком метода вызова вниз при вызове, записывая его в нативный сегмент, предоставленный пользователем обработчику метода вызова вниз. В этих целях обработчик метода вызова вниз, связанный с этой опцией, будет содержать дополнительный параметр MemorySegmentПРЕДПРОСМОТР непосредственно после целевого адреса и необязательные параметры SegmentAllocatorПРЕДПРОСМОТР. Этот параметр, сегмент состояния захвата, представляет собой нативный сегмент, в который записывается захваченное состояние.
Сегмент состояния захвата должен иметь размер и выравнивание, совместимые с макетом, возвращаемым captureStateLayout(). Этот макет — это макет структуры, имеющий именованное поле для каждого захваченного значения.
Захваченное состояние можно извлечь из сегмента состояния захвата, создав обработчики переменных из макета состояния захвата.
Следующий пример демонстрирует использование этой опции линковщика:
MemorySegment targetAddress = ...
Linker.Option ccs = Linker.Option.captureCallState("errno");
MethodHandle handle = Linker.nativeLinker().downcallHandle(targetAddress, FunctionDescriptor.ofVoid(), ccs);
StructLayout capturedStateLayout = Linker.Option.captureStateLayout();
VarHandle errnoHandle = capturedStateLayout.varHandle(PathElement.groupElement("errno"));
try (Arena arena = Arena.ofConfined()) {
MemorySegment capturedState = arena.allocate(capturedStateLayout);
handle.invoke(capturedState);
int errno = (int) errnoHandle.get(capturedState);
// use errno
}
- Параметры:
-
capturedState— имена значений для сохранения. - Возвращает:
- опцию линковщика, используемую для сохранения частей состояния выполнения сразу после вызова внешней функции, связанной с обработчиком метода вызова вниз, прежде чем оно может быть перезаписано платформой Java или считано обычными средствами
- Исключение:
-
IllegalArgumentException— если хотя бы одно из предоставленныхcapturedStateимён не поддерживается на текущей платформе. - См. также:
captureStateLayout
static StructLayoutPREVIEW captureStateLayout()
captureCallState(String...). Макет состояния захвата зависит от платформы, но гарантированно является макетом структурыПРЕДПРОСМОТР, содержащим только макеты значенийПРЕДПРОСМОТР и, возможно, макеты заполненияПРЕДПРОСМОТР. Например, на Windows возвращаемый макет может содержать три макета значений с именами:
- GetLastError
- WSAGetLastError
- errno
Клиенты могут получить имена поддерживаемых макетов захваченных значений следующим образом:
List<String> capturedNames = Linker.Option.captureStateLayout().memberLayouts().stream()
.map(MemoryLayout::name)
.flatMap(Optional::stream)
.toList();
- Возвращает:
- макет структуры, представляющий макет сегмента состояния захвата, который передается обработчику вызова вниз, связанному с
captureCallState(String...) - См. также:
isTrivial
static Linker.OptionPREVIEW isTrivial()
Тривиальная функция — это функция, время выполнения которой очень короткое во всех случаях (аналогично вызову пустой функции) и которая не вызывает обратный вызов в Java (например, используя заглушку обратного вызова).
Использование этой опции линковщика — это подсказка, которую некоторые реализации могут использовать для применения оптимизаций, которые допустимы только для тривиальных функций.
Использование этой опции линковщика при линковке нетривиальных функций, вероятно, приведёт к нежелательным последствиям, таким как снижение производительности или сбой JVM.
- Возвращает:
- опцию линковщика, используемую для обозначения внешней функции как тривиальной
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/foreign/Linker.Option.html
Optionтолько при включенных предварительных функциях.