1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 07:57:46 +00:00

Userland: static vs non-static constexpr variables

Problem:
- `static` variables consume memory and sometimes are less
  optimizable.
- `static const` variables can be `constexpr`, usually.
- `static` function-local variables require an initialization check
  every time the function is run.

Solution:
- If a global `static` variable is only used in a single function then
  move it into the function and make it non-`static` and `constexpr`.
- Make all global `static` variables `constexpr` instead of `const`.
- Change function-local `static const[expr]` variables to be just
  `constexpr`.
This commit is contained in:
Lenny Maiorani 2021-05-19 09:32:07 -06:00 committed by Linus Groh
parent 17ff895e1c
commit 800ea8ea96
38 changed files with 192 additions and 184 deletions

View file

@ -5,6 +5,7 @@
*/
#include <AK/Function.h>
#include <AK/StringView.h>
#include <LibJS/Runtime/Error.h>
#include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/NumberObject.h>
@ -12,17 +13,6 @@
namespace JS {
static const u8 max_precision_for_radix[37] = {
// clang-format off
0, 0, 52, 32, 26, 22, 20, 18, 17, 16,
15, 15, 14, 14, 13, 13, 13, 12, 12, 12,
12, 11, 11, 11, 11, 11, 11, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10,
// clang-format on
};
static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
NumberPrototype::NumberPrototype(GlobalObject& global_object)
: NumberObject(0, *global_object.object_prototype())
{
@ -41,6 +31,8 @@ NumberPrototype::~NumberPrototype()
JS_DEFINE_NATIVE_FUNCTION(NumberPrototype::to_string)
{
constexpr StringView digits = "0123456789abcdefghijklmnopqrstuvwxyz";
Value number_value;
auto this_value = vm.this_value(global_object);
@ -107,6 +99,14 @@ JS_DEFINE_NATIVE_FUNCTION(NumberPrototype::to_string)
if (decimal_part != 0.0) {
characters.append('.');
constexpr u8 max_precision_for_radix[37] = {
// clang-format off
0, 0, 52, 32, 26, 22, 20, 18, 17, 16,
15, 15, 14, 14, 13, 13, 13, 12, 12, 12,
12, 11, 11, 11, 11, 11, 11, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10,
// clang-format on
};
u8 precision = max_precision_for_radix[radix];
for (u8 i = 0; i < precision; ++i) {

View file

@ -37,7 +37,7 @@
namespace JS {
// Used in various abstract operations to make it obvious when a non-optional return value must be discarded.
static const double INVALID { 0 };
static constexpr double INVALID { 0 };
static inline bool same_type_for_equality(const Value& lhs, const Value& rhs)
{