1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 18:08:12 +00:00
Commit graph

3464 commits

Author SHA1 Message Date
davidot
b79f03182d LibJS: Add special cases for Math.cosh and add spec comments
Although this already works in most cases in non-kvm serenity cases the
cosh and other math function tend to return incorrect values for
Infinity. This makes sure that whatever the underlying cosh function
returns Math.cosh conforms to the spec.
2022-08-20 23:53:55 +01:00
davidot
f53aa5bfbb LibJS: Make IsHTMLDDA non-constructible 2022-08-20 00:19:03 +01:00
davidot
28e552f853 LibJS: Resolve the correct this value for calls in with statements 2022-08-17 23:56:24 +01:00
davidot
3a8dd3e78d LibJS: Implement tagged literals evaluation like the spec
We cache on the AST node side as this is easier to track a position, we
just have to take care to wrap the values in a handle to make sure they
are not garbage collected.
2022-08-17 23:56:24 +01:00
davidot
e5adc51e27 LibJS: Allow invalid string in tagged template literals
Since tagged template literals can inspect the raw string it is not a
syntax error to have invalid escapes. However the cooked value should be
`undefined`.
We accomplish this by tracking whether parse_string_literal
fails and then using a NullLiteral (since UndefinedLiteral is not a
thing) and finally converting null in tagged template execution to
undefined.
2022-08-17 23:56:24 +01:00
davidot
0f9434a02c LibJS: Make StringToNumber case sensitive when falling back to strtod
We use strtod to convert a string to number after checking whether the
string is [+-]Infinity, however strtod also checks for either 'inf' or
'infinity' in a case-insensitive.
There are still valid cases for strtod to return infinity like 10e100000
so we just check if the "number" contains 'i' or 'I' in which case
the strtod infinity is not valid.
2022-08-17 23:56:24 +01:00
davidot
9d05ca7b20 LibJS: Don't assume a this argument for function.prototype.bind
Assuming we had at least one argument meant that the ...arg count would
underflow causing the bound function to have length 0 instead of the
given length when binding with no arguments.
2022-08-17 23:56:24 +01:00
davidot
c4f3d44be1 LibJS: Add the HostEnsureCanAddPrivateElement hook
This hook allows us to reject private elements on certain exotic
objects like the window object in browser.
Note that per the spec we should only call this hook if the host is a
web browser, however because LibJS has no way of knowing whether it is
in a web browser environment we just always call the host hook.
2022-08-17 23:56:24 +01:00
davidot
e746360b9a LibJS: Use NaN boxing to decrease the memory size of Values
Using the fact that there are 2^52-2 NaN representations we can
"NaN-box" all the Values possible. This means that Value no longer has
an explicit "Type" but that information is now stored in the bits of a
double. This is done by "tagging" the top two bytes of the double.
For a full explanation see the large comment with asserts at the top of
Value.

We can also use the exact representation of the tags to make checking
properties like nullish, or is_cell quicker. But the largest gains are
in the fact that the size of a Value is now halved.

The SunSpider and other benchmarks have been ran to confirm that there
are no regressions in performance compared to the previous
implementation. The tests never performed worse and in some cases
performed better. But the biggest differences can be seen in memory
usage when large arrays are allocated. A simple test which allocates a
1000 arrays of size 100000 has roughly half the memory usage.

There is also space in the representations for future expansions such as
tuples and records.

To ensure that Values on the stack and registers are not lost during
garbage collection we also have to add a check to the Heap to check for
any of the cell tags and extracting the canonical form of the pointer
if it matches.
2022-08-15 17:11:25 +02:00
davidot
6c504e2bff LibJS: Specialize Optional<Completion>
Since Completion has an enum for state we have plenty of space to add
an extra type which indicates on empty completion.
Since Optional<Completion> is used in every ThrowCompletionOr<...>
this saves quite some stack space as most function in LibJS return
types like that.
This saves 8 bytes for every Optional<Completion>.
2022-08-15 17:11:25 +02:00
davidot
8381e7f1e6 LibJS: Specialize Optional<Value>
Values can be "empty" which only has a valid meaning for array holes.
We can however use this state the represent the empty state of an
Optional<Value> which is used in a lot of placed, because of Completion
having one.
This saves 8 bytes for every Optional<Value>.
2022-08-15 17:11:25 +02:00
davidot
da8715a07c LibJS: Add extreme value tests for cos and sin
These sometimes produce different NaN patterns which can mess up the
value encoding.
2022-08-15 17:11:25 +02:00
Linus Groh
849495915b LibJS: Make Function.prototype a callable function object
20.2.3 Properties of the Function Prototype Object
https://tc39.es/ecma262/#sec-properties-of-the-function-prototype-object

The Function prototype object:
- is itself a built-in function object.
2022-08-14 00:44:27 +01:00
Andreas Kling
e0d7d3c3d5 LibJS: Teach String.prototype.concat() to create rope strings
Defer serialization of the concatenated strings until later. This is
used heavily in SunSpider's string-validate-input subtest, which
sees a small progression.
2022-08-06 13:50:39 +01:00
Linus Groh
8ed28890e4 LibJS: Correct BalanceDurationRelative algorithm
This is a normative change in the Temporal spec.

See:
- cbf5863
- f47d57d
2022-08-06 13:42:37 +01:00
Linus Groh
12edbb51bc LibJS: Rename PrimitiveString::m_{left,right} to m_{lhs,rhs}
The LHS/RHS naming is already widely used as parameter names and local
variables with the same meaning, so let's also use them for the members.
2022-08-06 12:02:48 +02:00
Linus Groh
885004abee LibJS: Support creation of global object in Realm::set_global_object() 2022-08-06 12:02:48 +02:00
Linus Groh
c8f1651761 LibJS+LibWeb: Restore type safety of Realm::set_global_object()
The changes from 8a03b17 to allow any JS::Value aren't a good fit, as
shown by the excessive amount of verify_cast needed :^)
2022-08-06 12:02:48 +02:00
Andreas Kling
64b29eb459 LibJS: Implement string concatenation using ropes
Instead of concatenating string data every time you add two strings
together in JavaScript, we now create a new PrimitiveString that points
to the two concatenated strings instead.

This turns concatenated strings into a tree structure that doesn't have
to be serialized until someone wants the characters in the string.

This *dramatically* reduces the peak memory footprint when running
the SunSpider benchmark (from ~6G to ~1G on my machine). It's also
significantly faster (1.39x) :^)
2022-08-06 00:29:15 +02:00
Andreas Kling
aaa4f6d287 LibJS: Run clang-format on Realm.cpp 2022-08-05 12:55:25 +02:00
Andreas Kling
e2ae286132 LibJS: Actually create a new Realm in $262.createRealm() 2022-08-05 12:46:42 +02:00
Andreas Kling
fb1900e79c LibJS: Make Interpreter::create() call InitializeHostDefinedRealm()
Instead of having two implementations of this AO, let's just have
Interpreter::create() call the new full version of the AO in Realm.
2022-08-05 12:46:39 +02:00
Andreas Kling
8a03b17007 LibJS: Implement a more general InitializeHostDefinedRealm AO
The existing implementation of this AO lives in Interpreter::create(),
which makes it impossible to use without also constructing an
Interpreter.

This patch adds a new Realm::initialize_host_defined_realm() and takes
the global object and global this customization steps as Function
callback objects. This will be used by LibWeb to create realms during
Document construction.
2022-08-05 12:46:38 +02:00
Andreas Kling
50d951aea2 LibJS: Let Shape store a Realm instead of a GlobalObject
This is a cautious first step towards being able to create JS objects
before a global object has been instantiated.
2022-08-05 12:42:46 +02:00
Andreas Kling
7a6935a2ff LibJS: Remove unused ShapeWithoutGlobalObject constructor mechanism 2022-08-05 12:42:46 +02:00
Linus Groh
fb47a87340 LibJS: Add previously skipped assertion in RegulateTime
The spec issue preventing us from doing this in the past has long been
fixed.
2022-08-03 22:46:38 +01:00
davidot
301bba8c19 LibJS: Only coerce value once in BigInt constructor
See https://github.com/tc39/ecma262/pull/2812.
2022-08-03 20:59:59 +01:00
Linus Groh
5f253988ef LibJS: Call HostEnsureCanCompileStrings in PerformShadowRealmEval
We now do have this host-defined abstract operation :^)
2022-07-31 14:39:06 +02:00
Linus Groh
fed1498824 LibJS: Implement & use the {Ordinary,PrepareFor}WrappedFunctionCall AOs
This is a normative change in the ShadowRealm spec.

See: 5a3aae8
2022-07-31 14:39:06 +02:00
Linus Groh
0355c72d6a LibJS: Validate fractionalSecondDigits after truncation
This is a normative change in the Temporal spec.
Also correct some bogus spec numbers.

See:
- 39e1784
- c3c0ee1
- 273cb2e
2022-07-30 10:50:50 +01:00
Linus Groh
6850f25840 LibJS: Support IANA legacy names in the Temporal ISO 8601 grammar
This is a normative change in the Temporal spec.

See: 2419680
2022-07-30 10:50:50 +01:00
Linus Groh
41791146fd LibJS: Disallow out-of-range return from previous / next transition
This is a normative change in the Temporal spec.

See: f3c771f
2022-07-30 10:50:50 +01:00
Timothy Flynn
60f3880650 LibJS: Remove %TypedArray%.prototype.toSpliced
This was removed from the change-array-by-copy proposal. See:
4c194d9
2022-07-27 17:35:50 +01:00
Timothy Flynn
a8d532c4fe LibJS: Update Array.prototype.sort comments to align with implementation
This was fixed in the change-array-by-copy proposal. See:
60823eb
2022-07-27 17:35:50 +01:00
Timothy Flynn
417a385db1 LibJS: Allow out-of-order plural ranges to be formatted
This is a normative change to the Intl NumberFormat V3 spec:
0c3d849
2022-07-26 10:46:08 -07:00
Timothy Flynn
fd7d97fba5 LibJS: Allow out-of-order number ranges to be formatted
This is a normative change to the Intl NumberFormat V3 spec:
0c3d849
2022-07-26 10:46:08 -07:00
Timothy Flynn
415742ab98 LibJS: Allow out-of-order date ranges to be formatted
This is a normative change to the Intl spec:
769df4b
2022-07-26 10:46:08 -07:00
Timothy Flynn
689cbdf6b6 LibJS: Use SortIndexedProperties AO in TypedArray.prototype.sort
Note that we cannot use CompareTypedArrayElements until the change-
array-by-copy proposal picks up the change to no longer throw with
detached array buffers.
2022-07-25 22:40:52 +01:00
Timothy Flynn
b779a3628d LibJS: Use SortIndexedProperties AO in Array.prototype.sort
By aligning Array.prototype.sort with the spec, this removes the direct
invocation of CompareArrayElements from array_merge_sort. This opens the
door for TypedArray to use SortIndexedProperties as well because now
array_merge_sort does not assume what kind of array it is invoked with.
Further, this addresses a FIXME to avoid an extra JS heap allocation.
2022-07-25 22:40:52 +01:00
Timothy Flynn
56db4235df LibJS: Add missing spec step to CompareTypedArrayElements
This isn't actually much of an issue because if the LHS side value is -0
and the RHS value is +0, errantly returning 0 in the comparison function
here has the same effect as correctly returning -1. In both cases, the
-0 is left on the LHS.
2022-07-25 22:40:52 +01:00
Timothy Flynn
ae2acc8cdf LibJS+LibUnicode: Generate a set of default DateTimeFormat patterns
This isn't called out in TR-35, but before ICU even looks at CLDR data,
it adds a hard-coded set of default patterns to each locale's calendar.
It has done this since 2006 when its DateTimeFormat feature was first
created. Several test262 tests depend on this, which under ECMA-402,
falls into "implementation defined" behavior. For compatibility, we
can do the same in LibUnicode.
2022-07-22 23:51:56 +01:00
Linus Groh
5a106b6401 Everywhere: Prefix 'TYPEDEF_DISTINCT_NUMERIC_GENERAL' with 'AK_' 2022-07-22 23:09:43 +01:00
Obinna Ikeh
9956d3d1e1 LibJS: Add tests for %TypedArray%.prototype.with 2022-07-22 17:17:15 +01:00
Obinna Ikeh
4a201e8854 LibJS: Add %TypedArray%.prototype.with 2022-07-22 17:17:15 +01:00
Luke Wilde
1e829c4ea8 LibJS: Check PlainMonthDay is in the ISO date time limits in creation
This is a normative change in the Temporal spec.

See: 374305c
2022-07-22 17:10:03 +01:00
Luke Wilde
61847b3cef LibJS: Disallow negative day lengths in ZonedDateTime.protoype.round
This is a normative change in the Temporal spec.

See: 6f04074
2022-07-22 17:10:03 +01:00
Timothy Flynn
b8d4f8debf LibJS: Selectively display DateTimeFormat day periods as noon 2022-07-21 20:36:03 +01:00
Timothy Flynn
0f26ab89ae LibJS+LibUnicode: Handle flexible day periods on both sides of midnight
Commit ec7d535 only partially handled the case of flexible day periods
rolling over midnight, in that it only worked for hours after midnight.
For example, the en locale defines a day period range of [21:00, 06:00).
The previous method of adding 24 hours to the given hour would change
e.g. 23:00 to 47:00, which isn't valid.
2022-07-21 20:36:03 +01:00
Timothy Flynn
e9e187d15c LibJS: Implement Intl.NumberFormat.prototype.formatRangeToParts 2022-07-20 22:30:16 +01:00
Timothy Flynn
b4a772cde2 LibJS: Implement Intl.NumberFormat.prototype.formatRange 2022-07-20 22:30:16 +01:00