Ne pas evaluer plusieurs fois les arguments dans Matching.for_multiple_match (bug de M. Quercia)

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@2290 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 1999-02-17 16:59:41 +00:00
parent f57a4d6852
commit 2cda61d091
1 changed files with 11 additions and 7 deletions

View File

@ -527,11 +527,15 @@ let for_multiple_match loc paraml pat_act_list =
args = [Lprim(Pmakeblock(0, Immutable), paraml), Strict] } in
let pm2 =
simplify_matching pm1 in
let pm3 =
try
try
let idl = List.map (fun _ -> Ident.create "match") paraml in
let pm3 =
{ cases = flatten_cases (List.length paraml) pm2.cases;
args = List.map (fun lam -> (lam, Strict)) paraml }
with Cannot_flatten ->
pm2 in
let (lambda, total) = compile_match None pm3 in
if total then lambda else Lcatch(lambda, partial_function loc ())
args = List.map (fun id -> (Lvar id, Alias)) idl } in
let (lambda, total) = compile_match None pm3 in
let lambda2 =
if total then lambda else Lcatch(lambda, partial_function loc ()) in
List.fold_right2 (bind Strict) idl paraml lambda2
with Cannot_flatten ->
let (lambda, total) = compile_match None pm2 in
if total then lambda else Lcatch(lambda, partial_function loc ())