profile-viewer 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/dist/AssemblyView-codemirror-D6IBMDRW.js +3 -0
  3. data/dist/AssemblyView-codemirror-D6IBMDRW.js.map +7 -0
  4. data/dist/SourceView-codemirror-NF5HZACX.js +14 -0
  5. data/dist/SourceView-codemirror-NF5HZACX.js.map +7 -0
  6. data/dist/_headers +1 -4
  7. data/dist/chunk-46YDEKKM.js +2 -0
  8. data/dist/chunk-46YDEKKM.js.map +7 -0
  9. data/dist/chunk-6K4OT4SN.js +11 -0
  10. data/dist/chunk-6K4OT4SN.js.map +7 -0
  11. data/dist/chunk-FQFFJJVU.js +2 -0
  12. data/dist/chunk-FQFFJJVU.js.map +7 -0
  13. data/dist/chunk-JZQU3SPI.js +2 -0
  14. data/dist/chunk-JZQU3SPI.js.map +7 -0
  15. data/dist/chunk-RMHNU7HN.js +2 -0
  16. data/dist/chunk-RMHNU7HN.js.map +7 -0
  17. data/dist/contribute.json +1 -1
  18. data/dist/docs/_navbar.md +3 -3
  19. data/dist/docs/_sidebar.md +28 -28
  20. data/dist/docs/advanced-topics.md +5 -5
  21. data/dist/docs/async-posix-signal-control.md +5 -6
  22. data/dist/docs/bunny-2.md +3 -2
  23. data/dist/docs/bunny.md +29 -26
  24. data/dist/docs/css/vue_v4.13.1.min.css +1 -0
  25. data/dist/docs/guide-android-profiling.md +18 -2
  26. data/dist/docs/guide-filtering-call-trees.md +23 -11
  27. data/dist/docs/guide-getting-started.md +4 -5
  28. data/dist/docs/guide-perf-profiling.md +8 -8
  29. data/dist/docs/guide-profiling-android-directly-on-device.md +14 -13
  30. data/dist/docs/guide-profiling-firefox-android.md +2 -3
  31. data/dist/docs/guide-remote-profiling.md +24 -23
  32. data/dist/docs/guide-removing-profiler.md +1 -0
  33. data/dist/docs/guide-stack-samples-and-call-trees.md +2 -0
  34. data/dist/docs/guide-startup-shutdown.md +14 -9
  35. data/dist/docs/guide-ui-tour-panels.md +20 -4
  36. data/dist/docs/guide-ui-tour-timeline.md +3 -0
  37. data/dist/docs/index.html +21 -19
  38. data/dist/docs/ipc-messages.md +6 -6
  39. data/dist/docs/js/docsify_v4.13.1+.min.js +1 -0
  40. data/dist/docs/js/init.js +11 -1
  41. data/dist/docs/js/search_v4.13.1+.min.js +1 -0
  42. data/dist/docs/memory-allocations.md +4 -4
  43. data/dist/docs/videos.md +10 -10
  44. data/dist/gecko-profiler-demangle-3UYO3F2Y.js +2 -0
  45. data/dist/gecko-profiler-demangle-3UYO3F2Y.js.map +7 -0
  46. data/dist/gz.worker-C7QSA26N.js +38 -0
  47. data/dist/index-525S2SYW.js +381 -0
  48. data/dist/index-525S2SYW.js.map +7 -0
  49. data/dist/index-CZ7T6DL2.css +2 -0
  50. data/dist/index-CZ7T6DL2.css.map +7 -0
  51. data/dist/index.html +38 -1
  52. data/dist/index_bg-FTIMKZRG.wasm +0 -0
  53. data/dist/jszip.min-JBI6ADTT.js +18 -0
  54. data/dist/jszip.min-JBI6ADTT.js.map +7 -0
  55. data/dist/locales/be/app.ftl +158 -11
  56. data/dist/locales/de/app.ftl +123 -16
  57. data/dist/locales/el/app.ftl +169 -53
  58. data/dist/locales/en-CA/app.ftl +120 -16
  59. data/dist/locales/en-GB/app.ftl +128 -21
  60. data/dist/locales/en-US/app.ftl +129 -5
  61. data/dist/locales/es-CL/app.ftl +122 -17
  62. data/dist/locales/fr/app.ftl +97 -16
  63. data/dist/locales/fur/app.ftl +51 -11
  64. data/dist/locales/fy-NL/app.ftl +123 -16
  65. data/dist/locales/ia/app.ftl +129 -18
  66. data/dist/locales/it/app.ftl +117 -16
  67. data/dist/locales/kab/app.ftl +16 -78
  68. data/dist/locales/nl/app.ftl +123 -16
  69. data/dist/locales/pt-BR/app.ftl +113 -16
  70. data/dist/locales/ru/app.ftl +125 -23
  71. data/dist/locales/sv-SE/app.ftl +132 -16
  72. data/dist/locales/tr/app.ftl +163 -13
  73. data/dist/locales/uk/app.ftl +45 -19
  74. data/dist/locales/zh-CN/app.ftl +89 -17
  75. data/dist/locales/zh-TW/app.ftl +110 -15
  76. data/dist/photon/index.css +2 -0
  77. data/dist/photon/index.css.map +7 -0
  78. data/dist/photon/index.html +856 -26
  79. data/dist/photon/index.js +1 -0
  80. data/dist/photon/index.js.map +7 -0
  81. data/dist/service-worker-compat.js +51 -1
  82. data/dist/simpleperf-UUIE7C7E.js +25 -0
  83. data/dist/simpleperf-UUIE7C7E.js.map +7 -0
  84. data/dist/sw.js +1 -1
  85. data/dist/sw.js.map +1 -1
  86. data/dist/{workbox-e3490c72.js → workbox-1ef09536.js} +2 -2
  87. data/dist/workbox-1ef09536.js.map +1 -0
  88. data/ruby-bin/profile-viewer +48 -31
  89. data/ruby-bin/profile-viewer-version.rb +1 -1
  90. metadata +56 -96
  91. data/dist/022efb839d22fa54a716.svg +0 -28
  92. data/dist/0c510afd6169a0a83f97.svg +0 -14
  93. data/dist/0d5cf282780cd1a5ec64.svg +0 -8
  94. data/dist/118632062f4755918dac.svg +0 -4
  95. data/dist/11c5dca6d97c9e10e5b7.svg +0 -9
  96. data/dist/136.4ad3301b8aacf759ea70.bundle.js +0 -2
  97. data/dist/136.4ad3301b8aacf759ea70.bundle.js.map +0 -1
  98. data/dist/171.621b9df5978342be5662.bundle.js +0 -2
  99. data/dist/171.621b9df5978342be5662.bundle.js.map +0 -1
  100. data/dist/18e7fdd45099134897d2.svg +0 -8
  101. data/dist/1ddbc3ce40af8c7a648b.svg +0 -6
  102. data/dist/280.b4210a48e650408000c3.bundle.js +0 -2
  103. data/dist/280.b4210a48e650408000c3.bundle.js.map +0 -1
  104. data/dist/2d4b477bc424d35a0245.svg +0 -25
  105. data/dist/2e43ad991eb141fc017f.svg +0 -9
  106. data/dist/2ea5b50b7361e6de561c.svg +0 -11
  107. data/dist/2f37d1addc2d2f5b699e.module.wasm +0 -0
  108. data/dist/31fe933f3a12be1aa7f3.svg +0 -4
  109. data/dist/390aa266f451c1005f61.svg +0 -10
  110. data/dist/3a829bf1fcf02598aa4b.svg +0 -6
  111. data/dist/3c3fda7c08bcc9544c64.svg +0 -6
  112. data/dist/4260d5db8309a6f83637.svg +0 -10
  113. data/dist/4536fd0738f36c3463bc.svg +0 -1
  114. data/dist/490065792b7e903c9f3e.svg +0 -6
  115. data/dist/49da6a2153f62ef73d17.svg +0 -7
  116. data/dist/4ecb077d8715f89c0f87.svg +0 -13
  117. data/dist/524e896f487119a0b832.svg +0 -13
  118. data/dist/556.2be67a37a0c61fdc2485.bundle.js +0 -2
  119. data/dist/556.2be67a37a0c61fdc2485.bundle.js.map +0 -1
  120. data/dist/6bd0589a27236471fdab.svg +0 -4
  121. data/dist/6c6b49af3a86dfdd44e6.svg +0 -4
  122. data/dist/6c8063be3afa1d95c902.svg +0 -3
  123. data/dist/71730566d6c47ffdc965.svg +0 -12
  124. data/dist/7273fadce89da05535e5.svg +0 -4
  125. data/dist/731673c749e57bf6f544.svg +0 -13
  126. data/dist/76e5b29823c9fd62d90d.svg +0 -3
  127. data/dist/7853c71223701f30d495.svg +0 -19
  128. data/dist/79856ce399cb305fafb8.svg +0 -19
  129. data/dist/7c7ac3c7df370340cfd2.svg +0 -7
  130. data/dist/7e3ac9afb25cfe809520.svg +0 -1
  131. data/dist/81762b0b1aacd3686a6b.svg +0 -12
  132. data/dist/86e81402ef76d28ff55f.svg +0 -15
  133. data/dist/874.ca7a11f56438ad874b9d.bundle.js +0 -2
  134. data/dist/874.ca7a11f56438ad874b9d.bundle.js.map +0 -1
  135. data/dist/8846b19a497771fe0e9d.svg +0 -4
  136. data/dist/8aae7b979b04407f71a4.svg +0 -3
  137. data/dist/8b8b909e42722172d494.svg +0 -7
  138. data/dist/8dab2a6ba757bcc6e9a5.svg +0 -3
  139. data/dist/9103e94f1d34c15d44be.svg +0 -6
  140. data/dist/9a7bd6ec36312a2baa7e.svg +0 -1
  141. data/dist/9d858d1a3ab57f8ee2e1.svg +0 -4
  142. data/dist/9eb1fab2684d1e1f0e26.svg +0 -13
  143. data/dist/a3196e840709b18a3119.svg +0 -1
  144. data/dist/aa867391c311267af5a9.svg +0 -4
  145. data/dist/acb8393f3fb9c59b15c9.svg +0 -20
  146. data/dist/b5698a02eef37ce29146.svg +0 -10
  147. data/dist/c3432220f657733ed05f.svg +0 -10
  148. data/dist/ca2af827049e9039ef9c.svg +0 -8
  149. data/dist/d09537c705fb0878eb63.svg +0 -4
  150. data/dist/d6df0017c0241dfe86ff.svg +0 -6
  151. data/dist/d9c199b3e3e469cc5713.svg +0 -10
  152. data/dist/da1f21c60c7217745dd8.svg +0 -1
  153. data/dist/docs/gitpod.md +0 -39
  154. data/dist/docs/js/docsify_v4.12.2+.min.js +0 -1
  155. data/dist/docs/js/ga_v4.12.2.min.js +0 -1
  156. data/dist/docs/js/search_v4.12.2.min.js +0 -1
  157. data/dist/e4ed50222911c5af9a32.svg +0 -12
  158. data/dist/e70722c0fe0ac3d4227b.svg +0 -10
  159. data/dist/f8e25c2ebeb0a0725a9e.svg +0 -12
  160. data/dist/fcb532a05dd4b09c2d08.svg +0 -10
  161. data/dist/fd040fb5f4e7a515bb3c.svg +0 -15
  162. data/dist/main.89ba95fadf0fbee4977a.bundle.js +0 -201
  163. data/dist/main.89ba95fadf0fbee4977a.bundle.js.LICENSE.txt +0 -63
  164. data/dist/main.89ba95fadf0fbee4977a.bundle.js.map +0 -1
  165. data/dist/photon/118632062f4755918dac.svg +0 -4
  166. data/dist/photon/31fe933f3a12be1aa7f3.svg +0 -4
  167. data/dist/photon/49da6a2153f62ef73d17.svg +0 -7
  168. data/dist/photon/6bd0589a27236471fdab.svg +0 -4
  169. data/dist/photon/6c8063be3afa1d95c902.svg +0 -3
  170. data/dist/photon/76e5b29823c9fd62d90d.svg +0 -3
  171. data/dist/photon/8aae7b979b04407f71a4.svg +0 -3
  172. data/dist/photon/8dab2a6ba757bcc6e9a5.svg +0 -3
  173. data/dist/photon/9103e94f1d34c15d44be.svg +0 -6
  174. data/dist/photon/aa867391c311267af5a9.svg +0 -4
  175. data/dist/photon/main.fa2aec5d6b214ac1cdb3.bundle.js +0 -2
  176. data/dist/photon/main.fa2aec5d6b214ac1cdb3.bundle.js.map +0 -1
  177. data/dist/workbox-e3490c72.js.map +0 -1
  178. data/dist/zee-worker.js +0 -1
  179. /data/dist/{4d26f0e38c22eedde178.jpg → firefox-profiler-button-2021-05-06-ZEMGS6NI.jpg} +0 -0
  180. /data/dist/{18a5d1d99f1c65c33b71.png → perf-screenshot-2024-02-29-4YCKHIPD.png} +0 -0
  181. /data/dist/{favicon.png → res/img/favicon.png} +0 -0
  182. /data/dist/{58c5415e952fb6dddd6b.png → spinner-DC3JCQB7.png} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c050411e2d70822f985c891f5c897f96793e5422e7e36d879257f462e8530d2
4
- data.tar.gz: 1ee558555f7d252d67d0cb7a9d380ad593f0878b334e618f742f9f3f4cc551e6
3
+ metadata.gz: 96bc2723e13d200327228987c1e1244ad70b4d615b4a52f9bf0629cde0d1aa94
4
+ data.tar.gz: 61cf137c0d2ba8887936e8d5ebc328a3d27fd3a027354c16301cce93e926e7a9
5
5
  SHA512:
6
- metadata.gz: 0c920f1c3ac88fb2618d09102724cb503ded349d054c4cb1b0f691e0583a220e8e3a79d242bf520e9cbd844fd37ebdaed72ed6b95ebd8d73d30dba80073db079
7
- data.tar.gz: a93e22ab89721f8dc090afc2330c62c2b08a264886ade1efcf3674e18a29effab073f4ef92feccbb442a2009aa03cc5ae1c3fe87bc73bf8a422453fc6528a31c
6
+ metadata.gz: bc86ec6674fdb065287cf834d7a5734dcc59f3203384e070c57ecd6f9060757ed28e5ccf208b64c8ce8099cb35edcbd59ef55b973a394f9abb271a7e809e7266
7
+ data.tar.gz: 3bae28faf88e03254409605eabdd3fa1618a2f28eebba3d6dc2bb682b9f04ff26f9cbd6df39307149604c33def8f120e84962b31c1bdc95146573512c6ef31ab
@@ -0,0 +1,3 @@
1
+ import{a as T}from"/chunk-46YDEKKM.js";import{M as w,N as l,O as u,P as x,Q as v,e as p,g as L,h as _,i as f,m as a,o as A,z as M}from"/chunk-6K4OT4SN.js";import{e as C}from"/chunk-FQFFJJVU.js";import{d as N}from"/chunk-JZQU3SPI.js";var E=N(C());var h=_.define(),m=new L,S=p.define({create(){return new c([])},update(i,s){let e=i;for(let t of s.effects)t.is(h)&&(e=t.value);return e}}),D=A({class:"cm-instruction-address-gutter",lineMarker(i,s){let e=i.state.doc.lineAt(s.from).number,n=i.state.field(S).lineToAddress(e);return n!==null?new x(`0x${n.toString(16)}`):null},lineMarkerChange(i){return i.transactions.some(s=>s.effects.some(e=>e.is(h)))}});function I(i){return i.map(s=>s.decodedString).join(`
2
+ `)}var c=class{_instructionAddresses;constructor(s){this._instructionAddresses=s}addressToLine(s){let e=T(this._instructionAddresses,s);return e===0?null:e-1+1}lineToAddress(s){if(s<1||s>this._instructionAddresses.length)return null;let e=s-1;return this._instructionAddresses[e]}};function b(i){return i.map(s=>s.address)}function g(i,s){let e=new Map;for(let[n,d]of i.totalAddressHits){let r=s.addressToLine(n);if(r!==null){let o=e.get(r)??0;e.set(r,o+d)}}let t=new Map;for(let[n,d]of i.selfAddressHits){let r=s.addressToLine(n);if(r!==null){let o=t.get(r)??0;t.set(r,o+d)}}return{totalLineHits:e,selfLineHits:t}}var H=class{_view;_addressToLineMap;_addressTimings;_highlightedAddress;constructor(s,e,t,n){this._addressToLineMap=new c(b(s)),this._addressTimings=e,this._highlightedAddress=t;let d=t!==null?this._addressToLineMap.addressToLine(t):null,r=f.create({doc:I(s),extensions:[v,S,D,m.of(u(d)),w(M),f.readOnly.of(!0),a.editable.of(!1)]}),o=g(this._addressTimings,this._addressToLineMap);r=r.update({effects:[h.of(this._addressToLineMap),l.of(o)]}).state,this._view=new a({state:r,parent:n})}setContents(s){this._addressToLineMap=new c(b(s));let e=g(this._addressTimings,this._addressToLineMap),t=this._highlightedAddress!==null?this._addressToLineMap.addressToLine(this._highlightedAddress):null,n=I(s);this._view.dispatch(this._view.state.update({changes:{insert:n,from:0,to:this._view.state.doc.length}})),this._view.dispatch({effects:[h.of(this._addressToLineMap),l.of(e),m.reconfigure(u(t))]})}setTimings(s){this._addressTimings=s;let e=g(this._addressTimings,this._addressToLineMap);this._view.dispatch({effects:l.of(e)})}scrollToLine(s){s=(0,E.default)(s,1,this._view.state.doc.lines);let e=this._view.state.doc.line(s).from;this._view.dispatch({effects:a.scrollIntoView(e,{y:"start",yMargin:0})}),this._view.coordsAtPos(0)}scrollToAddress(s){let e=this._addressToLineMap.addressToLine(s);e!==null&&this.scrollToLine(e)}scrollToAddressWithSpaceOnTop(s,e){let t=this._addressToLineMap.addressToLine(s);t!==null&&this.scrollToLine(t-e)}setHighlightedInstruction(s){this._highlightedAddress=s;let e=s!==null?this._addressToLineMap.addressToLine(s):null;this._view.dispatch({effects:m.reconfigure(u(e))})}};export{H as AssemblyViewEditor};
3
+ //# sourceMappingURL=/AssemblyView-codemirror-D6IBMDRW.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/shared/AssemblyView-codemirror.tsx"],
4
+ "sourcesContent": ["/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n/**\n * This module wraps all the interaction with the CodeMirror API into a\n * AssemblyViewEditor class.\n *\n * This module is intended to be imported asynchronously, so that all the\n * CodeMirror code can be split into a separate bundle chunk.\n *\n * This file implements the following features:\n * - Display assembly code.\n * - Display a gutter with:\n * - \"Total\" timings for each instruction\n * - \"Self\" timings for each instruction\n * - The address for each instruction\n * - Highlight assembly code lines which have a non-zero timing, by applying\n * a cm-nonZeroLine class to them. This highlight line goes across the entire\n * width of the editor, it covers both the gutter and the main area.\n */\nimport { EditorView, gutter } from '@codemirror/view';\nimport {\n EditorState,\n StateField,\n StateEffect,\n Compartment,\n} from '@codemirror/state';\nimport { syntaxHighlighting } from '@codemirror/language';\nimport { classHighlighter } from '@lezer/highlight';\nimport clamp from 'clamp';\n\nimport type {\n AddressTimings,\n Address,\n LineTimings,\n LineNumber,\n DecodedInstruction,\n} from 'firefox-profiler/types';\n\nimport { bisectionRight } from 'firefox-profiler/utils/bisect';\nimport {\n timingsExtension,\n updateTimingsEffect,\n StringMarker,\n createHighlightedLineExtension,\n} from 'firefox-profiler/utils/codemirror-shared';\n\n// An \"effect\" is like a redux action. This effect is used to replace the value\n// of the state field addressToLineMapField.\nconst updateAddressToLineMapEffect = StateEffect.define<AddressToLineMap>();\n\n// This \"compartment\" allows us to swap the highlighted line when it changes.\nconst highlightedLineConf = new Compartment();\n\n// This \"state field\" stores the current AddressToLineMap. This field allows the\n// instructionAddressGutter to map line numbers to addresses.\nconst addressToLineMapField = StateField.define<AddressToLineMap>({\n create() {\n return new AddressToLineMap([]);\n },\n update(instructionAddresses, transaction) {\n // Get the new value from an effect in the transaction.\n let newSortedAddresses = instructionAddresses;\n for (const effect of transaction.effects) {\n if (effect.is(updateAddressToLineMapEffect)) {\n newSortedAddresses = effect.value;\n }\n }\n return newSortedAddresses;\n },\n});\n\n// A gutter which displays the address of each instruction.\nconst instructionAddressGutter = gutter({\n class: 'cm-instruction-address-gutter',\n\n // Returns a gutter marker for this line, or null.\n lineMarker(view, line) {\n const lineNumber = view.state.doc.lineAt(line.from).number;\n const map = view.state.field(addressToLineMapField);\n const address = map.lineToAddress(lineNumber);\n return address !== null\n ? new StringMarker(`0x${address.toString(16)}`)\n : null;\n },\n\n // Returns true if the update affects the instruction addresses in the gutter.\n lineMarkerChange(update) {\n return update.transactions.some((t) =>\n t.effects.some((e) => e.is(updateAddressToLineMapEffect))\n );\n },\n});\n\nfunction instructionsToText(assemblyCode: DecodedInstruction[]): string {\n return assemblyCode.map((instr) => instr.decodedString).join('\\n');\n}\n\n/**\n * This map is used to convert between instruction addresses and editor line\n * numbers.\n */\nclass AddressToLineMap {\n // The address of each instruction. This stays constant for the entire lifetime\n // of this AddressToLineMap instance.\n //\n // _instructionAddresses[0] contains the address of the instruction which is\n // displayed in line 1. (Line numbers are 1-based.)\n //\n // The addresses need to be ordered from low to high, so that the binary search\n // works.\n _instructionAddresses: Address[];\n\n constructor(instructionAddresses: Address[]) {\n this._instructionAddresses = instructionAddresses;\n }\n\n // Find the line which displays the instruction which covers `address`.\n // `address` doesn't need to be a perfect match for the instruction address;\n // for example, in the example below, address 0x10e4 is mapped to line 3:\n //\n // 1: 0x10da: mov r14, rdi\n // 2: 0x10dd: mov rdi, rsi\n // 3: 0x10e0: call _malloc_usable_size\n // 4: 0x10e5: test rax, rax\n // 5: 0x10e8: je loc_10f6\n addressToLine(address: Address): LineNumber | null {\n const insertionIndex = bisectionRight(this._instructionAddresses, address);\n if (insertionIndex === 0) {\n // address < instructionAddresses[0]\n return null;\n }\n\n const elementIndex = insertionIndex - 1;\n const lineNumber = elementIndex + 1;\n return lineNumber;\n }\n\n // Return the address of the instruction which is displayed in line `lineNumber`.\n lineToAddress(lineNumber: LineNumber): Address | null {\n if (lineNumber < 1 || lineNumber > this._instructionAddresses.length) {\n return null;\n }\n\n const elementIndex = lineNumber - 1;\n return this._instructionAddresses[elementIndex];\n }\n}\n\nfunction getInstructionAddresses(\n assemblyCode: DecodedInstruction[]\n): Address[] {\n return assemblyCode.map((instr) => instr.address);\n}\n\n// Convert AddressTimings to LineTimings with the help of an AddressToLineMap.\nfunction addressTimingsToLineTimings(\n addressTimings: AddressTimings,\n map: AddressToLineMap\n): LineTimings {\n const totalLineHits = new Map<LineNumber, number>();\n for (const [address, hitCount] of addressTimings.totalAddressHits) {\n const line = map.addressToLine(address);\n if (line !== null) {\n const currentHitCount = totalLineHits.get(line) ?? 0;\n totalLineHits.set(line, currentHitCount + hitCount);\n }\n }\n\n const selfLineHits = new Map<LineNumber, number>();\n for (const [address, hitCount] of addressTimings.selfAddressHits) {\n const line = map.addressToLine(address);\n if (line !== null) {\n const currentHitCount = selfLineHits.get(line) ?? 0;\n selfLineHits.set(line, currentHitCount + hitCount);\n }\n }\n\n return { totalLineHits, selfLineHits };\n}\n\nexport class AssemblyViewEditor {\n _view: EditorView;\n _addressToLineMap: AddressToLineMap;\n _addressTimings: AddressTimings;\n _highlightedAddress: Address | null;\n\n // Create a CodeMirror editor and add it as a child element of domParent.\n constructor(\n initialAssemblyCode: DecodedInstruction[],\n addressTimings: AddressTimings,\n highlightedAddress: Address | null,\n domParent: Element\n ) {\n this._addressToLineMap = new AddressToLineMap(\n getInstructionAddresses(initialAssemblyCode)\n );\n this._addressTimings = addressTimings;\n this._highlightedAddress = highlightedAddress;\n const highlightedLine =\n highlightedAddress !== null\n ? this._addressToLineMap.addressToLine(highlightedAddress)\n : null;\n let state = EditorState.create({\n doc: instructionsToText(initialAssemblyCode),\n extensions: [\n timingsExtension,\n addressToLineMapField,\n instructionAddressGutter,\n highlightedLineConf.of(createHighlightedLineExtension(highlightedLine)),\n syntaxHighlighting(classHighlighter),\n EditorState.readOnly.of(true),\n EditorView.editable.of(false),\n ],\n });\n const lineTimings = addressTimingsToLineTimings(\n this._addressTimings,\n this._addressToLineMap\n );\n state = state.update({\n effects: [\n updateAddressToLineMapEffect.of(this._addressToLineMap),\n updateTimingsEffect.of(lineTimings),\n ],\n }).state;\n this._view = new EditorView({\n state,\n parent: domParent,\n });\n }\n\n setContents(assemblyCode: DecodedInstruction[]) {\n this._addressToLineMap = new AddressToLineMap(\n getInstructionAddresses(assemblyCode)\n );\n const lineTimings = addressTimingsToLineTimings(\n this._addressTimings,\n this._addressToLineMap\n );\n // Recalculate the highlighted line based on the new address-to-line mapping.\n const highlightedLine =\n this._highlightedAddress !== null\n ? this._addressToLineMap.addressToLine(this._highlightedAddress)\n : null;\n // The CodeMirror way of replacing the entire contents is to insert new text\n // and overwrite the full range of existing text.\n const text = instructionsToText(assemblyCode);\n this._view.dispatch(\n this._view.state.update({\n changes: {\n insert: text,\n from: 0,\n to: this._view.state.doc.length,\n },\n })\n );\n this._view.dispatch({\n effects: [\n updateAddressToLineMapEffect.of(this._addressToLineMap),\n updateTimingsEffect.of(lineTimings),\n highlightedLineConf.reconfigure(\n createHighlightedLineExtension(highlightedLine)\n ),\n ],\n });\n }\n\n setTimings(addressTimings: AddressTimings) {\n // Update the value of the timings field by dispatching an updateTimingsEffect.\n this._addressTimings = addressTimings;\n const lineTimings = addressTimingsToLineTimings(\n this._addressTimings,\n this._addressToLineMap\n );\n this._view.dispatch({\n effects: updateTimingsEffect.of(lineTimings),\n });\n }\n\n scrollToLine(lineNumber: number) {\n // Clamp the line number to the document's line count.\n lineNumber = clamp(lineNumber, 1, this._view.state.doc.lines);\n\n // Convert the line number into a position.\n const pos = this._view.state.doc.line(lineNumber).from;\n // Dispatch the scroll action.\n this._view.dispatch({\n effects: EditorView.scrollIntoView(pos, { y: 'start', yMargin: 0 }),\n });\n // Trigger a measure flush, to work around\n // https://github.com/codemirror/codemirror.next/issues/676\n this._view.coordsAtPos(0);\n }\n\n scrollToAddress(address: Address) {\n const lineNumber = this._addressToLineMap.addressToLine(address);\n if (lineNumber !== null) {\n this.scrollToLine(lineNumber);\n }\n }\n\n scrollToAddressWithSpaceOnTop(address: Address, topSpaceLines: number) {\n const lineNumber = this._addressToLineMap.addressToLine(address);\n if (lineNumber !== null) {\n this.scrollToLine(lineNumber - topSpaceLines);\n }\n }\n\n setHighlightedInstruction(address: Address | null) {\n // Store the highlighted address so we can recalculate the line number\n // when the address-to-line mapping changes.\n this._highlightedAddress = address;\n // Convert the address to a line number and update the highlighted line.\n const lineNumber =\n address !== null ? this._addressToLineMap.addressToLine(address) : null;\n this._view.dispatch({\n effects: highlightedLineConf.reconfigure(\n createHighlightedLineExtension(lineNumber)\n ),\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_clamp", "updateAddressToLineMapEffect", "StateEffect", "highlightedLineConf", "Compartment", "addressToLineMapField", "StateField", "AddressToLineMap", "instructionAddresses", "transaction", "newSortedAddresses", "effect", "instructionAddressGutter", "gutter", "view", "line", "lineNumber", "address", "StringMarker", "update", "t", "instructionsToText", "assemblyCode", "instr", "insertionIndex", "bisectionRight", "elementIndex", "getInstructionAddresses", "addressTimingsToLineTimings", "addressTimings", "map", "totalLineHits", "hitCount", "currentHitCount", "selfLineHits", "AssemblyViewEditor", "initialAssemblyCode", "highlightedAddress", "domParent", "highlightedLine", "state", "EditorState", "timingsExtension", "createHighlightedLineExtension", "syntaxHighlighting", "classHighlighter", "EditorView", "lineTimings", "updateTimingsEffect", "text", "clamp", "pos", "topSpaceLines"]
7
+ }