Correct some things in test 068. Add detail to a verification error message.
diff --git a/tests/068-classloader/expected.txt b/tests/068-classloader/expected.txt
index 2056234..bf131ee 100644
--- a/tests/068-classloader/expected.txt
+++ b/tests/068-classloader/expected.txt
@@ -6,6 +6,7 @@
Got expected LinkageError on DE
Got DEO result DoubledExtendOkay 1
Got LinkageError on GD
+Got LinkageError on TA
Ctor: doubled implement, type 1
DoubledImplement one
Got LinkageError on DI (early)
diff --git a/tests/068-classloader/src-ex/AbstractGet.java b/tests/068-classloader/src-ex/AbstractGet.java
new file mode 100644
index 0000000..b62aa8f
--- /dev/null
+++ b/tests/068-classloader/src-ex/AbstractGet.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Verify that we don't reject this with a LinkageError.
+ */
+public class AbstractGet extends AbstractBase {
+ public DoubledExtendOkay getExtended() {
+ return new DoubledExtendOkay();
+ }
+}
+
+/**
+ * Abstract class, does not declare getAbstract. This cause the VM to
+ * generate a "miranda" method.
+ */
+abstract class AbstractBase extends BaseOkay {
+ public abstract DoubledExtendOkay getExtended();
+}
+
diff --git a/tests/068-classloader/src-ex/GetDoubled.java b/tests/068-classloader/src-ex/GetDoubled.java
index fed70ed..5e20441 100644
--- a/tests/068-classloader/src-ex/GetDoubled.java
+++ b/tests/068-classloader/src-ex/GetDoubled.java
@@ -20,8 +20,8 @@
* to return.
*/
public class GetDoubled implements IGetDoubled {
- public DoubledExtend getDoubled() {
- return new DoubledExtend();
+ public DoubledExtendOkay getDoubled() {
+ return new DoubledExtendOkay();
}
}
diff --git a/tests/068-classloader/src/IGetDoubled.java b/tests/068-classloader/src/IGetDoubled.java
index da7f806..0a4ac91 100644
--- a/tests/068-classloader/src/IGetDoubled.java
+++ b/tests/068-classloader/src/IGetDoubled.java
@@ -18,6 +18,6 @@
* Interface, loaded from one loader, used from another.
*/
public interface IGetDoubled {
- public DoubledExtend getDoubled();
+ public DoubledExtendOkay getDoubled();
}
diff --git a/tests/068-classloader/src/Main.java b/tests/068-classloader/src/Main.java
index 24abfee..0788b52 100644
--- a/tests/068-classloader/src/Main.java
+++ b/tests/068-classloader/src/Main.java
@@ -25,6 +25,8 @@
FancyLoader loader;
loader = new FancyLoader(ClassLoader.getSystemClassLoader());
+ //System.out.println("SYSTEM: " + ClassLoader.getSystemClassLoader());
+ //System.out.println("ALTERN: " + loader);
/*
* This statement has no effect on this program, but it can
@@ -53,6 +55,7 @@
testExtend(loader);
testExtendOkay(loader);
testInterface(loader);
+ testAbstract(loader);
testImplement(loader);
testIfaceImplement(loader);
}
@@ -232,7 +235,7 @@
Class getDoubledClass;
Object obj;
- /* get the "alternate" version of GetDoubled */
+ /* get GetDoubled from the "alternate" class loader */
try {
getDoubledClass = loader.loadClass("GetDoubled");
} catch (ClassNotFoundException cnfe) {
@@ -251,7 +254,7 @@
return;
} catch (LinkageError le) {
// Dalvik bails here
- System.err.println("Got LinkageError on GD");
+ System.out.println("Got LinkageError on GD");
return;
}
@@ -260,18 +263,63 @@
*/
IGetDoubled iface = (IGetDoubled) obj;
try {
- /* "de" will be the wrong variety of DoubledExtend */
- DoubledExtend de = iface.getDoubled();
+ /* "de" will be the wrong variety of DoubledExtendOkay */
+ DoubledExtendOkay de = iface.getDoubled();
// reference impl bails here
String str = de.getStr();
} catch (LinkageError le) {
- System.err.println("Got LinkageError on GD");
+ System.out.println("Got LinkageError on GD");
return;
}
System.err.println("Should have failed by now on GetDoubled");
}
/**
+ * Throw an abstract class into the middle and see what happens.
+ */
+ static void testAbstract(ClassLoader loader) {
+ Class abstractGetClass;
+ Object obj;
+
+ /* get AbstractGet from the "alternate" loader */
+ try {
+ abstractGetClass = loader.loadClass("AbstractGet");
+ } catch (ClassNotFoundException cnfe) {
+ System.err.println("loadClass ta failed: " + cnfe);
+ return;
+ }
+
+ /* instantiate */
+ try {
+ obj = abstractGetClass.newInstance();
+ } catch (InstantiationException ie) {
+ System.err.println("newInstance failed: " + ie);
+ return;
+ } catch (IllegalAccessException iae) {
+ System.err.println("newInstance failed: " + iae);
+ return;
+ } catch (LinkageError le) {
+ System.out.println("Got LinkageError on TA");
+ return;
+ }
+
+ /* use the base class reference to get a CL-specific instance */
+ BaseOkay baseRef = (BaseOkay) obj;
+ DoubledExtendOkay de = baseRef.getExtended();
+
+ /* try to call through it */
+ try {
+ String result;
+
+ result = BaseOkay.doStuff(de);
+ } catch (LinkageError le) {
+ System.out.println("Got LinkageError on TA");
+ return;
+ }
+ System.err.println("Should have failed by now in testAbstract");
+ }
+
+ /**
* Test a doubled class that implements a common interface.
*/
static void testImplement(ClassLoader loader) {
diff --git a/vm/analysis/CodeVerify.c b/vm/analysis/CodeVerify.c
index 0bb899d..0ab36ea 100644
--- a/vm/analysis/CodeVerify.c
+++ b/vm/analysis/CodeVerify.c
@@ -3531,8 +3531,9 @@
if (!dvmIsInterfaceClass(declClass) &&
!dvmInstanceof(resClass, declClass))
{
- LOG_VFY("VFY: returning %s, declared %s\n",
- resClass->descriptor, declClass->descriptor);
+ LOG_VFY("VFY: returning %s (cl=%p), declared %s (cl=%p)\n",
+ resClass->descriptor, resClass->classLoader,
+ declClass->descriptor, declClass->classLoader);
failure = VERIFY_ERROR_GENERIC;
break;
}