[404146] [1.7][compiler] nested try-catch-finally-blocks leads to
unrunnable Java byte code
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
index 5514ac6..9c26719 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
@@ -23,6 +23,8 @@
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 381443 - [compiler][null] Allow parameter widening from @NonNull to unannotated
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -1891,6 +1893,7 @@
 			"		<option key=\"org.eclipse.jdt.core.compiler.annotation.nullable\" value=\"org.eclipse.jdt.annotation.Nullable\"/>\n" + 
 			"		<option key=\"org.eclipse.jdt.core.compiler.annotation.nullanalysis\" value=\"disabled\"/>\n" + 
 			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode\" value=\"disabled\"/>\n" + 
+			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.shareCommonFinallyBlocks\" value=\"disabled\"/>\n" +
 			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.targetPlatform\" value=\"1.5\"/>\n" + 
 			"		<option key=\"org.eclipse.jdt.core.compiler.codegen.unusedLocal\" value=\"optimize out\"/>\n" + 
 			"		<option key=\"org.eclipse.jdt.core.compiler.compliance\" value=\"1.5\"/>\n" + 
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java
index fafc9d3..9718a1f 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatement17Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2011 IBM Corporation and others.
+ * Copyright (c) 2003, 2013 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
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Jesper Steen Moller - bug 404146 nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -1216,6 +1217,50 @@
 		"No exception of type ClassNotFoundException[] can be thrown; an exception type must be a subclass of Throwable\n" + 
 		"----------\n");
 	}
+
+//Bug 404146 - nested try-catch-finally-blocks leads to unrunnable Java byte code
+public void testBug404146() {
+	runConformTest(
+		new String[] {
+			"X.java",
+			"import java.io.IOException;\n" + 
+					"import javax.naming.NamingException;\n" + 
+
+			"\n" + 
+			"public final class X {\n" + 
+			"\n" + 
+			"    public static final void illegalStackMap() {\n" + 
+			"        try {\n" + 
+			"          try {\n" + 
+			"            Y.decoy1();\n" + 
+			"          } finally {\n" + 
+			"            try {\n" + 
+			"                Y.decoy2();\n" + 
+			"            } catch (final IOException e) {\n" + 
+			"              return;\n" + 
+			"            }\n" + 
+			"          }\n" + 
+			"        } finally {\n" + 
+			"          try {\n" + 
+			"            Y.decoy3();\n" + 
+			"          } catch (final NamingException e) {\n" + 
+			"            return;\n" + 
+			"          }\n" + 
+			"        }\n" + 
+			"    }\n" + 
+			"}\n",
+			"Y.java",
+				"import java.io.IOException;\n" + 
+						"import javax.naming.NamingException;\n" + 
+			"public final class Y {\n" + 
+			"\n" + 
+			"    public static void decoy1() {}\n" +
+			"    public static void decoy2() throws IOException {}\n" +
+			"    public static void decoy3() throws NamingException {}\n" +
+			"}\n"
+		});
+}
+
 public static Class testClass() {
 	return TryStatement17Test.class;
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java
index bcef02a..9e42561 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TryStatementTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2012 IBM Corporation and others.
+ * Copyright (c) 2003, 2013 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
@@ -10,6 +10,8 @@
  *     Stephan Herrmann - Contribution for
  *								bug 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
  *								bug 387612 - Unreachable catch block...exception is never thrown from the try
+ *     Jesper Steen Moller - Contribution for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -36,6 +38,11 @@
 public static Test suite() {
 	return buildAllCompliancesTestSuite(testClass());
 }
+protected Map getCompilerOptions() {
+	Map compilerOptions = super.getCompilerOptions();
+	compilerOptions.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.ENABLED);
+	return compilerOptions;
+};
 public void test001() {
 	this.runConformTest(new String[] {
 		"p/X.java",
@@ -2364,6 +2371,128 @@
 		assertEquals("Wrong contents", expectedOutput, result);
 	}
 }
+
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=404146 - variation without sharing of inlined escaping finally-blocks
+public void test042_not_shared() throws Exception {
+	Map customOptions = getCompilerOptions();
+	customOptions.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.DISABLED);
+	customOptions.put(CompilerOptions.OPTION_InlineJsr, CompilerOptions.ENABLED);
+
+	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",
+			null,
+			true,
+			null,
+			customOptions,
+			null);
+
+	String expectedOutput =
+			"  // 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: 81\n" + 
+			"          case 0: 48\n" + 
+			"          case 1: 59\n" + 
+			"          case 2: 81\n" + 
+			"          case 3: 70\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  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     62  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     64  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     67  ldc <String \"KO\"> [40]\n" + 
+			"     69  areturn\n" + 
+			"     70  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     73  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     75  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     78  ldc <String \"OK\"> [42]\n" + 
+			"     80  areturn\n" + 
+			"     81  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     84  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     86  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"     89  ldc <String \"KO\"> [40]\n" + 
+			"     91  areturn\n" + 
+			"     92  astore_2\n" + 
+			"     93  getstatic java.lang.System.out : java.io.PrintStream [16]\n" + 
+			"     96  ldc <String \"FINALLY:\"> [35]\n" + 
+			"     98  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" + 
+			"    101  aload_2\n" + 
+			"    102  athrow\n" + 
+			"      Exception Table:\n" + 
+			"        [pc: 0, pc: 4] -> 92 when : any\n" + 
+			"        [pc: 15, pc: 48] -> 92 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: 19]\n" + 
+			"        [pc: 67, line: 12]\n" + 
+			"        [pc: 70, line: 19]\n" + 
+			"        [pc: 78, line: 14]\n" + 
+			"        [pc: 81, line: 19]\n" + 
+			"        [pc: 89, line: 16]\n" + 
+			"        [pc: 92, line: 18]\n" + 
+			"        [pc: 93, line: 19]\n" + 
+			"        [pc: 101, line: 20]\n" + 
+			"      Local variable table:\n" + 
+			"        [pc: 0, pc: 103] local: this index: 0 type: X\n" + 
+			"        [pc: 0, pc: 103] local: args index: 1 type: java.lang.String[]\n";
+
+	File f = new File(OUTPUT_DIR + File.separator + "X.class");
+	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
+	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
+	int index = result.indexOf(expectedOutput);
+	if (index == -1 || expectedOutput.length() == 0) {
+		System.out.println(Util.displayString(result, 3));
+	}
+	if (index == -1) {
+		assertEquals("Wrong contents", expectedOutput, result);
+	}
+}
+
+
+
 //https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705 - variation
 public void test043() throws Exception {
 	this.runConformTest(
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java
index 27414e6..73c220d 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/XLargeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2012 IBM Corporation and others.
+ * Copyright (c) 2005, 2013 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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
@@ -3909,6 +3911,8 @@
 	"");
 }
 public void test015() {
+	Map settings = getCompilerOptions();
+	settings.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.ENABLED);
 	runConformTest(
 		true,
 		new String[] {
@@ -11934,6 +11938,8 @@
 		"	}\n" +
 		"}"},
 		null,
+		settings,
+		null,
 		"Enter finally block\n" +
 		"Inside finally block\n" +
 		"Leave finally block\n" +
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
index 85d26ab..8bfdd67 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TryStatement.java
@@ -18,7 +18,9 @@
  *								bug 401088 - [compiler][null] Wrong warning "Redundant null check" inside nested try statement
  *								bug 401092 - [compiler][null] Wrong warning "Redundant null check" in outer catch of nested try
  *								bug 402993 - [null] Follow up of bug 401088: Missing warning about redundant null check
- *								bug 384380 - False positive on a « Potential null pointer access » after a continue
+ *								bug 384380 - False positive on a ?? Potential null pointer access ?? after a continue
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.ast;
 
@@ -27,6 +29,7 @@
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.codegen.*;
 import org.eclipse.jdt.internal.compiler.flow.*;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.compiler.impl.Constant;
 import org.eclipse.jdt.internal.compiler.lookup.*;
 
@@ -888,7 +891,8 @@
 			return false;
 	}
 	// optimize subroutine invocation sequences, using the targetLocation (if any)
-	if (targetLocation != null) {
+	CompilerOptions options = this.scope.compilerOptions();
+	if (options.shareCommonFinallyBlocks && targetLocation != null) {
 		boolean reuseTargetLocation = true;
 		if (this.reusableJSRTargetsCount > 0) {
 			nextReusableTarget: for (int i = 0, count = this.reusableJSRTargetsCount; i < count; i++) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
index 667e180..7e71149 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -19,6 +19,8 @@
  *								bug 388281 - [compiler][null] inheritance of null annotations as an option
  *								bug 381443 - [compiler][null] Allow parameter widening from @NonNull to unannotated
  *								bug 383368 - [compiler][null] syntactic null analysis for field references
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.impl;
 
@@ -112,6 +114,7 @@
 	public static final String OPTION_TaskPriorities = "org.eclipse.jdt.core.compiler.taskPriorities"; //$NON-NLS-1$
 	public static final String OPTION_TaskCaseSensitive = "org.eclipse.jdt.core.compiler.taskCaseSensitive"; //$NON-NLS-1$
 	public static final String OPTION_InlineJsr = "org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode"; //$NON-NLS-1$
+	public static final String OPTION_ShareCommonFinallyBlocks = "org.eclipse.jdt.core.compiler.codegen.shareCommonFinallyBlocks"; //$NON-NLS-1$
 	public static final String OPTION_ReportNullReference = "org.eclipse.jdt.core.compiler.problem.nullReference"; //$NON-NLS-1$
 	public static final String OPTION_ReportPotentialNullReference = "org.eclipse.jdt.core.compiler.problem.potentialNullReference"; //$NON-NLS-1$
 	public static final String OPTION_ReportRedundantNullCheck = "org.eclipse.jdt.core.compiler.problem.redundantNullCheck"; //$NON-NLS-1$
@@ -379,6 +382,8 @@
 	public boolean reportMissingJavadocCommentsOverriding;
 	/** Indicate whether the JSR bytecode should be inlined to avoid its presence in classfile */
 	public boolean inlineJsrBytecode;
+	/** Indicate whether common escaping finally blocks should be shared */
+	public boolean shareCommonFinallyBlocks;
 	/** Indicate if @SuppressWarning annotations are activated */
 	public boolean suppressWarnings;
 	/** Indicate if @SuppressWarning annotations should also suppress optional errors */
@@ -1093,6 +1098,7 @@
 		optionsMap.put(OPTION_ReportSpecialParameterHidingField, this.reportSpecialParameterHidingField ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_MaxProblemPerUnit, String.valueOf(this.maxProblemsPerUnit));
 		optionsMap.put(OPTION_InlineJsr, this.inlineJsrBytecode ? ENABLED : DISABLED);
+		optionsMap.put(OPTION_ShareCommonFinallyBlocks, this.shareCommonFinallyBlocks ? ENABLED : DISABLED);
 		optionsMap.put(OPTION_ReportNullReference, getSeverityString(NullReference));
 		optionsMap.put(OPTION_ReportPotentialNullReference, getSeverityString(PotentialNullReference));
 		optionsMap.put(OPTION_ReportRedundantNullCheck, getSeverityString(RedundantNullCheck));
@@ -1242,8 +1248,9 @@
 		this.reportMissingJavadocCommentsVisibility = ClassFileConstants.AccPublic;
 		this.reportMissingJavadocCommentsOverriding = false;
 		
-		// JSR bytecode inlining
+		// JSR bytecode inlining and sharing
 		this.inlineJsrBytecode = false;
+		this.shareCommonFinallyBlocks = false;
 
 		// javadoc comment support
 		this.docCommentSupport = false;
@@ -1482,6 +1489,13 @@
 				}
 			}
 		}
+		if ((optionValue = optionsMap.get(OPTION_ShareCommonFinallyBlocks)) != null) {
+			if (ENABLED.equals(optionValue)) {
+				this.shareCommonFinallyBlocks = true;
+			} else if (DISABLED.equals(optionValue)) {
+				this.shareCommonFinallyBlocks = false;
+			}
+		}
 		if ((optionValue = optionsMap.get(OPTION_SuppressWarnings)) != null) {
 			if (ENABLED.equals(optionValue)) {
 				this.suppressWarnings = true;
@@ -1807,6 +1821,7 @@
 		buf.append("\n\t- report unused parameter include doc comment reference : ").append(this.reportUnusedParameterIncludeDocCommentReference ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- report constructor/setter parameter hiding existing field : ").append(this.reportSpecialParameterHidingField ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- inline JSR bytecode : ").append(this.inlineJsrBytecode ? ENABLED : DISABLED); //$NON-NLS-1$
+		buf.append("\n\t- share common finally blocks : ").append(this.shareCommonFinallyBlocks ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- report unavoidable generic type problems : ").append(this.reportUnavoidableGenericTypeProblems ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- unsafe type operation: ").append(getSeverityString(UncheckedTypeOperation)); //$NON-NLS-1$
 		buf.append("\n\t- unsafe raw type: ").append(getSeverityString(RawTypeReference)); //$NON-NLS-1$
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
index 62afdf5..69293d9 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 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
@@ -7,6 +7,8 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Jesper Steen Moller - Contributions for
+ *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *******************************************************************************/
 package org.eclipse.jdt.internal.formatter;
 
@@ -339,6 +341,7 @@
 			optionsMap.put(CompilerOptions.OPTION_ReportUnavoidableGenericTypeProblems, CompilerOptions.ENABLED);
 			optionsMap.put(CompilerOptions.OPTION_MaxProblemPerUnit, String.valueOf(100));
 			optionsMap.put(CompilerOptions.OPTION_InlineJsr, CompilerOptions.DISABLED);
+			optionsMap.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.DISABLED);
 			optionsMap.put(CompilerOptions.OPTION_ReportMethodCanBeStatic, CompilerOptions.IGNORE);
 			optionsMap.put(CompilerOptions.OPTION_ReportMethodCanBePotentiallyStatic, CompilerOptions.IGNORE);
 			optionsMap.put(CompilerOptions.OPTION_ReportUnusedTypeParameter, CompilerOptions.IGNORE);