Backport from dalvik-dev, due to customer demand.
Bug: http://code.google.com/p/android/issues/detail?id=41196
Change-Id: I53ef57e54983f2173546463ac78e265ff5dd3284
Got expected EIIE for FIELD0
Got expected NCDFE for FIELD0
Got expected NCDFE for FIELD1
+Got expected 'hello!' from Exploder
SlowInit static block pre-sleep
SlowInit static block post-sleep
MethodThread message
--- /dev/null
+/*
+ * Copyright (C) 2012 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.
+ */
+
+
+/**
+ * Throws an Error rather than an exception from its class initializer.
+ */
+public class Exploder {
+ public static final Object FIELD = new AssertThrower();
+ static class AssertThrower {
+ AssertThrower() {
+ throw new AssertionError("hello!");
+ }
+ }
+}
} catch (NoClassDefFoundError ncdfe) {
System.out.println("Got expected NCDFE for FIELD1");
}
+
+ try {
+ System.out.println(Exploder.FIELD);
+ System.err.println("Load of FIELD succeeded unexpectedly");
+ } catch (AssertionError expected) {
+ System.out.println("Got expected '" + expected.getMessage() + "' from Exploder");
+ }
}
static void checkTiming() {
void dvmThrowExceptionInInitializerError()
{
/*
- * TODO: Do we want to wrap it if the original is an Error rather than
- * an Exception?
- *
* TODO: Should this just use dvmWrapException()?
*/
- if (gDvm.exExceptionInInitializerError == NULL) {
+ if (gDvm.exExceptionInInitializerError == NULL || gDvm.exError == NULL) {
/*
* ExceptionInInitializerError isn't itself initialized. This
* can happen very early during VM startup if there is a
Thread* self = dvmThreadSelf();
Object* exception = dvmGetException(self);
+ // We only wrap non-Error exceptions; an Error can just be used as-is.
+ if (dvmInstanceof(exception->clazz, gDvm.exError)) {
+ return;
+ }
+
dvmAddTrackedAlloc(exception, self);
dvmClearException(self);