UNPKG

walt-compiler

Version:

Alternative syntax for WebAssembly text format

324 lines (323 loc) 9.37 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for src/emitter/section/code.js</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../../../prettify.css" /> <link rel="stylesheet" href="../../../base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(../../../sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="../../../index.html">All files</a> / <a href="index.html">src/emitter/section</a> code.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Statements</span> <span class='fraction'>50/50</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Branches</span> <span class='fraction'>11/11</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>8/8</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>47/47</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">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</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">104x</span> <span class="cline-any cline-yes">104x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-yes">2573x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2573x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2573x</span> <span class="cline-any cline-yes">1967x</span> <span class="cline-any cline-yes">1967x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1967x</span> <span class="cline-any cline-yes">295x</span> <span class="cline-any cline-yes">295x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1672x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">13x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">35x</span> <span class="cline-any cline-yes">35x</span> <span class="cline-any cline-yes">35x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">706x</span> <span class="cline-any cline-yes">706x</span> <span class="cline-any cline-yes">706x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">897x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1967x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">69x</span> <span class="cline-any cline-yes">69x</span> <span class="cline-any cline-yes">158x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">69x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// @flow import invariant from 'invariant'; import { u8, i32, f32, f64, i64 } from 'wasm-types'; import { varint32, varuint32, varint7, varint64 } from '../numbers'; import { getTypeString } from '../value_type'; import OutputStream from '../../utils/output-stream'; import opcode from '../opcode'; &nbsp; const emitLocal = (stream, local) =&gt; { stream.push(varuint32, 1, 'number of locals of following type'); stream.push(varint7, local.type, `${getTypeString(local.type)}`); }; &nbsp; const emitFunctionBody = (stream, { locals, code, debug: functionName }) =&gt; { // write bytecode into a clean buffer const body = new OutputStream(); &nbsp; code.forEach(({ kind, params, debug }) =&gt; { invariant( typeof kind !== 'undefined', `Fatal error! Generated undefined opcode. debug code: ${JSON.stringify( debug )}` ); // There is a much nicer way of doing this body.push(u8, kind.code, `${kind.text} ${debug ? debug : ''}`); &nbsp; // map over all params, if any and encode each on params.filter(p =&gt; typeof p !== 'undefined').forEach(p =&gt; { let type = varuint32; let stringType = 'i32.literal'; &nbsp; // Memory opcode? if (kind.code &gt;= 0x28 &amp;&amp; kind.code &lt;= 0x40) { type = varuint32; stringType = 'memory_immediate'; } else { // either encode unsigned 32 bit values or floats switch (kind.result) { case f64: type = f64; stringType = 'f64.literal'; break; case f32: type = f32; stringType = 'f32.literal'; break; case i32: type = varint32; stringType = 'i32.literal'; break; case i64: type = varint64; stringType = 'i64.literal'; break; default: type = varuint32; } } body.push(type, p, `${stringType}`); }); }); &nbsp; // output locals to the stream const localsStream = new OutputStream(); locals.forEach(local =&gt; emitLocal(localsStream, local)); &nbsp; // body size is stream.push(varuint32, body.size + localsStream.size + 2, functionName); stream.push(varuint32, locals.length, 'locals count'); &nbsp; stream.write(localsStream); stream.write(body); stream.push(u8, opcode.End.code, 'end'); }; &nbsp; const emit = (functions: any[]) =&gt; { // do stuff with ast const stream = new OutputStream(); stream.push(varuint32, functions.length, 'function count'); functions.forEach(func =&gt; emitFunctionBody(stream, func)); &nbsp; return stream; }; &nbsp; export default emit; &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Dec 23 2018 17:46:36 GMT+0000 (UTC) </div> </div> <script src="../../../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../../../sorter.js"></script> </body> </html>