@@ -121,40 +121,40 @@ private class CsvBenchmarkReportFormatter(val delimiter: String) : BenchmarkRepo
121
121
}
122
122
123
123
private fun StringBuilder.appendHeader (params : Set <String >) {
124
- appendEscaped (" Benchmark" ).append(delimiter)
125
- appendEscaped (" Mode" ).append(delimiter)
126
- appendEscaped (" Threads" ).append(delimiter)
127
- appendEscaped (" Samples" ).append(delimiter)
128
- appendEscaped (" Score" ).append(delimiter)
129
- appendEscaped (" Score Error (99.9%)" ).append(delimiter)
130
- appendEscaped (" Unit" )
124
+ append (" Benchmark" .quote() ).append(delimiter)
125
+ append (" Mode" .quote() ).append(delimiter)
126
+ append (" Threads" .quote() ).append(delimiter)
127
+ append (" Samples" .quote() ).append(delimiter)
128
+ append (" Score" .quote() ).append(delimiter)
129
+ append (" Score Error (99.9%)" .quote() ).append(delimiter)
130
+ append (" Unit" .quote() )
131
131
params.forEach {
132
132
append(delimiter)
133
- appendEscaped (" Param: $it " )
133
+ append (" Param: ${it.escape()} " )
134
134
}
135
135
append(" \r\n " )
136
136
}
137
137
138
138
private fun StringBuilder.appendResult (params : Set <String >, result : ReportBenchmarkResult ) {
139
- appendEscaped (result.benchmark.name).append(delimiter)
140
- appendEscaped (result.config.mode.toText()).append(delimiter)
139
+ append (result.benchmark.name.escape().quote() ).append(delimiter)
140
+ append (result.config.mode.toText().quote ()).append(delimiter)
141
141
append(1 ).append(delimiter)
142
142
append(result.values.size).append(delimiter)
143
143
append(result.score.format(6 , useGrouping = false )).append(delimiter)
144
144
append(result.error.format(6 , useGrouping = false )).append(delimiter)
145
- appendEscaped (unitText(result.config.mode, result.config.outputTimeUnit))
145
+ append (unitText(result.config.mode, result.config.outputTimeUnit).quote( ))
146
146
params.forEach {
147
147
append(delimiter)
148
148
result.params[it]?.let { param ->
149
- appendEscaped (param)
149
+ append (param.escape().quote() )
150
150
}
151
151
}
152
152
append(" \r\n " )
153
153
}
154
154
155
- private fun StringBuilder.appendEscaped (value : String ): StringBuilder =
156
- append(" \" " ).append(value.replace(" \" " , " \"\" " )).append(" \" " )
155
+ private fun String.escape () = this .replace(" \" " , " \"\" " )
157
156
157
+ private fun String.quote () = " \" $this \" "
158
158
}
159
159
160
160
private object JsonBenchmarkReportFormatter : BenchmarkReportFormatter() {
@@ -165,14 +165,14 @@ private object JsonBenchmarkReportFormatter : BenchmarkReportFormatter() {
165
165
private fun format (result : ReportBenchmarkResult ): String =
166
166
"""
167
167
{
168
- "benchmark" : "${result.benchmark.name} ",
168
+ "benchmark" : "${result.benchmark.name.escape() } ",
169
169
"mode" : "${result.config.mode.toText()} ",
170
170
"warmupIterations" : ${result.config.warmups} ,
171
171
"warmupTime" : "${result.config.iterationTime} ${result.config.iterationTimeUnit.toText()} ",
172
172
"measurementIterations" : ${result.config.iterations} ,
173
173
"measurementTime" : "${result.config.iterationTime} ${result.config.iterationTimeUnit.toText()} ",
174
174
"params" : {
175
- ${result.params.entries.joinToString(separator = " ,\n " ) { " \" ${it.key} \" : \" ${it.value} \" " }}
175
+ ${result.params.entries.joinToString(separator = " ,\n " ) { " \" ${it.key.escape() } \" : \" ${it.value.escape() } \" " }}
176
176
},
177
177
"nativeFork" : "${result.config.nativeFork.toText()} ",
178
178
"nativeGCAfterIteration" : ${result.config.nativeGCAfterIteration} ,
@@ -201,4 +201,21 @@ private object JsonBenchmarkReportFormatter : BenchmarkReportFormatter() {
201
201
}
202
202
}"""
203
203
204
+ private fun String.escape (): String = buildString {
205
+ this @escape.forEach { char ->
206
+ when (char) {
207
+ ' "' , ' \\ ' , ' /' -> append(" \\ " ).append(char)
208
+ ' \t ' -> append(" \\ t" )
209
+ ' \b ' -> append(" \\ b" )
210
+ ' \n ' -> append(" \\ n" )
211
+ ' \r ' -> append(" \\ r" )
212
+ ' \u000C ' -> append(" \\ f" )
213
+ else -> if (char <= 0x1F .toChar()) {
214
+ append(" \\ u00${char.code.toString(16 )} " )
215
+ } else {
216
+ append(char)
217
+ }
218
+ }
219
+ }
220
+ }
204
221
}
0 commit comments