about summary refs log tree commit diff stats
Commit message (Expand)AuthorAgeFilesLines
* 3203 - testable interface for reading a fileKartik K. Agaram2016-08-162-0/+47
* 3202 - bugfix: 'start-running' and refcountsKartik K. Agaram2016-08-165-7/+75
* 3201Kartik K. Agaram2016-08-162-1/+2
* 3200Kartik K. Agaram2016-08-162-2/+2
* 3199Kartik K. Agaram2016-08-164-15/+17
* 3198Kartik K. Agaram2016-08-161-15/+16
* 3197Kartik K. Agaram2016-08-164-10/+9
* 3196Kartik K. Agaram2016-08-162-2/+2
* 3195Kartik K. Agaram2016-08-161-0/+3
* 3194Kartik K. Agaram2016-08-161-2/+2
* 3193Kartik K. Agaram2016-08-161-1/+19
* 3192Kartik K. Agaram2016-08-162-28/+28
* 3191 - now builds on OpenBSDKartik K. Agaram2016-08-161-1/+1
* 3190Kartik K. Agaram2016-08-161-2/+7
* 2016-08-092-3/+20
* 3162Kartik K. Agaram2016-08-091-3/+5
* 3161Kartik K. Agaram2016-08-091-5/+0
* 3160Kartik K. Agaram2016-08-091-9/+1
* 3159 - pause the lambda->mu translator for a bitKartik K. Agaram2016-08-071-0/+18
* 3158Kartik K. Agaram2016-07-2746-319/+1162
* 3157 - more testable 'random' interfaceKartik K. Agaram2016-07-272-4/+59
* 3156Kartik K. Agaram2016-07-272-19/+30
* 3155Kartik K. Agaram2016-07-272-4/+4
* 3154 - reorg before making 'random' more testableKartik K. Agaram2016-07-2710-0/+0
"p"><pre id='vimCodeElement'> <span class="Comment">//: Some simple sanity checks for types, and also attempts to guess them where</span> <span class="Comment">//: they aren't provided.</span> <span class="Comment">//:</span> <span class="Comment">//: You still have to provide the full type the first time you mention a</span> <span class="Comment">//: variable in a recipe. You have to explicitly name :offset and :variant</span> <span class="Comment">//: every single time. You can't use the same name with multiple types in a</span> <span class="Comment">//: single recipe.</span> <span class="Delimiter">:(scenario transform_types_warns_on_reusing_name_with_different_type)</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ x:number<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> x:boolean<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> ] <span class="traceContains">+warn: x used with multiple types in main</span> <span class="Delimiter">:(after &quot;int main&quot;)</span> Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_types<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> void transform_types<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> map&lt;string<span class="Delimiter">,</span> vector&lt;type_ordinal&gt; &gt; metadata<span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> instruction&amp; inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> for <span class="Delimiter">(</span>long long int in = <span class="Constant">0</span><span class="Delimiter">;</span> in &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span> deduce_missing_type<span class="Delimiter">(</span>metadata<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">));</span> check_metadata<span class="Delimiter">(</span>metadata<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">),</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> for <span class="Delimiter">(</span>long long int out = <span class="Constant">0</span><span class="Delimiter">;</span> out &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span> deduce_missing_type<span class="Delimiter">(</span>metadata<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">));</span> check_metadata<span class="Delimiter">(</span>metadata<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> void check_metadata<span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> vector&lt;type_ordinal&gt; &gt;&amp; metadata<span class="Delimiter">,</span> const reagent&amp; x<span class="Delimiter">,</span> const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// if you use raw locations you're probably doing something unsafe</span> if <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// will throw a more precise warning elsewhere</span> if <span class="Delimiter">(</span>metadata<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == metadata<span class="Delimiter">.</span>end<span class="Delimiter">())</span> metadata[x<span class="Delimiter">.</span>name] = x<span class="Delimiter">.</span>types<span class="Delimiter">;</span> if <span class="Delimiter">(</span>metadata[x<span class="Delimiter">.</span>name] != x<span class="Delimiter">.</span>types<span class="Delimiter">)</span> raise &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; used with multiple types in &quot;</span> &lt;&lt; Recipe[r]<span class="Delimiter">.</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span> <span class="Delimiter">}</span> <span class="Delimiter">:(scenario transform_types_fills_in_missing_types)</span> recipe main [ x:number<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> y:number<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span> ] <span class="Delimiter">:(code)</span> void deduce_missing_type<span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> vector&lt;type_ordinal&gt; &gt;&amp; metadata<span class="Delimiter">,</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>metadata<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == metadata<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> copy<span class="Delimiter">(</span>metadata[x<span class="Delimiter">.</span>name]<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> metadata[x<span class="Delimiter">.</span>name]<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">,</span> x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span> assert<span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>metadata[x<span class="Delimiter">.</span>name]<span class="Delimiter">.</span>size<span class="Delimiter">());</span> x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> vector&lt;string&gt; &gt;<span class="Delimiter">(</span><span class="Constant">&quot;as-before&quot;</span><span class="Delimiter">,</span> vector&lt;string&gt;<span class="Delimiter">()));</span> <span class="Delimiter">}</span> <span class="Delimiter">:(scenario transform_types_fills_in_missing_types_in_product)</span> recipe main [ x:number<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> x<span class="Special"> &lt;- </span>copy <span class="Constant">2</span> ] <span class="Delimiter">:(scenario transform_types_fills_in_missing_types_in_product_and_ingredient)</span> recipe main [ x:number<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> x<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span> ] <span class="traceContains">+mem: storing 2 in location 1</span> <span class="Delimiter">:(scenario transform_warns_on_missing_types_in_first_mention)</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ x<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> x:number<span class="Special"> &lt;- </span>copy <span class="Constant">2</span> ] <span class="traceContains">+warn: missing type in 'x &lt;- copy 1'</span> <span class="Delimiter">:(scenario typo_in_address_type_warns)</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ y:address:charcter<span class="Special"> &lt;- </span>new character:type *y<span class="Special"> &lt;- </span>copy <span class="Constant">67</span> ] <span class="traceContains">+warn: unknown type: charcter</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->