blob: 42ad271fb2067fe6716573ce3291017504b68097 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
//: Let's raise errors when students use real hardware in any functions
//: besides 'main'. Part of the goal is to teach them testing hygiene and
//: dependency injection.
//:
//: This is easy to sidestep, it's for feedback rather than safety.
:(before "End Globals")
vector<type_tree*> Real_hardware_types;
:(before "Begin transform_all")
setup_real_hardware_types();
:(before "End transform_all")
teardown_real_hardware_types();
:(code)
void setup_real_hardware_types() {
Real_hardware_types.push_back(parse_type("address:screen"));
Real_hardware_types.push_back(parse_type("address:console"));
Real_hardware_types.push_back(parse_type("address:resources"));
}
type_tree* parse_type(string s) {
reagent x("x:"+s);
type_tree* result = x.type;
x.type = NULL; // don't deallocate on return
return result;
}
void teardown_real_hardware_types() {
for (int i = 0; i < SIZE(Real_hardware_types); ++i)
delete Real_hardware_types.at(i);
Real_hardware_types.clear();
}
:(before "End Checks")
Transform.push_back(check_for_misuse_of_real_hardware);
:(code)
void check_for_misuse_of_real_hardware(const recipe_ordinal r) {
const recipe& caller = get(Recipe, r);
if (caller.name == "main") return;
if (starts_with(caller.name, "scenario_")) return;
trace
|