From 65717e3b7528bbe7441fd296b33563143828ff72 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 6 Oct 2023 17:54:21 +0200 Subject: [PATCH] LibJS: Inline fast case for Value::to_{boolean,number,numeric,primitive} These functions all have a very common case that can be dealt with a very simple inline check, often avoiding the need to call an out-of-line function. This patch moves the common case to inline functions in a new ValueInlines.h header (necessary due to header dependency issues..) 8% speed-up on the entire Kraken benchmark :^) --- .../BindingsGenerator/IDLGenerators.cpp | 4 ++ Tests/LibJS/test-value-js.cpp | 1 + Tests/LibJS/test262-runner.cpp | 1 + Userland/Applications/Assistant/Providers.cpp | 1 + Userland/Applications/Spreadsheet/Cell.cpp | 1 + .../Spreadsheet/CellType/Numeric.cpp | 1 + .../Spreadsheet/JSIntegration.cpp | 1 + Userland/Libraries/LibJS/AST.cpp | 1 + .../Libraries/LibJS/Bytecode/Interpreter.cpp | 1 + Userland/Libraries/LibJS/Console.cpp | 1 + .../LibJS/Runtime/AbstractOperations.cpp | 1 + Userland/Libraries/LibJS/Runtime/Array.cpp | 1 + .../LibJS/Runtime/ArrayPrototype.cpp | 1 + .../Runtime/AsyncFunctionDriverWrapper.cpp | 1 + .../LibJS/Runtime/BigIntConstructor.cpp | 1 + .../LibJS/Runtime/BooleanConstructor.cpp | 1 + .../LibJS/Runtime/DataViewPrototype.cpp | 1 + .../LibJS/Runtime/DateConstructor.cpp | 1 + .../Libraries/LibJS/Runtime/DatePrototype.cpp | 1 + .../Libraries/LibJS/Runtime/GlobalObject.cpp | 1 + .../LibJS/Runtime/Intl/AbstractOperations.cpp | 1 + .../Runtime/Intl/DateTimeFormatFunction.cpp | 1 + .../Runtime/Intl/DateTimeFormatPrototype.cpp | 1 + .../LibJS/Runtime/Intl/DurationFormat.cpp | 1 + .../LibJS/Runtime/Intl/NumberFormat.cpp | 1 + .../Runtime/Intl/PluralRulesPrototype.cpp | 1 + .../Intl/RelativeTimeFormatPrototype.cpp | 1 + Userland/Libraries/LibJS/Runtime/Iterator.cpp | 1 + .../LibJS/Runtime/IteratorPrototype.cpp | 1 + .../Libraries/LibJS/Runtime/JSONObject.cpp | 1 + .../Libraries/LibJS/Runtime/MathObject.cpp | 1 + .../LibJS/Runtime/ObjectEnvironment.cpp | 1 + .../LibJS/Runtime/PropertyDescriptor.cpp | 1 + .../Libraries/LibJS/Runtime/ProxyObject.cpp | 1 + .../LibJS/Runtime/RegExpPrototype.cpp | 1 + .../Libraries/LibJS/Runtime/SetPrototype.cpp | 1 + .../LibJS/Runtime/StringConstructor.cpp | 1 + .../LibJS/Runtime/StringPrototype.cpp | 1 + .../Runtime/Temporal/AbstractOperations.cpp | 1 + .../Runtime/Temporal/AbstractOperations.h | 1 + .../LibJS/Runtime/Temporal/Calendar.cpp | 1 + .../LibJS/Runtime/Temporal/Duration.cpp | 1 + .../Runtime/Temporal/DurationConstructor.cpp | 1 + .../Runtime/Temporal/InstantConstructor.cpp | 1 + .../Libraries/LibJS/Runtime/TypedArray.cpp | 1 + .../LibJS/Runtime/TypedArrayPrototype.cpp | 1 + Userland/Libraries/LibJS/Runtime/Value.cpp | 13 ++--- Userland/Libraries/LibJS/Runtime/Value.h | 5 ++ .../Libraries/LibJS/Runtime/ValueInlines.h | 48 +++++++++++++++++++ .../LibWeb/Bindings/OptionConstructor.cpp | 1 + .../CustomElements/CustomElementRegistry.cpp | 1 + .../LibWeb/WebGL/WebGLContextAttributes.cpp | 1 + Userland/Utilities/js.cpp | 1 + 53 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 Userland/Libraries/LibJS/Runtime/ValueInlines.h diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 883ed1d708..b13fcd82dc 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -3252,6 +3252,7 @@ void generate_namespace_implementation(IDL::Interface const& interface, StringBu #include #include #include +#include #include #include #include @@ -3415,6 +3416,7 @@ void generate_constructor_implementation(IDL::Interface const& interface, String #include #include #include +#include #include #include #include @@ -3807,6 +3809,7 @@ void generate_prototype_implementation(IDL::Interface const& interface, StringBu #include #include #include +#include #include #include #include @@ -4121,6 +4124,7 @@ void generate_global_mixin_implementation(IDL::Interface const& interface, Strin #include #include #include +#include #include #include #include diff --git a/Tests/LibJS/test-value-js.cpp b/Tests/LibJS/test-value-js.cpp index eac8c4463d..8095680c6d 100644 --- a/Tests/LibJS/test-value-js.cpp +++ b/Tests/LibJS/test-value-js.cpp @@ -5,6 +5,7 @@ */ #include +#include #include using namespace JS; diff --git a/Tests/LibJS/test262-runner.cpp b/Tests/LibJS/test262-runner.cpp index 324ba895bc..68f5e26907 100644 --- a/Tests/LibJS/test262-runner.cpp +++ b/Tests/LibJS/test262-runner.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Applications/Assistant/Providers.cpp b/Userland/Applications/Assistant/Providers.cpp index 861bbb49ed..b8c6e45e56 100644 --- a/Userland/Applications/Assistant/Providers.cpp +++ b/Userland/Applications/Assistant/Providers.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Applications/Spreadsheet/Cell.cpp b/Userland/Applications/Spreadsheet/Cell.cpp index 2ec8c36c6c..ea630d9e90 100644 --- a/Userland/Applications/Spreadsheet/Cell.cpp +++ b/Userland/Applications/Spreadsheet/Cell.cpp @@ -8,6 +8,7 @@ #include "Spreadsheet.h" #include #include +#include namespace Spreadsheet { diff --git a/Userland/Applications/Spreadsheet/CellType/Numeric.cpp b/Userland/Applications/Spreadsheet/CellType/Numeric.cpp index acddedcbb1..92bbe1971e 100644 --- a/Userland/Applications/Spreadsheet/CellType/Numeric.cpp +++ b/Userland/Applications/Spreadsheet/CellType/Numeric.cpp @@ -9,6 +9,7 @@ #include "../Spreadsheet.h" #include "Format.h" #include +#include namespace Spreadsheet { diff --git a/Userland/Applications/Spreadsheet/JSIntegration.cpp b/Userland/Applications/Spreadsheet/JSIntegration.cpp index 461095a295..01de13e982 100644 --- a/Userland/Applications/Spreadsheet/JSIntegration.cpp +++ b/Userland/Applications/Spreadsheet/JSIntegration.cpp @@ -12,6 +12,7 @@ #include #include #include +#include namespace Spreadsheet { diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 9410e87a41..0f911e3322 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include namespace JS { diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index a8d0948969..ed9800c538 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include namespace JS::Bytecode { diff --git a/Userland/Libraries/LibJS/Console.cpp b/Userland/Libraries/LibJS/Console.cpp index 41740defba..7e780dd636 100644 --- a/Userland/Libraries/LibJS/Console.cpp +++ b/Userland/Libraries/LibJS/Console.cpp @@ -14,6 +14,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp index 6d10aac5c3..a344f91bee 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp @@ -34,6 +34,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/Array.cpp b/Userland/Libraries/LibJS/Runtime/Array.cpp index 90d5ca057c..f8cb17849c 100644 --- a/Userland/Libraries/LibJS/Runtime/Array.cpp +++ b/Userland/Libraries/LibJS/Runtime/Array.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp index 04647227b5..392fa47d3f 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp @@ -23,6 +23,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/AsyncFunctionDriverWrapper.cpp b/Userland/Libraries/LibJS/Runtime/AsyncFunctionDriverWrapper.cpp index 6daa34bf50..fe9b8553a6 100644 --- a/Userland/Libraries/LibJS/Runtime/AsyncFunctionDriverWrapper.cpp +++ b/Userland/Libraries/LibJS/Runtime/AsyncFunctionDriverWrapper.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp b/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp index dd12eeff57..58c83a4002 100644 --- a/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/BooleanConstructor.cpp b/Userland/Libraries/LibJS/Runtime/BooleanConstructor.cpp index aef4fd883c..14f32fc237 100644 --- a/Userland/Libraries/LibJS/Runtime/BooleanConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/BooleanConstructor.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp b/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp index 4f7af5ec7d..5a8c0c1609 100644 --- a/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/DataViewPrototype.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/DateConstructor.cpp b/Userland/Libraries/LibJS/Runtime/DateConstructor.cpp index f993a66c84..180ef464a2 100644 --- a/Userland/Libraries/LibJS/Runtime/DateConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/DateConstructor.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff --git a/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp b/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp index 9448f0eed7..b94201894c 100644 --- a/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp index 99f7d9b80c..476d19165e 100644 --- a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp @@ -80,6 +80,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp index 511b3edfcb..20af3aac1b 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include namespace JS::Intl { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatFunction.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatFunction.cpp index 6eebeb635b..57b3688f9a 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatFunction.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatFunction.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace JS::Intl { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatPrototype.cpp index b5c336e459..d895c57e68 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatPrototype.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace JS::Intl { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp index 02bb9d35c8..11310092c1 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp @@ -16,6 +16,7 @@ #include #include #include +#include namespace JS::Intl { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp index 251a20676a..7557dc35af 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesPrototype.cpp index 887073ade0..9e42e8362e 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesPrototype.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include namespace JS::Intl { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatPrototype.cpp index 87ab21e819..5edbdea67f 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatPrototype.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace JS::Intl { diff --git a/Userland/Libraries/LibJS/Runtime/Iterator.cpp b/Userland/Libraries/LibJS/Runtime/Iterator.cpp index 8a1f2ce746..f8b2a35e48 100644 --- a/Userland/Libraries/LibJS/Runtime/Iterator.cpp +++ b/Userland/Libraries/LibJS/Runtime/Iterator.cpp @@ -12,6 +12,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/IteratorPrototype.cpp b/Userland/Libraries/LibJS/Runtime/IteratorPrototype.cpp index c7c84cf8d3..87940d4c40 100644 --- a/Userland/Libraries/LibJS/Runtime/IteratorPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/IteratorPrototype.cpp @@ -12,6 +12,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/JSONObject.cpp b/Userland/Libraries/LibJS/Runtime/JSONObject.cpp index 1287b9c33b..35fae5669a 100644 --- a/Userland/Libraries/LibJS/Runtime/JSONObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/JSONObject.cpp @@ -23,6 +23,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/MathObject.cpp b/Userland/Libraries/LibJS/Runtime/MathObject.cpp index 73e2c8ca49..67df8a45c9 100644 --- a/Userland/Libraries/LibJS/Runtime/MathObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/MathObject.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp index d3d831e713..5939b2ca29 100644 --- a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp @@ -7,6 +7,7 @@ #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/PropertyDescriptor.cpp b/Userland/Libraries/LibJS/Runtime/PropertyDescriptor.cpp index 198a5efb90..b8130eff2f 100644 --- a/Userland/Libraries/LibJS/Runtime/PropertyDescriptor.cpp +++ b/Userland/Libraries/LibJS/Runtime/PropertyDescriptor.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/ProxyObject.cpp b/Userland/Libraries/LibJS/Runtime/ProxyObject.cpp index c91b06c1ba..97ec6f0171 100644 --- a/Userland/Libraries/LibJS/Runtime/ProxyObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/ProxyObject.cpp @@ -12,6 +12,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp b/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp index bf24d39a6c..02e6386302 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/SetPrototype.cpp b/Userland/Libraries/LibJS/Runtime/SetPrototype.cpp index ef6f4564ef..2087e35e0f 100644 --- a/Userland/Libraries/LibJS/Runtime/SetPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/SetPrototype.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/StringConstructor.cpp b/Userland/Libraries/LibJS/Runtime/StringConstructor.cpp index 8676117c2f..79c7d916db 100644 --- a/Userland/Libraries/LibJS/Runtime/StringConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/StringConstructor.cpp @@ -14,6 +14,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp b/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp index b594470d10..ae7f4913c5 100644 --- a/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp index 8080d8f47b..e22d38a9c0 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp @@ -24,6 +24,7 @@ #include #include #include +#include namespace JS::Temporal { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h index e131b2b3b0..b0d200f620 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h @@ -14,6 +14,7 @@ #include #include #include +#include namespace JS::Temporal { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp index bc4b7748ae..7f7e85f19c 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp @@ -23,6 +23,7 @@ #include #include #include +#include namespace JS::Temporal { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp index bbe6567399..515be61880 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace JS::Temporal { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp index 6204fe9932..bd12b7f932 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace JS::Temporal { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp index b83df05b5a..3fed60a7c7 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace JS::Temporal { diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp index 202f72061d..24a8255899 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp index e8af099fe3..167b9e7229 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayPrototype.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace JS { diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp index 5e3176ab3e..058e58af14 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.cpp +++ b/Userland/Libraries/LibJS/Runtime/Value.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include namespace JS { @@ -453,7 +454,7 @@ ThrowCompletionOr Value::to_utf16_string(VM& vm) const } // 7.1.2 ToBoolean ( argument ), https://tc39.es/ecma262/#sec-toboolean -bool Value::to_boolean() const +bool Value::to_boolean_slow_case() const { if (is_double()) { if (is_nan()) @@ -490,7 +491,7 @@ bool Value::to_boolean() const } // 7.1.1 ToPrimitive ( input [ , preferredType ] ), https://tc39.es/ecma262/#sec-toprimitive -ThrowCompletionOr Value::to_primitive(VM& vm, PreferredType preferred_type) const +ThrowCompletionOr Value::to_primitive_slow_case(VM& vm, PreferredType preferred_type) const { // 1. If input is an Object, then if (is_object()) { @@ -585,12 +586,8 @@ ThrowCompletionOr> Value::to_object(VM& vm) const } // 7.1.3 ToNumeric ( value ), https://tc39.es/ecma262/#sec-tonumeric -FLATTEN ThrowCompletionOr Value::to_numeric(VM& vm) const +FLATTEN ThrowCompletionOr Value::to_numeric_slow_case(VM& vm) const { - // OPTIMIZATION: Fast path for when this value is already a number. - if (is_number()) - return *this; - // 1. Let primValue be ? ToPrimitive(value, number). auto primitive_value = TRY(to_primitive(vm, Value::PreferredType::Number)); @@ -688,7 +685,7 @@ double string_to_number(StringView string) } // 7.1.4 ToNumber ( argument ), https://tc39.es/ecma262/#sec-tonumber -ThrowCompletionOr Value::to_number(VM& vm) const +ThrowCompletionOr Value::to_number_slow_case(VM& vm) const { VERIFY(!is_empty()); diff --git a/Userland/Libraries/LibJS/Runtime/Value.h b/Userland/Libraries/LibJS/Runtime/Value.h index 85e31667cc..94f3957a4b 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.h +++ b/Userland/Libraries/LibJS/Runtime/Value.h @@ -440,6 +440,11 @@ public: } private: + bool to_boolean_slow_case() const; + ThrowCompletionOr to_number_slow_case(VM&) const; + ThrowCompletionOr to_numeric_slow_case(VM&) const; + ThrowCompletionOr to_primitive_slow_case(VM&, PreferredType) const; + Value(u64 tag, u64 val) { VERIFY(!(tag & val)); diff --git a/Userland/Libraries/LibJS/Runtime/ValueInlines.h b/Userland/Libraries/LibJS/Runtime/ValueInlines.h new file mode 100644 index 0000000000..6d4d2562de --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/ValueInlines.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace JS { + +inline bool Value::to_boolean() const +{ + // OPTIMIZATION: Fast path for when this value is already a boolean. + if (is_boolean()) + return as_bool(); + + return to_boolean_slow_case(); +} + +inline ThrowCompletionOr Value::to_number(VM& vm) const +{ + // OPTIMIZATION: Fast path for when this value is already a number. + if (is_number()) + return *this; + + return to_number_slow_case(vm); +} + +inline ThrowCompletionOr Value::to_numeric(VM& vm) const +{ + // OPTIMIZATION: Fast path for when this value is already a number. + if (is_number()) + return *this; + + return to_numeric_slow_case(vm); +} + +inline ThrowCompletionOr Value::to_primitive(VM& vm, PreferredType preferred_type) const +{ + if (!is_object()) + return *this; + return to_primitive_slow_case(vm, preferred_type); +} + +} diff --git a/Userland/Libraries/LibWeb/Bindings/OptionConstructor.cpp b/Userland/Libraries/LibWeb/Bindings/OptionConstructor.cpp index 45c1b6fbd7..cd1755d54e 100644 --- a/Userland/Libraries/LibWeb/Bindings/OptionConstructor.cpp +++ b/Userland/Libraries/LibWeb/Bindings/OptionConstructor.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/HTML/CustomElements/CustomElementRegistry.cpp b/Userland/Libraries/LibWeb/HTML/CustomElements/CustomElementRegistry.cpp index d0d8bd012d..cbfa93bad2 100644 --- a/Userland/Libraries/LibWeb/HTML/CustomElements/CustomElementRegistry.cpp +++ b/Userland/Libraries/LibWeb/HTML/CustomElements/CustomElementRegistry.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/WebGL/WebGLContextAttributes.cpp b/Userland/Libraries/LibWeb/WebGL/WebGLContextAttributes.cpp index f28f452ad6..331a396cb7 100644 --- a/Userland/Libraries/LibWeb/WebGL/WebGLContextAttributes.cpp +++ b/Userland/Libraries/LibWeb/WebGL/WebGLContextAttributes.cpp @@ -6,6 +6,7 @@ #include #include +#include #include namespace Web::WebGL { diff --git a/Userland/Utilities/js.cpp b/Userland/Utilities/js.cpp index 78fe2e699c..12e9c66a5c 100644 --- a/Userland/Utilities/js.cpp +++ b/Userland/Utilities/js.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include