Skip to content

Commit

Permalink
Added class type to constant pool types where it was forgotten to inc…
Browse files Browse the repository at this point in the history
…lude.
  • Loading branch information
raphw committed Mar 28, 2015
1 parent e42f36c commit 4f2f6ad
Show file tree
Hide file tree
Showing 9 changed files with 152 additions and 16 deletions.
Expand Up @@ -325,10 +325,12 @@ public InvokeDynamic withDoubleValue(double... value) {
} }


/** /**
* <p>
* Requires the bootstrap method to bootstrap a method that takes the specified arguments as its next parameters. * Requires the bootstrap method to bootstrap a method that takes the specified arguments as its next parameters.
* Note that any primitive parameters are passed as their wrapper types. Furthermore, values that can be stored * Note that any primitive parameters are passed as their wrapper types. Furthermore, values that can be stored
* in the instrumented class's constant pool might be of different object identity when passed to the * in the instrumented class's constant pool might be of different object identity when passed to the
* bootstrapped method. * bootstrapped method.
* </p>
* *
* @param value The arguments to pass to the bootstrapped method. * @param value The arguments to pass to the bootstrapped method.
* @return This invoke dynamic instrumentation where the bootstrapped method is passed the specified arguments. * @return This invoke dynamic instrumentation where the bootstrapped method is passed the specified arguments.
Expand Down Expand Up @@ -1078,6 +1080,8 @@ public static ArgumentProvider of(Object value) {
return DOUBLE.make(value); return DOUBLE.make(value);
} else if (value instanceof String) { } else if (value instanceof String) {
return new ForStringValue((String) value); return new ForStringValue((String) value);
} else if (value instanceof Class) {
return new ForClassValue(new TypeDescription.ForLoadedType((Class<?>) value));
} else { } else {
return new ForStaticField(value); return new ForStaticField(value);
} }
Expand Down Expand Up @@ -2040,6 +2044,57 @@ public String toString() {
} }
} }


/**
* An argument provider for a {@link java.lang.Class} constant.
*/
class ForClassValue implements ArgumentProvider {

/**
* The type that is represented by this constant.
*/
private final TypeDescription typeDescription;

/**
* Creates a new argument provider for the given type description.
*
* @param typeDescription The type to represent.
*/
public ForClassValue(TypeDescription typeDescription) {
this.typeDescription= typeDescription;
}

@Override
public Resolved resolve(TypeDescription instrumentedType,
MethodDescription instrumentedMethod,
Assigner assigner,
boolean dynamicallyTyped) {
return new Resolved.Simple(ClassConstant.of(typeDescription), new TypeDescription.ForLoadedType(Class.class));
}

@Override
public InstrumentedType prepare(InstrumentedType instrumentedType) {
return instrumentedType;
}

@Override
public boolean equals(Object other) {
return this == other || !(other == null || getClass() != other.getClass())
&& typeDescription.equals(((ForClassValue) other).typeDescription);
}

@Override
public int hashCode() {
return typeDescription.hashCode();
}

@Override
public String toString() {
return "InvokeDynamic.InvocationProvider.ArgumentProvider.ForClassValue{" +
"typeDescription=" + typeDescription +
'}';
}
}

/** /**
* An argument provider for the {@code null} value. * An argument provider for the {@code null} value.
*/ */
Expand Down
Expand Up @@ -970,6 +970,8 @@ public static ArgumentLoader of(Object value) {
return new ForFloatConstant((Float) value); return new ForFloatConstant((Float) value);
} else if (value.getClass() == Double.class) { } else if (value.getClass() == Double.class) {
return new ForDoubleConstant((Double) value); return new ForDoubleConstant((Double) value);
} else if (value.getClass() == Class.class) {
return new ForClassConstant(new TypeDescription.ForLoadedType((Class<?>) value));
} else { } else {
return new ForStaticField(value); return new ForStaticField(value);
} }
Expand Down Expand Up @@ -1681,6 +1683,64 @@ public String toString() {
'}'; '}';
} }
} }

/**
* Loads a {@link java.lang.Class} value onto the operand stack.
*/
class ForClassConstant implements ArgumentLoader {

/**
* The type to load onto the operand stack.
*/
private final TypeDescription typeDescription;

/**
* Creates a new class constant representation.
*
* @param typeDescription The type to represent.
*/
public ForClassConstant(TypeDescription typeDescription) {
this.typeDescription = typeDescription;
}

@Override
public StackManipulation resolve(TypeDescription instrumentedType,
MethodDescription interceptedMethod,
TypeDescription targetType,
Assigner assigner,
boolean dynamicallyTyped) {
StackManipulation stackManipulation = new StackManipulation.Compound(
ClassConstant.of(typeDescription),
assigner.assign(new TypeDescription.ForLoadedType(Class.class), targetType, dynamicallyTyped));
if (!stackManipulation.isValid()) {
throw new IllegalStateException("Cannot assign Class value to " + targetType);
}
return stackManipulation;
}

@Override
public InstrumentedType prepare(InstrumentedType instrumentedType) {
return instrumentedType;
}

@Override
public boolean equals(Object other) {
return this == other || !(other == null || getClass() != other.getClass())
&& typeDescription.equals(((ForClassConstant) other).typeDescription);
}

@Override
public int hashCode() {
return typeDescription.hashCode();
}

@Override
public String toString() {
return "MethodCall.ArgumentLoader.ForClassConstant{" +
"typeDescription=" + typeDescription +
'}';
}
}
} }


/** /**
Expand Down
Expand Up @@ -380,6 +380,7 @@ public boolean isConstantPool() {
|| represents(float.class) || represents(float.class)
|| represents(double.class) || represents(double.class)
|| represents(String.class) || represents(String.class)
|| represents(Class.class)
|| JavaType.METHOD_HANDLE.representedBy(this) || JavaType.METHOD_HANDLE.representedBy(this)
|| JavaType.METHOD_TYPE.representedBy(this); || JavaType.METHOD_TYPE.representedBy(this);
} }
Expand Down
Expand Up @@ -6,6 +6,7 @@
import net.bytebuddy.test.utility.ObjectPropertyAssertion; import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import net.bytebuddy.test.utility.PrecompiledTypeClassLoader; import net.bytebuddy.test.utility.PrecompiledTypeClassLoader;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.MethodRule; import org.junit.rules.MethodRule;
Expand Down Expand Up @@ -40,6 +41,8 @@ public class InvokeDynamicTest extends AbstractInstrumentationTest {


private static final double DOUBLE = 42d; private static final double DOUBLE = 42d;


private static final Class<?> CLASS = Object.class;

private static final String STANDARD_ARGUMENT_BOOTSTRAP = "net.bytebuddy.test.precompiled.StandardArgumentBootstrap"; private static final String STANDARD_ARGUMENT_BOOTSTRAP = "net.bytebuddy.test.precompiled.StandardArgumentBootstrap";


private static final String PARAMETER_BOOTSTRAP = "net.bytebuddy.test.precompiled.ParameterBootstrap"; private static final String PARAMETER_BOOTSTRAP = "net.bytebuddy.test.precompiled.ParameterBootstrap";
Expand Down Expand Up @@ -110,20 +113,21 @@ public void testBootstrapWithArrayArgumentsWithoutArguments() throws Exception {


@Test @Test
@JavaVersionRule.Enforce(7) @JavaVersionRule.Enforce(7)
@Ignore("Recompile bootstrap classes")
public void testBootstrapWithArrayArgumentsWithArguments() throws Exception { public void testBootstrapWithArrayArgumentsWithArguments() throws Exception {
Class<?> type = classLoader.loadClass(PARAMETER_BOOTSTRAP); Class<?> type = classLoader.loadClass(PARAMETER_BOOTSTRAP);
Field field = type.getDeclaredField(ARGUMENTS_FIELD_NAME); Field field = type.getDeclaredField(ARGUMENTS_FIELD_NAME);
field.set(null, null); field.set(null, null);
TypeDescription typeDescription = new TypeDescription.ForLoadedType(type); TypeDescription typeDescription = new TypeDescription.ForLoadedType(type);
DynamicType.Loaded<Simple> dynamicType = instrument(Simple.class, DynamicType.Loaded<Simple> dynamicType = instrument(Simple.class,
InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP_ARRAY_ARGUMENTS)).getOnly(), InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP_ARRAY_ARGUMENTS)).getOnly(),
BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO) BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO, CLASS)
.withoutImplicitArguments(), .withoutImplicitArguments(),
classLoader, classLoader,
isDeclaredBy(Simple.class)); isDeclaredBy(Simple.class));
assertThat(dynamicType.getLoaded().newInstance().foo(), is(FOO)); assertThat(dynamicType.getLoaded().newInstance().foo(), is(FOO));
Object[] arguments = (Object[]) field.get(null); Object[] arguments = (Object[]) field.get(null);
assertThat(arguments.length, is(9)); assertThat(arguments.length, is(10));
assertThat(arguments[0], is((Object) (BOOLEAN ? 1 : 0))); assertThat(arguments[0], is((Object) (BOOLEAN ? 1 : 0)));
assertThat(arguments[1], is((Object) Integer.valueOf(BYTE))); assertThat(arguments[1], is((Object) Integer.valueOf(BYTE)));
assertThat(arguments[2], is((Object) Integer.valueOf(SHORT))); assertThat(arguments[2], is((Object) Integer.valueOf(SHORT)));
Expand All @@ -133,18 +137,20 @@ public void testBootstrapWithArrayArgumentsWithArguments() throws Exception {
assertThat(arguments[6], is((Object) FLOAT)); assertThat(arguments[6], is((Object) FLOAT));
assertThat(arguments[7], is((Object) DOUBLE)); assertThat(arguments[7], is((Object) DOUBLE));
assertThat(arguments[8], is((Object) FOO)); assertThat(arguments[8], is((Object) FOO));
assertThat(arguments[9], is((Object) CLASS));
} }


@Test @Test
@JavaVersionRule.Enforce(7) @JavaVersionRule.Enforce(7)
@Ignore("Recompile bootstrap classes")
public void testBootstrapWithExplicitArgumentsWithArguments() throws Exception { public void testBootstrapWithExplicitArgumentsWithArguments() throws Exception {
Class<?> type = classLoader.loadClass(PARAMETER_BOOTSTRAP); Class<?> type = classLoader.loadClass(PARAMETER_BOOTSTRAP);
Field field = type.getDeclaredField(ARGUMENTS_FIELD_NAME); Field field = type.getDeclaredField(ARGUMENTS_FIELD_NAME);
field.set(null, null); field.set(null, null);
TypeDescription typeDescription = new TypeDescription.ForLoadedType(type); TypeDescription typeDescription = new TypeDescription.ForLoadedType(type);
DynamicType.Loaded<Simple> dynamicType = instrument(Simple.class, DynamicType.Loaded<Simple> dynamicType = instrument(Simple.class,
InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP_EXPLICIT_ARGUMENTS)).getOnly(), InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP_EXPLICIT_ARGUMENTS)).getOnly(),
BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO) BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO, CLASS)
.withoutImplicitArguments(), .withoutImplicitArguments(),
classLoader, classLoader,
isDeclaredBy(Simple.class)); isDeclaredBy(Simple.class));
Expand All @@ -160,6 +166,7 @@ public void testBootstrapWithExplicitArgumentsWithArguments() throws Exception {
assertThat(arguments[6], is((Object) FLOAT)); assertThat(arguments[6], is((Object) FLOAT));
assertThat(arguments[7], is((Object) DOUBLE)); assertThat(arguments[7], is((Object) DOUBLE));
assertThat(arguments[8], is((Object) FOO)); assertThat(arguments[8], is((Object) FOO));
assertThat(arguments[9], is((Object) CLASS));
} }


@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
Expand All @@ -171,6 +178,7 @@ public void testBootstrapWithExplicitArgumentsWithoutArgumentsThrowsException()


@Test @Test
@JavaVersionRule.Enforce(7) @JavaVersionRule.Enforce(7)
@Ignore("Recompile bootstrap classes")
public void testBootstrapOfMethodsWithParametersPrimitive() throws Exception { public void testBootstrapOfMethodsWithParametersPrimitive() throws Exception {
Class<?> type = classLoader.loadClass(ARGUMENT_BOOTSTRAP); Class<?> type = classLoader.loadClass(ARGUMENT_BOOTSTRAP);
TypeDescription typeDescription = new TypeDescription.ForLoadedType(type); TypeDescription typeDescription = new TypeDescription.ForLoadedType(type);
Expand All @@ -187,15 +195,16 @@ public void testBootstrapOfMethodsWithParametersPrimitive() throws Exception {
.withLongValue(LONG) .withLongValue(LONG)
.withFloatValue(FLOAT) .withFloatValue(FLOAT)
.withDoubleValue(DOUBLE) .withDoubleValue(DOUBLE)
.withValue(FOO, value), .withValue(FOO, CLASS, value),
classLoader, classLoader,
isDeclaredBy(Simple.class)); isDeclaredBy(Simple.class));
assertThat(dynamicType.getLoaded().newInstance().foo(), assertThat(dynamicType.getLoaded().newInstance().foo(),
is("" + BOOLEAN + BYTE + SHORT + CHARACTER + INTEGER + LONG + FLOAT + DOUBLE + FOO + value)); is("" + BOOLEAN + BYTE + SHORT + CHARACTER + INTEGER + LONG + FLOAT + DOUBLE + FOO + CLASS + value));
} }


@Test @Test
@JavaVersionRule.Enforce(7) @JavaVersionRule.Enforce(7)
@Ignore("Recompile bootstrap classes")
public void testBootstrapOfMethodsWithParametersWrapperConstantPool() throws Exception { public void testBootstrapOfMethodsWithParametersWrapperConstantPool() throws Exception {
Class<?> type = classLoader.loadClass(ARGUMENT_BOOTSTRAP); Class<?> type = classLoader.loadClass(ARGUMENT_BOOTSTRAP);
TypeDescription typeDescription = new TypeDescription.ForLoadedType(type); TypeDescription typeDescription = new TypeDescription.ForLoadedType(type);
Expand All @@ -204,16 +213,17 @@ public void testBootstrapOfMethodsWithParametersWrapperConstantPool() throws Exc
InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP)).getOnly()) InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP)).getOnly())
.invoke(BAR, String.class) .invoke(BAR, String.class)
.withoutImplicitArguments() .withoutImplicitArguments()
.withValue(BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO, value), .withValue(BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO, CLASS, value),
classLoader, classLoader,
isDeclaredBy(Simple.class)); isDeclaredBy(Simple.class));
assertThat(dynamicType.getLoaded().getDeclaredFields().length, is(1)); assertThat(dynamicType.getLoaded().getDeclaredFields().length, is(1));
assertThat(dynamicType.getLoaded().newInstance().foo(), assertThat(dynamicType.getLoaded().newInstance().foo(),
is("" + BOOLEAN + BYTE + SHORT + CHARACTER + INTEGER + LONG + FLOAT + DOUBLE + FOO + value)); is("" + BOOLEAN + BYTE + SHORT + CHARACTER + INTEGER + LONG + FLOAT + DOUBLE + FOO + CLASS + value));
} }


@Test @Test
@JavaVersionRule.Enforce(7) @JavaVersionRule.Enforce(7)
@Ignore("Recompile bootstrap classes")
public void testBootstrapOfMethodsWithParametersWrapperReference() throws Exception { public void testBootstrapOfMethodsWithParametersWrapperReference() throws Exception {
Class<?> type = classLoader.loadClass(ARGUMENT_BOOTSTRAP); Class<?> type = classLoader.loadClass(ARGUMENT_BOOTSTRAP);
TypeDescription typeDescription = new TypeDescription.ForLoadedType(type); TypeDescription typeDescription = new TypeDescription.ForLoadedType(type);
Expand All @@ -222,12 +232,12 @@ public void testBootstrapOfMethodsWithParametersWrapperReference() throws Except
InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP)).getOnly()) InvokeDynamic.bootstrap(typeDescription.getDeclaredMethods().filter(named(BOOTSTRAP)).getOnly())
.invoke(BAR, String.class) .invoke(BAR, String.class)
.withoutImplicitArguments() .withoutImplicitArguments()
.withReference(BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO, value), .withReference(BOOLEAN, BYTE, SHORT, CHARACTER, INTEGER, LONG, FLOAT, DOUBLE, FOO, CLASS, value),
classLoader, classLoader,
isDeclaredBy(Simple.class)); isDeclaredBy(Simple.class));
assertThat(dynamicType.getLoaded().getDeclaredFields().length, is(10)); assertThat(dynamicType.getLoaded().getDeclaredFields().length, is(11));
assertThat(dynamicType.getLoaded().newInstance().foo(), assertThat(dynamicType.getLoaded().newInstance().foo(),
is("" + BOOLEAN + BYTE + SHORT + CHARACTER + INTEGER + LONG + FLOAT + DOUBLE + FOO + value)); is("" + BOOLEAN + BYTE + SHORT + CHARACTER + INTEGER + LONG + FLOAT + DOUBLE + FOO + CLASS + value));
} }


@Test @Test
Expand Down Expand Up @@ -414,6 +424,8 @@ public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForDoubleValue.class).apply(); ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForDoubleValue.class).apply();
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForExistingField.class).apply(); ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForExistingField.class).apply();
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForInstanceField.class).apply(); ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForInstanceField.class).apply();
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForStringValue.class).apply();
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForClassValue.class).apply();
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForStaticField.class).apply(); ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForStaticField.class).apply();
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForThisInstance.class).apply(); ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.ForThisInstance.class).apply();
ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.Resolved.Simple.class).apply(); ObjectPropertyAssertion.of(InvokeDynamic.InvocationProvider.ArgumentProvider.Resolved.Simple.class).apply();
Expand Down
Expand Up @@ -453,6 +453,7 @@ public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(MethodCall.ArgumentLoader.ForMethodParameter.class).apply(); ObjectPropertyAssertion.of(MethodCall.ArgumentLoader.ForMethodParameter.class).apply();
ObjectPropertyAssertion.of(MethodCall.ArgumentLoader.ForShortConstant.class).apply(); ObjectPropertyAssertion.of(MethodCall.ArgumentLoader.ForShortConstant.class).apply();
ObjectPropertyAssertion.of(MethodCall.ArgumentLoader.ForTextConstant.class).apply(); ObjectPropertyAssertion.of(MethodCall.ArgumentLoader.ForTextConstant.class).apply();
ObjectPropertyAssertion.of(MethodCall.ArgumentLoader.ForClassConstant.class).apply();
} }


public static class StaticMethod { public static class StaticMethod {
Expand Down
Expand Up @@ -30,6 +30,8 @@ public class MethodCallTypeTest extends AbstractInstrumentationTest {


private static final String STRING_VALUE = "foo"; private static final String STRING_VALUE = "foo";


private static final Class<?> CLASS_VALUE = Object.class;

private static final boolean BOOLEAN_VALUE = true; private static final boolean BOOLEAN_VALUE = true;


private static final byte BYTE_VALUE = 42; private static final byte BYTE_VALUE = 42;
Expand Down Expand Up @@ -81,6 +83,7 @@ public static Collection<Object[]> data() {
{DOUBLE_VALUE, true, false}, {DOUBLE_VALUE, true, false},
{NULL_CONSTANT, false, false}, {NULL_CONSTANT, false, false},
{STRING_VALUE, true, false}, {STRING_VALUE, true, false},
{CLASS_VALUE, true, false},
{REFERENCE_VALUE, true, true} {REFERENCE_VALUE, true, true}
}); });
} }
Expand Down
Expand Up @@ -372,6 +372,7 @@ public void testConstantPool() throws Exception {
assertThat(describe(int.class).isConstantPool(), is(true)); assertThat(describe(int.class).isConstantPool(), is(true));
assertThat(describe(Integer.class).isConstantPool(), is(false)); assertThat(describe(Integer.class).isConstantPool(), is(false));
assertThat(describe(String.class).isConstantPool(), is(true)); assertThat(describe(String.class).isConstantPool(), is(true));
assertThat(describe(Class.class).isConstantPool(), is(true));
} }


protected interface SampleInterface { protected interface SampleInterface {
Expand Down
Expand Up @@ -21,8 +21,9 @@ public static String foo(boolean arg0,
float arg6, float arg6,
double arg7, double arg7,
String arg8, String arg8,
Object arg9) { Class<?> arg9,
return "" + arg0 + arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9; Object arg10) {
return "" + arg0 + arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9 + arg10;
} }


public static String bar(Boolean arg0, public static String bar(Boolean arg0,
Expand All @@ -34,8 +35,9 @@ public static String bar(Boolean arg0,
Float arg6, Float arg6,
Double arg7, Double arg7,
String arg8, String arg8,
Object arg9) { Class<?> arg9,
return "" + arg0 + arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9; Object arg10) {
return "" + arg0 + arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9 + arg10;
} }


public static String qux(String arg) { public static String qux(String arg) {
Expand Down
Expand Up @@ -31,9 +31,10 @@ public static CallSite bootstrapExplicitArguments(MethodHandles.Lookup lookup,
long arg5, long arg5,
float arg6, float arg6,
double arg7, double arg7,
String arg8) String arg8,
Class<?> arg9)
throws NoSuchMethodException, IllegalAccessException { throws NoSuchMethodException, IllegalAccessException {
ParameterBootstrap.arguments = new Object[]{arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8}; ParameterBootstrap.arguments = new Object[]{arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9};
return new ConstantCallSite(lookup.findStatic(ParameterBootstrap.class, methodName, methodType)); return new ConstantCallSite(lookup.findStatic(ParameterBootstrap.class, methodName, methodType));
} }


Expand Down

0 comments on commit 4f2f6ad

Please sign in to comment.