< prev index next >
test/java/lang/String/concat/StringConcatFactoryInvariants.java
Print this page
rev 17632 : 8186500: StringConcatFactory.makeConcatWithConstants throws AssertionError when recipe contains non-String constants
Reviewed-by: shade, psandoz
*** 68,78 ****
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
String methodName = "foo";
MethodType mt = MethodType.methodType(String.class, String.class, int.class);
String recipe = "" + TAG_ARG + TAG_ARG + TAG_CONST;
! String[] constants = new String[]{"bar"};
final int LIMIT = 200;
// Simple factory: check for dynamic arguments overflow
Class<?>[] underThreshold = new Class<?>[LIMIT - 1];
--- 68,84 ----
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
String methodName = "foo";
MethodType mt = MethodType.methodType(String.class, String.class, int.class);
String recipe = "" + TAG_ARG + TAG_ARG + TAG_CONST;
! Object[] constants = new String[] { "bar" };
! Object[] intConstants = new Integer[] { 1 };
! Object[] shortConstants = new Short[] { 1 };
! Object[] longConstants = new Long[] { 1L };
! Object[] booleanConstants = new Boolean[] { true };
! Object[] charConstants = new Character[] { 'a' };
! Object[] byteConstants = new Byte[] { 1 };
final int LIMIT = 200;
// Simple factory: check for dynamic arguments overflow
Class<?>[] underThreshold = new Class<?>[LIMIT - 1];
*** 111,120 ****
--- 117,136 ----
{
CallSite cs = StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, recipe, constants);
test("foo42bar", (String) cs.getTarget().invokeExact("foo", 42));
}
+ {
+ CallSite cs = StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, recipe, intConstants);
+ test("foo421", (String) cs.getTarget().invokeExact("foo", 42));
+ }
+
+ {
+ CallSite cs = StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, recipe, booleanConstants);
+ test("foo42true", (String) cs.getTarget().invokeExact("foo", 42));
+ }
+
// Simple factory, check for nulls:
failNPE("Lookup is null",
() -> StringConcatFactory.makeConcat(null, methodName, mt));
failNPE("Method name is null",
*** 125,145 ****
// Advanced factory, check for nulls:
failNPE("Lookup is null",
() -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, constants));
failNPE("Method name is null",
() -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, constants));
failNPE("MethodType is null",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, constants));
failNPE("Recipe is null",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, constants));
failNPE("Constants vararg is null",
! () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, recipe, null));
// Simple factory, check for return type
fail("Return type: void",
() -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(void.class, String.class, int.class)));
--- 141,233 ----
// Advanced factory, check for nulls:
failNPE("Lookup is null",
() -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, constants));
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, shortConstants));
+
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, intConstants));
+
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, longConstants));
+
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, booleanConstants));
+
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, byteConstants));
+
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, charConstants));
+
failNPE("Method name is null",
() -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, constants));
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, shortConstants));
+
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, intConstants));
+
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, longConstants));
+
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, booleanConstants));
+
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, byteConstants));
+
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, charConstants));
+
failNPE("MethodType is null",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, constants));
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, shortConstants));
+
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, intConstants));
+
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, longConstants));
+
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, booleanConstants));
+
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, byteConstants));
+
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, charConstants));
+
failNPE("Recipe is null",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, constants));
+ failNPE("Recipe is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, shortConstants));
+
+ failNPE("Recipe is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, intConstants));
+
+ failNPE("Recipe is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, longConstants));
+
+ failNPE("Recipe is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, booleanConstants));
+
+ failNPE("Recipe is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, byteConstants));
+
+ failNPE("Recipe is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, charConstants));
+
failNPE("Constants vararg is null",
! () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, recipe, (Object[])null));
// Simple factory, check for return type
fail("Return type: void",
() -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(void.class, String.class, int.class)));
*** 160,184 ****
--- 248,344 ----
// Advanced factory, check for return types
fail("Return type: void",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, constants));
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, intConstants));
+
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, shortConstants));
+
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, longConstants));
+
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, booleanConstants));
+
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, byteConstants));
+
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, charConstants));
+
fail("Return type: int",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(int.class, String.class, int.class), recipe, constants));
fail("Return type: StringBuilder",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(StringBuilder.class, String.class, int.class), recipe, constants));
ok("Return type: Object",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, constants));
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, intConstants));
+
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, shortConstants));
+
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, longConstants));
+
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, booleanConstants));
+
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, byteConstants));
+
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, charConstants));
+
ok("Return type: CharSequence",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, constants));
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, intConstants));
+
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, shortConstants));
+
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, longConstants));
+
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, booleanConstants));
+
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, byteConstants));
+
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, charConstants));
+
ok("Return type: Serializable",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, constants));
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, intConstants));
+
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, shortConstants));
+
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, longConstants));
+
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, booleanConstants));
+
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, byteConstants));
+
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, charConstants));
+
// Simple factory: check for dynamic arguments overflow
ok("Dynamic arguments is under limit",
() -> StringConcatFactory.makeConcat(lookup, methodName, mtUnderThreshold));
ok("Dynamic arguments is at the limit",
*** 214,235 ****
fail("Dynamic arguments and recipe mismatch",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeOverThreshold, constants));
// Test passing array as constant
{
! String[] arg = {"boo", "bar"};
CallSite cs1 = StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST + TAG_CONST, arg);
test("42boobar", (String) cs1.getTarget().invokeExact(42));
}
// Test passing null constant
ok("Can pass regular constants",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST, "foo"));
failNPE("Cannot pass null constants",
! () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST, new String[]{null}));
// Simple factory: test empty arguments
ok("Ok to pass empty arguments",
() -> StringConcatFactory.makeConcat(lookup, methodName, mtEmpty));
--- 374,395 ----
fail("Dynamic arguments and recipe mismatch",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeOverThreshold, constants));
// Test passing array as constant
{
! Object[] arg = {"boo", "bar"};
CallSite cs1 = StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST + TAG_CONST, arg);
test("42boobar", (String) cs1.getTarget().invokeExact(42));
}
// Test passing null constant
ok("Can pass regular constants",
() -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST, "foo"));
failNPE("Cannot pass null constants",
! () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST, new Object[]{null}));
// Simple factory: test empty arguments
ok("Ok to pass empty arguments",
() -> StringConcatFactory.makeConcat(lookup, methodName, mtEmpty));
< prev index next >