/*******************************************************************************
 * Copyright (c) 2003, 2007 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
 *******************************************************************************/
package org.eclipse.wst.jsdt.core.tests.compiler.regression;

import java.util.Map;

import junit.framework.Test;

import org.eclipse.wst.jsdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.wst.jsdt.internal.compiler.impl.CompilerOptions;

public class TryStatementTest extends AbstractRegressionTest {

	static {
		// TESTS_NAMES = new String[] { "test000" };
		// TESTS_NUMBERS = new int[] { 54 };
		// TESTS_RANGE = new int[] { 11, -1 };
	}

	public TryStatementTest(String name) {
		super(name);
	}

	public static Test suite() {
		return buildAllCompliancesTestSuite(testClass());
	}

	public void test001() {
		this.runConformTest(new String[] {
				"p/X.java",
				"package p;\n" + "public class X {\n" + "  public class X1 {\n"
						+ "    public X1() throws Exception {\n" + "    }\n"
						+ "  }\n" + "  public void method1(){\n"
						+ "    try {\n" + "      new X1() {\n" + "      };\n"
						+ "    } catch(Exception e){\n" + "    }\n" + "  }\n"
						+ "}\n", });
	}

	public void test002() {
		this.runConformTest(new String[] {
				"p/X.java",
				"package p;\n" + "import java.io.*;\n"
						+ "import java.util.zip.*;\n" + "class X {\n"
						+ "  void bar() throws ZipException, IOException {}\n"
						+ "  void foo() {\n" + "    try {\n" + "      bar();\n"
						+ "    } catch (ZipException e) {\n"
						+ "    } catch (IOException e) {\n" + "    }\n"
						+ "  }\n" + "}\n", });
	}

	public void test003() {
		this.runConformTest(new String[] {
				"p/X.java",
				"package p;\n" + "public class X {\n" + "  public class A1 {\n"
						+ "    public A1() throws Exception {\n" + "    }\n"
						+ "  }\n" + "  public void method1(){\n"
						+ "    try {\n" + "      new A1() {\n" + "      };\n"
						+ "    } catch(Exception e){\n" + "    }\n" + "  }\n"
						+ "}\n", });
	}

	public void test004() {
		this.runConformTest(new String[] {
				"p/ATC.java",
				"package p;\n" + "public class ATC {\n" + "    \n"
						+ "    public class B extends Exception {\n"
						+ "      public B(String msg) { super(msg); }\n"
						+ "    }\n" + "    \n"
						+ "    void foo() throws ATC.B {\n"
						+ "      Object hello$1 = null;\n" + "      try {\n"
						+ "        throw new B(\"Inside foo()\");\n"
						+ "      } catch(B e) {\n"
						+ "        System.out.println(\"Caught B\");\n"
						+ "      }    \n" + "    }       \n" + "}\n", });
	}

	public void test005() {
		this
				.runConformTest(new String[] {
						"p/A.java",
						"package p;\n"
								+ "import java.io.IOException;\n"
								+ "import java.util.Vector;\n"
								+ "/**\n"
								+ " * This test0 should run without producing a java.lang.ClassFormatError\n"
								+ " */\n"
								+ "public class A {\n"
								+ "  public Vector getComponents () {\n"
								+ "    try{\n"
								+ "      throw new IOException();\n"
								+ "    }\n"
								+ "    catch (IOException ioe) {\n"
								+ "    }\n"
								+ "    return null;\n"
								+ "  }\n"
								+ "  public static void main(String[] args) {\n"
								+ "    new A().getComponents();\n" + "  }\n"
								+ "}\n", });
	}

	public void test006() {
		this
				.runConformTest(new String[] {
						"p/T.java",
						"package p;\n"
								+ "import java.lang.reflect.*;\n"
								+ "public class T extends InvocationTargetException {\n"
								+ "  public static void main(String[] args) {\n"
								+ "    T ct = new T();\n"
								+ "    ct.getTargetException();\n"
								+ "  }\n"
								+ "  public Throwable getTargetException() {\n"
								+ "    Runnable runnable = new Runnable() {\n"
								+ "      public void run() {\n"
								+ "        System.out.println(\"we got here\");\n"
								+ "        T.super.getTargetException();\n"
								+ "      }\n" + "    };\n"
								+ "    runnable.run();\n"
								+ "    return new Throwable();\n" + "  }\n"
								+ "}\n", });
	}

	public void test007() {
		this
				.runConformTest(new String[] {
						"TryFinally.java",
						"class TryFinally {	\n"
								+ "	public int readFile(String filename) throws Exception {	\n"
								+ "		int interfaceID = -1;	\n"
								+ "		int iNdx = 0;	\n"
								+ "		try {	\n"
								+ "			try {	\n"
								+ "				return interfaceID;	\n"
								+ "			} // end try	\n"
								+ "			finally {	\n"
								+ "				iNdx = 1;	\n"
								+ "			} // end finally	\n"
								+ "		} // end try	\n"
								+ "		catch (Exception ex) {	\n"
								+ "			throw new Exception(\"general exception \" + ex.getMessage() + \" on processing file \" + filename);	\n"
								+ "		} // end catch	\n" + "		finally {	\n"
								+ "		} // end finally	\n"
								+ "	} // end readFile method	\n" + "}	\n" });
	}

	/*
	 * 1FZR1TO: IVJCOM:WIN - Class does not compile in VAJava 3.02-Java2
	 */
	public void test008() {
		this
				.runConformTest(
						new String[] {
								"RedundantException.java",
								"import java.io.*;\n"
										+ "public class RedundantException {\n"
										+ "	/**\n"
										+ "	     * Runs the class as an application.\n"
										+ "	     */\n"
										+ "	public static void main(String[] args) {\n"
										+ "		RedundantException re = new RedundantException();\n"
										+ "		re.catchIt();\n"
										+ "		System.out.println(\"SUCCESS\");\n"
										+ "	}\n"
										+ "	/**\n"
										+ "	     * Defines a method that lists an exception twice.\n"
										+ "	     * This can be buried in a much longer list.\n"
										+ "	     */\n"
										+ "	void throwIt() throws IOException, IOException {\n"
										+ "		throw new IOException();\n"
										+ "	}\n"
										+ "	/**\n"
										+ "	     * Catches the redundantly defined exception.\n"
										+ "	     */\n"
										+ "	void catchIt() {\n"
										+ "		try {\n"
										+ "			throwIt(); // compile error here\n"
										+ "		} catch (IOException e) {\n"
										+ "			System.out.println(\"Caught.\");\n"
										+ "		}\n" + "	}\n" + "}" }, "Caught.\n"
								+ "SUCCESS");
	}

	public void test009() {
		this.runConformTest(new String[] {
				"Test.java",
				"public class Test {\n" + "public void save() {\n"
						+ "	int a = 3;\n" + "	try {\n"
						+ "		Object warnings = null;\n" + "      	try {\n"
						+ "         	Object contexts = null;\n"
						+ "         	try {\n"
						+ "            	System.out.println(warnings);\n"
						+ "			 	return;\n"
						+ "      	 	} catch (NullPointerException npe) {\n"
						+ "				System.out.println(contexts);\n"
						+ "               return;\n" + "       	}\n"
						+ "		} catch (Exception e) {\n" + " 			return;\n"
						+ "   	}\n" + "	} finally {\n" + "     	int b = 4;\n"
						+ "       System.out.println(\"#save -> \" + b + a);\n"
						+ "    }\n" + "}\n"
						+ "public static void main(String[] args) {\n"
						+ "	new Test().save();\n" + "}\n" + "}" }, "null\n"
				+ "#save -> 43");
	}

	public void test010() {
		this.runConformTest(new String[] {
				"Test.java",
				"public class Test {\n" + "public void save() {\n"
						+ "	int a = 3;\n" + "	try {\n"
						+ "		Object warnings = null;\n" + "      	try {\n"
						+ "         	Object contexts = null;\n"
						+ "         	try {\n"
						+ "            	System.out.println(warnings);\n"
						+ "			 	return;\n"
						+ "      	 	} catch (NullPointerException npe) {\n"
						+ "				System.out.println(contexts);\n"
						+ "               return;\n" + "       	}\n"
						+ "		} catch (Exception e) {\n" + " 			return;\n"
						+ "   	}\n" + "	} catch(Exception e){\n"
						+ "		Object dummy1 = null;\n"
						+ "		System.out.println(dummy1);\n"
						+ "		Object dummy2 = null;\n"
						+ "		System.out.println(dummy2);\n" + "		return;\n"
						+ "	} finally {\n" + "     	int b = 4;\n"
						+ "       System.out.println(\"#save -> \" + b + a);\n"
						+ "    }\n" + "}\n"
						+ "public static void main(String[] args) {\n"
						+ "	new Test().save();\n" + "}\n" + "}" }, "null\n"
				+ "#save -> 43");
	}

	public void test011() {
		this.runConformTest(new String[] {
				"Test.java",
				"public class Test {\n" + "public void save() {\n"
						+ "	int a = 3;\n" + "	try {\n"
						+ "		Object warnings = null;\n" + "      	try {\n"
						+ "         	Object contexts = null;\n"
						+ "         	try {\n"
						+ "            	System.out.println(warnings);\n"
						+ "			 	return;\n"
						+ "      	 	} catch (NullPointerException npe) {\n"
						+ "				System.out.println(contexts);\n"
						+ "               return;\n" + "       	}\n"
						+ "		} catch (Exception e) {\n" + " 			return;\n"
						+ "   	}\n" + "	} catch(Exception e){\n"
						+ "		int dummy1 = 11;\n"
						+ "		System.out.println(dummy1);\n"
						+ "		int dummy2 = 12;\n"
						+ "		System.out.println(dummy2);\n" + "		return;\n"
						+ "	} finally {\n" + "     	int b = 4;\n"
						+ "       System.out.println(\"#save -> \" + b + a);\n"
						+ "    }\n" + "}\n"
						+ "public static void main(String[] args) {\n"
						+ "	new Test().save();\n" + "}\n" + "}" }, "null\n"
				+ "#save -> 43");
	}

	/*
	 * 4943 Verification error
	 */
	public void test012() {
		this
				.runConformTest(
						new String[] {
								"X.java",
								"import java.io.*;\n"
										+ "public class X {\n"
										+ "	public static void main(String[] args) {\n"
										+ "		try {\n"
										+ "			new X().delete(args);\n"
										+ "			System.out.println(\"success\");\n"
										+ "		} catch (Exception e) {\n"
										+ "		}\n"
										+ "	}\n"
										+ "	void bar(int i) {\n"
										+ "	}\n"
										+ "	public Object delete(String[] resources) throws IOException {\n"
										+ "		try {\n"
										+ "			int totalWork = 3;\n"
										+ "			Object result = \"aaa\";\n"
										+ "			try {\n" + "				return result;\n"
										+ "			} catch (Exception e) {\n"
										+ "				throw new IOException();\n"
										+ "			} finally {\n"
										+ "				bar(totalWork);\n" + "			}\n"
										+ "		} finally {\n" + "			bar(0);\n"
										+ "		}\n" + "	}\n" + "}\n" }, "success");
	}

	/*
	 * 4943 Verification error
	 */
	public void test013() {
		this
				.runConformTest(
						new String[] {
								"X.java",
								"import java.io.*;\n"
										+ "public class X {\n"
										+ "	public static void main(String[] args) {\n"
										+ "		try {\n"
										+ "			new X().delete(args);\n"
										+ "			System.out.println(\"success\");\n"
										+ "		} catch (Exception e) {\n"
										+ "		}\n"
										+ "	}\n"
										+ "	void bar(int i) {\n"
										+ "	}\n"
										+ "	public Object delete(String[] resources) throws IOException {\n"
										+ "		try {\n"
										+ "			int totalWork = 3;\n"
										+ "			Object result = \"aaa\";\n"
										+ "			try {\n" + "				return result;\n"
										+ "			} catch (Exception e) {\n"
										+ "				throw new IOException();\n"
										+ "			} finally {\n"
										+ "				bar(totalWork);\n" + "			}\n"
										+ "		} finally {\n"
										+ "			int totalWork = 4;\n"
										+ "			bar(totalWork);\n" + "		}\n"
										+ "	}\n" + "}\n" }, "success");
	}

	public void test014() {
		this
				.runConformTest(
						new String[] {
								"Test.java",
								"public class Test {\n"
										+ "public void save() {\n"
										+ "	int a = 3;\n"
										+ "	try {\n"
										+ "		Object warnings = null;\n"
										+ "      	try {\n"
										+ "         	int contexts = 17;\n"
										+ "         	try {\n"
										+ "				Object dummy = null;\n"
										+ "            	System.out.println(warnings);\n"
										+ "            	System.out.println(dummy);\n"
										+ "			 	return;\n"
										+ "      	 	} catch (NullPointerException npe) {\n"
										+ "				System.out.println(contexts);\n"
										+ "               return;\n"
										+ "       	}\n"
										+ "		} catch (Exception e) {\n"
										+ " 			return;\n"
										+ "   	} finally { \n"
										+ "			int c = 34; \n"
										+ "			System.out.println(\"#inner-finally ->\" + a + c);\n"
										+ "       }\n"
										+ "	} finally {\n"
										+ "     	int b = 4;\n"
										+ "       System.out.println(\"#save -> \" + b + a);\n"
										+ "    }\n"
										+ "}\n"
										+ "public static void main(String[] args) {\n"
										+ "	new Test().save();\n" + "}\n" + "}" },
						"null\n" + "null\n" + "#inner-finally ->334\n"
								+ "#save -> 43");
	}

	public void test015() {
		this.runConformTest(new String[] {
				"p1/X.java",
				"package p1;	\n" + "import java.io.IOException;	\n"
						+ "public class X {	\n"
						+ "	public static void main(String args[]) {	\n"
						+ "		try { 	\n" + "			new Object(){	\n" + "				{	\n"
						+ "					if (true) throw new IOException();	\n"
						+ "					if (true) throw new Exception();	\n"
						+ "				}	\n" + "			};	\n"
						+ "			System.out.println(\"FAILED\");	\n"
						+ "		} catch(Exception e){	\n"
						+ "			System.out.println(\"SUCCESS\");	\n" + "		}	\n"
						+ "	}	\n" + "}	\n", }, "SUCCESS");
	}

	public void test016() {
		this.runConformTest(new String[] {
				"p1/X.java",
				"package p1;	\n" + "import java.io.IOException;	\n"
						+ "public class X {	\n"
						+ "	public static void main(String args[]) {	\n"
						+ "		class SomeClass {	\n"
						+ "			SomeClass () throws IOException {	\n" + "			}	\n"
						+ "		}	\n" + "		try { 	\n" + "			new Object(){	\n"
						+ "				{	\n"
						+ "					if (true) throw new IOException();	\n"
						+ "					if (true) throw new Exception();	\n"
						+ "				}	\n" + "			};	\n"
						+ "			System.out.println(\"FAILED\");	\n"
						+ "		} catch(Exception e){	\n"
						+ "			System.out.println(\"SUCCESS\");	\n" + "		}	\n"
						+ "	}	\n" + "}	\n", }, "SUCCESS");
	}

	public void test017() {
		this.runConformTest(new String[] {
				"p1/X.java",
				"package p1;	\n" + "public class X {	\n"
						+ "	public static void main(String args[]) {	\n"
						+ "		try { 	\n" + "			new Object(){	\n" + "				{	\n"
						+ "					foo();	\n" + "				}	\n" + "			};	\n"
						+ "			System.out.println(\"FAILED\");	\n"
						+ "		} catch(Exception e){	\n"
						+ "			System.out.println(\"SUCCESS\");	\n" + "		}	\n"
						+ "	}	\n" + "	static class AEx extends Exception {} \n"
						+ "	static class BEx extends Exception {} \n"
						+ "	static void foo() throws AEx, BEx {	\n"
						+ "		throw new AEx();	\n" + "	}	\n" + "}	\n", },
				"SUCCESS");
	}

	// 8773 verification error
	public void test018() {
		this.runConformTest(new String[] {
				"VerifyEr.java",
				"public class VerifyEr {	\n"
						+ "  protected boolean err(boolean b) {	\n"
						+ "     try {	\n"
						+ "          System.out.print(\"SUCC\");	\n"
						+ "     } catch (Throwable t) {	\n"
						+ "          return b;	\n" + "     } finally {	\n"
						+ "          try {	\n" + "               if (b) {	\n"
						+ "                    return b;	\n"
						+ "               }	\n" + "          } finally {	\n"
						+ "          		System.out.println(\"ESS\");	\n"
						+ "          }	\n" + "     }	\n"
						+ "     return false;	\n" + "  }	\n"
						+ "  public static void main(String[] args) {	\n"
						+ "     new VerifyEr().err(false);	\n" + "  }	\n"
						+ "}	\n", }, "SUCCESS");
	}

	/*
	 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=16279
	 */
	public void test019() {
		this.runConformTest(new String[] {
				"X.java",
				"public class X {	\n" + "	String logger;	\n"
						+ "  public static void main(String[] args) {	\n"
						+ "    new X().foo();	\n" + "	}	\n"
						+ "	public void foo() {	\n" + "		try {	\n"
						+ "			System.out.println(\"SUCCESS\");	\n"
						+ "		} catch (Exception ce) {	\n"
						+ "			String s = null;	\n" + "			try {	\n"
						+ "				return;	\n" + "			} catch (Exception ex) {	\n"
						+ "			}	\n" + "			s.hashCode();	\n"
						+ "		} finally {	\n"
						+ "			if (this.logger == null) {	\n"
						+ "				String loggerManager = null;	\n"
						+ "				System.out.println(loggerManager);	\n"
						+ "			}	\n" + "		}	\n" + "	}	\n" + "}	\n" },
				"SUCCESS\n" + "null");
	}

	/*
	 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=16279 shifting of finaly
	 * scopes against try/catch ones makes the custom ret address shifting
	 * unnecessary.
	 */
	public void test020() {
		this.runConformTest(new String[] {
				"X.java",
				"public class X {	\n" + "	String logger;	\n"
						+ "  public static void main(String[] args) {	\n"
						+ "    new X().foo();	\n" + "	}	\n"
						+ "	public void foo() {	\n" + "		try {	\n"
						+ "			System.out.println(\"try1\");	\n" + "			try {	\n"
						+ "				System.out.println(\"try2\");	\n"
						+ "			} finally {	\n"
						+ "				System.out.println(\"finally2\");	\n"
						+ "			}	\n" + "		} catch (Exception ce) {	\n"
						+ "			String s = null;	\n" + "			try {	\n"
						+ "				return;	\n" + "			} catch (Exception ex) {	\n"
						+ "			}	\n" + "			s.hashCode();	\n"
						+ "		} finally {	\n"
						+ "			System.out.println(\"finally1\");	\n"
						+ "			try {	\n"
						+ "				System.out.println(\"try3\");	\n"
						+ "				if (this.logger == null) {	\n"
						+ "					String loggerManager = null;	\n" + "				}	\n"
						+ "			} finally {	\n"
						+ "				System.out.println(\"finally3\");	\n"
						+ "			}	\n" + "		}	\n" + "		int i1 = 0;	\n"
						+ "		int i2 = 0;	\n" + "		int i3 = 0;	\n"
						+ "		int i4 = 0;	\n" + "		int i5 = 0;	\n"
						+ "		int i6 = 0;	\n" + "		int i7 = 0;	\n"
						+ "		int i8 = 0;	\n" + "		int i9 = 0;	\n" + "	}	\n"
						+ "}	\n" }, "try1\n" + "try2\n" + "finally2\n"
				+ "finally1\n" + "try3\n" + "finally3");
	}

	/*
	 * http://dev.eclipse.org/bugs/show_bug.cgi?id=21116 protected type
	 * visibility check
	 */
	public void test021() {
		this.runConformTest(new String[] {
				"pa/A.java",
				"package pa;	\n" + "public abstract class A {	\n"
						+ "  public static void main(String[] args) {	\n"
						+ "    System.out.println(\"SUCCESS\");	\n" + "	}	\n"
						+ "	protected AIC memberA;	\n"
						+ "	protected class AIC {	\n"
						+ "		public void methodAIC(String parameter) {	\n"
						+ "		  // ....do something	\n" + "		}	\n" + "	}	\n"
						+ "}	\n",
				"pb/B.java",
				"package pb;	\n" + "public class B extends pa.A {	\n"
						+ "	private class BIC {	\n"
						+ "		public void methodBIC(String param) {	\n"
						+ "			memberA.methodAIC(param);	\n" + "		}	\n"
						+ "	}	\n" + "}	\n" }, "SUCCESS");
	}

	/*
	 * http://dev.eclipse.org/bugs/show_bug.cgi?id=19916 nested try/synchronized
	 * statements (local var index alloc)
	 */
	public void test022() {
		this.runConformTest(new String[] {
				"pa/A.java",
				"package pa;	\n" + "public class A {	\n"
						+ "  public static void main(String[] args) {	\n"
						+ "	 new A().f();	\n"
						+ "    System.out.println(\"SUCCESS\");	\n" + "	}	\n"
						+ "	boolean b = false;	\n"
						+ "	private Integer f() {	\n" + "		while (true) {	\n"
						+ "			try {	\n" + "				int x = 3;	\n"
						+ "				synchronized (this) {	\n"
						+ "					return null;	\n" + "				}	\n"
						+ "			} finally {	\n" + "				if (b)	\n"
						+ "					synchronized (this) {	\n"
						+ "					int y = 3;	\n" + "				}	\n" + "			}	\n"
						+ "		}	\n" + "	}	\n" + "}	\n" }, "SUCCESS");
	}

	public void test023() {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_ReportHiddenCatchBlock,
				CompilerOptions.ERROR);
		this
				.runNegativeTest(
						new String[] {
								"X.java",
								"public class X {\n"
										+ "	public static void main(String[] args) {\n"
										+ "		try {\n" + "			throw new BX();\n"
										+ "		} catch(BX e) {\n"
										+ "		} catch(AX e) {\n" + "		}\n"
										+ "	}\n" + "} \n"
										+ "class AX extends Exception {}\n"
										+ "class BX extends AX {}\n" },
						"----------\n"
								+ "1. ERROR in X.java (at line 6)\n"
								+ "	} catch(AX e) {\n"
								+ "	        ^^\n"
								+ "Unreachable catch block for AX. Only more specific exceptions are thrown and handled by previous catch block(s).\n"
								+ "----------\n"
								+ "2. WARNING in X.java (at line 10)\n"
								+ "	class AX extends Exception {}\n"
								+ "	      ^^\n"
								+ "The serializable class AX does not declare a static final serialVersionUID field of type long\n"
								+ "----------\n"
								+ "3. WARNING in X.java (at line 11)\n"
								+ "	class BX extends AX {}\n"
								+ "	      ^^\n"
								+ "The serializable class BX does not declare a static final serialVersionUID field of type long\n"
								+ "----------\n", null, true, customOptions);
	}

	/*
	 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=21203 NPE in
	 * ExceptionFlowContext
	 */
	public void test024() {

		this
				.runNegativeTest(
						new String[] {
								"p/X.java",
								"package p;	\n"
										+ "public class X {	\n"
										+ "	public void myMethod() {	\n"
										+ "	    System.out.println(\"starting\");	\n"
										+ "	    try {	\n"
										+ "	        if (true) throw new LookupException();	\n"
										+ "	    } catch(DataException de) {	\n"
										+ "	       	System.out.println(\"DataException occurred\");	\n"
										+ "	    } catch(LookupException le) {	\n"
										+ "	       	System.out.println(\"LookupException occurred\");	\n"
										+ "	    } catch(Throwable t) {	\n"
										+ "	       	System.out.println(\"Throwable occurred\");	\n"
										+ "	    }	\n"
										+ "	    System.out.println(\"SUCCESS\");	\n"
										+ "	}	\n"
										+ "}	\n"
										+ "class DataException extends Throwable {	\n"
										+ "} 	\n"
										+ "class LookupException extends DataException {	\n"
										+ "}	\n" },
						"----------\n"
								+ "1. ERROR in p\\X.java (at line 9)\n"
								+ "	} catch(LookupException le) {	\n"
								+ "	        ^^^^^^^^^^^^^^^\n"
								+ "Unreachable catch block for LookupException. It is already handled by the catch block for DataException\n"
								+ "----------\n"
								+ "2. WARNING in p\\X.java (at line 17)\n"
								+ "	class DataException extends Throwable {	\n"
								+ "	      ^^^^^^^^^^^^^\n"
								+ "The serializable class DataException does not declare a static final serialVersionUID field of type long\n"
								+ "----------\n"
								+ "3. WARNING in p\\X.java (at line 19)\n"
								+ "	class LookupException extends DataException {	\n"
								+ "	      ^^^^^^^^^^^^^^^\n"
								+ "The serializable class LookupException does not declare a static final serialVersionUID field of type long\n"
								+ "----------\n");
	}

	// 60081
	public void test025() {

		this
				.runConformTest(
						new String[] {
								"X.java",
								"import java.io.*;\n"
										+ "public class X\n"
										+ "{\n"
										+ "    {\n"
										+ "        String licenseFileName = \"C:/Program Files/Jatt/bin/license.key\";\n"
										+ "        File licenseFile = new File(licenseFileName);\n"
										+ "        try {\n"
										+ "            BufferedReader licenseReader = new BufferedReader(\n"
										+ "                new FileReader(licenseFile));\n"
										+ "            StringBuffer buf = new StringBuffer();\n"
										+ "            String line = null;\n"
										+ "            while ((line = licenseReader.readLine()) != null) {\n"
										+ "                char[] chars = line.toCharArray();\n"
										+ "                for (int i = 0; i < line.length(); i++) {\n"
										+ "                    if (!Character.isSpace(line.charAt(i))) {\n"
										+ "                        buf.append(line.charAt(i));\n"
										+ "                    }\n"
										+ "                }\n"
										+ "            }\n"
										+ "            \n"
										+ "        } catch (FileNotFoundException e) {\n"
										+ "            throw new Error(\"License file not found\", e);\n"
										+ "        } catch (IOException e) {\n"
										+ "            throw new Error(\"License file cannot be read\", e);\n"
										+ "        }\n"
										+ "    }\n"
										+ "  public X()\n"
										+ "  {\n"
										+ "  }\n"
										+ "  \n"
										+ "  public X(X r) \n"
										+ "  {\n"
										+ "  }    \n"
										+ "  public static void main(String[] args) {\n"
										+ "        System.out.println(\"SUCCESS\");\n"
										+ "    }\n" + "}\n" }, "SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89710
	// public void test026() {
	//
	// Map customOptions = this.getCompilerOptions();
	// customOptions.put(CompilerOptions.OPTION_PreserveUnusedLocal,
	// CompilerOptions.PRESERVE);
	//
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "import java.util.*;\n" +
	// "\n" +
	// "public class X {\n" +
	// "	\n" +
	// "	static private ResourceBundle bundle = null;\n" +
	// "	static {\n" +
	// "		int i = 0;\n" +
	// "		try {\n" +
	// "			bundle = foo();\n" +
	// "		} catch(Throwable e) {\n" +
	// "			e.printStackTrace();\n" +
	// "		}\n" +
	// "	}\n" +
	// "\n" +
	// "	static ResourceBundle foo() {\n" +
	// "		return null;\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "",
	// null,
	// true,
	// null,
	// customOptions,
	// null); // custom requestor
	//	
	// String expectedOutput =
	// "      Local variable table:\n" +
	// "        [pc: 6, pc: 21] local: i index: 0 type: int\n" +
	// "        [pc: 16, pc: 20] local: e index: 1 type: java.lang.Throwable\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89710 - variation
	// public void test027() {
	//
	// Map customOptions = this.getCompilerOptions();
	// customOptions.put(CompilerOptions.OPTION_PreserveUnusedLocal,
	// CompilerOptions.PRESERVE);
	//
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "import java.util.*;\n" +
	// "\n" +
	// "public class X {\n" +
	// "	\n" +
	// "	void bar(boolean b) {\n" +
	// "		if (b) {\n" +
	// "			try {\n" +
	// "				int i = 0;\n" +
	// "			} catch(Exception e) {\n" +
	// "				e.printStackTrace();\n" +
	// "			}\n" +
	// "		} else {\n" +
	// "			int j = 0;\n" +
	// "		}\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "",
	// null,
	// true,
	// null,
	// customOptions,
	// null); // custom requestor
	//	
	// String expectedOutput =
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 20] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 20] local: b index: 1 type: boolean\n" +
	// "        [pc: 6, pc: 9] local: i index: 2 type: int\n" +
	// "        [pc: 10, pc: 14] local: e index: 2 type: java.lang.Exception\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=98892
	public void test028() {

		this
				.runConformTest(
						new String[] {
								"X.java",
								"public class X {\n"
										+ "\n"
										+ "    public static void main(String[] args) {\n"
										+ "    	try {\n"
										+ "	        new X().start();\n"
										+ "    	} catch(Exception e) {\n"
										+ "            System.out.println(\"SUCCESS\");\n"
										+ "    	}\n"
										+ "    }\n"
										+ "    public Object start() {\n"
										+ "        try {\n"
										+ "            return null;\n"
										+ "        } finally {\n"
										+ "            System.out.print(\"ONCE:\");\n"
										+ "            foo();\n"
										+ "        }\n"
										+ "    }\n"
										+ "\n"
										+ "    private void foo() {\n"
										+ "        throw new IllegalStateException(\"Gah!\");\n"
										+ "    }        \n" + "}\n", },
						"ONCE:SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=98892 - variation
	public void test029() {

		this
				.runConformTest(
						new String[] {
								"X.java",
								"public class X {\n"
										+ "\n"
										+ "    public static void main(String[] args) {\n"
										+ "    	try {\n"
										+ "	        new X().start();\n"
										+ "    	} catch(Exception e) {\n"
										+ "            System.out.println(\"SUCCESS\");\n"
										+ "    	}\n"
										+ "    }\n"
										+ "    public Object start() {\n"
										+ "        try {\n"
										+ "            return null;\n"
										+ "        } finally {\n"
										+ "            System.out.print(\"ONCE:\");\n"
										+ "            foo();\n"
										+ "            return this;\n"
										+ "        }\n"
										+ "    }\n"
										+ "\n"
										+ "    private void foo() {\n"
										+ "        throw new IllegalStateException(\"Gah!\");\n"
										+ "    }        \n" + "}\n", },
						"ONCE:SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=98892 - variation
	public void test030() {

		this
				.runConformTest(
						new String[] {
								"X.java",
								"public class X {\n"
										+ "\n"
										+ "    public static void main(String[] args) {\n"
										+ "    	try {\n"
										+ "	        new X().start();\n"
										+ "    	} catch(Exception e) {\n"
										+ "            System.out.println(\"SUCCESS\");\n"
										+ "    	}\n"
										+ "    }\n"
										+ "    public Object start() {\n"
										+ "        try {\n"
										+ "            Object o = null;\n"
										+ "            o.toString();\n"
										+ "            return null;\n"
										+ "        } catch(Exception e) {\n"
										+ "            System.out.print(\"EXCEPTION:\");\n"
										+ "			return e;        	\n"
										+ "        } finally {\n"
										+ "            System.out.print(\"ONCE:\");\n"
										+ "            foo();\n"
										+ "        }\n"
										+ "    }\n"
										+ "\n"
										+ "    private void foo() {\n"
										+ "        throw new IllegalStateException(\"Gah!\");\n"
										+ "    }        \n" + "}\n", },
						"EXCEPTION:ONCE:SUCCESS");
	}

	/*
	 * Try block is never reached
	 */
	public void test031() {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember,
				CompilerOptions.IGNORE);

		this
				.runNegativeTest(
						new String[] {
								"X.java",
								"import java.io.IOException;\n"
										+ "\n"
										+ "public class X {\n"
										+ "	static void foo(Object o) {}\n"
										+ "	\n"
										+ "    public static void main(String[] args) {\n"
										+ "    	try {\n"
										+ "    		foo(new Object() {\n"
										+ "    			public void bar() throws IOException {\n"
										+ "    				bar1();\n"
										+ "    			}\n"
										+ "    		});\n"
										+ "    	} catch(IOException e) {\n"
										+ "    		e.printStackTrace();\n"
										+ "    	}\n"
										+ "    }\n"
										+ "    \n"
										+ "    static void bar1() throws IOException {}\n"
										+ "}" },
						"----------\n"
								+ "1. ERROR in X.java (at line 13)\n"
								+ "	} catch(IOException e) {\n"
								+ "	        ^^^^^^^^^^^\n"
								+ "Unreachable catch block for IOException. This exception is never thrown from the try statement body\n"
								+ "----------\n", null, true, customOptions);
	}

	/*
	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=114855
	 */
	public void test032() {
		this
				.runConformTest(
						new String[] {
								"X.java",
								"public class X\n"
										+ "{\n"
										+ "  static int except_count;\n"
										+ "\n"
										+ "  static boolean test_result = true;\n"
										+ "  \n"
										+ "  static Throwable all_except[] =\n"
										+ "  {\n"
										+ "    new AbstractMethodError(),             //  0\n"
										+ "    new ArithmeticException(),             //  1\n"
										+ "    new ArrayIndexOutOfBoundsException(),  //  2\n"
										+ "    new ArrayStoreException(),             //  3\n"
										+ "    new ClassCastException(),              //  4\n"
										+ "    new ClassCircularityError(),           //  5\n"
										+ "    new ClassFormatError(),                //  6\n"
										+ "    new ClassNotFoundException(),          //  7\n"
										+ "    new CloneNotSupportedException(),      //  8\n"
										+ "    new Error(),                           //  9\n"
										+ "    new Exception(),                       // 10\n"
										+ "    new IllegalAccessError(),              // 11\n"
										+ "    new IllegalAccessException(),          // 12\n"
										+ "    new IllegalArgumentException(),        // 13\n"
										+ "    new IllegalMonitorStateException(),    // 14\n"
										+ "    new IllegalThreadStateException(),     // 15\n"
										+ "    new IncompatibleClassChangeError(),    // 16\n"
										+ "    new IndexOutOfBoundsException(),       // 17\n"
										+ "    new InstantiationError(),              // 18\n"
										+ "    new InstantiationException(),          // 19\n"
										+ "    new InternalError(),                   // 20\n"
										+ "    new InterruptedException(),            // 21\n"
										+ "    new LinkageError(),                    // 22\n"
										+ "    new NegativeArraySizeException(),      // 23\n"
										+ "    new NoClassDefFoundError(),            // 24\n"
										+ "    new NoSuchFieldError(),                // 25\n"
										+ "    new NoSuchMethodError(),               // 26\n"
										+ "    new NoSuchMethodException(),           // 27\n"
										+ "    new NullPointerException(),            // 28\n"
										+ "    new NumberFormatException(),           // 29\n"
										+ "    new OutOfMemoryError(),                // 30\n"
										+ "    new StackOverflowError(),              // 31\n"
										+ "    new RuntimeException(),                // 32\n"
										+ "    new SecurityException(),               // 33\n"
										+ "    new StringIndexOutOfBoundsException(), // 34\n"
										+ "    new ThreadDeath(),                     // 35\n"
										+ "    new UnknownError(),                    // 36\n"
										+ "    new UnsatisfiedLinkError(),            // 37\n"
										+ "    new VerifyError(),                     // 38\n"
										+ "  };\n"
										+ "\n"
										+ "  private static void check_except(int i)\n"
										+ "    throws Throwable\n"
										+ "  {\n"
										+ "    if (except_count != i)\n"
										+ "    {\n"
										+ "      System.out.println(\"Error \"+except_count+\" != \"+i+\";\");\n"
										+ "      test_result=false;\n"
										+ "    }\n"
										+ "    throw all_except[++except_count];\n"
										+ "  }\n"
										+ "\n"
										+ "  public static void main(String[] args) throws Throwable\n"
										+ "  {\n"
										+ "    try {\n"
										+ "      except_count = 0;\n"
										+ "      throw all_except[except_count];\n"
										+ "    } catch (AbstractMethodError e0) {\n"
										+ "      try {\n"
										+ "        check_except(0);\n"
										+ "      } catch (ArithmeticException e1) {\n"
										+ "        try {\n"
										+ "          check_except(1);\n"
										+ "        } catch (ArrayIndexOutOfBoundsException e2) {\n"
										+ "          try {\n"
										+ "            check_except(2);\n"
										+ "          } catch (ArrayStoreException e3) {\n"
										+ "            try {\n"
										+ "              check_except(3);\n"
										+ "            } catch (ClassCastException e4) {\n"
										+ "              try {\n"
										+ "                check_except(4);\n"
										+ "              } catch (ClassCircularityError e5) {\n"
										+ "                try {\n"
										+ "                  check_except(5);\n"
										+ "                } catch (ClassFormatError e6) {\n"
										+ "                  try {\n"
										+ "                    check_except(6);\n"
										+ "                  } catch (ClassNotFoundException e7) {\n"
										+ "                    try {\n"
										+ "                      check_except(7);\n"
										+ "                    } catch (CloneNotSupportedException e8) {\n"
										+ "                      try {\n"
										+ "                        check_except(8);\n"
										+ "                      } catch (Error e9) {\n"
										+ "                        try {\n"
										+ "                          check_except(9);\n"
										+ "                        } catch (Exception e10) {\n"
										+ "                          try {\n"
										+ "                            check_except(10);\n"
										+ "                          } catch (IllegalAccessError e11) {\n"
										+ "                            try {\n"
										+ "                              check_except(11);\n"
										+ "                            } catch (IllegalAccessException e12) {\n"
										+ "                              try {\n"
										+ "                                check_except(12);\n"
										+ "                              } catch (IllegalArgumentException e13) {\n"
										+ "                                try {\n"
										+ "                                  check_except(13);\n"
										+ "                                } catch (IllegalMonitorStateException e14) {\n"
										+ "                                  try {\n"
										+ "                                    check_except(14);\n"
										+ "                                  } catch (IllegalThreadStateException e15) {\n"
										+ "                                    try {\n"
										+ "                                      check_except(15);\n"
										+ "                                    } catch (IncompatibleClassChangeError e16) {\n"
										+ "                                      try {\n"
										+ "                                        check_except(16);\n"
										+ "                                      } catch (IndexOutOfBoundsException e17) {\n"
										+ "                                        try {\n"
										+ "                                          check_except(17);\n"
										+ "                                        } catch (InstantiationError e18) {\n"
										+ "                                          try {\n"
										+ "                                            check_except(18);\n"
										+ "                                          } catch (InstantiationException e19) {\n"
										+ "                                            try {\n"
										+ "                                              check_except(19);\n"
										+ "                                            } catch (InternalError e20) {\n"
										+ "                                              try {\n"
										+ "                                                check_except(20);\n"
										+ "                                              } catch (InterruptedException \n"
										+ "e21) {\n"
										+ "                                                try {\n"
										+ "                                                  check_except(21);\n"
										+ "                                                } catch (LinkageError e22) {\n"
										+ "                                                  try {\n"
										+ "                                                    check_except(22);\n"
										+ "                                                  } catch \n"
										+ "(NegativeArraySizeException e23) {\n"
										+ "                                                    try {\n"
										+ "                                                      check_except(23);\n"
										+ "                                                    } catch \n"
										+ "(NoClassDefFoundError e24) {\n"
										+ "                                                      try {\n"
										+ "                                                        check_except(24);\n"
										+ "                                                      } catch (NoSuchFieldError \n"
										+ "e25) {\n"
										+ "                                                        try {\n"
										+ "                                                          check_except(25);\n"
										+ "                                                        } catch \n"
										+ "(NoSuchMethodError e26) {\n"
										+ "                                                          try {\n"
										+ "                                                            check_except(26);\n"
										+ "                                                          } catch \n"
										+ "(NoSuchMethodException e27) {\n"
										+ "                                                            try {\n"
										+ "                                                              check_except(27);\n"
										+ "                                                            } catch \n"
										+ "(NullPointerException e28) {\n"
										+ "                                                              try {\n"
										+ "                                                                check_except\n"
										+ "(28);\n"
										+ "                                                              } catch \n"
										+ "(NumberFormatException e29) {\n"
										+ "                                                                try {\n"
										+ "                                                                  check_except\n"
										+ "(29);\n"
										+ "                                                                } catch \n"
										+ "(OutOfMemoryError e30) {\n"
										+ "                                                                  try {\n"
										+ "                                                                    check_except\n"
										+ "(30);\n"
										+ "                                                                  } catch \n"
										+ "(StackOverflowError e31) {\n"
										+ "                                                                    try {\n"
										+ "                                                                      \n"
										+ "check_except(31);\n"
										+ "                                                                    } catch \n"
										+ "(RuntimeException e32) {\n"
										+ "                                                                      try {\n"
										+ "                                                                        \n"
										+ "check_except(32);\n"
										+ "                                                                      } catch \n"
										+ "(SecurityException e33) {\n"
										+ "                                                                        try {\n"
										+ "                                                                          \n"
										+ "check_except(33);\n"
										+ "                                                                        } catch \n"
										+ "(StringIndexOutOfBoundsException e34) {\n"
										+ "                                                                          try {\n"
										+ "                                                                            \n"
										+ "check_except(34);\n"
										+ "                                                                          } \n"
										+ "catch (ThreadDeath e35) {\n"
										+ "                                                                            try \n"
										+ "{\n"
										+ "                                                                              \n"
										+ "check_except(35);\n"
										+ "                                                                            } \n"
										+ "catch (UnknownError e36) {\n"
										+ "                                                                              \n"
										+ "try {\n"
										+ "                                                                                \n"
										+ "check_except(36);\n"
										+ "                                                                              } \n"
										+ "catch (UnsatisfiedLinkError e37) {\n"
										+ "                                                                                \n"
										+ "try {\n"
										+ "                                                                                \n"
										+ "  check_except(37);\n"
										+ "                                                                                \n"
										+ "} catch (VerifyError e38) {\n"
										+ "                                                                                \n"
										+ "  ++except_count;\n"
										+ "                                                                                \n"
										+ "}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}\n"
										+ "    System.out.print(test_result & (except_count == all_except.length));\n"
										+ "  }\n" + "}", }, "true");
	}

	// public void test033() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	interface IActionSetContributionItem {\n" +
	// "		String getActionSetId();\n" +
	// "	}\n" +
	// "	public interface IAction {\n" +
	// "	}\n" +
	// "	interface IContributionItem {\n" +
	// "		String getId();\n" +
	// "		boolean isSeparator();\n" +
	// "		boolean isGroupMarker();\n" +
	// "	}\n" +
	// "    public static void findInsertionPoint(String startId,\n" +
	// "            String sortId, IContributionItem[] items) {\n" +
	// "        // Find the reference item.\n" +
	// "        try {\n" +
	// "	        int insertIndex = 0;\n" +
	// "	        while (insertIndex < items.length) {\n" +
	// "	            if (startId.equals(items[insertIndex].getId()))\n" +
	// "	                break;\n" +
	// "	            ++insertIndex;\n" +
	// "	        }\n" +
	// "	        if (insertIndex >= items.length)\n" +
	// "	            return;\n" +
	// "	\n" +
	// "	        int compareMetric = 0;\n" +
	// "	\n" +
	// "	        // Find the insertion point for the new item.\n" +
	// "	        // We do this by iterating through all of the previous\n" +
	// "	        // action set contributions define within the current group.\n"
	// +
	// "	        for (int nX = insertIndex + 1; nX < items.length; nX++) {\n" +
	// "	            IContributionItem item = items[nX];\n" +
	// "	            if (item.isSeparator() || item.isGroupMarker()) {\n" +
	// "	                // Fix for bug report 18357\n" +
	// "	                break;\n" +
	// "	            }\n" +
	// "	            if (item instanceof IActionSetContributionItem) {\n" +
	// "	                if (sortId != null) {\n" +
	// "	                    String testId = ((IActionSetContributionItem) item)\n"
	// +
	// "	                            .getActionSetId();\n" +
	// "	                    if (sortId.compareTo(testId) < compareMetric)\n" +
	// "	                        break;\n" +
	// "	                }\n" +
	// "	                insertIndex = nX;\n" +
	// "	            } else {\n" +
	// "	                break;\n" +
	// "	            }\n" +
	// "	        }\n" +
	// "	    } catch(Exception e) {}\n" +
	// "    }\n" +
	// "    \n" +
	// "    public static void main(String[] args) {\n" +
	// "		findInsertionPoint(\"\", \"\", null);\n" +
	// "	}\n" +
	// "}",
	// },
	// "");
	// String expectedOutput =
	// "  // Method descriptor #15 (Ljava/lang/String;Ljava/lang/String;[LX$IContributionItem;)V\n"
	// +
	// "  // Stack: 3, Locals: 8\n" +
	// "  public static void findInsertionPoint(java.lang.String startId, java.lang.String sortId, X.IContributionItem[] items);\n"
	// +
	// "      0  iconst_0\n" +
	// "      1  istore_3 [insertIndex]\n" +
	// "      2  goto 26\n" +
	// "      5  aload_0 [startId]\n" +
	// "      6  aload_2 [items]\n" +
	// "      7  iload_3 [insertIndex]\n" +
	// "      8  aaload\n" +
	// "      9  invokeinterface X$IContributionItem.getId() : java.lang.String [16] [nargs: 1]\n"
	// +
	// "     14  invokevirtual java.lang.String.equals(java.lang.Object) : boolean [22]\n"
	// +
	// "     17  ifeq 23\n" +
	// "     20  goto 32\n" +
	// "     23  iinc 3 1 [insertIndex]\n" +
	// "     26  iload_3 [insertIndex]\n" +
	// "     27  aload_2 [items]\n" +
	// "     28  arraylength\n" +
	// "     29  if_icmplt 5\n" +
	// "     32  iload_3 [insertIndex]\n" +
	// "     33  aload_2 [items]\n" +
	// "     34  arraylength\n" +
	// "     35  if_icmplt 39\n" +
	// "     38  return\n" +
	// "     39  iconst_0\n" +
	// "     40  istore 4 [compareMetric]\n" +
	// "     42  iload_3 [insertIndex]\n" +
	// "     43  iconst_1\n" +
	// "     44  iadd\n" +
	// "     45  istore 5 [nX]\n" +
	// "     47  goto 123\n" +
	// "     50  aload_2 [items]\n" +
	// "     51  iload 5 [nX]\n" +
	// "     53  aaload\n" +
	// "     54  astore 6 [item]\n" +
	// "     56  aload 6 [item]\n" +
	// "     58  invokeinterface X$IContributionItem.isSeparator() : boolean [28] [nargs: 1]\n"
	// +
	// "     63  ifne 134\n" +
	// "     66  aload 6 [item]\n" +
	// "     68  invokeinterface X$IContributionItem.isGroupMarker() : boolean [32] [nargs: 1]\n"
	// +
	// "     73  ifeq 79\n" +
	// "     76  goto 134\n" +
	// "     79  aload 6 [item]\n" +
	// "     81  instanceof X$IActionSetContributionItem [35]\n" +
	// "     84  ifeq 134\n" +
	// "     87  aload_1 [sortId]\n" +
	// "     88  ifnull 117\n" +
	// "     91  aload 6 [item]\n" +
	// "     93  checkcast X$IActionSetContributionItem [35]\n" +
	// "     96  invokeinterface X$IActionSetContributionItem.getActionSetId() : java.lang.String [37] [nargs: 1]\n"
	// +
	// "    101  astore 7 [testId]\n" +
	// "    103  aload_1 [sortId]\n" +
	// "    104  aload 7 [testId]\n" +
	// "    106  invokevirtual java.lang.String.compareTo(java.lang.String) : int [40]\n"
	// +
	// "    109  iload 4 [compareMetric]\n" +
	// "    111  if_icmpge 117\n" +
	// "    114  goto 134\n" +
	// "    117  iload 5 [nX]\n" +
	// "    119  istore_3 [insertIndex]\n" +
	// "    120  iinc 5 1 [nX]\n" +
	// "    123  iload 5 [nX]\n" +
	// "    125  aload_2 [items]\n" +
	// "    126  arraylength\n" +
	// "    127  if_icmplt 50\n" +
	// "    130  goto 134\n" +
	// "    133  astore_3\n" +
	// "    134  return\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853
	// public void test034() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	private static int scenario(){\n" +
	// "		try {\n" +
	// "			int i = 1;\n" +
	// "			System.out.print(\"[i: \" + i+\"]\");\n" +
	// "			if (i > 5) {\n" +
	// "				return i;\n" +
	// "			}\n" +
	// "			return -i;\n" +
	// "		} catch (Exception e) {\n" +
	// "			System.out.print(\"[WRONG CATCH]\");\n" +
	// "			return 2;\n" +
	// "		} finally {\n" +
	// "			System.out.print(\"[finally]\");\n" +
	// "			try {\n" +
	// "				throwRuntime();\n" +
	// "			} finally {\n" +
	// "				clean();\n" +
	// "			}\n" +
	// "		}\n" +
	// "	}\n" +
	// "\n" +
	// "	private static void throwRuntime() {\n" +
	// "		throw new RuntimeException(\"error\");\n" +
	// "	}\n" +
	// "\n" +
	// "	private static void clean() {\n" +
	// "		System.out.print(\"[clean]\");\n" +
	// "	}\n" +
	// "\n" +
	// "	public static void main(String[] args) {\n" +
	// "		try {\n" +
	// "			scenario();\n" +
	// "		} catch(Exception e){\n" +
	// "			System.out.println(\"[end]\");\n" +
	// "		}\n" +
	// "	}\n" +
	// "\n" +
	// "}\n",
	// },
	// "[i: 1][finally][clean][end]");
	//	
	// // if (this.complianceLevel.compareTo(COMPLIANCE_1_6) >= 0) return;
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).inlineJsrBytecode
	// ? "  // Method descriptor #15 ()I\n" +
	// "  // Stack: 4, Locals: 4\n" +
	// "  private static int scenario();\n" +
	// "      0  iconst_1\n" +
	// "      1  istore_0 [i]\n" +
	// "      2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "      5  new java.lang.StringBuilder [22]\n" +
	// "      8  dup\n" +
	// "      9  ldc <String \"[i: \"> [24]\n" +
	// "     11  invokespecial java.lang.StringBuilder(java.lang.String) [26]\n"
	// +
	// "     14  iload_0 [i]\n" +
	// "     15  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]\n"
	// +
	// "     18  ldc <String \"]\"> [33]\n" +
	// "     20  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [35]\n"
	// +
	// "     23  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "     26  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     29  iload_0 [i]\n" +
	// "     30  iconst_5\n" +
	// "     31  if_icmple 61\n" +
	// "     34  iload_0 [i]\n" +
	// "     35  istore_2\n" +
	// "     36  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     39  ldc <String \"[finally]\"> [47]\n" +
	// "     41  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     44  invokestatic X.throwRuntime() : void [49]\n" +
	// "     47  goto 56\n" +
	// "     50  astore_3\n" +
	// "     51  invokestatic X.clean() : void [52]\n" +
	// "     54  aload_3\n" +
	// "     55  athrow\n" +
	// "     56  invokestatic X.clean() : void [52]\n" +
	// "     59  iload_2\n" +
	// "     60  ireturn\n" +
	// "     61  iload_0 [i]\n" +
	// "     62  ineg\n" +
	// "     63  istore_2\n" +
	// "     64  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     67  ldc <String \"[finally]\"> [47]\n" +
	// "     69  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     72  invokestatic X.throwRuntime() : void [49]\n" +
	// "     75  goto 84\n" +
	// "     78  astore_3\n" +
	// "     79  invokestatic X.clean() : void [52]\n" +
	// "     82  aload_3\n" +
	// "     83  athrow\n" +
	// "     84  invokestatic X.clean() : void [52]\n" +
	// "     87  iload_2\n" +
	// "     88  ireturn\n" +
	// "     89  astore_0 [e]\n" +
	// "     90  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     93  ldc <String \"[WRONG CATCH]\"> [55]\n" +
	// "     95  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     98  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    101  ldc <String \"[finally]\"> [47]\n" +
	// "    103  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "    106  invokestatic X.throwRuntime() : void [49]\n" +
	// "    109  goto 118\n" +
	// "    112  astore_3\n" +
	// "    113  invokestatic X.clean() : void [52]\n" +
	// "    116  aload_3\n" +
	// "    117  athrow\n" +
	// "    118  invokestatic X.clean() : void [52]\n" +
	// "    121  iconst_2\n" +
	// "    122  ireturn\n" +
	// "    123  astore_1\n" +
	// "    124  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    127  ldc <String \"[finally]\"> [47]\n" +
	// "    129  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "    132  invokestatic X.throwRuntime() : void [49]\n" +
	// "    135  goto 144\n" +
	// "    138  astore_3\n" +
	// "    139  invokestatic X.clean() : void [52]\n" +
	// "    142  aload_3\n" +
	// "    143  athrow\n" +
	// "    144  invokestatic X.clean() : void [52]\n" +
	// "    147  aload_1\n" +
	// "    148  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 44, pc: 50] -> 50 when : any\n" +
	// "        [pc: 72, pc: 78] -> 78 when : any\n" +
	// "        [pc: 0, pc: 36] -> 89 when : java.lang.Exception\n" +
	// "        [pc: 61, pc: 64] -> 89 when : java.lang.Exception\n" +
	// "        [pc: 106, pc: 112] -> 112 when : any\n" +
	// "        [pc: 0, pc: 36] -> 123 when : any\n" +
	// "        [pc: 61, pc: 64] -> 123 when : any\n" +
	// "        [pc: 89, pc: 98] -> 123 when : any\n" +
	// "        [pc: 132, pc: 138] -> 138 when : any\n"
	// : "  // Method descriptor #15 ()I\n" +
	// "  // Stack: 4, Locals: 6\n" +
	// "  private static int scenario();\n" +
	// "      0  iconst_1\n" +
	// "      1  istore_0 [i]\n" +
	// "      2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "      5  new java.lang.StringBuffer [22]\n" +
	// "      8  dup\n" +
	// "      9  ldc <String \"[i: \"> [24]\n" +
	// "     11  invokespecial java.lang.StringBuffer(java.lang.String) [26]\n"
	// +
	// "     14  iload_0 [i]\n" +
	// "     15  invokevirtual java.lang.StringBuffer.append(int) : java.lang.StringBuffer [29]\n"
	// +
	// "     18  ldc <String \"]\"> [33]\n" +
	// "     20  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [35]\n"
	// +
	// "     23  invokevirtual java.lang.StringBuffer.toString() : java.lang.String [38]\n"
	// +
	// "     26  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     29  iload_0 [i]\n" +
	// "     30  iconst_5\n" +
	// "     31  if_icmple 41\n" +
	// "     34  iload_0 [i]\n" +
	// "     35  istore_3\n" +
	// "     36  jsr 69\n" +
	// "     39  iload_3\n" +
	// "     40  ireturn\n" +
	// "     41  iload_0 [i]\n" +
	// "     42  ineg\n" +
	// "     43  istore_3\n" +
	// "     44  jsr 69\n" +
	// "     47  iload_3\n" +
	// "     48  ireturn\n" +
	// "     49  astore_0 [e]\n" +
	// "     50  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     53  ldc <String \"[WRONG CATCH]\"> [47]\n" +
	// "     55  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     58  jsr 69\n" +
	// "     61  iconst_2\n" +
	// "     62  ireturn\n" +
	// "     63  astore_2\n" +
	// "     64  jsr 69\n" +
	// "     67  aload_2\n" +
	// "     68  athrow\n" +
	// "     69  astore_1\n" +
	// "     70  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     73  ldc <String \"[finally]\"> [49]\n" +
	// "     75  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     78  invokestatic X.throwRuntime() : void [51]\n" +
	// "     81  goto 99\n" +
	// "     84  astore 5\n" +
	// "     86  jsr 92\n" +
	// "     89  aload 5\n" +
	// "     91  athrow\n" +
	// "     92  astore 4\n" +
	// "     94  invokestatic X.clean() : void [54]\n" +
	// "     97  ret 4\n" +
	// "     99  jsr 92\n" +
	// "    102  ret 1\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 39] -> 49 when : java.lang.Exception\n" +
	// "        [pc: 41, pc: 47] -> 49 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 39] -> 63 when : any\n" +
	// "        [pc: 41, pc: 47] -> 63 when : any\n" +
	// "        [pc: 49, pc: 61] -> 63 when : any\n" +
	// "        [pc: 78, pc: 84] -> 84 when : any\n" +
	// "        [pc: 99, pc: 102] -> 84 when : any\n";
	//
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853 - variation
	public void test035() {
		this.runConformTest(
				new String[] {
						"X.java",
						"public class X {\n"
								+ "	public static void main(String[] args) {\n"
								+ "		try {\n" + "			new X().bar();\n"
								+ "		} catch(Exception e){\n"
								+ "			System.out.println(\"[end]\");\n"
								+ "		}\n" + "	}\n" + "	Object bar() {\n"
								+ "		try {\n"
								+ "			System.out.print(\"[try]\");\n"
								+ "			return this;\n"
								+ "		} catch(Exception e){\n"
								+ "			System.out.print(\"[WRONG CATCH]\");\n"
								+ "		} finally {\n"
								+ "			System.out.print(\"[finally]\");\n"
								+ "			foo();\n" + "		}\n" + "		return this;\n"
								+ "	}\n" + "	Object foo() {\n"
								+ "		throw new RuntimeException();\n" + "	}\n"
								+ "}\n", }, "[try][finally][end]");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853 - variation
	public void test036() {
		this.runConformTest(
				new String[] {
						"X.java",
						"public class X {\n"
								+ "	public static void main(String[] args) {\n"
								+ "		try {\n" + "			new X().bar();\n"
								+ "		} catch(Exception e){\n"
								+ "			System.out.println(\"[end]\");\n"
								+ "		}\n" + "	}\n" + "	Object bar() {\n"
								+ "		try {\n"
								+ "			System.out.print(\"[try]\");\n"
								+ "			throw new RuntimeException();\n"
								+ "		} catch(Exception e){\n"
								+ "			System.out.print(\"[catch]\");\n"
								+ "			return this;\n" + "		} finally {\n"
								+ "			System.out.print(\"[finally]\");\n"
								+ "			foo();\n" + "		}\n" + "	}\n"
								+ "	Object foo() {\n"
								+ "		throw new RuntimeException();\n" + "	}\n"
								+ "}\n", }, "[try][catch][finally][end]");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853 - variation
	public void test037() {
		this
				.runConformTest(
						new String[] {
								"X.java",
								"public class X {\n"
										+ "\n"
										+ "	public static void main(String[] args) {\n"
										+ "		try {\n"
										+ "			scenario();\n"
										+ "		} catch(Exception e){\n"
										+ "			System.out.println(\"[end]\");\n"
										+ "		}\n"
										+ "	}\n"
										+ "\n"
										+ "	private static void scenario() throws Exception {\n"
										+ "		try {\n"
										+ "			System.out.print(\"[try1]\");\n"
										+ "			try {\n"
										+ "				System.out.print(\"[try2]\");\n"
										+ "				return;\n"
										+ "			} catch(Exception e) {\n"
										+ "				System.out.print(\"[catch2]\");\n"
										+ "			} finally {\n"
										+ "				System.out.print(\"[finally2]\");\n"
										+ "				throwRuntime();\n"
										+ "			}\n"
										+ "		} catch(Exception e) {\n"
										+ "			System.out.print(\"[catch1]\");\n"
										+ "			throw e;\n"
										+ "		} finally {\n"
										+ "			System.out.print(\"[finally1]\");\n"
										+ "		}\n"
										+ "	}\n"
										+ "\n"
										+ "	private static void throwRuntime() {\n"
										+ "		throw new RuntimeException(\"error\");\n"
										+ "	}\n" + "}\n", },
						"[try1][try2][finally2][catch1][finally1][end]");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=87423
	public void test038() {
		this.runConformTest(new String[] {
				"X.java",
				"public class X {\n" + "\n" + "	int hasLoop() {\n"
						+ "		int l, m, n;\n" + "		for (m = 0; m < 10; m++) {\n"
						+ "			n = 2;\n" + "			try {\n" + "				n = 3;\n"
						+ "				try {\n" + "					n = 4;\n"
						+ "				} catch (ArithmeticException e1) {\n"
						+ "					n = 11;\n" + "				} finally {\n"
						+ "					for (l = 0; l < 10; l++) {\n" + "						n++;\n"
						+ "					}\n" + "					if (n == 12) {\n"
						+ "						n = 13;\n" + "						break;\n" + "					}\n"
						+ "					n = 15;\n" + "				}\n"
						+ "			} catch (OutOfMemoryError e2) {\n"
						+ "				n = 18;\n" + "			}\n" + "		}\n"
						+ "		return 0;\n" + "	}\n" + "\n"
						+ "	public static void main(String args[]) {\n"
						+ "      System.out.println(\"Loaded fine\");\n"
						+ "   }\n" + "}\n", }, "Loaded fine");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=127603
	public void test039() {
		this
				.runConformTest(
						new String[] {
								"X.java",
								"public class X {\n"
										+ "	public static void someMethod() {\n"
										+ "		int count = 0;\n"
										+ "		int code = -1;\n"
										+ "		while (count < 2 && (code == -1 || code == 2)) {\n"
										+ "			count++;\n"
										+ "			try {\n"
										+ "				{\n"
										+ "					System.out.print(\"[Try:\" + count + \";\" + code+\"]\");\n"
										+ "				}\n"
										+ "				code = 0;\n"
										+ "\n"
										+ "			} finally {\n"
										+ "				System.out.print(\"[Finally\" + count + \";\" + code+\"]\");\n"
										+ "			}\n"
										+ "		}\n"
										+ "		System.out.print(\"[Outering\");\n"
										+ "\n"
										+ "		if (code == 0) {\n"
										+ "			System.out.print(\"[Return:\" + count + \";\" + code+\"]\");\n"
										+ "			return;\n"
										+ "		}\n"
										+ "		throw new RuntimeException(null + \"a\");\n"
										+ "	}\n"
										+ "\n"
										+ "	public static void main(String[] args) throws Exception {\n"
										+ "		for (int i = 0; i < 1; i++) {\n"
										+ "			someMethod();\n"
										+ "			System.out.println();\n"
										+ "		}\n" + "	}\n" + "}\n", },
						"[Try:1;-1][Finally1;0][Outering[Return:1;0]");
	}

	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705
	// public void test040() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public void foo(boolean b) {\n" +
	// "		try { \n" +
	// "			if (b){ \n" +
	// "				int i = 0;\n" +
	// "				return;\n" +
	// "			} else {\n" +
	// "				Object o = null;\n" +
	// "				return;\n" +
	// "			}\n" +
	// "		} finally {\n" +
	// "			System.out.println(\"done\");\n" +
	// "		}\n" +
	// "	}\n" +
	// "	public static void main(String[] args) {\n" +
	// "		new X().foo(true);\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "done");
	//	
	// CompilerOptions compilerOptions = new
	// CompilerOptions(this.getCompilerOptions());
	// String expectedOutput = !compilerOptions.inlineJsrBytecode
	// ? "  // Method descriptor #15 (Z)V\n" +
	// "  // Stack: 2, Locals: 5\n" +
	// "  public void foo(boolean b);\n" +
	// "     0  iload_1 [b]\n" +
	// "     1  ifeq 10\n" +
	// "     4  iconst_0\n" +
	// "     5  istore_2 [i]\n" +
	// "     6  jsr 23\n" +
	// "     9  return\n" +
	// "    10  aconst_null\n" +
	// "    11  astore_2 [o]\n" +
	// "    12  goto 6\n" +
	// "    15  astore 4\n" +
	// "    17  jsr 23\n" +
	// "    20  aload 4\n" +
	// "    22  athrow\n" +
	// "    23  astore_3\n" +
	// "    24  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    27  ldc <String \"done\"> [22]\n" +
	// "    29  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    32  ret 3\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 9] -> 15 when : any\n" +
	// "        [pc: 10, pc: 15] -> 15 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 4, line: 5]\n" +
	// "        [pc: 6, line: 6]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 12, line: 9]\n" +
	// "        [pc: 15, line: 11]\n" +
	// "        [pc: 20, line: 13]\n" +
	// "        [pc: 23, line: 11]\n" +
	// "        [pc: 24, line: 12]\n" +
	// "        [pc: 32, line: 13]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 34] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 34] local: b index: 1 type: boolean\n" +
	// "        [pc: 6, pc: 10] local: i index: 2 type: int\n" +
	// "        [pc: 12, pc: 15] local: o index: 2 type: java.lang.Object\n"
	// : null;
	// if (expectedOutput == null) {
	// if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
	// expectedOutput = "  // Method descriptor #15 (Z)V\n" +
	// "  // Stack: 2, Locals: 4\n" +
	// "  public void foo(boolean b);\n" +
	// "     0  iload_1 [b]\n" +
	// "     1  ifeq 15\n" +
	// "     4  iconst_0\n" +
	// "     5  istore_2 [i]\n" +
	// "     6  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     9  ldc <String \"done\"> [22]\n" +
	// "    11  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    14  return\n" +
	// "    15  aconst_null\n" +
	// "    16  astore_2 [o]\n" +
	// "    17  goto 6\n" +
	// "    20  astore_3\n" +
	// "    21  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    24  ldc <String \"done\"> [22]\n" +
	// "    26  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    29  aload_3\n" +
	// "    30  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 6] -> 20 when : any\n" +
	// "        [pc: 15, pc: 20] -> 20 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 4, line: 5]\n" +
	// "        [pc: 6, line: 12]\n" +
	// "        [pc: 14, line: 6]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 17, line: 9]\n" +
	// "        [pc: 20, line: 11]\n" +
	// "        [pc: 21, line: 12]\n" +
	// "        [pc: 29, line: 13]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 31] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 31] local: b index: 1 type: boolean\n" +
	// "        [pc: 6, pc: 15] local: i index: 2 type: int\n" +
	// "        [pc: 17, pc: 20] local: o index: 2 type: java.lang.Object\n";
	// } else {
	// expectedOutput = "  // Method descriptor #15 (Z)V\n" +
	// "  // Stack: 2, Locals: 4\n" +
	// "  public void foo(boolean b);\n" +
	// "     0  iload_1 [b]\n" +
	// "     1  ifeq 15\n" +
	// "     4  iconst_0\n" +
	// "     5  istore_2 [i]\n" +
	// "     6  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     9  ldc <String \"done\"> [22]\n" +
	// "    11  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    14  return\n" +
	// "    15  aconst_null\n" +
	// "    16  astore_2 [o]\n" +
	// "    17  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    20  ldc <String \"done\"> [22]\n" +
	// "    22  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    25  return\n" +
	// "    26  astore_3\n" +
	// "    27  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    30  ldc <String \"done\"> [22]\n" +
	// "    32  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    35  aload_3\n" +
	// "    36  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 6] -> 26 when : any\n" +
	// "        [pc: 15, pc: 17] -> 26 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 4, line: 5]\n" +
	// "        [pc: 6, line: 12]\n" +
	// "        [pc: 14, line: 6]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 17, line: 12]\n" +
	// "        [pc: 25, line: 9]\n" +
	// "        [pc: 26, line: 11]\n" +
	// "        [pc: 27, line: 12]\n" +
	// "        [pc: 35, line: 13]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 37] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 37] local: b index: 1 type: boolean\n" +
	// "        [pc: 6, pc: 15] local: i index: 2 type: int\n" +
	// "        [pc: 17, pc: 26] local: o index: 2 type: java.lang.Object\n" +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 15, same]\n" +
	// "        [pc: 26, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
	// }
	// }
	//
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705 - variation
	// public void test041() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public void foo(boolean b) {\n" +
	// "		try { \n" +
	// "			int i = 0;\n" +
	// "			return;\n" +
	// "		} catch(Exception e) {\n" +
	// "			return;\n" +
	// "		} finally {\n" +
	// "			System.out.println(\"done\");\n" +
	// "		}\n" +
	// "	}\n" +
	// "	public static void main(String[] args) {\n" +
	// "		new X().foo(true);\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "done");
	//	
	// CompilerOptions compilerOptions = new
	// CompilerOptions(this.getCompilerOptions());
	// String expectedOutput = !compilerOptions.inlineJsrBytecode
	// ? "  // Method descriptor #15 (Z)V\n" +
	// "  // Stack: 2, Locals: 5\n" +
	// "  public void foo(boolean b);\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_2 [i]\n" +
	// "     2  jsr 18\n" +
	// "     5  return\n" +
	// "     6  astore_2 [e]\n" +
	// "     7  goto 2\n" +
	// "    10  astore 4\n" +
	// "    12  jsr 18\n" +
	// "    15  aload 4\n" +
	// "    17  athrow\n" +
	// "    18  astore_3\n" +
	// "    19  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    22  ldc <String \"done\"> [22]\n" +
	// "    24  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    27  ret 3\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 5] -> 6 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 5] -> 10 when : any\n" +
	// "        [pc: 6, pc: 10] -> 10 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 2, line: 5]\n" +
	// "        [pc: 6, line: 6]\n" +
	// "        [pc: 7, line: 7]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 15, line: 10]\n" +
	// "        [pc: 18, line: 8]\n" +
	// "        [pc: 19, line: 9]\n" +
	// "        [pc: 27, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 29] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 29] local: b index: 1 type: boolean\n" +
	// "        [pc: 2, pc: 6] local: i index: 2 type: int\n" +
	// "        [pc: 7, pc: 10] local: e index: 2 type: java.lang.Exception\n"
	// : null;
	// if (expectedOutput == null) {
	// if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
	// expectedOutput = "  // Method descriptor #15 (Z)V\n" +
	// "  // Stack: 2, Locals: 4\n" +
	// "  public void foo(boolean b);\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_2 [i]\n" +
	// "     2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     5  ldc <String \"done\"> [22]\n" +
	// "     7  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    10  return\n" +
	// "    11  astore_2 [e]\n" +
	// "    12  goto 2\n" +
	// "    15  astore_3\n" +
	// "    16  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    19  ldc <String \"done\"> [22]\n" +
	// "    21  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    24  aload_3\n" +
	// "    25  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 2] -> 11 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 2] -> 15 when : any\n" +
	// "        [pc: 11, pc: 15] -> 15 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 2, line: 9]\n" +
	// "        [pc: 10, line: 5]\n" +
	// "        [pc: 11, line: 6]\n" +
	// "        [pc: 12, line: 7]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 16, line: 9]\n" +
	// "        [pc: 24, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 26] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 26] local: b index: 1 type: boolean\n" +
	// "        [pc: 2, pc: 11] local: i index: 2 type: int\n" +
	// "        [pc: 12, pc: 15] local: e index: 2 type: java.lang.Exception\n";
	// } else {
	// expectedOutput = "  // Method descriptor #15 (Z)V\n" +
	// "  // Stack: 2, Locals: 4\n" +
	// "  public void foo(boolean b);\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_2 [i]\n" +
	// "     2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     5  ldc <String \"done\"> [22]\n" +
	// "     7  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    10  return\n" +
	// "    11  astore_2 [e]\n" +
	// "    12  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    15  ldc <String \"done\"> [22]\n" +
	// "    17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    20  return\n" +
	// "    21  astore_3\n" +
	// "    22  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    25  ldc <String \"done\"> [22]\n" +
	// "    27  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n"
	// +
	// "    30  aload_3\n" +
	// "    31  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 2] -> 11 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 2] -> 21 when : any\n" +
	// "        [pc: 11, pc: 12] -> 21 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 2, line: 9]\n" +
	// "        [pc: 10, line: 5]\n" +
	// "        [pc: 11, line: 6]\n" +
	// "        [pc: 12, line: 9]\n" +
	// "        [pc: 20, line: 7]\n" +
	// "        [pc: 21, line: 8]\n" +
	// "        [pc: 22, line: 9]\n" +
	// "        [pc: 30, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 32] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 32] local: b index: 1 type: boolean\n" +
	// "        [pc: 2, pc: 11] local: i index: 2 type: int\n" +
	// "        [pc: 12, pc: 21] local: e index: 2 type: java.lang.Exception\n"
	// +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 11, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 21, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
	// }
	// }
	//
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705 - variation
	// public void test042() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// " public class X {\n" +
	// " public static void main(String[] args) {\n" +
	// "		System.out.println(new X().foo(args));\n" +
	// "	}\n" +
	// "	String foo(String[] args) {\n" +
	// "		try {\n" +
	// "			if (args == null) return \"KO\";\n" +
	// "			switch(args.length) {\n" +
	// "			case 0:\n" +
	// "				return \"OK\";\n" +
	// "			case 1:\n" +
	// "				return \"KO\";\n" +
	// "			case 3:\n" +
	// "				return \"OK\";\n" +
	// "			default:\n" +
	// "				return \"KO\";\n" +
	// "			}\n" +
	// "		} finally {\n" +
	// "			System.out.print(\"FINALLY:\");\n" +
	// "		}\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "FINALLY:OK");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).inlineJsrBytecode
	// ? "  // Method descriptor #26 ([Ljava/lang/String;)Ljava/lang/String;\n"
	// +
	// "  // Stack: 2, Locals: 3\n" +
	// "  java.lang.String foo(java.lang.String[] args);\n" +
	// "     0  aload_1 [args]\n" +
	// "     1  ifnonnull 15\n" +
	// "     4  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "     7  ldc <String \"FINALLY:\"> [35]\n" +
	// "     9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n"
	// +
	// "    12  ldc <String \"KO\"> [40]\n" +
	// "    14  areturn\n" +
	// "    15  aload_1 [args]\n" +
	// "    16  arraylength\n" +
	// "    17  tableswitch default: 65\n" +
	// "          case 0: 48\n" +
	// "          case 1: 59\n" +
	// "          case 2: 65\n" +
	// "          case 3: 62\n" +
	// "    48  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    51  ldc <String \"FINALLY:\"> [35]\n" +
	// "    53  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n"
	// +
	// "    56  ldc <String \"OK\"> [42]\n" +
	// "    58  areturn\n" +
	// "    59  goto 4\n" +
	// "    62  goto 48\n" +
	// "    65  goto 4\n" +
	// "    68  astore_2\n" +
	// "    69  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    72  ldc <String \"FINALLY:\"> [35]\n" +
	// "    74  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n"
	// +
	// "    77  aload_2\n" +
	// "    78  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 4] -> 68 when : any\n" +
	// "        [pc: 15, pc: 48] -> 68 when : any\n" +
	// "        [pc: 59, pc: 68] -> 68 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 7]\n" +
	// "        [pc: 4, line: 19]\n" +
	// "        [pc: 12, line: 7]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 48, line: 19]\n" +
	// "        [pc: 56, line: 10]\n" +
	// "        [pc: 59, line: 12]\n" +
	// "        [pc: 62, line: 14]\n" +
	// "        [pc: 65, line: 16]\n" +
	// "        [pc: 68, line: 18]\n" +
	// "        [pc: 69, line: 19]\n" +
	// "        [pc: 77, line: 20]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 79] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 79] local: args index: 1 type: java.lang.String[]\n"
	// : "  // Method descriptor #26 ([Ljava/lang/String;)Ljava/lang/String;\n"
	// +
	// "  // Stack: 2, Locals: 4\n" +
	// "  java.lang.String foo(java.lang.String[] args);\n" +
	// "     0  aload_1 [args]\n" +
	// "     1  ifnonnull 10\n" +
	// "     4  jsr 65\n" +
	// "     7  ldc <String \"KO\"> [35]\n" +
	// "     9  areturn\n" +
	// "    10  aload_1 [args]\n" +
	// "    11  arraylength\n" +
	// "    12  tableswitch default: 56\n" +
	// "          case 0: 44\n" +
	// "          case 1: 50\n" +
	// "          case 2: 56\n" +
	// "          case 3: 53\n" +
	// "    44  jsr 65\n" +
	// "    47  ldc <String \"OK\"> [37]\n" +
	// "    49  areturn\n" +
	// "    50  goto 4\n" +
	// "    53  goto 44\n" +
	// "    56  goto 4\n" +
	// "    59  astore_3\n" +
	// "    60  jsr 65\n" +
	// "    63  aload_3\n" +
	// "    64  athrow\n" +
	// "    65  astore_2\n" +
	// "    66  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    69  ldc <String \"FINALLY:\"> [39]\n" +
	// "    71  invokevirtual java.io.PrintStream.print(java.lang.String) : void [41]\n"
	// +
	// "    74  ret 2\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 59 when : any\n" +
	// "        [pc: 10, pc: 47] -> 59 when : any\n" +
	// "        [pc: 50, pc: 59] -> 59 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 7]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 44, line: 10]\n" +
	// "        [pc: 50, line: 12]\n" +
	// "        [pc: 53, line: 14]\n" +
	// "        [pc: 56, line: 16]\n" +
	// "        [pc: 59, line: 18]\n" +
	// "        [pc: 63, line: 20]\n" +
	// "        [pc: 65, line: 18]\n" +
	// "        [pc: 66, line: 19]\n" +
	// "        [pc: 74, line: 20]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 76] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 76] local: args index: 1 type: java.lang.String[]\n";
	//
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705 - variation
	// public void test043() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public void save() {\n" +
	// "		int a = 3;\n" +
	// "		try {\n" +
	// "			Object warnings = null;\n" +
	// "			Object contexts = null;\n" +
	// "			try {\n" +
	// "				System.out.print(warnings);\n" +
	// "				return;\n" +
	// "			} catch (NullPointerException npe) {\n" +
	// "				System.out.print(contexts);\n" +
	// "				return;\n" +
	// "			} finally {\n" +
	// "				System.out.print(\"#inner -> \" + a);\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "			return;\n" +
	// "		} finally {\n" +
	// "			int var = 0;\n" +
	// "			System.out.println(\"#save -> \" + a);\n" +
	// "		}\n" +
	// "	}\n" +
	// "	public static void main(String[] args) {\n" +
	// "		new X().save();\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "null#inner -> 3#save -> 3");
	//	
	// CompilerOptions compilerOptions = new
	// CompilerOptions(this.getCompilerOptions());
	// String expectedOutput = !compilerOptions.inlineJsrBytecode
	// ? "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 4, Locals: 10\n" +
	// "  public void save();\n" +
	// "      0  iconst_3\n" +
	// "      1  istore_1 [a]\n" +
	// "      2  aconst_null\n" +
	// "      3  astore_2 [warnings]\n" +
	// "      4  aconst_null\n" +
	// "      5  astore_3 [contexts]\n" +
	// "      6  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "      9  aload_2 [warnings]\n" +
	// "     10  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n"
	// +
	// "     13  jsr 40\n" +
	// "     16  jsr 78\n" +
	// "     19  return\n" +
	// "     20  astore 4 [npe]\n" +
	// "     22  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     25  aload_3 [contexts]\n" +
	// "     26  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n"
	// +
	// "     29  goto 13\n" +
	// "     32  astore 6\n" +
	// "     34  jsr 40\n" +
	// "     37  aload 6\n" +
	// "     39  athrow\n" +
	// "     40  astore 5\n" +
	// "     42  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     45  new java.lang.StringBuffer [27]\n" +
	// "     48  dup\n" +
	// "     49  ldc <String \"#inner -> \"> [29]\n" +
	// "     51  invokespecial java.lang.StringBuffer(java.lang.String) [31]\n"
	// +
	// "     54  iload_1 [a]\n" +
	// "     55  invokevirtual java.lang.StringBuffer.append(int) : java.lang.StringBuffer [34]\n"
	// +
	// "     58  invokevirtual java.lang.StringBuffer.toString() : java.lang.String [38]\n"
	// +
	// "     61  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     64  ret 5\n" +
	// "     66  astore_2 [e]\n" +
	// "     67  goto 16\n" +
	// "     70  astore 8\n" +
	// "     72  jsr 78\n" +
	// "     75  aload 8\n" +
	// "     77  athrow\n" +
	// "     78  astore 7\n" +
	// "     80  iconst_0\n" +
	// "     81  istore 9 [var]\n" +
	// "     83  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     86  new java.lang.StringBuffer [27]\n" +
	// "     89  dup\n" +
	// "     90  ldc <String \"#save -> \"> [44]\n" +
	// "     92  invokespecial java.lang.StringBuffer(java.lang.String) [31]\n"
	// +
	// "     95  iload_1 [a]\n" +
	// "     96  invokevirtual java.lang.StringBuffer.append(int) : java.lang.StringBuffer [34]\n"
	// +
	// "     99  invokevirtual java.lang.StringBuffer.toString() : java.lang.String [38]\n"
	// +
	// "    102  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n"
	// +
	// "    105  ret 7\n" +
	// "      Exception Table:\n" +
	// "        [pc: 6, pc: 16] -> 20 when : java.lang.NullPointerException\n" +
	// "        [pc: 6, pc: 16] -> 32 when : any\n" +
	// "        [pc: 20, pc: 32] -> 32 when : any\n" +
	// "        [pc: 2, pc: 19] -> 66 when : java.lang.Exception\n" +
	// "        [pc: 20, pc: 66] -> 66 when : java.lang.Exception\n" +
	// "        [pc: 2, pc: 19] -> 70 when : any\n" +
	// "        [pc: 20, pc: 70] -> 70 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 3]\n" +
	// "        [pc: 2, line: 5]\n" +
	// "        [pc: 4, line: 6]\n" +
	// "        [pc: 6, line: 8]\n" +
	// "        [pc: 13, line: 9]\n" +
	// "        [pc: 20, line: 10]\n" +
	// "        [pc: 22, line: 11]\n" +
	// "        [pc: 29, line: 12]\n" +
	// "        [pc: 32, line: 13]\n" +
	// "        [pc: 37, line: 15]\n" +
	// "        [pc: 40, line: 13]\n" +
	// "        [pc: 42, line: 14]\n" +
	// "        [pc: 64, line: 15]\n" +
	// "        [pc: 66, line: 16]\n" +
	// "        [pc: 67, line: 17]\n" +
	// "        [pc: 70, line: 18]\n" +
	// "        [pc: 75, line: 21]\n" +
	// "        [pc: 78, line: 18]\n" +
	// "        [pc: 80, line: 19]\n" +
	// "        [pc: 83, line: 20]\n" +
	// "        [pc: 105, line: 21]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 107] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 107] local: a index: 1 type: int\n" +
	// "        [pc: 4, pc: 66] local: warnings index: 2 type: java.lang.Object\n"
	// +
	// "        [pc: 6, pc: 66] local: contexts index: 3 type: java.lang.Object\n"
	// +
	// "        [pc: 22, pc: 32] local: npe index: 4 type: java.lang.NullPointerException\n"
	// +
	// "        [pc: 67, pc: 70] local: e index: 2 type: java.lang.Exception\n"
	// +
	// "        [pc: 83, pc: 105] local: var index: 9 type: int\n"
	// : null;
	//
	// if (expectedOutput == null) {
	// if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
	// expectedOutput = "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 4, Locals: 8\n" +
	// "  public void save();\n" +
	// "      0  iconst_3\n" +
	// "      1  istore_1 [a]\n" +
	// "      2  aconst_null\n" +
	// "      3  astore_2 [warnings]\n" +
	// "      4  aconst_null\n" +
	// "      5  astore_3 [contexts]\n" +
	// "      6  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "      9  aload_2 [warnings]\n" +
	// "     10  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n"
	// +
	// "     13  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     16  new java.lang.StringBuilder [27]\n" +
	// "     19  dup\n" +
	// "     20  ldc <String \"#inner -> \"> [29]\n" +
	// "     22  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "     25  iload_1 [a]\n" +
	// "     26  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "     29  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "     32  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     35  iconst_0\n" +
	// "     36  istore 7 [var]\n" +
	// "     38  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     41  new java.lang.StringBuilder [27]\n" +
	// "     44  dup\n" +
	// "     45  ldc <String \"#save -> \"> [44]\n" +
	// "     47  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "     50  iload_1 [a]\n" +
	// "     51  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "     54  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "     57  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n"
	// +
	// "     60  return\n" +
	// "     61  astore 4 [npe]\n" +
	// "     63  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     66  aload_3 [contexts]\n" +
	// "     67  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n"
	// +
	// "     70  goto 13\n" +
	// "     73  astore 5\n" +
	// "     75  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     78  new java.lang.StringBuilder [27]\n" +
	// "     81  dup\n" +
	// "     82  ldc <String \"#inner -> \"> [29]\n" +
	// "     84  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "     87  iload_1 [a]\n" +
	// "     88  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "     91  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "     94  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     97  aload 5\n" +
	// "     99  athrow\n" +
	// "    100  astore_2 [e]\n" +
	// "    101  goto 35\n" +
	// "    104  astore 6\n" +
	// "    106  iconst_0\n" +
	// "    107  istore 7 [var]\n" +
	// "    109  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    112  new java.lang.StringBuilder [27]\n" +
	// "    115  dup\n" +
	// "    116  ldc <String \"#save -> \"> [44]\n" +
	// "    118  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "    121  iload_1 [a]\n" +
	// "    122  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "    125  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "    128  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n"
	// +
	// "    131  aload 6\n" +
	// "    133  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 6, pc: 13] -> 61 when : java.lang.NullPointerException\n" +
	// "        [pc: 6, pc: 13] -> 73 when : any\n" +
	// "        [pc: 61, pc: 73] -> 73 when : any\n" +
	// "        [pc: 2, pc: 35] -> 100 when : java.lang.Exception\n" +
	// "        [pc: 61, pc: 100] -> 100 when : java.lang.Exception\n" +
	// "        [pc: 2, pc: 35] -> 104 when : any\n" +
	// "        [pc: 61, pc: 104] -> 104 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 3]\n" +
	// "        [pc: 2, line: 5]\n" +
	// "        [pc: 4, line: 6]\n" +
	// "        [pc: 6, line: 8]\n" +
	// "        [pc: 13, line: 14]\n" +
	// "        [pc: 35, line: 19]\n" +
	// "        [pc: 38, line: 20]\n" +
	// "        [pc: 60, line: 9]\n" +
	// "        [pc: 61, line: 10]\n" +
	// "        [pc: 63, line: 11]\n" +
	// "        [pc: 70, line: 12]\n" +
	// "        [pc: 73, line: 13]\n" +
	// "        [pc: 75, line: 14]\n" +
	// "        [pc: 97, line: 15]\n" +
	// "        [pc: 100, line: 16]\n" +
	// "        [pc: 101, line: 17]\n" +
	// "        [pc: 104, line: 18]\n" +
	// "        [pc: 106, line: 19]\n" +
	// "        [pc: 109, line: 20]\n" +
	// "        [pc: 131, line: 21]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 134] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 134] local: a index: 1 type: int\n" +
	// "        [pc: 4, pc: 100] local: warnings index: 2 type: java.lang.Object\n"
	// +
	// "        [pc: 6, pc: 100] local: contexts index: 3 type: java.lang.Object\n"
	// +
	// "        [pc: 63, pc: 73] local: npe index: 4 type: java.lang.NullPointerException\n"
	// +
	// "        [pc: 101, pc: 104] local: e index: 2 type: java.lang.Exception\n"
	// +
	// "        [pc: 38, pc: 60] local: var index: 7 type: int\n" +
	// "        [pc: 109, pc: 131] local: var index: 7 type: int\n";
	// } else {
	// expectedOutput = "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 4, Locals: 8\n" +
	// "  public void save();\n" +
	// "      0  iconst_3\n" +
	// "      1  istore_1 [a]\n" +
	// "      2  aconst_null\n" +
	// "      3  astore_2 [warnings]\n" +
	// "      4  aconst_null\n" +
	// "      5  astore_3 [contexts]\n" +
	// "      6  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "      9  aload_2 [warnings]\n" +
	// "     10  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n"
	// +
	// "     13  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     16  new java.lang.StringBuilder [27]\n" +
	// "     19  dup\n" +
	// "     20  ldc <String \"#inner -> \"> [29]\n" +
	// "     22  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "     25  iload_1 [a]\n" +
	// "     26  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "     29  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "     32  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     35  iconst_0\n" +
	// "     36  istore 7 [var]\n" +
	// "     38  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     41  new java.lang.StringBuilder [27]\n" +
	// "     44  dup\n" +
	// "     45  ldc <String \"#save -> \"> [44]\n" +
	// "     47  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "     50  iload_1 [a]\n" +
	// "     51  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "     54  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "     57  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n"
	// +
	// "     60  return\n" +
	// "     61  astore 4 [npe]\n" +
	// "     63  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     66  aload_3 [contexts]\n" +
	// "     67  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n"
	// +
	// "     70  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     73  new java.lang.StringBuilder [27]\n" +
	// "     76  dup\n" +
	// "     77  ldc <String \"#inner -> \"> [29]\n" +
	// "     79  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "     82  iload_1 [a]\n" +
	// "     83  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "     86  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "     89  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "     92  iconst_0\n" +
	// "     93  istore 7 [var]\n" +
	// "     95  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     98  new java.lang.StringBuilder [27]\n" +
	// "    101  dup\n" +
	// "    102  ldc <String \"#save -> \"> [44]\n" +
	// "    104  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "    107  iload_1 [a]\n" +
	// "    108  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "    111  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "    114  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n"
	// +
	// "    117  return\n" +
	// "    118  astore 5\n" +
	// "    120  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    123  new java.lang.StringBuilder [27]\n" +
	// "    126  dup\n" +
	// "    127  ldc <String \"#inner -> \"> [29]\n" +
	// "    129  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "    132  iload_1 [a]\n" +
	// "    133  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "    136  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "    139  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n"
	// +
	// "    142  aload 5\n" +
	// "    144  athrow\n" +
	// "    145  astore_2 [e]\n" +
	// "    146  iconst_0\n" +
	// "    147  istore 7 [var]\n" +
	// "    149  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    152  new java.lang.StringBuilder [27]\n" +
	// "    155  dup\n" +
	// "    156  ldc <String \"#save -> \"> [44]\n" +
	// "    158  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "    161  iload_1 [a]\n" +
	// "    162  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "    165  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "    168  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n"
	// +
	// "    171  return\n" +
	// "    172  astore 6\n" +
	// "    174  iconst_0\n" +
	// "    175  istore 7 [var]\n" +
	// "    177  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    180  new java.lang.StringBuilder [27]\n" +
	// "    183  dup\n" +
	// "    184  ldc <String \"#save -> \"> [44]\n" +
	// "    186  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n"
	// +
	// "    189  iload_1 [a]\n" +
	// "    190  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n"
	// +
	// "    193  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n"
	// +
	// "    196  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n"
	// +
	// "    199  aload 6\n" +
	// "    201  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 6, pc: 13] -> 61 when : java.lang.NullPointerException\n" +
	// "        [pc: 6, pc: 13] -> 118 when : any\n" +
	// "        [pc: 61, pc: 70] -> 118 when : any\n" +
	// "        [pc: 2, pc: 35] -> 145 when : java.lang.Exception\n" +
	// "        [pc: 61, pc: 92] -> 145 when : java.lang.Exception\n" +
	// "        [pc: 118, pc: 145] -> 145 when : java.lang.Exception\n" +
	// "        [pc: 2, pc: 35] -> 172 when : any\n" +
	// "        [pc: 61, pc: 92] -> 172 when : any\n" +
	// "        [pc: 118, pc: 146] -> 172 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 3]\n" +
	// "        [pc: 2, line: 5]\n" +
	// "        [pc: 4, line: 6]\n" +
	// "        [pc: 6, line: 8]\n" +
	// "        [pc: 13, line: 14]\n" +
	// "        [pc: 35, line: 19]\n" +
	// "        [pc: 38, line: 20]\n" +
	// "        [pc: 60, line: 9]\n" +
	// "        [pc: 61, line: 10]\n" +
	// "        [pc: 63, line: 11]\n" +
	// "        [pc: 70, line: 14]\n" +
	// "        [pc: 92, line: 19]\n" +
	// "        [pc: 95, line: 20]\n" +
	// "        [pc: 117, line: 12]\n" +
	// "        [pc: 118, line: 13]\n" +
	// "        [pc: 120, line: 14]\n" +
	// "        [pc: 142, line: 15]\n" +
	// "        [pc: 145, line: 16]\n" +
	// "        [pc: 146, line: 19]\n" +
	// "        [pc: 149, line: 20]\n" +
	// "        [pc: 171, line: 17]\n" +
	// "        [pc: 172, line: 18]\n" +
	// "        [pc: 174, line: 19]\n" +
	// "        [pc: 177, line: 20]\n" +
	// "        [pc: 199, line: 21]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 202] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 202] local: a index: 1 type: int\n" +
	// "        [pc: 4, pc: 145] local: warnings index: 2 type: java.lang.Object\n"
	// +
	// "        [pc: 6, pc: 145] local: contexts index: 3 type: java.lang.Object\n"
	// +
	// "        [pc: 63, pc: 118] local: npe index: 4 type: java.lang.NullPointerException\n"
	// +
	// "        [pc: 146, pc: 172] local: e index: 2 type: java.lang.Exception\n"
	// +
	// "        [pc: 38, pc: 60] local: var index: 7 type: int\n" +
	// "        [pc: 95, pc: 117] local: var index: 7 type: int\n" +
	// "        [pc: 149, pc: 171] local: var index: 7 type: int\n" +
	// "        [pc: 177, pc: 199] local: var index: 7 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 61, full, stack: {java.lang.NullPointerException}, locals: {X, int, java.lang.Object, java.lang.Object}]\n"
	// +
	// "        [pc: 118, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n"
	// +
	// "        [pc: 145, full, stack: {java.lang.Exception}, locals: {X, int}]\n"
	// +
	// "        [pc: 172, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
	// }
	// }
	//
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=129305
	// public void test044() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public static void main(String[] args) {\n" +
	// "		foo();\n" +
	// "	}  \n" +
	// "	static Object foo() {\n" +
	// "		try {\n" +
	// "			return null;\n" +
	// "		} catch(Exception e) {\n" +
	// "			return null;\n" +
	// "		} finally {\n" +
	// "			System.out.println(\"SUCCESS\");\n" +
	// "		}\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "SUCCESS");
	//	
	// CompilerOptions compilerOptions = new
	// CompilerOptions(this.getCompilerOptions());
	// String expectedOutput = !compilerOptions.inlineJsrBytecode ?
	// "  // Method descriptor #19 ()Ljava/lang/Object;\n" +
	// "  // Stack: 2, Locals: 3\n" +
	// "  static java.lang.Object foo();\n" +
	// "     0  jsr 15\n" +
	// "     3  aconst_null\n" +
	// "     4  areturn\n" +
	// "     5  astore_0 [e]\n" +
	// "     6  goto 0\n" +
	// "     9  astore_2\n" +
	// "    10  jsr 15\n" +
	// "    13  aload_2\n" +
	// "    14  athrow\n" +
	// "    15  astore_1\n" +
	// "    16  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
	// "    19  ldc <String \"SUCCESS\"> [28]\n" +
	// "    21  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n"
	// +
	// "    24  ret 1\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 3] -> 5 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 3] -> 9 when : any\n" +
	// "        [pc: 5, pc: 9] -> 9 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 7]\n" +
	// "        [pc: 5, line: 8]\n" +
	// "        [pc: 6, line: 9]\n" +
	// "        [pc: 9, line: 10]\n" +
	// "        [pc: 13, line: 12]\n" +
	// "        [pc: 15, line: 10]\n" +
	// "        [pc: 16, line: 11]\n" +
	// "        [pc: 24, line: 12]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 6, pc: 9] local: e index: 0 type: java.lang.Exception\n"
	// : null;
	//
	// if (expectedOutput == null) {
	// if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
	// expectedOutput = "  // Method descriptor #19 ()Ljava/lang/Object;\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  static java.lang.Object foo();\n" +
	// "     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
	// "     3  ldc <String \"SUCCESS\"> [28]\n" +
	// "     5  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n"
	// +
	// "     8  aconst_null\n" +
	// "     9  areturn\n" +
	// "    10  astore_0 [e]\n" +
	// "    11  goto 0\n" +
	// "    14  astore_1\n" +
	// "    15  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
	// "    18  ldc <String \"SUCCESS\"> [28]\n" +
	// "    20  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n"
	// +
	// "    23  aload_1\n" +
	// "    24  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 10, pc: 14] -> 14 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 11]\n" +
	// "        [pc: 8, line: 7]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 11, line: 9]\n" +
	// "        [pc: 14, line: 10]\n" +
	// "        [pc: 15, line: 11]\n" +
	// "        [pc: 23, line: 12]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 11, pc: 14] local: e index: 0 type: java.lang.Exception\n";
	// } else {
	// expectedOutput = "  // Method descriptor #19 ()Ljava/lang/Object;\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  static java.lang.Object foo();\n" +
	// "     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
	// "     3  ldc <String \"SUCCESS\"> [28]\n" +
	// "     5  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n"
	// +
	// "     8  aconst_null\n" +
	// "     9  areturn\n" +
	// "    10  astore_0 [e]\n" +
	// "    11  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
	// "    14  ldc <String \"SUCCESS\"> [28]\n" +
	// "    16  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n"
	// +
	// "    19  aconst_null\n" +
	// "    20  areturn\n" +
	// "    21  astore_1\n" +
	// "    22  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
	// "    25  ldc <String \"SUCCESS\"> [28]\n" +
	// "    27  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n"
	// +
	// "    30  aload_1\n" +
	// "    31  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 10, pc: 11] -> 21 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 11]\n" +
	// "        [pc: 8, line: 7]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 11, line: 11]\n" +
	// "        [pc: 19, line: 9]\n" +
	// "        [pc: 21, line: 10]\n" +
	// "        [pc: 22, line: 11]\n" +
	// "        [pc: 30, line: 12]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 11, pc: 21] local: e index: 0 type: java.lang.Exception\n"
	// +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 10, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 21, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
	// }
	// }
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=129306
	// public void test045() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public void save() {\n" +
	// "		try {\n" +
	// "			Object warnings = null;\n" +
	// "			Object contexts = null;\n" +
	// "			try {\n" +
	// "				System.out.print(\"[try]\");\n" +
	// "				System.out.print(warnings); \n" +
	// "				return;\n" +
	// "			} catch (NullPointerException npe) {\n" +
	// "				System.out.print(\"[npe]\");\n" +
	// "				System.out.print(contexts); \n" +
	// "				return;\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "			System.out.print(\"[e]\");\n" +
	// "			return;\n" +
	// "		} finally { \n" +
	// "			int var = 0;\n" +
	// "			System.out.print(\"[finally]\");\n" +
	// "			Object o = null;\n" +
	// "			o.toString();\n" +
	// "		}\n" +
	// "	}\n" +
	// "	public static void main(String[] args) {\n" +
	// "		try {\n" +
	// "			new X().save();\n" +
	// "		} catch(NullPointerException e) {\n" +
	// "			System.out.println(\"[caught npe]\");\n" +
	// "		}\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "[try]null[finally][caught npe]");
	//	
	// CompilerOptions compilerOptions = new
	// CompilerOptions(this.getCompilerOptions());
	// String expectedOutput = !compilerOptions.inlineJsrBytecode
	// ? "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 8\n" +
	// "  public void save();\n" +
	// "     0  aconst_null\n" +
	// "     1  astore_1 [warnings]\n" +
	// "     2  aconst_null\n" +
	// "     3  astore_2 [contexts]\n" +
	// "     4  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     7  ldc <String \"[try]\"> [21]\n" +
	// "     9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    12  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    15  aload_1 [warnings]\n" +
	// "    16  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n"
	// +
	// "    19  jsr 62\n" +
	// "    22  return\n" +
	// "    23  astore_3 [npe]\n" +
	// "    24  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    27  ldc <String \"[npe]\"> [32]\n" +
	// "    29  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    32  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    35  aload_2 [contexts]\n" +
	// "    36  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n"
	// +
	// "    39  goto 19\n" +
	// "    42  astore_1 [e]\n" +
	// "    43  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    46  ldc <String \"[e]\"> [34]\n" +
	// "    48  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    51  goto 19\n" +
	// "    54  astore 5\n" +
	// "    56  jsr 62\n" +
	// "    59  aload 5\n" +
	// "    61  athrow\n" +
	// "    62  astore 4\n" +
	// "    64  iconst_0\n" +
	// "    65  istore 6 [var]\n" +
	// "    67  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    70  ldc <String \"[finally]\"> [36]\n" +
	// "    72  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    75  aconst_null\n" +
	// "    76  astore 7 [o]\n" +
	// "    78  aload 7 [o]\n" +
	// "    80  invokevirtual java.lang.Object.toString() : java.lang.String [38]\n"
	// +
	// "    83  pop\n" +
	// "    84  ret 4\n" +
	// "      Exception Table:\n" +
	// "        [pc: 4, pc: 19] -> 23 when : java.lang.NullPointerException\n" +
	// "        [pc: 0, pc: 22] -> 42 when : java.lang.Exception\n" +
	// "        [pc: 23, pc: 42] -> 42 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 22] -> 54 when : any\n" +
	// "        [pc: 23, pc: 54] -> 54 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 2, line: 5]\n" +
	// "        [pc: 4, line: 7]\n" +
	// "        [pc: 12, line: 8]\n" +
	// "        [pc: 19, line: 9]\n" +
	// "        [pc: 23, line: 10]\n" +
	// "        [pc: 24, line: 11]\n" +
	// "        [pc: 32, line: 12]\n" +
	// "        [pc: 39, line: 13]\n" +
	// "        [pc: 42, line: 15]\n" +
	// "        [pc: 43, line: 16]\n" +
	// "        [pc: 51, line: 17]\n" +
	// "        [pc: 54, line: 18]\n" +
	// "        [pc: 59, line: 23]\n" +
	// "        [pc: 62, line: 18]\n" +
	// "        [pc: 64, line: 19]\n" +
	// "        [pc: 67, line: 20]\n" +
	// "        [pc: 75, line: 21]\n" +
	// "        [pc: 78, line: 22]\n" +
	// "        [pc: 84, line: 23]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 86] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 42] local: warnings index: 1 type: java.lang.Object\n"
	// +
	// "        [pc: 4, pc: 42] local: contexts index: 2 type: java.lang.Object\n"
	// +
	// "        [pc: 24, pc: 42] local: npe index: 3 type: java.lang.NullPointerException\n"
	// +
	// "        [pc: 43, pc: 54] local: e index: 1 type: java.lang.Exception\n"
	// +
	// "        [pc: 67, pc: 84] local: var index: 6 type: int\n" +
	// "        [pc: 78, pc: 84] local: o index: 7 type: java.lang.Object\n"
	// : null;
	//
	// if (expectedOutput == null) {
	// if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
	// expectedOutput = "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 7\n" +
	// "  public void save();\n" +
	// "     0  aconst_null\n" +
	// "     1  astore_1 [warnings]\n" +
	// "     2  aconst_null\n" +
	// "     3  astore_2 [contexts]\n" +
	// "     4  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     7  ldc <String \"[try]\"> [21]\n" +
	// "     9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    12  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    15  aload_1 [warnings]\n" +
	// "    16  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n"
	// +
	// "    19  iconst_0\n" +
	// "    20  istore 5 [var]\n" +
	// "    22  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    25  ldc <String \"[finally]\"> [32]\n" +
	// "    27  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    30  aconst_null\n" +
	// "    31  astore 6 [o]\n" +
	// "    33  aload 6 [o]\n" +
	// "    35  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n"
	// +
	// "    38  pop\n" +
	// "    39  return\n" +
	// "    40  astore_3 [npe]\n" +
	// "    41  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    44  ldc <String \"[npe]\"> [38]\n" +
	// "    46  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    49  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    52  aload_2 [contexts]\n" +
	// "    53  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n"
	// +
	// "    56  goto 19\n" +
	// "    59  astore_1 [e]\n" +
	// "    60  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    63  ldc <String \"[e]\"> [40]\n" +
	// "    65  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    68  goto 19\n" +
	// "    71  astore 4\n" +
	// "    73  iconst_0\n" +
	// "    74  istore 5 [var]\n" +
	// "    76  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    79  ldc <String \"[finally]\"> [32]\n" +
	// "    81  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    84  aconst_null\n" +
	// "    85  astore 6 [o]\n" +
	// "    87  aload 6 [o]\n" +
	// "    89  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n"
	// +
	// "    92  pop\n" +
	// "    93  aload 4\n" +
	// "    95  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 4, pc: 19] -> 40 when : java.lang.NullPointerException\n" +
	// "        [pc: 0, pc: 19] -> 59 when : java.lang.Exception\n" +
	// "        [pc: 40, pc: 59] -> 59 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 19] -> 71 when : any\n" +
	// "        [pc: 40, pc: 71] -> 71 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 2, line: 5]\n" +
	// "        [pc: 4, line: 7]\n" +
	// "        [pc: 12, line: 8]\n" +
	// "        [pc: 19, line: 19]\n" +
	// "        [pc: 22, line: 20]\n" +
	// "        [pc: 30, line: 21]\n" +
	// "        [pc: 33, line: 22]\n" +
	// "        [pc: 39, line: 9]\n" +
	// "        [pc: 40, line: 10]\n" +
	// "        [pc: 41, line: 11]\n" +
	// "        [pc: 49, line: 12]\n" +
	// "        [pc: 56, line: 13]\n" +
	// "        [pc: 59, line: 15]\n" +
	// "        [pc: 60, line: 16]\n" +
	// "        [pc: 68, line: 17]\n" +
	// "        [pc: 71, line: 18]\n" +
	// "        [pc: 73, line: 19]\n" +
	// "        [pc: 76, line: 20]\n" +
	// "        [pc: 84, line: 21]\n" +
	// "        [pc: 87, line: 22]\n" +
	// "        [pc: 93, line: 23]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 96] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 59] local: warnings index: 1 type: java.lang.Object\n"
	// +
	// "        [pc: 4, pc: 59] local: contexts index: 2 type: java.lang.Object\n"
	// +
	// "        [pc: 41, pc: 59] local: npe index: 3 type: java.lang.NullPointerException\n"
	// +
	// "        [pc: 60, pc: 71] local: e index: 1 type: java.lang.Exception\n"
	// +
	// "        [pc: 22, pc: 39] local: var index: 5 type: int\n" +
	// "        [pc: 76, pc: 93] local: var index: 5 type: int\n" +
	// "        [pc: 33, pc: 39] local: o index: 6 type: java.lang.Object\n" +
	// "        [pc: 87, pc: 93] local: o index: 6 type: java.lang.Object\n";
	// } else {
	// expectedOutput = "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 7\n" +
	// "  public void save();\n" +
	// "      0  aconst_null\n" +
	// "      1  astore_1 [warnings]\n" +
	// "      2  aconst_null\n" +
	// "      3  astore_2 [contexts]\n" +
	// "      4  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "      7  ldc <String \"[try]\"> [21]\n" +
	// "      9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "     12  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     15  aload_1 [warnings]\n" +
	// "     16  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n"
	// +
	// "     19  iconst_0\n" +
	// "     20  istore 5 [var]\n" +
	// "     22  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     25  ldc <String \"[finally]\"> [32]\n" +
	// "     27  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "     30  aconst_null\n" +
	// "     31  astore 6 [o]\n" +
	// "     33  aload 6 [o]\n" +
	// "     35  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n"
	// +
	// "     38  pop\n" +
	// "     39  return\n" +
	// "     40  astore_3 [npe]\n" +
	// "     41  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     44  ldc <String \"[npe]\"> [38]\n" +
	// "     46  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "     49  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     52  aload_2 [contexts]\n" +
	// "     53  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n"
	// +
	// "     56  iconst_0\n" +
	// "     57  istore 5 [var]\n" +
	// "     59  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     62  ldc <String \"[finally]\"> [32]\n" +
	// "     64  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "     67  aconst_null\n" +
	// "     68  astore 6 [o]\n" +
	// "     70  aload 6 [o]\n" +
	// "     72  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n"
	// +
	// "     75  pop\n" +
	// "     76  return\n" +
	// "     77  astore_1 [e]\n" +
	// "     78  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     81  ldc <String \"[e]\"> [40]\n" +
	// "     83  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "     86  iconst_0\n" +
	// "     87  istore 5 [var]\n" +
	// "     89  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "     92  ldc <String \"[finally]\"> [32]\n" +
	// "     94  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "     97  aconst_null\n" +
	// "     98  astore 6 [o]\n" +
	// "    100  aload 6 [o]\n" +
	// "    102  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n"
	// +
	// "    105  pop\n" +
	// "    106  return\n" +
	// "    107  astore 4\n" +
	// "    109  iconst_0\n" +
	// "    110  istore 5 [var]\n" +
	// "    112  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
	// "    115  ldc <String \"[finally]\"> [32]\n" +
	// "    117  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n"
	// +
	// "    120  aconst_null\n" +
	// "    121  astore 6 [o]\n" +
	// "    123  aload 6 [o]\n" +
	// "    125  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n"
	// +
	// "    128  pop\n" +
	// "    129  aload 4\n" +
	// "    131  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 4, pc: 19] -> 40 when : java.lang.NullPointerException\n" +
	// "        [pc: 0, pc: 19] -> 77 when : java.lang.Exception\n" +
	// "        [pc: 40, pc: 56] -> 77 when : java.lang.Exception\n" +
	// "        [pc: 0, pc: 19] -> 107 when : any\n" +
	// "        [pc: 40, pc: 56] -> 107 when : any\n" +
	// "        [pc: 77, pc: 86] -> 107 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 2, line: 5]\n" +
	// "        [pc: 4, line: 7]\n" +
	// "        [pc: 12, line: 8]\n" +
	// "        [pc: 19, line: 19]\n" +
	// "        [pc: 22, line: 20]\n" +
	// "        [pc: 30, line: 21]\n" +
	// "        [pc: 33, line: 22]\n" +
	// "        [pc: 39, line: 9]\n" +
	// "        [pc: 40, line: 10]\n" +
	// "        [pc: 41, line: 11]\n" +
	// "        [pc: 49, line: 12]\n" +
	// "        [pc: 56, line: 19]\n" +
	// "        [pc: 59, line: 20]\n" +
	// "        [pc: 67, line: 21]\n" +
	// "        [pc: 70, line: 22]\n" +
	// "        [pc: 76, line: 13]\n" +
	// "        [pc: 77, line: 15]\n" +
	// "        [pc: 78, line: 16]\n" +
	// "        [pc: 86, line: 19]\n" +
	// "        [pc: 89, line: 20]\n" +
	// "        [pc: 97, line: 21]\n" +
	// "        [pc: 100, line: 22]\n" +
	// "        [pc: 106, line: 17]\n" +
	// "        [pc: 107, line: 18]\n" +
	// "        [pc: 109, line: 19]\n" +
	// "        [pc: 112, line: 20]\n" +
	// "        [pc: 120, line: 21]\n" +
	// "        [pc: 123, line: 22]\n" +
	// "        [pc: 129, line: 23]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 132] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 77] local: warnings index: 1 type: java.lang.Object\n"
	// +
	// "        [pc: 4, pc: 77] local: contexts index: 2 type: java.lang.Object\n"
	// +
	// "        [pc: 41, pc: 77] local: npe index: 3 type: java.lang.NullPointerException\n"
	// +
	// "        [pc: 78, pc: 107] local: e index: 1 type: java.lang.Exception\n"
	// +
	// "        [pc: 22, pc: 39] local: var index: 5 type: int\n" +
	// "        [pc: 59, pc: 76] local: var index: 5 type: int\n" +
	// "        [pc: 89, pc: 106] local: var index: 5 type: int\n" +
	// "        [pc: 112, pc: 129] local: var index: 5 type: int\n" +
	// "        [pc: 33, pc: 39] local: o index: 6 type: java.lang.Object\n" +
	// "        [pc: 70, pc: 76] local: o index: 6 type: java.lang.Object\n" +
	// "        [pc: 100, pc: 106] local: o index: 6 type: java.lang.Object\n" +
	// "        [pc: 123, pc: 129] local: o index: 6 type: java.lang.Object\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 40, full, stack: {java.lang.NullPointerException}, locals: {X, java.lang.Object, java.lang.Object}]\n"
	// +
	// "        [pc: 77, full, stack: {java.lang.Exception}, locals: {X}]\n" +
	// "        [pc: 107, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
	// }
	// }
	//
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=108180
	// public void test046() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "    public static Object sanityCheckBug() {\n" +
	// "        Object obj;\n" +
	// "        try {\n" +
	// "            obj = new Object();\n" +
	// "            return obj;\n" +
	// "        } finally {\n" +
	// "             obj = null;\n" +
	// "        }\n" +
	// "    }\n" +
	// "    public static void main(String[] arguments) {\n" +
	// "		X.sanityCheckBug();\n" +
	// "    }\n" +
	// "}\n",
	// },
	// "");
	//	
	// CompilerOptions compilerOptions = new
	// CompilerOptions(this.getCompilerOptions());
	// String expectedOutput = !compilerOptions.inlineJsrBytecode
	// ? "  // Method descriptor #15 ()Ljava/lang/Object;\n" +
	// "  // Stack: 2, Locals: 4\n" +
	// "  public static java.lang.Object sanityCheckBug();\n" +
	// "     0  new java.lang.Object [3]\n" +
	// "     3  dup\n" +
	// "     4  invokespecial java.lang.Object() [8]\n" +
	// "     7  astore_0 [obj]\n" +
	// "     8  aload_0 [obj]\n" +
	// "     9  astore_3\n" +
	// "    10  jsr 21\n" +
	// "    13  aload_3\n" +
	// "    14  areturn\n" +
	// "    15  astore_2\n" +
	// "    16  jsr 21\n" +
	// "    19  aload_2\n" +
	// "    20  athrow\n" +
	// "    21  astore_1\n" +
	// "    22  aconst_null\n" +
	// "    23  astore_0 [obj]\n" +
	// "    24  ret 1\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 13] -> 15 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 8, line: 6]\n" +
	// "        [pc: 15, line: 7]\n" +
	// "        [pc: 19, line: 9]\n" +
	// "        [pc: 21, line: 7]\n" +
	// "        [pc: 22, line: 8]\n" +
	// "        [pc: 24, line: 9]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 8, pc: 15] local: obj index: 0 type: java.lang.Object\n" +
	// "        [pc: 24, pc: 26] local: obj index: 0 type: java.lang.Object\n"
	// : null;
	//
	// if (expectedOutput == null) {
	// if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
	// expectedOutput = "  // Method descriptor #15 ()Ljava/lang/Object;\n" +
	// "  // Stack: 2, Locals: 3\n" +
	// "  public static java.lang.Object sanityCheckBug();\n" +
	// "     0  new java.lang.Object [3]\n" +
	// "     3  dup\n" +
	// "     4  invokespecial java.lang.Object() [8]\n" +
	// "     7  astore_0 [obj]\n" +
	// "     8  aload_0 [obj]\n" +
	// "     9  astore_2\n" +
	// "    10  aconst_null\n" +
	// "    11  astore_0 [obj]\n" +
	// "    12  aload_2\n" +
	// "    13  areturn\n" +
	// "    14  astore_1\n" +
	// "    15  aconst_null\n" +
	// "    16  astore_0 [obj]\n" +
	// "    17  aload_1\n" +
	// "    18  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 10] -> 14 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 8, line: 6]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 12, line: 6]\n" +
	// "        [pc: 14, line: 7]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 17, line: 9]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 8, pc: 14] local: obj index: 0 type: java.lang.Object\n" +
	// "        [pc: 17, pc: 19] local: obj index: 0 type: java.lang.Object\n";
	// } else {
	// expectedOutput = "  // Method descriptor #15 ()Ljava/lang/Object;\n" +
	// "  // Stack: 2, Locals: 3\n" +
	// "  public static java.lang.Object sanityCheckBug();\n" +
	// "     0  new java.lang.Object [3]\n" +
	// "     3  dup\n" +
	// "     4  invokespecial java.lang.Object() [8]\n" +
	// "     7  astore_0 [obj]\n" +
	// "     8  aload_0 [obj]\n" +
	// "     9  astore_2\n" +
	// "    10  aconst_null\n" +
	// "    11  astore_0 [obj]\n" +
	// "    12  aload_2\n" +
	// "    13  areturn\n" +
	// "    14  astore_1\n" +
	// "    15  aconst_null\n" +
	// "    16  astore_0 [obj]\n" +
	// "    17  aload_1\n" +
	// "    18  athrow\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 10] -> 14 when : any\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 8, line: 6]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 12, line: 6]\n" +
	// "        [pc: 14, line: 7]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 17, line: 9]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 8, pc: 14] local: obj index: 0 type: java.lang.Object\n" +
	// "        [pc: 17, pc: 19] local: obj index: 0 type: java.lang.Object\n";
	// }
	// }
	//
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	public void test047() {
		if (new CompilerOptions(getCompilerOptions()).complianceLevel <= ClassFileConstants.JDK1_3) {
			this
					.runNegativeTest(
							new String[] {
									"X.java",
									"public class X {\n"
											+ "        public static void main(String[] args) {\n"
											+ "                try {\n"
											+ "					if (false) throw null;\n"
											+ "					throw new Object();\n"
											+ "                } catch(Object o) {\n"
											+ "                }\n"
											+ "        }\n" + "}\n", },
							"----------\n"
									+ "1. ERROR in X.java (at line 4)\n"
									+ "	if (false) throw null;\n"
									+ "	                 ^^^^\n"
									+ "Cannot throw null as an exception\n"
									+ "----------\n"
									+ "2. ERROR in X.java (at line 5)\n"
									+ "	throw new Object();\n"
									+ "	      ^^^^^^^^^^^^\n"
									+ "No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n"
									+ "----------\n"
									+ "3. ERROR in X.java (at line 6)\n"
									+ "	} catch(Object o) {\n"
									+ "	        ^^^^^^\n"
									+ "No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n"
									+ "----------\n");
			return;
		}
		this
				.runNegativeTest(
						new String[] {
								"X.java",
								"public class X {\n"
										+ "        public static void main(String[] args) {\n"
										+ "                try {\n"
										+ "					if (false) throw null;\n"
										+ "					throw new Object();\n"
										+ "                } catch(Object o) {\n"
										+ "                }\n" + "        }\n"
										+ "}\n", },
						"----------\n"
								+ "1. ERROR in X.java (at line 5)\n"
								+ "	throw new Object();\n"
								+ "	      ^^^^^^^^^^^^\n"
								+ "No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n"
								+ "----------\n"
								+ "2. ERROR in X.java (at line 6)\n"
								+ "	} catch(Object o) {\n"
								+ "	        ^^^^^^\n"
								+ "No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n"
								+ "----------\n");
	}

	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894
	// public void test048() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	boolean bool() { return true; }\n" +
	// "	void foo() {\n" +
	// "		try {\n" +
	// "			if (bool()) {\n" +
	// "				return;\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}\n" +
	// "	int foo2() {\n" +
	// "		try {\n" +
	// "			while (bool()) {\n" +
	// "				return 0;\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "		return 1;\n" +
	// "	}\n" +
	// "	long foo3() {\n" +
	// "		try {\n" +
	// "			do {\n" +
	// "				if (true) return 0L;\n" +
	// "			} while (bool());\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "		return 1L;\n" +
	// "	}	\n" +
	// "	float foo4() {\n" +
	// "		try {\n" +
	// "			for (int i  = 0; bool(); i++) {\n" +
	// "				return 0.0F;\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "		return 1.0F;\n" +
	// "	}		\n" +
	// "	double bar() {\n" +
	// "		if (bool()) {\n" +
	// "			if (bool())\n" +
	// "				return 0.0;\n" +
	// "		} else {\n" +
	// "			if (bool()) {\n" +
	// "				throw new NullPointerException();\n" +
	// "			}\n" +
	// "		}\n" +
	// "		return 1.0;\n" +
	// "	}\n" +
	// "	void baz(int i) {\n" +
	// "		if (bool()) {\n" +
	// "			switch(i) {\n" +
	// "				case 0 : return;\n" +
	// "				default : break;\n" +
	// "			}\n" +
	// "		} else {\n" +
	// "			bool();\n" +
	// "		}\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 9\n" +
	// "     7  return\n" +
	// "     8  astore_1\n" +
	// "     9  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 8 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 8, line: 8]\n" +
	// "        [pc: 9, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #22 ()I\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  int foo2();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 10\n" +
	// "     7  iconst_0\n" +
	// "     8  ireturn\n" +
	// "     9  astore_1\n" +
	// "    10  iconst_1\n" +
	// "    11  ireturn\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 9 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 13]\n" +
	// "        [pc: 7, line: 14]\n" +
	// "        [pc: 9, line: 16]\n" +
	// "        [pc: 10, line: 18]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #24 ()J\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  long foo3();\n" +
	// "    0  lconst_0\n" +
	// "    1  lreturn\n" +
	// "    2  astore_1\n" +
	// "    3  lconst_1\n" +
	// "    4  lreturn\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 23]\n" +
	// "        [pc: 2, line: 25]\n" +
	// "        [pc: 3, line: 27]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 5] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #26 ()F\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  float foo4();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  goto 7\n" +
	// "     5  fconst_0\n" +
	// "     6  freturn\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifne 5\n" +
	// "    14  goto 18\n" +
	// "    17  astore_1\n" +
	// "    18  fconst_1\n" +
	// "    19  freturn\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 5] -> 17 when : java.lang.Exception\n" +
	// "        [pc: 7, pc: 14] -> 17 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 31]\n" +
	// "        [pc: 5, line: 32]\n" +
	// "        [pc: 7, line: 31]\n" +
	// "        [pc: 17, line: 34]\n" +
	// "        [pc: 18, line: 36]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 20] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 14] local: i index: 1 type: int\n" +
	// "  \n" +
	// "  // Method descriptor #30 ()D\n" +
	// "  // Stack: 2, Locals: 1\n" +
	// "  double bar();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 16\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifeq 31\n" +
	// "    14  dconst_0\n" +
	// "    15  dreturn\n" +
	// "    16  aload_0 [this]\n" +
	// "    17  invokevirtual X.bool() : boolean [17]\n" +
	// "    20  ifeq 31\n" +
	// "    23  new java.lang.NullPointerException [31]\n" +
	// "    26  dup\n" +
	// "    27  invokespecial java.lang.NullPointerException() [33]\n" +
	// "    30  athrow\n" +
	// "    31  dconst_1\n" +
	// "    32  dreturn\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 39]\n" +
	// "        [pc: 7, line: 40]\n" +
	// "        [pc: 14, line: 41]\n" +
	// "        [pc: 16, line: 43]\n" +
	// "        [pc: 23, line: 44]\n" +
	// "        [pc: 31, line: 47]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 33] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #35 (I)V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void baz(int i);\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 32\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  tableswitch default: 29\n" +
	// "          case 0: 28\n" +
	// "    28  return\n" +
	// "    29  goto 37\n" +
	// "    32  aload_0 [this]\n" +
	// "    33  invokevirtual X.bool() : boolean [17]\n" +
	// "    36  pop\n" +
	// "    37  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 50]\n" +
	// "        [pc: 7, line: 51]\n" +
	// "        [pc: 28, line: 52]\n" +
	// "        [pc: 29, line: 53]\n" +
	// "        [pc: 32, line: 56]\n" +
	// "        [pc: 37, line: 58]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 38] local: i index: 1 type: int\n"
	// :
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 9\n" +
	// "     7  return\n" +
	// "     8  astore_1\n" +
	// "     9  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 8 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 8, line: 8]\n" +
	// "        [pc: 9, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 8, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 9, same]\n" +
	// "  \n" +
	// "  // Method descriptor #23 ()I\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  int foo2();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 10\n" +
	// "     7  iconst_0\n" +
	// "     8  ireturn\n" +
	// "     9  astore_1\n" +
	// "    10  iconst_1\n" +
	// "    11  ireturn\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 9 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 13]\n" +
	// "        [pc: 7, line: 14]\n" +
	// "        [pc: 9, line: 16]\n" +
	// "        [pc: 10, line: 18]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 7, same]\n" +
	// "        [pc: 9, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 10, same]\n" +
	// "  \n" +
	// "  // Method descriptor #25 ()J\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  long foo3();\n" +
	// "    0  lconst_0\n" +
	// "    1  lreturn\n" +
	// "    2  astore_1\n" +
	// "    3  lconst_1\n" +
	// "    4  lreturn\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 23]\n" +
	// "        [pc: 2, line: 25]\n" +
	// "        [pc: 3, line: 27]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 5] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 0, same]\n" +
	// "        [pc: 2, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 3, same]\n" +
	// "  \n" +
	// "  // Method descriptor #27 ()F\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  float foo4();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  goto 7\n" +
	// "     5  fconst_0\n" +
	// "     6  freturn\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifne 5\n" +
	// "    14  goto 18\n" +
	// "    17  astore_1\n" +
	// "    18  fconst_1\n" +
	// "    19  freturn\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 5] -> 17 when : java.lang.Exception\n" +
	// "        [pc: 7, pc: 14] -> 17 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 31]\n" +
	// "        [pc: 5, line: 32]\n" +
	// "        [pc: 7, line: 31]\n" +
	// "        [pc: 17, line: 34]\n" +
	// "        [pc: 18, line: 36]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 20] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 14] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 5, append: {int}]\n" +
	// "        [pc: 7, same]\n" +
	// "        [pc: 17, full, stack: {java.lang.Exception}, locals: {X}]\n" +
	// "        [pc: 18, same]\n" +
	// "  \n" +
	// "  // Method descriptor #31 ()D\n" +
	// "  // Stack: 2, Locals: 1\n" +
	// "  double bar();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 16\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifeq 31\n" +
	// "    14  dconst_0\n" +
	// "    15  dreturn\n" +
	// "    16  aload_0 [this]\n" +
	// "    17  invokevirtual X.bool() : boolean [17]\n" +
	// "    20  ifeq 31\n" +
	// "    23  new java.lang.NullPointerException [32]\n" +
	// "    26  dup\n" +
	// "    27  invokespecial java.lang.NullPointerException() [34]\n" +
	// "    30  athrow\n" +
	// "    31  dconst_1\n" +
	// "    32  dreturn\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 39]\n" +
	// "        [pc: 7, line: 40]\n" +
	// "        [pc: 14, line: 41]\n" +
	// "        [pc: 16, line: 43]\n" +
	// "        [pc: 23, line: 44]\n" +
	// "        [pc: 31, line: 47]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 33] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 16, same]\n" +
	// "        [pc: 31, same]\n" +
	// "  \n" +
	// "  // Method descriptor #36 (I)V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void baz(int i);\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 32\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  tableswitch default: 29\n" +
	// "          case 0: 28\n" +
	// "    28  return\n" +
	// "    29  goto 37\n" +
	// "    32  aload_0 [this]\n" +
	// "    33  invokevirtual X.bool() : boolean [17]\n" +
	// "    36  pop\n" +
	// "    37  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 50]\n" +
	// "        [pc: 7, line: 51]\n" +
	// "        [pc: 28, line: 52]\n" +
	// "        [pc: 29, line: 53]\n" +
	// "        [pc: 32, line: 56]\n" +
	// "        [pc: 37, line: 58]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 38] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 28, same]\n" +
	// "        [pc: 29, same]\n" +
	// "        [pc: 32, same]\n" +
	// "        [pc: 37, same]\n";
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	//
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
	// public void test049() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	boolean bool() { return true; }\n" +
	// "	void foo() {\n" +
	// "		try {\n" +
	// "			if (bool()) {\n" +
	// "				throw new NullPointerException();\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}\n" +
	// "	void foo2() {\n" +
	// "		try {\n" +
	// "			while (bool()) {\n" +
	// "				throw new NullPointerException();\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}\n" +
	// "	void foo3() {\n" +
	// "		try {\n" +
	// "			do {\n" +
	// "				if (true) throw new NullPointerException();\n" +
	// "			} while (bool());\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}	\n" +
	// "	void foo4() {\n" +
	// "		try {\n" +
	// "			for (int i  = 0; bool(); i++) {\n" +
	// "				throw new NullPointerException();\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}		\n" +
	// "	void bar() {\n" +
	// "		if (bool()) {\n" +
	// "			if (bool())\n" +
	// "				throw new NullPointerException();\n" +
	// "		} else {\n" +
	// "			if (bool()) {\n" +
	// "				throw new NullPointerException();\n" +
	// "			}\n" +
	// "		}\n" +
	// "	}\n" +
	// "	void baz(int i) {\n" +
	// "		if (bool()) {\n" +
	// "			switch(i) {\n" +
	// "				case 0 : throw new NullPointerException();\n" +
	// "				default : break;\n" +
	// "			}\n" +
	// "		} else {\n" +
	// "			bool();\n" +
	// "		}\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 16\n" +
	// "     7  new java.lang.NullPointerException [19]\n" +
	// "    10  dup\n" +
	// "    11  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    14  athrow\n" +
	// "    15  astore_1\n" +
	// "    16  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 16, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo2();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 16\n" +
	// "     7  new java.lang.NullPointerException [19]\n" +
	// "    10  dup\n" +
	// "    11  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    14  athrow\n" +
	// "    15  astore_1\n" +
	// "    16  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 13]\n" +
	// "        [pc: 7, line: 14]\n" +
	// "        [pc: 15, line: 16]\n" +
	// "        [pc: 16, line: 18]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo3();\n" +
	// "     0  new java.lang.NullPointerException [19]\n" +
	// "     3  dup\n" +
	// "     4  invokespecial java.lang.NullPointerException() [21]\n" +
	// "     7  athrow\n" +
	// "     8  astore_1\n" +
	// "     9  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 8] -> 8 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 22]\n" +
	// "        [pc: 8, line: 24]\n" +
	// "        [pc: 9, line: 26]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo4();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  goto 13\n" +
	// "     5  new java.lang.NullPointerException [19]\n" +
	// "     8  dup\n" +
	// "     9  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    12  athrow\n" +
	// "    13  aload_0 [this]\n" +
	// "    14  invokevirtual X.bool() : boolean [17]\n" +
	// "    17  ifne 5\n" +
	// "    20  goto 24\n" +
	// "    23  astore_1\n" +
	// "    24  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 20] -> 23 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 29]\n" +
	// "        [pc: 5, line: 30]\n" +
	// "        [pc: 13, line: 29]\n" +
	// "        [pc: 23, line: 32]\n" +
	// "        [pc: 24, line: 34]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 25] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 20] local: i index: 1 type: int\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 1\n" +
	// "  void bar();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 22\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifeq 37\n" +
	// "    14  new java.lang.NullPointerException [19]\n" +
	// "    17  dup\n" +
	// "    18  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    21  athrow\n" +
	// "    22  aload_0 [this]\n" +
	// "    23  invokevirtual X.bool() : boolean [17]\n" +
	// "    26  ifeq 37\n" +
	// "    29  new java.lang.NullPointerException [19]\n" +
	// "    32  dup\n" +
	// "    33  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    36  athrow\n" +
	// "    37  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 36]\n" +
	// "        [pc: 7, line: 37]\n" +
	// "        [pc: 14, line: 38]\n" +
	// "        [pc: 22, line: 40]\n" +
	// "        [pc: 29, line: 41]\n" +
	// "        [pc: 37, line: 44]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #31 (I)V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void baz(int i);\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 39\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  tableswitch default: 36\n" +
	// "          case 0: 28\n" +
	// "    28  new java.lang.NullPointerException [19]\n" +
	// "    31  dup\n" +
	// "    32  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    35  athrow\n" +
	// "    36  goto 44\n" +
	// "    39  aload_0 [this]\n" +
	// "    40  invokevirtual X.bool() : boolean [17]\n" +
	// "    43  pop\n" +
	// "    44  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 46]\n" +
	// "        [pc: 7, line: 47]\n" +
	// "        [pc: 28, line: 48]\n" +
	// "        [pc: 36, line: 49]\n" +
	// "        [pc: 39, line: 52]\n" +
	// "        [pc: 44, line: 54]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 45] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 45] local: i index: 1 type: int\n"
	// :
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 16\n" +
	// "     7  new java.lang.NullPointerException [19]\n" +
	// "    10  dup\n" +
	// "    11  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    14  athrow\n" +
	// "    15  astore_1\n" +
	// "    16  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 15, line: 8]\n" +
	// "        [pc: 16, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 15, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 16, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo2();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 16\n" +
	// "     7  new java.lang.NullPointerException [19]\n" +
	// "    10  dup\n" +
	// "    11  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    14  athrow\n" +
	// "    15  astore_1\n" +
	// "    16  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 13]\n" +
	// "        [pc: 7, line: 14]\n" +
	// "        [pc: 15, line: 16]\n" +
	// "        [pc: 16, line: 18]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 7, same]\n" +
	// "        [pc: 15, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 16, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo3();\n" +
	// "     0  new java.lang.NullPointerException [19]\n" +
	// "     3  dup\n" +
	// "     4  invokespecial java.lang.NullPointerException() [21]\n" +
	// "     7  athrow\n" +
	// "     8  astore_1\n" +
	// "     9  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 8] -> 8 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 22]\n" +
	// "        [pc: 8, line: 24]\n" +
	// "        [pc: 9, line: 26]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 0, same]\n" +
	// "        [pc: 8, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 9, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void foo4();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  goto 13\n" +
	// "     5  new java.lang.NullPointerException [19]\n" +
	// "     8  dup\n" +
	// "     9  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    12  athrow\n" +
	// "    13  aload_0 [this]\n" +
	// "    14  invokevirtual X.bool() : boolean [17]\n" +
	// "    17  ifne 5\n" +
	// "    20  goto 24\n" +
	// "    23  astore_1\n" +
	// "    24  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 20] -> 23 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 29]\n" +
	// "        [pc: 5, line: 30]\n" +
	// "        [pc: 13, line: 29]\n" +
	// "        [pc: 23, line: 32]\n" +
	// "        [pc: 24, line: 34]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 25] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 20] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 5, append: {int}]\n" +
	// "        [pc: 13, same]\n" +
	// "        [pc: 23, full, stack: {java.lang.Exception}, locals: {X}]\n" +
	// "        [pc: 24, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 2, Locals: 1\n" +
	// "  void bar();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 22\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifeq 37\n" +
	// "    14  new java.lang.NullPointerException [19]\n" +
	// "    17  dup\n" +
	// "    18  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    21  athrow\n" +
	// "    22  aload_0 [this]\n" +
	// "    23  invokevirtual X.bool() : boolean [17]\n" +
	// "    26  ifeq 37\n" +
	// "    29  new java.lang.NullPointerException [19]\n" +
	// "    32  dup\n" +
	// "    33  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    36  athrow\n" +
	// "    37  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 36]\n" +
	// "        [pc: 7, line: 37]\n" +
	// "        [pc: 14, line: 38]\n" +
	// "        [pc: 22, line: 40]\n" +
	// "        [pc: 29, line: 41]\n" +
	// "        [pc: 37, line: 44]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 22, same]\n" +
	// "        [pc: 37, same]\n" +
	// "  \n" +
	// "  // Method descriptor #32 (I)V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  void baz(int i);\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 39\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  tableswitch default: 36\n" +
	// "          case 0: 28\n" +
	// "    28  new java.lang.NullPointerException [19]\n" +
	// "    31  dup\n" +
	// "    32  invokespecial java.lang.NullPointerException() [21]\n" +
	// "    35  athrow\n" +
	// "    36  goto 44\n" +
	// "    39  aload_0 [this]\n" +
	// "    40  invokevirtual X.bool() : boolean [17]\n" +
	// "    43  pop\n" +
	// "    44  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 46]\n" +
	// "        [pc: 7, line: 47]\n" +
	// "        [pc: 28, line: 48]\n" +
	// "        [pc: 36, line: 49]\n" +
	// "        [pc: 39, line: 52]\n" +
	// "        [pc: 44, line: 54]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 45] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 45] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 28, same]\n" +
	// "        [pc: 36, same]\n" +
	// "        [pc: 39, same]\n" +
	// "        [pc: 44, same]\n";
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
	// public void test050() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	boolean bool() { return true; }\n" +
	// "	void foo() {\n" +
	// "		check: try {\n" +
	// "			if (bool()) {\n" +
	// "				break check;\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}\n" +
	// "	void foo2() {\n" +
	// "		check: try {\n" +
	// "			while (bool()) {\n" +
	// "				break check;\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}\n" +
	// "	void foo3() {\n" +
	// "		check: try {\n" +
	// "			do {\n" +
	// "				if (true) break check;\n" +
	// "			} while (bool());\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}	\n" +
	// "	void foo4() {\n" +
	// "		check: try {\n" +
	// "			for (int i  = 0; bool(); i++) {\n" +
	// "				break check;\n" +
	// "			}\n" +
	// "		} catch (Exception e) {\n" +
	// "		}\n" +
	// "	}\n" +
	// "	void bar() {\n" +
	// "		check: if (bool()) {\n" +
	// "			if (bool())\n" +
	// "				break check;\n" +
	// "		} else {\n" +
	// "			if (bool()) {\n" +
	// "				break check;\n" +
	// "			}\n" +
	// "		}\n" +
	// "	}\n" +
	// "	void baz(int i) {\n" +
	// "		check: if (bool()) {\n" +
	// "			switch(i) {\n" +
	// "				case 0 : break check;\n" +
	// "				default : break;\n" +
	// "			}\n" +
	// "		} else {\n" +
	// "			bool();\n" +
	// "		}\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 11\n" +
	// "     7  goto 11\n" +
	// "    10  astore_1\n" +
	// "    11  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 11, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo2();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 11\n" +
	// "     7  goto 11\n" +
	// "    10  astore_1\n" +
	// "    11  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 13]\n" +
	// "        [pc: 7, line: 14]\n" +
	// "        [pc: 10, line: 16]\n" +
	// "        [pc: 11, line: 18]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo3();\n" +
	// "    0  goto 4\n" +
	// "    3  astore_1\n" +
	// "    4  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 22]\n" +
	// "        [pc: 3, line: 24]\n" +
	// "        [pc: 4, line: 26]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 5] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo4();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  aload_0 [this]\n" +
	// "     3  invokevirtual X.bool() : boolean [17]\n" +
	// "     6  ifne 13\n" +
	// "     9  goto 13\n" +
	// "    12  astore_1\n" +
	// "    13  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 9] -> 12 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 29]\n" +
	// "        [pc: 12, line: 32]\n" +
	// "        [pc: 13, line: 34]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 14] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 9] local: i index: 1 type: int\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 1\n" +
	// "  void bar();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 17\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifeq 24\n" +
	// "    14  goto 24\n" +
	// "    17  aload_0 [this]\n" +
	// "    18  invokevirtual X.bool() : boolean [17]\n" +
	// "    21  ifeq 24\n" +
	// "    24  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 36]\n" +
	// "        [pc: 7, line: 37]\n" +
	// "        [pc: 14, line: 38]\n" +
	// "        [pc: 17, line: 40]\n" +
	// "        [pc: 24, line: 44]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 25] local: this index: 0 type: X\n" +
	// "  \n" +
	// "  // Method descriptor #28 (I)V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void baz(int i);\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 34\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  tableswitch default: 31\n" +
	// "          case 0: 28\n" +
	// "    28  goto 39\n" +
	// "    31  goto 39\n" +
	// "    34  aload_0 [this]\n" +
	// "    35  invokevirtual X.bool() : boolean [17]\n" +
	// "    38  pop\n" +
	// "    39  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 46]\n" +
	// "        [pc: 7, line: 47]\n" +
	// "        [pc: 28, line: 48]\n" +
	// "        [pc: 31, line: 49]\n" +
	// "        [pc: 34, line: 52]\n" +
	// "        [pc: 39, line: 54]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 40] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 40] local: i index: 1 type: int\n"
	// :
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 11\n" +
	// "     7  goto 11\n" +
	// "    10  astore_1\n" +
	// "    11  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 10, line: 8]\n" +
	// "        [pc: 11, line: 10]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 10, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 11, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo2();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 11\n" +
	// "     7  goto 11\n" +
	// "    10  astore_1\n" +
	// "    11  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 13]\n" +
	// "        [pc: 7, line: 14]\n" +
	// "        [pc: 10, line: 16]\n" +
	// "        [pc: 11, line: 18]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 7, same]\n" +
	// "        [pc: 10, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 11, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo3();\n" +
	// "    0  goto 4\n" +
	// "    3  astore_1\n" +
	// "    4  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 22]\n" +
	// "        [pc: 3, line: 24]\n" +
	// "        [pc: 4, line: 26]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 5] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 0, same]\n" +
	// "        [pc: 3, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 4, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo4();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  aload_0 [this]\n" +
	// "     3  invokevirtual X.bool() : boolean [17]\n" +
	// "     6  ifne 13\n" +
	// "     9  goto 13\n" +
	// "    12  astore_1\n" +
	// "    13  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 9] -> 12 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 29]\n" +
	// "        [pc: 12, line: 32]\n" +
	// "        [pc: 13, line: 34]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 14] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 9] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 3\n" +
	// "        [pc: 2, append: {int}]\n" +
	// "        [pc: 12, full, stack: {java.lang.Exception}, locals: {X}]\n" +
	// "        [pc: 13, same]\n" +
	// "  \n" +
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 1, Locals: 1\n" +
	// "  void bar();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 17\n" +
	// "     7  aload_0 [this]\n" +
	// "     8  invokevirtual X.bool() : boolean [17]\n" +
	// "    11  ifeq 24\n" +
	// "    14  goto 24\n" +
	// "    17  aload_0 [this]\n" +
	// "    18  invokevirtual X.bool() : boolean [17]\n" +
	// "    21  ifeq 24\n" +
	// "    24  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 36]\n" +
	// "        [pc: 7, line: 37]\n" +
	// "        [pc: 14, line: 38]\n" +
	// "        [pc: 17, line: 40]\n" +
	// "        [pc: 24, line: 44]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 25] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 2\n" +
	// "        [pc: 17, same]\n" +
	// "        [pc: 24, same]\n" +
	// "  \n" +
	// "  // Method descriptor #29 (I)V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void baz(int i);\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  invokevirtual X.bool() : boolean [17]\n" +
	// "     4  ifeq 34\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  tableswitch default: 31\n" +
	// "          case 0: 28\n" +
	// "    28  goto 39\n" +
	// "    31  goto 39\n" +
	// "    34  aload_0 [this]\n" +
	// "    35  invokevirtual X.bool() : boolean [17]\n" +
	// "    38  pop\n" +
	// "    39  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 46]\n" +
	// "        [pc: 7, line: 47]\n" +
	// "        [pc: 28, line: 48]\n" +
	// "        [pc: 31, line: 49]\n" +
	// "        [pc: 34, line: 52]\n" +
	// "        [pc: 39, line: 54]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 40] local: this index: 0 type: X\n" +
	// "        [pc: 0, pc: 40] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 28, same]\n" +
	// "        [pc: 31, same]\n" +
	// "        [pc: 34, same]\n" +
	// "        [pc: 39, same]\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
	// public void test051() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public static void main(String argv[]) {\n" +
	// "		System.out.println(\"[count=\" + count() + \"]\");\n" +
	// "	}\n" +
	// "	static int count() {\n" +
	// "		int count = 0;\n" +
	// "		try {\n" +
	// "			for (int i = 0;;) {\n" +
	// "				count++;\n" +
	// "				if (i++ > 10) \n" +
	// "					break; \n" +
	// "			}\n" +
	// "		} catch(Exception e) {\n" +
	// "		}\n" +
	// "		return count;\n" +
	// "	}\n" +
	// "}\n",
	// },
	// "[count=12]");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #32 ()I\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  static int count();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_0 [count]\n" +
	// "     2  iconst_0\n" +
	// "     3  istore_1 [i]\n" +
	// "     4  iinc 0 1 [count]\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  iinc 1 1 [i]\n" +
	// "    11  bipush 10\n" +
	// "    13  if_icmple 4\n" +
	// "    16  goto 20\n" +
	// "    19  astore_1\n" +
	// "    20  iload_0 [count]\n" +
	// "    21  ireturn\n" +
	// "      Exception Table:\n" +
	// "        [pc: 2, pc: 16] -> 19 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 6]\n" +
	// "        [pc: 2, line: 8]\n" +
	// "        [pc: 4, line: 9]\n" +
	// "        [pc: 7, line: 10]\n" +
	// "        [pc: 16, line: 11]\n" +
	// "        [pc: 19, line: 13]\n" +
	// "        [pc: 20, line: 15]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 2, pc: 22] local: count index: 0 type: int\n" +
	// "        [pc: 4, pc: 16] local: i index: 1 type: int\n"
	// :
	// "  // Method descriptor #32 ()I\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  static int count();\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_0 [count]\n" +
	// "     2  iconst_0\n" +
	// "     3  istore_1 [i]\n" +
	// "     4  iinc 0 1 [count]\n" +
	// "     7  iload_1 [i]\n" +
	// "     8  iinc 1 1 [i]\n" +
	// "    11  bipush 10\n" +
	// "    13  if_icmple 4\n" +
	// "    16  goto 20\n" +
	// "    19  astore_1\n" +
	// "    20  iload_0 [count]\n" +
	// "    21  ireturn\n" +
	// "      Exception Table:\n" +
	// "        [pc: 2, pc: 16] -> 19 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 6]\n" +
	// "        [pc: 2, line: 8]\n" +
	// "        [pc: 4, line: 9]\n" +
	// "        [pc: 7, line: 10]\n" +
	// "        [pc: 16, line: 11]\n" +
	// "        [pc: 19, line: 13]\n" +
	// "        [pc: 20, line: 15]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 2, pc: 22] local: count index: 0 type: int\n" +
	// "        [pc: 4, pc: 16] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 4, append: {int, int}]\n" +
	// "        [pc: 16, chop 1 local(s)]\n" +
	// "        [pc: 19, same_locals_1_stack_item, stack: {java.lang.Exception}]\n"
	// +
	// "        [pc: 20, same]\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
	// public void test052() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public static void main(String argv[]) {\n" +
	// "		try {\n" +
	// "			for (int i = 0; i < 0; i++)\n" +
	// "				do ;  while (true);\n" +
	// "		} catch(Exception e) {\n" +
	// "		}\n" +
	// "	} \n" +
	// "}\n",
	// },
	// "");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  public static void main(java.lang.String[] argv);\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  goto 8\n" +
	// "     5  goto 5\n" +
	// "     8  iload_1 [i]\n" +
	// "     9  iflt 5\n" +
	// "    12  goto 16\n" +
	// "    15  astore_1\n" +
	// "    16  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 12] -> 15 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 5, line: 5]\n" +
	// "        [pc: 8, line: 4]\n" +
	// "        [pc: 15, line: 6]\n" +
	// "        [pc: 16, line: 8]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 17] local: argv index: 0 type: java.lang.String[]\n"
	// +
	// "        [pc: 2, pc: 12] local: i index: 1 type: int\n"
	// :
	// "  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  public static void main(java.lang.String[] argv);\n" +
	// "     0  iconst_0\n" +
	// "     1  istore_1 [i]\n" +
	// "     2  goto 8\n" +
	// "     5  goto 5\n" +
	// "     8  iload_1 [i]\n" +
	// "     9  iflt 5\n" +
	// "    12  goto 16\n" +
	// "    15  astore_1\n" +
	// "    16  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 12] -> 15 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "        [pc: 5, line: 5]\n" +
	// "        [pc: 8, line: 4]\n" +
	// "        [pc: 15, line: 6]\n" +
	// "        [pc: 16, line: 8]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 17] local: argv index: 0 type: java.lang.String[]\n"
	// +
	// "        [pc: 2, pc: 12] local: i index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 5, append: {int}]\n" +
	// "        [pc: 8, same]\n" +
	// "        [pc: 15, full, stack: {java.lang.Exception}, locals: {java.lang.String[]}]\n"
	// +
	// "        [pc: 16, same]\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
	// public void test053() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "	public static void main(String[] args) {\n" +
	// "		try {\n" +
	// "			final int val;\n" +
	// "			for (val = 7; val > 0;) break;\n" +
	// "			System.out.println(val);\n" +
	// "		} catch(Exception e) {\n" +
	// "		}\n" +
	// "	}	\n" +
	// "}\n",
	// },
	// "7");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  public static void main(java.lang.String[] args);\n" +
	// "     0  bipush 7\n" +
	// "     2  istore_1 [val]\n" +
	// "     3  iload_1 [val]\n" +
	// "     4  ifgt 7\n" +
	// "     7  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    10  iload_1 [val]\n" +
	// "    11  invokevirtual java.io.PrintStream.println(int) : void [22]\n" +
	// "    14  goto 18\n" +
	// "    17  astore_1\n" +
	// "    18  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 14] -> 17 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 17, line: 7]\n" +
	// "        [pc: 18, line: 9]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 19] local: args index: 0 type: java.lang.String[]\n"
	// +
	// "        [pc: 3, pc: 17] local: val index: 1 type: int\n"
	// :
	// "  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
	// "  // Stack: 2, Locals: 2\n" +
	// "  public static void main(java.lang.String[] args);\n" +
	// "     0  bipush 7\n" +
	// "     2  istore_1 [val]\n" +
	// "     3  iload_1 [val]\n" +
	// "     4  ifgt 7\n" +
	// "     7  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
	// "    10  iload_1 [val]\n" +
	// "    11  invokevirtual java.io.PrintStream.println(int) : void [22]\n" +
	// "    14  goto 18\n" +
	// "    17  astore_1\n" +
	// "    18  return\n" +
	// "      Exception Table:\n" +
	// "        [pc: 0, pc: 14] -> 17 when : java.lang.Exception\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 5]\n" +
	// "        [pc: 7, line: 6]\n" +
	// "        [pc: 17, line: 7]\n" +
	// "        [pc: 18, line: 9]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 19] local: args index: 0 type: java.lang.String[]\n"
	// +
	// "        [pc: 3, pc: 17] local: val index: 1 type: int\n" +
	// "      Stack map table: number of frames 4\n" +
	// "        [pc: 3, append: {int}]\n" +
	// "        [pc: 7, same]\n" +
	// "        [pc: 17, full, stack: {java.lang.Exception}, locals: {java.lang.String[]}]\n"
	// +
	// "        [pc: 18, same]\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
	// public void test054() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// " X parent;\n" +
	// " int kind;\n" +
	// " static boolean F = false;\n" +
	// " public static void main(String[] args) {\n" +
	// "  X x = new X();\n" +
	// "  x.kind = 2; \n" +
	// "  try {\n" +
	// "   x.foo();\n" +
	// "  } catch(NullPointerException e) { \n" +
	// "   System.out.println(\"SUCCESS\");\n" +
	// "   return;\n" +
	// "  }\n" +
	// "  System.out.println(\"FAILED\");  \n" +
	// " }\n" +
	// " void foo() {\n" +
	// "  X x = this;\n" +
	// "  done : while (true) {\n" +
	// "   switch (x.kind) {\n" +
	// "    case 2 :\n" +
	// "     if (F) {\n" +
	// "      return;\n" +
	// "     }\n" +
	// "     break;\n" +
	// "    case 3 :\n" +
	// "     break done;\n" +
	// "   }\n" +
	// "   x = x.parent; // should throw npe\n" +
	// "  }\n" +
	// " } \n" +
	// "}\n",
	// },
	// "SUCCESS");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #12 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  astore_1 [x]\n" +
	// "     2  aload_1 [x]\n" +
	// "     3  getfield X.kind : int [25]\n" +
	// "     6  tableswitch default: 38\n" +
	// "          case 2: 28\n" +
	// "          case 3: 35\n" +
	// "    28  getstatic X.F : boolean [14]\n" +
	// "    31  ifeq 38\n" +
	// "    34  return\n" +
	// "    35  goto 46\n" +
	// "    38  aload_1 [x]\n" +
	// "    39  getfield X.parent : X [53]\n" +
	// "    42  astore_1 [x]\n" +
	// "    43  goto 2\n" +
	// "    46  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 17]\n" +
	// "        [pc: 2, line: 19]\n" +
	// "        [pc: 28, line: 21]\n" +
	// "        [pc: 34, line: 22]\n" +
	// "        [pc: 35, line: 26]\n" +
	// "        [pc: 38, line: 27]\n" +
	// "        [pc: 39, line: 28]\n" +
	// "        [pc: 43, line: 18]\n" +
	// "        [pc: 46, line: 30]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 47] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 47] local: x index: 1 type: X\n"
	// :
	// "  // Method descriptor #12 ()V\n" +
	// "  // Stack: 1, Locals: 2\n" +
	// "  void foo();\n" +
	// "     0  aload_0 [this]\n" +
	// "     1  astore_1 [x]\n" +
	// "     2  aload_1 [x]\n" +
	// "     3  getfield X.kind : int [25]\n" +
	// "     6  tableswitch default: 38\n" +
	// "          case 2: 28\n" +
	// "          case 3: 35\n" +
	// "    28  getstatic X.F : boolean [14]\n" +
	// "    31  ifeq 38\n" +
	// "    34  return\n" +
	// "    35  goto 46\n" +
	// "    38  aload_1 [x]\n" +
	// "    39  getfield X.parent : X [55]\n" +
	// "    42  astore_1 [x]\n" +
	// "    43  goto 2\n" +
	// "    46  return\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 17]\n" +
	// "        [pc: 2, line: 19]\n" +
	// "        [pc: 28, line: 21]\n" +
	// "        [pc: 34, line: 22]\n" +
	// "        [pc: 35, line: 26]\n" +
	// "        [pc: 38, line: 27]\n" +
	// "        [pc: 39, line: 28]\n" +
	// "        [pc: 43, line: 18]\n" +
	// "        [pc: 46, line: 30]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 47] local: this index: 0 type: X\n" +
	// "        [pc: 2, pc: 47] local: x index: 1 type: X\n" +
	// "      Stack map table: number of frames 5\n" +
	// "        [pc: 2, append: {X}]\n" +
	// "        [pc: 28, same]\n" +
	// "        [pc: 35, same]\n" +
	// "        [pc: 38, same]\n" +
	// "        [pc: 46, same]\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
	// public void test055() {
	// this.runConformTest(
	// new String[] {
	// "X.java",
	// "public class X {\n" +
	// "\n" +
	// "void foo5() {\n" +
	// "  L : for (;;) {\n" +
	// "    continue L; // good\n" +
	// "  }\n" +
	// "}\n" +
	// "}\n",
	// },
	// "");
	//	
	// String expectedOutput = new
	// CompilerOptions(this.getCompilerOptions()).complianceLevel <
	// ClassFileConstants.JDK1_6
	// ? "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 0, Locals: 1\n" +
	// "  void foo5();\n" +
	// "    0  goto 0\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 3] local: this index: 0 type: X\n"
	// :
	// "  // Method descriptor #6 ()V\n" +
	// "  // Stack: 0, Locals: 1\n" +
	// "  void foo5();\n" +
	// "    0  goto 0\n" +
	// "      Line numbers:\n" +
	// "        [pc: 0, line: 4]\n" +
	// "      Local variable table:\n" +
	// "        [pc: 0, pc: 3] local: this index: 0 type: X\n" +
	// "      Stack map table: number of frames 1\n" +
	// "        [pc: 0, same]\n";
	//	
	// try {
	// File f = new File(OUTPUT_DIR + File.separator + "X.class");
	// byte[] classFileBytes =
	// org.eclipse.wst.jsdt.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);
	// }
	// } catch (org.eclipse.wst.jsdt.core.util.ClassFormatException e) {
	// assertTrue(false);
	// } catch (IOException e) {
	// assertTrue(false);
	// }
	// }
	public void _test056() {
		this
				.runNegativeTest(
						new String[] {
								"p/BytecodeA.java",
								"package p;\n"
										+ "class BytecodeA {\n"
										+ "  \n"
										+ "int foo() { // good\n"
										+ "  boolean b = true;\n"
										+ "  if (b) {\n"
										+ "    if (true)\n"
										+ "      return 0;\n"
										+ "  } else {\n"
										+ "    if (true)\n"
										+ "      return 1;\n"
										+ "  }\n"
										+ "  return 5;\n"
										+ "}\n"
										+ "int foo10() {\n"
										+ "  try {\n"
										+ "    //if (true)\n"
										+ "      return 0;\n"
										+ "  } catch (Exception e) {\n"
										+ "    if (true)\n"
										+ "      return 1;\n"
										+ "  } finally {\n"
										+ "    if (true)\n"
										+ "      return 2;\n"
										+ "  };\n"
										+ "  return 1;\n"
										+ "}   \n"
										+ "int foo11() {\n"
										+ "  synchronized (this) {\n"
										+ "    if (true)\n"
										+ "      return 1;\n"
										+ "  };\n"
										+ "  return 2;\n"
										+ "} \n"
										+ "int foo12() {\n"
										+ "  for (;;)\n"
										+ "    return 1;\n"
										+ "}\n"
										+ "int foo13() {\n"
										+ "  for (;;)\n"
										+ "    if (true)\n"
										+ "      return 1;\n"
										+ "}\n"
										+ "int foo14() {\n"
										+ "  for (int i = 1; i < 10; i++)\n"
										+ "    if (true)\n"
										+ "      return 1;\n"
										+ "  return 2;\n"
										+ "} \n"
										+ "int foo15() {\n"
										+ "  for (int i = 1; i < 10; i++)\n"
										+ "    return 1;\n"
										+ "  return 2;\n"
										+ "}\n"
										+ "int foo16() {\n"
										+ "  final int i;\n"
										+ "  while (true) {\n"
										+ "    i = 1;\n"
										+ "    if (true)\n"
										+ "      break;\n"
										+ "  };\n"
										+ "  return 1;\n"
										+ "}              \n"
										+ "int foo17() {\n"
										+ "  final int i;\n"
										+ "  for (;;) {\n"
										+ "    i = 1;\n"
										+ "    if (true)\n"
										+ "      break;\n"
										+ "  };\n"
										+ "  return 1;\n"
										+ "} \n"
										+ "void foo2() {\n"
										+ "  L1 :;  // good\n"
										+ "}\n"
										+ "void foo20() {\n"
										+ "  if (true)\n"
										+ "    return;\n"
										+ "} \n"
										+ "void foo3() {\n"
										+ "  L : if (true) {\n"
										+ "    for (;;) {\n"
										+ "      continue L; // bad\n"
										+ "    }\n"
										+ "  }\n"
										+ "}   \n"
										+ "void foo4() {\n"
										+ "  L : if (true) {\n"
										+ "    try {\n"
										+ "      for (;;) {\n"
										+ "        continue L; // bad\n"
										+ "      }\n"
										+ "    } finally {\n"
										+ "      return;\n"
										+ "    }\n"
										+ "  } \n"
										+ "}\n"
										+ "void foo5() {\n"
										+ "  L : for (;;) {\n"
										+ "    continue L; // good\n"
										+ "  }\n"
										+ "}\n"
										+ "void foo5bis() {\n"
										+ "  L : K : for (;;) {\n"
										+ "    continue L; // good\n"
										+ "  }\n"
										+ "}\n"
										+ "void foo6(){\n"
										+ "  int i;\n"
										+ "  boolean a[] = new boolean[5];\n"
										+ "  a[i=1] = i > 0; // good\n"
										+ "}    \n"
										+ "void foo7(){\n"
										+ "  Object x[];\n"
										+ "  x [1] = (x = new Object[5]); // bad\n"
										+ "}    \n"
										+ "void foo8() {\n"
										+ "  try {\n"
										+ "  } catch (java.io.IOException e) {\n"
										+ "    foo(); // unreachable\n"
										+ "  }\n"
										+ "}\n"
										+ "void foo9() {\n"
										+ "  try {\n"
										+ "  } catch (NullPointerException e) {\n"
										+ "    foo(); // ok\n"
										+ "  }\n"
										+ "}\n"
										+ "    public static void main(String args[]) {\n"
										+ "      BytecodeA a = new BytecodeA();\n"
										+ "      a.foo10();\n" + "    }\n"
										+ "}", },
						"----------\n"
								+ "1. WARNING in p\\BytecodeA.java (at line 74)\n"
								+ "	L1 :;  // good\n"
								+ "	^^\n"
								+ "The label L1 is never explicitly referenced\n"
								+ "----------\n"
								+ "2. ERROR in p\\BytecodeA.java (at line 83)\n"
								+ "	continue L; // bad\n"
								+ "	^^^^^^^^^^\n"
								+ "continue cannot be used outside of a loop\n"
								+ "----------\n"
								+ "3. ERROR in p\\BytecodeA.java (at line 91)\n"
								+ "	continue L; // bad\n"
								+ "	^^^^^^^^^^\n"
								+ "continue cannot be used outside of a loop\n"
								+ "----------\n"
								+ "4. WARNING in p\\BytecodeA.java (at line 93)\n"
								+ "	} finally {\n"
								+ "      return;\n"
								+ "    }\n"
								+ "	          ^^^^^^^^^^^^^^^^^^^^^\n"
								+ "finally block does not complete normally\n"
								+ "----------\n"
								+ "5. WARNING in p\\BytecodeA.java (at line 104)\n"
								+ "	L : K : for (;;) {\n"
								+ "	    ^\n"
								+ "The label K is never explicitly referenced\n"
								+ "----------\n"
								+ "6. ERROR in p\\BytecodeA.java (at line 105)\n"
								+ "	continue L; // good\n"
								+ "	^^^^^^^^^^\n"
								+ "continue cannot be used outside of a loop\n"
								+ "----------\n"
								+ "7. ERROR in p\\BytecodeA.java (at line 115)\n"
								+ "	x [1] = (x = new Object[5]); // bad\n"
								+ "	^\n"
								+ "The local variable x may not have been initialized\n"
								+ "----------\n"
								+ "8. ERROR in p\\BytecodeA.java (at line 119)\n"
								+ "	} catch (java.io.IOException e) {\n"
								+ "	         ^^^^^^^^^^^^^^^^^^^\n"
								+ "Unreachable catch block for IOException. This exception is never thrown from the try statement body\n"
								+ "----------\n");
	}

	// was Compliance_1_x#test007
	public void test057() {
		String[] sources = new String[] {
				"p1/Test.java",
				"package p1; \n" + "public class Test { \n"
						+ "	public static void main(String[] arguments) { \n"
						+ "		try {	\n" + "			throw null; \n"
						+ "		} catch(NullPointerException e){ 	\n"
						+ "			System.out.println(\"SUCCESS\");	\n" + "		}	\n"
						+ "	} \n" + "} \n" };
		if (this.complianceLevel.equals(COMPLIANCE_1_3)) {
			runNegativeTest(sources, "----------\n"
					+ "1. ERROR in p1\\Test.java (at line 5)\n"
					+ "	throw null; \n" + "	      ^^^^\n"
					+ "Cannot throw null as an exception\n" + "----------\n");
		} else {
			runConformTest(sources, "SUCCESS");
		}
	}

	public static Class testClass() {
		return TryStatementTest.class;
	}
}
