1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 02:35:07 +00:00
Commit graph

2012 commits

Author SHA1 Message Date
Idan Horowitz
141c46feda AK: Add a DateTimeLexer
This is an AK::GenericLexer that exposes helper methods for parsing
date and time related literals (years, months, days, hours, minutes,
seconds, fractional seconds & more)
2021-07-12 19:05:17 +01:00
Linus Groh
54e1180f61 LibJS: Uncomment Number.isInteger() tests that now pass :^) 2021-07-11 22:03:04 +01:00
Linus Groh
1856400547 LibJS: Uncomment Object.{freeze,seal}() tests that now pass :^) 2021-07-11 21:58:14 +01:00
Ali Mohammad Pur
dfb7e716f7 LibJS: Use expected() instead of syntax_error("Expected ...") 2021-07-11 21:41:54 +01:00
Ali Mohammad Pur
049e210cfa LibJS: Rework Identifier parsing to match the spec more closely 2021-07-11 21:41:54 +01:00
Ali Mohammad Pur
77a5144264 LibJS: Add support for binding patterns in catch clauses
`try { ... } catch({a=foo}) {}` is valid, and now we parse and evaluate
it correctly :^)
2021-07-11 21:41:54 +01:00
Ali Mohammad Pur
1a9518ebe3 LibJS: Implement parsing and evaluation for AssignmentPatterns
e.g. `[...foo] = bar` can now be evaluated :^)
2021-07-11 21:41:54 +01:00
Ali Mohammad Pur
7fc6cd6b20 LibJS: Allow 'name = value' in object literals as the spec does
Currently, these are _always_ a syntax error, future commits will make
it valid in certain contexts.
2021-07-11 21:41:54 +01:00
Ali Mohammad Pur
7dae25eceb LibJS: Fix computed property ending token in binding pattern parsing
The syntax is supposed to be '[expression]', not '[expression['.
2021-07-11 21:41:54 +01:00
Ali Mohammad Pur
b5b84029ab LibJS: Treat default parameter values as being in function context
e.g. `new.target` should be permitted in
`function foo(x = new.target) {}`.
2021-07-11 21:41:54 +01:00
Linus Groh
674f3d0347 LibJS: Pad abs(year) < 1000 with zeros in Date.prototype.toString() 2021-07-10 19:51:07 +01:00
Linus Groh
a647f0abf6 LibJS: Make parse_simplified_iso8601() use Optional<int> instead of -1
...for the non-success state. This fixes a crash when parsing dates with
the year -1, as we would assert successful parsing ("year != -1").
Mixing Optional and -1 seems worse and more complicated than just using
Optional for all the values, so I did that instead.
2021-07-10 19:51:07 +01:00
Linus Groh
39cdffd78d LibJS: Make Date.now() return a floor()'d milliseconds value
It is defined as follows:

    21.4.3.1 Date.now ( )
    https://tc39.es/ecma262/#sec-date.now

    The now function returns the time value designating the UTC date and
    time of the occurrence of the call to now.

"Time value" is defined as:

    21.4.1.1 Time Values and Time Range
    https://tc39.es/ecma262/#sec-time-values-and-time-range

    An ECMAScript time value is a Number, either a finite integral
    Number representing an instant in time to millisecond precision or
    NaN representing no specific instant.

By flooring the value we match the behavior in the Temporal proposal's
Temporal.ZonedDateTime.prototype.epochMilliseconds getter:

    4. Let ms be RoundTowardsZero(ℝ(ns) / 10^6).

With that being defined as:

    13.30 RoundTowardsZero ( x )
    https://tc39.es/proposal-temporal/#sec-temporal-roundtowardszero

    1. Return the mathematical value that is the same sign as x and
    whose magnitude is floor(abs(x)).

This is makes the last of the currently 15 Temporal tests in test262
work, which compares Temporal.now.instant() with Date.now() :^)
2021-07-10 19:51:07 +01:00
Timothy Flynn
6c67de8186 LibJS: Implement RegExp.prototype.hasIndices proposal
https://tc39.es/proposal-regexp-match-indices/
2021-07-10 16:49:35 +01:00
Timothy Flynn
d1e06b00e3 LibJS: Parse the RegExp.prototype.hasIndices flag 2021-07-10 16:49:35 +01:00
Timothy Flynn
e801cc7afd LibJS: Remove ECMAScriptFlags value from JS_ENUMERATE_REGEXP_FLAGS
All regex flags supported by LibJS currently correspond to a LibRegex
option, but this is not the case for the RegExp.prototype.hasIndices
proposal, which is handled entirely in RegExpBuiltinExec. Remove the
flag mapping to prepare for this. This incurs a bit of an optimization
loss in the flag getters, as we now do a substring search, but we can
revisit the getter implementation if it becomes an issue.
2021-07-10 16:49:35 +01:00
Timothy Flynn
6cd966c1e1 LibJS: Implement RegExp.prototype.source according to the spec
RegExp.prototype.source must check if "this" object is the
RegExp.prototype object before raising a TypeError.
2021-07-10 16:49:35 +01:00
Timothy Flynn
2f6eec1322 LibJS: Implement RegExp.prototype.<flag name> according to the spec
The flag getters (e.g. RegExp.prototype.unicode) must specially handle
when "this" object is the RegExp.prototype object.
2021-07-10 16:49:35 +01:00
Idan Horowitz
75541c48b5 LibJS: Add Temporal.Instant.prototype.valueOf 2021-07-10 15:39:47 +01:00
Idan Horowitz
ac8e76be23 LibJS: Add a couple of missing specification links to Temporal.Instant 2021-07-10 15:39:47 +01:00
Idan Horowitz
a44de7a55f LibJS: Add %TypedArray%.prototype.toLocaleString 2021-07-09 22:32:25 +01:00
Idan Horowitz
56d8098d13 LibJS: Use PropertyName instead of StringOrSymbol in Object::invoke()
This prevents the unnecessary PropertyName -> StringOrSymbol ->
PropertyName conversion.
2021-07-09 22:32:25 +01:00
Timothy Flynn
e4124d0218 LibJS: Implement RegExp.prototype [ @@split ] 2021-07-09 19:45:55 +01:00
Timothy Flynn
43918b0104 LibJS: Implement RegExpBuiltinExec closer to the spec
Our RegExpBuiltinExec implementation differed from the spec in some
areas such as handling of the sticky/global flags and updating the
lastIndex property.
2021-07-09 19:45:55 +01:00
Timothy Flynn
3892b6e6ec LibJS: Implement RegExp constructor according to the spec
This allows passing an existing RegExp object (or an object that is
sufficiently like a RegExp object) as the "pattern" argument of the
RegExp constructor.
2021-07-09 19:45:55 +01:00
Timothy Flynn
2686c5f503 LibJS: Do not use "this" object in RegExpExec
As an abstraction, RegExpExec should not assume that the RegExp object
being used is "this" object. Instead, it should only interact with the
provided object.

This prepares for some methods, such as @@split, which invoke RegExpExec
with a secondary RegExp object.
2021-07-09 19:45:55 +01:00
Timothy Flynn
1d19649a19 LibJS: Remove accidental dead code 2021-07-09 19:45:55 +01:00
Idan Horowitz
52aa777d49 LibJS: Add %TypedArray%.prototype.sort 2021-07-09 16:15:42 +01:00
Idan Horowitz
f98a98506f LibJS: Add %TypedArray%.prototype.subarray 2021-07-09 16:15:42 +01:00
Idan Horowitz
ff052a3241 LibJS: Add %TypedArray%.prototype.slice 2021-07-09 16:15:42 +01:00
Idan Horowitz
8127e30169 LibJS: Split detached buffer checking into validate_typed_array
Not all of the TypedArray prototype methods and accessors require
detached buffer validation (only the ones who call ValidateTypedArray)
so this behaviour was split from typed_array_from and the usage was
updated per the spec in each location.
2021-07-09 16:15:42 +01:00
Linus Groh
ca71d99c66 LibJS: Implement Temporal.Instant.fromEpochNanoseconds() 2021-07-09 13:20:51 +01:00
Linus Groh
5872357b56 LibJS: Implement Temporal.Instant.fromEpochMicroseconds() 2021-07-09 13:20:51 +01:00
Linus Groh
66ff772254 LibJS: Implement Temporal.Instant.fromEpochMilliseconds() 2021-07-09 13:20:51 +01:00
Linus Groh
2401e45720 LibJS: Implement Temporal.Instant.fromEpochSeconds() 2021-07-09 13:20:51 +01:00
Linus Groh
9c9813c312 LibJS: Replace useless use of SignedBigInteger::create_from() with ctor
create_from() casts the value to a 64 bit integer and then creates two
words from it, which is not necessary if we only pass values to it that
fit into a single word (32 bit integer).
Also make them use UnsignedBigInteger as the previously missing SBI
divided_by() overload is now implemented.
2021-07-09 13:20:51 +01:00
Linus Groh
3014e529be LibJS: Tweak error message in the NumberToBigInt abstract operation
This is no longer specific to the BigInt() constructor, so it shouldn't
be mentioning an 'argument' that we might not have.
2021-07-09 13:20:51 +01:00
Linus Groh
9f2dd89446 LibJS/Tests: Add tests for Date.prototype.toTemporalInstant() 2021-07-09 13:20:51 +01:00
Luke
1da06f9dfd LibJS: Add %TypedArray%.prototype.map 2021-07-09 10:15:45 +01:00
Luke
bc6f619344 LibJS: Add TypedArraySpeciesCreate and %TypedArray%.prototype.filter
I'm not too happy with how I get the default constructor in
typed_array_species_create, but it works for now.
2021-07-09 10:15:45 +01:00
Luke
53bc3f8e3b LibJS: Move typed_array_create to TypedArray.{h,cpp}
This is to make it accessible from TypedArrayPrototype, for use with
typed_array_species_create.
2021-07-09 10:15:45 +01:00
Linus Groh
6531485251 LibJS/Tests: Add tests for Temporal.Instant() constructor 2021-07-08 23:08:27 +01:00
Linus Groh
117323f2d9 LibJS: Implement Temporal.Instant.prototype.epochNanoseconds 2021-07-08 23:08:27 +01:00
Linus Groh
b5d0cdc97e LibJS: Implement Temporal.Instant.prototype.epochMicroseconds 2021-07-08 23:08:27 +01:00
Linus Groh
b157ab3f12 LibJS: Implement Temporal.Instant.prototype.epochMilliseconds 2021-07-08 23:08:27 +01:00
Linus Groh
5010e01223 LibJS: Implement Temporal.Instant.prototype.epochSeconds 2021-07-08 23:08:27 +01:00
Linus Groh
dad336c944 LibJS: Implement Temporal.Instant.prototype[@@toStringTag] 2021-07-08 23:08:27 +01:00
Linus Groh
439b35dc7d LibJS/Tests: Add tests for Temporal.TimeZone() constructor 2021-07-08 23:08:27 +01:00
Linus Groh
51c581f604 LibJS: Implement Temporal.TimeZone.prototype.id 2021-07-08 23:08:27 +01:00
Linus Groh
7f0fe352e2 LibJS: Implement Temporal.TimeZone.prototype.toJSON() 2021-07-08 23:08:27 +01:00