From: Fabien Fleutot Date: Thu, 25 Dec 2008 14:32:45 +0000 (+0100) Subject: fixed a bug in match statements with multiple cases and var bindings shared among... X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=c9b3ddb4ec5816116ed3ccfb06f711967b294594;p=metalua.git fixed a bug in match statements with multiple cases and var bindings shared among multiple cases. For instance, "match `X 1 with `Y{a} | `X{a} -> assert true end" would break due to instances of "a" in both alternatives --- diff --git a/src/lib/metalua/extension/match.mlua b/src/lib/metalua/extension/match.mlua index 636f70b..fbc032c 100644 --- a/src/lib/metalua/extension/match.mlua +++ b/src/lib/metalua/extension/match.mlua @@ -73,11 +73,11 @@ module ('spmatch', package.seeall) -tmpvar_base = mlp.gensym 'table_submatch.' [1] +tmpvar_base = mlp.gensym 'submatch.' [1] function next_tmpvar(cfg) - local n2 = cfg.ntmp - if cfg.ntmp then n2=cfg.ntmp+1; cfg.ntmp=n2 else cfg.ntmp, n2 = 1, 1 end - return `Id{ tmpvar_base .. n2 } + assert (cfg.ntmp, "No cfg.ntmp imbrication level in the match compiler") + cfg.ntmp = cfg.ntmp+1 + return `Id{ tmpvar_base .. cfg.ntmp } end -- Code accumulators @@ -216,7 +216,9 @@ end -- term_seq. function pattern_seq_builder (pattern_seq, term_seq, cfg) if #pattern_seq ~= #term_seq then error ("Bad seq arity") end + cfg.locals = { } -- reset bound variables between alternatives for i=1, #pattern_seq do + cfg.ntmp = 1 -- reset the tmp var generator pattern_element_builder(pattern_seq[i], term_seq[i], cfg) end end @@ -237,10 +239,10 @@ function case_builder (case, term_seq, cfg) for i = 1, #patterns_group do local pattern_seq = patterns_group[i] cfg.on_failure = mlp.gensym 'match_fail' [1] - pattern_seq_builder(pattern_seq, term_seq, cfg) + pattern_seq_builder (pattern_seq, term_seq, cfg) if i<#patterns_group then - acc_stat(`Goto{on_success}, cfg) - acc_stat(`Label{cfg.on_failure}, cfg) + acc_stat (`Goto{on_success}, cfg) + acc_stat (`Label{cfg.on_failure}, cfg) end end acc_stat (`Label{on_success}, cfg)