模块 java.base

接口 Linker.Option.CaptureCallState

所有父级接口:
Linker.OptionPREVIEW
封闭接口:
Linker.OptionPREVIEW

public static sealed interface Linker.Option.CaptureCallState extends Linker.Option PREVIEW
CaptureCallState 是 Java 平台的预览 API。
程序只能在启用预览功能时使用 CaptureCallState
预览功能可能会在未来的版本中删除,或升级为 Java 平台的永久功能。
一个链接器选项,用于在调用与向下调用方法句柄关联的外部函数之后立即保存部分执行状态,然后它可以被运行时覆盖,或通过常规方式读取。

执行状态由调用时的向下调用方法句柄捕获,方法是将其写入用户提供给向下调用方法句柄的本机段。为此,与 Linker.Option.captureCallState(String[]) 链接的向下调用方法句柄PREVIEW 选项将有一个额外的MemorySegment PREVIEW 直接跟在目标地址后面的参数,可选SegmentAllocator PREVIEW 参数。此参数表示写入捕获状态的本机段。

本机段应具有布局 联系 以及用于链接向下调用句柄的特定 CaptureCallState 实例。

通过从与 CaptureCallState 实例关联的 layout 构建 var 句柄,可以从此本机段检索捕获的状态。

以下示例演示了此链接器选项的用法:

MemorySegment targetAddress = ...
CaptureCallState ccs = Linker.Option.captureCallState("errno");
MethodHandle handle = Linker.nativeLinker().downcallHandle(targetAddress, FunctionDescriptor.ofVoid(), ccs);

VarHandle errnoHandle = ccs.layout().varHandle(PathElement.groupElement("errno"));
try (Arena arena = Arena.openConfined()) {
  MemorySegment capturedState = arena.allocate(ccs.layout());
  handle.invoke(capturedState);
  int errno = errnoHandle.get(capturedState);
  // use errno
}
 
  • 方法详情

    • layout

      StructLayout PREVIEW  layout()
      返回一个结构布局,表示传递给与此 CapturedCallState 实例链接的向下调用句柄的本机段的布局。
      返回:
      表示传递给与此 CapturedCallState 实例链接的向下调用句柄的本机段布局的结构布局
    • supported

      static Set <String > supported()
      返回此实现可以捕获的状态的名称。
      返回:
      此实现可以捕获的状态的名称