profile-viewer 0.0.5 → 0.0.7

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 (170) 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/css/vue_v4.13.1.min.css +1 -0
  19. data/dist/docs/guide-filtering-call-trees.md +12 -0
  20. data/dist/docs/guide-ui-tour-panels.md +16 -1
  21. data/dist/docs/index.html +5 -6
  22. data/dist/docs/js/docsify_v4.13.1+.min.js +1 -0
  23. data/dist/docs/js/init.js +11 -1
  24. data/dist/docs/js/search_v4.13.1+.min.js +1 -0
  25. data/dist/gecko-profiler-demangle-3UYO3F2Y.js +2 -0
  26. data/dist/gecko-profiler-demangle-3UYO3F2Y.js.map +7 -0
  27. data/dist/gz.worker-C7QSA26N.js +38 -0
  28. data/dist/index-CZ7T6DL2.css +2 -0
  29. data/dist/index-CZ7T6DL2.css.map +7 -0
  30. data/dist/index-P5VLDZC7.js +381 -0
  31. data/dist/index-P5VLDZC7.js.map +7 -0
  32. data/dist/index.html +38 -1
  33. data/dist/index_bg-FTIMKZRG.wasm +0 -0
  34. data/dist/jszip.min-JBI6ADTT.js +18 -0
  35. data/dist/jszip.min-JBI6ADTT.js.map +7 -0
  36. data/dist/locales/be/app.ftl +50 -11
  37. data/dist/locales/de/app.ftl +114 -16
  38. data/dist/locales/el/app.ftl +135 -42
  39. data/dist/locales/en-CA/app.ftl +97 -11
  40. data/dist/locales/en-GB/app.ftl +114 -16
  41. data/dist/locales/en-US/app.ftl +116 -1
  42. data/dist/locales/es-CL/app.ftl +105 -15
  43. data/dist/locales/fr/app.ftl +82 -16
  44. data/dist/locales/fur/app.ftl +35 -11
  45. data/dist/locales/fy-NL/app.ftl +114 -16
  46. data/dist/locales/ia/app.ftl +118 -19
  47. data/dist/locales/it/app.ftl +108 -16
  48. data/dist/locales/kab/app.ftl +6 -80
  49. data/dist/locales/nl/app.ftl +114 -16
  50. data/dist/locales/pt-BR/app.ftl +104 -16
  51. data/dist/locales/ru/app.ftl +116 -23
  52. data/dist/locales/sv-SE/app.ftl +114 -16
  53. data/dist/locales/tr/app.ftl +149 -13
  54. data/dist/locales/uk/app.ftl +27 -19
  55. data/dist/locales/zh-CN/app.ftl +75 -13
  56. data/dist/locales/zh-TW/app.ftl +100 -14
  57. data/dist/photon/index.css +2 -0
  58. data/dist/photon/index.css.map +7 -0
  59. data/dist/photon/index.html +856 -26
  60. data/dist/photon/index.js +1 -0
  61. data/dist/photon/index.js.map +7 -0
  62. data/dist/service-worker-compat.js +51 -1
  63. data/dist/simpleperf-UUIE7C7E.js +25 -0
  64. data/dist/simpleperf-UUIE7C7E.js.map +7 -0
  65. data/dist/sw.js +1 -1
  66. data/dist/sw.js.map +1 -1
  67. data/dist/{workbox-e3490c72.js → workbox-1ef09536.js} +2 -2
  68. data/dist/workbox-1ef09536.js.map +1 -0
  69. data/ruby-bin/profile-viewer +48 -40
  70. data/ruby-bin/profile-viewer-version.rb +1 -1
  71. metadata +56 -103
  72. data/dist/022efb839d22fa54a716.svg +0 -28
  73. data/dist/029b9e4fd0218d7b09c6.svg +0 -8
  74. data/dist/0c510afd6169a0a83f97.svg +0 -14
  75. data/dist/0d5cf282780cd1a5ec64.svg +0 -8
  76. data/dist/118632062f4755918dac.svg +0 -4
  77. data/dist/11c5dca6d97c9e10e5b7.svg +0 -9
  78. data/dist/136.ad4176dc2a8e5cf33ef3.bundle.js +0 -2
  79. data/dist/136.ad4176dc2a8e5cf33ef3.bundle.js.map +0 -1
  80. data/dist/171.37d1e1824587d8df0ae2.bundle.js +0 -2
  81. data/dist/171.37d1e1824587d8df0ae2.bundle.js.map +0 -1
  82. data/dist/18e7fdd45099134897d2.svg +0 -8
  83. data/dist/1ddbc3ce40af8c7a648b.svg +0 -6
  84. data/dist/234ed61ab185caff67e3.svg +0 -8
  85. data/dist/280.4edd20bd6228986bbf2e.bundle.js +0 -2
  86. data/dist/280.4edd20bd6228986bbf2e.bundle.js.map +0 -1
  87. data/dist/2d4b477bc424d35a0245.svg +0 -25
  88. data/dist/2e43ad991eb141fc017f.svg +0 -9
  89. data/dist/2ea5b50b7361e6de561c.svg +0 -11
  90. data/dist/2f37d1addc2d2f5b699e.module.wasm +0 -0
  91. data/dist/31fe933f3a12be1aa7f3.svg +0 -4
  92. data/dist/390aa266f451c1005f61.svg +0 -10
  93. data/dist/3a829bf1fcf02598aa4b.svg +0 -6
  94. data/dist/3c3fda7c08bcc9544c64.svg +0 -6
  95. data/dist/4260d5db8309a6f83637.svg +0 -10
  96. data/dist/4536fd0738f36c3463bc.svg +0 -1
  97. data/dist/490065792b7e903c9f3e.svg +0 -6
  98. data/dist/49da6a2153f62ef73d17.svg +0 -7
  99. data/dist/4ecb077d8715f89c0f87.svg +0 -13
  100. data/dist/524e896f487119a0b832.svg +0 -13
  101. data/dist/556.b8d3d4d402ced081615a.bundle.js +0 -2
  102. data/dist/556.b8d3d4d402ced081615a.bundle.js.map +0 -1
  103. data/dist/6bd0589a27236471fdab.svg +0 -4
  104. data/dist/6c6b49af3a86dfdd44e6.svg +0 -4
  105. data/dist/6c8063be3afa1d95c902.svg +0 -3
  106. data/dist/71730566d6c47ffdc965.svg +0 -12
  107. data/dist/7273fadce89da05535e5.svg +0 -4
  108. data/dist/731673c749e57bf6f544.svg +0 -13
  109. data/dist/76e5b29823c9fd62d90d.svg +0 -3
  110. data/dist/7853c71223701f30d495.svg +0 -19
  111. data/dist/79856ce399cb305fafb8.svg +0 -19
  112. data/dist/7c7ac3c7df370340cfd2.svg +0 -7
  113. data/dist/7e3ac9afb25cfe809520.svg +0 -1
  114. data/dist/81762b0b1aacd3686a6b.svg +0 -12
  115. data/dist/86e81402ef76d28ff55f.svg +0 -15
  116. data/dist/874.7cb94ee0732c5a2ca826.bundle.js +0 -2
  117. data/dist/874.7cb94ee0732c5a2ca826.bundle.js.map +0 -1
  118. data/dist/8846b19a497771fe0e9d.svg +0 -4
  119. data/dist/8aae7b979b04407f71a4.svg +0 -3
  120. data/dist/8b8b909e42722172d494.svg +0 -7
  121. data/dist/8dab2a6ba757bcc6e9a5.svg +0 -3
  122. data/dist/9103e94f1d34c15d44be.svg +0 -6
  123. data/dist/957.2f40be4cef3037bc352b.bundle.js +0 -3
  124. data/dist/957.2f40be4cef3037bc352b.bundle.js.LICENSE.txt +0 -19
  125. data/dist/957.2f40be4cef3037bc352b.bundle.js.map +0 -1
  126. data/dist/999.a1119c25d77e1883c1e1.bundle.js +0 -2
  127. data/dist/999.a1119c25d77e1883c1e1.bundle.js.map +0 -1
  128. data/dist/9a7bd6ec36312a2baa7e.svg +0 -1
  129. data/dist/9d858d1a3ab57f8ee2e1.svg +0 -4
  130. data/dist/9eb1fab2684d1e1f0e26.svg +0 -13
  131. data/dist/a3196e840709b18a3119.svg +0 -1
  132. data/dist/aa867391c311267af5a9.svg +0 -4
  133. data/dist/acb8393f3fb9c59b15c9.svg +0 -20
  134. data/dist/b5698a02eef37ce29146.svg +0 -10
  135. data/dist/c3432220f657733ed05f.svg +0 -10
  136. data/dist/ca2af827049e9039ef9c.svg +0 -8
  137. data/dist/d09537c705fb0878eb63.svg +0 -4
  138. data/dist/d6df0017c0241dfe86ff.svg +0 -6
  139. data/dist/d9c199b3e3e469cc5713.svg +0 -10
  140. data/dist/da1f21c60c7217745dd8.svg +0 -1
  141. data/dist/docs/gitpod.md +0 -34
  142. data/dist/docs/js/docsify_v4.12.2+.min.js +0 -1
  143. data/dist/docs/js/ga_v4.12.2.min.js +0 -1
  144. data/dist/docs/js/search_v4.12.2.min.js +0 -1
  145. data/dist/e4ed50222911c5af9a32.svg +0 -12
  146. data/dist/e70722c0fe0ac3d4227b.svg +0 -10
  147. data/dist/f8e25c2ebeb0a0725a9e.svg +0 -12
  148. data/dist/fcb532a05dd4b09c2d08.svg +0 -10
  149. data/dist/fd040fb5f4e7a515bb3c.svg +0 -15
  150. data/dist/main.6cdc9308b67c00785584.bundle.js +0 -198
  151. data/dist/main.6cdc9308b67c00785584.bundle.js.LICENSE.txt +0 -63
  152. data/dist/main.6cdc9308b67c00785584.bundle.js.map +0 -1
  153. data/dist/photon/118632062f4755918dac.svg +0 -4
  154. data/dist/photon/31fe933f3a12be1aa7f3.svg +0 -4
  155. data/dist/photon/49da6a2153f62ef73d17.svg +0 -7
  156. data/dist/photon/6bd0589a27236471fdab.svg +0 -4
  157. data/dist/photon/6c8063be3afa1d95c902.svg +0 -3
  158. data/dist/photon/76e5b29823c9fd62d90d.svg +0 -3
  159. data/dist/photon/8aae7b979b04407f71a4.svg +0 -3
  160. data/dist/photon/8dab2a6ba757bcc6e9a5.svg +0 -3
  161. data/dist/photon/9103e94f1d34c15d44be.svg +0 -6
  162. data/dist/photon/aa867391c311267af5a9.svg +0 -4
  163. data/dist/photon/main.e1d25e5ea6d5812b127b.bundle.js +0 -2
  164. data/dist/photon/main.e1d25e5ea6d5812b127b.bundle.js.map +0 -1
  165. data/dist/workbox-e3490c72.js.map +0 -1
  166. data/dist/zee-worker.js +0 -1
  167. /data/dist/{4d26f0e38c22eedde178.jpg → firefox-profiler-button-2021-05-06-ZEMGS6NI.jpg} +0 -0
  168. /data/dist/{18a5d1d99f1c65c33b71.png → perf-screenshot-2024-02-29-4YCKHIPD.png} +0 -0
  169. /data/dist/{favicon.png → res/img/favicon.png} +0 -0
  170. /data/dist/{58c5415e952fb6dddd6b.png → spinner-DC3JCQB7.png} +0 -0
@@ -2,9 +2,9 @@
2
2
 
3
3
  require "webrick"
4
4
  require "json"
5
- require "cgi"
6
5
  require "optparse"
7
6
  require "socket"
7
+ require "uri"
8
8
 
9
9
  HTTP_ROOT = File.expand_path File.join(__dir__, "..", "dist")
10
10
 
@@ -78,14 +78,57 @@ unless File.exist?(ARGV[0])
78
78
  exit(2)
79
79
  end
80
80
 
81
- port = 0
82
- profile_paths = []
83
- server = WEBrick::HTTPServer.new :Port => port,
81
+ def process_argv server
82
+ valid_files = Set.new
83
+ port = server.config[:Port]
84
+
85
+ profile_paths = []
86
+
87
+ ARGV.each.with_index do |profile, index|
88
+ full_path = File.expand_path profile
89
+
90
+ is_gzipped = File.binread(full_path, 2) == "\x1F\x8B".b
91
+ content = if is_gzipped
92
+ require "zlib"
93
+ Zlib::GzipReader.open(full_path) { |gz| gz.read }
94
+ else
95
+ File.read full_path
96
+ end
97
+ parsed_file = JSON.parse content
98
+
99
+ parsed_file["threads"].each do |thread|
100
+ thread["stringArray"].map! do |str|
101
+ str = File.expand_path(str) if File.exist?(str)
102
+
103
+ if str.start_with?("/")
104
+ valid_files << str
105
+ "http://localhost:#{port}/source#{str}"
106
+ else
107
+ str
108
+ end
109
+ end
110
+ end
111
+
112
+ uri_path = "/profile#{index unless ARGV.size == 1}"
113
+ $stderr.puts "Mounting #{full_path} at #{uri_path}"
114
+ server.mount uri_path, Profile, full_path, parsed_file
115
+ profile_paths << uri_path
116
+ end
117
+
118
+ unless valid_files.empty?
119
+ server.mount "/source", Source, valid_files
120
+ end
121
+
122
+ profile_paths
123
+ end
124
+
125
+ server = WEBrick::HTTPServer.new :Port => 0,
84
126
  :DocumentRoot => HTTP_ROOT,
85
127
  :StartCallback => lambda {
86
128
  port = server.config[:Port]
129
+ profile_paths = process_argv(server)
87
130
  profile_paths.each do |path|
88
- should_get = "http://localhost:#{port}/from-url/" + CGI.escape("http://localhost:#{port}#{path}")
131
+ should_get = "http://localhost:#{port}/from-url/" + URI.encode_www_form_component("http://localhost:#{port}#{path}")
89
132
  system("open #{should_get}")
90
133
  end
91
134
  }
@@ -94,39 +137,4 @@ trap 'INT' do server.shutdown end
94
137
 
95
138
  server.mount "/from-url", GetIndex
96
139
 
97
- valid_files = Set.new
98
-
99
- ARGV.each.with_index do |profile, index|
100
- full_path = File.expand_path profile
101
-
102
- is_gzipped = File.binread(full_path, 2) == "\x1F\x8B".b
103
- content = if is_gzipped
104
- require "zlib"
105
- Zlib::GzipReader.open(full_path) { |gz| gz.read }
106
- else
107
- File.read full_path
108
- end
109
- parsed_file = JSON.parse content
110
-
111
- parsed_file["threads"].each do |thread|
112
- thread["stringArray"].map! do |str|
113
- if str.start_with?("/") && File.exist?(str)
114
- valid_files << str
115
- "http://localhost:#{port}/source#{str}"
116
- else
117
- str
118
- end
119
- end
120
- end
121
-
122
- uri_path = "/profile#{index unless ARGV.size == 1}"
123
- $stderr.puts "Mounting #{full_path} at #{uri_path}"
124
- server.mount uri_path, Profile, full_path, parsed_file
125
- profile_paths << uri_path
126
- end
127
-
128
- unless valid_files.empty?
129
- server.mount "/source", Source, valid_files
130
- end
131
-
132
140
  server.start
@@ -1,3 +1,3 @@
1
1
  module ProfileViewer
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.7"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: profile-viewer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Patterson
8
8
  bindir: ruby-bin
9
9
  cert_chain: []
10
- date: 2025-05-16 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: webrick
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: uri
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
40
54
  description: This gem packages the Mozilla Profiler so that you can run it locally
41
55
  email: tenderlove@ruby-lang.org
42
56
  executables:
@@ -44,81 +58,23 @@ executables:
44
58
  extensions: []
45
59
  extra_rdoc_files: []
46
60
  files:
47
- - dist/022efb839d22fa54a716.svg
48
- - dist/029b9e4fd0218d7b09c6.svg
49
- - dist/0c510afd6169a0a83f97.svg
50
- - dist/0d5cf282780cd1a5ec64.svg
51
- - dist/118632062f4755918dac.svg
52
- - dist/11c5dca6d97c9e10e5b7.svg
53
- - dist/136.ad4176dc2a8e5cf33ef3.bundle.js
54
- - dist/136.ad4176dc2a8e5cf33ef3.bundle.js.map
55
- - dist/171.37d1e1824587d8df0ae2.bundle.js
56
- - dist/171.37d1e1824587d8df0ae2.bundle.js.map
57
- - dist/18a5d1d99f1c65c33b71.png
58
- - dist/18e7fdd45099134897d2.svg
59
- - dist/1ddbc3ce40af8c7a648b.svg
60
- - dist/234ed61ab185caff67e3.svg
61
- - dist/280.4edd20bd6228986bbf2e.bundle.js
62
- - dist/280.4edd20bd6228986bbf2e.bundle.js.map
63
- - dist/2d4b477bc424d35a0245.svg
64
- - dist/2e43ad991eb141fc017f.svg
65
- - dist/2ea5b50b7361e6de561c.svg
66
- - dist/2f37d1addc2d2f5b699e.module.wasm
67
- - dist/31fe933f3a12be1aa7f3.svg
68
- - dist/390aa266f451c1005f61.svg
69
- - dist/3a829bf1fcf02598aa4b.svg
70
- - dist/3c3fda7c08bcc9544c64.svg
71
- - dist/4260d5db8309a6f83637.svg
72
- - dist/4536fd0738f36c3463bc.svg
73
- - dist/490065792b7e903c9f3e.svg
74
- - dist/49da6a2153f62ef73d17.svg
75
- - dist/4d26f0e38c22eedde178.jpg
76
- - dist/4ecb077d8715f89c0f87.svg
77
- - dist/524e896f487119a0b832.svg
78
- - dist/556.b8d3d4d402ced081615a.bundle.js
79
- - dist/556.b8d3d4d402ced081615a.bundle.js.map
80
- - dist/58c5415e952fb6dddd6b.png
81
- - dist/6bd0589a27236471fdab.svg
82
- - dist/6c6b49af3a86dfdd44e6.svg
83
- - dist/6c8063be3afa1d95c902.svg
84
- - dist/71730566d6c47ffdc965.svg
85
- - dist/7273fadce89da05535e5.svg
86
- - dist/731673c749e57bf6f544.svg
87
- - dist/76e5b29823c9fd62d90d.svg
88
- - dist/7853c71223701f30d495.svg
89
- - dist/79856ce399cb305fafb8.svg
90
- - dist/7c7ac3c7df370340cfd2.svg
91
- - dist/7e3ac9afb25cfe809520.svg
92
- - dist/81762b0b1aacd3686a6b.svg
93
- - dist/86e81402ef76d28ff55f.svg
94
- - dist/874.7cb94ee0732c5a2ca826.bundle.js
95
- - dist/874.7cb94ee0732c5a2ca826.bundle.js.map
96
- - dist/8846b19a497771fe0e9d.svg
97
- - dist/8aae7b979b04407f71a4.svg
98
- - dist/8b8b909e42722172d494.svg
99
- - dist/8dab2a6ba757bcc6e9a5.svg
100
- - dist/9103e94f1d34c15d44be.svg
101
- - dist/957.2f40be4cef3037bc352b.bundle.js
102
- - dist/957.2f40be4cef3037bc352b.bundle.js.LICENSE.txt
103
- - dist/957.2f40be4cef3037bc352b.bundle.js.map
104
- - dist/999.a1119c25d77e1883c1e1.bundle.js
105
- - dist/999.a1119c25d77e1883c1e1.bundle.js.map
106
- - dist/9a7bd6ec36312a2baa7e.svg
107
- - dist/9d858d1a3ab57f8ee2e1.svg
108
- - dist/9eb1fab2684d1e1f0e26.svg
61
+ - dist/AssemblyView-codemirror-D6IBMDRW.js
62
+ - dist/AssemblyView-codemirror-D6IBMDRW.js.map
63
+ - dist/SourceView-codemirror-NF5HZACX.js
64
+ - dist/SourceView-codemirror-NF5HZACX.js.map
109
65
  - dist/_headers
110
66
  - dist/_redirects
111
- - dist/a3196e840709b18a3119.svg
112
- - dist/aa867391c311267af5a9.svg
113
- - dist/acb8393f3fb9c59b15c9.svg
114
- - dist/b5698a02eef37ce29146.svg
115
- - dist/c3432220f657733ed05f.svg
116
- - dist/ca2af827049e9039ef9c.svg
67
+ - dist/chunk-46YDEKKM.js
68
+ - dist/chunk-46YDEKKM.js.map
69
+ - dist/chunk-6K4OT4SN.js
70
+ - dist/chunk-6K4OT4SN.js.map
71
+ - dist/chunk-FQFFJJVU.js
72
+ - dist/chunk-FQFFJJVU.js.map
73
+ - dist/chunk-JZQU3SPI.js
74
+ - dist/chunk-JZQU3SPI.js.map
75
+ - dist/chunk-RMHNU7HN.js
76
+ - dist/chunk-RMHNU7HN.js.map
117
77
  - dist/contribute.json
118
- - dist/d09537c705fb0878eb63.svg
119
- - dist/d6df0017c0241dfe86ff.svg
120
- - dist/d9c199b3e3e469cc5713.svg
121
- - dist/da1f21c60c7217745dd8.svg
122
78
  - dist/docs/README.md
123
79
  - dist/docs/_navbar.md
124
80
  - dist/docs/_sidebar.md
@@ -129,7 +85,7 @@ files:
129
85
  - dist/docs/case-studies.md
130
86
  - dist/docs/css/style-overrides.css
131
87
  - dist/docs/css/vue_v4.12.2.min.css
132
- - dist/docs/gitpod.md
88
+ - dist/docs/css/vue_v4.13.1.min.css
133
89
  - dist/docs/guide-android-profiling.md
134
90
  - dist/docs/guide-filtering-call-trees.md
135
91
  - dist/docs/guide-getting-started.md
@@ -229,10 +185,9 @@ files:
229
185
  - dist/docs/images/ui-tour-timeline.png
230
186
  - dist/docs/index.html
231
187
  - dist/docs/ipc-messages.md
232
- - dist/docs/js/docsify_v4.12.2+.min.js
233
- - dist/docs/js/ga_v4.12.2.min.js
188
+ - dist/docs/js/docsify_v4.13.1+.min.js
234
189
  - dist/docs/js/init.js
235
- - dist/docs/js/search_v4.12.2.min.js
190
+ - dist/docs/js/search_v4.13.1+.min.js
236
191
  - dist/docs/memory-allocations.md
237
192
  - dist/docs/videos-call-tree-1.md
238
193
  - dist/docs/videos-call-tree-2.md
@@ -241,13 +196,18 @@ files:
241
196
  - dist/docs/videos-samples-markers.md
242
197
  - dist/docs/videos-threads.md
243
198
  - dist/docs/videos.md
244
- - dist/e4ed50222911c5af9a32.svg
245
- - dist/e70722c0fe0ac3d4227b.svg
246
- - dist/f8e25c2ebeb0a0725a9e.svg
247
- - dist/favicon.png
248
- - dist/fcb532a05dd4b09c2d08.svg
249
- - dist/fd040fb5f4e7a515bb3c.svg
199
+ - dist/firefox-profiler-button-2021-05-06-ZEMGS6NI.jpg
200
+ - dist/gecko-profiler-demangle-3UYO3F2Y.js
201
+ - dist/gecko-profiler-demangle-3UYO3F2Y.js.map
202
+ - dist/gz.worker-C7QSA26N.js
203
+ - dist/index-CZ7T6DL2.css
204
+ - dist/index-CZ7T6DL2.css.map
205
+ - dist/index-P5VLDZC7.js
206
+ - dist/index-P5VLDZC7.js.map
250
207
  - dist/index.html
208
+ - dist/index_bg-FTIMKZRG.wasm
209
+ - dist/jszip.min-JBI6ADTT.js
210
+ - dist/jszip.min-JBI6ADTT.js.map
251
211
  - dist/locales/README.md
252
212
  - dist/locales/be/app.ftl
253
213
  - dist/locales/de/app.ftl
@@ -270,29 +230,22 @@ files:
270
230
  - dist/locales/uk/app.ftl
271
231
  - dist/locales/zh-CN/app.ftl
272
232
  - dist/locales/zh-TW/app.ftl
273
- - dist/main.6cdc9308b67c00785584.bundle.js
274
- - dist/main.6cdc9308b67c00785584.bundle.js.LICENSE.txt
275
- - dist/main.6cdc9308b67c00785584.bundle.js.map
276
- - dist/photon/118632062f4755918dac.svg
277
- - dist/photon/31fe933f3a12be1aa7f3.svg
278
- - dist/photon/49da6a2153f62ef73d17.svg
279
- - dist/photon/6bd0589a27236471fdab.svg
280
- - dist/photon/6c8063be3afa1d95c902.svg
281
- - dist/photon/76e5b29823c9fd62d90d.svg
282
- - dist/photon/8aae7b979b04407f71a4.svg
283
- - dist/photon/8dab2a6ba757bcc6e9a5.svg
284
- - dist/photon/9103e94f1d34c15d44be.svg
285
- - dist/photon/aa867391c311267af5a9.svg
233
+ - dist/perf-screenshot-2024-02-29-4YCKHIPD.png
234
+ - dist/photon/index.css
235
+ - dist/photon/index.css.map
286
236
  - dist/photon/index.html
287
- - dist/photon/main.e1d25e5ea6d5812b127b.bundle.js
288
- - dist/photon/main.e1d25e5ea6d5812b127b.bundle.js.map
237
+ - dist/photon/index.js
238
+ - dist/photon/index.js.map
239
+ - dist/res/img/favicon.png
289
240
  - dist/robots.txt
290
241
  - dist/service-worker-compat.js
242
+ - dist/simpleperf-UUIE7C7E.js
243
+ - dist/simpleperf-UUIE7C7E.js.map
244
+ - dist/spinner-DC3JCQB7.png
291
245
  - dist/sw.js
292
246
  - dist/sw.js.map
293
- - dist/workbox-e3490c72.js
294
- - dist/workbox-e3490c72.js.map
295
- - dist/zee-worker.js
247
+ - dist/workbox-1ef09536.js
248
+ - dist/workbox-1ef09536.js.map
296
249
  - ruby-bin/profile-viewer
297
250
  - ruby-bin/profile-viewer-version.rb
298
251
  homepage: https://github.com/tenderlove/profiler/tree/ruby
@@ -314,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
314
267
  - !ruby/object:Gem::Version
315
268
  version: '0'
316
269
  requirements: []
317
- rubygems_version: 3.6.2
270
+ rubygems_version: 4.1.0.dev
318
271
  specification_version: 4
319
272
  summary: Ruby Gem that packages the Mozilla Profiler
320
273
  test_files: []
@@ -1,28 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
3
- - License, v. 2.0. If a copy of the MPL was not distributed with this
4
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
5
- <svg width="12px" height="12px" viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
6
- <style>
7
- @keyframes sharing {
8
- 15%, 29% {
9
- transform: translateY(-120%) scale(.8);
10
- opacity: 0.7;
11
- }
12
- 30% {
13
- transform: initial;
14
- opacity: 0;
15
- }
16
- 40% {
17
- opacity: initial;
18
- }
19
- }
20
- .arrow {
21
- animation: 1s infinite ease-out sharing;
22
- }
23
- </style>
24
- <g transform="translate(1.000000, 0.000000)" fill="rgba(12, 12, 13, .8)" fill-rule="nonzero">
25
- <path class="arrow" d="M8.55146332,3.2205 L5.55146332,0.2205 C5.48126552,0.150583611 5.3979106,0.0952685711 5.30621332,0.05775 C5.24656653,0.037424408 5.1845621,0.0248218816 5.12171332,0.02025 C5.08875039,0.0110647866 5.05516123,0.00429682043 5.02121332,0 C4.98726542,0.00429682043 4.95367625,0.0110647866 4.92071332,0.02025 C4.85786455,0.0248218816 4.79586012,0.037424408 4.73621332,0.05775 C4.64360119,0.0964284695 4.55969418,0.153301612 4.48946332,0.225 L1.48946332,3.225 C1.22507669,3.52241284 1.23899562,3.97453744 1.5211763,4.25512388 C1.80335699,4.53571032 2.25555318,4.54706743 2.55146332,4.281 L4.27121332,2.56125 L4.27121332,8.25 C4.27121332,8.66421356 4.60699976,9 5.02121332,9 C5.43542689,9 5.77121332,8.66421356 5.77121332,8.25 L5.77121332,2.56125 L7.49096332,4.281 C7.78524749,4.56522916 8.25302691,4.56116428 8.54232726,4.27186393 C8.8316276,3.98256358 8.83569248,3.51478417 8.55146332,3.2205 Z"></path>
26
- <path class="base" d="M9.25,6.75 C8.83578644,6.75 8.5,7.08578644 8.5,7.5 L8.5,9.75 C8.5,10.1642136 8.16421356,10.5 7.75,10.5 L2.25,10.5 C1.83578644,10.5 1.5,10.1642136 1.5,9.75 L1.5,7.5 C1.5,7.08578644 1.16421356,6.75 0.75,6.75 C0.335786438,6.75 0,7.08578644 0,7.5 L0,9.75 C0,10.9926407 1.00735931,12 2.25,12 L7.75,12 C8.99264069,12 10,10.9926407 10,9.75 L10,7.5 C10,7.08578644 9.66421356,6.75 9.25,6.75 Z"></path>
27
- </g>
28
- </svg>
@@ -1,8 +0,0 @@
1
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
- - License, v. 2.0. If a copy of the MPL was not distributed with this
3
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
- <svg xmlns="http://www.w3.org/2000/svg"
5
- xmlns:xlink="http://www.w3.org/1999/xlink"
6
- width="48" height="48" viewBox="0 0 24 24">
7
- <polyline points="4 0 6 0 18 12 6 24 4 24 16 12" stroke="white"/>
8
- </svg>
@@ -1,14 +0,0 @@
1
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
- - License, v. 2.0. If a copy of the MPL was not distributed with this
3
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
- <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
5
- <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
6
- <circle fill="#000000" cx="8" cy="2" r="2"></circle>
7
- <circle fill="#000000" cx="11" cy="8" r="2"></circle>
8
- <circle fill="#000000" cx="14" cy="14" r="2"></circle>
9
- <path d="M6.5,14.5 L1.5,9.5" stroke="#000000" stroke-width="1.5" stroke-linecap="round"></path>
10
- <path d="M1.5,14.5 L6.5,9.5" stroke="#000000" stroke-width="1.5" stroke-linecap="round"></path>
11
- <path d="M10.5,6.5 L8.5,3.5" stroke="#000000" stroke-linecap="square"></path>
12
- <path d="M13.5,12.5 L11.5,9.5" stroke="#000000" stroke-linecap="square"></path>
13
- </g>
14
- </svg>
@@ -1,8 +0,0 @@
1
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
- - License, v. 2.0. If a copy of the MPL was not distributed with this
3
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
- <svg width="12px" height="12px" version="1.1" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg">
5
- <rect x="5" y="5" width="2" height="4" ry="1" fill="#0c0c0d" fill-opacity=".8"/>
6
- <rect x="5" y="3" width="2" height="1" ry="0.5" fill="#0c0c0d" fill-opacity=".8"/>
7
- <ellipse cx="6" cy="6" rx="5.25" ry="5.25" fill="none" stroke="#0c0c0d" stroke-opacity=".8" stroke-width="1.5"/>
8
- </svg>
@@ -1,4 +0,0 @@
1
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
- - License, v. 2.0. If a copy of the MPL was not distributed with this
3
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#000" d="M14.742 12.106L9.789 2.2a2 2 0 0 0-3.578 0l-4.953 9.91A2 2 0 0 0 3.047 15h9.905a2 2 0 0 0 1.79-2.894zM7 5a1 1 0 0 1 2 0v4a1 1 0 0 1-2 0zm1 8.25A1.25 1.25 0 1 1 9.25 12 1.25 1.25 0 0 1 8 13.25z"></path></svg>
@@ -1,9 +0,0 @@
1
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
- - License, v. 2.0. If a copy of the MPL was not distributed with this
3
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
- <svg width="16px" height="16px" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
5
- <g transform="matrix(.96081 0 0 1.063 -.19979 -.084155)" fill="#0c0c0d" aria-label="{}">
6
- <path d="m6.4527 13.984v1.1468h-0.49374q-1.9829 0-2.6598-0.5893-0.66894-0.5893-0.66894-2.3492v-1.9033q0-1.2025-0.43003-1.6644-0.43003-0.46189-1.5609-0.46189h-0.48578v-1.1388h0.48578q1.1388 0 1.5609-0.45392 0.43003-0.46189 0.43003-1.6485v-1.9113q0-1.7599 0.66894-2.3413 0.6769-0.5893 2.6598-0.5893h0.49374v1.1388h-0.54152q-1.1229 0-1.4653 0.3504-0.34243 0.3504-0.34243 1.4733v1.975q0 1.2503-0.36632 1.8157-0.35836 0.56541-1.2343 0.7645 0.88395 0.21502 1.2423 0.78043 0.35836 0.56541 0.35836 1.8077v1.975q0 1.1229 0.34243 1.4733 0.34243 0.3504 1.4653 0.3504z"/>
7
- <path d="m10.538 13.984h0.55745q1.1149 0 1.4494-0.34243 0.34243-0.34243 0.34243-1.4812v-1.975q0-1.2423 0.35836-1.8077 0.35836-0.56541 1.2423-0.78043-0.88395-0.19909-1.2423-0.7645-0.35836-0.56541-0.35836-1.8157v-1.975q0-1.1308-0.34243-1.4733-0.33447-0.3504-1.4494-0.3504h-0.55745v-1.1388h0.5017q1.9829 0 2.6439 0.5893 0.66894 0.58134 0.66894 2.3413v1.9113q0 1.1866 0.43003 1.6485 0.43003 0.45392 1.5609 0.45392h0.49374v1.1388h-0.49374q-1.1308 0-1.5609 0.46189-0.43003 0.46189-0.43003 1.6644v1.9033q0 1.7599-0.66894 2.3492-0.66097 0.5893-2.6439 0.5893h-0.5017z"/>
8
- </g>
9
- </svg>
@@ -1,2 +0,0 @@
1
- "use strict";(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[136],{136:(s,e,t)=>{t.r(e),t.d(e,{AssemblyViewEditor:()=>L});var n=t(4589),i=t(1638),o=t(5874),r=t(3720),d=t(3276),a=t.n(d),c=t(7837),l=t(8811);const f=i.Pe.define(),u=i.sU.define({create:()=>[],update(s,e){let t=s;for(const s of e.effects)s.is(f)&&(t=s.value);return t}}),h=(0,n.cU)({class:"cm-instruction-address-gutter",lineMarker(s,e){const t=s.state.doc.lineAt(e.from).number,n=s.state.field(u).lineToAddress(t);return null!==n?new l.ES(`0x${n.toString(16)}`):null},lineMarkerChange:s=>s.transactions.some((s=>s.effects.some((s=>s.is(f)))))});function m(s){return s.map((s=>s.decodedString)).join("\n")}class p{constructor(s){this._instructionAddresses=void 0,this._instructionAddresses=s}addressToLine(s){const e=(0,c.lV)(this._instructionAddresses,s);return 0===e?null:e-1+1}lineToAddress(s){if(s<1||s>this._instructionAddresses.length)return null;const e=s-1;return this._instructionAddresses[e]}}function _(s){return s.map((s=>s.address))}function T(s,e){const t=new Map;for(const[n,i]of s.totalAddressHits){const s=e.addressToLine(n);if(null!==s){const e=t.get(s)??0;t.set(s,e+i)}}const n=new Map;for(const[t,i]of s.selfAddressHits){const s=e.addressToLine(t);if(null!==s){const e=n.get(s)??0;n.set(s,e+i)}}return{totalLineHits:t,selfLineHits:n}}class L{constructor(s,e,t,d){this._view=void 0,this._addressToLineMap=void 0,this._addressTimings=void 0,this._addressToLineMap=new p(_(s)),this._addressTimings=t;let a=i.$t.create({doc:m(s),extensions:[l.Lf,u,h,(0,o.y9)(r.sS),i.$t.readOnly.of(!0),n.Lz.editable.of(!1)]});const c=T(this._addressTimings,this._addressToLineMap);a=a.update({effects:[f.of(this._addressToLineMap),l.IU.of(c)]}).state,this._view=new n.Lz({state:a,parent:d})}setContents(s){this._addressToLineMap=new p(_(s));const e=T(this._addressTimings,this._addressToLineMap),t=m(s);this._view.dispatch(this._view.state.update({changes:{insert:t,from:0,to:this._view.state.doc.length}})),this._view.dispatch({effects:[f.of(this._addressToLineMap),l.IU.of(e)]})}setTimings(s){this._addressTimings=s;const e=T(this._addressTimings,this._addressToLineMap);this._view.dispatch({effects:l.IU.of(e)})}scrollToLine(s){s=a()(s,1,this._view.state.doc.lines);const e=this._view.state.doc.line(s).from;this._view.dispatch({effects:n.Lz.scrollIntoView(e,{y:"start",yMargin:0})}),this._view.coordsAtPos(0)}scrollToAddress(s){const e=this._addressToLineMap.addressToLine(s);null!==e&&this.scrollToLine(e)}scrollToAddressWithSpaceOnTop(s,e){const t=this._addressToLineMap.addressToLine(s);null!==t&&this.scrollToLine(t-e)}}},8811:(s,e,t)=>{t.d(e,{ES:()=>h,IU:()=>a,Lf:()=>_});var n=t(4589),i=t(1638),o=t(6046);const r=new class extends n.wJ{constructor(...s){super(...s),this.elementClass="cm-nonZeroLine"}},d=n.NZ.line({class:"cm-nonZeroLine"}),a=i.Pe.define(),c=i.sU.define({create:()=>o.tB,update(s,e){let t=s;for(const s of e.effects)s.is(a)&&(t=s.value);return t}});function l(s){const e=s.field(c),t=new Set;for(const s of e.totalLineHits.keys())t.add(s);for(const s of e.selfLineHits.keys())t.add(s);const n=s.doc.lines,i=[...t].filter((s=>s>=1&&s<=n)).map((e=>s.doc.line(e).from));return i.sort(((s,e)=>s-e)),i}const f=n.EV.compute(["doc",c],(s=>{const e=l(s);return i.om.of(e.map((s=>r.range(s))))})),u=n.Lz.decorations.compute(["doc",c],(s=>{const e=l(s);return i.om.of(e.map((s=>d.range(s))))}));class h extends n.wJ{constructor(s){super(),this._s=void 0,this._s=s}toDOM(){return document.createTextNode(this._s)}}const m=(0,n.cU)({class:"cm-total-timings-gutter",lineMarker(s,e){const t=s.state.doc.lineAt(e.from).number,n=s.state.field(c).totalLineHits.get(t);return void 0!==n?new h(n):null},lineMarkerChange:s=>s.transactions.some((s=>s.effects.some((s=>s.is(a)))))}),p=(0,n.cU)({class:"cm-self-timings-gutter",lineMarker(s,e){const t=s.state.doc.lineAt(e.from).number,n=s.state.field(c).selfLineHits.get(t);return void 0!==n?new h(n):null},lineMarkerChange:s=>s.transactions.some((s=>s.effects.some((s=>s.is(a)))))}),_=[c,m,p,f,u]}}]);
2
- //# sourceMappingURL=136.ad4176dc2a8e5cf33ef3.bundle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"136.ad4176dc2a8e5cf33ef3.bundle.js","mappings":"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","sources":["webpack:///./src/components/shared/AssemblyView-codemirror.js","webpack:///./src/utils/codemirror-shared.js"],"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// @flow\n\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 { EditorState, StateField, StateEffect } 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 NativeSymbolInfo,\n DecodedInstruction,\n} from 'firefox-profiler/types';\n\nimport { bisectionRight } from 'firefox-profiler/utils/bisect';\nimport {\n timingsExtension,\n updateTimingsEffect,\n StringMarker,\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 \"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 [];\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) {\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();\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();\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\n // Create a CodeMirror editor and add it as a child element of domParent.\n constructor(\n initialAssemblyCode: DecodedInstruction[],\n nativeSymbol: NativeSymbolInfo,\n addressTimings: AddressTimings,\n domParent: Element\n ) {\n this._addressToLineMap = new AddressToLineMap(\n getInstructionAddresses(initialAssemblyCode)\n );\n this._addressTimings = addressTimings;\n let state = EditorState.create({\n doc: instructionsToText(initialAssemblyCode),\n extensions: [\n timingsExtension,\n addressToLineMapField,\n instructionAddressGutter,\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 // 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 ],\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","/* 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// @flow\n\nimport {\n EditorView,\n Decoration,\n GutterMarker,\n gutter,\n gutterLineClass,\n} from '@codemirror/view';\nimport {\n EditorState,\n StateField,\n StateEffect,\n RangeSet,\n} from '@codemirror/state';\n\nimport type { LineTimings } from 'firefox-profiler/types';\n\nimport { emptyLineTimings } from 'firefox-profiler/profile-logic/line-timings';\n\n// This gutter marker applies the \"cm-nonZeroLine\" class to gutter elements.\nconst nonZeroLineGutterMarker = new (class extends GutterMarker {\n elementClass = 'cm-nonZeroLine';\n})();\n\n// This \"decoration\" applies the \"cm-nonZeroLine\" class to the line of assembly\n// code in the main editor contents (not the gutter).\nconst nonZeroLineDecoration = Decoration.line({ class: 'cm-nonZeroLine' });\n\n// An \"effect\" is like a redux action. This effect is used to replace the value\n// of the timingsField state field.\nexport const updateTimingsEffect = StateEffect.define<LineTimings>();\n\n// A \"state field\" for the timings.\nconst timingsField = StateField.define<LineTimings>({\n create() {\n return emptyLineTimings;\n },\n update(timings, transaction) {\n // This is like a reducer. Find an updateTimingsEffect in the transaction\n // and set this field to the timings in it.\n let newTimings = timings;\n for (const effect of transaction.effects) {\n if (effect.is(updateTimingsEffect)) {\n newTimings = effect.value;\n }\n }\n return newTimings;\n },\n});\n\n// Finds all lines with non-zero line timings, for the highlight line.\n// The line numbers are then converted into \"positions\", i.e. character offsets\n// in the document, for the start of the line.\n// Then they are sorted, because our caller wants to have a sorted list.\nfunction getSortedStartPositionsOfNonZeroLines(state: EditorState): number[] {\n const timings = state.field(timingsField);\n const nonZeroLines = new Set();\n for (const lineNumber of timings.totalLineHits.keys()) {\n nonZeroLines.add(lineNumber);\n }\n for (const lineNumber of timings.selfLineHits.keys()) {\n nonZeroLines.add(lineNumber);\n }\n const lineCount = state.doc.lines;\n const positions = [...nonZeroLines]\n .filter((l) => l >= 1 && l <= lineCount)\n .map((lineNumber) => state.doc.line(lineNumber).from);\n positions.sort((a, b) => a - b);\n return positions;\n}\n\n// This is an \"extension\" which applies the \"cm-nonZeroLine\" class to all gutter\n// elements for lines with non-zero timings. It is like a piece of derived state;\n// it needs to be recomputed whenever one of the input states change. The input\n// states are the editor contents (\"doc\") and the value of the timings field.\n// The editor contents are relevant because the output is expressed in terms of\n// positions, i.e. character offsets from the document start, and those positions\n// need to be updated if the amount of text in a line changes. This happens when\n// we replace the file placeholder content with the actual file content.\nconst nonZeroLineGutterHighlighter = gutterLineClass.compute(\n ['doc', timingsField],\n (state) => {\n const positions = getSortedStartPositionsOfNonZeroLines(state);\n return RangeSet.of(positions.map((p) => nonZeroLineGutterMarker.range(p)));\n }\n);\n\n// Same as the previous extension, but this one is for the main editor. There\n// doesn't seem to be a way to set a class for the entire line, i.e. both the\n// gutter elements and the main editor elements of that line.\nconst nonZeroLineDecorationHighlighter = EditorView.decorations.compute(\n ['doc', timingsField],\n (state) => {\n const positions = getSortedStartPositionsOfNonZeroLines(state);\n return RangeSet.of(positions.map((p) => nonZeroLineDecoration.range(p)));\n }\n);\n\n// This is a \"gutter marker\" which renders just a string and nothing else.\n// It is used for the AddressTimings annotations, i.e. for the numbers in the\n// gutter.\nexport class StringMarker extends GutterMarker {\n _s: string;\n\n constructor(s: string) {\n super();\n this._s = s;\n }\n\n toDOM() {\n return document.createTextNode(this._s);\n }\n}\n\n// The \"extension\" which manages the elements in the gutter for the \"total\"\n// column.\nconst totalTimingsGutter = gutter({\n class: 'cm-total-timings-gutter',\n lineMarker(view, line) {\n // Return a gutter marker for this line, or null.\n const lineNumber = view.state.doc.lineAt(line.from).number;\n const timings = view.state.field(timingsField);\n const totalTime = timings.totalLineHits.get(lineNumber);\n return totalTime !== undefined ? new StringMarker(totalTime) : null;\n },\n lineMarkerChange(update) {\n // Return true if the update affects the total timings in the gutter.\n return update.transactions.some((t) =>\n t.effects.some((e) => e.is(updateTimingsEffect))\n );\n },\n});\n\n// The \"extension\" which manages the elements in the gutter for the \"self\"\n// column.\nconst selfTimingsGutter = gutter({\n class: 'cm-self-timings-gutter',\n lineMarker(view, line) {\n // Return a gutter marker for this line, or null.\n const lineNumber = view.state.doc.lineAt(line.from).number;\n const timings = view.state.field(timingsField);\n const selfTime = timings.selfLineHits.get(lineNumber);\n return selfTime !== undefined ? new StringMarker(selfTime) : null;\n },\n lineMarkerChange(update) {\n // Return true if the update affects the self timings in the gutter.\n return update.transactions.some((t) =>\n t.effects.some((e) => e.is(updateTimingsEffect))\n );\n },\n});\n\n// All extensions which have to do with timings, grouped into one extension.\nexport const timingsExtension = [\n timingsField,\n totalTimingsGutter,\n selfTimingsGutter,\n nonZeroLineGutterHighlighter,\n nonZeroLineDecorationHighlighter,\n];\n"],"names":["updateAddressToLineMapEffect","StateEffect","define","addressToLineMapField","StateField","create","update","instructionAddresses","transaction","newSortedAddresses","effect","effects","is","value","instructionAddressGutter","gutter","class","lineMarker","view","line","lineNumber","state","doc","lineAt","from","number","address","field","lineToAddress","StringMarker","toString","lineMarkerChange","transactions","some","t","e","instructionsToText","assemblyCode","map","instr","decodedString","join","AddressToLineMap","constructor","_instructionAddresses","this","addressToLine","insertionIndex","bisectionRight","length","elementIndex","getInstructionAddresses","addressTimingsToLineTimings","addressTimings","totalLineHits","Map","hitCount","totalAddressHits","currentHitCount","get","set","selfLineHits","selfAddressHits","AssemblyViewEditor","initialAssemblyCode","nativeSymbol","domParent","_view","_addressToLineMap","_addressTimings","EditorState","extensions","timingsExtension","syntaxHighlighting","classHighlighter","readOnly","of","EditorView","editable","lineTimings","updateTimingsEffect","parent","setContents","text","dispatch","changes","insert","to","setTimings","scrollToLine","clamp","lines","pos","scrollIntoView","y","yMargin","coordsAtPos","scrollToAddress","scrollToAddressWithSpaceOnTop","topSpaceLines","nonZeroLineGutterMarker","GutterMarker","args","elementClass","nonZeroLineDecoration","Decoration","timingsField","emptyLineTimings","timings","newTimings","getSortedStartPositionsOfNonZeroLines","nonZeroLines","Set","keys","add","lineCount","positions","filter","l","sort","a","b","nonZeroLineGutterHighlighter","gutterLineClass","compute","RangeSet","p","range","nonZeroLineDecorationHighlighter","decorations","s","super","_s","toDOM","document","createTextNode","totalTimingsGutter","totalTime","undefined","selfTimingsGutter","selfTime"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[171],{3171:(e,t,s)=>{s.r(t),s.d(t,{SourceViewEditor:()=>w});var n=s(4589),i=s(1638),o=s(5874),c=s(3720),r=s(5336),a=s(3032),d=s(7514),l=s(3276),f=s.n(l),h=s(8811);const u=new i.xx;function m(e){return null===e?[]:e.endsWith(".rs")?(0,a.T)():e.endsWith(".js")||e.endsWith(".jsm")||e.endsWith(".jsx")||e.endsWith(".mjs")||e.endsWith(".ts")||e.endsWith(".tsx")?(0,d.Q2)():e.endsWith(".c")||e.endsWith(".cc")||e.endsWith(".cpp")||e.endsWith(".cxx")||e.endsWith(".h")||e.endsWith(".hpp")||e.endsWith(".m")||e.endsWith(".mm")?(0,r.I)():[]}const p=[n.Lz.editable.of(!1),n.Lz.contentAttributes.of({tabindex:"0"})];class w{constructor(e,t,s,r){this._view=void 0;let a=i.$t.create({doc:e,extensions:[h.Lf,(0,n.$K)(),u.of(m(t)),(0,o.y9)(c.sS),p]});a=a.update({effects:h.IU.of(s)}).state,this._view=new n.Lz({state:a,parent:r})}updateLanguageForFilePath(e){this._view.dispatch({effects:u.reconfigure(m(e))})}setContents(e){this._view.dispatch(this._view.state.update({changes:{insert:e,from:0,to:this._view.state.doc.length}}))}setTimings(e){this._view.dispatch({effects:h.IU.of(e)})}scrollToLine(e){e=f()(e,1,this._view.state.doc.lines);const t=this._view.state.doc.line(e).from;this._view.dispatch({effects:n.Lz.scrollIntoView(t,{y:"start",yMargin:0})}),this._view.coordsAtPos(0)}}},8811:(e,t,s)=>{s.d(t,{ES:()=>u,IU:()=>a,Lf:()=>w});var n=s(4589),i=s(1638),o=s(6046);const c=new class extends n.wJ{constructor(...e){super(...e),this.elementClass="cm-nonZeroLine"}},r=n.NZ.line({class:"cm-nonZeroLine"}),a=i.Pe.define(),d=i.sU.define({create:()=>o.tB,update(e,t){let s=e;for(const e of t.effects)e.is(a)&&(s=e.value);return s}});function l(e){const t=e.field(d),s=new Set;for(const e of t.totalLineHits.keys())s.add(e);for(const e of t.selfLineHits.keys())s.add(e);const n=e.doc.lines,i=[...s].filter((e=>e>=1&&e<=n)).map((t=>e.doc.line(t).from));return i.sort(((e,t)=>e-t)),i}const f=n.EV.compute(["doc",d],(e=>{const t=l(e);return i.om.of(t.map((e=>c.range(e))))})),h=n.Lz.decorations.compute(["doc",d],(e=>{const t=l(e);return i.om.of(t.map((e=>r.range(e))))}));class u extends n.wJ{constructor(e){super(),this._s=void 0,this._s=e}toDOM(){return document.createTextNode(this._s)}}const m=(0,n.cU)({class:"cm-total-timings-gutter",lineMarker(e,t){const s=e.state.doc.lineAt(t.from).number,n=e.state.field(d).totalLineHits.get(s);return void 0!==n?new u(n):null},lineMarkerChange:e=>e.transactions.some((e=>e.effects.some((e=>e.is(a)))))}),p=(0,n.cU)({class:"cm-self-timings-gutter",lineMarker(e,t){const s=e.state.doc.lineAt(t.from).number,n=e.state.field(d).selfLineHits.get(s);return void 0!==n?new u(n):null},lineMarkerChange:e=>e.transactions.some((e=>e.effects.some((e=>e.is(a)))))}),w=[d,m,p,f,h]}}]);
2
- //# sourceMappingURL=171.37d1e1824587d8df0ae2.bundle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"171.37d1e1824587d8df0ae2.bundle.js","mappings":"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","sources":["webpack:///./src/components/shared/SourceView-codemirror.js","webpack:///./src/utils/codemirror-shared.js"],"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// @flow\n\n/**\n * This module wraps all the interaction with the CodeMirror API into a\n * SourceViewEditor 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 source code with syntax highlighting.\n * - Display a gutter with:\n * - \"Total\" timings for each line\n * - \"Self\" timings for each line\n * - The line number for each line\n * - Highlight source 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, lineNumbers } from '@codemirror/view';\nimport { EditorState, Compartment } from '@codemirror/state';\nimport { syntaxHighlighting } from '@codemirror/language';\nimport { classHighlighter } from '@lezer/highlight';\nimport { cpp } from '@codemirror/lang-cpp';\nimport { rust } from '@codemirror/lang-rust';\nimport { javascript } from '@codemirror/lang-javascript';\nimport clamp from 'clamp';\n\nimport type { LineTimings } from 'firefox-profiler/types';\nimport {\n timingsExtension,\n updateTimingsEffect,\n} from 'firefox-profiler/utils/codemirror-shared';\n\n// This \"compartment\" allows us to swap the syntax highlighting language when\n// the file path changes.\nconst languageConf = new Compartment();\n\n// Detect the right language based on the file extension.\nfunction _languageExtForPath(\n path: string | null\n): any /* LanguageSupport | [] */ {\n if (path === null) {\n return [];\n }\n if (path.endsWith('.rs')) {\n return rust();\n }\n if (\n path.endsWith('.js') ||\n path.endsWith('.jsm') ||\n path.endsWith('.jsx') ||\n path.endsWith('.mjs') ||\n path.endsWith('.ts') ||\n path.endsWith('.tsx')\n ) {\n return javascript();\n }\n if (\n path.endsWith('.c') ||\n path.endsWith('.cc') ||\n path.endsWith('.cpp') ||\n path.endsWith('.cxx') ||\n path.endsWith('.h') ||\n path.endsWith('.hpp') ||\n path.endsWith('.m') ||\n path.endsWith('.mm')\n ) {\n return cpp();\n }\n return [];\n}\n\n// Adjustments to make a CodeMirror editor work as a non-editable code viewer.\nconst codeViewerExtension = [\n // Make the editor non-editable.\n EditorView.editable.of(false),\n // Allow tabbing to the view (to an element *inside* the scroller so that the\n // up / down keys trigger scrolling), and take focus on mousedown.\n EditorView.contentAttributes.of({ tabindex: '0' }),\n];\n\nexport class SourceViewEditor {\n _view: EditorView;\n\n // Create a CodeMirror editor and add it as a child element of domParent.\n constructor(\n initialText: string,\n path: string,\n timings: LineTimings,\n domParent: Element\n ) {\n let state = EditorState.create({\n doc: initialText,\n extensions: [\n timingsExtension,\n lineNumbers(),\n languageConf.of(_languageExtForPath(path)),\n syntaxHighlighting(classHighlighter),\n codeViewerExtension,\n ],\n });\n state = state.update({\n effects: updateTimingsEffect.of(timings),\n }).state;\n this._view = new EditorView({\n state,\n parent: domParent,\n });\n }\n\n updateLanguageForFilePath(path: string | null) {\n this._view.dispatch({\n effects: languageConf.reconfigure(_languageExtForPath(path)),\n });\n }\n\n setContents(text: string) {\n // The CodeMirror way of replacing the entire contents is to insert new text\n // and overwrite the full range of existing text.\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 }\n\n setTimings(timings: LineTimings) {\n // Update the value of the timings field by dispatching an updateTimingsEffect.\n this._view.dispatch({\n effects: updateTimingsEffect.of(timings),\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","/* 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// @flow\n\nimport {\n EditorView,\n Decoration,\n GutterMarker,\n gutter,\n gutterLineClass,\n} from '@codemirror/view';\nimport {\n EditorState,\n StateField,\n StateEffect,\n RangeSet,\n} from '@codemirror/state';\n\nimport type { LineTimings } from 'firefox-profiler/types';\n\nimport { emptyLineTimings } from 'firefox-profiler/profile-logic/line-timings';\n\n// This gutter marker applies the \"cm-nonZeroLine\" class to gutter elements.\nconst nonZeroLineGutterMarker = new (class extends GutterMarker {\n elementClass = 'cm-nonZeroLine';\n})();\n\n// This \"decoration\" applies the \"cm-nonZeroLine\" class to the line of assembly\n// code in the main editor contents (not the gutter).\nconst nonZeroLineDecoration = Decoration.line({ class: 'cm-nonZeroLine' });\n\n// An \"effect\" is like a redux action. This effect is used to replace the value\n// of the timingsField state field.\nexport const updateTimingsEffect = StateEffect.define<LineTimings>();\n\n// A \"state field\" for the timings.\nconst timingsField = StateField.define<LineTimings>({\n create() {\n return emptyLineTimings;\n },\n update(timings, transaction) {\n // This is like a reducer. Find an updateTimingsEffect in the transaction\n // and set this field to the timings in it.\n let newTimings = timings;\n for (const effect of transaction.effects) {\n if (effect.is(updateTimingsEffect)) {\n newTimings = effect.value;\n }\n }\n return newTimings;\n },\n});\n\n// Finds all lines with non-zero line timings, for the highlight line.\n// The line numbers are then converted into \"positions\", i.e. character offsets\n// in the document, for the start of the line.\n// Then they are sorted, because our caller wants to have a sorted list.\nfunction getSortedStartPositionsOfNonZeroLines(state: EditorState): number[] {\n const timings = state.field(timingsField);\n const nonZeroLines = new Set();\n for (const lineNumber of timings.totalLineHits.keys()) {\n nonZeroLines.add(lineNumber);\n }\n for (const lineNumber of timings.selfLineHits.keys()) {\n nonZeroLines.add(lineNumber);\n }\n const lineCount = state.doc.lines;\n const positions = [...nonZeroLines]\n .filter((l) => l >= 1 && l <= lineCount)\n .map((lineNumber) => state.doc.line(lineNumber).from);\n positions.sort((a, b) => a - b);\n return positions;\n}\n\n// This is an \"extension\" which applies the \"cm-nonZeroLine\" class to all gutter\n// elements for lines with non-zero timings. It is like a piece of derived state;\n// it needs to be recomputed whenever one of the input states change. The input\n// states are the editor contents (\"doc\") and the value of the timings field.\n// The editor contents are relevant because the output is expressed in terms of\n// positions, i.e. character offsets from the document start, and those positions\n// need to be updated if the amount of text in a line changes. This happens when\n// we replace the file placeholder content with the actual file content.\nconst nonZeroLineGutterHighlighter = gutterLineClass.compute(\n ['doc', timingsField],\n (state) => {\n const positions = getSortedStartPositionsOfNonZeroLines(state);\n return RangeSet.of(positions.map((p) => nonZeroLineGutterMarker.range(p)));\n }\n);\n\n// Same as the previous extension, but this one is for the main editor. There\n// doesn't seem to be a way to set a class for the entire line, i.e. both the\n// gutter elements and the main editor elements of that line.\nconst nonZeroLineDecorationHighlighter = EditorView.decorations.compute(\n ['doc', timingsField],\n (state) => {\n const positions = getSortedStartPositionsOfNonZeroLines(state);\n return RangeSet.of(positions.map((p) => nonZeroLineDecoration.range(p)));\n }\n);\n\n// This is a \"gutter marker\" which renders just a string and nothing else.\n// It is used for the AddressTimings annotations, i.e. for the numbers in the\n// gutter.\nexport class StringMarker extends GutterMarker {\n _s: string;\n\n constructor(s: string) {\n super();\n this._s = s;\n }\n\n toDOM() {\n return document.createTextNode(this._s);\n }\n}\n\n// The \"extension\" which manages the elements in the gutter for the \"total\"\n// column.\nconst totalTimingsGutter = gutter({\n class: 'cm-total-timings-gutter',\n lineMarker(view, line) {\n // Return a gutter marker for this line, or null.\n const lineNumber = view.state.doc.lineAt(line.from).number;\n const timings = view.state.field(timingsField);\n const totalTime = timings.totalLineHits.get(lineNumber);\n return totalTime !== undefined ? new StringMarker(totalTime) : null;\n },\n lineMarkerChange(update) {\n // Return true if the update affects the total timings in the gutter.\n return update.transactions.some((t) =>\n t.effects.some((e) => e.is(updateTimingsEffect))\n );\n },\n});\n\n// The \"extension\" which manages the elements in the gutter for the \"self\"\n// column.\nconst selfTimingsGutter = gutter({\n class: 'cm-self-timings-gutter',\n lineMarker(view, line) {\n // Return a gutter marker for this line, or null.\n const lineNumber = view.state.doc.lineAt(line.from).number;\n const timings = view.state.field(timingsField);\n const selfTime = timings.selfLineHits.get(lineNumber);\n return selfTime !== undefined ? new StringMarker(selfTime) : null;\n },\n lineMarkerChange(update) {\n // Return true if the update affects the self timings in the gutter.\n return update.transactions.some((t) =>\n t.effects.some((e) => e.is(updateTimingsEffect))\n );\n },\n});\n\n// All extensions which have to do with timings, grouped into one extension.\nexport const timingsExtension = [\n timingsField,\n totalTimingsGutter,\n selfTimingsGutter,\n nonZeroLineGutterHighlighter,\n nonZeroLineDecorationHighlighter,\n];\n"],"names":["languageConf","Compartment","_languageExtForPath","path","endsWith","rust","javascript","cpp","codeViewerExtension","EditorView","editable","of","contentAttributes","tabindex","SourceViewEditor","constructor","initialText","timings","domParent","_view","state","EditorState","create","doc","extensions","timingsExtension","lineNumbers","syntaxHighlighting","classHighlighter","update","effects","updateTimingsEffect","this","parent","updateLanguageForFilePath","dispatch","reconfigure","setContents","text","changes","insert","from","to","length","setTimings","scrollToLine","lineNumber","clamp","lines","pos","line","scrollIntoView","y","yMargin","coordsAtPos","nonZeroLineGutterMarker","GutterMarker","args","elementClass","nonZeroLineDecoration","Decoration","class","StateEffect","define","timingsField","StateField","emptyLineTimings","transaction","newTimings","effect","is","value","getSortedStartPositionsOfNonZeroLines","field","nonZeroLines","Set","totalLineHits","keys","add","selfLineHits","lineCount","positions","filter","l","map","sort","a","b","nonZeroLineGutterHighlighter","gutterLineClass","compute","RangeSet","p","range","nonZeroLineDecorationHighlighter","decorations","StringMarker","s","super","_s","toDOM","document","createTextNode","totalTimingsGutter","gutter","lineMarker","view","lineAt","number","totalTime","get","undefined","lineMarkerChange","transactions","some","t","e","selfTimingsGutter","selfTime"],"sourceRoot":""}
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
3
- - License, v. 2.0. If a copy of the MPL was not distributed with this
4
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
5
- <svg width="12px" height="12px" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
6
- <path d="m1 2v8.0124c0 0.50319 0.50439 0.98758 0.98758 0.98758h7.9752c0.52853 0 1.0373-0.47685 1.0373-0.98758v-8c0-0.53457-0.48433-1.0124-0.98758-1.0124h-8.0248c-0.54378 0-0.98758 0.48961-0.98758 1zm9 8h-8v-8h8z" fill="#0c0c0d" fill-opacity=".8"/>
7
- <path d="m4 7h1v1c0 1 0.5 1 1 1s1 0 1-1v-1h1c1 0 1-0.5 1-1s0-1-1-1h-1v-1c0-1-0.5-1-1-1s-1 0-1 1v1h-1c-1 0-1 0.5-1 1s0 1 1 1z" fill="#0c0c0d" fill-opacity=".8"/>
8
- </svg>
@@ -1,6 +0,0 @@
1
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
- - License, v. 2.0. If a copy of the MPL was not distributed with this
3
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
- <svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
5
- <path fill-rule="evenodd" clip-rule="evenodd" d="M12.5 3.75a1.75 1.75 0 0 0-1.75 1.75v2.375a.875.875 0 0 1-.875.875H6.5a.75.75 0 0 0-.75.75V11h1.5a3.5 3.5 0 1 1 0 7h-1.5v1.5c0 .414.336.75.75.75h12a.75.75 0 0 0 .75-.75v-10a.75.75 0 0 0-.75-.75h-3.375a.875.875 0 0 1-.875-.875V5.5a1.75 1.75 0 0 0-1.75-1.75zM9 5.5a3.5 3.5 0 1 1 7 0V7h2.5A2.5 2.5 0 0 1 21 9.5v10a2.5 2.5 0 0 1-2.5 2.5h-12A2.5 2.5 0 0 1 4 19.5v-2.375c0-.483.392-.875.875-.875H7.25a1.75 1.75 0 1 0 0-3.5H4.875A.875.875 0 0 1 4 11.875V9.5A2.5 2.5 0 0 1 6.5 7H9V5.5z" fill="#000" />
6
- </svg>
@@ -1,8 +0,0 @@
1
- <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
- - License, v. 2.0. If a copy of the MPL was not distributed with this
3
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
- <svg xmlns="http://www.w3.org/2000/svg"
5
- xmlns:xlink="http://www.w3.org/1999/xlink"
6
- width="48" height="48" viewBox="0 0 24 24">
7
- <polyline points="4 0 6 0 18 12 6 24 4 24 16 12" stroke="black"/>
8
- </svg>