mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 22:18:12 +00:00
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 :^)
This commit is contained in:
parent
008b9f4c9f
commit
b52cbf673d
1 changed files with 8 additions and 7 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue