Skip to content

Commit 3cf7241

Browse files
goncalossilvaqurbonzoda
authored andcommitted
Escape string characters for each report format
1 parent 64a257b commit 3cf7241

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

runtime/commonMain/src/kotlinx/benchmark/BenchmarkReportFormatter.kt

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -121,40 +121,40 @@ private class CsvBenchmarkReportFormatter(val delimiter: String) : BenchmarkRepo
121121
}
122122

123123
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())
131131
params.forEach {
132132
append(delimiter)
133-
appendEscaped("Param: $it")
133+
append("Param: ${it.escape()}")
134134
}
135135
append("\r\n")
136136
}
137137

138138
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)
141141
append(1).append(delimiter)
142142
append(result.values.size).append(delimiter)
143143
append(result.score.format(6, useGrouping = false)).append(delimiter)
144144
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())
146146
params.forEach {
147147
append(delimiter)
148148
result.params[it]?.let { param ->
149-
appendEscaped(param)
149+
append(param.escape().quote())
150150
}
151151
}
152152
append("\r\n")
153153
}
154154

155-
private fun StringBuilder.appendEscaped(value: String): StringBuilder =
156-
append("\"").append(value.replace("\"", "\"\"")).append("\"")
155+
private fun String.escape() = this.replace("\"", "\"\"")
157156

157+
private fun String.quote() = "\"$this\""
158158
}
159159

160160
private object JsonBenchmarkReportFormatter : BenchmarkReportFormatter() {
@@ -165,14 +165,14 @@ private object JsonBenchmarkReportFormatter : BenchmarkReportFormatter() {
165165
private fun format(result: ReportBenchmarkResult): String =
166166
"""
167167
{
168-
"benchmark" : "${result.benchmark.name}",
168+
"benchmark" : "${result.benchmark.name.escape()}",
169169
"mode" : "${result.config.mode.toText()}",
170170
"warmupIterations" : ${result.config.warmups},
171171
"warmupTime" : "${result.config.iterationTime} ${result.config.iterationTimeUnit.toText()}",
172172
"measurementIterations" : ${result.config.iterations},
173173
"measurementTime" : "${result.config.iterationTime} ${result.config.iterationTimeUnit.toText()}",
174174
"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()}\"" }}
176176
},
177177
"nativeFork" : "${result.config.nativeFork.toText()}",
178178
"nativeGCAfterIteration" : ${result.config.nativeGCAfterIteration},
@@ -201,4 +201,21 @@ private object JsonBenchmarkReportFormatter : BenchmarkReportFormatter() {
201201
}
202202
}"""
203203

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+
}
204221
}

0 commit comments

Comments
 (0)