@@ -88,6 +88,18 @@ internal struct Output: TextOutputStream {
8888 }
8989}
9090
91+ internal func dumpJson( of: ( any Encodable ) , outputFile: String ? ) throws {
92+ let encoder = JSONEncoder ( )
93+ encoder. outputFormatting = [ . prettyPrinted, . sortedKeys]
94+ let data = try encoder. encode ( of)
95+ let jsonOutput = String ( data: data, encoding: . utf8) !
96+ if let outputFile = outputFile {
97+ try jsonOutput. write ( toFile: outputFile, atomically: true , encoding: . utf8)
98+ } else {
99+ print ( jsonOutput)
100+ }
101+ }
102+
91103internal struct DumpGenericMetadata : ParsableCommand {
92104 static let configuration = CommandConfiguration (
93105 abstract: " Print the target's generic metadata allocations. " )
@@ -99,7 +111,10 @@ internal struct DumpGenericMetadata: ParsableCommand {
99111 var backtraceOptions : BacktraceOptions
100112
101113 @OptionGroup ( )
102- var genericMetadataOptions : GenericMetadataOptions
114+ var metadataOptions : MetadataOptions
115+
116+ @Flag ( help: " Show allocations in mangled form " )
117+ var mangled : Bool = false
103118
104119 func run( ) throws {
105120 disableStdErrBuffer ( )
@@ -126,7 +141,7 @@ internal struct DumpGenericMetadata: ParsableCommand {
126141
127142 return Metadata ( ptr: pointer,
128143 allocation: allocation,
129- name: process. context. name ( type: pointer, mangled: genericMetadataOptions . mangled) ?? " <unknown> " ,
144+ name: process. context. name ( type: pointer, mangled: mangled) ?? " <unknown> " ,
130145 isArrayOfClass: process. context. isArrayOfClass ( pointer) ,
131146 garbage: garbage,
132147 backtrace: currentBacktrace)
@@ -146,30 +161,30 @@ internal struct DumpGenericMetadata: ParsableCommand {
146161 }
147162 }
148163
149- if genericMetadataOptions . json {
164+ if metadataOptions . json {
150165 let processMetadata = ProcessMetadata ( name: process. processName,
151166 pid: process. processIdentifier as! ProcessIdentifier ,
152167 metadata: generics)
153168 allProcesses. append ( processMetadata)
154- } else if !genericMetadataOptions . summary {
169+ } else if !metadataOptions . summary {
155170 try dumpText ( process: process, generics: generics)
156171 }
157172 } // inspect
158173
159- if genericMetadataOptions . json {
160- if genericMetadataOptions . summary {
161- try dumpJson ( of: metadataSummary)
174+ if metadataOptions . json {
175+ if metadataOptions . summary {
176+ try dumpJson ( of: metadataSummary, outputFile : metadataOptions . outputFile )
162177 } else {
163- try dumpJson ( of: allProcesses)
178+ try dumpJson ( of: allProcesses, outputFile : metadataOptions . outputFile )
164179 }
165- } else if genericMetadataOptions . summary {
180+ } else if metadataOptions . summary {
166181 try dumpTextSummary ( of: metadataSummary)
167182 }
168183 }
169184
170185 private func dumpText( process: any RemoteProcess , generics: [ Metadata ] ) throws {
171186 var erroneousMetadata : [ ( ptr: swift_reflection_ptr_t , name: String ) ] = [ ]
172- var output = try Output ( genericMetadataOptions . outputFile)
187+ var output = try Output ( metadataOptions . outputFile)
173188 print ( " \( process. processName) ( \( process. processIdentifier) ): \n " , to: & output)
174189 print ( " Address " , " Allocation " , " Size " , " Offset " , " isArrayOfClass " , " Name " , separator: " \t " , to: & output)
175190 generics. forEach {
@@ -198,20 +213,8 @@ internal struct DumpGenericMetadata: ParsableCommand {
198213 print ( " " , to: & output)
199214 }
200215
201- private func dumpJson( of: ( any Encodable ) ) throws {
202- let encoder = JSONEncoder ( )
203- encoder. outputFormatting = [ . prettyPrinted, . sortedKeys]
204- let data = try encoder. encode ( of)
205- let jsonOutput = String ( data: data, encoding: . utf8) !
206- if let outputFile = genericMetadataOptions. outputFile {
207- try jsonOutput. write ( toFile: outputFile, atomically: true , encoding: . utf8)
208- } else {
209- print ( jsonOutput)
210- }
211- }
212-
213216 private func dumpTextSummary( of: [ String : MetadataSummary ] ) throws {
214- var output = try Output ( genericMetadataOptions . outputFile)
217+ var output = try Output ( metadataOptions . outputFile)
215218 print ( " Size " , " Owners " , " Name " , separator: " \t " , to: & output)
216219 var totalSize = 0
217220 var unknownSize = 0
0 commit comments