Browse Source

[hl] fixed callstack of rethrown exceptions (closes #10109)

Aleksandr Kuzmenko 4 years ago
parent
commit
e3846bfb85
2 changed files with 29 additions and 0 deletions
  1. 5 0
      src/generators/genhl.ml
  2. 24 0
      tests/unit/src/unit/issues/Issue10109.hx

+ 5 - 0
src/generators/genhl.ml

@@ -2599,6 +2599,11 @@ and eval_expr ctx e =
 			free ctx env;
 			op ctx (OInstanceClosure (r, fid, env)));
 		r
+	(* throwing a catch var means we want to rethrow an exception *)
+	| TThrow ({ eexpr = TLocal v } as e1) when has_var_flag v VCaught ->
+		let r = alloc_tmp ctx HVoid in
+		op ctx (ORethrow (eval_to ctx e1 HDyn));
+		r
 	| TThrow v ->
 		op ctx (OThrow (eval_to ctx v HDyn));
 		alloc_tmp ctx HDyn

+ 24 - 0
tests/unit/src/unit/issues/Issue10109.hx

@@ -0,0 +1,24 @@
+package unit.issues;
+
+class Issue10109 extends Test {
+	@:pure(false)
+	static function foo( o : String ) {
+		return o.length;
+	}
+
+	function test() {
+		try {
+			try {
+				foo(null);
+			} catch( e : Stop ) {
+			}
+			assert();
+		} catch(e) {
+			t(e.stack.length > 0);
+		}
+	}
+}
+
+private enum Stop {
+	A;
+}