summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/isail.ml165
1 files changed, 107 insertions, 58 deletions
diff --git a/src/isail.ml b/src/isail.ml
index 7c4affa3..dc7858c9 100644
--- a/src/isail.ml
+++ b/src/isail.ml
@@ -193,34 +193,75 @@ let rec run () =
match !current_mode with
| Normal | Emacs -> ()
| Evaluation frame ->
- begin
- match frame with
- | Done (state, v) ->
- interactive_state := state;
- print_endline ("Result = " ^ Value.string_of_value v);
- current_mode := Normal
- | Fail (_, _, _, _, msg) ->
- print_endline ("Error: " ^ msg);
- current_mode := Normal
- | Step (out, state, _, stack) ->
- begin
- try
- current_mode := Evaluation (eval_frame frame)
- with
- | Failure str -> print_endline str; current_mode := Normal
- end;
- run ()
- | Break frame ->
- print_endline "Breakpoint";
- current_mode := Evaluation frame
- | Effect_request (out, state, stack, eff) ->
- begin
- try
- current_mode := Evaluation (!Interpreter.effect_interp state eff)
- with
- | Failure str -> print_endline str; current_mode := Normal
- end;
- run ()
+ begin match frame with
+ | Done (state, v) ->
+ interactive_state := state;
+ print_endline ("Result = " ^ Value.string_of_value v);
+ current_mode := Normal
+ | Fail (_, _, _, _, msg) ->
+ print_endline ("Error: " ^ msg);
+ current_mode := Normal
+ | Step (out, state, _, stack) ->
+ begin
+ try
+ current_mode := Evaluation (eval_frame frame)
+ with
+ | Failure str -> print_endline str; current_mode := Normal
+ end;
+ run ()
+ | Break frame ->
+ print_endline "Breakpoint";
+ current_mode := Evaluation frame
+ | Effect_request (out, state, stack, eff) ->
+ begin
+ try
+ current_mode := Evaluation (!Interpreter.effect_interp state eff)
+ with
+ | Failure str -> print_endline str; current_mode := Normal
+ end;
+ run ()
+ end
+
+let rec run_function depth =
+ let run_function' stack =
+ match depth with
+ | None -> run_function (Some (List.length stack))
+ | Some n ->
+ if List.compare_length_with stack n >= 0 then
+ run_function depth
+ else
+ ()
+ in
+ match !current_mode with
+ | Normal | Emacs -> ()
+ | Evaluation frame ->
+ begin match frame with
+ | Done (state, v) ->
+ interactive_state := state;
+ print_endline ("Result = " ^ Value.string_of_value v);
+ current_mode := Normal
+ | Fail (_, _, _, _, msg) ->
+ print_endline ("Error: " ^ msg);
+ current_mode := Normal
+ | Step (out, state, _, stack) ->
+ begin
+ try
+ current_mode := Evaluation (eval_frame frame)
+ with
+ | Failure str -> print_endline str; current_mode := Normal
+ end;
+ run_function' stack
+ | Break frame ->
+ print_endline "Breakpoint";
+ current_mode := Evaluation frame
+ | Effect_request (out, state, stack, eff) ->
+ begin
+ try
+ current_mode := Evaluation (!Interpreter.effect_interp state eff)
+ with
+ | Failure str -> print_endline str; current_mode := Normal
+ end;
+ run_function' stack
end
let rec run_steps n =
@@ -228,36 +269,35 @@ let rec run_steps n =
| _ when n <= 0 -> ()
| Normal | Emacs -> ()
| Evaluation frame ->
- begin
- match frame with
- | Done (state, v) ->
- interactive_state := state;
- print_endline ("Result = " ^ Value.string_of_value v);
- current_mode := Normal
- | Fail (_, _, _, _, msg) ->
- print_endline ("Error: " ^ msg);
- current_mode := Normal
- | Step (out, state, _, stack) ->
- begin
- try
- current_mode := Evaluation (eval_frame frame)
- with
- | Failure str -> print_endline str; current_mode := Normal
- end;
- run_steps (n - 1)
- | Break frame ->
- print_endline "Breakpoint";
- current_mode := Evaluation frame
- | Effect_request (out, state, stack, eff) ->
- begin
- try
- current_mode := Evaluation (!Interpreter.effect_interp state eff)
- with
- | Failure str -> print_endline str; current_mode := Normal
- end;
- run_steps (n - 1)
+ begin match frame with
+ | Done (state, v) ->
+ interactive_state := state;
+ print_endline ("Result = " ^ Value.string_of_value v);
+ current_mode := Normal
+ | Fail (_, _, _, _, msg) ->
+ print_endline ("Error: " ^ msg);
+ current_mode := Normal
+ | Step (out, state, _, stack) ->
+ begin
+ try
+ current_mode := Evaluation (eval_frame frame)
+ with
+ | Failure str -> print_endline str; current_mode := Normal
+ end;
+ run_steps (n - 1)
+ | Break frame ->
+ print_endline "Breakpoint";
+ current_mode := Evaluation frame
+ | Effect_request (out, state, stack, eff) ->
+ begin
+ try
+ current_mode := Evaluation (!Interpreter.effect_interp state eff)
+ with
+ | Failure str -> print_endline str; current_mode := Normal
+ end;
+ run_steps (n - 1)
end
-
+
let help =
let open Printf in
let open Util in
@@ -298,6 +338,8 @@ let help =
| ":s" | ":step" ->
sprintf "(:s | :step) %s - Perform a number of evaluation steps."
(color yellow "<number>")
+ | ":f" | ":step_function" ->
+ sprintf "(:s | :step) - Perform evaluation steps until the currently evaulating function returns."
| ":n" | ":normal" ->
"(:n | :normal) - Exit evaluation mode back to normal mode."
| ":clear" ->
@@ -422,6 +464,9 @@ let handle_input' input =
let cmd = Str.string_before input n in
let arg = String.trim (Str.string_after input n) in
Command (cmd, arg)
+ else if String.length input >= 2 && input.[0] = '/' && input.[1] = '/' then
+ (* Treat anything starting with // as a comment *)
+ Empty
else if input <> "" then
Expression input
else
@@ -693,7 +738,11 @@ let handle_input' input =
| ":r" | ":run" ->
run ()
| ":s" | ":step" ->
- run_steps (int_of_string arg)
+ run_steps (int_of_string arg);
+ print_program ()
+ | ":f" | ":step_function" ->
+ run_function None;
+ print_program ()
| _ -> unrecognised_command cmd
end
| Expression str ->