about summary refs log blame commit diff stats
path: root/html/099hardware_checks.cc.html
blob: 80835903aefb573d110507274afc2171fab40f70 (plain) (tree)
span class="sb">``` ``` <name> +≡ <code> ``` _(`<code>` can span multiple lines.)_ This approach is best suited for top-down exposition. On the other hand, Mu's tangling directives are better suited for a cleaned-up history of a codebase. Subsystems start out with a simple skeleton of the core of the program. Later versions then tell a story of the evolution of the program, with each version colocating all the code related to new features. Read more: * http://akkartik.name/post/wart-layers * http://akkartik.name/post/literate-programming * https://github.com/akkartik/mu/blob/master/000organization.cc ## directives Add code to a project: ``` :(code) <code> ``` Insert code before a specific line: ``` :(before <waypoint>) <code> ``` Here `<waypoint>` is a substring matching a single line in the codebase. (We never use regular expressions.) Surround the substring in `"` quotes if it spans multiple words. Insert code _after_ a specific line: ``` :(after <waypoint>) <code> ``` Delete a specific previously-added line (because it's not needed in a newer version). ``` :(delete <line>) ``` Delete a block of code starting with a given header and surrounded by `{` and `}`: ``` :(delete{} <header>) ``` _(Caveat: doesn't directly support C's `do`..`while` loops.)_ Replace a specific line with new code: ``` :(replace <line>) <code> ``` This is identical to: ``` :(before <line>) <code> :(delete <line>) ``` _(Assuming `<code>` did not insert a new line matching the substring `<line>`.)_ Replace a block of code with another: ``` :(replace{} <header>) <code> ``` Insert code before or after a substring pattern that isn't quite a unique waypoint in the whole codebase: ``` :(before <line> following <waypoint>) <code> :(after <line> following <waypoint>) <code> ``` ``` :(before <waypoint> then <line>) <code> :(after <waypoint> then <line>) <code> ```
fe9abfea7d1'>^
9e751bb8 ^















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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130











                                                                                                               


                                                                                                 


                                       
                             



                                  
                                                        


                               
                                                                           


































                                                                                 


                                                                                                                                                 





















                                                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                                                                      









                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   



                                                                                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                















                                                                                                                                                     
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 099hardware_checks.cc</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #aaaaaa; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #aaaaaa; background-color: #080808; }
a { color:#eeeeee; text-decoration: none; }
a:hover { text-decoration: underline; }
* { font-size: 12pt; font-size: 1em; }
.Constant { color: #00a0a0; }
.muRecipe { color: #ff8700; }
.Conceal { color: #4e4e4e; }
.traceContains { color: #008000; }
.Special { color: #c00000; }
.Comment { color: #9090ff; }
.Comment a { color:#0000ee; text-decoration:underline; }
.Delimiter { color: #800080; }
.LineNr { color: #444444; }
.Identifier { color: #c0a020; }
.Normal { color: #aaaaaa; background-color: #080808; padding-bottom: 1px; }
.cSpecial { color: #008000; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Let's raise errors when students use real hardware in any recipes besides</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//: 'main'. Part of the goal is to teach them testing hygiene and dependency</span>
<span id="L3" class="LineNr"> 3 </span><span class="Comment">//: injection.</span>
<span id="L4" class="LineNr"> 4 </span><span class="Comment">//:</span>
<span id="L5" class="LineNr"> 5 </span><span class="Comment">//: This is easy to sidestep, it's for feedback rather than safety.</span>
<span id="L6" class="LineNr"> 6 </span>
<span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L8" class="LineNr"> 8 </span>vector&lt;type_tree*&gt; Real_hardware_types<span class="Delimiter">;</span>
<span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before &quot;Begin transform_all&quot;)</span>
<span id="L10" class="LineNr">10 </span><a href='099hardware_checks.cc.html#L14'>setup_real_hardware_types</a><span class="Delimiter">();</span>
<span id="L11" class="LineNr">11 </span><span class="Delimiter">:(before &quot;End transform_all&quot;)</span>
<span id="L12" class="LineNr">12 </span><a href='099hardware_checks.cc.html#L25'>teardown_real_hardware_types</a><span class="Delimiter">();</span>
<span id="L13" class="LineNr">13 </span><span class="Delimiter">:(code)</span>
<span id="L14" class="LineNr">14 </span><span class="Normal">void</span> <a href='099hardware_checks.cc.html#L14'>setup_real_hardware_types</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L15" class="LineNr">15 </span>  Real_hardware_types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='099hardware_checks.cc.html#L19'>parse_type</a><span class="Delimiter">(</span><span class="Constant">&quot;address:screen&quot;</span><span class="Delimiter">));</span>
<span id="L16" class="LineNr">16 </span>  Real_hardware_types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='099hardware_checks.cc.html#L19'>parse_type</a><span class="Delimiter">(</span><span class="Constant">&quot;address:console&quot;</span><span class="Delimiter">));</span>
<span id="L17" class="LineNr">17 </span>  Real_hardware_types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='099hardware_checks.cc.html#L19'>parse_type</a><span class="Delimiter">(</span><span class="Constant">&quot;address:resources&quot;</span><span class="Delimiter">));</span>
<span id="L18" class="LineNr">18 </span><span class="Delimiter">}</span>
<span id="L19" class="LineNr">19 </span>type_tree* <a href='099hardware_checks.cc.html#L19'>parse_type</a><span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L20" class="LineNr">20 </span>  reagent x<span class="Delimiter">(</span><span class="Constant">&quot;x:&quot;</span>+s<span class="Delimiter">);</span>
<span id="L21" class="LineNr">21 </span>  type_tree* result = x<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
<span id="L22" class="LineNr">22 </span>  x<span class="Delimiter">.</span>type = <span class="Constant">NULL</span><span class="Delimiter">;</span>  <span class="Comment">// don't deallocate on return</span>
<span id="L23" class="LineNr">23 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L24" class="LineNr">24 </span><span class="Delimiter">}</span>
<span id="L25" class="LineNr">25 </span><span class="Normal">void</span> <a href='099hardware_checks.cc.html#L25'>teardown_real_hardware_types</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L26" class="LineNr">26 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>Real_hardware_types<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
<span id="L27" class="LineNr">27 </span>  <span class="Conceal">¦</span> <span class="Normal">delete</span> Real_hardware_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L28" class="LineNr">28 </span>  Real_hardware_types<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L29" class="LineNr">29 </span><span class="Delimiter">}</span>
<span id="L30" class="LineNr">30 </span>
<span id="L31" class="LineNr">31 </span><span class="Delimiter">:(before &quot;End Checks&quot;)</span>
<span id="L32" class="LineNr">32 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='099hardware_checks.cc.html#L34'>check_for_misuse_of_real_hardware</a><span class="Delimiter">);</span>
<span id="L33" class="LineNr">33 </span><span class="Delimiter">:(code)</span>
<span id="L34" class="LineNr">34 </span><span class="Normal">void</span> <a href='099hardware_checks.cc.html#L34'>check_for_misuse_of_real_hardware</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L35" class="LineNr">35 </span>  <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
<span id="L36" class="LineNr">36 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name == <span class="Constant">&quot;main&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L37" class="LineNr">37 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L77'>starts_with</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;scenario_&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L38" class="LineNr">38 </span>  <a href='003trace.cc.html#L161'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check if <a href='010vm.cc.html#L19'>recipe</a> &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; has any dependency-injection mistakes&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L39" class="LineNr">39 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L40" class="LineNr">40 </span>  <span class="Conceal">¦</span> <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
<span id="L41" class="LineNr">41 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='028call_return.cc.html#L114'>is_primitive</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L42" class="LineNr">42 </span>  <span class="Conceal">¦</span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L43" class="LineNr">43 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">const</span> reagent&amp; ing = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L44" class="LineNr">44 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>ing<span class="Delimiter">)</span> || ing<span class="Delimiter">.</span>name != <span class="Constant">&quot;0&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L45" class="LineNr">45 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">const</span> recipe&amp; callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span>
<span id="L46" class="LineNr">46 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!callee<span class="Delimiter">.</span>has_header<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L47" class="LineNr">47 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt;= <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L48" class="LineNr">48 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">const</span> reagent&amp; expected_ing = callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L49" class="LineNr">49 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>Real_hardware_types<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L50" class="LineNr">50 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>*Real_hardware_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> == *expected_ing<span class="Delimiter">.</span>type<span class="Delimiter">)</span>
<span id="L51" class="LineNr">51 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': only 'main' can pass 0 into a &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L162'>to_string</a><span class="Delimiter">(</span>expected_ing<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L52" class="LineNr">52 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L53" class="LineNr">53 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L54" class="LineNr">54 </span>  <span class="Delimiter">}</span>
<span id="L55" class="LineNr">55 </span><span class="Delimiter">}</span>
<span id="L56" class="LineNr">56 </span>
<span id="L57" class="LineNr">57 </span><span class="Delimiter">:(scenarios transform)</span>
<span id="L58" class="LineNr">58 </span><span class="Delimiter">:(scenario warn_on_using_real_screen_directly_in_non_main_recipe)</span>
<span id="L59" class="LineNr">59 </span><span class="Special">% Hide_errors = true;</span>
<span id="L60" class="LineNr">60 </span><span class="muRecipe">def</span> foo [
<span id="L61" class="LineNr">61 </span>  print <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L62" class="LineNr">62 </span>]
<span id="L63" class="LineNr">63 </span><span class="traceContains">+error: foo: 'print 0, 34': only 'main' can pass 0 into a (address screen)</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->