about summary refs log blame commit diff stats
path: root/misc_checks
blob: 91384ea359c4cace7f013e644df0ae809c0b8653 (plain) (tree)





















                                                                               
#!/bin/sh
# Hackily check for certain kinds of errors.
#
# We still rely exclusively on linux/bootstrap/bootstrap for some static
# checks on bare SubX code that aren't implemented yet in the self-hosted
# translator phases.
#
# However, boot.subx uses instructions that bootstrap doesn't recognize. So we
# won't check it.

set -e

cat $* [0-9]*.mu                                      |linux/mu      > a.subx

cat misc_checks.subx mu-init.subx [0-9]*.subx a.subx  |linux/braces  > a.braces
cat a.braces                                          |linux/calls   > a.calls
cat a.calls                                           |linux/sigils  > a.sigils

CXXFLAGS=-g linux/bootstrap/bootstrap --debug translate a.sigils -o a.elf
# Translation will never succeed,
# but if we get to "missing reference to global" errors, they're expected and
# we've gotten to the end of what bootstrap can check for us.
2d5e2db952a5433e34'>^
e4630643 ^

166e3c0d ^



cfb142b9 ^
8cb4e365 ^




1ead3562 ^
8cb4e365 ^




385ff136 ^
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


                                             
                                      



                                       

                                                
                                                                
                                                         
                     






                                             
                                                                                  



                                       








                                                
                                    
                                       
             
                                    
                                                                                                                                              

          
                                              
                                                                                                                                                                   

          



                                                
                     




                                                          
          




                              
                 
:(before "End Primitive Recipe Declarations")
RANDOM,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "random", RANDOM);
:(before "End Primitive Recipe Checks")
case RANDOM: {
  break;
}
:(before "End Primitive Recipe Implementations")
case RANDOM: {
  // todo: limited range of numbers, might be imperfectly random
  // todo: thread state in extra ingredients and products
  products.resize(1);
  products.at(0).push_back(rand());
  break;
}

:(before "End Primitive Recipe Declarations")
MAKE_RANDOM_NONDETERMINISTIC,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "make-random-nondeterministic", MAKE_RANDOM_NONDETERMINISTIC);
:(before "End Primitive Recipe Checks")
case MAKE_RANDOM_NONDETERMINISTIC: {
  break;
}
:(before "End Primitive Recipe Implementations")
case MAKE_RANDOM_NONDETERMINISTIC: {
  srand(time(NULL));
  break;
}

:(before "End Primitive Recipe Declarations")
ROUND,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "round", ROUND);
:(before "End Primitive Recipe Checks")
case ROUND: {
  if (SIZE(inst.ingredients) != 1) {
    raise << maybe(get(Recipe, r).name) << "'round' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end();
    break;
  }
  if (!is_mu_number(inst.ingredients.at(0))) {
    raise << maybe(get(Recipe, r).name) << "first ingredient of 'round' should be a number, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
    break;
  }
  break;
}
:(before "End Primitive Recipe Implementations")
case ROUND: {
  products.resize(1);
  products.at(0).push_back(rint(ingredients.at(0).at(0)));
  break;
}

:(scenario round_to_nearest_integer)
def main [
  1:number <- round 12.2
]
+mem: storing 12 in location 1

:(before "End Includes")
#include <math.h>