1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-23 15:45:06 +00:00
Commit graph

4176 commits

Author SHA1 Message Date
Linus Groh
444ba191af LibJS: Add spec comments to greater_than() 2022-12-10 11:23:23 +00:00
Linus Groh
058a247c61 LibJS: Add spec comments to Value::to_integer_or_infinity() 2022-12-10 11:23:23 +00:00
Linus Groh
72ee346f64 LibJS: Add spec comments to Value::to_index() 2022-12-10 11:23:23 +00:00
Linus Groh
d1b2ac41fd LibJS: Add spec comments to Value::to_length() 2022-12-10 11:23:23 +00:00
Linus Groh
34e372cbff LibJS: Add spec comments to Value::to_u8_clamp() 2022-12-10 11:23:23 +00:00
Linus Groh
fff5fe44c1 LibJS: Add spec comments to Value::to_u8() 2022-12-10 11:23:23 +00:00
Linus Groh
2a3f150ab8 LibJS: Add spec comments to Value::to_i8() 2022-12-10 11:23:23 +00:00
Linus Groh
42eac3b7d3 LibJS: Add spec comments to Value::to_u16() 2022-12-10 11:23:23 +00:00
Linus Groh
b8ae9ca206 LibJS: Add spec comments to Value::to_i16() 2022-12-10 11:23:23 +00:00
Linus Groh
1ef2b43e4c LibJS: Add spec comments to Value::to_u32() 2022-12-10 11:23:23 +00:00
Linus Groh
f958b19b19 LibJS: Add spec comments to Value::to_i32{,_slow_case}() 2022-12-10 11:23:23 +00:00
Linus Groh
c2d33ec48a LibJS: Add spec comments to Value::to_property_key() 2022-12-10 11:23:23 +00:00
Linus Groh
7abd9efe33 LibJS: Add spec comments to Value::to_bigint_uint64() 2022-12-10 11:23:23 +00:00
Linus Groh
fb5256b225 LibJS: Add spec comments to Value::to_bigint_int64() 2022-12-10 11:23:23 +00:00
Linus Groh
0d4b798932 LibJS: Add spec comments to Value::to_bigint() 2022-12-10 11:23:23 +00:00
Linus Groh
b97cdfc36c LibJS: Add spec comments to Value::to_number() 2022-12-10 11:23:23 +00:00
Linus Groh
9a406ccba6 LibJS: Add spec comments to Value::to_numeric() 2022-12-10 11:23:23 +00:00
Linus Groh
63f6099cc3 LibJS: Add spec comments to Value::to_object() 2022-12-10 11:23:23 +00:00
Linus Groh
9c10624278 LibJS: Add spec comments to Value::to_primitive() 2022-12-10 11:23:23 +00:00
Linus Groh
e3c8e1362f LibJS: Add spec comments to Value::to_boolean() 2022-12-10 11:23:23 +00:00
Linus Groh
596b30df5f LibJS: Add spec comments to Value::to_string() 2022-12-10 11:23:23 +00:00
Linus Groh
9a961af0b0 LibJS: Add spec comments to Value::typeof() 2022-12-10 11:23:23 +00:00
Linus Groh
1fe7984160 LibJS: Add spec comments to Value::is_regexp() 2022-12-10 11:23:23 +00:00
Linus Groh
b11135cbc2 LibJS: Add spec comments to Value::is_function() 2022-12-10 11:23:23 +00:00
Linus Groh
aaa4fe8c34 LibJS: Add spec comments to Value::is_array() 2022-12-10 11:23:23 +00:00
Linus Groh
5ee1758f46 LibJS: Use ToPropertyKey AO for computed member expression value
This ensures the value goes through the regular ToPrimitive mechanism,
which PropertyKey::from_value() bypasses. This is relevant for objects
with a @@toPrimitive method, for example.
Also enables one skipped test in delete-basic.js, which now passes.
2022-12-10 01:08:34 +00:00
Linus Groh
4cdfe684b8 LibJS: Remove redundant starts_with()s from is_less_than() string branch
This is not in the spec and does pointless work:
- If either of them is true, we would determine the same result with the
  manual code point iteration and comparison
- If neither of them is true, we iterate from the start again and repeat
  the work that was just done

Instead, only have the manual loop from the spec and do a length
comparison at the end.

Removing it brings the following microbenchmark from ~5.5s down to ~3.5s
on my machine:

```js
const a = "x".repeat(100_000_000) + "a";
const b = "x".repeat(100_000_000) + "b";
a < b
```
2022-12-10 00:40:52 +00:00
Luke Wilde
4db2efaecb LibJS/Bytecode: Implement yield* 2022-12-10 00:21:10 +00:00
Luke Wilde
758a4cb1a6 LibJS/Bytecode: Implement var/lexical binding destructuring in for/of 2022-12-10 00:21:10 +00:00
Andreas Kling
fbf9cb3387 WebContent+LibWeb+LibJS: Simplify injection of JS console globals
Instead of creating a new global object and proxying everything through
it, we now evaluate console inputs inside a `with` environment.

This seems to match the behavior of WebKit and Gecko in my basic
testing, and removes the ConsoleGlobalObject which has been a source of
confusion and invalid downcasts.

The globals now live in a class called ConsoleGlobalObjectExtensions
(renamed from ConsoleGlobalObject since it's no longer a global object).

To make this possible, I had to add a way to override the initial
lexical environment when calling JS::Interpreter::run(). This is plumbed
via Web::HTML::ClassicScript::run().
2022-12-09 18:51:03 +00:00
Moustafa Raafat
ae2abcebbb Everywhere: Use C++ concepts instead of requires clauses 2022-12-09 11:25:30 +00:00
Andreas Kling
9721da2e6a LibJS: Call shrink_to_fit() on various Vectors created during parse
Vectors that stick around in the AST were wasting a fair bit of memory
due to the growth padding we keep by default. This patch goes after some
of these vectors with the shrink_to_fit() stick to reduce waste.

Since the AST can stay around for a long time, it is worth making an
effort to shrink it down when we have a chance.
2022-12-08 23:36:17 +00:00
Andreas Kling
2e98c17347 LibJS: Shrink DeclarativeEnvironment bindings vector to fit
After setting up all the bindings in function_declaration_instantiation,
we now ask DeclarativeEnvironment to do a shrink_to_fit() on its vector
of bindings.

This ends up saving 5.6 MiB on twitter.com/awesomekling :^)
2022-12-08 23:36:17 +00:00
Andreas Kling
35ed82d5e6 LibJS: Shrink FunctionNode by using bitfields
By making the boolean members be bitfields, we shrink FunctionNode by a
total of 8 bytes.
2022-12-08 23:36:17 +00:00
Andreas Kling
0b2f86de71 LibJS: Make FunctionKind enum class a u8 2022-12-08 23:36:17 +00:00
Andreas Kling
dd1720f2cb LibJS: Shrink ObjectProperty AST nodes by rearranging members
By putting smaller members in the padding hole after the ASTNode base
class, we shrink ObjectProperty by 8 bytes.
2022-12-08 23:36:17 +00:00
Andreas Kling
b894acd6b2 LibJS: Make one compact allocation for CallExpression and its Arguments
Instead of CallExpression storing its arguments in a Vector<Argument>,
we now custom-allocate the memory slot for CallExpression (and its
subclass NewExpression) so that it fits both CallExpression and its list
of Arguments in one allocation.

This reduces memory usage on twitter.com/awesomekling by 8.8 MiB :^)
2022-12-08 23:36:17 +00:00
Andreas Kling
8a8d8ecb35 LibJS: Add ASTNodeWithTailArray template to pack AST node + array
This template allows us to allocate an AST node and an array of some
arbitrary type T with one allocation instead of two. This can save
a lot of memory in some cases.

Thanks to Jonathan Müller for suggesting this technique! :^)
2022-12-08 23:36:17 +00:00
Andreas Kling
c767535ca2 LibJS: Use move() on the SourceRange in create_ast_node() 2022-12-08 23:36:17 +00:00
Andreas Kling
1f909d24b6 LibJS: Shrink MemberExpression by rearranging members slightly
By putting m_computed in the padding hole after our base class,
we shrink MemberExpression by 8 bytes. :^)
2022-12-08 23:36:17 +00:00
Andreas Kling
e70f944e11 LibJS: Rearrange ASTNode members so there's a padding hole at the end
ASTNode inherits from RefCounted, which has a single 32-bit member.
This means that there's a 32-bit padding hole after RefCounted,
where we are free to put something (or it will go to waste!)

This patch moves ASTNode::m_start_offset into that padding hole,
and we now have a 32-bit padding hole at the end of ASTNode instead.

This will allow ASTNode subclasses to put things in the ASTNode hole
by moving them to the head of the member list.
2022-12-08 23:36:17 +00:00
Timothy Flynn
d37d6b3479 LibJS: Protect CanonicalIndex against double-to-integer overflow
Explicitly disallow constructing a CanonicalIndex from a floating point
type without going through a factory method that will throw when the
provided index cannot fit in a u32.
2022-12-07 16:43:19 +00:00
Timothy Flynn
8f46cb83c7 LibJS: Put CanonicalIndex in the JS namespace 2022-12-07 16:43:19 +00:00
Timothy Flynn
8f1f794bbd LibJS: Change an error message used by %TypedArray%.prototype.with
ErrorType::InvalidIndex does not encapsulate the reasons why an index
may be invalid. For example:

    let array = new Uint8Array([1, 2, 3, 4, 5]);
    array.with(10, 0);

Will currently yield:

    [RangeError] Index must be a positive integer

Which is misleading because 10 *is* a positive integer.
2022-12-07 16:43:19 +00:00
Linus Groh
1dd8655514 LibJS: Replace standalone js_symbol() with Symbol::create() 2022-12-07 16:43:06 +00:00
Linus Groh
525f22d018 LibJS: Replace standalone js_string() with PrimitiveString::create()
Note that js_rope_string() has been folded into this, the old name was
misleading - it would not always create a rope string, only if both
sides are not empty strings. Use a three-argument create() overload
instead.
2022-12-07 16:43:06 +00:00
Linus Groh
5db38d7ba1 LibJS: Replace standalone js_bigint() with BigInt::create()
Three standalone Cell creation functions remain in the JS namespace:

- js_bigint()
- js_string()
- js_symbol()

All of them are leftovers from early iterations when LibJS still took
inspiration from JSC, which itself has jsString(). Nowadays, we pretty
much exclusively use static create() functions to construct types
allocated on the JS heap, and there's no reason to not do the same for
these.
Also change the return type from BigInt* to NonnullGCPtr<BigInt> while
we're here.

This is patch 1/3, replacement of js_string() and js_symbol() follow.
2022-12-07 16:43:06 +00:00
Linus Groh
54abfcf835 LibJS: Remove redundant AK_MAKE_NON{COPYABLE,MOVABLE} from Symbol class
These are already applied to the Cell base class.
2022-12-07 09:58:59 +00:00
Linus Groh
f490ba13ff LibJS: Move creation of global symbols into Symbol.for()
This is now according to the spec. Having a non-standard lookup API
that creates symbols on the fly doesn't seem ideal.
2022-12-07 09:58:59 +00:00
Linus Groh
b821356ba6 LibJS: Add const/non-const VM::global_symbol_registry() getters
This will allow us to replace the strange get_global_symbol() API that
creates symbols on the fly when not found.
2022-12-07 09:58:59 +00:00