浏览代码

LibJS: Avoid DeprecatedString allocation in Token::double_value()

Instead of allocating a DeprecatedString just so we can call strtoull()
on it, we now collect the relevant token characters in a vector and add
a null terminator manually.

2% speed-up on Kraken/imaging-darkroom.js :^)
Andreas Kling 1 年之前
父节点
当前提交
b52cbf673d
共有 1 个文件被更改,包括 8 次插入7 次删除
  1. 8 7
      Userland/Libraries/LibJS/Token.cpp

+ 8 - 7
Userland/Libraries/LibJS/Token.cpp

@@ -55,29 +55,30 @@ double Token::double_value() const
 {
     VERIFY(type() == TokenType::NumericLiteral);
 
-    StringBuilder builder;
+    Vector<char, 32> buffer;
 
     for (auto ch : value()) {
         if (ch == '_')
             continue;
-        builder.append(ch);
+        buffer.append(ch);
     }
+    buffer.append('\0');
 
-    auto value_string = builder.to_deprecated_string();
+    auto value_string = StringView { buffer.data(), buffer.size() - 1 };
     if (value_string[0] == '0' && value_string.length() >= 2) {
         if (value_string[1] == 'x' || value_string[1] == 'X') {
             // hexadecimal
-            return static_cast<double>(strtoul(value_string.characters() + 2, nullptr, 16));
+            return static_cast<double>(strtoul(value_string.characters_without_null_termination() + 2, nullptr, 16));
         } else if (value_string[1] == 'o' || value_string[1] == 'O') {
             // octal
-            return static_cast<double>(strtoul(value_string.characters() + 2, nullptr, 8));
+            return static_cast<double>(strtoul(value_string.characters_without_null_termination() + 2, nullptr, 8));
         } else if (value_string[1] == 'b' || value_string[1] == 'B') {
             // binary
-            return static_cast<double>(strtoul(value_string.characters() + 2, nullptr, 2));
+            return static_cast<double>(strtoul(value_string.characters_without_null_termination() + 2, nullptr, 2));
         } else if (is_ascii_digit(value_string[1])) {
             // also octal, but syntax error in strict mode
             if (!value().contains('8') && !value().contains('9'))
-                return static_cast<double>(strtoul(value_string.characters() + 1, nullptr, 8));
+                return static_cast<double>(strtoul(value_string.characters_without_null_termination() + 1, nullptr, 8));
         }
     }
     // This should always be a valid double