我可以使用 Implementation.Composable#andThen() 组合具有 FixedValue 的 InvokeDynamic 吗?

Can I compose an InvokeDynamic with a FixedValue using Implementation.Composable#andThen()?

我正在 ByteBuddy 中“手动”构建一个方法。我正在构建的方法有一个 ProductType 类型的参数。假设它看起来像这样:

public ProductType frob(ProductType product) {
  // stuff that I'm implementing and asking about goes here
}

在该方法中,我正在构建相当于:

product.foo(); // more on this below; foo() has a void return type, which may be important
return product; // FixedValue.argument(0)

当我像这样构建 Implementation 时,这工作正常:

MethodCall.invoke(fooMethodDescription) // invoke foo()...
  .onArgument(0) // ...on product...
  .andThen(FixedValue.argument(0)); // ...and then return product

(希望我没打错。)

但是,如果我像这样构建 Implementation

InvokeDynamic.bootstrap(...) // look up foo()'s MethodHandle via my bootstrap method...
  .invoke("foo", TypeDescription.VOID) // ...invoke the method handle with a return type of void...
  .withArgument(0) // ..."on" the first and only argument (product) and "with" no other arguments...
  .andThen(FixedValue.argument(0)); // ...and then return product

…当然,使用正确的 InvokeDynamic 配方,结果 class 无法验证,因为 Operand stack underflow 错误 (Attempt to pop empty stack)。

我有一个类似的 InvokeDynamic 食谱在其他很多地方使用过,所以我知道我的问题不在于 InvokeDynamic 用法。相反,它似乎与作曲有关?也许? MethodCallInvokeDynamic 是否有可能表现不同,即使两者都是 Implementation?也许 InvokeDynamic 不会将某些东西压入操作数堆栈(也许只是在 void returns 的情况下?)而 MethodCall 呢?我在 andThen() 用法中遗漏了什么吗?

使用 ByteBuddy 1.11.2.

正如您正确指出的那样,这是 Byte Buddy 中的一个错误,现已修复。感谢那。它将与版本 1.11.3.

一起发布