Fix liveness of array classliterals for JsVarargs.
The pass ImplementJsVarags inserts array creations that refer to the
array class literal. Such class literal must be kept live.
Change-Id: I42ba323691616725a3afceadbda9229dd7b5220c
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
index 1b97a34..b36c6af 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -636,7 +636,12 @@
if (param.isVarargs()) {
assert method.isJsMethodVarargs();
// Rescue the (array) type of varargs parameters as the array creation is implicit.
- rescue((JReferenceType) param.getType(), true);
+ JArrayType paramType = (JArrayType) param.getType().getUnderlyingType();
+ rescue(paramType, true);
+ // Rescue the class literal for the array type as it will be needed when
+ // ImplementJsVarargs inserts the method prelude to support the JS vararg calling
+ // convention.
+ rescue(program.getClassLiteralField(paramType.getLeafType()));
}
}
}
diff --git a/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java b/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
index 9ab1c19..68322a7 100644
--- a/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
+++ b/user/test/com/google/gwt/core/interop/JsTypeVarargsTest.java
@@ -287,6 +287,7 @@
sideEffectCount++;
return obj;
}
+
public void testVarargsCall_sideEffectingInstance() {
SubclassNativeWithVarargsConstructor object =
new SubclassNativeWithVarargsConstructor(0, new Object[0]);
@@ -295,4 +296,16 @@
assertSame(object, doSideEffect(object).varargsMethod(0, params));
assertSame(1, sideEffectCount);
}
+
+ static class UninstantiatedClass {
+ }
+
+ @JsMethod(namespace = JsPackage.GLOBAL)
+ public static UninstantiatedClass[] varargJsMethodUninstantiatedVararg(UninstantiatedClass... varargs) {
+ return varargs;
+ }
+
+ public native void testVarargsCall_uninstantiatedVararg() /*-{
+ @GWTTestCase::assertEquals(II)(0, $global.varargJsMethodUninstantiatedVararg().length);
+ }-*/;
}