about summary refs log tree commit diff stats
path: root/test/testdir/zerobytes
diff options
context:
space:
mode:
authorWojciech Siewierski <wojciech.siewierski@onet.pl>2019-03-10 20:57:36 +0100
committerWojciech Siewierski <wojciech.siewierski@onet.pl>2019-03-10 21:04:07 +0100
commite0e0d5770f599ab928c91a53cc5bd805c16cce95 (patch)
tree6b65e0426079679f1e3b15e9add559622360a610 /test/testdir/zerobytes
parentf70c6560b6e950168b0b4481e1f20a7df121d60d (diff)
downloadranger-e0e0d5770f599ab928c91a53cc5bd805c16cce95.tar.gz
Temporarily disable open_all_images if there are too many images
In extreme cases, all the images may be too much to handle by the
system ("Argument list too long", errno 7).  In such cases, let's
Do The Right Thing™ and temporarily disable the open_all_images
setting.  Without this option we'll only open the single image.

Fixes #1488.
Diffstat (limited to 'test/testdir/zerobytes')
0 files changed, 0 insertions, 0 deletions
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 recipes 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(9991, "transform") << "--- check if recipe " << caller.name << " has any dependency-injection mistakes" << end();
  for (int index = 0;  index < SIZE(caller.steps);  ++index) {
    const instruction& inst = caller.steps.at(index);
    if (is_primitive(inst.operation)) continue;
    for (int i = 0;  i < SIZE(inst.ingredients);  ++i) {
      const reagent& ing = inst.ingredients.at(i);
      if (!is_literal(ing) || ing.name != "0") continue;
      const recipe& callee = get(Recipe, inst.operation);
      if (!callee.has_header) continue;
      if (i >= SIZE(callee.ingredients)) continue;
      const reagent& expected_ing = callee.ingredients.at(i);
      for (int j = 0;  j < SIZE(Real_hardware_types);  ++j) {
        if (*Real_hardware_types.at(j) == *expected_ing.type)
          raise << maybe(caller.name) << "'" << to_original_string(inst) << "': only 'main' can pass 0 into a " << to_string(expected_ing.type) << '\n' << end();
      }
    }
  }
}

:(scenarios transform)
:(scenario warn_on_using_real_screen_directly_in_non_main_recipe)
% Hide_errors = true;
def foo [
  print 0, 34
]
+error: foo: 'print 0, 34': only 'main' can pass 0 into a (address screen)