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

3487 commits

Author SHA1 Message Date
Timothy Flynn
a2e245fa97 LibJS: Allow converting a reference to an object to fail in delete
This is (part of) a normative change in the ECMA-262 spec. See:
d09532c

We recently implemented other parts of that commit in LibJS, but missed
this change:
442ca4f9b4
2b19d1b5ab
2023-07-07 18:11:51 +02:00
Timothy Flynn
2b19d1b5ab LibJS: Do not coerce nullish references to unresolvable references
These are not strictly unresolvable references. Treating them as such
fails an assertion in the `delete UnaryExpression` semantic (which is
Reference::delete_ in our implementation) - we enter the unresolvable,
branch, which then asserts that the [[Strict]] slot of the reference is
false.
2023-07-06 21:36:13 +01:00
Shannon Booth
d18cae7301 LibJS: Add spec comments to RawBytesToNumeric AO 2023-07-06 14:55:46 +01:00
Shannon Booth
4186fcab9a LibJS: Implement GetValueFromBuffer AO closer to spec
No functional changes intended, just some extra asserts added, and a
whole bunch of spec comments.
2023-07-06 14:55:46 +01:00
Shannon Booth
b1870bc47b LibJS: Propagate OOM from SetValueInBuffer AO 2023-07-06 14:55:46 +01:00
Shannon Booth
3bb15d3dae LibJS: Propagate OOM from GetValueFromBuffer AO 2023-07-06 14:55:46 +01:00
Shannon Booth
49c8d22f50 LibJS: Propagate OOM in GetModifySetValueInBuffer AO 2023-07-06 14:55:46 +01:00
Shannon Booth
81c8e642b9 LibJS: Handle OOM in NumericToRawBytes AO 2023-07-06 14:55:46 +01:00
Luke Wilde
442ca4f9b4 LibJS: Avoid RequireObjectCoercible when creating super references
This is part of an old normative change that happened soon after
Andreas made `super` closer to spec in 1270df2.
See https://github.com/tc39/ecma262/pull/2267/

This was introduced into bytecode by virtue of copy and paste :^)

Bytecode results:
Summary:
    Diff Tests:
        +2     -2 
2023-07-06 08:54:46 +02:00
Aliaksandr Kalenik
ae3a7fd4b8 LibJS: Update bytecode generator to use local variables
- Update ECMAScriptFunctionObject::function_declaration_instantiation
  to initialize local variables
- Introduce GetLocal, SetLocal, TypeofLocal that will be used to
  operate on local variables.
- Update bytecode generator to emit instructions for local variables
2023-07-05 21:03:01 +02:00
Aliaksandr Kalenik
0daff637e2 LibJS: Add vector of local variables in ExecutionContext
Now ExecutionContext has vector of values that will represent values
of local variables.

This vector is initialized in ECMAScriptFunctionObject::internal_call()
or ECMAScriptFunctionObject::internal_const() using number of local
variables provided to ECMAScriptFunctionObject by the parser.
2023-07-05 21:03:01 +02:00
Aliaksandr Kalenik
7765ebb5f2 LibJS+LibWeb: Plumb local variables names to ECMAScriptFunctionObject
Saving vector of local variables names in ECMAScriptFunctionObject
will allow to get a name by index in case message of ReferenceError
needs to contain a variable name.
2023-07-05 21:03:01 +02:00
Aliaksandr Kalenik
a6cdb1655b LibJS: Use Identifier to represent name of FunctionNode 2023-07-05 21:03:01 +02:00
Daniel Bertalan
0cd85ab0fc AK+LibJS: Make Number.MIN_VALUE a denormal
ECMA-262 implies that `MIN_VALUE` should be a denormalized value if
denormal arithmetic is supported. This is the case on x86-64 and AArch64
using standard GCC/Clang compilation settings.

test262 checks whether `Number.MIN_VALUE / 2.0` is equal to 0, which
only holds if `MIN_VALUE` is the smallest denormalized value.

This commit renames the existing `NumericLimits<FloatingPoint>::min()`
to `min_normal()` and adds a `min_denormal()` method to force users to
explicitly think about which one is appropriate for their use case. We
shouldn't follow the STL's confusingly designed interface in this
regard.
2023-07-02 21:19:09 +01:00
Andreas Kling
fb979dcf34 LibJS/Bytecode: Make Bytecode::Interpreter participate in GC marking
Since the relationship between VM and Bytecode::Interpreter is now
clear, we can have VM ask the Interpreter for roots in the GC marking
pass. This avoids having to register and unregister handles and
MarkedVectors over and over.

Since GeneratorObject can also own a RegisterWindow, we share the code
in a RegisterWindow::visit_edges() helper.

~4% speed-up on Kraken/stanford-crypto-ccm.js :^)
2023-07-02 14:50:02 +02:00
Andreas Kling
0cb9c9e81e LibJS: Add fast paths for bitwise ops on 2x Int32 JS::Value
~9% speed-up on Kraken/stanford-crypto-aes.js :^)
2023-07-01 20:29:12 +01:00
Shannon Booth
e7435d68b0 LibJS: Extract named vm variables in ArrayBufferPrototype::slice 2023-07-01 16:55:17 +01:00
Shannon Booth
3781948f0c LibJS: Add initial implementation for SharedArrayBuffer
None of the actual sharing is implemented yet, but this is enough for
most basic functionality.

Diff Tests:
    +260     -262    +2 💀
2023-07-01 16:55:17 +01:00
Daniel Bertalan
96b197ef46 LibJS/Temporal: Perform floating point arithmetic in RoundTime
The valid range for temporal values (`nsMinInstant`/`nsMaxInstant`)
means performing nanosecond-valued integers could lead to an overflow.

NB: Only the `roundingMode: "day"` case was affected, as all others were
already performing the division on floating-point `fractional_second`
values. I'm adding `.0` suffixes everywhere to make this fact clearer.

This adds a few local tests as well, as those are tested with sanitizers
enabled by default, unlike test262.
2023-07-01 06:51:25 +02:00
Daniel Bertalan
1dce1994eb LibJS: Make the options arg of InterpretTemporalDateTimeFields nullable
This fixes "reference binding to null pointer" UBSan warnings.
2023-07-01 06:51:25 +02:00
PrestonLTaylor
850c252b3e LibJS: Implement ArrayBuffer.prototype.transfer & transferToFixedLength 2023-06-30 23:23:15 +02:00
PrestonLTaylor
286bf307d2 LibJS: Don't crash when calling byte_length for a detached ArrayBuffer 2023-06-30 23:23:15 +02:00
PrestonLTaylor
bd0ccbe3c8 LibJS: Implement the ArrayBuffer.prototype.detached getter 2023-06-30 12:47:15 +01:00
Daniel Bertalan
18c735429f LibJS: Fix incorrect is_function() check in NewPromiseCapability
I introduced this copy-paste mistake in c21255d.

Gets rid of 7 assertion failures on test262.
2023-06-29 08:43:28 +02:00
Daniel Bertalan
c21255da7f LibJS: Align NewPromiseCapability with spec changes
See 874ecf9

After this refactoring, we now correctly handle non-function /
non-undefined objects being passed multiple times: instead of skipping
assignment to promiseCapability altogether and failing with a
NotAFunction error in the end; on the second time the executor closure
is called, we return GetCapabilitiesExecutorCalledMultipleTimes.

This fixes the 7 `capability-executor-called-twice.js` test262 tests.
2023-06-28 23:36:15 +01:00
Shannon Booth
0748e755d8 LibJS: Implement SetValueInBuffer closer to spec
No functional changes intended, mostly just adding spec comments, along
with some asserts.
2023-06-28 23:18:39 +01:00
Shannon Booth
fe479ffd66 LibJS: Add spec comment for [[ArrayBufferData]]
I have found myself needing to grep around for this one a bunch.
2023-06-28 23:18:39 +01:00
Shannon Booth
78d5c23c3a LibJS: Add spec comment for IsDetachedBuffer ( arrayBuffer ) 2023-06-28 23:18:39 +01:00
Andreas Kling
1dc7f03137 LibJS: Have AsyncFunctionDriverWrapper unwrap promises before returning
24 new passes on test262. :^)
2023-06-27 13:48:27 +02:00
Andreas Kling
9430bbcc62 LibJS/Bytecode: Propagate FunctionDeclarationInstantiation exceptions
If an exception is thrown by FunctionDeclarationInstantiation for an
async or async-generator function, we still need to return a promise.
We can't just throw the exception.

81 new passes on test262. :^)
2023-06-27 00:21:52 +02:00
Daniel Bertalan
5aef8f280f LibJS: Fix integer overflow in Number::exponentiate
The exponent might be larger than the range of values representable by
an i32, so we have to use the `fmod` function instead of the modulo
operator.

This fixes 3 test262 tests on AArch64. No changes on x86-64.
2023-06-26 19:25:12 +02:00
Timothy Flynn
6fb670c1c2 LibJS: Implement Iterator.prototype.find 2023-06-26 10:39:07 +02:00
Timothy Flynn
1f05b0638f LibJS: Implement Iterator.prototype.every 2023-06-26 10:39:07 +02:00
Timothy Flynn
6ac1d5afae LibJS: Implement Iterator.prototype.some 2023-06-26 10:39:07 +02:00
Timothy Flynn
134bb44ca0 LibJS: Implement Iterator.prototype.forEach 2023-06-26 10:39:07 +02:00
Timothy Flynn
35380b2aef LibJS: Implement Iterator.prototype.toArray 2023-06-26 10:39:07 +02:00
Timothy Flynn
acc05480e8 LibJS: Implement Iterator.prototype.reduce 2023-06-26 10:39:07 +02:00
Timothy Flynn
ad42b4ea67 LibJS: Implement Iterator.prototype.flatMap
This prototype is a bit tricky in that we need to maintain the iteration
state of the mapped iterator's inner iterator as we return values to the
caller. To do this, we create a FlatMapIterator helper to perform the
steps that apply to the current iteration state.
2023-06-26 10:39:07 +02:00
Timothy Flynn
67028ee3a3 LibJS: Implement Iterator.prototype.drop 2023-06-26 10:39:07 +02:00
Timothy Flynn
0e2f9f006d LibJS: Implement Iterator.prototype.take 2023-06-26 10:39:07 +02:00
Timothy Flynn
7e0083fb65 LibJS: Rename ErrorType::IntlNumberIsNaN to ErrorType::NumberIsNaN
It will be used outside of the Intl namespace, so give it a less overly
specific name.
2023-06-26 10:39:07 +02:00
Timothy Flynn
deeee65e37 LibJS: Implement Iterator.prototype.filter 2023-06-26 10:39:07 +02:00
Timothy Flynn
3eb2e4e08a LibJS: Implement Iterator.prototype.map
This uses a new Iterator type called IteratorHelper. This does not
implement IteratorHelper.prototype.return as that relies on generator
objects (i.e. the internal slots of JS::GeneratorObject), which are not
hooked up here.
2023-06-26 10:39:07 +02:00
Timothy Flynn
7ff6b472c0 LibJS: Implement Iterator.prototype [ @@toStringTag ] 2023-06-26 10:39:07 +02:00
Timothy Flynn
d9d245faa7 LibJS: Implement Iterator.from and the WrapForValidIteratorPrototype
Iterator.from creates an Iterator from either an existing iterator or
an iterator-like object. In the latter case, it sets the prototype of
the returned iterator to WrapForValidIteratorPrototype to wrap around
the iterator-like object's iteration methods.
2023-06-26 10:39:07 +02:00
Timothy Flynn
5736b53013 LibJS: Add an Iterator constructor and object
The Iterator object cannot be constructed directly but can be subclassed
or created with `Iterator.from` (not implemented here).
2023-06-26 10:39:07 +02:00
Timothy Flynn
428109e709 LibJS: Forward declare IteratorRecord and remove inclusion from VM.h
This drastically reduces the amount of compilation required when
Iterator.h is changed.
2023-06-26 10:39:07 +02:00
Timothy Flynn
4977000fa0 LibJS: Rename JS::Iterator to JS::IteratorRecord
This is in preparation for an upcoming implementation of the Iterator
Helpers proposal. That proposal will require a JS::Object type named
"Iterator", so this rename is to avoid conflicts.
2023-06-26 10:39:07 +02:00
Andreas Kling
8450948458 LibJS: Make class definition evaluation work in bytecode mode
Instead of assuming that there's an active AST interpreter, this code
now takes VM& everywhere and invokes the appropriate interpreter.

92 new passes on test262. :^)
2023-06-25 18:28:44 +02:00
Andreas Kling
8a5e71256d LibJS/Bytecode: Add codegen for ImportCall
Also moved most of the AST ImportCall::execute() into a helper so we can
share the code.
2023-06-24 17:13:30 +02:00