blob: afafc76aa1eecac04466d2acd8081f684270b612 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Stephan Herrmann - Contribution for
* bug 393719 - [compiler] inconsistent warnings on iteration variables
* Bug 388800 - [1.8] adjust tests to 1.8 JRE
* Jesper S Moller - Contribution for
* bug 401853 - Eclipse Java compiler creates invalid bytecode (java.lang.VerifyError)
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import java.io.File;
import java.util.Map;
import junit.framework.Test;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
public class ForeachStatementTest extends AbstractComparableTest {
public ForeachStatementTest(String name) {
super(name);
}
/*
* Toggle compiler in mode -1.5
*/
protected Map getCompilerOptions() {
Map options = super.getCompilerOptions();
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
options.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
return options;
}
// Static initializer to specify tests subset using TESTS_* static variables
// All specified tests which do not belong to the class are skipped...
static {
// TESTS_NAMES = new String[] { "test055" };
// TESTS_NUMBERS = new int[] { 50, 51, 52, 53 };
// TESTS_RANGE = new int[] { 34, 38 };
}
public static Test suite() {
return buildComparableTestSuite(testClass());
}
public void test001() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" \n" +
" for (char c : \"SUCCESS\".toCharArray()) {\n" +
" System.out.print(c);\n" +
" }\n" +
" System.out.println();\n" +
" }\n" +
"}\n",
},
"SUCCESS");
}
public void test002() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" \n" +
" for (int value : new int[] {value}) {\n" +
" System.out.println(value);\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" for (int value : new int[] {value}) {\n" +
" ^^^^^\n" +
"value cannot be resolved to a variable\n" +
"----------\n");
}
public void test003() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" \n" +
" for (int value : value) {\n" +
" System.out.println(value);\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" for (int value : value) {\n" +
" ^^^^^\n" +
"value cannot be resolved to a variable\n" +
"----------\n");
}
public void test004() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n" +
" int sum = 0;\n" +
" loop: for (final int e : tab) {\n" +
" sum += e;\n" +
" if (e == 3) {\n" +
" break loop;\n" +
" }\n" +
" }\n" +
" System.out.println(sum);\n" +
" }\n" +
"}\n",
},
"6");
}
public void test005() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" final int i;\n" +
" int[] tab = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n" +
" int sum = 0;\n" +
" loop: for (final int e : tab) {\n" +
" sum += e;\n" +
" if (e == 3) {\n" +
" i = 1;\n" +
" break loop;\n" +
" }\n" +
" }\n" +
" System.out.println(sum + i);\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 13)\n" +
" System.out.println(sum + i);\n" +
" ^\n" +
"The local variable i may not have been initialized\n" +
"----------\n");
}
public void test006() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" final int i;\n" +
" int[] tab = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n" +
" loop: for (final int e : tab) {\n" +
" i = e;\n" +
" if (e == 3) {\n" +
" i = 1;\n" +
" break loop;\n" +
" }\n" +
" }\n" +
" System.out.println(i);\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" i = e;\n" +
" ^\n" +
"The final local variable i may already have been assigned\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" i = 1;\n" +
" ^\n" +
"The final local variable i may already have been assigned\n" +
"----------\n" +
"3. ERROR in X.java (at line 13)\n" +
" System.out.println(i);\n" +
" ^\n" +
"The local variable i may not have been initialized\n" +
"----------\n");
}
public void test007() throws Exception {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int i;\n" +
" int[] tab = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n" +
" for (final int e : tab) {\n" +
" i = e;\n" +
" }\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS",
null,
true,
null,
customOptions,
null/*no custom requestor*/);
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 7\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 bipush 9\n" +
" 2 newarray int [10]\n" +
" 4 dup\n" +
" 5 iconst_0\n" +
" 6 iconst_1\n" +
" 7 iastore\n" +
" 8 dup\n" +
" 9 iconst_1\n" +
" 10 iconst_2\n" +
" 11 iastore\n" +
" 12 dup\n" +
" 13 iconst_2\n" +
" 14 iconst_3\n" +
" 15 iastore\n" +
" 16 dup\n" +
" 17 iconst_3\n" +
" 18 iconst_4\n" +
" 19 iastore\n" +
" 20 dup\n" +
" 21 iconst_4\n" +
" 22 iconst_5\n" +
" 23 iastore\n" +
" 24 dup\n" +
" 25 iconst_5\n" +
" 26 bipush 6\n" +
" 28 iastore\n" +
" 29 dup\n" +
" 30 bipush 6\n" +
" 32 bipush 7\n" +
" 34 iastore\n" +
" 35 dup\n" +
" 36 bipush 7\n" +
" 38 bipush 8\n" +
" 40 iastore\n" +
" 41 dup\n" +
" 42 bipush 8\n" +
" 44 bipush 9\n" +
" 46 iastore\n" +
" 47 astore_2 [tab]\n" +
" 48 aload_2 [tab]\n" +
" 49 dup\n" +
" 50 astore 6\n" +
" 52 arraylength\n" +
" 53 istore 5\n" +
" 55 iconst_0\n" +
" 56 istore 4\n" +
" 58 goto 72\n" +
" 61 aload 6\n" +
" 63 iload 4\n" +
" 65 iaload\n" +
" 66 istore_3 [e]\n" +
" 67 iload_3 [e]\n" +
" 68 istore_1\n" +
" 69 iinc 4 1\n" +
" 72 iload 4\n" +
" 74 iload 5\n" +
" 76 if_icmplt 61\n" +
" 79 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 82 ldc <String \"SUCCESS\"> [22]\n" +
" 84 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
" 87 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
" [pc: 48, line: 6]\n" +
" [pc: 67, line: 7]\n" +
" [pc: 69, line: 6]\n" +
" [pc: 79, line: 9]\n" +
" [pc: 87, line: 10]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 88] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 48, pc: 88] local: tab index: 2 type: int[]\n" +
" [pc: 67, pc: 69] local: e index: 3 type: int\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
public void test008() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo(Iterable col) {\n" +
" for (X x : col) {\n" +
" System.out.println(x);\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. WARNING in X.java (at line 2)\n" +
" void foo(Iterable col) {\n" +
" ^^^^^^^^\n" +
"Iterable is a raw type. References to generic type Iterable<T> should be parameterized\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" for (X x : col) {\n" +
" ^^^\n" +
"Type mismatch: cannot convert from element type Object to X\n" +
"----------\n");
}
public void test009() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo(Iterable<String> col) {\n" +
" for (X x : col) {\n" +
" System.out.println(x);\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" for (X x : col) {\n" +
" ^^^\n" +
"Type mismatch: cannot convert from element type String to X\n" +
"----------\n");
}
/*
* Test implicit conversion to float. If missing, VerifyError
*/
public void test010() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n" +
" int sum = 0;\n" +
" loop: for (final float e : tab) {\n" +
" sum += e;\n" +
" if (e == 3) {\n" +
" break loop;\n" +
" }\n" +
" }\n" +
" System.out.println(sum);\n" +
" }\n" +
"}\n",
},
"6");
}
/*
* Cannot convert int[] to int
*/
public void test011() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[][] tab = new int[][] {\n" +
" new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },\n" +
" new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },\n" +
" };\n" +
" loop: for (final int e : tab) {\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 8)\n" +
" loop: for (final int e : tab) {\n" +
" ^^^\n" +
"Type mismatch: cannot convert from element type int[] to int\n" +
"----------\n");
}
/*
* Ensure access to int[]
*/
public void test012() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[][] tab = new int[][] {\n" +
" new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },\n" +
" new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },\n" +
" };\n" +
" for (final int[] e : tab) {\n" +
" System.out.print(e.length);\n" +
" }\n" +
" }\n" +
"}\n",
},
"99");
}
/*
* Ensure access to int[]
*/
public void test013() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[][] tab = new int[][] {\n" +
" new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },\n" +
" new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 },\n" +
" };\n" +
" for (final int[] e : tab) {\n" +
" System.out.print(e[0]);\n" +
" }\n" +
" }\n" +
"}\n",
},
"11");
}
/*
* Empty block action
*/
public void test014() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1 };\n" +
" for (final int e : tab) {\n" +
" }\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 2\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_1\n" +
" 1 newarray int [10]\n" +
" 3 dup\n" +
" 4 iconst_0\n" +
" 5 iconst_1\n" +
" 6 iastore\n" +
" 7 astore_1 [tab]\n" +
" 8 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 11 ldc <String \"SUCCESS\"> [22]\n" +
" 13 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
" 16 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 4]\n" +
" [pc: 8, line: 7]\n" +
" [pc: 16, line: 8]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 17] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 8, pc: 17] local: tab index: 1 type: int[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
/*
* Empty statement action
*/
public void test015() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1 };\n" +
" for (final int e : tab);\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 2\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_1\n" +
" 1 newarray int [10]\n" +
" 3 dup\n" +
" 4 iconst_0\n" +
" 5 iconst_1\n" +
" 6 iastore\n" +
" 7 astore_1 [tab]\n" +
" 8 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 11 ldc <String \"SUCCESS\"> [22]\n" +
" 13 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
" 16 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 4]\n" +
" [pc: 8, line: 6]\n" +
" [pc: 16, line: 7]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 17] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 8, pc: 17] local: tab index: 1 type: int[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
/*
* Empty block action
*/
public void test016() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1 };\n" +
" for (final int e : tab) {;\n" +
" }\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 5\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_1\n" +
" 1 newarray int [10]\n" +
" 3 dup\n" +
" 4 iconst_0\n" +
" 5 iconst_1\n" +
" 6 iastore\n" +
" 7 astore_1 [tab]\n" +
" 8 aload_1 [tab]\n" +
" 9 dup\n" +
" 10 astore 4\n" +
" 12 arraylength\n" +
" 13 istore_3\n" +
" 14 iconst_0\n" +
" 15 istore_2\n" +
" 16 goto 22\n" +
" 19 iinc 2 1\n" +
" 22 iload_2\n" +
" 23 iload_3\n" +
" 24 if_icmplt 19\n" +
" 27 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 30 ldc <String \"SUCCESS\"> [22]\n" +
" 32 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
" 35 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 4]\n" +
" [pc: 8, line: 5]\n" +
" [pc: 27, line: 7]\n" +
" [pc: 35, line: 8]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 36] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 8, pc: 36] local: tab index: 1 type: int[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
/*
* Ensure access to int[]
*/
public void test017() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1 };\n" +
" for (final int e : tab) {\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" }\n" +
"}\n",
},
"SUCCESS");
}
/*
* Break the loop
*/
public void test018() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1 };\n" +
" for (final int e : tab) {\n" +
" System.out.println(e);\n" +
" break;\n" +
" }\n" +
" }\n" +
"}\n",
},
"1");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 4\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_1\n" +
" 1 newarray int [10]\n" +
" 3 dup\n" +
" 4 iconst_0\n" +
" 5 iconst_1\n" +
" 6 iastore\n" +
" 7 astore_1 [tab]\n" +
" 8 aload_1 [tab]\n" +
" 9 dup\n" +
" 10 astore_3\n" +
" 11 arraylength\n" +
" 12 ifeq 26\n" +
" 15 aload_3\n" +
" 16 iconst_0\n" +
" 17 iaload\n" +
" 18 istore_2 [e]\n" +
" 19 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 22 iload_2 [e]\n" +
" 23 invokevirtual java.io.PrintStream.println(int) : void [22]\n" +
" 26 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 4]\n" +
" [pc: 8, line: 5]\n" +
" [pc: 19, line: 6]\n" +
" [pc: 26, line: 9]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 27] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 8, pc: 27] local: tab index: 1 type: int[]\n" +
" [pc: 19, pc: 26] local: e index: 2 type: int\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
/*
* Break the loop
*/
public void test019() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] {};\n" +
" System.out.print(\"SUC\");\n" +
" for (final int e : tab) {\n" +
" System.out.print(\"1x\");\n" +
" break;\n" +
" }\n" +
" System.out.println(\"CESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 3\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_0\n" +
" 1 newarray int [10]\n" +
" 3 astore_1 [tab]\n" +
" 4 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 7 ldc <String \"SUC\"> [22]\n" +
" 9 invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
" 12 aload_1 [tab]\n" +
" 13 dup\n" +
" 14 astore_2\n" +
" 15 arraylength\n" +
" 16 ifeq 27\n" +
" 19 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 22 ldc <String \"1x\"> [30]\n" +
" 24 invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
" 27 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 30 ldc <String \"CESS\"> [32]\n" +
" 32 invokevirtual java.io.PrintStream.println(java.lang.String) : void [34]\n" +
" 35 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 4]\n" +
" [pc: 4, line: 5]\n" +
" [pc: 12, line: 6]\n" +
" [pc: 19, line: 7]\n" +
" [pc: 27, line: 10]\n" +
" [pc: 35, line: 11]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 36] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 4, pc: 36] local: tab index: 1 type: int[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
/*
* Break the loop
*/
public void test020() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] {};\n" +
" System.out.print(\"SUC\");\n" +
" loop: for (final int e : tab) {\n" +
" System.out.print(\"1x\");\n" +
" continue loop;\n" +
" }\n" +
" System.out.println(\"CESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 5\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_0\n" +
" 1 newarray int [10]\n" +
" 3 astore_1 [tab]\n" +
" 4 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 7 ldc <String \"SUC\"> [22]\n" +
" 9 invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
" 12 aload_1 [tab]\n" +
" 13 dup\n" +
" 14 astore 4\n" +
" 16 arraylength\n" +
" 17 istore_3\n" +
" 18 iconst_0\n" +
" 19 istore_2\n" +
" 20 goto 34\n" +
" 23 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 26 ldc <String \"1x\"> [30]\n" +
" 28 invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
" 31 iinc 2 1\n" +
" 34 iload_2\n" +
" 35 iload_3\n" +
" 36 if_icmplt 23\n" +
" 39 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 42 ldc <String \"CESS\"> [32]\n" +
" 44 invokevirtual java.io.PrintStream.println(java.lang.String) : void [34]\n" +
" 47 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 4]\n" +
" [pc: 4, line: 5]\n" +
" [pc: 12, line: 6]\n" +
" [pc: 23, line: 7]\n" +
" [pc: 31, line: 6]\n" +
" [pc: 39, line: 10]\n" +
" [pc: 47, line: 11]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 48] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 4, pc: 48] local: tab index: 1 type: int[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
public void test021() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" int[] tab = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n" +
" int sum = 0;\n" +
" int i = 0;\n" +
" loop1: while(true) {\n" +
" i++;\n" +
" loop: for (final int e : tab) {\n" +
" sum += e;\n" +
" if (i == 3) {\n" +
" break loop1;\n" +
" } else if (e == 5) {\n" +
" break loop;\n" +
" } else {\n" +
" continue;\n" +
" }\n" +
" }\n" +
" }\n" +
" System.out.println(sum);\n" +
" }\n" +
"}",
},
"31");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 8\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 bipush 9\n" +
" 2 newarray int [10]\n" +
" 4 dup\n" +
" 5 iconst_0\n" +
" 6 iconst_1\n" +
" 7 iastore\n" +
" 8 dup\n" +
" 9 iconst_1\n" +
" 10 iconst_2\n" +
" 11 iastore\n" +
" 12 dup\n" +
" 13 iconst_2\n" +
" 14 iconst_3\n" +
" 15 iastore\n" +
" 16 dup\n" +
" 17 iconst_3\n" +
" 18 iconst_4\n" +
" 19 iastore\n" +
" 20 dup\n" +
" 21 iconst_4\n" +
" 22 iconst_5\n" +
" 23 iastore\n" +
" 24 dup\n" +
" 25 iconst_5\n" +
" 26 bipush 6\n" +
" 28 iastore\n" +
" 29 dup\n" +
" 30 bipush 6\n" +
" 32 bipush 7\n" +
" 34 iastore\n" +
" 35 dup\n" +
" 36 bipush 7\n" +
" 38 bipush 8\n" +
" 40 iastore\n" +
" 41 dup\n" +
" 42 bipush 8\n" +
" 44 bipush 9\n" +
" 46 iastore\n" +
" 47 astore_1 [tab]\n" +
" 48 iconst_0\n" +
" 49 istore_2 [sum]\n" +
" 50 iconst_0\n" +
" 51 istore_3 [i]\n" +
" 52 iinc 3 1 [i]\n" +
" 55 aload_1 [tab]\n" +
" 56 dup\n" +
" 57 astore 7\n" +
" 59 arraylength\n" +
" 60 istore 6\n" +
" 62 iconst_0\n" +
" 63 istore 5\n" +
" 65 goto 100\n" +
" 68 aload 7\n" +
" 70 iload 5\n" +
" 72 iaload\n" +
" 73 istore 4 [e]\n" +
" 75 iload_2 [sum]\n" +
" 76 iload 4 [e]\n" +
" 78 iadd\n" +
" 79 istore_2 [sum]\n" +
" 80 iload_3 [i]\n" +
" 81 iconst_3\n" +
" 82 if_icmpne 88\n" +
" 85 goto 110\n" +
" 88 iload 4 [e]\n" +
" 90 iconst_5\n" +
" 91 if_icmpne 97\n" +
" 94 goto 52\n" +
" 97 iinc 5 1\n" +
" 100 iload 5\n" +
" 102 iload 6\n" +
" 104 if_icmplt 68\n" +
" 107 goto 52\n" +
" 110 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 113 iload_2 [sum]\n" +
" 114 invokevirtual java.io.PrintStream.println(int) : void [22]\n" +
" 117 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 48, line: 4]\n" +
" [pc: 50, line: 5]\n" +
" [pc: 52, line: 7]\n" +
" [pc: 55, line: 8]\n" +
" [pc: 75, line: 9]\n" +
" [pc: 80, line: 10]\n" +
" [pc: 85, line: 11]\n" +
" [pc: 88, line: 12]\n" +
" [pc: 94, line: 13]\n" +
" [pc: 97, line: 8]\n" +
" [pc: 107, line: 6]\n" +
" [pc: 110, line: 19]\n" +
" [pc: 117, line: 20]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 118] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 48, pc: 118] local: tab index: 1 type: int[]\n" +
" [pc: 50, pc: 118] local: sum index: 2 type: int\n" +
" [pc: 52, pc: 118] local: i index: 3 type: int\n" +
" [pc: 75, pc: 97] local: e index: 4 type: int\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
public void test022() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" ArrayList<Integer> arrayList = new ArrayList<Integer>();\n" +
" for (int i = 0; i < 10; i++) {\n" +
" arrayList.add(new Integer(i));\n" +
" }\n" +
" int sum = 0;\n" +
" for (Integer e : arrayList) {\n" +
" sum += e.intValue();\n" +
" }\n" +
" System.out.println(sum);\n" +
" }\n" +
"}",
},
"45");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 5\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 new java.util.ArrayList [16]\n" +
" 3 dup\n" +
" 4 invokespecial java.util.ArrayList() [18]\n" +
" 7 astore_1 [arrayList]\n" +
" 8 iconst_0\n" +
" 9 istore_2 [i]\n" +
" 10 goto 29\n" +
" 13 aload_1 [arrayList]\n" +
" 14 new java.lang.Integer [19]\n" +
" 17 dup\n" +
" 18 iload_2 [i]\n" +
" 19 invokespecial java.lang.Integer(int) [21]\n" +
" 22 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [24]\n" +
" 25 pop\n" +
" 26 iinc 2 1 [i]\n" +
" 29 iload_2 [i]\n" +
" 30 bipush 10\n" +
" 32 if_icmplt 13\n" +
" 35 iconst_0\n" +
" 36 istore_2 [sum]\n" +
" 37 aload_1 [arrayList]\n" +
" 38 invokevirtual java.util.ArrayList.iterator() : java.util.Iterator [28]\n" +
" 41 astore 4\n" +
" 43 goto 64\n" +
" 46 aload 4\n" +
" 48 invokeinterface java.util.Iterator.next() : java.lang.Object [32] [nargs: 1]\n" +
" 53 checkcast java.lang.Integer [19]\n" +
" 56 astore_3 [e]\n" +
" 57 iload_2 [sum]\n" +
" 58 aload_3 [e]\n" +
" 59 invokevirtual java.lang.Integer.intValue() : int [38]\n" +
" 62 iadd\n" +
" 63 istore_2 [sum]\n" +
" 64 aload 4\n" +
" 66 invokeinterface java.util.Iterator.hasNext() : boolean [42] [nargs: 1]\n" +
" 71 ifne 46\n" +
" 74 getstatic java.lang.System.out : java.io.PrintStream [46]\n" +
" 77 iload_2 [sum]\n" +
" 78 invokevirtual java.io.PrintStream.println(int) : void [52]\n" +
" 81 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
" [pc: 8, line: 6]\n" +
" [pc: 13, line: 7]\n" +
" [pc: 26, line: 6]\n" +
" [pc: 35, line: 9]\n" +
" [pc: 37, line: 10]\n" +
" [pc: 57, line: 11]\n" +
" [pc: 64, line: 10]\n" +
" [pc: 74, line: 13]\n" +
" [pc: 81, line: 14]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 82] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 8, pc: 82] local: arrayList index: 1 type: java.util.ArrayList\n" +
" [pc: 10, pc: 35] local: i index: 2 type: int\n" +
" [pc: 37, pc: 82] local: sum index: 2 type: int\n" +
" [pc: 57, pc: 64] local: e index: 3 type: java.lang.Integer\n" +
" Local variable type table:\n" +
" [pc: 8, pc: 82] local: arrayList index: 1 type: java.util.ArrayList<java.lang.Integer>\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
/*
* Type mismatch, using non parameterized collection type (indirectly implementing parameterized type)
*/
public void test023() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.util.Iterator;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" for (Thread s : new AX()) {\n" +
" }\n" +
" }\n" +
"}\n" +
"\n" +
"class AX implements Iterable<String> {\n" +
" \n" +
" public Iterator<String> iterator() {\n" +
" return null;\n" +
" }\n" +
ITERABLE_IMPL_JRE8.replaceAll("\\*", "String") +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" for (Thread s : new AX()) {\n" +
" ^^^^^^^^\n" +
"Type mismatch: cannot convert from element type String to Thread\n" +
"----------\n");
}
public void test024() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.List;\n" +
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" String[] tab = new String[] {\"SUCCESS\"};\n" +
" List list = new ArrayList();\n" +
" for (String arg : tab) { \n" +
" list.add(arg);\n" +
" }\n" +
" for (Object arg: list) {\n" +
" System.out.print(arg);\n" +
" }\n" +
" }\n" +
"}",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 4, Locals: 7\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_1\n" +
" 1 anewarray java.lang.String [16]\n" +
" 4 dup\n" +
" 5 iconst_0\n" +
" 6 ldc <String \"SUCCESS\"> [18]\n" +
" 8 aastore\n" +
" 9 astore_1 [tab]\n" +
" 10 new java.util.ArrayList [20]\n" +
" 13 dup\n" +
" 14 invokespecial java.util.ArrayList() [22]\n" +
" 17 astore_2 [list]\n" +
" 18 aload_1 [tab]\n" +
" 19 dup\n" +
" 20 astore 6\n" +
" 22 arraylength\n" +
" 23 istore 5\n" +
" 25 iconst_0\n" +
" 26 istore 4\n" +
" 28 goto 48\n" +
" 31 aload 6\n" +
" 33 iload 4\n" +
" 35 aaload\n" +
" 36 astore_3 [arg]\n" +
" 37 aload_2 [list]\n" +
" 38 aload_3 [arg]\n" +
" 39 invokeinterface java.util.List.add(java.lang.Object) : boolean [23] [nargs: 2]\n" +
" 44 pop\n" +
" 45 iinc 4 1\n" +
" 48 iload 4\n" +
" 50 iload 5\n" +
" 52 if_icmplt 31\n" +
" 55 aload_2 [list]\n" +
" 56 invokeinterface java.util.List.iterator() : java.util.Iterator [29] [nargs: 1]\n" +
" 61 astore 4\n" +
" 63 goto 81\n" +
" 66 aload 4\n" +
" 68 invokeinterface java.util.Iterator.next() : java.lang.Object [33] [nargs: 1]\n" +
" 73 astore_3 [arg]\n" +
" 74 getstatic java.lang.System.out : java.io.PrintStream [39]\n" +
" 77 aload_3 [arg]\n" +
" 78 invokevirtual java.io.PrintStream.print(java.lang.Object) : void [45]\n" +
" 81 aload 4\n" +
" 83 invokeinterface java.util.Iterator.hasNext() : boolean [51] [nargs: 1]\n" +
" 88 ifne 66\n" +
" 91 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 6]\n" +
" [pc: 10, line: 7]\n" +
" [pc: 18, line: 8]\n" +
" [pc: 37, line: 9]\n" +
" [pc: 45, line: 8]\n" +
" [pc: 55, line: 11]\n" +
" [pc: 74, line: 12]\n" +
" [pc: 81, line: 11]\n" +
" [pc: 91, line: 14]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 92] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 10, pc: 92] local: tab index: 1 type: java.lang.String[]\n" +
" [pc: 18, pc: 92] local: list index: 2 type: java.util.List\n" +
" [pc: 37, pc: 45] local: arg index: 3 type: java.lang.String\n" +
" [pc: 74, pc: 81] local: arg index: 3 type: java.lang.Object\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
public void test025() {
this.runConformTest(
new String[] {
"X.java",
"import java.util.List;\n" +
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
" public static void bug(List<String> lines) {\n" +
" for (int i=0; i<1; i++) {\n" +
" for (String test: lines) {\n" +
" System.out.print(test);\n" +
" }\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" ArrayList<String> tab = new ArrayList<String>();\n" +
" tab.add(\"SUCCESS\");\n" +
" bug(tab);\n" +
" }\n" +
"}",
},
"SUCCESS");
}
// 68440 - verify error due to local variable invalid slot sharing
public void test026() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" Object[] array = {\n" +
" };\n" +
" void test() {\n" +
" for (Object object : array) {\n" +
" String str = object.toString();\n" +
" str += \"\";\n" + // force 'str' to be preserved during codegen
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().test();\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS");
}
// 68863 - missing local variable attribute after foreach statement
public void test027() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" Object[] array = {\n" +
" };\n" +
" java.util.ArrayList i; \n" +
" for (Object object : array) {\n" +
" if (args == null) {\n" +
" i = null;\n" +
" break;\n" +
" }\n" +
" return;\n" +
" };\n" +
" System.out.println(\"SUCCESS\"); \n" +
" }\n" +
"}\n",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 3\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 iconst_0\n" +
" 1 anewarray java.lang.Object [3]\n" +
" 4 astore_1 [array]\n" +
" 5 aload_1 [array]\n" +
" 6 dup\n" +
" 7 astore_2\n" +
" 8 arraylength\n" +
" 9 ifeq 22\n" +
" 12 aload_0 [args]\n" +
" 13 ifnonnull 21\n" +
" 16 aconst_null\n" +
" 17 pop\n" +
" 18 goto 22\n" +
" 21 return\n" +
" 22 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 25 ldc <String \"SUCCESS\"> [22]\n" +
" 27 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
" 30 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 5, line: 6]\n" +
" [pc: 12, line: 7]\n" +
" [pc: 16, line: 8]\n" +
" [pc: 18, line: 9]\n" +
" [pc: 21, line: 11]\n" +
" [pc: 22, line: 13]\n" +
" [pc: 30, line: 14]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 31] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 5, pc: 31] local: array index: 1 type: java.lang.Object[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//72760 - missing local variable attribute after foreach statement
public void test028() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
"\n" +
" public static void main(String args[]) {\n" +
" ArrayList<ArrayList<String>> slist = new ArrayList<ArrayList<String>>();\n" +
" \n" +
" slist.add(new ArrayList<String>());\n" +
" slist.get(0).add(\"SU\");\n" +
" slist.get(0).add(\"C\");\n" +
" slist.get(0).add(\"C\");\n" +
" \n" +
" slist.add(new ArrayList<String>());\n" +
" slist.get(1).add(\"E\");\n" +
" slist.get(1).add(\"S\");\n" +
" slist.get(1).add(\"S\");\n" +
" \n" +
" for (int i=0; i<slist.size(); i++){\n" +
" for (String s : slist.get(i)){\n" +
" System.out.print(s);\n" +
" }\n" +
" }\n" +
" } \n" +
"} \n" +
"",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 3, Locals: 5\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 new java.util.ArrayList [16]\n" +
" 3 dup\n" +
" 4 invokespecial java.util.ArrayList() [18]\n" +
" 7 astore_1 [slist]\n" +
" 8 aload_1 [slist]\n" +
" 9 new java.util.ArrayList [16]\n" +
" 12 dup\n" +
" 13 invokespecial java.util.ArrayList() [18]\n" +
" 16 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 19 pop\n" +
" 20 aload_1 [slist]\n" +
" 21 iconst_0\n" +
" 22 invokevirtual java.util.ArrayList.get(int) : java.lang.Object [23]\n" +
" 25 checkcast java.util.ArrayList [16]\n" +
" 28 ldc <String \"SU\"> [27]\n" +
" 30 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 33 pop\n" +
" 34 aload_1 [slist]\n" +
" 35 iconst_0\n" +
" 36 invokevirtual java.util.ArrayList.get(int) : java.lang.Object [23]\n" +
" 39 checkcast java.util.ArrayList [16]\n" +
" 42 ldc <String \"C\"> [29]\n" +
" 44 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 47 pop\n" +
" 48 aload_1 [slist]\n" +
" 49 iconst_0\n" +
" 50 invokevirtual java.util.ArrayList.get(int) : java.lang.Object [23]\n" +
" 53 checkcast java.util.ArrayList [16]\n" +
" 56 ldc <String \"C\"> [29]\n" +
" 58 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 61 pop\n" +
" 62 aload_1 [slist]\n" +
" 63 new java.util.ArrayList [16]\n" +
" 66 dup\n" +
" 67 invokespecial java.util.ArrayList() [18]\n" +
" 70 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 73 pop\n" +
" 74 aload_1 [slist]\n" +
" 75 iconst_1\n" +
" 76 invokevirtual java.util.ArrayList.get(int) : java.lang.Object [23]\n" +
" 79 checkcast java.util.ArrayList [16]\n" +
" 82 ldc <String \"E\"> [31]\n" +
" 84 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 87 pop\n" +
" 88 aload_1 [slist]\n" +
" 89 iconst_1\n" +
" 90 invokevirtual java.util.ArrayList.get(int) : java.lang.Object [23]\n" +
" 93 checkcast java.util.ArrayList [16]\n" +
" 96 ldc <String \"S\"> [33]\n" +
" 98 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 101 pop\n" +
" 102 aload_1 [slist]\n" +
" 103 iconst_1\n" +
" 104 invokevirtual java.util.ArrayList.get(int) : java.lang.Object [23]\n" +
" 107 checkcast java.util.ArrayList [16]\n" +
" 110 ldc <String \"S\"> [33]\n" +
" 112 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [19]\n" +
" 115 pop\n" +
" 116 iconst_0\n" +
" 117 istore_2 [i]\n" +
" 118 goto 168\n" +
" 121 aload_1 [slist]\n" +
" 122 iload_2 [i]\n" +
" 123 invokevirtual java.util.ArrayList.get(int) : java.lang.Object [23]\n" +
" 126 checkcast java.util.ArrayList [16]\n" +
" 129 invokevirtual java.util.ArrayList.iterator() : java.util.Iterator [35]\n" +
" 132 astore 4\n" +
" 134 goto 155\n" +
" 137 aload 4\n" +
" 139 invokeinterface java.util.Iterator.next() : java.lang.Object [39] [nargs: 1]\n" +
" 144 checkcast java.lang.String [45]\n" +
" 147 astore_3 [s]\n" +
" 148 getstatic java.lang.System.out : java.io.PrintStream [47]\n" +
" 151 aload_3 [s]\n" +
" 152 invokevirtual java.io.PrintStream.print(java.lang.String) : void [53]\n" +
" 155 aload 4\n" +
" 157 invokeinterface java.util.Iterator.hasNext() : boolean [59] [nargs: 1]\n" +
" 162 ifne 137\n" +
" 165 iinc 2 1 [i]\n" +
" 168 iload_2 [i]\n" +
" 169 aload_1 [slist]\n" +
" 170 invokevirtual java.util.ArrayList.size() : int [63]\n" +
" 173 if_icmplt 121\n" +
" 176 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 6]\n" +
" [pc: 8, line: 8]\n" +
" [pc: 20, line: 9]\n" +
" [pc: 34, line: 10]\n" +
" [pc: 48, line: 11]\n" +
" [pc: 62, line: 13]\n" +
" [pc: 74, line: 14]\n" +
" [pc: 88, line: 15]\n" +
" [pc: 102, line: 16]\n" +
" [pc: 116, line: 18]\n" +
" [pc: 121, line: 19]\n" +
" [pc: 148, line: 20]\n" +
" [pc: 155, line: 19]\n" +
" [pc: 165, line: 18]\n" +
" [pc: 176, line: 23]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 177] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 8, pc: 177] local: slist index: 1 type: java.util.ArrayList\n" +
" [pc: 118, pc: 176] local: i index: 2 type: int\n" +
" [pc: 148, pc: 155] local: s index: 3 type: java.lang.String\n" +
" Local variable type table:\n" +
" [pc: 8, pc: 177] local: slist index: 1 type: java.util.ArrayList<java.util.ArrayList<java.lang.String>>\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=86487
public void test029() {
this.runConformTest(
new String[] {
"X.java",
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
"\n" +
" public static void main(String args[]) {\n" +
" ArrayList<Integer> arr = new ArrayList<Integer>();\n" +
" arr.add(0);\n" +
" arr.add(1);\n" +
" int counter = 0;\n" +
" // tested statement:\n" +
" for (int i : arr){\n" +
" ++counter;\n" +
" }\n" +
" System.out.print(\"SUCCESS\");\n" +
" }\n" +
"}",
},
"SUCCESS");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=86487
public void test030() {
this.runConformTest(
new String[] {
"X.java",
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
"\n" +
" public static void main(String args[]) {\n" +
" int[] arr = new int[2];\n" +
" arr[0]= 0;\n" +
" arr[1]= 1;\n" +
" int counter = 0;\n" +
" // tested statement:\n" +
" for (int i : arr){\n" +
" ++counter;\n" +
" }\n" +
" System.out.print(\"SUCCESS\");\n" +
" }\n" +
"}",
},
"SUCCESS");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=86487
public void test031() {
this.runConformTest(
new String[] {
"X.java",
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
"\n" +
" public static void main(String args[]) {\n" +
" ArrayList arr = new ArrayList();\n" +
" arr.add(new Object());\n" +
" int counter = 0;\n" +
" // tested statement:\n" +
" for (Object o : arr){\n" +
" ++counter;\n" +
" }\n" +
" System.out.print(\"SUCCESS\");\n" +
" }\n" +
"}",
},
"SUCCESS");
}
public void test032() {
this.runConformTest(
new String[] {
"X.java",
"public class X<T> {\n" +
" abstract class Member implements Iterable<String> {\n" +
" }\n" +
" void foo(Member m) {\n" +
" for(String s : m) {\n" +
" return;\n" +
" } \n" +
" }\n" +
"}\n",
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108783
public void test033() {
this.runConformTest(
new String[] {
"X.java",
"public class X<T> {\n" +
" abstract class Member implements Iterable<String> {\n" +
" }\n" +
" void foo(Member m) {\n" +
" for(String s : m) {\n" +
" return;\n" +
" } \n" +
" }\n" +
"}\n",
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108783 - variation
public void test034() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.*;\n" +
"\n" +
"public class X <T extends Bar> {\n" +
" public static void main(String[] args) {\n" +
" new X<Bar>().foo(new Bar());\n" +
" }\n" +
" void foo(T t) {\n" +
" for (String s : t) {\n" +
" System.out.print(s);\n" +
" }\n" +
" System.out.println();\n" +
" }\n" +
"}\n" +
"class ArrayIterator<T> implements Iterator<T> {\n" +
" T[] values;\n" +
" int count;\n" +
" ArrayIterator(T[] values) {\n" +
" this.values = values;\n" +
" this.count = 0;\n" +
" }\n" +
" public boolean hasNext() {\n" +
" return this.count < this.values.length;\n" +
" }\n" +
" public T next() {\n" +
" if (this.count >= this.values.length) throw new NoSuchElementException();\n" +
" T value = this.values[this.count];\n" +
" this.values[this.count++] = null; // clear\n" +
" return value;\n" +
" }\n" +
" public void remove() {\n" +
" }\n" +
ITERATOR_IMPL_JRE8.replaceAll("\\*", "T") +
"}\n" +
"class Bar implements Iterable<String> {\n" +
" public Iterator<String> iterator() {\n" +
" return new ArrayIterator<String>(new String[]{\"a\",\"b\"});\n" +
" }\n" +
ITERABLE_IMPL_JRE8.replaceAll("\\*", "String") +
"}\n",
},
"ab");
// ensure proper declaring class (Bar): 1 invokevirtual Bar.iterator() : java.util.Iterator [33]
String expectedOutput =
" // Method descriptor #25 (LBar;)V\n" +
" // Signature: (TT;)V\n" +
" // Stack: 2, Locals: 4\n" +
" void foo(Bar t);\n" +
" 0 aload_1 [t]\n" +
" 1 invokevirtual Bar.iterator() : java.util.Iterator [30]\n" +
" 4 astore_3\n" +
" 5 goto 25\n" +
" 8 aload_3\n" +
" 9 invokeinterface java.util.Iterator.next() : java.lang.Object [34] [nargs: 1]\n" +
" 14 checkcast java.lang.String [40]\n" +
" 17 astore_2 [s]\n" +
" 18 getstatic java.lang.System.out : java.io.PrintStream [42]\n" +
" 21 aload_2 [s]\n" +
" 22 invokevirtual java.io.PrintStream.print(java.lang.String) : void [48]\n" +
" 25 aload_3\n" +
" 26 invokeinterface java.util.Iterator.hasNext() : boolean [54] [nargs: 1]\n" +
" 31 ifne 8\n" +
" 34 getstatic java.lang.System.out : java.io.PrintStream [42]\n" +
" 37 invokevirtual java.io.PrintStream.println() : void [58]\n" +
" 40 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 8]\n" +
" [pc: 18, line: 9]\n" +
" [pc: 25, line: 8]\n" +
" [pc: 34, line: 11]\n" +
" [pc: 40, line: 12]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 41] local: this index: 0 type: X\n" +
" [pc: 0, pc: 41] local: t index: 1 type: Bar\n" +
" [pc: 18, pc: 25] local: s index: 2 type: java.lang.String\n" +
" Local variable type table:\n" +
" [pc: 0, pc: 41] local: this index: 0 type: X<T>\n" +
" [pc: 0, pc: 41] local: t index: 1 type: T\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108783 - variation
public void test035() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.*;\n" +
"\n" +
"public class X <T extends IFoo> {\n" +
" public static void main(String[] args) {\n" +
" new X<IFoo>().foo(new Bar());\n" +
" }\n" +
" void foo(T t) {\n" +
" for (String s : t) {\n" +
" System.out.print(s);\n" +
" }\n" +
" System.out.println();\n" +
" }\n" +
"}\n" +
"class ArrayIterator<T> implements Iterator<T> {\n" +
" T[] values;\n" +
" int count;\n" +
" ArrayIterator(T[] values) {\n" +
" this.values = values;\n" +
" this.count = 0;\n" +
" }\n" +
" public boolean hasNext() {\n" +
" return this.count < this.values.length;\n" +
" }\n" +
" public T next() {\n" +
" if (this.count >= this.values.length) throw new NoSuchElementException();\n" +
" T value = this.values[this.count];\n" +
" this.values[this.count++] = null; // clear\n" +
" return value;\n" +
" }\n" +
" public void remove() {\n" +
" }\n" +
ITERATOR_IMPL_JRE8.replaceAll("\\*", "T") +
"}\n" +
"interface IFoo extends Iterable<String> {\n" +
"}\n" +
"class Bar implements IFoo {\n" +
" public Iterator<String> iterator() {\n" +
" return new ArrayIterator<String>(new String[]{\"a\",\"b\"});\n" +
" }\n" +
ITERABLE_IMPL_JRE8.replaceAll("\\*", "String") +
"}\n",
},
"ab");
// ensure proper declaring class (IFoo): 1 invokeinterface IFoo.iterator() : java.util.Iterator [35] [nargs: 1]
String expectedOutput =
" // Method descriptor #25 (LIFoo;)V\n" +
" // Signature: (TT;)V\n" +
" // Stack: 2, Locals: 4\n" +
" void foo(IFoo t);\n" +
" 0 aload_1 [t]\n" +
" 1 invokeinterface IFoo.iterator() : java.util.Iterator [30] [nargs: 1]\n" +
" 6 astore_3\n" +
" 7 goto 27\n" +
" 10 aload_3\n" +
" 11 invokeinterface java.util.Iterator.next() : java.lang.Object [36] [nargs: 1]\n" +
" 16 checkcast java.lang.String [42]\n" +
" 19 astore_2 [s]\n" +
" 20 getstatic java.lang.System.out : java.io.PrintStream [44]\n" +
" 23 aload_2 [s]\n" +
" 24 invokevirtual java.io.PrintStream.print(java.lang.String) : void [50]\n" +
" 27 aload_3\n" +
" 28 invokeinterface java.util.Iterator.hasNext() : boolean [56] [nargs: 1]\n" +
" 33 ifne 10\n" +
" 36 getstatic java.lang.System.out : java.io.PrintStream [44]\n" +
" 39 invokevirtual java.io.PrintStream.println() : void [60]\n" +
" 42 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 8]\n" +
" [pc: 20, line: 9]\n" +
" [pc: 27, line: 8]\n" +
" [pc: 36, line: 11]\n" +
" [pc: 42, line: 12]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 43] local: this index: 0 type: X\n" +
" [pc: 0, pc: 43] local: t index: 1 type: IFoo\n" +
" [pc: 20, pc: 27] local: s index: 2 type: java.lang.String\n" +
" Local variable type table:\n" +
" [pc: 0, pc: 43] local: this index: 0 type: X<T>\n" +
" [pc: 0, pc: 43] local: t index: 1 type: T\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=108783
public void test036() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.Arrays;\n" +
"import java.util.Iterator;\n" +
"import java.util.List;\n" +
"\n" +
"public class X implements Iterable<String>, Runnable {\n" +
" public <T extends Runnable & Iterable<String>> void foo(T t) {\n" +
" for (String s : t)\n" +
" System.out.print(s);\n" +
" }\n" +
" public void run() { /* */ }\n" +
" private List<String> list = Arrays.asList(new String[] { \"a\", \"b\" });\n" +
" public Iterator<String> iterator() {\n" +
" return this.list.iterator();\n" +
" }\n" +
" public static void main(String... args) {\n" +
" X x = new X();\n" +
" x.foo(x);\n" +
" }\n" +
ITERABLE_IMPL_JRE8.replaceAll("\\*", "String") +
"}",
},
"ab");
String expectedOutput =
" // Method descriptor #37 (Ljava/lang/Runnable;)V\n" +
" // Signature: <T::Ljava/lang/Runnable;:Ljava/lang/Iterable<Ljava/lang/String;>;>(TT;)V\n" +
" // Stack: 2, Locals: 4\n" +
" public void foo(java.lang.Runnable t);\n" +
" 0 aload_1 [t]\n" +
" 1 checkcast java.lang.Iterable [5]\n" +
" 4 invokeinterface java.lang.Iterable.iterator() : java.util.Iterator [39] [nargs: 1]\n" +
" 9 astore_3\n" +
" 10 goto 30\n" +
" 13 aload_3\n" +
" 14 invokeinterface java.util.Iterator.next() : java.lang.Object [43] [nargs: 1]\n" +
" 19 checkcast java.lang.String [18]\n" +
" 22 astore_2 [s]\n" +
" 23 getstatic java.lang.System.out : java.io.PrintStream [49]\n" +
" 26 aload_2 [s]\n" +
" 27 invokevirtual java.io.PrintStream.print(java.lang.String) : void [55]\n" +
" 30 aload_3\n" +
" 31 invokeinterface java.util.Iterator.hasNext() : boolean [61] [nargs: 1]\n" +
" 36 ifne 13\n" +
" 39 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 7]\n" +
" [pc: 23, line: 8]\n" +
" [pc: 30, line: 7]\n" +
" [pc: 39, line: 9]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 40] local: this index: 0 type: X\n" +
" [pc: 0, pc: 40] local: t index: 1 type: java.lang.Runnable\n" +
" [pc: 23, pc: 30] local: s index: 2 type: java.lang.String\n" +
" Local variable type table:\n" +
" [pc: 0, pc: 40] local: t index: 1 type: T\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108783
public void test037() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.Arrays;\n" +
"import java.util.Iterator;\n" +
"import java.util.List;\n" +
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
" public static <T extends ArrayList<String>> void foo(T t) {\n" +
" for (String s : t)\n" +
" System.out.print(s);\n" +
" }\n" +
" private static ArrayList<String> list = new ArrayList<String>();\n" +
" static {\n" +
" list.addAll(Arrays.asList(new String[] { \"a\", \"b\" }));\n" +
" }\n" +
" public static void main(String... args) {\n" +
" foo(list);\n" +
" }\n" +
"}",
},
"ab");
String expectedOutput =
" // Method descriptor #41 (Ljava/util/ArrayList;)V\n" +
" // Signature: <T:Ljava/util/ArrayList<Ljava/lang/String;>;>(TT;)V\n" +
" // Stack: 2, Locals: 3\n" +
" public static void foo(java.util.ArrayList t);\n" +
" 0 aload_0 [t]\n" +
" 1 invokevirtual java.util.ArrayList.iterator() : java.util.Iterator [43]\n" +
" 4 astore_2\n" +
" 5 goto 25\n" +
" 8 aload_2\n" +
" 9 invokeinterface java.util.Iterator.next() : java.lang.Object [47] [nargs: 1]\n" +
" 14 checkcast java.lang.String [19]\n" +
" 17 astore_1 [s]\n" +
" 18 getstatic java.lang.System.out : java.io.PrintStream [53]\n" +
" 21 aload_1 [s]\n" +
" 22 invokevirtual java.io.PrintStream.print(java.lang.String) : void [59]\n" +
" 25 aload_2\n" +
" 26 invokeinterface java.util.Iterator.hasNext() : boolean [65] [nargs: 1]\n" +
" 31 ifne 8\n" +
" 34 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 8]\n" +
" [pc: 18, line: 9]\n" +
" [pc: 25, line: 8]\n" +
" [pc: 34, line: 10]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 35] local: t index: 0 type: java.util.ArrayList\n" +
" [pc: 18, pc: 25] local: s index: 1 type: java.lang.String\n" +
" Local variable type table:\n" +
" [pc: 0, pc: 35] local: t index: 0 type: T\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=119175
public void test038() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.HashSet;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" X x = new X();\n" +
" x.foo();\n" +
" System.out.println(\"SUCCESS\"); \n" +
" }\n" +
" public void foo() {\n" +
" for(Object o : new HashSet<Object>()) {\n" +
" System.out.println(o);\n" +
" continue;\n" +
" }\n" +
" }\n" +
"}",
},
"SUCCESS");
String expectedOutput =
" // Method descriptor #6 ()V\n" +
" // Stack: 2, Locals: 3\n" +
" public void foo();\n" +
" 0 new java.util.HashSet [37]\n" +
" 3 dup\n" +
" 4 invokespecial java.util.HashSet() [39]\n" +
" 7 invokevirtual java.util.HashSet.iterator() : java.util.Iterator [40]\n" +
" 10 astore_2\n" +
" 11 goto 28\n" +
" 14 aload_2\n" +
" 15 invokeinterface java.util.Iterator.next() : java.lang.Object [44] [nargs: 1]\n" +
" 20 astore_1 [o]\n" +
" 21 getstatic java.lang.System.out : java.io.PrintStream [20]\n" +
" 24 aload_1 [o]\n" +
" 25 invokevirtual java.io.PrintStream.println(java.lang.Object) : void [50]\n" +
" 28 aload_2\n" +
" 29 invokeinterface java.util.Iterator.hasNext() : boolean [53] [nargs: 1]\n" +
" 34 ifne 14\n" +
" 37 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 9]\n" +
" [pc: 21, line: 10]\n" +
" [pc: 28, line: 9]\n" +
" [pc: 37, line: 13]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 38] local: this index: 0 type: X\n" +
" [pc: 21, pc: 28] local: o index: 1 type: java.lang.Object\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test039() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"import java.util.HashSet;\n" +
"import java.util.Set;\n" +
"import java.util.Iterator;\n" +
"\n" +
"public class X {\n" +
"\n" +
" public static void main(String[] args) {\n" +
" for (Object o : initForEach()) {\n" +
" }\n" +
" }\n" +
"\n" +
" static class MyIterator<T> implements Iterator<T> {\n" +
" Iterator<T> iterator;\n" +
" \n" +
" MyIterator(Iterator<T> it) {\n" +
" this.iterator = it;\n" +
" }\n" +
" public boolean hasNext() {\n" +
" System.out.println(\"hasNext\");\n" +
" return this.iterator.hasNext();\n" +
" } \n" +
" public T next() {\n" +
" System.out.println(\"next\");\n" +
" return this.iterator.next();\n" +
" }\n" +
" public void remove() {\n" +
" System.out.println(\"remove\");\n" +
" this.iterator.remove();\n" +
" }\n" +
ITERATOR_IMPL_JRE8.replaceAll("\\*", "T") +
" }\n" +
" \n" +
" static Set<Object> initForEach() {\n" +
" System.out.println(\"initForEach\");\n" +
" HashSet<Object> set = new HashSet<Object>() {\n" +
" private static final long serialVersionUID = 1L;\n" +
" public Iterator<Object> iterator() {\n" +
" System.out.println(\"iterator\");\n" +
" return new MyIterator<Object>(super.iterator());\n" +
" }\n" +
" };\n" +
" for (int i = 0; i < 3; i++) set.add(i);\n" +
" return set;\n" +
" }\n" +
"}",
},
"initForEach\n" +
"iterator\n" +
"hasNext\n" +
"next\n" +
"hasNext\n" +
"next\n" +
"hasNext\n" +
"next\n" +
"hasNext");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 1, Locals: 2\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 invokestatic X.initForEach() : java.util.Set [16]\n" +
" 3 invokeinterface java.util.Set.iterator() : java.util.Iterator [20] [nargs: 1]\n" +
" 8 astore_1\n" +
" 9 goto 19\n" +
" 12 aload_1\n" +
" 13 invokeinterface java.util.Iterator.next() : java.lang.Object [26] [nargs: 1]\n" +
" 18 pop\n" +
" 19 aload_1\n" +
" 20 invokeinterface java.util.Iterator.hasNext() : boolean [32] [nargs: 1]\n" +
" 25 ifne 12\n" +
" 28 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 8]\n" +
" [pc: 28, line: 10]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 29] local: args index: 0 type: java.lang.String[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test040() throws Exception {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
this.runConformTest(
new String[] {
"X.java",
"import java.util.HashSet;\n" +
"import java.util.Set;\n" +
"import java.util.Iterator;\n" +
"\n" +
"public class X {\n" +
"\n" +
" public static void main(String[] args) {\n" +
" for (Object o : initForEach()) {\n" +
" }\n" +
" }\n" +
"\n" +
" static class MyIterator<T> implements Iterator<T> {\n" +
" Iterator<T> iterator;\n" +
" \n" +
" MyIterator(Iterator<T> it) {\n" +
" this.iterator = it;\n" +
" }\n" +
" public boolean hasNext() {\n" +
" System.out.println(\"hasNext\");\n" +
" return this.iterator.hasNext();\n" +
" } \n" +
" public T next() {\n" +
" System.out.println(\"next\");\n" +
" return this.iterator.next();\n" +
" }\n" +
" public void remove() {\n" +
" System.out.println(\"remove\");\n" +
" this.iterator.remove();\n" +
" }\n" +
ITERATOR_IMPL_JRE8.replaceAll("\\*", "T") +
" }\n" +
" \n" +
" static Set<Object> initForEach() {\n" +
" System.out.println(\"initForEach\");\n" +
" HashSet<Object> set = new HashSet<Object>() {\n" +
" private static final long serialVersionUID = 1L;\n" +
" public Iterator<Object> iterator() {\n" +
" System.out.println(\"iterator\");\n" +
" return new MyIterator<Object>(super.iterator());\n" +
" }\n" +
" };\n" +
" for (int i = 0; i < 3; i++) set.add(i);\n" +
" return set;\n" +
" }\n" +
"}",
},
"initForEach\n" +
"iterator\n" +
"hasNext\n" +
"next\n" +
"hasNext\n" +
"next\n" +
"hasNext\n" +
"next\n" +
"hasNext",
null,
true,
null,
options,
null);
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 1, Locals: 3\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 invokestatic X.initForEach() : java.util.Set [16]\n" +
" 3 invokeinterface java.util.Set.iterator() : java.util.Iterator [20] [nargs: 1]\n" +
" 8 astore_2\n" +
" 9 goto 19\n" +
" 12 aload_2\n" +
" 13 invokeinterface java.util.Iterator.next() : java.lang.Object [26] [nargs: 1]\n" +
" 18 astore_1\n" +
" 19 aload_2\n" +
" 20 invokeinterface java.util.Iterator.hasNext() : boolean [32] [nargs: 1]\n" +
" 25 ifne 12\n" +
" 28 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 8]\n" +
" [pc: 28, line: 10]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 29] local: args index: 0 type: java.lang.String[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test041() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" for (int i : initForEach()) {\n" +
" }\n" +
" }\n" +
" static int[] initForEach() {\n" +
" System.out.println(\"initForEach\");\n" +
" return new int[] {1, 2, 3, 4};\n" +
" }\n" +
"}",
},
"initForEach");
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 1, Locals: 1\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 invokestatic X.initForEach() : int[] [16]\n" +
" 3 pop\n" +
" 4 return\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test042() throws Exception {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" for (int i : initForEach()) {\n" +
" }\n" +
" }\n" +
" static int[] initForEach() {\n" +
" System.out.println(\"initForEach\");\n" +
" return new int[] {1, 2, 3, 4};\n" +
" }\n" +
"}",
},
"initForEach",
null,
true,
null,
options,
null);
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 5\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 invokestatic X.initForEach() : int[] [16]\n" +
" 3 dup\n" +
" 4 astore 4\n" +
" 6 arraylength\n" +
" 7 istore_3\n" +
" 8 iconst_0\n" +
" 9 istore_2\n" +
" 10 goto 21\n" +
" 13 aload 4\n" +
" 15 iload_2\n" +
" 16 iaload\n" +
" 17 istore_1\n" +
" 18 iinc 2 1\n" +
" 21 iload_2\n" +
" 22 iload_3\n" +
" 23 if_icmplt 13\n" +
" 26 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 26, line: 5]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 27] local: args index: 0 type: java.lang.String[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test043() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" foo();\n" +
" }\n" +
" public static void foo() {\n" +
" for (int i : initForEach()) {\n" +
" }\n" +
" }\n" +
" static int[] initForEach() {\n" +
" System.out.println(\"initForEach\");\n" +
" return new int[] {1, 2, 3, 4};\n" +
" }\n" +
"}",
},
"initForEach");
String expectedOutput =
" // Method descriptor #6 ()V\n" +
" // Stack: 1, Locals: 0\n" +
" public static void foo();\n" +
" 0 invokestatic X.initForEach() : int[] [21]\n" +
" 3 pop\n" +
" 4 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 6]\n" +
" [pc: 4, line: 8]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test044() throws Exception {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" foo();\n" +
" }\n" +
" public static void foo() {\n" +
" for (int i : initForEach()) {\n" +
" }\n" +
" }\n" +
" static int[] initForEach() {\n" +
" System.out.println(\"initForEach\");\n" +
" return new int[] {1, 2, 3, 4};\n" +
" }\n" +
"}",
},
"initForEach",
null,
true,
null,
options,
null);
String expectedOutput =
" // Method descriptor #6 ()V\n" +
" // Stack: 2, Locals: 4\n" +
" public static void foo();\n" +
" 0 invokestatic X.initForEach() : int[] [21]\n" +
" 3 dup\n" +
" 4 astore_3\n" +
" 5 arraylength\n" +
" 6 istore_2\n" +
" 7 iconst_0\n" +
" 8 istore_1\n" +
" 9 goto 19\n" +
" 12 aload_3\n" +
" 13 iload_1\n" +
" 14 iaload\n" +
" 15 istore_0\n" +
" 16 iinc 1 1\n" +
" 19 iload_1\n" +
" 20 iload_2\n" +
" 21 if_icmplt 12\n" +
" 24 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 6]\n" +
" [pc: 24, line: 8]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test045() throws Exception {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" for (int i : initForEach()) {\n" +
" System.out.print(\'a\');\n" +
" }\n" +
" }\n" +
" static int[] initForEach() {\n" +
" return new int[] {1, 2, 3, 4};\n" +
" }\n" +
"}",
},
"aaaa",
null,
true,
null,
options,
null);
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 5\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 invokestatic X.initForEach() : int[] [16]\n" +
" 3 dup\n" +
" 4 astore 4\n" +
" 6 arraylength\n" +
" 7 istore_3\n" +
" 8 iconst_0\n" +
" 9 istore_2\n" +
" 10 goto 29\n" +
" 13 aload 4\n" +
" 15 iload_2\n" +
" 16 iaload\n" +
" 17 istore_1 [i]\n" +
" 18 getstatic java.lang.System.out : java.io.PrintStream [20]\n" +
" 21 bipush 97\n" +
" 23 invokevirtual java.io.PrintStream.print(char) : void [26]\n" +
" 26 iinc 2 1\n" +
" 29 iload_2\n" +
" 30 iload_3\n" +
" 31 if_icmplt 13\n" +
" 34 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 18, line: 4]\n" +
" [pc: 26, line: 3]\n" +
" [pc: 34, line: 6]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 35] local: args index: 0 type: java.lang.String[]\n" +
" [pc: 18, pc: 26] local: i index: 1 type: int\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150074
public void test046() throws Exception {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" for (int i : initForEach()) {\n" +
" System.out.print(\'a\');\n" +
" }\n" +
" }\n" +
" static int[] initForEach() {\n" +
" return new int[] {1, 2, 3, 4};\n" +
" }\n" +
"}",
},
"aaaa",
null,
true,
null,
options,
null);
String expectedOutput =
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 4\n" +
" public static void main(java.lang.String[] args);\n" +
" 0 invokestatic X.initForEach() : int[] [16]\n" +
" 3 dup\n" +
" 4 astore_3\n" +
" 5 arraylength\n" +
" 6 istore_2\n" +
" 7 iconst_0\n" +
" 8 istore_1\n" +
" 9 goto 23\n" +
" 12 getstatic java.lang.System.out : java.io.PrintStream [20]\n" +
" 15 bipush 97\n" +
" 17 invokevirtual java.io.PrintStream.print(char) : void [26]\n" +
" 20 iinc 1 1\n" +
" 23 iload_1\n" +
" 24 iload_2\n" +
" 25 if_icmplt 12\n" +
" 28 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 12, line: 4]\n" +
" [pc: 20, line: 3]\n" +
" [pc: 28, line: 6]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 29] local: args index: 0 type: java.lang.String[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=180471
public void test047() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo3(int[] array) {\n" +
" for (int i : array) {\n" +
" System.out.println(i);\n" +
" break;\n" +
" }\n" +
" }\n" +
"}\n", // =================
},
"");
String expectedOutput =
" // Method descriptor #15 ([I)V\n" +
" // Stack: 2, Locals: 4\n" +
" void foo3(int[] array);\n" +
" 0 aload_1 [array]\n" +
" 1 dup\n" +
" 2 astore_3\n" +
" 3 arraylength\n" +
" 4 ifeq 18\n" +
" 7 aload_3\n" +
" 8 iconst_0\n" +
" 9 iaload\n" +
" 10 istore_2 [i]\n" +
" 11 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 14 iload_2 [i]\n" +
" 15 invokevirtual java.io.PrintStream.println(int) : void [22]\n" +
" 18 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 11, line: 4]\n" +
" [pc: 18, line: 7]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 19] local: this index: 0 type: X\n" +
" [pc: 0, pc: 19] local: array index: 1 type: int[]\n" +
" [pc: 11, pc: 18] local: i index: 2 type: int\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=180471 - variation
public void test048() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo3(java.util.List<String> ls) {\n" +
" for (String s : ls) {\n" +
" System.out.println(s);\n" +
" break;\n" +
" }\n" +
" }\n" +
"}\n", // =================
},
"");
String expectedOutput =
" // Method descriptor #15 (Ljava/util/List;)V\n" +
" // Signature: (Ljava/util/List<Ljava/lang/String;>;)V\n" +
" // Stack: 2, Locals: 4\n" +
" void foo3(java.util.List ls);\n" +
" 0 aload_1 [ls]\n" +
" 1 invokeinterface java.util.List.iterator() : java.util.Iterator [18] [nargs: 1]\n" +
" 6 astore_3\n" +
" 7 aload_3\n" +
" 8 invokeinterface java.util.Iterator.hasNext() : boolean [24] [nargs: 1]\n" +
" 13 ifeq 33\n" +
" 16 aload_3\n" +
" 17 invokeinterface java.util.Iterator.next() : java.lang.Object [30] [nargs: 1]\n" +
" 22 checkcast java.lang.String [34]\n" +
" 25 astore_2 [s]\n" +
" 26 getstatic java.lang.System.out : java.io.PrintStream [36]\n" +
" 29 aload_2 [s]\n" +
" 30 invokevirtual java.io.PrintStream.println(java.lang.String) : void [42]\n" +
" 33 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 26, line: 4]\n" +
" [pc: 33, line: 7]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 34] local: this index: 0 type: X\n" +
" [pc: 0, pc: 34] local: ls index: 1 type: java.util.List\n" +
" [pc: 26, pc: 33] local: s index: 2 type: java.lang.String\n" +
" Local variable type table:\n" +
" [pc: 0, pc: 34] local: ls index: 1 type: java.util.List<java.lang.String>\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=180471 - variation
public void test049() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo3(java.util.List l) {\n" +
" for (Object o : l) {\n" +
" System.out.println(o);\n" +
" break;\n" +
" }\n" +
" }\n" +
"}\n", // =================
},
"");
String expectedOutput =
" // Method descriptor #15 (Ljava/util/List;)V\n" +
" // Stack: 2, Locals: 4\n" +
" void foo3(java.util.List l);\n" +
" 0 aload_1 [l]\n" +
" 1 invokeinterface java.util.List.iterator() : java.util.Iterator [16] [nargs: 1]\n" +
" 6 astore_3\n" +
" 7 aload_3\n" +
" 8 invokeinterface java.util.Iterator.hasNext() : boolean [22] [nargs: 1]\n" +
" 13 ifeq 30\n" +
" 16 aload_3\n" +
" 17 invokeinterface java.util.Iterator.next() : java.lang.Object [28] [nargs: 1]\n" +
" 22 astore_2 [o]\n" +
" 23 getstatic java.lang.System.out : java.io.PrintStream [32]\n" +
" 26 aload_2 [o]\n" +
" 27 invokevirtual java.io.PrintStream.println(java.lang.Object) : void [38]\n" +
" 30 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" [pc: 23, line: 4]\n" +
" [pc: 30, line: 7]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 31] local: this index: 0 type: X\n" +
" [pc: 0, pc: 31] local: l index: 1 type: java.util.List\n" +
" [pc: 23, pc: 30] local: o index: 2 type: java.lang.Object\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=291472
public void test050() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X<T> {\n" +
" private T values;\n" +
" public X(T values) {\n" +
" this.values = values;\n" +
" }\n" +
" public T getValues() {\n" +
" return values;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" X<short[]> x = new X<short[]>(new short[] { 1, 2, 3, 4, 5 });\n" +
" for (int i : x.getValues()) {\n" +
" System.out.print(i);\n" +
" }\n" +
" }\n" +
"}",
},
"12345");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=291472
public void test051() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X<T> {\n" +
" private T values;\n" +
" public X(T values) {\n" +
" this.values = values;\n" +
" }\n" +
" public T getValues() {\n" +
" return values;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" X<short[]> x = new X<short[]>(new short[] { 1, 2, 3, 4, 5 });\n" +
" for (long l : x.getValues()) {\n" +
" System.out.print(l);\n" +
" }\n" +
" }\n" +
"}",
},
"12345");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=291472
public void test052() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X<T> {\n" +
" private T values;\n" +
" public X(T values) {\n" +
" this.values = values;\n" +
" }\n" +
" public T getValues() {\n" +
" return values;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" X<Short[]> x = new X<Short[]>(new Short[] { 1, 2, 3, 4, 5 });\n" +
" for (int i : x.getValues()) {\n" +
" System.out.print(i);\n" +
" }\n" +
" }\n" +
"}",
},
"12345");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=291472
public void test053() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X<T> {\n" +
" private T values;\n" +
" public X(T values) {\n" +
" this.values = values;\n" +
" }\n" +
" public T getValues() {\n" +
" return values;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" X<Short[]> x = new X<Short[]>(new Short[] { 1, 2, 3, 4, 5 });\n" +
" for (long i : x.getValues()) {\n" +
" System.out.print(i);\n" +
" }\n" +
" }\n" +
"}",
},
"12345");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=321085
public void test054() throws Exception {
this.runNegativeTest(
new String[] {
"X.java",
"import java.util.HashSet;\n" +
"import java.util.Set;\n" +
"public class X {\n" +
" void foo() {\n" +
" HashSet<String> x = new HashSet<String>();\n" +
" x.add(\"a\");\n" +
" HashSet<Integer> y = new HashSet<Integer>();\n" +
" y.add(1);\n" +
" Set<String> [] OK= new Set[] { x, y };\n" +
" for (Set<String> BUG : new Set[] { x, y }) {\n" +
" for (String str : BUG)\n" +
" System.out.println(str);\n" +
" }\n" +
" Set [] set = new Set[] { x, y };\n" +
" for (Set<String> BUG : set) {\n" +
" for (String str : BUG)\n" +
" System.out.println(str);\n" +
" }\n" +
" }\n" +
" Zork z;\n" +
"}\n",
},
"----------\n" +
"1. WARNING in X.java (at line 9)\n" +
" Set<String> [] OK= new Set[] { x, y };\n" +
" ^^^^^^^^^^^^^^^^^^\n" +
"Type safety: The expression of type Set[] needs unchecked conversion to conform to Set<String>[]\n" +
"----------\n" +
"2. WARNING in X.java (at line 10)\n" +
" for (Set<String> BUG : new Set[] { x, y }) {\n" +
" ^^^^^^^^^^^^^^^^^^\n" +
"Type safety: Elements of type Set need unchecked conversion to conform to Set<String>\n" +
"----------\n" +
"3. WARNING in X.java (at line 14)\n" +
" Set [] set = new Set[] { x, y };\n" +
" ^^^\n" +
"Set is a raw type. References to generic type Set<E> should be parameterized\n" +
"----------\n" +
"4. WARNING in X.java (at line 15)\n" +
" for (Set<String> BUG : set) {\n" +
" ^^^\n" +
"Type safety: Elements of type Set need unchecked conversion to conform to Set<String>\n" +
"----------\n" +
"5. ERROR in X.java (at line 20)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
// https://bugs.eclipse.org/393719
// like test054 but suppressing the warnings.
public void test055() throws Exception {
this.runNegativeTest(
new String[] {
"X.java",
"import java.util.HashSet;\n" +
"import java.util.Set;\n" +
"public class X {\n" +
" void foo() {\n" +
" HashSet<String> x = new HashSet<String>();\n" +
" x.add(\"a\");\n" +
" HashSet<Integer> y = new HashSet<Integer>();\n" +
" y.add(1);\n" +
" @SuppressWarnings(\"unchecked\") Set<String> [] OK= new Set[] { x, y };\n" +
" for (@SuppressWarnings(\"unchecked\") Set<String> BUG : new Set[] { x, y }) {\n" +
" for (String str : BUG)\n" +
" System.out.println(str);\n" +
" }\n" +
" @SuppressWarnings({\"rawtypes\", \"unchecked\"}) Set [] set = new Set[] { x, y };\n" +
" for (@SuppressWarnings(\"unchecked\") Set<String> BUG : set) {\n" +
" for (String str : BUG)\n" +
" System.out.println(str);\n" +
" }\n" +
" }\n" +
" Zork z;\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 20)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
// https://bugs.eclipse.org/393719
// "unchecked" warning against the collection (raw Iterable)
public void test056() throws Exception {
this.runNegativeTest(
new String[] {
"X.java",
"import java.util.List;\n" +
"public class X {\n" +
" void testRawType(@SuppressWarnings(\"rawtypes\") List<List> lists) {\n" +
" List<String> stringList = lists.get(0); // (1)\n" +
" for (List<String> strings : lists) // (2)\n" +
" stringList = strings;\n" +
" for (@SuppressWarnings(\"unchecked\") List<String> strings : lists) // no warning\n" +
" stringList = strings;\n" +
" System.out.println(stringList.get(0));\n" +
" }\n" +
" Zork z;\n" +
"}\n",
},
"----------\n" +
"1. WARNING in X.java (at line 4)\n" +
" List<String> stringList = lists.get(0); // (1)\n" +
" ^^^^^^^^^^^^\n" +
"Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" +
"----------\n" +
"2. WARNING in X.java (at line 5)\n" +
" for (List<String> strings : lists) // (2)\n" +
" ^^^^^\n" +
"Type safety: Elements of type List need unchecked conversion to conform to List<String>\n" +
"----------\n" +
"3. ERROR in X.java (at line 11)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=401853
// Eclipse Java compiler creates invalid bytecode (java.lang.VerifyError)
public void test057() throws Exception {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
this.runConformTest(
new String[] {
"X.java",
"import java.util.ArrayList;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] argv) {\n" +
" for (long l : new ArrayList<Long>()) {}\n" +
" }\n" +
"}",
},
"",
null,
true,
null,
options,
null);
String expectedOutput =
"public class X {\n" +
" \n" +
" // Method descriptor #6 ()V\n" +
" // Stack: 1, Locals: 1\n" +
" public X();\n" +
" 0 aload_0 [this]\n" +
" 1 invokespecial java.lang.Object() [8]\n" +
" 4 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 5] local: this index: 0 type: X\n" +
" \n" +
" // Method descriptor #15 ([Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 2\n" +
" public static void main(java.lang.String[] argv);\n" +
" 0 new java.util.ArrayList [16]\n" +
" 3 dup\n" +
" 4 invokespecial java.util.ArrayList() [18]\n" +
" 7 invokevirtual java.util.ArrayList.iterator() : java.util.Iterator [19]\n" +
" 10 astore_1\n" +
" 11 goto 27\n" +
" 14 aload_1\n" +
" 15 invokeinterface java.util.Iterator.next() : java.lang.Object [23] [nargs: 1]\n" +
" 20 checkcast java.lang.Long [29]\n" +
" 23 invokevirtual java.lang.Long.longValue() : long [31]\n" +
" 26 pop2\n" +
" 27 aload_1\n" +
" 28 invokeinterface java.util.Iterator.hasNext() : boolean [35] [nargs: 1]\n" +
" 33 ifne 14\n" +
" 36 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
" [pc: 36, line: 6]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 37] local: argv index: 0 type: java.lang.String[]\n";
File f = new File(OUTPUT_DIR + File.separator + "X.class");
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=425632, [1.8][compiler] Compiler gets the scope of enhanced for loop's expression wrong.
public void test425632() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" static int[] i = {1, 2, 3};\n" +
" public static void main(String [] args) {\n" +
" for (int i : i) {\n" +
" System.out.println(i);\n" +
" }\n" +
" }\n" +
"}\n"
},
"1\n2\n3");
}
public static Class testClass() {
return ForeachStatementTest.class;
}
}