summaryrefslogtreecommitdiffstats
path: root/test/617-clinit-oome
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2016-08-10 13:57:39 -0700
committerMathieu Chartier <mathieuc@google.com>2016-08-10 18:57:19 -0700
commit5464c73567ccccd0cda6449d2a2775814d5fe88d (patch)
treeaf6143d16eb36c82ab91790b0e7d04df837c40c4 /test/617-clinit-oome
parent6b9c54c8ae70d5a75e26bef20a26316ff7c9ab18 (diff)
downloadart-5464c73567ccccd0cda6449d2a2775814d5fe88d.tar.gz
art-5464c73567ccccd0cda6449d2a2775814d5fe88d.tar.bz2
art-5464c73567ccccd0cda6449d2a2775814d5fe88d.zip
Fix pending exception failure for encoded statics
ReadValueToField may allocate a string and cause OOME, we were not checking this each loop iteration. Throwing an exception with a pending exception causes an abort. Bug: 30690988 Test: test-art-host (cherry picked from commit da595bec0f9af0b087822e4febc282fe8ec28192) Change-Id: I4701a4dcc63553aeb5c7970f99fd7f136443b266
Diffstat (limited to 'test/617-clinit-oome')
-rw-r--r--test/617-clinit-oome/expected.txt1
-rw-r--r--test/617-clinit-oome/info.txt1
-rw-r--r--test/617-clinit-oome/src/Main.java43
-rw-r--r--test/617-clinit-oome/src/Other.java28
4 files changed, 73 insertions, 0 deletions
diff --git a/test/617-clinit-oome/expected.txt b/test/617-clinit-oome/expected.txt
new file mode 100644
index 0000000000..c1d33ff9e6
--- /dev/null
+++ b/test/617-clinit-oome/expected.txt
@@ -0,0 +1 @@
+Filling heap
diff --git a/test/617-clinit-oome/info.txt b/test/617-clinit-oome/info.txt
new file mode 100644
index 0000000000..ece35b28cd
--- /dev/null
+++ b/test/617-clinit-oome/info.txt
@@ -0,0 +1 @@
+Regression test for encoded static strings caussing OOME b/30690988
diff --git a/test/617-clinit-oome/src/Main.java b/test/617-clinit-oome/src/Main.java
new file mode 100644
index 0000000000..749a2325ef
--- /dev/null
+++ b/test/617-clinit-oome/src/Main.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+public class Main {
+ public static void main(String[] args) {
+ Class klass = Other.class;
+ Object[] data = new Object[100000];
+ try {
+ System.out.println("Filling heap");
+ int size = 256 * 1024 * 1024;
+ int index = 0;
+ while (true) {
+ try {
+ data[index] = new byte[size];
+ index++;
+ } catch (OutOfMemoryError e) {
+ size /= 2;
+ if (size == 0) {
+ break;
+ }
+ }
+ }
+ // Initialize now that the heap is full.
+ Other.print();
+ } catch (OutOfMemoryError e) {
+ } catch (Exception e) {
+ System.err.println(e);
+ }
+ }
+}
diff --git a/test/617-clinit-oome/src/Other.java b/test/617-clinit-oome/src/Other.java
new file mode 100644
index 0000000000..20306ee4c4
--- /dev/null
+++ b/test/617-clinit-oome/src/Other.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+public final class Other {
+ public static final String string1 = "ABCDEFG1";
+ public static final String string2 = "ABCDEFG2";
+ public static final String string3 = "ABCDEFG3";
+ public static final String string4 = "ABCDEFG4";
+ public static final String string5 = "ABCDEFG5";
+ public static final int int1 = 12;
+
+ public static void print() {
+ System.out.println(string2);
+ }
+}