(state, ev)
| 252 | function sym(addr) { return CONFIG.symbolicate ? resolve(addr).text : addr.toString(); } |
| 253 | |
| 254 | function formatEvent(state, ev) { |
| 255 | const type = ev[0]; |
| 256 | switch (type) { |
| 257 | case "call": { |
| 258 | const from = np(ev[1]), to = np(ev[2]), depth = ev[3]; |
| 259 | const r = resolve(to); |
| 260 | if (!inScope(state.scope, r.lib)) return null; |
| 261 | return `${C.cyan}CALL${C.reset} ${sym(from)} -> ${r.text} ${C.dim}depth=${depth}${C.reset}`; |
| 262 | } |
| 263 | case "ret": { |
| 264 | const from = np(ev[1]), to = np(ev[2]); |
| 265 | const r = resolve(from); |
| 266 | if (!inScope(state.scope, r.lib)) return null; |
| 267 | return `${C.dim}RET ${C.reset} ${r.text} -> ${sym(to)}`; |
| 268 | } |
| 269 | case "block": { |
| 270 | const start = np(ev[1]), end = np(ev[2]); |
| 271 | const r = resolve(start); |
| 272 | if (!inScope(state.scope, r.lib)) return null; |
| 273 | const size = end && start ? parseInt(end.sub(start).toString(), 16) : 0; |
| 274 | return `${C.yellow}BLOCK${C.reset} ${r.text} ${C.dim}(${size}B)${C.reset}`; |
| 275 | } |
| 276 | case "compile": { |
| 277 | const r = resolve(np(ev[1])); |
| 278 | if (!inScope(state.scope, r.lib)) return null; |
| 279 | return `${C.dim}COMPILE${C.reset} ${r.text}`; |
| 280 | } |
| 281 | case "exec": { |
| 282 | const r = resolve(np(ev[1])); |
| 283 | if (!inScope(state.scope, r.lib)) return null; |
| 284 | return `EXEC ${r.text}`; |
| 285 | } |
| 286 | default: return null; |
| 287 | } |
| 288 | } |
| 289 | |
| 290 | // --- install hooks ---------------------------------------------------------- |
| 291 | const hooks = []; |
no test coverage detected