From 71711998f19702d6f3532852e9ae97ac66751bd1 Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Fri, 3 Sep 2021 10:05:58 +0800 Subject: [PATCH] Fix bug in catch error variable. --- CHANGELOG.md | 2 +- src/parse.rs | 12 ++++++++++-- tests/throw.rs | 12 ++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7084cebb..121f589e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Rhai Release Notes ================== -Version 1.0.3 +Version 1.0.4 ============= Bug fixes diff --git a/src/parse.rs b/src/parse.rs index e383d597..3750599f 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -2902,7 +2902,7 @@ fn parse_try_catch( } // try { body } catch ( - let var_def = if match_token(input, Token::LeftParen).0 { + let err_var = if match_token(input, Token::LeftParen).0 { let (name, pos) = parse_var_name(input)?; let (matched, err_pos) = match_token(input, Token::RightParen); @@ -2924,8 +2924,16 @@ fn parse_try_catch( // try { body } catch ( var ) { catch_block } let catch_body = parse_block(input, state, lib, settings.level_up())?; + if err_var.is_some() { + // Remove the error variable from the stack + state + .stack + .pop() + .expect("stack contains at least one entry"); + } + Ok(Stmt::TryCatch( - (body.into(), var_def, catch_body.into()).into(), + (body.into(), err_var, catch_body.into()).into(), settings.pos, )) } diff --git a/tests/throw.rs b/tests/throw.rs index a93cfd04..2ef82dd2 100644 --- a/tests/throw.rs +++ b/tests/throw.rs @@ -51,6 +51,18 @@ fn test_try_catch() -> Result<(), Box> { 42 ); + assert_eq!( + engine.eval::( + " + let err = 123; + let x = 0; + try { throw 42; } catch(err) { print(err); } + err + " + )?, + 123 + ); + assert_eq!( engine.eval::( "