about summary refs log tree commit diff stats
path: root/tools
ModeNameSize
-rw-r--r--README.md1271log stats plain blame
-rwxr-xr-xbrowse_trace518log stats plain blame
-rw-r--r--browse_trace.cc18661log stats plain blame
-rw-r--r--browse_trace.readme.md2946log stats plain blame
-rwxr-xr-xcreate_container537log stats plain blame
-rw-r--r--enumerate.cc639log stats plain blame
-rwxr-xr-xexpand_string_handle584log stats plain blame
d---------iso180log stats plain
-rw-r--r--linkify.cc8289log stats plain blame
-rw-r--r--stack_array.subx21928log stats plain blame
-rw-r--r--tangle.cc30653log stats plain blame
-rw-r--r--tangle.readme.md2224log stats plain blame
d---------termbox294log stats plain
-rwxr-xr-xtest_treeshake_translate686log stats plain blame
-rw-r--r--treeshake.cc4645log stats plain blame
-rwxr-xr-xtreeshake_all1612log stats plain blame
-rwxr-xr-xtreeshake_translate180log stats plain blame
-rwxr-xr-xupdate_html1789log stats plain blame
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Mu - linux/301array-equal.subx</title>
<meta name="Generator" content="Vim/8.2">
<meta name="plugin-version" content="vim8.1_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback">
<meta name="colorscheme" content="minimal-light">
<style>
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffd7; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.LineNr { }
.subxFunction { color: #af5f00; text-decoration: underline; }
.subxS1Comment { color: #0000af; }
.SpecialChar { color: #d70000; }
.Constant { color: #008787; }
.subxMinorFunction { color: #875f5f; }
.subxTest { color: #5f8700; }
.subxH1Comment { color: #005faf; text-decoration: underline; }
-->
</style>

<script>
<!--

/* 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;
  }
  var 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();'>
<a href='https://github.com/akkartik/mu/blob/main/linux/301array-equal.subx'>https://github.com/akkartik/mu/blob/main/linux/301array-equal.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="subxComment"># Comparing arrays of numbers.</span>
<span id="L2" class="LineNr">  2 </span>
<span id="L3" class="LineNr">  3 </span>== code
<span id="L4" class="LineNr">  4 </span>
<span id="L5" class="LineNr">  5 </span><span class="subxFunction">array-equal?</span>:  <span class="subxComment"># a: (addr array int), b: (addr array int) -&gt; result/eax: boolean</span>
<span id="L6" class="LineNr">  6 </span>    <span class="subxComment"># pseudocode:</span>
<span id="L7" class="LineNr">  7 </span>    <span class="subxComment">#   asize = a-&gt;size</span>
<span id="L8" class="LineNr">  8 </span>    <span class="subxComment">#   if (asize != b-&gt;size) return false</span>
<span id="L9" class="LineNr">  9 </span>    <span class="subxComment">#   i = 0</span>
<span id="L10" class="LineNr"> 10 </span>    <span class="subxComment">#   curra = a-&gt;data</span>
<span id="L11" class="LineNr"> 11 </span>    <span class="subxComment">#   currb = b-&gt;data</span>
<span id="L12" class="LineNr"> 12 </span>    <span class="subxComment">#   while i &lt; asize</span>
<span id="L13" class="LineNr"> 13 </span>    <span class="subxComment">#     i1 = *curra</span>
<span id="L14" class="LineNr"> 14 </span>    <span class="subxComment">#     i2 = *currb</span>
<span id="L15" class="LineNr"> 15 </span>    <span class="subxComment">#     if (c1 != c2) return false</span>
<span id="L16" class="LineNr"> 16 </span>    <span class="subxComment">#     i+=4, curra+=4, currb+=4</span>
<span id="L17" class="LineNr"> 17 </span>    <span class="subxComment">#   return true</span>
<span id="L18" class="LineNr"> 18 </span>    <span class="subxComment">#</span>
<span id="L19" class="LineNr"> 19 </span>    <span class="subxComment"># registers:</span>
<span id="L20" class="LineNr"> 20 </span>    <span class="subxComment">#   i: ecx</span>
<span id="L21" class="LineNr"> 21 </span>    <span class="subxComment">#   asize: edx</span>
<span id="L22" class="LineNr"> 22 </span>    <span class="subxComment">#   curra: esi</span>
<span id="L23" class="LineNr"> 23 </span>    <span class="subxComment">#   currb: edi</span>
<span id="L24" class="LineNr"> 24 </span>    <span class="subxComment">#   i1: eax</span>
<span id="L25" class="LineNr"> 25 </span>    <span class="subxComment">#   i2: ebx</span>
<span id="L26" class="LineNr"> 26 </span>    <span class="subxComment">#</span>
<span id="L27" class="LineNr"> 27 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L28" class="LineNr"> 28 </span>    55/push-ebp
<span id="L29" class="LineNr"> 29 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L30" class="LineNr"> 30 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L31" class="LineNr"> 31 </span>    51/push-ecx
<span id="L32" class="LineNr"> 32 </span>    52/push-edx
<span id="L33" class="LineNr"> 33 </span>    53/push-ebx
<span id="L34" class="LineNr"> 34 </span>    56/push-esi
<span id="L35" class="LineNr"> 35 </span>    57/push-edi
<span id="L36" class="LineNr"> 36 </span>    <span class="subxComment"># esi = a</span>
<span id="L37" class="LineNr"> 37 </span>    8b/-&gt; *(ebp+8) 6/r32/esi
<span id="L38" class="LineNr"> 38 </span>    <span class="subxComment"># edi = b</span>
<span id="L39" class="LineNr"> 39 </span>    8b/-&gt; *(ebp+0xc) 7/r32/edi
<span id="L40" class="LineNr"> 40 </span>    <span class="subxComment"># var asize/edx: int = a-&gt;size</span>
<span id="L41" class="LineNr"> 41 </span>    8b/-&gt; *esi 2/r32/edx
<span id="L42" class="LineNr"> 42 </span><span class="Constant">$array-equal?:sizes</span>:
<span id="L43" class="LineNr"> 43 </span>    <span class="subxComment"># if (asize != b-&gt;size) return false</span>
<span id="L44" class="LineNr"> 44 </span>    39/compare *edi 2/r32/edx
<span id="L45" class="LineNr"> 45 </span>    75/jump-if-!= $array-equal?:false/disp8
<span id="L46" class="LineNr"> 46 </span>    <span class="subxComment"># var curra/esi: (addr byte) = a-&gt;data</span>
<span id="L47" class="LineNr"> 47 </span>    81 0/subop/add %esi 4/imm32
<span id="L48" class="LineNr"> 48 </span>    <span class="subxComment"># var currb/edi: (addr byte) = b-&gt;data</span>
<span id="L49" class="LineNr"> 49 </span>    81 0/subop/add %edi 4/imm32
<span id="L50" class="LineNr"> 50 </span>    <span class="subxComment"># var i/ecx: int = 0</span>
<span id="L51" class="LineNr"> 51 </span>    31/xor-with %ecx 1/r32/ecx
<span id="L52" class="LineNr"> 52 </span>    <span class="subxComment"># var vala/eax: int</span>
<span id="L53" class="LineNr"> 53 </span>    <span class="subxComment"># var valb/ebx: int</span>
<span id="L54" class="LineNr"> 54 </span><span class="Constant">$array-equal?:loop</span>:
<span id="L55" class="LineNr"> 55 </span>    <span class="subxComment"># if (i &gt;= asize) return true</span>
<span id="L56" class="LineNr"> 56 </span>    39/compare %ecx 2/r32/edx
<span id="L57" class="LineNr"> 57 </span>    7d/jump-if-&gt;= $array-equal?:true/disp8
<span id="L58" class="LineNr"> 58 </span>    <span class="subxComment"># var vala/eax: int = *curra</span>
<span id="L59" class="LineNr"> 59 </span>    8b/-&gt; *esi 0/r32/eax
<span id="L60" class="LineNr"> 60 </span>    <span class="subxComment"># var valb/ebx: int = *currb</span>
<span id="L61" class="LineNr"> 61 </span>    8b/-&gt; *edi 3/r32/ebx
<span id="L62" class="LineNr"> 62 </span>    <span class="subxComment"># if (vala != valb) return false</span>
<span id="L63" class="LineNr"> 63 </span>    39/compare %eax 3/r32/ebx
<span id="L64" class="LineNr"> 64 </span>    75/jump-if-!= $array-equal?:false/disp8
<span id="L65" class="LineNr"> 65 </span>    <span class="subxComment"># i += 4</span>
<span id="L66" class="LineNr"> 66 </span>    81 0/subop/add %ecx 4/imm32
<span id="L67" class="LineNr"> 67 </span>    <span class="subxComment"># currs += 4</span>
<span id="L68" class="LineNr"> 68 </span>    81 0/subop/add %esi 4/imm32
<span id="L69" class="LineNr"> 69 </span>    <span class="subxComment"># currb += 4</span>
<span id="L70" class="LineNr"> 70 </span>    81 0/subop/add %edi 4/imm32
<span id="L71" class="LineNr"> 71 </span>    eb/jump $array-equal?:<span class="Constant">loop</span>/disp8
<span id="L72" class="LineNr"> 72 </span><span class="Constant">$array-equal?:true</span>:
<span id="L73" class="LineNr"> 73 </span>    b8/copy-to-eax 1/imm32
<span id="L74" class="LineNr"> 74 </span>    eb/jump $array-equal?:end/disp8
<span id="L75" class="LineNr"> 75 </span><span class="Constant">$array-equal?:false</span>:
<span id="L76" class="LineNr"> 76 </span>    b8/copy-to-eax 0/imm32
<span id="L77" class="LineNr"> 77 </span><span class="Constant">$array-equal?:end</span>:
<span id="L78" class="LineNr"> 78 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L79" class="LineNr"> 79 </span>    5f/pop-to-edi
<span id="L80" class="LineNr"> 80 </span>    5e/pop-to-esi
<span id="L81" class="LineNr"> 81 </span>    5b/pop-to-ebx
<span id="L82" class="LineNr"> 82 </span>    5a/pop-to-edx
<span id="L83" class="LineNr"> 83 </span>    59/pop-to-ecx
<span id="L84" class="LineNr"> 84 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L85" class="LineNr"> 85 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L86" class="LineNr"> 86 </span>    5d/pop-to-ebp
<span id="L87" class="LineNr"> 87 </span>    c3/return
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="subxTest">test-compare-empty-with-empty-array</span>:
<span id="L90" class="LineNr"> 90 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L91" class="LineNr"> 91 </span>    55/push-ebp
<span id="L92" class="LineNr"> 92 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L93" class="LineNr"> 93 </span>    <span class="subxComment"># var ecx: (array _) = []</span>
<span id="L94" class="LineNr"> 94 </span>    68/push 0/imm32/size
<span id="L95" class="LineNr"> 95 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L96" class="LineNr"> 96 </span>    <span class="subxComment"># var edx: (array _) = []</span>
<span id="L97" class="LineNr"> 97 </span>    68/push 0/imm32/size
<span id="L98" class="LineNr"> 98 </span>    89/&lt;- %edx 4/r32/esp
<span id="L99" class="LineNr"> 99 </span>    <span class="subxComment">#</span>
<span id="L100" class="LineNr">100 </span>    (<a href='301array-equal.subx.html#L5'>array-equal?</a> %ecx %edx)  <span class="subxComment"># =&gt; eax</span>
<span id="L101" class="LineNr">101 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> %eax 1 <span class="Constant">&quot;F - test-compare-empty-with-empty-array&quot;</span>)
<span id="L102" class="LineNr">102 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L103" class="LineNr">103 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L104" class="LineNr">104 </span>    5d/pop-to-ebp
<span id="L105" class="LineNr">105 </span>    c3/return
<span id="L106" class="LineNr">106 </span>
<span id="L107" class="LineNr">107 </span><span class="subxTest">test-compare-empty-with-non-empty-array</span>:  <span class="subxComment"># also checks size-mismatch code path</span>
<span id="L108" class="LineNr">108 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L109" class="LineNr">109 </span>    55/push-ebp
<span id="L110" class="LineNr">110 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L111" class="LineNr">111 </span>    <span class="subxComment"># var ecx: (array int) = [1]</span>
<span id="L112" class="LineNr">112 </span>    68/push 1/imm32
<span id="L113" class="LineNr">113 </span>    68/push 4/imm32/size
<span id="L114" class="LineNr">114 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L115" class="LineNr">115 </span>    <span class="subxComment"># var edx: (array int) = []</span>
<span id="L116" class="LineNr">116 </span>    68/push 0/imm32/size
<span id="L117" class="LineNr">117 </span>    89/&lt;- %edx 4/r32/esp
<span id="L118" class="LineNr">118 </span>    <span class="subxComment">#</span>
<span id="L119" class="LineNr">119 </span>    (<a href='301array-equal.subx.html#L5'>array-equal?</a> %ecx %edx)  <span class="subxComment"># =&gt; eax</span>
<span id="L120" class="LineNr">120 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> %eax 0 <span class="Constant">&quot;F - test-compare-empty-with-non-empty-array&quot;</span>)
<span id="L121" class="LineNr">121 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L122" class="LineNr">122 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L123" class="LineNr">123 </span>    5d/pop-to-ebp
<span id="L124" class="LineNr">124 </span>    c3/return
<span id="L125" class="LineNr">125 </span>
<span id="L126" class="LineNr">126 </span><span class="subxTest">test-compare-equal-arrays</span>:
<span id="L127" class="LineNr">127 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L128" class="LineNr">128 </span>    55/push-ebp
<span id="L129" class="LineNr">129 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L130" class="LineNr">130 </span>    <span class="subxComment"># var ecx: (array int) = [1, 2, 3]</span>
<span id="L131" class="LineNr">131 </span>    68/push 3/imm32
<span id="L132" class="LineNr">132 </span>    68/push 2/imm32
<span id="L133" class="LineNr">133 </span>    68/push 1/imm32
<span id="L134" class="LineNr">134 </span>    68/push 0xc/imm32/size
<span id="L135" class="LineNr">135 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L136" class="LineNr">136 </span>    <span class="subxComment"># var edx: (array int) = [1, 2, 3]</span>
<span id="L137" class="LineNr">137 </span>    68/push 3/imm32
<span id="L138" class="LineNr">138 </span>    68/push 2/imm32
<span id="L139" class="LineNr">139 </span>    68/push 1/imm32
<span id="L140" class="LineNr">140 </span>    68/push 0xc/imm32/size
<span id="L141" class="LineNr">141 </span>    89/&lt;- %edx 4/r32/esp
<span id="L142" class="LineNr">142 </span>    <span class="subxComment">#</span>
<span id="L143" class="LineNr">143 </span>    (<a href='301array-equal.subx.html#L5'>array-equal?</a> %ecx %edx)  <span class="subxComment"># =&gt; eax</span>
<span id="L144" class="LineNr">144 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> %eax 1 <span class="Constant">&quot;F - test-compare-equal-arrays&quot;</span>)
<span id="L145" class="LineNr">145 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L146" class="LineNr">146 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L147" class="LineNr">147 </span>    5d/pop-to-ebp
<span id="L148" class="LineNr">148 </span>    c3/return
<span id="L149" class="LineNr">149 </span>
<span id="L150" class="LineNr">150 </span><span class="subxTest">test-compare-inequal-arrays-equal-sizes</span>:
<span id="L151" class="LineNr">151 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L152" class="LineNr">152 </span>    55/push-ebp
<span id="L153" class="LineNr">153 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L154" class="LineNr">154 </span>    <span class="subxComment"># var ecx: (array int) = [1, 4, 3]</span>
<span id="L155" class="LineNr">155 </span>    68/push 3/imm32
<span id="L156" class="LineNr">156 </span>    68/push 4/imm32
<span id="L157" class="LineNr">157 </span>    68/push 1/imm32
<span id="L158" class="LineNr">158 </span>    68/push 0xc/imm32/size
<span id="L159" class="LineNr">159 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L160" class="LineNr">160 </span>    <span class="subxComment"># var edx: (array int) = [1, 2, 3]</span>
<span id="L161" class="LineNr">161 </span>    68/push 3/imm32
<span id="L162" class="LineNr">162 </span>    68/push 2/imm32
<span id="L163" class="LineNr">163 </span>    68/push 1/imm32
<span id="L164" class="LineNr">164 </span>    68/push 0xc/imm32/size
<span id="L165" class="LineNr">165 </span>    89/&lt;- %edx 4/r32/esp
<span id="L166" class="LineNr">166 </span>    <span class="subxComment">#</span>
<span id="L167" class="LineNr">167 </span>    (<a href='301array-equal.subx.html#L5'>array-equal?</a> %ecx %edx)  <span class="subxComment"># =&gt; eax</span>
<span id="L168" class="LineNr">168 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> %eax 0 <span class="Constant">&quot;F - test-compare-inequal-arrays-equal-sizes&quot;</span>)
<span id="L169" class="LineNr">169 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L170" class="LineNr">170 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L171" class="LineNr">171 </span>    5d/pop-to-ebp
<span id="L172" class="LineNr">172 </span>    c3/return
<span id="L173" class="LineNr">173 </span>
<span id="L174" class="LineNr">174 </span><span class="subxMinorFunction">_parse-array-of-ints</span>:  <span class="subxComment"># ad: (addr allocation-descriptor), s: (addr array byte), out: (addr handle array int)</span>
<span id="L175" class="LineNr">175 </span>    <span class="subxComment"># pseudocode</span>
<span id="L176" class="LineNr">176 </span>    <span class="subxComment">#   end = &amp;s-&gt;data[s-&gt;size]</span>
<span id="L177" class="LineNr">177 </span>    <span class="subxComment">#   curr = s-&gt;data</span>
<span id="L178" class="LineNr">178 </span>    <span class="subxComment">#   size = 0</span>
<span id="L179" class="LineNr">179 </span>    <span class="subxComment">#   while true</span>
<span id="L180" class="LineNr">180 </span>    <span class="subxComment">#     if (curr &gt;= end) break</span>
<span id="L181" class="LineNr">181 </span>    <span class="subxComment">#     curr = skip-chars-matching-in-slice(curr, end, ' ')</span>
<span id="L182" class="LineNr">182 </span>    <span class="subxComment">#     if (curr &gt;= end) break</span>
<span id="L183" class="LineNr">183 </span>    <span class="subxComment">#     curr = skip-chars-not-matching-in-slice(curr, end, ' ')</span>
<span id="L184" class="LineNr">184 </span>    <span class="subxComment">#     ++size</span>
<span id="L185" class="LineNr">185 </span>    <span class="subxComment">#   allocate-array(ad, size*4, out)</span>
<span id="L186" class="LineNr">186 </span>    <span class="subxComment">#   var slice: slice = {s-&gt;data, 0}</span>
<span id="L187" class="LineNr">187 </span>    <span class="subxComment">#   curr = lookup(out)-&gt;data</span>
<span id="L188" class="LineNr">188 </span>    <span class="subxComment">#   while true</span>
<span id="L189" class="LineNr">189 </span>    <span class="subxComment">#     if (slice-&gt;start &gt;= end) break</span>
<span id="L190" class="LineNr">190 </span>    <span class="subxComment">#     slice-&gt;start = skip-chars-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L191" class="LineNr">191 </span>    <span class="subxComment">#     if (slice-&gt;start &gt;= end) break</span>
<span id="L192" class="LineNr">192 </span>    <span class="subxComment">#     slice-&gt;end = skip-chars-not-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L193" class="LineNr">193 </span>    <span class="subxComment">#     *curr = parse-hex-int-from-slice(slice)</span>
<span id="L194" class="LineNr">194 </span>    <span class="subxComment">#     curr += 4</span>
<span id="L195" class="LineNr">195 </span>    <span class="subxComment">#     slice-&gt;start = slice-&gt;end</span>
<span id="L196" class="LineNr">196 </span>    <span class="subxComment">#   return result</span>
<span id="L197" class="LineNr">197 </span>    <span class="subxComment">#</span>
<span id="L198" class="LineNr">198 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L199" class="LineNr">199 </span>    55/push-ebp
<span id="L200" class="LineNr">200 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L201" class="LineNr">201 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L202" class="LineNr">202 </span>    50/push-eax
<span id="L203" class="LineNr">203 </span>    51/push-ecx
<span id="L204" class="LineNr">204 </span>    52/push-edx
<span id="L205" class="LineNr">205 </span>    53/push-ebx
<span id="L206" class="LineNr">206 </span>    56/push-esi
<span id="L207" class="LineNr">207 </span>    57/push-edi
<span id="L208" class="LineNr">208 </span>    <span class="subxComment"># esi = s</span>
<span id="L209" class="LineNr">209 </span>    8b/-&gt; *(ebp+0xc) 6/r32/esi
<span id="L210" class="LineNr">210 </span>    <span class="subxComment"># var curr/ecx: (addr byte) = s-&gt;data</span>
<span id="L211" class="LineNr">211 </span>    8d/copy-address *(esi+4) 1/r32/ecx
<span id="L212" class="LineNr">212 </span>    <span class="subxComment"># var end/edx: (addr byte) = &amp;s-&gt;data[s-&gt;size]</span>
<span id="L213" class="LineNr">213 </span>    <span class="subxS1Comment"># . edx = s-&gt;size</span>
<span id="L214" class="LineNr">214 </span>    8b/-&gt; *esi 2/r32/edx
<span id="L215" class="LineNr">215 </span>    <span class="subxS1Comment"># . edx += curr</span>
<span id="L216" class="LineNr">216 </span>    01/add-to %edx 1/r32/ecx
<span id="L217" class="LineNr">217 </span>    <span class="subxComment"># var size/ebx: int = 0</span>
<span id="L218" class="LineNr">218 </span>    31/xor-with %ebx 3/r32/ebx
<span id="L219" class="LineNr">219 </span><span class="Constant">$_parse-array-of-ints:loop1</span>:
<span id="L220" class="LineNr">220 </span>    <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L221" class="LineNr">221 </span>    39/compare %ecx 2/r32/edx
<span id="L222" class="LineNr">222 </span>    73/jump-if-addr&gt;= $_parse-array-of-ints:break1/disp8
<span id="L223" class="LineNr">223 </span>    <span class="subxComment"># curr = skip-chars-matching-in-slice(curr, end, ' ')</span>
<span id="L224" class="LineNr">224 </span>    (<a href='124next-token.subx.html#L804'>skip-chars-matching-in-slice</a> %ecx %edx 0x20)  <span class="subxComment"># =&gt; eax</span>
<span id="L225" class="LineNr">225 </span>    89/&lt;- %ecx 0/r32/eax
<span id="L226" class="LineNr">226 </span>    <span class="subxComment"># if (curr &gt;= end) break</span>
<span id="L227" class="LineNr">227 </span>    39/compare %ecx 2/r32/edx
<span id="L228" class="LineNr">228 </span>    73/jump-if-addr&gt;= $_parse-array-of-ints:break1/disp8
<span id="L229" class="LineNr">229 </span>    <span class="subxComment"># curr = skip-chars-not-matching-in-slice(curr, end, ' ')</span>
<span id="L230" class="LineNr">230 </span>    (<a href='124next-token.subx.html#L973'>skip-chars-not-matching-in-slice</a> %ecx %edx 0x20)  <span class="subxComment"># =&gt; eax</span>
<span id="L231" class="LineNr">231 </span>    89/&lt;- %ecx 0/r32/eax
<span id="L232" class="LineNr">232 </span>    <span class="subxComment"># size += 4</span>
<span id="L233" class="LineNr">233 </span>    81 0/subop/add %ebx 4/imm32
<span id="L234" class="LineNr">234 </span>    eb/jump $_parse-array-of-ints:loop1/disp8
<span id="L235" class="LineNr">235 </span><span class="Constant">$_parse-array-of-ints:break1</span>:
<span id="L236" class="LineNr">236 </span>    (<a href='120allocate.subx.html#L584'>allocate-array</a> *(ebp+8) %ebx *(ebp+0x10))
<span id="L237" class="LineNr">237 </span><span class="Constant">$_parse-array-of-ints:pass2</span>:
<span id="L238" class="LineNr">238 </span>    <span class="subxComment"># var slice/edi: slice = {s-&gt;data, 0}</span>
<span id="L239" class="LineNr">239 </span>    68/push 0/imm32/end
<span id="L240" class="LineNr">240 </span>    8d/copy-address *(esi+4) 7/r32/edi
<span id="L241" class="LineNr">241 </span>    57/push-edi
<span id="L242" class="LineNr">242 </span>    89/&lt;- %edi 4/r32/esp
<span id="L243" class="LineNr">243 </span>    <span class="subxComment"># curr = lookup(out)-&gt;data</span>
<span id="L244" class="LineNr">244 </span>    8b/-&gt; *(ebp+0x10) 0/r32/eax
<span id="L245" class="LineNr">245 </span>    (<a href='120allocate.subx.html#L258'>lookup</a> *eax *(eax+4))  <span class="subxComment"># =&gt; eax</span>
<span id="L246" class="LineNr">246 </span>    8d/copy-address *(eax+4) 1/r32/ecx
<span id="L247" class="LineNr">247 </span><span class="Constant">$_parse-array-of-ints:loop2</span>:
<span id="L248" class="LineNr">248 </span>    <span class="subxComment"># if (slice-&gt;start &gt;= end) break</span>
<span id="L249" class="LineNr">249 </span>    39/compare *edi 2/r32/edx
<span id="L250" class="LineNr">250 </span>    73/jump-if-addr&gt;= $_parse-array-of-ints:end/disp8
<span id="L251" class="LineNr">251 </span>    <span class="subxComment"># slice-&gt;start = skip-chars-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L252" class="LineNr">252 </span>    (<a href='124next-token.subx.html#L804'>skip-chars-matching-in-slice</a> *edi %edx 0x20)  <span class="subxComment"># =&gt; eax</span>
<span id="L253" class="LineNr">253 </span>    89/&lt;- *edi 0/r32/eax
<span id="L254" class="LineNr">254 </span>    <span class="subxComment"># if (slice-&gt;start &gt;= end) break</span>
<span id="L255" class="LineNr">255 </span>    39/compare *edi 2/r32/edx
<span id="L256" class="LineNr">256 </span>    73/jump-if-addr&gt;= $_parse-array-of-ints:end/disp8
<span id="L257" class="LineNr">257 </span>    <span class="subxComment"># slice-&gt;end = skip-chars-not-matching-in-slice(slice-&gt;start, end, ' ')</span>
<span id="L258" class="LineNr">258 </span>    (<a href='124next-token.subx.html#L973'>skip-chars-not-matching-in-slice</a> *edi %edx 0x20)  <span class="subxComment"># =&gt; eax</span>
<span id="L259" class="LineNr">259 </span>    89/&lt;- *(edi+4) 0/r32/eax
<span id="L260" class="LineNr">260 </span>    <span class="subxComment"># *curr = parse-hex-int-from-slice(slice)</span>
<span id="L261" class="LineNr">261 </span>    (<a href='118parse-hex-int.subx.html#L387'>parse-hex-int-from-slice</a> %edi)
<span id="L262" class="LineNr">262 </span>    89/&lt;- *ecx 0/r32/eax
<span id="L263" class="LineNr">263 </span>    <span class="subxComment"># curr += 4</span>
<span id="L264" class="LineNr">264 </span>    81 0/subop/add %ecx 4/imm32
<span id="L265" class="LineNr">265 </span>    <span class="subxComment"># slice-&gt;start = slice-&gt;end</span>
<span id="L266" class="LineNr">266 </span>    8b/-&gt; *(edi+4) 0/r32/eax
<span id="L267" class="LineNr">267 </span>    89/&lt;- *edi 0/r32/eax
<span id="L268" class="LineNr">268 </span>    eb/jump $_parse-array-of-ints:loop2/disp8
<span id="L269" class="LineNr">269 </span><span class="Constant">$_parse-array-of-ints:end</span>:
<span id="L270" class="LineNr">270 </span>    <span class="subxS1Comment"># . reclaim locals</span>
<span id="L271" class="LineNr">271 </span>    81 0/subop/add %esp 8/imm32
<span id="L272" class="LineNr">272 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L273" class="LineNr">273 </span>    5f/pop-to-edi
<span id="L274" class="LineNr">274 </span>    5e/pop-to-esi
<span id="L275" class="LineNr">275 </span>    5b/pop-to-ebx
<span id="L276" class="LineNr">276 </span>    5a/pop-to-edx
<span id="L277" class="LineNr">277 </span>    59/pop-to-ecx
<span id="L278" class="LineNr">278 </span>    58/pop-to-eax
<span id="L279" class="LineNr">279 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L280" class="LineNr">280 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L281" class="LineNr">281 </span>    5d/pop-to-ebp
<span id="L282" class="LineNr">282 </span>    c3/return
<span id="L283" class="LineNr">283 </span>
<span id="L284" class="LineNr">284 </span><span class="subxTest">test-parse-array-of-ints</span>:
<span id="L285" class="LineNr">285 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L286" class="LineNr">286 </span>    55/push-ebp
<span id="L287" class="LineNr">287 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L288" class="LineNr">288 </span>    <span class="subxComment"># var h/esi: (handle array int)</span>
<span id="L289" class="LineNr">289 </span>    68/push 0/imm32
<span id="L290" class="LineNr">290 </span>    68/push 0/imm32
<span id="L291" class="LineNr">291 </span>    89/&lt;- %esi 4/r32/esp
<span id="L292" class="LineNr">292 </span>    <span class="subxComment"># var ecx: (array int) = [1, 2, 3]</span>
<span id="L293" class="LineNr">293 </span>    68/push 3/imm32
<span id="L294" class="LineNr">294 </span>    68/push 2/imm32
<span id="L295" class="LineNr">295 </span>    68/push 1/imm32
<span id="L296" class="LineNr">296 </span>    68/push 0xc/imm32/size
<span id="L297" class="LineNr">297 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L298" class="LineNr">298 </span>    <span class="subxComment">#</span>
<span id="L299" class="LineNr">299 </span>    (<a href='301array-equal.subx.html#L174'>_parse-array-of-ints</a> <span class="SpecialChar"><a href='120allocate.subx.html#L27'>Heap</a></span> <span class="Constant">&quot;1 2 3&quot;</span> %esi)
<span id="L300" class="LineNr">300 </span>    (<a href='120allocate.subx.html#L258'>lookup</a> *esi *(esi+4))  <span class="subxComment"># =&gt; eax</span>
<span id="L301" class="LineNr">301 </span>    (<a href='301array-equal.subx.html#L5'>array-equal?</a> %ecx %eax)  <span class="subxComment"># =&gt; eax</span>
<span id="L302" class="LineNr">302 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> %eax 1 <span class="Constant">&quot;F - test-parse-array-of-ints&quot;</span>)
<span id="L303" class="LineNr">303 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L304" class="LineNr">304 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L305" class="LineNr">305 </span>    5d/pop-to-ebp
<span id="L306" class="LineNr">306 </span>    c3/return
<span id="L307" class="LineNr">307 </span>
<span id="L308" class="LineNr">308 </span><span class="subxTest">test-parse-array-of-ints-empty</span>:
<span id="L309" class="LineNr">309 </span>    <span class="subxH1Comment"># - empty string = empty array</span>
<span id="L310" class="LineNr">310 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L311" class="LineNr">311 </span>    55/push-ebp
<span id="L312" class="LineNr">312 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L313" class="LineNr">313 </span>    <span class="subxComment"># var h/esi: handle</span>
<span id="L314" class="LineNr">314 </span>    68/push 0/imm32
<span id="L315" class="LineNr">315 </span>    68/push 0/imm32
<span id="L316" class="LineNr">316 </span>    89/&lt;- %esi 4/r32/esp
<span id="L317" class="LineNr">317 </span>    <span class="subxComment">#</span>
<span id="L318" class="LineNr">318 </span>    (<a href='301array-equal.subx.html#L174'>_parse-array-of-ints</a> <span class="SpecialChar"><a href='120allocate.subx.html#L27'>Heap</a></span> <span class="Constant">&quot;&quot;</span> %esi)
<span id="L319" class="LineNr">319 </span>    (<a href='120allocate.subx.html#L258'>lookup</a> *esi *(esi+4))  <span class="subxComment"># =&gt; eax</span>
<span id="L320" class="LineNr">320 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> *eax 0 <span class="Constant">&quot;F - test-parse-array-of-ints-empty&quot;</span>)
<span id="L321" class="LineNr">321 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L322" class="LineNr">322 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L323" class="LineNr">323 </span>    5d/pop-to-ebp
<span id="L324" class="LineNr">324 </span>    c3/return
<span id="L325" class="LineNr">325 </span>
<span id="L326" class="LineNr">326 </span><span class="subxTest">test-parse-array-of-ints-just-whitespace</span>:
<span id="L327" class="LineNr">327 </span>    <span class="subxH1Comment"># - just whitespace = empty array</span>
<span id="L328" class="LineNr">328 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L329" class="LineNr">329 </span>    55/push-ebp
<span id="L330" class="LineNr">330 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L331" class="LineNr">331 </span>    <span class="subxComment"># var h/esi: handle</span>
<span id="L332" class="LineNr">332 </span>    68/push 0/imm32
<span id="L333" class="LineNr">333 </span>    68/push 0/imm32
<span id="L334" class="LineNr">334 </span>    89/&lt;- %esi 4/r32/esp
<span id="L335" class="LineNr">335 </span>    <span class="subxComment">#</span>
<span id="L336" class="LineNr">336 </span>    (<a href='301array-equal.subx.html#L174'>_parse-array-of-ints</a> <span class="SpecialChar"><a href='120allocate.subx.html#L27'>Heap</a></span> <span class="SpecialChar"><a href='102test.subx.html#L93'>Space</a></span> %esi)
<span id="L337" class="LineNr">337 </span>    (<a href='120allocate.subx.html#L258'>lookup</a> *esi *(esi+4))  <span class="subxComment"># =&gt; eax</span>
<span id="L338" class="LineNr">338 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> *eax 0 <span class="Constant">&quot;F - test-parse-array-of-ints-just-whitespace&quot;</span>)
<span id="L339" class="LineNr">339 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L340" class="LineNr">340 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L341" class="LineNr">341 </span>    5d/pop-to-ebp
<span id="L342" class="LineNr">342 </span>    c3/return
<span id="L343" class="LineNr">343 </span>
<span id="L344" class="LineNr">344 </span><span class="subxTest">test-parse-array-of-ints-extra-whitespace</span>:
<span id="L345" class="LineNr">345 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L346" class="LineNr">346 </span>    55/push-ebp
<span id="L347" class="LineNr">347 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L348" class="LineNr">348 </span>    <span class="subxComment"># var h/esi: handle</span>
<span id="L349" class="LineNr">349 </span>    68/push 0/imm32
<span id="L350" class="LineNr">350 </span>    68/push 0/imm32
<span id="L351" class="LineNr">351 </span>    89/&lt;- %esi 4/r32/esp
<span id="L352" class="LineNr">352 </span>    <span class="subxComment"># var ecx: (array int) = [1, 2, 3]</span>
<span id="L353" class="LineNr">353 </span>    68/push 3/imm32
<span id="L354" class="LineNr">354 </span>    68/push 2/imm32
<span id="L355" class="LineNr">355 </span>    68/push 1/imm32
<span id="L356" class="LineNr">356 </span>    68/push 0xc/imm32/size
<span id="L357" class="LineNr">357 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L358" class="LineNr">358 </span>    <span class="subxComment">#</span>
<span id="L359" class="LineNr">359 </span>    (<a href='301array-equal.subx.html#L174'>_parse-array-of-ints</a> <span class="SpecialChar"><a href='120allocate.subx.html#L27'>Heap</a></span> <span class="Constant">&quot; 1 2  3  &quot;</span> %esi)
<span id="L360" class="LineNr">360 </span>    (<a href='120allocate.subx.html#L258'>lookup</a> *esi *(esi+4))  <span class="subxComment"># =&gt; eax</span>
<span id="L361" class="LineNr">361 </span>    (<a href='301array-equal.subx.html#L5'>array-equal?</a> %ecx %eax)  <span class="subxComment"># =&gt; eax</span>
<span id="L362" class="LineNr">362 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> %eax 1 <span class="Constant">&quot;F - test-parse-array-of-ints-extra-whitespace&quot;</span>)
<span id="L363" class="LineNr">363 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L364" class="LineNr">364 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L365" class="LineNr">365 </span>    5d/pop-to-ebp
<span id="L366" class="LineNr">366 </span>    c3/return
<span id="L367" class="LineNr">367 </span>
<span id="L368" class="LineNr">368 </span><span class="subxFunction">parse-array-of-ints</span>:  <span class="subxComment"># s: (addr array byte), out: (addr handle array int)</span>
<span id="L369" class="LineNr">369 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L370" class="LineNr">370 </span>    55/push-ebp
<span id="L371" class="LineNr">371 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L372" class="LineNr">372 </span>    <span class="subxComment">#</span>
<span id="L373" class="LineNr">373 </span>    (<a href='301array-equal.subx.html#L174'>_parse-array-of-ints</a> <span class="SpecialChar"><a href='120allocate.subx.html#L27'>Heap</a></span> *(ebp+8) *(ebp+0xc))
<span id="L374" class="LineNr">374 </span><span class="Constant">$parse-array-of-ints:end</span>:
<span id="L375" class="LineNr">375 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L376" class="LineNr">376 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L377" class="LineNr">377 </span>    5d/pop-to-ebp
<span id="L378" class="LineNr">378 </span>    c3/return
<span id="L379" class="LineNr">379 </span>
<span id="L380" class="LineNr">380 </span><span class="subxComment"># helper for later tests</span>
<span id="L381" class="LineNr">381 </span><span class="subxComment"># compare an array with a string representation of an array literal</span>
<span id="L382" class="LineNr">382 </span><span class="subxFunction">check-array-equal</span>:  <span class="subxComment"># a: (addr array int), expected: (addr string), msg: (addr string)</span>
<span id="L383" class="LineNr">383 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L384" class="LineNr">384 </span>    55/push-ebp
<span id="L385" class="LineNr">385 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L386" class="LineNr">386 </span>    <span class="subxS1Comment"># . save registers</span>
<span id="L387" class="LineNr">387 </span>    50/push-eax
<span id="L388" class="LineNr">388 </span>    56/push-esi
<span id="L389" class="LineNr">389 </span>    <span class="subxComment"># var h/esi: handle</span>
<span id="L390" class="LineNr">390 </span>    68/push 0/imm32
<span id="L391" class="LineNr">391 </span>    68/push 0/imm32
<span id="L392" class="LineNr">392 </span>    89/&lt;- %esi 4/r32/esp
<span id="L393" class="LineNr">393 </span>    <span class="subxComment"># var b/eax: (addr array int) = parse-array-of-ints(Heap, expected)</span>
<span id="L394" class="LineNr">394 </span>    (<a href='301array-equal.subx.html#L368'>parse-array-of-ints</a> *(ebp+0xc) %esi)
<span id="L395" class="LineNr">395 </span>    (<a href='120allocate.subx.html#L258'>lookup</a> *esi *(esi+4))  <span class="subxComment"># =&gt; eax</span>
<span id="L396" class="LineNr">396 </span>    <span class="subxComment">#</span>
<span id="L397" class="LineNr">397 </span>    (<a href='301array-equal.subx.html#L5'>array-equal?</a> *(ebp+8) %eax)
<span id="L398" class="LineNr">398 </span>    (<a href='102test.subx.html#L23'>check-ints-equal</a> %eax 1 *(ebp+0x10))
<span id="L399" class="LineNr">399 </span><span class="Constant">$check-array-equal:end</span>:
<span id="L400" class="LineNr">400 </span>    <span class="subxS1Comment"># . restore registers</span>
<span id="L401" class="LineNr">401 </span>    5e/pop-to-esi
<span id="L402" class="LineNr">402 </span>    58/pop-to-eax
<span id="L403" class="LineNr">403 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L404" class="LineNr">404 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L405" class="LineNr">405 </span>    5d/pop-to-ebp
<span id="L406" class="LineNr">406 </span>    c3/return
<span id="L407" class="LineNr">407 </span>
<span id="L408" class="LineNr">408 </span><span class="subxTest">test-check-array-equal</span>:
<span id="L409" class="LineNr">409 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L410" class="LineNr">410 </span>    55/push-ebp
<span id="L411" class="LineNr">411 </span>    89/&lt;- %ebp 4/r32/esp
<span id="L412" class="LineNr">412 </span>    <span class="subxComment"># var ecx: (array int) = [1, 2, 3]</span>
<span id="L413" class="LineNr">413 </span>    68/push 3/imm32
<span id="L414" class="LineNr">414 </span>    68/push 2/imm32
<span id="L415" class="LineNr">415 </span>    68/push 1/imm32
<span id="L416" class="LineNr">416 </span>    68/push 0xc/imm32/size
<span id="L417" class="LineNr">417 </span>    89/&lt;- %ecx 4/r32/esp
<span id="L418" class="LineNr">418 </span>    <span class="subxComment">#</span>
<span id="L419" class="LineNr">419 </span>    (<a href='301array-equal.subx.html#L382'>check-array-equal</a> %ecx <span class="Constant">&quot;1 2 3&quot;</span> <span class="Constant">&quot;F - test-check-array-equal&quot;</span>)
<span id="L420" class="LineNr">420 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L421" class="LineNr">421 </span>    89/&lt;- %esp 5/r32/ebp
<span id="L422" class="LineNr">422 </span>    5d/pop-to-ebp
<span id="L423" class="LineNr">423 </span>    c3/return
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->