diff --git a/data/expression2/tests/regressions/3080.txt b/data/expression2/tests/regressions/3080.txt new file mode 100644 index 0000000000..e53317eff2 --- /dev/null +++ b/data/expression2/tests/regressions/3080.txt @@ -0,0 +1,40 @@ +## SHOULD_PASS:EXECUTE +@strict + +try { + error("A") +} catch(A:string) { + assert(A == "A") +} + +try { + if(1) { + error("B") + } +} catch(B:string) { + assert(B == "B") +} + +if(1) { + try { + error("C") + } catch(C:string) { + assert(C == "C") + } + + try { + if(1) { + error("D") + } + } catch(D:string) { + assert(D == "D") + } + + let Fn = function() { error("F") } + + try { + Fn() + } catch(F:string) { + assert(F == "F") + } +} diff --git a/lua/entities/gmod_wire_expression2/base/compiler.lua b/lua/entities/gmod_wire_expression2/base/compiler.lua index 202faba047..8b9ddef424 100644 --- a/lua/entities/gmod_wire_expression2/base/compiler.lua +++ b/lua/entities/gmod_wire_expression2/base/compiler.lua @@ -621,10 +621,13 @@ local CompileVisitors = { self.scope.data.ops = self.scope.data.ops + 5 return function(state) ---@param state RuntimeContext + local scope, scope_id = state.Scope, state.ScopeID state:PushScope() local ok, err = pcall(try_block, state) - state:PopScope() - if not ok then + if ok then + state:PopScope() + else + state.Scope, state.ScopeID = scope, scope_id -- Skip back any scopes that may have been created in try_block local catchable, msg = E2Lib.unpackException(err) if catchable then state:PushScope()