Coverage Report

Created: 2026-01-21 08:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/node/test/fuzzers/fuzz_js_format.h
Line
Count
Source
1
// Copyright 2025 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//      http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#pragma once
16
#include <string>
17
#include <string_view>
18
19
// Minimal numbered placeholder formatter: replaces {0}, {1}, ... with strings.
20
// Dependency-free and perfect for short JS templates.
21
0
inline void ReplaceAll_(std::string& s, std::string_view from, std::string_view to) {
22
0
  if (from.empty()) return;
23
0
  size_t pos = 0;
24
0
  while ((pos = s.find(from, pos)) != std::string::npos) {
25
0
    s.replace(pos, from.size(), to);
26
0
    pos += to.size();
27
0
  }
28
0
}
29
30
template <typename... StrLike>
31
10.6k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
10.6k
  std::string out(tmpl);
33
10.6k
  std::string args[] = { std::string(vals)... };
34
33.4k
  for (size_t i = 0; i < std::size(args); ++i) {
35
22.7k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
22.7k
  }
38
10.6k
  return out;
39
10.6k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
1.80k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
1.80k
  std::string out(tmpl);
33
1.80k
  std::string args[] = { std::string(vals)... };
34
3.61k
  for (size_t i = 0; i < std::size(args); ++i) {
35
1.80k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
1.80k
  }
38
1.80k
  return out;
39
1.80k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
7.30k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
7.30k
  std::string out(tmpl);
33
7.30k
  std::string args[] = { std::string(vals)... };
34
21.9k
  for (size_t i = 0; i < std::size(args); ++i) {
35
14.6k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
14.6k
  }
38
7.30k
  return out;
39
7.30k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
770
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
770
  std::string out(tmpl);
33
770
  std::string args[] = { std::string(vals)... };
34
3.85k
  for (size_t i = 0; i < std::size(args); ++i) {
35
3.08k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
3.08k
  }
38
770
  return out;
39
770
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
313
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
313
  std::string out(tmpl);
33
313
  std::string args[] = { std::string(vals)... };
34
1.25k
  for (size_t i = 0; i < std::size(args); ++i) {
35
939
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
939
  }
38
313
  return out;
39
313
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
466
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
466
  std::string out(tmpl);
33
466
  std::string args[] = { std::string(vals)... };
34
2.79k
  for (size_t i = 0; i < std::size(args); ++i) {
35
2.33k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
2.33k
  }
38
466
  return out;
39
466
}
40
41
// Escape a *single-quoted* JS string literal (returns with quotes included).
42
16.1k
inline std::string ToSingleQuotedJsLiteral(std::string_view s) {
43
16.1k
  std::string out;
44
16.1k
  out.reserve(s.size() + 2);
45
16.1k
  out.push_back('\'');
46
588M
  for (unsigned char c : s) {
47
588M
    switch (c) {
48
5.73M
      case '\\': out += "\\\\"; break;
49
1.96M
      case '\'': out += "\\\'"; break;
50
8.50M
      case '\n': out += "\\n"; break;
51
4.96M
      case '\r': out += "\\r"; break;
52
3.25M
      case '\t': out += "\\t"; break;
53
4.54M
      case '\f': out += "\\f"; break;
54
2.06M
      case '\b': out += "\\b"; break;
55
557M
      default:
56
557M
        if (c < 0x20) {
57
415M
          char buf[5];
58
415M
          snprintf(buf, sizeof(buf), "\\x%02X", static_cast<int>(c));
59
415M
          out += buf;
60
415M
        } else {
61
141M
          out.push_back(static_cast<char>(c));
62
141M
        }
63
588M
    }
64
588M
  }
65
16.1k
  out.push_back('\'');
66
16.1k
  return out;
67
16.1k
}