diff --git a/regression/orig/test069.log b/regression/orig/test069.log new file mode 100644 index 000000000..d14b46a2c --- /dev/null +++ b/regression/orig/test069.log @@ -0,0 +1 @@ +> 0 diff --git a/regression/orig/test070.log b/regression/orig/test070.log new file mode 100644 index 000000000..d14b46a2c --- /dev/null +++ b/regression/orig/test070.log @@ -0,0 +1 @@ +> 0 diff --git a/regression/test069.expr b/regression/test069.expr new file mode 100644 index 000000000..03c66ad08 --- /dev/null +++ b/regression/test069.expr @@ -0,0 +1,11 @@ +fun f (x) { + fun inner (y) { + return if y == 0 then 0 else inner (y-1) fi + } + + return inner (x) +} + +local n = read (); + +write (f (5)) \ No newline at end of file diff --git a/regression/test069.input b/regression/test069.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test069.input @@ -0,0 +1 @@ +5 diff --git a/regression/test070.expr b/regression/test070.expr new file mode 100644 index 000000000..602a9984b --- /dev/null +++ b/regression/test070.expr @@ -0,0 +1,15 @@ +fun f (x) { + fun inner1 (y) { + return if y == 0 then 0 else inner2 (y-1) fi + } + + fun inner2 (y) { + return if y == 0 then 0 else inner1 (y-1) fi + } + + return inner1 (x) +} + +local n = read (); + +write (f (5)) \ No newline at end of file diff --git a/regression/test070.input b/regression/test070.input new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/regression/test070.input @@ -0,0 +1 @@ +5 diff --git a/src/Language.ml b/src/Language.ml index 7e3111d2d..ebea9791d 100644 --- a/src/Language.ml +++ b/src/Language.ml @@ -132,7 +132,7 @@ module State = | I | G of (string * bool) list * (string, 'a) arrow | L of (string * bool) list * (string, 'a) arrow * 'a t - with show,html + with show, html (* Get the depth level of a state *) let rec level = function diff --git a/src/SM.ml b/src/SM.ml index 9b039d031..11c9e6ea4 100644 --- a/src/SM.ml +++ b/src/SM.ml @@ -425,8 +425,8 @@ object (self : 'self) }; scope = init_scope ( let rec readdress_to_closure = function - | State.L (xs, _, tl) -> - State.L (xs, (fun _ -> Value.Access (~-1)), readdress_to_closure tl) + | State.L (xs, st, tl) -> + State.L (xs, (fun name -> match st name with Value.Fun _ as x -> x | _ -> Value.Access (~-1)), readdress_to_closure tl) | st -> st in readdress_to_closure st' @@ -739,7 +739,12 @@ let compile cmd ((imports, infixes), p) = env, true, se @ (if fe then [LABEL lexp] else []) @ [DUP] @ (List.flatten @@ List.rev code) @ [JMP l] in let rec compile_fundef env ((name, args, stmt, st) as fd) = + (* Printf.eprintf "Compile fundef: %s, state=%s\n" name (show(State.t) (show(Value.designation)) st); *) + (* Printf.eprintf "st (inner) = %s\n" (try show(Value.designation) @@ State.eval st "inner" with _ -> " not found"); *) let env = env#open_fun_scope fd in + + (*Printf.eprintf "Lookup: %s\n%!" (try show(Value.designation) @@ snd (env#lookup "inner") with _ -> "no inner..."); *) + let env = List.fold_left (fun env arg -> env#add_arg arg) env args in let lend, env = env#get_label in let env, flag, code = compile_expr lend env stmt in