about summary refs log tree commit diff stats
path: root/html/012transform.cc.html
blob: c7aa2a27eec35e389b42b1e2a567685707d59472 (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
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<!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 - 012transform.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: #eeeeee; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
a { text-decoration: none; }
a:hover { text-decoration: underline; }
* { font-size: 12pt; font-size: 1em; }
.Constant { color: #00a0a0; }
.Comment { color: #9090ff; }
.Delimiter { color: #800080; }
.LineNr { color: #444444; }
.Identifier { color: #c0a020; }
.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
-->
</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">//: Phase 2: Filter loaded recipes through an extensible list of 'transforms'.</span>
<span id="L2" class="LineNr">  2 </span><span class="Comment">//:</span>
<span id="L3" class="LineNr">  3 </span><span class="Comment">//:   The process of running Mu code:</span>
<span id="L4" class="LineNr">  4 </span><span class="Comment">//:     load -&gt; transform -&gt; run</span>
<span id="L5" class="LineNr">  5 </span><span class="Comment">//:</span>
<span id="L6" class="LineNr">  6 </span><span class="Comment">//: The hope is that this framework of transform tools will provide a</span>
<span id="L7" class="LineNr">  7 </span><span class="Comment">//: deconstructed alternative to conventional compilers.</span>
<span id="L8" class="LineNr">  8 </span><span class="Comment">//:</span>
<span id="L9" class="LineNr">  9 </span><span class="Comment">//: We're going to have many transforms in Mu, and getting their order right</span>
<span id="L10" class="LineNr"> 10 </span><span class="Comment">//: (not the same as ordering of layers) is a well-known problem. Some tips:</span>
<span id="L11" class="LineNr"> 11 </span><span class="Comment">//:   a) Design each layer to rely on as few previous layers as possible.</span>
<span id="L12" class="LineNr"> 12 </span><span class="Comment">//:</span>
<span id="L13" class="LineNr"> 13 </span><span class="Comment">//:   b) When positioning transforms, try to find the tightest constraint in</span>
<span id="L14" class="LineNr"> 14 </span><span class="Comment">//:   each transform relative to previous layers.</span>
<span id="L15" class="LineNr"> 15 </span><span class="Comment">//:</span>
<span id="L16" class="LineNr"> 16 </span><span class="Comment">//:   c) Even so you'll periodically need to try adjusting each transform</span>
<span id="L17" class="LineNr"> 17 </span><span class="Comment">//:   relative to those in previous layers to find a better arrangement.</span>
<span id="L18" class="LineNr"> 18 </span>
<span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(before &quot;End <a href='010vm.cc.html#L19'>recipe</a> Fields&quot;)</span>
<span id="L20" class="LineNr"> 20 </span><span class="Normal">int</span> transformed_until<span class="Delimiter">;</span>
<span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(before &quot;End <a href='010vm.cc.html#L19'>recipe</a> Constructor&quot;)</span>
<span id="L22" class="LineNr"> 22 </span>transformed_until = -<span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L23" class="LineNr"> 23 </span>
<span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
<span id="L25" class="LineNr"> 25 </span><span class="Normal">typedef</span> <span class="Normal">void</span> <span class="Delimiter">(</span>*transform_fn<span class="Delimiter">)(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a><span class="Delimiter">);</span>
<span id="L26" class="LineNr"> 26 </span>
<span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L28" class="LineNr"> 28 </span>vector&lt;transform_fn&gt; Transform<span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span>
<span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
<span id="L31" class="LineNr"> 31 </span><a href='012transform.cc.html#L33'>initialize_transforms</a><span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(code)</span>
<span id="L33" class="LineNr"> 33 </span><span class="Normal">void</span> <a href='012transform.cc.html#L33'>initialize_transforms</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L34" class="LineNr"> 34 </span>  <span class="Comment">// Begin Transforms</span>
<span id="L35" class="LineNr"> 35 </span>    <span class="Comment">// Begin Instruction Inserting/Deleting Transforms</span>
<span id="L36" class="LineNr"> 36 </span>    <span class="Comment">// End Instruction Inserting/Deleting Transforms</span>
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span>    <span class="Comment">// Begin Instruction Modifying Transforms</span>
<span id="L39" class="LineNr"> 39 </span>    <span class="Comment">// End Instruction Modifying Transforms</span>
<span id="L40" class="LineNr"> 40 </span>  <span class="Comment">// End Transforms</span>
<span id="L41" class="LineNr"> 41 </span>
<span id="L42" class="LineNr"> 42 </span>  <span class="Comment">// Begin Checks</span>
<span id="L43" class="LineNr"> 43 </span>  <span class="Comment">// End Checks</span>
<span id="L44" class="LineNr"> 44 </span><span class="Delimiter">}</span>
<span id="L45" class="LineNr"> 45 </span>
<span id="L46" class="LineNr"> 46 </span><span class="Normal">void</span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L47" class="LineNr"> 47 </span>  <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;=== transform_all()&quot;</span> &lt;&lt; <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span>
<span id="L48" class="LineNr"> 48 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> t = <span class="Constant">0</span><span class="Delimiter">;</span>  t &lt; <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Transform<span class="Delimiter">);</span>  ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L49" class="LineNr"> 49 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L50" class="LineNr"> 50 </span>      recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
<span id="L51" class="LineNr"> 51 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>transformed_until != t-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L52" class="LineNr"> 52 </span>      <span class="Comment">// End Transform Checks</span>
<span id="L53" class="LineNr"> 53 </span>      <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span><span class="Comment">/*</span><span class="Comment"><a href='010vm.cc.html#L14'>recipe_ordinal</a></span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span>      r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span>
<span id="L55" class="LineNr"> 55 </span>    <span class="Delimiter">}</span>
<span id="L56" class="LineNr"> 56 </span>  <span class="Delimiter">}</span>
<span id="L57" class="LineNr"> 57 </span>  <a href='012transform.cc.html#L73'>parse_int_reagents</a><span class="Delimiter">();</span>  <span class="Comment">// do this after all other transforms have run</span>
<span id="L58" class="LineNr"> 58 </span>  <span class="Comment">// End transform_all</span>
<span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
<span id="L60" class="LineNr"> 60 </span>
<span id="L61" class="LineNr"> 61 </span><span class="Comment">//: Even though a run will involve many calls to transform_all() for tests,</span>
<span id="L62" class="LineNr"> 62 </span><span class="Comment">//: our logical model is to load all code, then transform all code, then run.</span>
<span id="L63" class="LineNr"> 63 </span><span class="Comment">//: If you load new code that should cause already-transformed recipes to</span>
<span id="L64" class="LineNr"> 64 </span><span class="Comment">//: change, that's not supported. To help detect such situations and raise</span>
<span id="L65" class="LineNr"> 65 </span><span class="Comment">//: helpful errors we track a count of the number of calls made to</span>
<span id="L66" class="LineNr"> 66 </span><span class="Comment">//: transform_all().</span>
<span id="L67" class="LineNr"> 67 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L68" class="LineNr"> 68 </span><span class="Normal">int</span> Num_calls_to_transform_all = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(after &quot;void transform_all()&quot;)</span>
<span id="L70" class="LineNr"> 70 </span>  ++Num_calls_to_transform_all<span class="Delimiter">;</span>
<span id="L71" class="LineNr"> 71 </span>
<span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(code)</span>
<span id="L73" class="LineNr"> 73 </span><span class="Normal">void</span> <a href='012transform.cc.html#L73'>parse_int_reagents</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L74" class="LineNr"> 74 </span>  <a href='003trace.cc.html#L171'>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;--- parsing any uninitialized reagents as integers&quot;</span> &lt;&lt; <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span>
<span id="L75" class="LineNr"> 75 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt;::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Recipe<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L76" class="LineNr"> 76 </span>    recipe&amp; r = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
<span id="L77" class="LineNr"> 77 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L78" class="LineNr"> 78 </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#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L79" class="LineNr"> 79 </span>      instruction&amp; inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
<span id="L80" class="LineNr"> 80 </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#L138'>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="L81" class="LineNr"> 81 </span>        <a href='012transform.cc.html#L90'>populate_value</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
<span id="L82" class="LineNr"> 82 </span>      <span class="Delimiter">}</span>
<span id="L83" class="LineNr"> 83 </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#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L84" class="LineNr"> 84 </span>        <a href='012transform.cc.html#L90'>populate_value</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
<span id="L85" class="LineNr"> 85 </span>      <span class="Delimiter">}</span>
<span id="L86" class="LineNr"> 86 </span>    <span class="Delimiter">}</span>
<span id="L87" class="LineNr"> 87 </span>  <span class="Delimiter">}</span>
<span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span>
<span id="L89" class="LineNr"> 89 </span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> <a href='012transform.cc.html#L90'>populate_value</a><span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L91" class="LineNr"> 91 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L92" class="LineNr"> 92 </span>  <span class="Comment">// End Reagent-parsing Exceptions</span>
<span id="L93" class="LineNr"> 93 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L94" class="LineNr"> 94 </span>  r<span class="Delimiter">.</span><a href='010vm.cc.html#L65'>set_value</a><span class="Delimiter">(</span><a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
<span id="L95" class="LineNr"> 95 </span><span class="Delimiter">}</span>
<span id="L96" class="LineNr"> 96 </span>
<span id="L97" class="LineNr"> 97 </span><span class="Comment">// helper for tests -- temporarily suppress run</span>
<span id="L98" class="LineNr"> 98 </span><span class="Normal">void</span> <a href='012transform.cc.html#L98'>transform</a><span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L99" class="LineNr"> 99 </span>  load<span class="Delimiter">(</span>form<span class="Delimiter">);</span>
<span id="L100" class="LineNr">100 </span>  <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span>
<span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->