Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit f0b9b8e

Browse files
committedNov 23, 2017
ocamltest: refactoring and implementation of hooks
1 parent c6f3a00 commit f0b9b8e

40 files changed

+1979
-1363
lines changed
 

‎ocamltest/.depend

Lines changed: 64 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,88 @@
1-
run_unix.$(O): run_unix.c run.h run_common.h
2-
run_stubs.$(O): run_stubs.c run.h ../byterun/caml/mlvalues.h \
1+
run_unix.$(O): run_unix.c run.h ../byterun/caml/misc.h \
32
../byterun/caml/config.h ../byterun/caml/m.h ../byterun/caml/s.h \
4-
../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \
5-
../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \
6-
../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \
7-
../byterun/caml/address_class.h ../byterun/caml/io.h
3+
run_common.h
4+
run_stubs.$(O): run_stubs.c run.h ../byterun/caml/misc.h \
5+
../byterun/caml/config.h ../byterun/caml/m.h ../byterun/caml/s.h \
6+
../byterun/caml/mlvalues.h ../byterun/caml/misc.h \
7+
../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \
8+
../byterun/caml/major_gc.h ../byterun/caml/freelist.h \
9+
../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \
10+
../byterun/caml/io.h ../byterun/caml/osdeps.h ../byterun/caml/memory.h
811
actions.cmo : environments.cmi actions.cmi
912
actions.cmx : environments.cmx actions.cmi
1013
actions.cmi : environments.cmi
11-
backends.cmo : backends.cmi
12-
backends.cmx : backends.cmi
13-
backends.cmi :
14-
builtin_actions.cmo : variables.cmi testlib.cmi run_command.cmi \
15-
ocamltest_config.cmi filetype.cmi filecompare.cmi environments.cmi \
16-
builtin_variables.cmi builtin_modifiers.cmi backends.cmi actions.cmi \
14+
actions_helpers.cmo : variables.cmi run_command.cmi ocamltest_stdlib.cmi \
15+
filecompare.cmi environments.cmi builtin_variables.cmi actions.cmi \
16+
actions_helpers.cmi
17+
actions_helpers.cmx : variables.cmx run_command.cmx ocamltest_stdlib.cmx \
18+
filecompare.cmx environments.cmx builtin_variables.cmx actions.cmx \
19+
actions_helpers.cmi
20+
actions_helpers.cmi : variables.cmi environments.cmi actions.cmi
21+
builtin_actions.cmo : ocamltest_stdlib.cmi ocamltest_config.cmi \
22+
environments.cmi builtin_variables.cmi actions_helpers.cmi actions.cmi \
1723
builtin_actions.cmi
18-
builtin_actions.cmx : variables.cmx testlib.cmx run_command.cmx \
19-
ocamltest_config.cmx filetype.cmx filecompare.cmx environments.cmx \
20-
builtin_variables.cmx builtin_modifiers.cmx backends.cmx actions.cmx \
24+
builtin_actions.cmx : ocamltest_stdlib.cmx ocamltest_config.cmx \
25+
environments.cmx builtin_variables.cmx actions_helpers.cmx actions.cmx \
2126
builtin_actions.cmi
2227
builtin_actions.cmi : actions.cmi
23-
builtin_modifiers.cmo : environments.cmi builtin_variables.cmi \
24-
builtin_modifiers.cmi
25-
builtin_modifiers.cmx : environments.cmx builtin_variables.cmx \
26-
builtin_modifiers.cmi
27-
builtin_modifiers.cmi : environments.cmi
28-
builtin_tests.cmo : tests.cmi builtin_actions.cmi builtin_tests.cmi
29-
builtin_tests.cmx : tests.cmx builtin_actions.cmx builtin_tests.cmi
30-
builtin_tests.cmi : tests.cmi
3128
builtin_variables.cmo : variables.cmi builtin_variables.cmi
3229
builtin_variables.cmx : variables.cmx builtin_variables.cmi
3330
builtin_variables.cmi : variables.cmi
34-
environments.cmo : variables.cmi environments.cmi
35-
environments.cmx : variables.cmx environments.cmi
31+
environments.cmo : variables.cmi ocamltest_stdlib.cmi environments.cmi
32+
environments.cmx : variables.cmx ocamltest_stdlib.cmx environments.cmi
3633
environments.cmi : variables.cmi
37-
filecompare.cmo : testlib.cmi run_command.cmi filecompare.cmi
38-
filecompare.cmx : testlib.cmx run_command.cmx filecompare.cmi
34+
filecompare.cmo : run_command.cmi ocamltest_stdlib.cmi filecompare.cmi
35+
filecompare.cmx : run_command.cmx ocamltest_stdlib.cmx filecompare.cmi
3936
filecompare.cmi :
4037
filetype.cmo : filetype.cmi
4138
filetype.cmx : filetype.cmi
4239
filetype.cmi :
4340
main.cmo : tsl_semantics.cmi tsl_parser.cmi tsl_lexer.cmi tests.cmi \
44-
testlib.cmi options.cmi ocamltest_config.cmi environments.cmi \
45-
builtin_variables.cmi actions.cmi main.cmi
41+
options.cmi ocamltest_stdlib.cmi environments.cmi builtin_variables.cmi \
42+
actions_helpers.cmi actions.cmi main.cmi
4643
main.cmx : tsl_semantics.cmx tsl_parser.cmx tsl_lexer.cmx tests.cmx \
47-
testlib.cmx options.cmx ocamltest_config.cmx environments.cmx \
48-
builtin_variables.cmx actions.cmx main.cmi
44+
options.cmx ocamltest_stdlib.cmx environments.cmx builtin_variables.cmx \
45+
actions_helpers.cmx actions.cmx main.cmi
4946
main.cmi :
47+
ocaml_actions.cmo : variables.cmi ocamltest_stdlib.cmi ocamltest_config.cmi \
48+
ocaml_variables.cmi ocaml_modifiers.cmi ocaml_backends.cmi filetype.cmi \
49+
filecompare.cmi environments.cmi builtin_variables.cmi \
50+
actions_helpers.cmi actions.cmi ocaml_actions.cmi
51+
ocaml_actions.cmx : variables.cmx ocamltest_stdlib.cmx ocamltest_config.cmx \
52+
ocaml_variables.cmx ocaml_modifiers.cmx ocaml_backends.cmx filetype.cmx \
53+
filecompare.cmx environments.cmx builtin_variables.cmx \
54+
actions_helpers.cmx actions.cmx ocaml_actions.cmi
55+
ocaml_actions.cmi : actions.cmi
56+
ocaml_backends.cmo : ocamltest_stdlib.cmi ocaml_backends.cmi
57+
ocaml_backends.cmx : ocamltest_stdlib.cmx ocaml_backends.cmi
58+
ocaml_backends.cmi : ocamltest_stdlib.cmi
59+
ocaml_modifiers.cmo : ocamltest_stdlib.cmi ocamltest_config.cmi \
60+
ocaml_variables.cmi environments.cmi builtin_variables.cmi \
61+
ocaml_modifiers.cmi
62+
ocaml_modifiers.cmx : ocamltest_stdlib.cmx ocamltest_config.cmx \
63+
ocaml_variables.cmx environments.cmx builtin_variables.cmx \
64+
ocaml_modifiers.cmi
65+
ocaml_modifiers.cmi : environments.cmi
66+
ocaml_tests.cmo : tests.cmi ocamltest_config.cmi ocaml_actions.cmi \
67+
builtin_actions.cmi ocaml_tests.cmi
68+
ocaml_tests.cmx : tests.cmx ocamltest_config.cmx ocaml_actions.cmx \
69+
builtin_actions.cmx ocaml_tests.cmi
70+
ocaml_tests.cmi : tests.cmi
71+
ocaml_variables.cmo : variables.cmi ocaml_variables.cmi
72+
ocaml_variables.cmx : variables.cmx ocaml_variables.cmi
73+
ocaml_variables.cmi : variables.cmi
5074
ocamltest_config.cmo : ocamltest_config.cmi
5175
ocamltest_config.cmx : ocamltest_config.cmi
5276
ocamltest_config.cmi :
77+
ocamltest_stdlib.cmo : ocamltest_stdlib.cmi
78+
ocamltest_stdlib.cmx : ocamltest_stdlib.cmi
79+
ocamltest_stdlib.cmi :
5380
options.cmo : tests.cmi actions.cmi options.cmi
5481
options.cmx : tests.cmx actions.cmx options.cmi
5582
options.cmi :
56-
run_command.cmo : testlib.cmi run_command.cmi
57-
run_command.cmx : testlib.cmx run_command.cmi
83+
run_command.cmo : ocamltest_stdlib.cmi run_command.cmi
84+
run_command.cmx : ocamltest_stdlib.cmx run_command.cmi
5885
run_command.cmi :
59-
testlib.cmo : testlib.cmi
60-
testlib.cmx : testlib.cmi
61-
testlib.cmi :
6286
tests.cmo : actions.cmi tests.cmi
6387
tests.cmx : actions.cmx tests.cmi
6488
tests.cmi : environments.cmi actions.cmi
@@ -71,10 +95,10 @@ tsl_lexer.cmi : tsl_parser.cmi
7195
tsl_parser.cmo : tsl_ast.cmi tsl_parser.cmi
7296
tsl_parser.cmx : tsl_ast.cmx tsl_parser.cmi
7397
tsl_parser.cmi : tsl_ast.cmi
74-
tsl_semantics.cmo : variables.cmi tsl_ast.cmi tests.cmi testlib.cmi \
75-
environments.cmi actions.cmi tsl_semantics.cmi
76-
tsl_semantics.cmx : variables.cmx tsl_ast.cmx tests.cmx testlib.cmx \
77-
environments.cmx actions.cmx tsl_semantics.cmi
98+
tsl_semantics.cmo : variables.cmi tsl_ast.cmi tests.cmi environments.cmi \
99+
actions.cmi tsl_semantics.cmi
100+
tsl_semantics.cmx : variables.cmx tsl_ast.cmx tests.cmx environments.cmx \
101+
actions.cmx tsl_semantics.cmi
78102
tsl_semantics.cmi : tsl_ast.cmi tests.cmi environments.cmi actions.cmi
79103
variables.cmo : variables.cmi
80104
variables.cmx : variables.cmi

‎ocamltest/Makefile

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ include ../config/Makefile
1919

2020
ifeq "$(UNIX_OR_WIN32)" "win32"
2121
unix := false
22-
ocamlsrcdir := $(shell echo "$(abspath $(shell pwd)/..)"|cygpath -m -f -)
22+
ocamlsrcdir := $(shell echo "$(abspath $(shell pwd)/..)"|cygpath -w -f - \
23+
| sed 's/\\/\\\\\\\\/g')
2324
else
2425
unix := true
2526
ocamlsrcdir := $(abspath $(shell pwd)/..)
@@ -32,27 +33,37 @@ run := run_$(UNIX_OR_WIN32)
3233
# List of source files from which ocamltest is compiled
3334
# (all the different sorts of files are derived from this)
3435

35-
sources := \
36+
# ocamltest has two components: its core and the OCaml "plugin"
37+
# which is actually built into the tool but clearly separated from its core
38+
39+
core := \
3640
$(run).c \
3741
run_stubs.c \
3842
ocamltest_config.mli ocamltest_config.ml.in \
39-
testlib.mli testlib.ml \
43+
ocamltest_stdlib.mli ocamltest_stdlib.ml \
4044
run_command.mli run_command.ml \
4145
filetype.mli filetype.ml \
4246
filecompare.mli filecompare.ml \
43-
backends.mli backends.ml \
4447
variables.mli variables.ml \
4548
environments.mli environments.ml \
46-
builtin_variables.mli builtin_variables.ml \
47-
builtin_modifiers.mli builtin_modifiers.ml \
4849
actions.mli actions.ml \
49-
builtin_actions.mli builtin_actions.ml \
5050
tests.mli tests.ml \
51-
builtin_tests.mli builtin_tests.ml \
5251
tsl_ast.mli tsl_ast.ml \
5352
tsl_parser.mly \
5453
tsl_lexer.mli tsl_lexer.mll \
5554
tsl_semantics.mli tsl_semantics.ml \
55+
builtin_variables.mli builtin_variables.ml \
56+
actions_helpers.mli actions_helpers.ml \
57+
builtin_actions.mli builtin_actions.ml
58+
59+
ocaml_plugin := \
60+
ocaml_backends.mli ocaml_backends.ml \
61+
ocaml_variables.mli ocaml_variables.ml \
62+
ocaml_modifiers.mli ocaml_modifiers.ml \
63+
ocaml_actions.mli ocaml_actions.ml \
64+
ocaml_tests.mli ocaml_tests.ml
65+
66+
sources := $(core) $(ocaml_plugin) \
5667
options.mli options.ml \
5768
main.mli main.ml
5869

‎ocamltest/actions.ml

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,39 +29,54 @@ let string_of_result = function
2929
| Fail reason -> string_of_reason "Fail" reason
3030
| Skip reason -> string_of_reason "Skip" reason
3131

32-
type body = out_channel -> Environments.t -> result
32+
type code = out_channel -> Environments.t -> result
3333

3434
type t = {
35-
action_name : string;
36-
action_environment : Environments.t -> Environments.t;
37-
action_body : body
35+
name : string;
36+
body : code;
37+
mutable hook : code option
3838
}
3939

40-
let compare a1 a2 = String.compare a1.action_name a2.action_name
40+
let action_name a = a.name
41+
42+
let make n c = { name = n; body = c; hook = None }
43+
44+
let compare a1 a2 = String.compare a1.name a2.name
4145

4246
let (actions : (string, t) Hashtbl.t) = Hashtbl.create 10
4347

4448
let register action =
45-
Hashtbl.add actions action.action_name action
49+
Hashtbl.add actions action.name action
4650

4751
let get_registered_actions () =
48-
let f _action_name action acc = action::acc in
52+
let f _name action acc = action::acc in
4953
let unsorted_actions = Hashtbl.fold f actions [] in
5054
List.sort compare unsorted_actions
5155

5256
let lookup name =
5357
try Some (Hashtbl.find actions name)
5458
with Not_found -> None
5559

60+
let set_hook name hook =
61+
let action = (Hashtbl.find actions name) in
62+
action.hook <- Some hook
63+
64+
let clear_hook name =
65+
let action = (Hashtbl.find actions name) in
66+
action.hook <- None
67+
68+
let clear_all_hooks () =
69+
let f _name action = action.hook <- None in
70+
Hashtbl.iter f actions
71+
5672
let run log env action =
57-
action.action_body log env
73+
let code = match action.hook with
74+
| None -> action.body
75+
| Some code -> code in
76+
code log env
5877

5978
module ActionSet = Set.Make
6079
(struct
6180
type nonrec t = t
6281
let compare = compare
6382
end)
64-
65-
let update_environment initial_env actions =
66-
let f act env = act.action_environment env in
67-
ActionSet.fold f actions initial_env

‎ocamltest/actions.mli

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ type result =
2222

2323
val string_of_result : result -> string
2424

25-
type body = out_channel -> Environments.t -> result
25+
type code = out_channel -> Environments.t -> result
2626

27-
type t = {
28-
action_name : string;
29-
action_environment : Environments.t -> Environments.t;
30-
action_body : body
31-
}
27+
type t
28+
29+
val action_name : t -> string
30+
31+
val make : string -> code -> t
3232

3333
val compare : t -> t -> int
3434

@@ -38,8 +38,10 @@ val get_registered_actions : unit -> t list
3838

3939
val lookup : string -> t option
4040

41+
val set_hook : string -> code -> unit
42+
val clear_hook : string -> unit
43+
val clear_all_hooks : unit -> unit
44+
4145
val run : out_channel -> Environments.t -> t -> result
4246

4347
module ActionSet : Set.S with type elt = t
44-
45-
val update_environment : Environments.t -> ActionSet.t -> Environments.t

0 commit comments

Comments
 (0)
Please sign in to comment.