Compare commits
	
		
			2 Commits
		
	
	
		
			ef528ccb3f
			...
			c69dd1efb2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c69dd1efb2 | |||
| d67b55e570 | 
| @ -124,12 +124,14 @@ public: | ||||
|             auto err | ||||
|                 = ::bind(socket, (struct sockaddr*)&address, sizeof(address)); | ||||
|             if (err < 0) { | ||||
|                 close(socket); | ||||
|                 return Err { .msg = std::format("could not bind ({})", err) }; | ||||
|             }; | ||||
|         } | ||||
|         { | ||||
|             auto err = ::listen(socket, 0); | ||||
|             if (err < 0) { | ||||
|                 close(socket); | ||||
|                 return Err { .msg = std::format("could not listen ({})", err) }; | ||||
|             } | ||||
|         } | ||||
| @ -140,6 +142,7 @@ public: | ||||
|             int client = ::accept( | ||||
|                 socket, (struct sockaddr*)&client_address, &address_size); | ||||
|             if (client < 0) { | ||||
|                 close(socket); | ||||
|                 return Err { .msg | ||||
|                     = std::format("could not accept ({})", client) }; | ||||
|             } | ||||
| @ -149,10 +152,7 @@ public: | ||||
|             std::string message = {}; | ||||
|             while (true) { | ||||
|                 ssize_t bytes_read = read(client, buffer, buf_len); | ||||
|                 if (bytes_read < 0) { | ||||
|                     return Err { .msg | ||||
|                         = std::format("could not read ({})", bytes_read) }; | ||||
|                 } else if (bytes_read == 0) { | ||||
|                 if (bytes_read <= 0) { | ||||
|                     break; | ||||
|                 } | ||||
|                 for (size_t i = 0; i < (size_t)bytes_read; ++i) { | ||||
| @ -168,6 +168,7 @@ public: | ||||
|                             "error parsing rpc message: '{}' @ {}:{}\n", | ||||
|                             err.msg, err.pos.line, err.pos.col); | ||||
|                         close(client); | ||||
|                         close(socket); | ||||
|                         return Err { | ||||
|                             .msg = msg, | ||||
|                         }; | ||||
|  | ||||
| @ -5,28 +5,16 @@ export type FlameGraphNode = { | ||||
|     children: FlameGraphNode[]; | ||||
| }; | ||||
| 
 | ||||
| export function flameGraphData(): FlameGraphNode { | ||||
|     return JSON.parse( | ||||
|         `{"fn":0,"acc":257,"parent":0,"children":[{"fn":18,"acc":251,"parent":0,"children":[{"fn":12,"acc":30,"parent":1,"children":[]}]}]}`, | ||||
|     ); | ||||
| export async function flameGraphData(): Promise<FlameGraphNode> { | ||||
|     return await fetch("/api/flame-graph") | ||||
|         .then((v) => v.json()) | ||||
|         .then((v) => v.flameGraph); | ||||
| } | ||||
| 
 | ||||
| export function codeData() { | ||||
|     return `\ | ||||
| fn add(a, b) { | ||||
|     + a b | ||||
| } | ||||
| 
 | ||||
| let result = 0; | ||||
| let i = 0; | ||||
| loop { | ||||
|     if >= i 10 { | ||||
|         break; | ||||
|     } | ||||
|     result = add(result, 5); | ||||
|     i = + i 1; | ||||
| } | ||||
| `;
 | ||||
| export async function codeData(): Promise<string> { | ||||
|     return await fetch("/api/source") | ||||
|         .then((v) => v.json()) | ||||
|         .then((v) => v.text); | ||||
| } | ||||
| 
 | ||||
| export type CodeCovEntry = { | ||||
| @ -36,8 +24,8 @@ export type CodeCovEntry = { | ||||
|     covers: number; | ||||
| }; | ||||
| 
 | ||||
| export function codeCoverageData(): CodeCovEntry[] { | ||||
|     return JSON.parse( | ||||
|         `[{"index":0,"line":1,"col":1,"covers":2},{"index":28,"line":5,"col":1,"covers":1},{"index":44,"line":6,"col":1,"covers":1},{"index":55,"line":7,"col":1,"covers":1},{"index":66,"line":8,"col":5,"covers":11},{"index":104,"line":11,"col":5,"covers":10},{"index":19,"line":2,"col":5,"covers":10},{"index":133,"line":12,"col":5,"covers":10},{"index":87,"line":9,"col":9,"covers":1}]`, | ||||
|     ); | ||||
| export async function codeCoverageData(): Promise<CodeCovEntry[]> { | ||||
|     return await fetch("/api/code-coverage") | ||||
|         .then((v) => v.json()) | ||||
|         .then((v) => v.codeCoveragea); | ||||
| } | ||||
|  | ||||
| @ -1,22 +1,16 @@ | ||||
| import { | ||||
|     CodeCovEntry, | ||||
|     codeCoverageData, | ||||
|     codeData, | ||||
|     flameGraphData, | ||||
|     FlameGraphNode, | ||||
| } from "./data.ts"; | ||||
| import * as data from "./data.ts"; | ||||
| 
 | ||||
| function loadCodeCoverage( | ||||
|     text: string, | ||||
|     data: CodeCovEntry[], | ||||
|     data: data.CodeCovEntry[], | ||||
|     container: HTMLPreElement, | ||||
|     tooltip: HTMLElement, | ||||
| ) { | ||||
|     const entries = data.toSorted(( | ||||
|         a: CodeCovEntry, | ||||
|         b: CodeCovEntry, | ||||
|         a: data.CodeCovEntry, | ||||
|         b: data.CodeCovEntry, | ||||
|     ) => b.index - a.index); | ||||
|     const charEntries: { [key: string]: CodeCovEntry } = {}; | ||||
|     const charEntries: { [key: string]: data.CodeCovEntry } = {}; | ||||
|     const elements: HTMLElement[] = []; | ||||
|     let line = 1; | ||||
|     let col = 1; | ||||
| @ -97,7 +91,7 @@ function loadCodeCoverage( | ||||
| type FlameGraphFnNames = { [key: number]: string }; | ||||
| 
 | ||||
| function loadFlameGraph( | ||||
|     flameGraphData: FlameGraphNode, | ||||
|     flameGraphData: data.FlameGraphNode, | ||||
|     fnNames: FlameGraphFnNames, | ||||
|     flameGraphDiv: HTMLDivElement, | ||||
| ) { | ||||
| @ -127,10 +121,10 @@ function loadFlameGraph( | ||||
|     const nodes: Node[] = []; | ||||
| 
 | ||||
|     function calculateNodeRects( | ||||
|         node: FlameGraphNode, | ||||
|         node: data.FlameGraphNode, | ||||
|         depth: number, | ||||
|         totalAcc: FlameGraphNode["acc"], | ||||
|         offsetAcc: FlameGraphNode["acc"], | ||||
|         totalAcc: data.FlameGraphNode["acc"], | ||||
|         offsetAcc: data.FlameGraphNode["acc"], | ||||
|     ) { | ||||
|         const x = (offsetAcc / totalAcc) * canvas.width; | ||||
|         const y = canvas.height - 30 * depth - 30; | ||||
| @ -194,7 +188,7 @@ function loadFlameGraph( | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| function main() { | ||||
| async function main() { | ||||
|     type RenderFns = { | ||||
|         "source-code": () => void; | ||||
|         "code-coverage": () => void; | ||||
| @ -224,14 +218,18 @@ function main() { | ||||
|         return lineElement; | ||||
|     } | ||||
| 
 | ||||
|     const codeData = await data.codeData(); | ||||
|     const codeCoverageData = await data.codeCoverageData(); | ||||
|     const flameGraphData = await data.flameGraphData(); | ||||
| 
 | ||||
|     const view = document.querySelector("#view")!; | ||||
|     const renderFunctions: RenderFns = { | ||||
|         "source-code": () => { | ||||
|             const container = document.createElement("div"); | ||||
|             container.classList.add("code-container"); | ||||
|             const lines = createLineElement(codeData()); | ||||
|             const lines = createLineElement(codeData); | ||||
|             const code = document.createElement("pre"); | ||||
|             code.innerText = codeData(); | ||||
|             code.innerText = codeData; | ||||
|             container.append(lines, code); | ||||
|             view.replaceChildren(container); | ||||
|         }, | ||||
| @ -242,8 +240,13 @@ function main() { | ||||
|             tooltip.id = "covers-tooltip"; | ||||
|             tooltip.hidden = true; | ||||
|             const code = document.createElement("pre"); | ||||
|             loadCodeCoverage(codeData(), codeCoverageData(), code, tooltip); | ||||
|             const lines = createLineElement(codeData()); | ||||
|             loadCodeCoverage( | ||||
|                 codeData, | ||||
|                 codeCoverageData, | ||||
|                 code, | ||||
|                 tooltip, | ||||
|             ); | ||||
|             const lines = createLineElement(codeData); | ||||
|             container.append(lines, code); | ||||
|             const view = document.querySelector("#view")!; | ||||
|             view.replaceChildren(container, tooltip); | ||||
| @ -252,7 +255,7 @@ function main() { | ||||
|             const container = document.createElement("div"); | ||||
|             const view = document.querySelector("#view")!; | ||||
|             view.replaceChildren(container); | ||||
|             loadFlameGraph(flameGraphData(), { | ||||
|             loadFlameGraph(flameGraphData, { | ||||
|                 0: "<entry>", | ||||
|                 12: "add", | ||||
|                 18: "main", | ||||
|  | ||||
| @ -27,8 +27,9 @@ export class RuntimeConnection { | ||||
|         while (true) { | ||||
|             const buf = new Uint8Array(256); | ||||
|             const readRes = await this.connection.read(buf); | ||||
|             result += new TextDecoder().decode(buf); | ||||
|             if (readRes == null) { | ||||
|             if (readRes != null) { | ||||
|                 result += new TextDecoder().decode(buf.slice(0, readRes)); | ||||
|             } else { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user